From a05d90760886af8523a07d119cc626f405c94002 Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Fri, 17 Apr 2026 16:21:19 +0200 Subject: [PATCH] feat: update NEXT_STEPS.md with status overview and prioritized improvements --- NEXT_STEPS.md | 103 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 74 insertions(+), 29 deletions(-) diff --git a/NEXT_STEPS.md b/NEXT_STEPS.md index 6ea7ee1b..650594dc 100644 --- a/NEXT_STEPS.md +++ b/NEXT_STEPS.md @@ -5,36 +5,73 @@ --- +## Status — senast genomgånget: 2026-04-17 + +| Funktion | Status | +|---|---| +| Inventorie (CRUD, konsumtion, historik) | ✅ Klart | +| Recept (skapa, visa, importera, matchning) | ✅ Klart | +| Snabbimport (URL/PDF/bild/ICA) | ✅ Klart | +| Kvittoimport (Mistral AI, OCR, alias) | ✅ Klart | +| Matplanering (veckovy, inköpslista) | ✅ Klart | +| Baslager (lista, lägg till, ta bort) | ✅ Klart | +| Admin: Produkter (edit, merge, duplicate, restore) | ✅ Klart | +| Receptredigering (frontend UX) | ⚠️ Delvis | +| Receptbilder (upload UI) | ⚠️ Delvis | +| Portionsjustering | ❌ Saknas | +| Produktkategorier — fast lista | ❌ Saknas | +| Receptlista — filtrering & kortvy | ❌ Saknas | +| Matplan — inventariejämförelse | ❌ Saknas | +| Taggning av produkter | ❌ Saknas | + +--- + ## Prioriterade förbättringar -### 1. Receptredigering fungerar fullt ut -Recept kan nu sparas men det finns inte stöd för att redigera ett befintligt recept (inklusive ingredienser). Kontrollera och testa `PATCH /api/recipes/:id` och frontend-vyn under `app/recipes/[id]/`. +### 1. Receptredigering — verifiera och slutför frontend-flödet +Backend (`PATCH /api/recipes/:id`) är fullt implementerat och hanterar namn, beskrivning, instruktioner, `imageUrl` och ingredienser. Redigeringskoden i `app/recipes/[id]/RecipeDetailClient.tsx` finns men flödet för spara/avbryt behöver verifieras och eventuellt slutföras. `/recipes/[id]/edit/page.tsx` redirectar i dag tillbaka till detaljsidan — ta bort den omdirigering om redigering sker inline. -### 2. Baslager kopplat mot inventariet -Just nu är baslager och inventariet separata. En naturlig nästa steg är att visa en indikator i baslagerlistan för vilka produkter som faktiskt finns i inventariet just nu — och med hur mycket. - -### 3. Produktkategorier — definiera en fast lista -Kategorier skrivs in fritt i admin i dag. Det vore bättre med en dropdownlista med fördefinierade kategorier (t.ex. "Mejeri", "Kött & Fisk", "Torrvaror", osv.) för att hålla konsistens i datan och förbättra grupperingen i baslager-vyn. - -### 4. Bild på recept -`imageUrl`-kolumnen finns i databasen (migrerad). Backend och frontend saknar stöd för att visa eller ladda upp receptbilder. - -### 5. Filtrering och sortering av receptlistan -Receptlistan visas i dag utan möjlighet att filtrera eller sortera. Lägg till stöd för att filtrera på kategori/tagg och sortera på t.ex. namn eller senast tillagd. Kan implementeras i frontend (klientside) eller som query-parametrar till backend. - -### 6. Layout och presentation av receptlistan -Receptlistan (`app/recipes/RecipeGrid.tsx`) är en enkel lista. Förbättra presentationen med t.ex. ett kortrutnät med bild, kortnamn och eventuellt tillagningstid — liknande ett receptkort i stil med en matblogg. - -### 7. Matplanering -Lägg till en enkel veckomenylista: välj ett recept per dag, se en samlad ingredienslista och jämför mot inventariet. Kräver en ny `MealPlan`-modell i Prisma. - -### 8. Portionsjustering av recept -Recept lagras utan portionsangivelse. Lägg till ett `servings`-fält (heltal, t.ex. 4) på `Recipe`-modellen och låt användaren ange önskat antal portioner i receptvyn. Alla ingrediensmängder räknas då om proportionellt (t.ex. recept för 4 → 6 pers: × 1,5). Implementationen berör: +### 2. Portionsjustering av recept +Recept lagras utan portionsangivelse. Lägg till ett `servings`-fält och låt användaren justera antal portioner i receptvyn — ingrediensmängderna räknas om proportionellt (t.ex. 4 → 6 pers: × 1,5). - **Databas:** `servings Int?` på `Recipe` i Prisma + migration -- **Backend:** `servings` exponeras i `RecipeDto` och kan sättas vid create/update -- **Frontend (`app/recipes/[id]/`):** räknare för portioner (+ / −) bredvid ingredienslistan — beräkningen sker rent i klientkomponenten utan extra API-anrop -- **Receptskapande (`app/recipes/create/` och `write/`):** lägg till ett fält för grundportioner -- **Matplaneringen (`app/matplan/`):** inköpslistan bör ta hänsyn till önskat portionsantal per dag +- **Backend:** `servings` exponeras i `RecipeDto`, sätts vid create/update +- **Frontend (`app/recipes/[id]/`):** räknare (+ / −) bredvid ingredienslistan, beräkning i klientkomponent utan extra API-anrop +- **Receptskapande (`write/`):** lägg till grundportioner-fält +- **Matplan (`app/matplan/`):** inköpslistan justeras efter önskat portionsantal per dag + +### 3. Matplanering — jämförelse mot inventariet +Veckovy och inköpslista fungerar. Nästa steg är att visa vilka ingredienser på inköpslistan som redan finns hemma och i vilken mängd — liknande receptvyns inventory-preview. Implementeras via `GET /api/recipes/:id/inventory-preview` per recept, aggregerat på veckonivå. + +### 4. Produktkategorier — definiera en fast lista +Kategorier skrivs in som fritext i admin. Byt till en dropdown med fördefinierade kategorier (t.ex. "Mejeri, ost & ägg", "Kött, chark & fågel", "Frukt & Grönt") för konsistent data och bättre gruppering i baslagervyn. + +### 5. Receptbilder — upload-UI i frontend +Backend har `POST /api/recipes/:id/image` som tar emot en URL, laddar ner och optimerar bilden. `imageUrl` finns i databasen och formuläret i `write/WriteRecipePage.tsx` har redan ett `imageUrl`-fält. Saknas: ett upload-flöde eller URL-inmatning med förhandsgranskning i receptdetaljvyn (`app/recipes/[id]/RecipeDetailClient.tsx`). + +### 6. Filtrering och kortvy för receptlistan +Receptlistan (`app/recipes/RecipeGrid.tsx`) är en platt lista utan filter. Lägg till: +- Söka på namn — klientside +- Sortera på namn A–Ö eller senast tillagd — klientside +- Kortrutnät med receptbild, namn och eventuellt portionsantal (efter att #2 är klar) + +### 7. Utökad databas med taggning +Lägg till stöd för taggar, underkategorier och varumärke direkt på produkter. Möjliggör filtrering, sökning och rekommendationer baserade på taggar. + +**Schemaändringar (Prisma):** +- **`Product`** — lägg till `subcategory String?` och `brand String?` (behåll `canonicalName`) +- **`Tag`** — ny modell: `id`, `name @unique` +- **`ProductTag`** — ny relationstabell (many-to-many: `Product ↔ Tag`) + +**Implementeringssteg:** +1. Uppdatera `backend/prisma/schema.prisma` med nya modeller och relationer +2. Kör migration: `docker exec recipe-api npm exec prisma migrate dev --name add_tags_subcategory_brand` +3. Skapa seed-fil (`data/seed_tags.sql`) med taggar och kopplingar +4. Kör seed-filen mot databasen +5. Exponera `tags`, `subcategory`, `brand` i produkt-DTOs och `GET /api/products` (lägg till `?tag=` och `?subcategory=` som filterparametrar) +6. Admin: lägg till tagg-hantering och underkategori-fält +7. Baslager/produktlista: filtrera per tagg eller underkategori + +**Rekommenderade taggar:** `ekologisk`, `svensk`, `laktosfri`, `glutenfri`, `vegan`, `nötfri`, `säsong`, `rökt`, `premium`, `lamm`, `korv`, `färs`, m.fl. --- @@ -43,10 +80,15 @@ Recept lagras utan portionsangivelse. Lägg till ett `servings`-fält (heltal, t ### A. CanonicalNameForm och NameForm — ta bort gamla filer `frontend/app/admin/products/NameForm.tsx` och `CanonicalNameForm.tsx` ersattes av `EditProductForm.tsx`. Kontrollera om de gamla filerna fortfarande importeras och radera dem om inte. -### B. Seed-data i versionshantering +### B. Oanvända fält på InventoryItem +Följande fält finns i Prisma-schemat men används varken i backend-endpoints eller frontend-UI: +`priority`, `opened`, `shelfNote`, `suitableFor`, `isOnSale`, `priceLevel`, `proteinType`, `isLeftover` +Besluta: implementera stöd för dem eller ta bort via migration. + +### C. Seed-data i versionshantering `data/matvaror_sverige.csv` och `data/seed_products.sql` ligger lokalt men är inte committade. Bestäm om de ska in i repot (för reproducerbarhet) eller hållas utanför. -### C. Enhetstester ✅ +### D. Enhetstester ✅ Jest + ts-jest är uppsatt. Tester finns för: - `normalize-name.ts` — 10 tester - `base.parser.ts` (`parseIngredientLine`) — 12 tester @@ -54,9 +96,12 @@ Jest + ts-jest är uppsatt. Tester finns för: Kör med `npm test` i `backend/`. -### D. Validering av DTO:er i admin-actions +### E. Validering av DTO:er i admin-actions Frontend-server-actions saknar validering på inkommande fält (tom sträng, för lång sträng, osv.). Lägg till enkel `trim()` + max-längd-kontroll i `frontend/app/admin/products/actions.ts`. +### F. Routing-städning för kvitto och import +`/kvitto/page.tsx` redirectar till `/import?tab=kvitto`. `/recipes/import/page.tsx` redirectar till `/import?tab=recept`. Om dessa routes inte exponeras i navigeringen kan de tas bort; om de behövs som deep links är redirectarna ok men bör dokumenteras. + --- ## Produktdatabasen