-
Notifications
You must be signed in to change notification settings - Fork 11
/
textbox.go
82 lines (68 loc) · 1.77 KB
/
textbox.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
package textbox
import (
"qlova.org/seed"
"qlova.org/seed/client"
"qlova.org/seed/client/clientside"
"qlova.org/seed/use/html"
"qlova.org/seed/use/html/attr"
"qlova.org/seed/use/js"
"qlova.org/seed/new/html/datalist"
"qlova.org/seed/new/html/input"
"qlova.org/seed/new/html/option"
"qlova.org/seed/new/text"
)
//Data for a textbox.
type Data struct {
Suggestions []string
}
//New returns a new textbox widget.
func New(options ...seed.Option) seed.Seed {
Textbox := input.New(
seed.Options(options),
)
var data Data
Textbox.Load(&data)
if len(data.Suggestions) > 0 {
Datalist := datalist.New()
for _, suggestion := range data.Suggestions {
Datalist.With(
option.New(text.SetString(suggestion)),
)
}
Textbox.With(
attr.Set("list", client.ID(Datalist)),
Datalist,
)
}
return Textbox
}
//Update updates the given variable whenever the textbox text is modified.
func Update(variable *clientside.String) seed.Option {
return seed.NewOption(func(c seed.Seed) {
clientside.Hook(variable, c)
c.With(
client.On("render", html.Element(c).Set("value", variable)),
client.On("input", variable.SetTo(js.String{Value: html.Element(c).Get("value")})),
)
})
}
//SetSuggestions sets suggestions for the value in the textbox.
func SetSuggestions(suggestions []string) seed.Option {
return seed.Mutate(func(data *Data) {
data.Suggestions = suggestions
})
}
//SetPlaceholder sets the placeholder of the textbox.
func SetPlaceholder(placeholder string) seed.Option {
return attr.Set("placeholder", placeholder)
}
//SetReadOnly sets the textbox to be readonly.
func SetReadOnly() seed.Option {
return attr.Set("readonly", "")
}
//Focus focuses the textbox.
func Focus(c seed.Seed) js.Script {
return func(q js.Ctx) {
q(html.Element(c).Run(`focus`))
}
}