-
Notifications
You must be signed in to change notification settings - Fork 1
/
layout-tabs.go
123 lines (90 loc) · 2.72 KB
/
layout-tabs.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
112
113
114
115
116
117
118
119
120
121
122
123
package widget
import (
"strconv"
"strings"
"github.com/benpate/derp"
"github.com/benpate/form"
"github.com/benpate/html"
"github.com/benpate/rosetta/schema"
)
type LayoutTabs struct{}
func (widget LayoutTabs) View(element *form.Element, s *schema.Schema, provider form.LookupProvider, value any, b *html.Builder) error {
return nil
}
func (widget LayoutTabs) Edit(element *form.Element, s *schema.Schema, provider form.LookupProvider, value any, b *html.Builder) error {
if element.ReadOnly {
return LayoutTabs{}.View(element, s, provider, value, b)
}
if element.ID == "" {
element.ID = "tabcontainer"
}
if len(element.Label) > 0 {
b.Div().Class("layout-title").InnerText(element.Label).Close()
}
// Make a placeholder for labels
labels := make([]string, 0)
// If we have a configuration option for labels,
// parse it into a slice
if labelString, ok := element.Options.GetStringOK("labels"); ok && (labelString != "") {
labels = strings.Split(labelString, ",")
}
b.Div().Class("tabs").Script("install TabContainer")
b.Div().Role("tablist")
for index, child := range element.Children {
indexString := strconv.Itoa(index)
child.ID = element.ID + "-" + indexString // Set ID for tab + panel
var label string
// Use the best label we have (configured, or generated)
if index < len(labels) {
label = labels[index]
} else if child.Label != "" {
label = child.Label
} else {
label = "Tab " + indexString
}
// Go!
tab := b.Button().
Type("button").
Role("tab").
ID("tab-"+child.ID).
Class("tab-label").
Aria("controls", "panel-"+child.ID).
TabIndex("0")
if script, ok := child.Options.GetStringOK("script"); ok {
tab.Script(script)
}
if index == 0 {
tab.Aria("selected", "true")
}
tab.InnerText(label).Close()
}
b.Close() // role=tablist
for index, child := range element.Children {
// Data overrides (just for this loop)
child.ID = element.ID + "-" + strconv.Itoa(index) // Set ID for tab + panel
child.Label = "" // Remove remaining labels labels
panel := b.Div().
Role("tabpanel").
ID("panel-"+child.ID).
Aria("labelledby", "tab-"+child.ID)
if index > 0 {
panel.Attr("hidden", "true")
}
panel.EndBracket()
if err := child.Edit(s, provider, value, b.SubTree()); err != nil {
return derp.Wrap(err, "form.HTMLLayoutTabs", "Error writing child", child)
}
panel.Close() // role=tabpanel
}
b.Close() // role=tabs
return nil
}
/***********************************
* Wiget Metadata
***********************************/
func (widget LayoutTabs) ShowLabels() bool {
return false
}
func (widget LayoutTabs) Encoding(element *form.Element) string {
return collectEncoding(element.Children)
}