forked from hexops/vecty
/
itemview.go
103 lines (90 loc) · 2.08 KB
/
itemview.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
package components
import (
"github.com/dave/vecty"
"github.com/dave/vecty/elem"
"github.com/dave/vecty/event"
"github.com/dave/vecty/examples/todomvc/actions"
"github.com/dave/vecty/examples/todomvc/dispatcher"
"github.com/dave/vecty/examples/todomvc/store/model"
"github.com/dave/vecty/prop"
"github.com/dave/vecty/style"
)
type ItemView struct {
vecty.Core
Index int
Item *model.Item
editing bool
editTitle string
input *vecty.HTML
}
func (p *ItemView) Restore(prev vecty.Component) bool {
if old, ok := prev.(*ItemView); ok {
p.editing = old.editing
p.editTitle = old.editTitle
}
return false
}
func (p *ItemView) onDestroy(event *vecty.Event) {
dispatcher.Dispatch(&actions.DestroyItem{
Index: p.Index,
})
}
func (p *ItemView) onToggleCompleted(event *vecty.Event) {
dispatcher.Dispatch(&actions.SetCompleted{
Index: p.Index,
Completed: event.Target.Get("checked").Bool(),
})
}
func (p *ItemView) onStartEdit(event *vecty.Event) {
p.editing = true
p.editTitle = p.Item.Title
vecty.Rerender(p)
p.input.Node.Call("focus")
}
func (p *ItemView) onEditInput(event *vecty.Event) {
p.editTitle = event.Target.Get("value").String()
vecty.Rerender(p)
}
func (p *ItemView) onStopEdit(event *vecty.Event) {
p.editing = false
vecty.Rerender(p)
dispatcher.Dispatch(&actions.SetTitle{
Index: p.Index,
Title: p.editTitle,
})
}
func (p *ItemView) Render() *vecty.HTML {
p.input = elem.Input(
prop.Class("edit"),
prop.Value(p.editTitle),
event.Input(p.onEditInput),
)
return elem.ListItem(
vecty.ClassMap{
"completed": p.Item.Completed,
"editing": p.editing,
},
elem.Div(
prop.Class("view"),
elem.Input(
prop.Class("toggle"),
prop.Type(prop.TypeCheckbox),
prop.Checked(p.Item.Completed),
event.Change(p.onToggleCompleted),
),
elem.Label(
vecty.Text(p.Item.Title),
event.DoubleClick(p.onStartEdit),
),
elem.Button(
prop.Class("destroy"),
event.Click(p.onDestroy),
),
),
elem.Form(
style.Margin(style.Px(0)),
event.Submit(p.onStopEdit).PreventDefault(),
p.input,
),
)
}