forked from InteliWISE/embgui
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcomponents.go
327 lines (282 loc) · 12.8 KB
/
components.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
package embgui
// H1 generates <h1> tag
func (n *EmbNode) H1(text string) *EmbNode {
return n.add(&EmbNode{Text: text, HTMLTag: "h1", Class: "title is-1"})
}
// H2 generates <h2> tag
func (n *EmbNode) H2(text string) *EmbNode {
return n.add(&EmbNode{Text: text, HTMLTag: "h2", Class: "title is-2"})
}
// H3 generates <h3> tag
func (n *EmbNode) H3(text string) *EmbNode {
return n.add(&EmbNode{Text: text, HTMLTag: "h3", Class: "title is-3"})
}
// H4 generates <h4> tag
func (n *EmbNode) H4(text string) *EmbNode {
return n.add(&EmbNode{Text: text, HTMLTag: "h4", Class: "title is-4"})
}
// H5 generates <h5> tag
func (n *EmbNode) H5(text string) *EmbNode {
return n.add(&EmbNode{Text: text, HTMLTag: "h5", Class: "title is-5"})
}
// Pre generates <pre><code> tags
func (n *EmbNode) Pre(text string, class string) *EmbNode {
return n.add(&EmbNode{HTMLTag: "pre", Class: class, Text: text})
}
// P generates <p> tag
func (n *EmbNode) P(text string) *EmbNode {
return n.add(&EmbNode{Text: text, HTMLTag: "p"})
}
// Strong generates <strong> tag
func (n *EmbNode) Strong(text string) *EmbNode {
return n.add(&EmbNode{Text: text, HTMLTag: "strong"})
}
// Em generates <em> tag
func (n *EmbNode) Em(text string) *EmbNode {
return n.add(&EmbNode{Text: text, HTMLTag: "em"})
}
// Div generates <div> with custom id and styling
func (n *EmbNode) Div(id string, style string, text string) *EmbNode {
return n.add(&EmbNode{ID: id, HTMLTag: "div", Style: style, Text: text})
}
// DivClass generates <div> with custom id and class
func (n *EmbNode) DivClass(id string, class string, text string) *EmbNode {
return n.add(&EmbNode{ID: id, HTMLTag: "div", Class: class, Text: text})
}
// Box generates div-box element
func (n *EmbNode) Box() *EmbNode {
return n.add(&EmbNode{HTMLTag: "div", Class: "box"})
}
// TwoColumns generates 2 column layout and returns 2 EmbNode pointers
//
// col1, col2 := TwoColumns()
// col1.H1("hello")
// col2.H2("world")
func (n *EmbNode) TwoColumns() (*EmbNode, *EmbNode) {
parent := n.add(&EmbNode{HTMLTag: "div", Class: "columns"})
return parent.add(&EmbNode{HTMLTag: "div", Class: "column"}),
parent.add(&EmbNode{HTMLTag: "div", Class: "column"})
}
// GenTiles generates set of tiles
//
// page.GenTiles(embgui.Tile{Title: "7", Subtitle: "new users"},
// embgui.Tile{Title: "71", Subtitle: "new sales"},
// embgui.Tile{Title: "90%", Subtitle: "CPU usage"},
// embgui.Tile{Title: "71%", Subtitle: "disk free"})
func (n *EmbNode) GenTiles(data ...Tile) *EmbNode {
parent := n.add(&EmbNode{HTMLTag: "div", Class: "tile is-ancestor"})
for _, n := range data {
tile := parent.add(&EmbNode{HTMLTag: "div", Class: "tile is-parent"})
article := tile.add(&EmbNode{HTMLTag: "article", Class: "tile is-child box"})
article.add(&EmbNode{HTMLTag: "p", Class: "title", Text: n.Title})
article.add(&EmbNode{HTMLTag: "p", Class: "subtitle", Text: n.Subtitle})
}
return parent
}
// A generates a link
func (n *EmbNode) A(text string, href string) *EmbNode {
return n.add(&EmbNode{Text: text, HTMLTag: "a", Href: href})
}
// Buttons generates <div> for button group
func (n *EmbNode) Buttons() *EmbNode {
return n.add(&EmbNode{HTMLTag: "div", Class: "buttons"})
}
// LinkButton generates a link styled as button
func (n *EmbNode) LinkButton(text string, href string) *EmbNode {
return n.add(&EmbNode{Text: text, HTMLTag: "a", Href: href, Class: "button is-link", Style: "margin: .25rem"})
}
// ActionButton generates POST button wrapped into a hidden form
// It's like LinkButton, but uses POST instead of GET
func (n *EmbNode) ActionButton(text string, action string) *EmbNode {
form := &EmbNode{HTMLTag: "form", Action: action, Method: "POST"}
form.add(&EmbNode{HTMLTag: "button", Type: "submit", Text: text, Class: "button is-primary", Style: "margin: .25rem"})
return n.add(form)
}
// DelButton generates DEL button wrapped into a hidden form
// your framework should support hidden _method tag
func (n *EmbNode) DelButton(text string, action string) *EmbNode {
form := &EmbNode{HTMLTag: "form", Action: action, Method: "POST"}
form.add(&EmbNode{HTMLTag: "input", Type: "hidden", Name: "_method", Value: "DELETE"})
form.add(&EmbNode{HTMLTag: "button", Type: "submit", Text: text, Class: "button is-danger", Style: "margin: .25rem"})
return n.add(form)
}
// MiniLinkButton generates a link styled as button, just like LinkButton(), but smaller
// it's good for links inside tables
func (n *EmbNode) MiniLinkButton(text string, href string) *EmbNode {
return n.add(&EmbNode{Text: text, HTMLTag: "a", Href: href, Class: "button is-link is-small", Style: "margin: .25rem"})
}
// MiniActionButton generates POST button wrapped into a hidden form
// it's good for buttons inside tables
func (n *EmbNode) MiniActionButton(text string, action string) *EmbNode {
form := &EmbNode{HTMLTag: "form", Action: action, Method: "POST"}
form.add(&EmbNode{HTMLTag: "button", Type: "submit", Text: text, Class: "button is-primary is-small", Style: "margin: .25rem"})
return n.add(form)
}
// MiniDelButton generates DEL button wrapped into a hidden form
// it's good for buttons inside tables
// your framework should support hidden _method tag
func (n *EmbNode) MiniDelButton(text string, action string) *EmbNode {
form := &EmbNode{HTMLTag: "form", Action: action, Method: "POST"}
form.add(&EmbNode{HTMLTag: "input", Type: "hidden", Name: "_method", Value: "DELETE"})
form.add(&EmbNode{HTMLTag: "button", Type: "submit", Text: text, Class: "button is-danger is-small", Style: "margin: .25rem"})
return n.add(form)
}
// Message generates pre-styled message/tip div - alerts etc
// color can be one of bulma's colors (see https://bulma.io/documentation/elements/button/#colors)
func (n *EmbNode) Message(text string, color string) *EmbNode {
msg := n.add(&EmbNode{HTMLTag: "div", Class: "message " + color})
return msg.add(&EmbNode{HTMLTag: "div", Text: text, Class: "message-body"})
}
// GenTableBody helps generate html table
// it returns tbody from inside the table, not the table itself, so you can add Tr/Td to it
//
// tbody := page.GenTableBody([]string{"id", "name", "surname"})
// row := tbody.Tr()
// row.Td("1")
// row.Td("john")
// row.Td("smith")
func (n *EmbNode) GenTableBody(header []string) *EmbNode {
table := &EmbNode{HTMLTag: "table", Class: "table is-narrow is-hoverable is-fullwidth"}
head := table.add(&EmbNode{HTMLTag: "thead"})
headRow := head.add(&EmbNode{HTMLTag: "tr"})
for _, h := range header {
headRow.add(&EmbNode{HTMLTag: "th", Text: h})
}
tbody := table.add(&EmbNode{HTMLTag: "tbody"})
n.add(table)
return tbody
}
// Tr table element
func (n *EmbNode) Tr() *EmbNode {
return n.add(&EmbNode{HTMLTag: "tr"})
}
// Td table element
func (n *EmbNode) Td(text string) *EmbNode {
return n.add(&EmbNode{HTMLTag: "td", Text: text})
}
// Ul starts a list
func (n *EmbNode) Ul() *EmbNode {
return n.add(&EmbNode{HTMLTag: "ul"})
}
// Li adds element to list
func (n *EmbNode) Li(text string) *EmbNode {
return n.add(&EmbNode{HTMLTag: "li", Text: text})
}
// Form generates simple form
func (n *EmbNode) Form(action string, method string) *EmbNode {
return n.add(&EmbNode{HTMLTag: "form", Action: action, Method: method})
}
// FormInput generates a text input inside form
func (n *EmbNode) FormInput(label string, hideLabel bool, name string, value string) *EmbNode {
fieldWrapper := n.add(&EmbNode{HTMLTag: "div", Class: "field"})
if !hideLabel {
fieldWrapper.add(&EmbNode{HTMLTag: "label", Class: "label", Text: label})
fieldWrapper.add(&EmbNode{HTMLTag: "div", Class: "control"}).
add(&EmbNode{HTMLTag: "input", Type: "text", Class: "input", Name: name, Value: value})
} else {
fieldWrapper.add(&EmbNode{HTMLTag: "div", Class: "control"}).
add(&EmbNode{HTMLTag: "input", Type: "text", Class: "input", Name: name, Placeholder: label, Value: value})
}
return fieldWrapper
}
// FormInput generates a text input inside form
func (n *EmbNode) FormPasswordInput(label string, name string) *EmbNode {
fieldWrapper := n.add(&EmbNode{HTMLTag: "div", Class: "field"})
fieldWrapper.add(&EmbNode{HTMLTag: "label", Class: "label", Text: label})
fieldWrapper.add(&EmbNode{HTMLTag: "div", Class: "control"}).
add(&EmbNode{HTMLTag: "input", Type: "password", Class: "input", Name: name})
return fieldWrapper
}
// FormHiddenInput generates a hidden text input inside form
func (n *EmbNode) FormHiddenInput(name string, value string) *EmbNode {
return n.add(&EmbNode{HTMLTag: "input", Type: "hidden", Name: name, Value: value})
}
// FormCheckbox generates a checkbox inside form
func (n *EmbNode) FormCheckbox(label string, name string) *EmbNode {
fieldWrapper := n.add(&EmbNode{HTMLTag: "div", Class: "field"})
controlWrapper := fieldWrapper.add(&EmbNode{HTMLTag: "div", Class: "control"})
inputHTMLString := (&EmbNode{HTMLTag: "input", Type: "checkbox", Name: name}).render()
labelWrapper := controlWrapper.add(&EmbNode{HTMLTag: "label", Class: "checkbox", Text: inputHTMLString + " " + label, Unsafe: true})
// labelWrapper.add(&EmbNode{HTMLTag: "input", Type: "checkbox", Name: name})
return labelWrapper
}
// FormSelect generates select inside form
// Use with FormSelectOption
func (n *EmbNode) FormSelect(label string, name string) *EmbNode {
fieldWrapper := n.add(&EmbNode{HTMLTag: "div", Class: "field"})
fieldWrapper.add(&EmbNode{HTMLTag: "label", Class: "label", Text: label})
controlWrapper := fieldWrapper.add(&EmbNode{HTMLTag: "div", Class: "control"})
selectWrapper := controlWrapper.add(&EmbNode{HTMLTag: "div", Class: "select"})
selectList := selectWrapper.add(&EmbNode{HTMLTag: "select", Name: name})
return selectList
}
// FormSelectOption add option inside select html tag
func (n *EmbNode) FormSelectOption(value string, text string) *EmbNode {
option := n.add(&EmbNode{HTMLTag: "option", Value: value, Text: text})
return option
}
// FormRadio generates radio wrapper inside form
// Use with FormRadioOption
func (n *EmbNode) FormRadio(label string, name string) *EmbNode {
fieldWrapper := n.add(&EmbNode{HTMLTag: "div", Class: "field"})
fieldWrapper.add(&EmbNode{HTMLTag: "label", Class: "label", Text: label})
controlWrapper := fieldWrapper.add(&EmbNode{HTMLTag: "div", Class: "control"})
return controlWrapper
}
// FormRadioOption add radio option inside radio wrapper
func (n *EmbNode) FormRadioOption(label string, name string) *EmbNode {
inputHTMLString := (&EmbNode{HTMLTag: "input", Type: "radio", Name: name, Value: label}).render()
option := n.add(&EmbNode{HTMLTag: "label", Class: "radio", Text: inputHTMLString + " " + label, Unsafe: true})
// option.add(&EmbNode{HTMLTag: "input", Type: "radio", Name: name, Value: label})
return option
}
// FileUpload generates a file upload form
func (n *EmbNode) FileUpload(action string, label string, name string) *EmbNode {
realForm := n.add(&EmbNode{HTMLTag: "form", Action: action, Method: "POST", Enctype: "multipart/form-data"})
wrapper := realForm.add(&EmbNode{HTMLTag: "div", Class: "field"})
wrapper.
add(&EmbNode{HTMLTag: "div", Class: "control"}).
add(&EmbNode{HTMLTag: "label", Class: "label", Text: label})
wrapper.
add(&EmbNode{HTMLTag: "div", Class: "control"}).
add(&EmbNode{HTMLTag: "input", Type: "file", Class: "input", Name: name})
wrapper.
add(&EmbNode{HTMLTag: "div", Class: "control"}).
add(&EmbNode{HTMLTag: "button", Type: "sumbit", Class: "button is-info", Text: "Upload"})
return realForm
}
// FormButton generates a submit button inside a form
func (n *EmbNode) FormButton(text string) *EmbNode {
return n.add(&EmbNode{HTMLTag: "div", Class: "control"}).
add(&EmbNode{HTMLTag: "button", Type: "sumbit", Class: "button", Text: text})
}
// FormTextArea generates a textarea inside a form
func (n *EmbNode) FormTextArea(name string, rows int, text string) *EmbNode {
return n.add(&EmbNode{HTMLTag: "div", Class: "field"}).
add(&EmbNode{HTMLTag: "textarea", Class: "textarea", Name: name, Rows: rows, Text: text})
}
// SearchForm generates predefined search form
// action is a URL we use to do a GET request with a "search" param
func (n *EmbNode) SearchForm(action string, value string) *EmbNode {
realForm := n.add(&EmbNode{HTMLTag: "form", Action: action, Method: "GET"})
wrapper := realForm.add(&EmbNode{HTMLTag: "div", Class: "field has-addons"})
wrapper.
add(&EmbNode{HTMLTag: "div", Class: "control"}).
add(&EmbNode{HTMLTag: "input", Type: "text", Class: "input", Name: "search", Value: value})
wrapper.
add(&EmbNode{HTMLTag: "div", Class: "control"}).
add(&EmbNode{HTMLTag: "button", Type: "sumbit", Class: "button is-info", Text: "Search"})
return realForm
}
// RawHTML generates a div with unsafe HTML
func (n *EmbNode) RawHTML(html string) *EmbNode {
return n.add(&EmbNode{HTMLTag: "div", Text: html, Unsafe: true})
}
// Hr generates a horizontal rule
func (n *EmbNode) Hr() *EmbNode {
return n.add(&EmbNode{HTMLTag: "hr", Class: "hr"})
}
//CustomTag generates a custom tag with id
func (n *EmbNode) CustomTag(tag string, id string, class string) *EmbNode {
return n.add(&EmbNode{HTMLTag: tag, ID: id, Class: class})
}