diff --git a/styles/widgets.scarlet b/styles/widgets.scarlet index 30e39289..38f70ab7 100644 --- a/styles/widgets.scarlet +++ b/styles/widgets.scarlet @@ -31,7 +31,7 @@ width 100% .widget-title - text-align left + horizontal padding-bottom 0.5rem border-bottom 1px solid rgba(0, 0, 0, 0.1) // We need !important here to overwrite the h3:first-child rule @@ -56,4 +56,7 @@ .widget-form width 100% max-width 650px - margin 0 auto \ No newline at end of file + margin 0 auto + +.indent + margin-left 1rem \ No newline at end of file diff --git a/utils/editform/editform.go b/utils/editform/editform.go index a467ed25..a089c2d3 100644 --- a/utils/editform/editform.go +++ b/utils/editform/editform.go @@ -60,10 +60,16 @@ func Render(obj interface{}, title string, user *arn.User) string { return b.String() } -// RenderObject ... +// RenderObject renders the UI for the object into the bytes buffer and appends an ID prefix for all API requests. +// The ID prefix should either be empty or end with a dot character. func RenderObject(b *bytes.Buffer, obj interface{}, idPrefix string) { - t := reflect.TypeOf(obj).Elem() - v := reflect.ValueOf(obj).Elem() + t := reflect.TypeOf(obj) + v := reflect.ValueOf(obj) + + if t.Kind() == reflect.Ptr { + t = t.Elem() + v = v.Elem() + } // Fields for i := 0; i < t.NumField(); i++ { @@ -79,9 +85,10 @@ func RenderField(b *bytes.Buffer, v *reflect.Value, field reflect.StructField, i } fieldValue := reflect.Indirect(v.FieldByName(field.Name)) + fieldType := field.Type.String() - switch field.Type.String() { - case "string": + // String + if fieldType == "string" { if field.Tag.Get("datalist") != "" { dataList := field.Tag.Get("datalist") values := arn.DataLists[dataList] @@ -91,16 +98,48 @@ func RenderField(b *bytes.Buffer, v *reflect.Value, field reflect.StructField, i } else { b.WriteString(components.InputText(idPrefix+field.Name, fieldValue.String(), field.Name, field.Tag.Get("tooltip"))) } - case "[]string": - b.WriteString(components.InputTags(idPrefix+field.Name, fieldValue.Interface().([]string), field.Name, field.Tag.Get("tooltip"))) - case "bool": + + return + } + + // Bool + if fieldType == "bool" { if field.Name == "IsDraft" { return } - case "[]*arn.ExternalMedia", "[]*arn.Link": + + // TODO: Render bool type + return + } + + // Array of strings + if fieldType == "[]string" { + b.WriteString(components.InputTags(idPrefix+field.Name, fieldValue.Interface().([]string), field.Name, field.Tag.Get("tooltip"))) + return + } + + // Any kind of array + if strings.HasPrefix(fieldType, "[]") { + b.WriteString(`
`) - case "arn.CompanyName": - b.WriteString(` `) - default: - panic("No edit form implementation for " + idPrefix + field.Name + " with type " + field.Type.String()) + return } + + // Any custom field type will be recursively rendered via another RenderObject call + b.WriteString(` `) }