From 49b887a201b2edaaef065a96cee2c656bbf64de3 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Fri, 9 Mar 2018 16:08:35 +0100 Subject: [PATCH] Improved EditForm --- scripts/AnimeNotifier.ts | 2 +- styles/widgets.scarlet | 12 ++++++ utils/editform/editform.go | 75 +++++++++++++++++++++++++++++++++++- utils/editform/editform.pixy | 3 ++ 4 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 utils/editform/editform.pixy diff --git a/scripts/AnimeNotifier.ts b/scripts/AnimeNotifier.ts index 63dd6e1f..574944af 100644 --- a/scripts/AnimeNotifier.ts +++ b/scripts/AnimeNotifier.ts @@ -515,7 +515,7 @@ export class AnimeNotifier { let extension = "" // Replace URL with WebP if supported - if(this.webpEnabled && element.dataset.webp) { + if(this.webpEnabled && element.dataset.webp === "true") { let queryPos = dataSrc.lastIndexOf("?") if(queryPos !== -1) { diff --git a/styles/widgets.scarlet b/styles/widgets.scarlet index 4a6cd56b..9d0ed164 100644 --- a/styles/widgets.scarlet +++ b/styles/widgets.scarlet @@ -30,6 +30,18 @@ vertical width 100% +.widget-section-with-preview + horizontal + +.widget-section-preview + display flex + justify-content center + align-items center + margin-left 1rem + + img + anime-mini-item-image + .widget-title horizontal align-items center diff --git a/utils/editform/editform.go b/utils/editform/editform.go index 52516d4c..d161dbab 100644 --- a/utils/editform/editform.go +++ b/utils/editform/editform.go @@ -16,7 +16,7 @@ import ( func Render(obj interface{}, title string, user *arn.User) string { t := reflect.TypeOf(obj).Elem() v := reflect.ValueOf(obj).Elem() - id := reflect.Indirect(v.FieldByName("ID")) + id := findMainID(t, v) lowerCaseTypeName := strings.ToLower(t.Name()) endpoint := `/api/` + lowerCaseTypeName + `/` + id.String() @@ -89,6 +89,26 @@ func RenderField(b *bytes.Buffer, v *reflect.Value, field reflect.StructField, i // String if fieldType == "string" { + idType := field.Tag.Get("idType") + + // Try to infer the ID type by the field name + if idType == "" { + switch field.Name { + case "AnimeID": + idType = "Anime" + + case "CharacterID": + idType = "Character" + } + } + + showPreview := idType != "" && fieldValue.String() != "" + + if showPreview { + b.WriteString("
") + } + + // Input field if field.Tag.Get("datalist") != "" { dataList := field.Tag.Get("datalist") values := arn.DataLists[dataList] @@ -99,6 +119,40 @@ func RenderField(b *bytes.Buffer, v *reflect.Value, field reflect.StructField, i b.WriteString(components.InputText(idPrefix+field.Name, fieldValue.String(), field.Name, field.Tag.Get("tooltip"))) } + if showPreview { + b.WriteString("
") + } + + // Preview + switch idType { + case "Anime": + animeID := fieldValue.String() + anime, err := arn.GetAnime(animeID) + + if err == nil { + b.WriteString(components.EditFormImagePreview(anime.Link(), anime.Image("small"), true)) + } + + case "Character": + characterID := fieldValue.String() + character, err := arn.GetCharacter(characterID) + + if err == nil { + b.WriteString(components.EditFormImagePreview(character.Link(), character.Image, false)) + } + + case "": + break + + default: + fmt.Println("Error: Unknown idType tag: " + idType) + } + + // Close preview tags + if showPreview { + b.WriteString("
") + } + return } @@ -186,3 +240,22 @@ func RenderField(b *bytes.Buffer, v *reflect.Value, field reflect.StructField, i b.WriteString(``) } + +// findMainID finds the main ID of the object. +func findMainID(t reflect.Type, v reflect.Value) reflect.Value { + idField := v.FieldByName("ID") + + if idField.IsValid() { + return reflect.Indirect(idField) + } + + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) + + if field.Tag.Get("mainID") == "true" { + return reflect.Indirect(v.Field(i)) + } + } + + panic("Type " + t.Name() + " doesn't have a main ID!") +} diff --git a/utils/editform/editform.pixy b/utils/editform/editform.pixy new file mode 100644 index 00000000..ff4d8e93 --- /dev/null +++ b/utils/editform/editform.pixy @@ -0,0 +1,3 @@ +component EditFormImagePreview(link string, imageURL string, webp bool) + a(href=link, target="_blank") + img.lazy(data-src=imageURL, alt="Preview", data-webp=webp) \ No newline at end of file