feat: přidána midnight snack

feat: přidány statistiky pohybu
This commit is contained in:
Ondřej Anděl committed 2026-10-02 19:33:08 +02:00
1 parent 8dac67bdd1
commit f1ce3ff297
13 files changed
+833 -163

No files matched your search

+17 -1
View File
@@ -72,7 +72,7 @@ cd client && yarn build # tsc --noEmit + vite build → client/dist
- **Entry:** `index.tsx` → `AppRoutes.tsx`; `Login.tsx` je přihlašovací obrazovka
- **Pages:** `pages/` — `DayPage` (přehled dne se záložkami Příjem/Výdej),
`TemplatesPage` (šablony tréninků), `ProfilePage` (tělesné údaje a klidový výdej),
`StatsPage` (statistiky + import)
`StatsPage` (statistiky příjmu a výdeje + import; výdej v `ActivityStatsPanel`)
- **Components:** `components/` (Header, CalorieLookup) a `components/modals/`
(MealModal, ActivityModal, ApplyWorkoutModal, ApplyMealModal, SettingsModal, ImportModal)
- **Klientské enumy** patří do `enums.ts` jako TypeScript `enum` s mapou popisků,
@@ -211,6 +211,18 @@ spánku a žádná ze standardních rovnic délku spánku jako proměnnou nemá
nebo odečítat za něj kalorie by bylo vymýšlení čísla. Test to hlídá:
bilance se po zadání spánku nesmí změnit.
**Statistiky výdeje** (`getActivityStats` ve `statsService.ts`, `GET /api/stats/activity`)
dělí pohyb na aktivity ze šablon a mimo ně a u šablon porovnává skutečnost s plánem.
Plán si `applyWorkoutTemplate` ukládá při použití (`workoutPlans.ts`, klíč
`workoutPlans:<login>:<datum>`) — **nesrovnává se se současnou podobou šablony**,
ta se mohla mezitím změnit, a smazaná aktivita by beze stopy zmizela. Plán nese
jednotlivé cviky s `entryId` aktivity, která z nich vznikla; podle něj
`analyzeDay` u každého dne pozná cvik **odebraný** (aktivita chybí) a **upravený**
(jiné množství, série nebo násobek) — podle názvu by to nešlo, šablona může mít
stejný cvik dvakrát. Smazání všech cviků šablony ve dni `dropOrphanedPlans`
bere jako vrácené použití a plán zahodí. Aktivity ze šablony bez plánu (cvik
přesunutý z jiného dne) se počítají jako splněné přesně dle plánu.
`GET /api/day?date=` vrací `DayOverview` se vším naráz (jídlo, pohyb, bilance),
takže `DayPage` si vystačí s jedním voláním.
@@ -239,6 +251,10 @@ načtení doplní na `HOTOVE`, v úložišti se nic nepřepisuje.
`createMealTemplateFromMeal` recept stejného názvu **nepřepíše** (přišel by
o suroviny a postup) a odmítne to chybou.
Jídlo založené ze šablony nese `templateId`. Nastavuje ho jen server
(`addMeal` s třetím parametrem) — `MealInput` ho nemá, takže ho klient
nepodstrčí a úprava jídla ho zachová.
Kontrakt má vlastní `MealTemplateInput`, kde je `id` volitelné — `MealTemplate`
ho vyžaduje a nešlo by jím posílat novou šablonu.