From 666965042af392ff8ca0e49e146affeb39d60488 Mon Sep 17 00:00:00 2001 From: bel Date: Sat, 20 Jul 2024 09:07:06 -0600 Subject: [PATCH] http chart to src/view --- cmd/http/main.go | 110 ++-------------------------------------------- src/view/chart.go | 109 +++++++++++++++++++++++++++++++++++++++++++++ todo.yaml | 1 + 3 files changed, 114 insertions(+), 106 deletions(-) create mode 100644 src/view/chart.go diff --git a/cmd/http/main.go b/cmd/http/main.go index a0c1945..aa9b93b 100644 --- a/cmd/http/main.go +++ b/cmd/http/main.go @@ -5,7 +5,6 @@ import ( "encoding/json" "flag" "fmt" - "io" "io/fs" "log" "maps" @@ -20,10 +19,9 @@ import ( _ "embed" - "github.com/go-echarts/go-echarts/v2/charts" - "github.com/go-echarts/go-echarts/v2/opts" "gogs.inhome.blapointe.com/ana-ledger/src/ana" "gogs.inhome.blapointe.com/ana-ledger/src/ledger" + "gogs.inhome.blapointe.com/ana-ledger/src/view" ) //go:embed public/* @@ -241,7 +239,7 @@ func Main() { } } instant := map[string]string{} - toChart := func(cumulative bool, display string, reg ledger.Register) Chart { + toChart := func(cumulative bool, display string, reg ledger.Register) view.Chart { nameCurrencyDateValue := map[string]map[ledger.Currency]map[string]float64{} for date, balances := range reg { for name, balance := range balances { @@ -257,9 +255,9 @@ func Main() { } } - chart := NewChart("line") + chart := view.NewChart("line") if v := display; v != "" { - chart = NewChart(v) + chart = view.NewChart(v) } chart.AddX(dates) @@ -410,103 +408,3 @@ func Main() { } } } - -type Chart interface { - AddX(interface{}) - AddY(string, []int) - Render(io.Writer) error - Overlap(Chart) -} - -func NewChart(name string) Chart { - switch name { - case "line": - return NewLine() - case "bar": - return NewBar() - case "stack": - return NewStack() - default: - panic("bad chart name " + name) - } -} - -type Line struct { - *charts.Line -} - -func NewLine() Line { - return Line{Line: charts.NewLine()} -} - -func (line Line) AddX(v interface{}) { - line.SetXAxis(v) -} - -func (line Line) AddY(name string, v []int) { - y := make([]opts.LineData, len(v)) - for i := range y { - y[i].Value = v[i] - } - line.AddSeries(name, y). - SetSeriesOptions(charts.WithBarChartOpts(opts.BarChart{ - Stack: "stackB", - })) -} - -func (line Line) Overlap(other Chart) { - overlapper, ok := other.(charts.Overlaper) - if !ok { - panic(fmt.Sprintf("cannot overlap %T", other)) - } - line.Line.Overlap(overlapper) -} - -type Bar struct { - *charts.Bar -} - -func NewBar() Bar { - return Bar{Bar: charts.NewBar()} -} - -func (bar Bar) AddX(v interface{}) { - bar.SetXAxis(v) -} - -func (bar Bar) AddY(name string, v []int) { - y := make([]opts.BarData, len(v)) - for i := range v { - y[i].Value = v[i] - } - bar.AddSeries(name, y) -} - -func (bar Bar) Overlap(other Chart) { - overlapper, ok := other.(charts.Overlaper) - if !ok { - panic(fmt.Sprintf("cannot overlap %T", other)) - } - bar.Bar.Overlap(overlapper) -} - -type Stack struct { - Bar -} - -func NewStack() Stack { - bar := NewBar() - bar.SetSeriesOptions(charts.WithBarChartOpts(opts.BarChart{Stack: "x"})) - return Stack{Bar: bar} -} - -func (stack Stack) AddY(name string, v []int) { - y := make([]opts.BarData, len(v)) - for i := range v { - y[i].Value = v[i] - } - stack.AddSeries(name, y). - SetSeriesOptions(charts.WithBarChartOpts(opts.BarChart{ - Stack: "stackA", - })) -} diff --git a/src/view/chart.go b/src/view/chart.go new file mode 100644 index 0000000..3778a71 --- /dev/null +++ b/src/view/chart.go @@ -0,0 +1,109 @@ +package view + +import ( + "fmt" + "io" + + "github.com/go-echarts/go-echarts/v2/charts" + "github.com/go-echarts/go-echarts/v2/opts" +) + +type Chart interface { + AddX(interface{}) + AddY(string, []int) + Render(io.Writer) error + Overlap(Chart) +} + +func NewChart(name string) Chart { + switch name { + case "line": + return NewLine() + case "bar": + return NewBar() + case "stack": + return NewStack() + default: + panic("bad chart name " + name) + } +} + +type Line struct { + *charts.Line +} + +func NewLine() Line { + return Line{Line: charts.NewLine()} +} + +func (line Line) AddX(v interface{}) { + line.SetXAxis(v) +} + +func (line Line) AddY(name string, v []int) { + y := make([]opts.LineData, len(v)) + for i := range y { + y[i].Value = v[i] + } + line.AddSeries(name, y). + SetSeriesOptions(charts.WithBarChartOpts(opts.BarChart{ + Stack: "stackB", + })) +} + +func (line Line) Overlap(other Chart) { + overlapper, ok := other.(charts.Overlaper) + if !ok { + panic(fmt.Sprintf("cannot overlap %T", other)) + } + line.Line.Overlap(overlapper) +} + +type Bar struct { + *charts.Bar +} + +func NewBar() Bar { + return Bar{Bar: charts.NewBar()} +} + +func (bar Bar) AddX(v interface{}) { + bar.SetXAxis(v) +} + +func (bar Bar) AddY(name string, v []int) { + y := make([]opts.BarData, len(v)) + for i := range v { + y[i].Value = v[i] + } + bar.AddSeries(name, y) +} + +func (bar Bar) Overlap(other Chart) { + overlapper, ok := other.(charts.Overlaper) + if !ok { + panic(fmt.Sprintf("cannot overlap %T", other)) + } + bar.Bar.Overlap(overlapper) +} + +type Stack struct { + Bar +} + +func NewStack() Stack { + bar := NewBar() + bar.SetSeriesOptions(charts.WithBarChartOpts(opts.BarChart{Stack: "x"})) + return Stack{Bar: bar} +} + +func (stack Stack) AddY(name string, v []int) { + y := make([]opts.BarData, len(v)) + for i := range v { + y[i].Value = v[i] + } + stack.AddSeries(name, y). + SetSeriesOptions(charts.WithBarChartOpts(opts.BarChart{ + Stack: "stackA", + })) +} diff --git a/todo.yaml b/todo.yaml index 580295f..b9bcd41 100755 --- a/todo.yaml +++ b/todo.yaml @@ -1,4 +1,5 @@ todo: +- amend deltas in ui - cd including run - clean ui for /transactions.html scheduled: []