http chart to src/view

main
bel 2024-07-20 09:07:06 -06:00
parent f6b8b92bff
commit 666965042a
3 changed files with 114 additions and 106 deletions

View File

@ -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",
}))
}

109
src/view/chart.go Normal file
View File

@ -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",
}))
}

View File

@ -1,4 +1,5 @@
todo:
- amend deltas in ui
- cd including run
- clean ui for /transactions.html
scheduled: []