-
Notifications
You must be signed in to change notification settings - Fork 1
/
layout.go
95 lines (70 loc) · 2.4 KB
/
layout.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package widget
import (
"github.com/benpate/derp"
"github.com/benpate/form"
"github.com/benpate/html"
"github.com/benpate/rosetta/schema"
)
func drawLayout(element *form.Element, schema *schema.Schema, provider form.LookupProvider, value any, b *html.Builder, alignment string, edit bool) error {
const location = "form.drawLayout"
var result error
b.Div().Class("layout", "layout-"+alignment)
if len(element.Label) > 0 {
b.Div().Class("layout-title").InnerText(element.Label).Close()
}
if len(element.Description) > 0 {
b.Div().Class("layout-description").InnerText(element.Description).Close()
}
b.Div().Class("layout-" + alignment + "-elements")
for index := range element.Children {
child := element.Children[index]
widget, err := child.Widget()
if err != nil {
return derp.Wrap(err, location, "Error rendering child", index, child)
}
var container *html.Element
// All elements (except hidden) get wrapped in a div
if child.Type != "hidden" {
container = b.Div()
container.Class("layout-element", "layout-"+alignment+"-element")
if showIf := child.Options.GetString("show-if"); showIf != "" {
container.Data("script", "install showIf(condition:'"+showIf+"')")
}
container.EndBracket()
if widget.ShowLabels() {
b.Label(child.ID).InnerText(child.Label).Close()
}
}
// Draw the edit or view version of this element
if edit {
if err := widget.Edit(&child, schema, provider, value, b.SubTree()); err != nil {
return derp.Wrap(err, location, "Error rendering child (edit)", element, index, child)
}
} else {
if err := widget.View(&child, schema, provider, value, b.SubTree()); err != nil {
return derp.Wrap(err, location, "Error rendering child (view)", element, index, child)
}
}
// If there's a description on this element, draw it here
if widget.ShowLabels() && (child.Description != "") {
b.Div().Class("text-sm gray40").InnerText(child.Description).Close()
}
// Close the DIV wrapper from above (if applicable)
if container != nil {
container.Close()
}
}
b.CloseAll()
return result
}
// collectEncoding returns the first non-empty encoding found in a slice of child elements
func collectEncoding(children []form.Element) string {
for _, child := range children {
if widget, err := child.Widget(); err == nil {
if encoding := widget.Encoding(&child); encoding != "" {
return encoding
}
}
}
return ""
}