forked from ponzu-cms/ponzu
/
nested_repeater.go
62 lines (52 loc) · 1.67 KB
/
nested_repeater.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package editor
import (
"bytes"
"fmt"
"reflect"
)
func NestedRepeater(fieldName string, p interface{}, m func(v interface{}, f *FieldArgs) (string, []Field)) []byte {
value := ValueByName(fieldName, p, nil)
if value.Kind() != reflect.Slice && value.Kind() != reflect.Array {
panic(fmt.Sprintf("Ponzu: Type '%s' for field '%s' not supported.", value.Type(), fieldName))
}
scope := TagNameFromStructField(fieldName, p, nil)
tmpl := `
<div class="col s12 __ponzu-repeat ` + scope + `">
<label class="active">` + fieldName + `</label>
`
positionalPlaceHolder := "%pos%"
fieldArgs := &FieldArgs{
Parent: fmt.Sprintf("%s.%s", fieldName, positionalPlaceHolder),
}
arrayTypeName, fields := m(p, fieldArgs)
fieldArgs.TypeName = arrayTypeName
emptyEntryTemplate := Nested("", p, fieldArgs, fields...)
script := &bytes.Buffer{}
scriptTmpl := makeScript("nested_repeater")
if err := scriptTmpl.Execute(script, struct {
Template string
NumItems int
Scope string
InputSelector string
CloneSelector string
PositionalPlaceholder string
}{
Template: string(emptyEntryTemplate),
NumItems: value.Len(),
Scope: scope,
CloneSelector: fmt.Sprintf(".%s", arrayTypeName),
InputSelector: "input",
PositionalPlaceholder: positionalPlaceHolder,
}); err != nil {
panic(err)
}
for i := 0; i < value.Len(); i++ {
_, fields = m(p, &FieldArgs{
Parent: fmt.Sprintf("%s.%d", fieldName, i),
})
fieldTemplate := Nested("", p, fieldArgs, fields...)
tmpl += string(fieldTemplate)
}
tmpl += `</div>`
return append([]byte(tmpl), script.Bytes()...)
}