feat: export + detail receptů

feat: losování jídel
This commit is contained in:
Ondřej Anděl committed 2026-10-16 12:55:32 +02:00
1 parent 35cbc5a9ca
commit caffb6d8b4
23 files changed
+2674 -43

No files matched your search

+24 -1
View File
@@ -82,7 +82,7 @@ cd client && yarn build # tsc --noEmit + vite build → client/dist
`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)
výběr z historie a receptů, SettingsModal, ImportModal, SpinWheelModal — kolo štěstí)
- **Klientské enumy** patří do `enums.ts` jako TypeScript `enum` s mapou popisků,
ne jako inline union u komponenty (`DayTab`, `StatsTab`, `StatsRange`)
- **Context:** `context/auth.tsx` (JWT), `context/settings.tsx` (světlý/tmavý motiv)
@@ -343,6 +343,29 @@ ji při čtení doplní.
Recepty se nabízejí v našeptávání i ve výběru z historie (`ApplyMealModal`)
a jídlo stejného jména z historie se vedle receptu nenabízí podruhé.
**Postup receptu je Markdown.** V aplikaci ho vykresluje `RecipeNote`
(react-markdown, syrové HTML se nevykreslí), do PDF ho převádí `markdownPdf.ts`
nad stejným parserem (mdast). Obě cesty používají `markdownBreaks.ts`, který
z jednoduchého zalomení řádku dělá tvrdé — starší postupy jsou prostý text po
řádcích a jinak by se slily do jednoho odstavce. **Když se změní zobrazení
Markdownu v jedné cestě, je potřeba upravit i druhou.**
**Export do PDF** (`recipePdf.ts`, pdfmake v prohlížeči, načte se líně až při
exportu) jde u jednoho receptu (ikona na kartě receptu) i hromadně tlačítkem
na stránce Jídla — exportují se recepty, které seznam po filtrech ukazuje, bez
filtru všechny. Víc receptů dostane titulní stranu s klikacím obsahem, každý
recept začíná na nové stránce. PDF nese suroviny, hodnoty porce, postup a fotky
jídla (první přes šířku, ostatní menší); pdfmake umí jen JPEG a PNG, jiné
formáty se vynechají. Server se exportu neúčastní.
**Kolo štěstí** (`SpinWheelModal`, tlačítko v hlavičce) je převzaté z Luncheru.
Losuje ze všech jídel (skupin ze seznamu jídel — i objednávaných), nebo jen
z receptů, volitelně zúžených chutí a typem. U všech jídel se nejdřív vybere
nebo vylosuje zdroj a točí se až z jeho jídel — všech jídel jsou stovky
a kolo by s nimi bylo nepoužitelné. Padlý recept jde rovnou otevřít
(`WheelRecipe`, jen ke čtení) a stáhnout jako PDF. Nic se neukládá — kolo jen
rozhoduje. Konfety (`WheelConfetti`) mají vzhled jednoduchého stylu a Hell Girl.
Dřív pod stejným klíčem ležely i šablony hotových jídel (`kind: HOTOVE`, nebo
bez `kind`). Ty zanikly: `loadRecipes` je při čtení vynechá (poznají se podle
toho, že nemají suroviny) a první zápis receptu je z úložiště odklidí. **Jídla