fix: graf cena per zdroj nahrazen koláčem

feat: stránka doplnit údaje předělána na samostatnou stránku jídel + přidáno přejmenování
This commit is contained in:
Ondřej Anděl committed 2026-10-12 09:49:41 +02:00
1 parent b880b36edd
commit efed5e6e86
30 files changed
+514 -153

No files matched your search

+17 -7
View File
@@ -73,11 +73,12 @@ cd client && yarn build # tsc --noEmit + vite build → client/dist
### Client (client/src/)
- **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),
`MealGroupsPage` (`/jidla` — seznam jídel podle názvu a zdroje s filtrem zdroje,
hromadným doplněním údajů a přejmenováním),
`TemplatesPage` (šablony tréninků a recepty), `ProfilePage` (Profil — ukazatele,
vývoj hmotnosti, tělesné údaje, cíle a klidový výdej),
`StatsPage` (statistiky se záložkami Příjem / Výdej / Útrata a import; panely
`IntakeStatsPanel`, `ActivityStatsPanel`, `SpendingStatsPanel`),
`MealGroupsPage` (`/statistiky/doplneni` — hromadné doplnění údajů jídel)
`IntakeStatsPanel`, `ActivityStatsPanel`, `SpendingStatsPanel`)
- **Components:** `components/` (Header, CalorieLookup, MealSuggestions, NutrientsFieldset)
a `components/modals/` (MealModal, ActivityModal, ApplyWorkoutModal, ApplyMealModal —
výběr z historie a receptů, SettingsModal, ImportModal)
@@ -267,9 +268,12 @@ takže `DayPage` si vystačí s jedním voláním.
Hotová jídla (objednaná, koupená) **nemají šablony**. Při zakládání jídla se
k rozepsanému názvu nabízí historie: `getMealHistory` v `meals.ts`
(`GET /api/meals/history`) projde všechna jídla uživatele a každý název vrátí
jednou (`MealSuggestion`). Názvy se porovnávají znormalizované přes
`normalizeName`, hodnoty jsou z **posledního** záznamu toho jména (cena i gramáž
(`GET /api/meals/history`) projde všechna jídla uživatele a každou dvojici
**název a zdroj** vrátí jednou (`MealSuggestion`). Stejnojmenné jídlo z jiného
zdroje (tikka masala z Everestu a z Namaste) je jiné jídlo a nikde se s ním
neslučuje — ani v návrzích, ani v seznamu jídel, ani při `fillSameNameMeals`;
na klientovi to hlídá `getMealKey` v `Utils.tsx`. Porovnává se znormalizovaně
přes `normalizeName`, hodnoty jsou z **posledního** záznamu (cena i gramáž
se časem mění) a řadí se od nejčastěji jedených.
Návrh nese jen to, co popisuje jídlo samo — **chod, datum, násobek ani poznámku
@@ -283,10 +287,10 @@ Návrhy se nabízejí i při **úpravě** jídla, ale až po změně názvu, a d
prázdná pole (`mergeSuggestion` v `MealModal`) — slouží k přejmenování
naimportovaného jídla, jehož cena a zdroj jsou skutečné. Po uložení jídla
s kaloriemi `DayPage` nabídne (`FillSameNameOffer`) doplnit stejné hodnoty do
ostatních jídel stejného názvu, která je nemají (`fillSameNameMeals`,
ostatních jídel stejného názvu a zdroje, která je nemají (`fillSameNameMeals`,
`POST /api/meals/fillSameName`); jídla s kaloriemi se nepřepisují.
**Hromadné doplnění** (`MealGroupsPage`, odkaz ze Statistik → Příjem) seskupí
**Seznam jídel** (`MealGroupsPage`, položka Jídla v hlavičce) seskupí
jídla podle znormalizovaného názvu **a zdroje** (`getMealGroups`,
`GET /api/meals/groups`) a ukáže, kolika chybí kalorie, gramáž a živiny.
Skupina nese i dny, kdy se jídlo jedlo (`MealGroup.days`, s příznakem neúplných
@@ -297,6 +301,12 @@ jídlům bez kalorií (jinak by dopočet přepsal ručně zadané kalorie), živ
jednotlivých položkách. Předvyplněné hodnoty jsou z nejnovějšího jídla skupiny;
energie a živiny bez nich i z jídla stejného názvu odjinud, sazba a gramáž ne.
Druhou akcí skupiny je **přejmenování** (`renameMealGroup`,
`POST /api/meals/renameGroup`) — změní název i zdroj všem jídlům skupiny ve
všech dnech. Je oddělené od doplnění schválně: doplnění jen připisuje, co chybí,
přejmenování přepisuje. Když nový název a zdroj patří jiné skupině, jídla se do
ní sloučí (formulář na to předem upozorní).
Pole Zdroj (`SourceInput`) nabízí zdroje z historie (`getMealSources`,
`GET /api/meals/sources`, nejčastější první) a podniky se sazbou z nastavení;
psát jde i nový.