http chart to src/view
parent
f6b8b92bff
commit
666965042a
110
cmd/http/main.go
110
cmd/http/main.go
|
|
@ -5,7 +5,6 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"log"
|
"log"
|
||||||
"maps"
|
"maps"
|
||||||
|
|
@ -20,10 +19,9 @@ import (
|
||||||
|
|
||||||
_ "embed"
|
_ "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/ana"
|
||||||
"gogs.inhome.blapointe.com/ana-ledger/src/ledger"
|
"gogs.inhome.blapointe.com/ana-ledger/src/ledger"
|
||||||
|
"gogs.inhome.blapointe.com/ana-ledger/src/view"
|
||||||
)
|
)
|
||||||
|
|
||||||
//go:embed public/*
|
//go:embed public/*
|
||||||
|
|
@ -241,7 +239,7 @@ func Main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
instant := map[string]string{}
|
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{}
|
nameCurrencyDateValue := map[string]map[ledger.Currency]map[string]float64{}
|
||||||
for date, balances := range reg {
|
for date, balances := range reg {
|
||||||
for name, balance := range balances {
|
for name, balance := range balances {
|
||||||
|
|
@ -257,9 +255,9 @@ func Main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
chart := NewChart("line")
|
chart := view.NewChart("line")
|
||||||
if v := display; v != "" {
|
if v := display; v != "" {
|
||||||
chart = NewChart(v)
|
chart = view.NewChart(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
chart.AddX(dates)
|
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",
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
}))
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue