feat: update NEXT_STEPS.md with status overview and prioritized improvements
This commit is contained in:
+74
-29
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user