/
picker.go
67 lines (55 loc) · 1.61 KB
/
picker.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
package vuetifyx
import (
"context"
"fmt"
"github.com/qor5/ui/vuetify"
"github.com/qor5/web"
h "github.com/theplant/htmlgo"
)
type PickerBuilder struct {
value interface{}
label string
fieldName string
comp h.MutableAttrHTMLComponent
}
func Picker(c h.MutableAttrHTMLComponent) (r *PickerBuilder) {
r = &PickerBuilder{comp: c}
return
}
func (b *PickerBuilder) Value(v interface{}) (r *PickerBuilder) {
b.value = v
return b
}
func (b *PickerBuilder) Label(v string) (r *PickerBuilder) {
b.label = v
return b
}
func (b *PickerBuilder) FieldName(v string) (r *PickerBuilder) {
b.fieldName = v
return b
}
func (b *PickerBuilder) MarshalHTML(ctx context.Context) ([]byte, error) {
menuLocal := fmt.Sprintf("picker_%s_menu", b.fieldName)
valueLocal := fmt.Sprintf("picker_%s_value", b.fieldName)
b.comp.SetAttr("@change", fmt.Sprintf(`locals.%s = false; locals.%s = $event; $plaid().form(plaidForm).fieldValue(%s, $event)`, menuLocal, valueLocal, h.JSONString(b.fieldName)))
return web.Scope(
vuetify.VMenu(
web.Slot(
vuetify.VTextField().
Label(b.label).
Attr(web.VFieldName(b.fieldName)...).
Value(b.value).
Readonly(true).
PrependIcon("edit_calendar").
Attr("v-model", fmt.Sprintf("locals.%s", valueLocal)).
Attr("v-bind", "attrs").
Attr("v-on", "on"),
).Name("activator").Scope("{ on, attrs }"),
b.comp,
).Attr("v-model", fmt.Sprintf("locals.%s", menuLocal)).
CloseOnContentClick(false).
MaxWidth(290),
).Init(fmt.Sprintf(`{%s: %s, %s: false}`, valueLocal, h.JSONString(b.value), menuLocal)).
VSlot("{ locals }").
MarshalHTML(ctx)
}