/
results_table.go
96 lines (84 loc) · 2.12 KB
/
results_table.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
package main
import (
"fmt"
"github.com/gopherjs/vecty"
"github.com/gopherjs/vecty/elem"
)
// ResultsTable is a widget for configuring testing session results.
type ResultsTable struct {
vecty.Core
results []Result
}
// NewResultsTable creates and inits new results table widget.
func NewResultsTable() *ResultsTable {
return &ResultsTable{}
}
// Render implements the vecty.Component interface for ResultsTable.
func (r *ResultsTable) Render() vecty.ComponentOrHTML {
return elem.Div(
vecty.If(len(r.results) > 0,
elem.Span(
vecty.Markup(
vecty.Class("is-pulled-right"),
),
r.csvButton(),
),
),
elem.Heading1(
vecty.Markup(
vecty.Class("title", "has-text-weight-light"),
),
vecty.Text("Results"),
),
r.table(),
)
}
// AddResult adds a new result and refreshes the table.
func (r *ResultsTable) AddResult(res Result) {
r.results = append(r.results, res)
vecty.Rerender(r)
}
func (r *ResultsTable) table() vecty.ComponentOrHTML {
return elem.Table(
vecty.Markup(
vecty.Class("table", "is-fullwidth"),
),
r.thead(),
r.tresults(),
)
}
func (r *ResultsTable) thead() vecty.ComponentOrHTML {
return elem.TableHead(
elem.TableRow(
elem.TableHeader(vecty.Text("QR Lvl")),
elem.TableHeader(vecty.Text("FPS")),
elem.TableHeader(vecty.Text("Chunk size")),
elem.TableHeader(vecty.Text("Result")),
),
)
}
func (r *ResultsTable) tresults() vecty.ComponentOrHTML {
rows := make([]vecty.MarkupOrChild, len(r.results))
for _, res := range r.results {
rows = append(rows, tableRow(res))
}
return elem.TableBody(rows...)
}
func tableRow(r Result) *vecty.HTML {
return elem.TableRow(
elem.TableData(vecty.Text(fmt.Sprintf("%s", r.lvl))),
elem.TableData(vecty.Text(fmt.Sprintf("%d", r.fps))),
elem.TableData(vecty.Text(fmt.Sprintf("%d", r.size))),
elem.TableData(vecty.Text(fmt.Sprintf("%s", r.Duration))),
)
}
func (r *ResultsTable) csvButton() *vecty.HTML {
return elem.Anchor(
vecty.Markup(
vecty.Class("button", "is-success"),
vecty.Attribute("href", r.csvDataURI()),
vecty.Attribute("download", "test_results.csv"),
),
vecty.Text("Download CSV"),
)
}