forked from ungerik/go-start
/
modeliteratortableview.go
72 lines (62 loc) · 1.72 KB
/
modeliteratortableview.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
package view
func TableHeaderRow(views ...View) func(ctx *Context) (Views, error) {
return func(ctx *Context) (Views, error) {
return Views(views), nil
}
}
func TableHeaderRowEscape(s ...string) func(ctx *Context) (Views, error) {
views := make(Views, len(s))
for i := range s {
views[i] = Escape(s[i])
}
return func(ctx *Context) (Views, error) {
return views, nil
}
}
///////////////////////////////////////////////////////////////////////////////
// ModelIteratorTableView
type ModelIteratorTableView struct {
ViewBase
Class string
Caption string
GetModelIterator GetModelIteratorFunc
GetHeaderRowViews func(ctx *Context) (views Views, err error)
GetRowViews func(row int, rowModel interface{}, ctx *Context) (views Views, err error)
table Table
}
func (self *ModelIteratorTableView) IterateChildren(callback IterateChildrenCallback) {
callback(self, &self.table)
}
func (self *ModelIteratorTableView) Render(ctx *Context) (err error) {
self.table.Class = self.Class
self.table.Caption = self.Caption
tableModel := ViewsTableModel{}
self.table.HeaderRow = false
if self.GetHeaderRowViews != nil {
views, err := self.GetHeaderRowViews(ctx)
if err != nil {
return err
}
if views != nil {
tableModel = append(tableModel, views)
self.table.HeaderRow = true
}
}
rowNr := 0
iter := self.GetModelIterator(ctx)
for rowModel := iter.Next(); rowModel != nil; rowModel = iter.Next() {
views, err := self.GetRowViews(rowNr, rowModel, ctx)
if err != nil {
return err
}
if views != nil {
tableModel = append(tableModel, views)
rowNr++
}
}
if iter.Err() != nil {
return iter.Err()
}
self.table.Model = tableModel
return self.table.Render(ctx)
}