Files
MujicaUI/examples/gallery/pages_markets_4.go
T

166 lines
7.1 KiB
Go

package main
import (
"fmt"
"time"
"github.com/egoist/mygo/ui"
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/chart"
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/data"
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/finance"
"git.zacharyzhang.com/ZacharyZhang-NY/MujicaUI/input"
)
func marketsSentimentGaugeDemo(c *ui.Context, log func(string)) {
disabled := ui.Local(c.Root(), "196.disabled", func() bool { return false })
if input.Checkbox(c, disabled, "Disabled", input.CheckboxOptions{}).Changed() {
log(fmt.Sprint("disabled ", *disabled))
}
value := 72.0
level := ui.Local(c.Root(), "196.value", func() float64 { return 72 })
if input.Slider(c, level, input.SliderOptions{Min: 0, Max: 100, Step: 1, Label: "Sentiment", ShowValue: true}).Changed() {
log(fmt.Sprint(*level))
}
value = *level
status, empty, err := marketsDataState(c, "196", log)
ui.Column(c).Disabled(*disabled).MinHeight(0).Height(400).Children(func() {
finance.SentimentGauge(c, value, finance.SentimentGaugeOptions{Label: "Fear & Greed", Status: status, Empty: empty, Error: err, Retry: func() { log("retry requested") }})
})
}
func marketsPortfolioSummaryDemo(c *ui.Context, log func(string)) {
disabled := ui.Local(c.Root(), "197.disabled", func() bool { return false })
if input.Checkbox(c, disabled, "Disabled", input.CheckboxOptions{}).Changed() {
log(fmt.Sprint("disabled ", *disabled))
}
account := ui.Local(c.Root(), "197.account", func() string { return "" })
accounts := *ui.Local(c.Root(), "markets.PortfolioSummary.accounts.pages_markets_4", func() []finance.PortfolioAccount {
return []finance.PortfolioAccount{{ID: "a", Name: "Brokerage", Total: 120000, DayPnL: 1250, TotalReturn: 20000, Cost: 100000}, {ID: "b", Name: "Retirement", Total: 80000, DayPnL: -300, TotalReturn: 5000, Cost: 75000}}
})
assets := ui.Local(c.Root(), "197.assets", func() float64 { return 120000 })
if input.NumberInput(c, assets, input.NumberInputOptions{Min: 0, Max: 1000000, Step: 100, Precision: 2, Label: "Brokerage assets"}).Changed() {
log(fmt.Sprint(*assets))
}
accounts[0].Total = *assets
ui.Column(c).Disabled(*disabled).MinHeight(0).Height(400).Children(func() {
r := finance.PortfolioSummary(c, account, accounts, finance.PortfolioSummaryOptions{})
if r.Changed() {
log(fmt.Sprint(account))
}
})
}
func marketsAssetAllocationChartDemo(c *ui.Context, log func(string)) {
disabled := ui.Local(c.Root(), "198.disabled", func() bool { return false })
if input.Checkbox(c, disabled, "Disabled", input.CheckboxOptions{}).Changed() {
log(fmt.Sprint("disabled ", *disabled))
}
items := *ui.Local(c.Root(), "markets.AssetAllocationChart.items.pages_markets_4", func() []finance.AllocationItem {
return []finance.AllocationItem{{Name: "Stocks", Value: 60, Target: 50}, {Name: "Bonds", Value: 30, Target: 40}, {Name: "Cash", Value: 10, Target: 10}}
})
status := ui.Local(c.Root(), "198.status", func() int { return 0 })
if input.RadioGroup(c, status, []input.RadioItem[int]{{Value: 0, Label: "Ready"}, {Value: 1, Label: "Loading"}, {Value: 2, Label: "Empty"}, {Value: 3, Label: "Error"}}, input.RadioGroupOptions{Horizontal: true}).Changed() {
log(fmt.Sprint("status ", *status))
}
frame := chart.ChartFrame{Label: "AssetAllocationChart"}
if *status == 1 {
frame.Status = data.DataLoading
}
if *status == 3 {
frame.Status = data.DataFailed
frame.Error = "Sample failed"
}
if *status == 2 {
items = nil
}
tolerance := ui.Local(c.Root(), "198.tolerance", func() float64 { return 5 })
if input.Slider(c, tolerance, input.SliderOptions{Min: 1, Max: 15, Step: 1, Label: "Drift tolerance", ShowValue: true}).Changed() {
log(fmt.Sprint(*tolerance))
}
ui.Column(c).Disabled(*disabled).MinHeight(0).Height(400).Children(func() {
r := finance.AssetAllocationChart(c, items, finance.AssetAllocationChartOptions{Frame: frame, Tolerance: *tolerance})
if r.Changed() || r.Retried() {
log(fmt.Sprint(r.Point))
}
})
}
func marketsPerformanceChartDemo(c *ui.Context, log func(string)) {
disabled := ui.Local(c.Root(), "199.disabled", func() bool { return false })
if input.Checkbox(c, disabled, "Disabled", input.CheckboxOptions{}).Changed() {
log(fmt.Sprint("disabled ", *disabled))
}
values := *ui.Local(c.Root(), "markets.PerformanceChart.values.pages_markets_4", func() []float64 { return []float64{100, 110, 95, 120} })
benchmark := *ui.Local(c.Root(), "markets.PerformanceChart.benchmark.pages_markets_4", func() []float64 { return []float64{100, 105, 108, 112} })
times := *ui.Local(c.Root(), "markets.PerformanceChart.times.pages_markets_4", func() []time.Time {
return []time.Time{time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 2, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 3, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 4, 1, 0, 0, 0, 0, time.UTC)}
})
status := ui.Local(c.Root(), "199.status", func() int { return 0 })
if input.RadioGroup(c, status, []input.RadioItem[int]{{Value: 0, Label: "Ready"}, {Value: 1, Label: "Loading"}, {Value: 2, Label: "Empty"}, {Value: 3, Label: "Error"}}, input.RadioGroupOptions{Horizontal: true}).Changed() {
log(fmt.Sprint("status ", *status))
}
frame := chart.ChartFrame{Label: "PerformanceChart"}
if *status == 1 {
frame.Status = data.DataLoading
}
if *status == 3 {
frame.Status = data.DataFailed
frame.Error = "Sample failed"
}
if *status == 2 {
values = nil
benchmark = nil
times = nil
}
ui.Column(c).Disabled(*disabled).MinHeight(0).Height(400).Children(func() {
r := finance.PerformanceChart(c, values, finance.PerformanceChartOptions{Frame: frame, Times: times, Benchmark: benchmark})
if r.Changed() || r.Retried() {
log(fmt.Sprint(r.Point))
}
if name, ok := r.Toggled(); ok {
log(fmt.Sprint(name))
}
})
}
func marketsCurrencyConverterDemo(c *ui.Context, log func(string)) {
disabled := ui.Local(c.Root(), "200.disabled", func() bool { return false })
if input.Checkbox(c, disabled, "Disabled", input.CheckboxOptions{}).Changed() {
log(fmt.Sprint("disabled ", *disabled))
}
state := ui.Local(c.Root(), "200.state", func() finance.CurrencyConverterState {
return finance.CurrencyConverterState{Amount: 100, From: "USD", To: "JPY"}
})
currencies := *ui.Local(c.Root(), "markets.CurrencyConverter.currencies.pages_markets_4", func() []finance.Currency {
return []finance.Currency{{Code: "USD", Name: "Dollar", Decimals: 2}, {Code: "JPY", Name: "Yen", Decimals: 0}}
})
rate := ui.Local(c.Root(), "200.rate", func() float64 { return 149.37 })
if input.NumberInput(c, rate, input.NumberInputOptions{Min: 0, Max: 1000, Step: 0.0001, Precision: 4, Label: "Caller rate"}).Changed() {
log(fmt.Sprint("rate ", *rate))
}
if input.Button(c, "Load pair rate", input.ButtonOptions{Variant: input.Secondary}).Clicked() {
*rate = 149.37
if state.From == "JPY" {
*rate = 1 / 149.37
}
log("pair rate loaded")
}
beforeAmount := state.Amount
ui.Column(c).Disabled(*disabled).MinHeight(0).Height(400).Children(func() {
r := finance.CurrencyConverter(c, state, currencies, finance.CurrencyConverterOptions{Rate: *rate, RateFrom: state.From, RateTo: state.To})
if r.PairChanged {
*rate = 0
log(fmt.Sprint(state.From, state.To))
}
})
if state.Amount != beforeAmount {
log(fmt.Sprint("amount ", state.Amount))
}
}