diff --git a/app.go b/app.go index 3b45e99..4984f50 100644 --- a/app.go +++ b/app.go @@ -51,6 +51,35 @@ func (a *App) GetLastPer100(name string) WailsPer100 { return WailsPer100{Data: data, Success: true} } +func (a *App) GetDailyFood() WailsAggregateFood { + data, err := foodService.GetDaily() + if err != nil { + return WailsAggregateFood{Success: false, Error: err.Error()} + } + return WailsAggregateFood{Data: data, Success: true} +} +func (a *App) GetWeeklyFood() WailsAggregateFood { + data, err := foodService.GetWeekly() + if err != nil { + return WailsAggregateFood{Success: false, Error: err.Error()} + } + return WailsAggregateFood{Data: data, Success: true} +} +func (a *App) GetMonthlyFood() WailsAggregateFood { + data, err := foodService.GetMonthly() + if err != nil { + return WailsAggregateFood{Success: false, Error: err.Error()} + } + return WailsAggregateFood{Data: data, Success: true} +} +func (a *App) GetYearlyFood() WailsAggregateFood { + data, err := foodService.GetYearly() + if err != nil { + return WailsAggregateFood{Success: false, Error: err.Error()} + } + return WailsAggregateFood{Data: data, Success: true} +} + // region settings func (a *App) GetSettings() settings { return Settings diff --git a/frontend/src/lib/components/Energy/AggregatedFood/AggregatedFoodComp.svelte b/frontend/src/lib/components/Energy/AggregatedFood/AggregatedFoodComp.svelte new file mode 100644 index 0000000..24ca740 --- /dev/null +++ b/frontend/src/lib/components/Energy/AggregatedFood/AggregatedFoodComp.svelte @@ -0,0 +1,23 @@ + + + diff --git a/frontend/src/lib/components/Energy/AggregatedFood/AggregatedFoodTable.svelte b/frontend/src/lib/components/Energy/AggregatedFood/AggregatedFoodTable.svelte new file mode 100644 index 0000000..8a353a7 --- /dev/null +++ b/frontend/src/lib/components/Energy/AggregatedFood/AggregatedFoodTable.svelte @@ -0,0 +1,118 @@ + + + diff --git a/frontend/src/lib/components/Energy/Food/EmptyFoodComp.svelte b/frontend/src/lib/components/Energy/Food/EmptyFoodComp.svelte index 1ec1c00..90b84a4 100644 --- a/frontend/src/lib/components/Energy/Food/EmptyFoodComp.svelte +++ b/frontend/src/lib/components/Energy/Food/EmptyFoodComp.svelte @@ -2,7 +2,7 @@ import { toast } from "svelte-sonner"; import { main } from "$wails/models"; import { CreateFood, GetLastPer100 } from "$wails/main/App"; - import { foodStore } from "$lib/store/FoodStore"; + import { foodStore } from "$lib/store/Energy/foodStore"; let item: main.Food = { food: "", diff --git a/frontend/src/lib/router/Router.svelte b/frontend/src/lib/router/Router.svelte index 8c1e2c9..7aa8372 100644 --- a/frontend/src/lib/router/Router.svelte +++ b/frontend/src/lib/router/Router.svelte @@ -1,9 +1,17 @@ diff --git a/frontend/src/lib/router/routes/Daily.svelte b/frontend/src/lib/router/routes/Daily.svelte new file mode 100644 index 0000000..6da91e9 --- /dev/null +++ b/frontend/src/lib/router/routes/Daily.svelte @@ -0,0 +1,8 @@ + + + diff --git a/frontend/src/lib/components/Energy/Energy.svelte b/frontend/src/lib/router/routes/Energy.svelte similarity index 82% rename from frontend/src/lib/components/Energy/Energy.svelte rename to frontend/src/lib/router/routes/Energy.svelte index da56fd5..ea15748 100644 --- a/frontend/src/lib/components/Energy/Energy.svelte +++ b/frontend/src/lib/router/routes/Energy.svelte @@ -1,24 +1,24 @@ - - - + + + diff --git a/frontend/src/lib/router/routes/Monthly.svelte b/frontend/src/lib/router/routes/Monthly.svelte new file mode 100644 index 0000000..9b53d05 --- /dev/null +++ b/frontend/src/lib/router/routes/Monthly.svelte @@ -0,0 +1,8 @@ + + + diff --git a/frontend/src/lib/router/routes/Weekly.svelte b/frontend/src/lib/router/routes/Weekly.svelte new file mode 100644 index 0000000..0211469 --- /dev/null +++ b/frontend/src/lib/router/routes/Weekly.svelte @@ -0,0 +1,8 @@ + + + diff --git a/frontend/src/lib/router/routes/Yearly.svelte b/frontend/src/lib/router/routes/Yearly.svelte new file mode 100644 index 0000000..569def8 --- /dev/null +++ b/frontend/src/lib/router/routes/Yearly.svelte @@ -0,0 +1,8 @@ + + + diff --git a/frontend/src/lib/store/Energy/dailyFoodStore.ts b/frontend/src/lib/store/Energy/dailyFoodStore.ts new file mode 100644 index 0000000..0beb1f2 --- /dev/null +++ b/frontend/src/lib/store/Energy/dailyFoodStore.ts @@ -0,0 +1,39 @@ +import { type Writable, writable } from "svelte/store"; +import { main } from "$wails/models"; +import { GetDailyFood } from "$wails/main/App"; +import { toast } from "svelte-sonner"; +import { settingsStore } from "../SettingsStore"; + +async function createStore(): Promise> { + let foods: main.AggregatedFood[] = []; + let res: main.WailsAggregateFood = await GetDailyFood(); + if (!res.success) { + toast.error(`Failed to get foods with error: ${res.error}`); + } else { + foods = res.data; + } + + const { subscribe, update, set } = writable(foods); + return { + subscribe, + update, + set, + // @ts-ignore + refresh: async () => { + const res = await GetDailyFood(); + if (!res.success) { + toast.error(`Failed to get foods with error: ${res.error}`); + return; + } + set(res.data); + }, + }; +} + +const dailyFoodStore = await createStore(); +settingsStore.subscribe((settings) => { + // @ts-ignore + dailyFoodStore.refresh(); +}); + +export { dailyFoodStore }; diff --git a/frontend/src/lib/store/FoodStore.ts b/frontend/src/lib/store/Energy/foodStore.ts similarity index 90% rename from frontend/src/lib/store/FoodStore.ts rename to frontend/src/lib/store/Energy/foodStore.ts index 37e9ee2..af2ac53 100644 --- a/frontend/src/lib/store/FoodStore.ts +++ b/frontend/src/lib/store/Energy/foodStore.ts @@ -2,7 +2,7 @@ import { type Writable, writable } from "svelte/store"; import { main } from "$wails/models"; import { GetFood } from "$wails/main/App"; import { toast } from "svelte-sonner"; -import { settingsStore } from "./SettingsStore"; +import { settingsStore } from "../SettingsStore"; async function createStore(): Promise> { let foods: main.Food[] = []; diff --git a/frontend/src/lib/store/Energy/monthlyFoodStore.ts b/frontend/src/lib/store/Energy/monthlyFoodStore.ts new file mode 100644 index 0000000..a0eee5c --- /dev/null +++ b/frontend/src/lib/store/Energy/monthlyFoodStore.ts @@ -0,0 +1,39 @@ +import { type Writable, writable } from "svelte/store"; +import { main } from "$wails/models"; +import { GetMonthlyFood } from "$wails/main/App"; +import { toast } from "svelte-sonner"; +import { settingsStore } from "../SettingsStore"; + +async function createStore(): Promise> { + let foods: main.AggregatedFood[] = []; + let res: main.WailsAggregateFood = await GetMonthlyFood(); + if (!res.success) { + toast.error(`Failed to get foods with error: ${res.error}`); + } else { + foods = res.data; + } + + const { subscribe, update, set } = writable(foods); + return { + subscribe, + update, + set, + // @ts-ignore + refresh: async () => { + const res = await GetMonthlyFood(); + if (!res.success) { + toast.error(`Failed to get foods with error: ${res.error}`); + return; + } + set(res.data); + }, + }; +} + +const monthlyFoodStore = await createStore(); +settingsStore.subscribe((settings) => { + // @ts-ignore + monthlyFoodStore.refresh(); +}); + +export { monthlyFoodStore }; diff --git a/frontend/src/lib/store/Energy/weeklyFoodStore.ts b/frontend/src/lib/store/Energy/weeklyFoodStore.ts new file mode 100644 index 0000000..63c299e --- /dev/null +++ b/frontend/src/lib/store/Energy/weeklyFoodStore.ts @@ -0,0 +1,39 @@ +import { type Writable, writable } from "svelte/store"; +import { main } from "$wails/models"; +import { GetWeeklyFood } from "$wails/main/App"; +import { toast } from "svelte-sonner"; +import { settingsStore } from "../SettingsStore"; + +async function createStore(): Promise> { + let foods: main.AggregatedFood[] = []; + let res: main.WailsAggregateFood = await GetWeeklyFood(); + if (!res.success) { + toast.error(`Failed to get foods with error: ${res.error}`); + } else { + foods = res.data; + } + + const { subscribe, update, set } = writable(foods); + return { + subscribe, + update, + set, + // @ts-ignore + refresh: async () => { + const res = await GetWeeklyFood(); + if (!res.success) { + toast.error(`Failed to get foods with error: ${res.error}`); + return; + } + set(res.data); + }, + }; +} + +const weeklyFoodStore = await createStore(); +settingsStore.subscribe((settings) => { + // @ts-ignore + weeklyFoodStore.refresh(); +}); + +export { weeklyFoodStore }; diff --git a/frontend/src/lib/store/Energy/yearlyFoodStore.ts b/frontend/src/lib/store/Energy/yearlyFoodStore.ts new file mode 100644 index 0000000..8bee07c --- /dev/null +++ b/frontend/src/lib/store/Energy/yearlyFoodStore.ts @@ -0,0 +1,39 @@ +import { type Writable, writable } from "svelte/store"; +import { main } from "$wails/models"; +import { GetYearlyFood } from "$wails/main/App"; +import { toast } from "svelte-sonner"; +import { settingsStore } from "../SettingsStore"; + +async function createStore(): Promise> { + let foods: main.AggregatedFood[] = []; + let res: main.WailsAggregateFood = await GetYearlyFood(); + if (!res.success) { + toast.error(`Failed to get foods with error: ${res.error}`); + } else { + foods = res.data; + } + + const { subscribe, update, set } = writable(foods); + return { + subscribe, + update, + set, + // @ts-ignore + refresh: async () => { + const res = await GetYearlyFood(); + if (!res.success) { + toast.error(`Failed to get foods with error: ${res.error}`); + return; + } + set(res.data); + }, + }; +} + +const yearlyFoodStore = await createStore(); +settingsStore.subscribe((settings) => { + // @ts-ignore + yearlyFoodStore.refresh(); +}); + +export { yearlyFoodStore }; diff --git a/frontend/wailsjs/go/main/App.d.ts b/frontend/wailsjs/go/main/App.d.ts index 6c3cc94..ed272ca 100644 --- a/frontend/wailsjs/go/main/App.d.ts +++ b/frontend/wailsjs/go/main/App.d.ts @@ -4,12 +4,20 @@ import {main} from '../models'; export function CreateFood(arg1:main.Food):Promise; +export function GetDailyFood():Promise; + export function GetFood():Promise; export function GetLastPer100(arg1:string):Promise; +export function GetMonthlyFood():Promise; + export function GetSettings():Promise; +export function GetWeeklyFood():Promise; + +export function GetYearlyFood():Promise; + export function SetSetting(arg1:string,arg2:number):Promise; export function UpdateFood(arg1:main.Food):Promise; diff --git a/frontend/wailsjs/go/main/App.js b/frontend/wailsjs/go/main/App.js index 205ce76..2b7b70d 100644 --- a/frontend/wailsjs/go/main/App.js +++ b/frontend/wailsjs/go/main/App.js @@ -6,6 +6,10 @@ export function CreateFood(arg1) { return window['go']['main']['App']['CreateFood'](arg1); } +export function GetDailyFood() { + return window['go']['main']['App']['GetDailyFood'](); +} + export function GetFood() { return window['go']['main']['App']['GetFood'](); } @@ -14,10 +18,22 @@ export function GetLastPer100(arg1) { return window['go']['main']['App']['GetLastPer100'](arg1); } +export function GetMonthlyFood() { + return window['go']['main']['App']['GetMonthlyFood'](); +} + export function GetSettings() { return window['go']['main']['App']['GetSettings'](); } +export function GetWeeklyFood() { + return window['go']['main']['App']['GetWeeklyFood'](); +} + +export function GetYearlyFood() { + return window['go']['main']['App']['GetYearlyFood'](); +} + export function SetSetting(arg1, arg2) { return window['go']['main']['App']['SetSetting'](arg1, arg2); } diff --git a/frontend/wailsjs/go/models.ts b/frontend/wailsjs/go/models.ts index 76a2115..dbacb5a 100644 --- a/frontend/wailsjs/go/models.ts +++ b/frontend/wailsjs/go/models.ts @@ -1,5 +1,23 @@ export namespace main { + export class AggregatedFood { + period: string; + amount: number; + avgPer100: number; + energy: number; + + static createFrom(source: any = {}) { + return new AggregatedFood(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.period = source["period"]; + this.amount = source["amount"]; + this.avgPer100 = source["avgPer100"]; + this.energy = source["energy"]; + } + } export class Food { rowid: number; date: string; @@ -24,6 +42,40 @@ export namespace main { this.energy = source["energy"]; } } + export class WailsAggregateFood { + data: AggregatedFood[]; + success: boolean; + error?: string; + + static createFrom(source: any = {}) { + return new WailsAggregateFood(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.data = this.convertValues(source["data"], AggregatedFood); + this.success = source["success"]; + this.error = source["error"]; + } + + convertValues(a: any, classs: any, asMap: boolean = false): any { + if (!a) { + return a; + } + if (a.slice && a.map) { + return (a as any[]).map(elem => this.convertValues(elem, classs)); + } else if ("object" === typeof a) { + if (asMap) { + for (const key of Object.keys(a)) { + a[key] = new classs(a[key]); + } + return a; + } + return new classs(a); + } + return a; + } + } export class WailsFood { data: Food[]; success: boolean; @@ -136,6 +188,7 @@ export namespace main { weightMonthlyLookback: number; weightYearlyLookback: number; target: number; + limit: number; static createFrom(source: any = {}) { return new settings(source); @@ -156,6 +209,7 @@ export namespace main { this.weightMonthlyLookback = source["weightMonthlyLookback"]; this.weightYearlyLookback = source["weightYearlyLookback"]; this.target = source["target"]; + this.limit = source["limit"]; } } diff --git a/settingsservice.go b/settingsservice.go index 3412ffc..16b0507 100644 --- a/settingsservice.go +++ b/settingsservice.go @@ -29,6 +29,7 @@ type settings struct { WeightYearlyLookback int `default:"2" json:"weightYearlyLookback"` Target int `default:"2000" json:"target"` + Limit int `default:"2500" json:"limit"` } var Settings settings