-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbar_chart.go
150 lines (122 loc) · 4.12 KB
/
bar_chart.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package charts
import (
"github.com/cnguy/gopherjs-frappe-charts/utils"
"github.com/gopherjs/gopherjs/js"
)
type BarChartArgs struct {
*js.Object
Parent string `js:"parent"`
Title string `js:"title"`
Data *ChartData `js:"data"`
Type string `js:"type"`
Height int `js:"height"`
Colors []string `js:"colors"`
XAxisMode string `js:"x_axis_mode"`
YAxisMode string `js:"y_axis_mode"`
IsSeries int `js:"is_series"`
IsNavigable int `js:"is_navigable"`
FormatTooltipX func(string) string `js:"format_tooltip_x"`
FormatTooltipY func(string) string `js:"format_tooltip_y"`
}
func NewBarChart(parent string, data *ChartData) *BarChartArgs {
new := &BarChartArgs{Object: js.Global.Get("Object").New()}
new.Parent = parent
new.Type = "bar"
new.Data = data
return new
}
func (chartArgs *BarChartArgs) WithTitle(title string) *BarChartArgs {
chartArgs.Title = title
return chartArgs
}
func (chartArgs *BarChartArgs) WithHeight(height int) *BarChartArgs {
chartArgs.Height = height
return chartArgs
}
func (chartArgs *BarChartArgs) WithColors(colors []string) *BarChartArgs {
chartArgs.Colors = colors
return chartArgs
}
func (chartArgs *BarChartArgs) SetXAxisMode(mode string) *BarChartArgs {
chartArgs.XAxisMode = mode
return chartArgs
}
func (chartArgs *BarChartArgs) SetYAxisMode(mode string) *BarChartArgs {
chartArgs.YAxisMode = mode
return chartArgs
}
func (chartArgs *BarChartArgs) SetIsSeries(val bool) *BarChartArgs {
chartArgs.SetBton("is_series", val)
return chartArgs
}
func (chartArgs *BarChartArgs) SetIsNavigable(val bool) *BarChartArgs {
chartArgs.SetBton("is_navigable", val)
return chartArgs
}
func (chartArgs *BarChartArgs) WithFormatTooltipX(callback func(string) string) *BarChartArgs {
chartArgs.FormatTooltipX = callback
return chartArgs
}
func (chartArgs *BarChartArgs) WithFormatTooltipY(callback func(string) string) *BarChartArgs {
chartArgs.FormatTooltipY = callback
return chartArgs
}
func (chartArgs *BarChartArgs) SetBton(key string, val bool) {
chartArgs.Set(key, utils.Btoi(val))
}
type BarChart struct {
*js.Object
}
func (chart *BarChart) UpdateValues(updateValues *UpdateValuesArgs) {
chart.Call("update_values", updateValues.Values, updateValues.Labels)
}
func (chart *BarChart) AppendDataPoint(values []float64, label string) {
chart.Call("add_data_point", utils.FloatSliceToInterface(values), label)
}
func (chart *BarChart) AddDataPoint(values []float64, label string, index int) {
chart.Call("add_data_point", utils.FloatSliceToInterface(values), label, index)
}
func (chart *BarChart) PopDataPoint() {
chart.Call("remove_data_point")
}
func (chart *BarChart) RemoveDataPoint(index int) {
chart.Call("remove_data_point", index)
}
func (chart *BarChart) ShowSums() {
chart.Call("show_sums")
}
func (chart *BarChart) HideSums() {
chart.Call("hide_sums")
}
func (chart *BarChart) ShowAverages() {
chart.Call("show_averages")
}
func (chart *BarChart) HideAverages() {
chart.Call("hide_averages")
}
func (chartArgs *BarChartArgs) Render() *BarChart {
// Set defaults that aren't handled by frappe here.
if chartArgs.Height == 0 {
chartArgs.Height = 150
}
// Create actual chart.
new := BarChart{js.Global.Get("Chart").New(&chartArgs)}
return &new
}
type DataSelectEvent struct {
*js.Object
Value interface{} `js:"value"`
Label interface{} `js:"label"`
Index int `js:"index"`
}
type eventListenerCallback func(event *DataSelectEvent)
func (chart *BarChart) AddEventListener(eventName string, fn eventListenerCallback) {
parent := chart.Get("parent").Get("id").String()
element := js.Global.Get("document").Call("getElementById", parent)
element.Call("addEventListener", eventName, fn)
}
// AddDataSelectListener is a helper function to allow users to quickly set a data-select event.
// This allows users to access the index, value, and label of any particular data point!
func (chart *BarChart) AddDataSelectListener(fn eventListenerCallback) {
chart.AddEventListener("data-select", fn)
}