feat: update NEXT_STEPS.md with status overview and prioritized improvements

This commit is contained in:
Nils-Johan Gynther
2026-04-17 16:21:19 +02:00
parent 4474c4da01
commit a05d907608
+74 -29
View File
@@ -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 ## Prioriterade förbättringar
### 1. Receptredigering fungerar fullt ut ### 1. Receptredigering — verifiera och slutför frontend-flödet
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]/`. 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 ### 2. Portionsjustering av recept
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. 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).
### 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:
- **Databas:** `servings Int?``Recipe` i Prisma + migration - **Databas:** `servings Int?``Recipe` i Prisma + migration
- **Backend:** `servings` exponeras i `RecipeDto` och kan sättas vid create/update - **Backend:** `servings` exponeras i `RecipeDto`, sätts vid create/update
- **Frontend (`app/recipes/[id]/`):** räknare för portioner (+ / ) bredvid ingredienslistan beräkningen sker rent i klientkomponenten utan extra API-anrop - **Frontend (`app/recipes/[id]/`):** räknare (+ / ) bredvid ingredienslistan, beräkning i klientkomponent utan extra API-anrop
- **Receptskapande (`app/recipes/create/` och `write/`):** lägg till ett fält för grundportioner - **Receptskapande (`write/`):** lägg till grundportioner-fält
- **Matplaneringen (`app/matplan/`):** inköpslistan bör ta hänsyn till önskat portionsantal per dag - **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 ### 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. `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. `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: Jest + ts-jest är uppsatt. Tester finns för:
- `normalize-name.ts` — 10 tester - `normalize-name.ts` — 10 tester
- `base.parser.ts` (`parseIngredientLine`) — 12 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/`. 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`. 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 ## Produktdatabasen