-
Notifications
You must be signed in to change notification settings - Fork 6
/
controls_form.go
111 lines (91 loc) · 2.2 KB
/
controls_form.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package examples
import (
"context"
bootstrap "github.com/goradd/goradd/pkg/bootstrap/control"
"github.com/goradd/goradd/pkg/page"
. "github.com/goradd/goradd/pkg/page/control"
"github.com/goradd/goradd/pkg/url"
"sort"
)
const ControlsFormPath = "/goradd/examples/bootstrap.g"
const ControlsFormId = "BootstrapControlsForm"
const (
TestButtonAction = iota + 1
)
type ControlsForm struct {
FormBase
}
func (f *ControlsForm) Init(ctx context.Context, formID string) {
f.FormBase.Init(ctx, formID)
f.AddRelatedFiles()
f.AddControls(ctx,
bootstrap.NavbarCreator{
ID: "nav",
Children:Children(
bootstrap.NavbarListCreator{
ID: "navList",
DataProvider:f,
},
),
},
PanelCreator{
ID: "detailPanel",
ControlOptions: page.ControlOptions{
Class: "container",
},
},
)
}
func (f *ControlsForm) LoadControls(ctx context.Context) {
var createF createFunction
if _, ok := page.GetContext(ctx).FormValue("testing"); ok {
f.SetAttribute("novalidate", true) // bypass html validation for testing
}
if id, ok := page.GetContext(ctx).FormValue("control"); ok {
for _, c := range controls {
if c.key == id {
createF = c.f
}
}
}
if createF == nil {
createF = controls[0].f
}
createF(ctx, GetPanel(f, "detailPanel"))
}
func (f *ControlsForm) BindData(ctx context.Context, s DataManagerI) {
sort.Slice(controls, func(i, j int) bool {
return controls[i].order < controls[j].order
})
pageContext := page.GetContext(ctx)
for _, c := range controls {
item := bootstrap.GetNavbarList(f, "navList").AddItem(c.name, c.key)
a := url.
NewBuilderFromUrl(*pageContext.URL).
SetValue("control", c.key).
String()
item.SetAnchor(a)
}
}
func init() {
page.RegisterForm(ControlsFormPath, &ControlsForm{}, ControlsFormId)
}
type createFunction func(ctx context.Context, parent page.ControlI)
type controlEntry struct {
key string
name string
f createFunction
order int
}
var controls []controlEntry
func RegisterPanel(key string,
name string,
f createFunction,
order int) {
for _, c := range controls {
if c.key == key {
panic("panel " + key + " is already registered")
}
}
controls = append(controls, controlEntry{key, name, f, order})
}