3 Commits
1.3.0 ... 1.6.0

Author SHA1 Message Date
e0eb7f9748 Make ctrl+tab work a little better
Hopefully I'll stop getting ideas soon..
2024-08-10 20:14:16 +02:00
b291fec8a0 Add linear regression to temporal graphs 2024-08-10 20:08:27 +02:00
d290cae3f7 Auto focus input element after inserting food 2024-08-10 19:39:36 +02:00
8 changed files with 53 additions and 13 deletions

View File

@@ -10,6 +10,10 @@
"check": "svelte-check --tsconfig ./tsconfig.json" "check": "svelte-check --tsconfig ./tsconfig.json"
}, },
"devDependencies": { "devDependencies": {
"@fortawesome/fontawesome-svg-core": "^6.5.2",
"@fortawesome/free-brands-svg-icons": "^6.5.2",
"@fortawesome/free-regular-svg-icons": "^6.5.2",
"@fortawesome/free-solid-svg-icons": "^6.5.2",
"@sveltejs/vite-plugin-svelte": "^1.0.1", "@sveltejs/vite-plugin-svelte": "^1.0.1",
"@tsconfig/svelte": "^3.0.0", "@tsconfig/svelte": "^3.0.0",
"svelte": "^3.49.0", "svelte": "^3.49.0",
@@ -21,15 +25,12 @@
"tailwindcss": "^3.4.3", "tailwindcss": "^3.4.3",
"tslib": "^2.4.0", "tslib": "^2.4.0",
"typescript": "^4.6.4", "typescript": "^4.6.4",
"vite": "^3.0.7", "vite": "^3.0.7"
"@fortawesome/fontawesome-svg-core": "^6.5.2",
"@fortawesome/free-brands-svg-icons": "^6.5.2",
"@fortawesome/free-regular-svg-icons": "^6.5.2",
"@fortawesome/free-solid-svg-icons": "^6.5.2"
}, },
"dependencies": { "dependencies": {
"autoprefixer": "^10.4.20", "autoprefixer": "^10.4.20",
"chart.js": "^4.4.3", "chart.js": "^4.4.3",
"regression": "^2.0.1",
"svelte-chartjs": "^3.1.5" "svelte-chartjs": "^3.1.5"
} }
} }

View File

@@ -1 +1 @@
bd9b801d4541f25052f0d4cb72b7d95a 23e2cc3e28f96f9d63ed35c0a34c1dcd

View File

@@ -14,6 +14,9 @@ importers:
chart.js: chart.js:
specifier: ^4.4.3 specifier: ^4.4.3
version: 4.4.3 version: 4.4.3
regression:
specifier: ^2.0.1
version: 2.0.1
svelte-chartjs: svelte-chartjs:
specifier: ^3.1.5 specifier: ^3.1.5
version: 3.1.5(chart.js@4.4.3)(svelte@3.59.2) version: 3.1.5(chart.js@4.4.3)(svelte@3.59.2)
@@ -714,6 +717,9 @@ packages:
resolution: {integrity: sha512-A1PeDEYMrkLrfyOwv2jwihXbo9qxdGD3atBYQA9JJgreAx8/7rC6IUkWOw2NQlOxLp2wL0ifQbh1HuidDfYA6w==} resolution: {integrity: sha512-A1PeDEYMrkLrfyOwv2jwihXbo9qxdGD3atBYQA9JJgreAx8/7rC6IUkWOw2NQlOxLp2wL0ifQbh1HuidDfYA6w==}
engines: {node: '>=8'} engines: {node: '>=8'}
regression@2.0.1:
resolution: {integrity: sha512-A4XYsc37dsBaNOgEjkJKzfJlE394IMmUPlI/p3TTI9u3T+2a+eox5Pr/CPUqF0eszeWZJPAc6QkroAhuUpWDJQ==}
resolve-from@4.0.0: resolve-from@4.0.0:
resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
engines: {node: '>=4'} engines: {node: '>=4'}
@@ -1512,6 +1518,8 @@ snapshots:
regexparam@2.0.2: {} regexparam@2.0.2: {}
regression@2.0.1: {}
resolve-from@4.0.0: {} resolve-from@4.0.0: {}
resolve@1.22.8: resolve@1.22.8:

View File

@@ -6,6 +6,8 @@
import * as srouter from "svelte-spa-router"; import * as srouter from "svelte-spa-router";
import { location } from "svelte-spa-router"; import { location } from "svelte-spa-router";
const energyLocRegex = /^\/(?:Energy)?(?!Weight)/;
const weightLocRegex = /^\/(?:Weight)(?!Energy)/;
function keyDown(event: KeyboardEvent) { function keyDown(event: KeyboardEvent) {
if (event.ctrlKey && event.key == "r") { if (event.ctrlKey && event.key == "r") {
window.location.reload(); window.location.reload();
@@ -14,10 +16,10 @@
Close(); Close();
} }
if (event.ctrlKey && event.key == "Tab") { if (event.ctrlKey && event.key == "Tab") {
if ($location == "/") { if (energyLocRegex.test($location)) {
srouter.replace("/Weight"); srouter.replace($location.replace(energyLocRegex, "/Weight"));
} else if ($location == "/Weight") { } else if (weightLocRegex.test($location)) {
srouter.replace("/"); srouter.replace($location.replace(weightLocRegex, "/Energy"));
} }
} }
} }

View File

@@ -3,6 +3,7 @@
import AggregatedFoodComp from "$lib/components/Energy/Aggregated/AggregatedFoodComp.svelte"; import AggregatedFoodComp from "$lib/components/Energy/Aggregated/AggregatedFoodComp.svelte";
import { main } from "$wails/models"; import { main } from "$wails/models";
import type { ChartData, Point } from "chart.js"; import type { ChartData, Point } from "chart.js";
import regression from "regression";
import { import {
CategoryScale, CategoryScale,
Chart as ChartJS, Chart as ChartJS,
@@ -13,6 +14,7 @@
Title, Title,
Tooltip, Tooltip,
} from "chart.js"; } from "chart.js";
import { CalculateR2 } from "$lib/utils";
ChartJS.register(Title, Tooltip, Legend, LineElement, LinearScale, PointElement, CategoryScale); ChartJS.register(Title, Tooltip, Legend, LineElement, LinearScale, PointElement, CategoryScale);
@@ -32,7 +34,7 @@
pointHoverBorderColor: "rgba(220, 220, 220, 1)", pointHoverBorderColor: "rgba(220, 220, 220, 1)",
pointHoverBorderWidth: 2, pointHoverBorderWidth: 2,
pointRadius: 1, pointRadius: 1,
pointHitRadius: 10, pointHitRadius: 20,
}; };
const data: ChartData<"line", (number | Point)[]> = { const data: ChartData<"line", (number | Point)[]> = {
labels: reversedItems.map((f) => f.period), labels: reversedItems.map((f) => f.period),
@@ -74,6 +76,14 @@
}, },
], ],
}; };
data.datasets.push({
...defaultOptions,
label: "R2",
data: CalculateR2(reversedItems.map((f, i) => [i, f.energy])),
borderColor: "#04d1d1",
pointBorderColor: "#04d1d1",
pointRadius: 0,
});
</script> </script>
<template> <template>

View File

@@ -19,6 +19,7 @@
let per100: string = ""; let per100: string = "";
let per100Edited: boolean = false; let per100Edited: boolean = false;
let per100Element: HTMLTableCellElement; let per100Element: HTMLTableCellElement;
let nameElement: HTMLTableCellElement;
async function update(event: KeyboardEvent & { currentTarget: EventTarget & HTMLTableCellElement }) { async function update(event: KeyboardEvent & { currentTarget: EventTarget & HTMLTableCellElement }) {
name = name.trim(); name = name.trim();
@@ -26,7 +27,7 @@
description = description.trim(); description = description.trim();
per100 = per100.trim(); per100 = per100.trim();
if (!per100Edited && event.currentTarget === per100Element) per100Edited = true; if (!per100Edited && event.currentTarget == per100Element) per100Edited = true;
if (event.key == "Enter") { if (event.key == "Enter") {
event.preventDefault(); event.preventDefault();
@@ -48,6 +49,7 @@
} }
foodStore.update((value) => [res.data, ...value]); foodStore.update((value) => [res.data, ...value]);
nameElement.focus();
} }
if (!per100Edited) if (!per100Edited)
@@ -75,6 +77,7 @@
contenteditable="true" contenteditable="true"
autofocus autofocus
on:keydown={update} on:keydown={update}
bind:this={nameElement}
> >
</td> </td>
<td <td

View File

@@ -13,6 +13,7 @@
Title, Title,
Tooltip, Tooltip,
} from "chart.js"; } from "chart.js";
import { CalculateR2 } from "$lib/utils";
ChartJS.register(Title, Tooltip, Legend, LineElement, LinearScale, PointElement, CategoryScale); ChartJS.register(Title, Tooltip, Legend, LineElement, LinearScale, PointElement, CategoryScale);
@@ -44,6 +45,14 @@
}, },
], ],
}; };
data.datasets.push({
...defaultOptions,
label: "R2",
data: CalculateR2(reversedItems.map((f, i) => [i, f.amount])),
borderColor: "#04d1d1",
pointBorderColor: "#04d1d1",
pointRadius: 0,
});
</script> </script>
<template> <template>

View File

@@ -1,5 +1,7 @@
import { cubicOut } from "svelte/easing"; import { cubicOut } from "svelte/easing";
import type { TransitionConfig } from "svelte/transition"; import type { TransitionConfig } from "svelte/transition";
import regression from "regression";
import type { ChartData, Point } from "chart.js";
type FlyAndScaleParams = { type FlyAndScaleParams = {
y?: number; y?: number;
@@ -109,5 +111,10 @@ function LerpColor(color1: Color, color2: Color, t: number): Color {
return { h, s, l }; return { h, s, l };
} }
export { GenerateColor, LerpColor, RemoveExistingColors }; function CalculateR2(input: [number, number][]): number[] {
const reg = regression.linear(input);
return reg.points.map((point: [number, number]) => point[1]);
}
export { GenerateColor, LerpColor, RemoveExistingColors, CalculateR2 };
export type { Color }; export type { Color };