Improved EditForm

This commit is contained in:
Eduard Urbach 2017-10-10 11:38:31 +02:00
parent 6d8700e166
commit 5c3f3dab1b

View File

@ -2,6 +2,7 @@ package soundtrack
import ( import (
"bytes" "bytes"
"fmt"
"net/http" "net/http"
"reflect" "reflect"
"strings" "strings"
@ -38,8 +39,8 @@ func Edit(ctx *aero.Context) string {
func EditForm(obj interface{}, title string) string { func EditForm(obj interface{}, title string) string {
t := reflect.TypeOf(obj).Elem() t := reflect.TypeOf(obj).Elem()
v := reflect.ValueOf(obj).Elem() v := reflect.ValueOf(obj).Elem()
lowerCaseTypeName := strings.ToLower(t.Name())
id := reflect.Indirect(v.FieldByName("ID")) id := reflect.Indirect(v.FieldByName("ID"))
lowerCaseTypeName := strings.ToLower(t.Name())
var b bytes.Buffer var b bytes.Buffer
b.WriteString(`<div class="widget-form">`) b.WriteString(`<div class="widget-form">`)
@ -48,31 +49,46 @@ func EditForm(obj interface{}, title string) string {
b.WriteString(title) b.WriteString(title)
b.WriteString(`</h1>`) b.WriteString(`</h1>`)
RenderObject(&b, obj, "")
b.WriteString("</div>")
b.WriteString("</div>")
return b.String()
}
// RenderObject ...
func RenderObject(b *bytes.Buffer, obj interface{}, idPrefix string) {
t := reflect.TypeOf(obj).Elem()
v := reflect.ValueOf(obj).Elem()
// Fields // Fields
for i := 0; i < t.NumField(); i++ { for i := 0; i < t.NumField(); i++ {
field := t.Field(i) field := t.Field(i)
RenderField(b, &v, field, idPrefix)
}
}
// RenderField ...
func RenderField(b *bytes.Buffer, v *reflect.Value, field reflect.StructField, idPrefix string) {
if field.Anonymous || field.Tag.Get("editable") != "true" { if field.Anonymous || field.Tag.Get("editable") != "true" {
continue return
} }
fieldValue := reflect.Indirect(v.FieldByName(field.Name)) fieldValue := reflect.Indirect(v.FieldByName(field.Name))
switch field.Type.String() { switch field.Type.String() {
case "string": case "string":
b.WriteString(components.InputText(field.Name, fieldValue.String(), field.Name, "")) b.WriteString(components.InputText(idPrefix+field.Name, fieldValue.String(), field.Name, ""))
case "[]string": case "[]string":
b.WriteString(components.InputTags(field.Name, fieldValue.Interface().([]string), field.Name)) b.WriteString(components.InputTags(idPrefix+field.Name, fieldValue.Interface().([]string), field.Name))
case "[]*arn.ExternalMedia": case "[]*arn.ExternalMedia":
for sliceIndex := 0; sliceIndex < fieldValue.Len(); sliceIndex++ { for sliceIndex := 0; sliceIndex < fieldValue.Len(); sliceIndex++ {
b.WriteString(EditForm(fieldValue.Index(sliceIndex).Interface(), "External Media")) arrayObj := fieldValue.Index(sliceIndex).Interface()
arrayIDPrefix := fmt.Sprintf("%s[%d].", field.Name, sliceIndex)
RenderObject(b, arrayObj, arrayIDPrefix)
} }
default: default:
panic("No edit form implementation for " + field.Name + " with type " + field.Type.String()) panic("No edit form implementation for " + idPrefix + field.Name + " with type " + field.Type.String())
} }
} }
b.WriteString("</div>")
b.WriteString("</div>")
return b.String()
}