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 @@
+
+
+
+
+ |
+ {item.period}
+ |
+
+ {item.amount}
+ |
+
+ {item.avgPer100}
+ |
+
+ {item.energy}
+ |
+
+
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 @@
+
+
+
+
+
+
+
+
+
+ |
+ Period
+ |
+
+ Amount
+ |
+
+ AvgPer100
+ |
+
+ Energy
+ |
+
+
+
+ {#each items as f}
+
+ {/each}
+
+
+
+
+
+
+
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 @@
-
-
-
- {#if forceUpdate}
-
- {:else}
-
- {/if}
-
+
+
+
+ {#if forceUpdate}
+
+ {:else}
+
+ {/if}
+
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