# Senaste ändringar (2026-04-24) **Arkitektur- och UX-förbättringar:** - Grid-vy för recept: Kolumnval (2/4/6/8) via ikon i AppShell, med Riverpod-provider och SharedPreferences. - RecipesScreen är nu body-only, ingen egen Scaffold/AppBar. - AppShell visar grid-ikon endast på /recipes. - Buggfix: Produktväljaren i pantry/inventarie (ProductPickerField) — bottenark implementeras. - Sprint 2: Databas > Produkter visar nu en riktig adminpanel i profilflödet med sök, okategoriserat-filter och bulk-kategorisering. - Sprint 2: Användare-fliken stödjer nu Premium av/på direkt från användarmenyn. - Kodkvalitet: Inga absoluta Windows-sökvägar. - Dokumentation och next_steps uppdaterade. # Next Steps: Flutter-migrering Relaterade dokument: - [flutter/README.md](flutter/README.md) - [teknisk_beskrivning_flutter.md](teknisk_beskrivning_flutter.md) - [TEKNISK_BESKRIVNING.md](TEKNISK_BESKRIVNING.md) ## Icke-forhandlingsbara ramar 1. Inget ska tas bort eller andras i `recipe-api` utom explicit beslutade backend-andringar for anvandarscope i pantry och matplan. 2. Inget ska tas bort eller andras i `recipe-frontend`. 3. Migreringen sker i Flutter-sparet som separat klient mot befintliga API-kontrakt. 4. Next-frontend kor parallellt tills Flutter har verifierad parity i karnfloden. ## Beslut 2026-04-22 - User-scope for pantry och matplan - Pantry och matplan ska vara per anvandare, inte globala. - Detta kraver backend-andringar i `recipe-api` innan Flutter kan na full parity for dessa floden. - Flutter ska folja de nya kontrakten nar de finns pa plats, utan klientspecifik speciallogik. ## Malbild for v1 (funktionell parity) For v1 ska dessa floden vara stabila i Flutter: - [x] Auth: login, session, logout, auth-guard. - [x] Recept: lista, detalj, skapa, uppdaters, ta bort. - [x] Inventarie: lista, skapa, uppdatera, konsumera, historik. - [x] Matplan: veckovy, val av recept per dag, portionsjustering, inkopslista, inventariejamforelse. - [x] Import: quick-import + parse-markdown-flode. ## Prioriterad plan (ordning) ## Fas 0 - Backend-forarbete for user-scope (KLAR 2026-04-22) - [x] Gor `PantryItem` user-scopad (userId + productId unik per anvandare). - [x] Gor matplan user-scopad och filtrera list/upsert/delete per inloggad anvandare. - [x] Uppdatera matplanens inventory-jamforelse till anvandarspecifikt pantry. - [x] Publicera uppdaterade API-kontrakt innan vidare Flutter-parity for matplan/baslager. - [x] Migration 20260422130000_user_scope_pantry_meal_plan applicerad. ## Fas 1 - Stabil app-shell (KLAR 2026-04-22) - [x] Bygg tydlig auth-gate i router. - [x] Centralisera API-fel (401/403/500) i ett gemensamt lager (`mapErrorToUserMessage`). - [x] Skapa gemensamma UI-komponenter for loading, empty, error. - [x] Satt en enhetlig navigationsstruktur (web forst, mobil-redo). - [x] Lokalisering: ARB-infrastruktur pa plats (`flutter_localizations`, `l10n.yaml`, `app_sv.arb`, `synthetic-package: false`, `flutter gen-l10n` i Dockerfile). - [x] Regressionstest for svenska strangkvalitet tillagd. ## Fas 2 - Auth parity (KLAR 2026-04-22) - [x] Hardna loginflodet (tydliga felmeddelanden, retries dar relevant). - [x] Verifiera token-livscykel (reload/hard refresh/logout). - [x] Implementera automatisk hantering av utgangen token (401 -> logout -> login). ## Fas 3 - Recept parity (KLAR 2026-04-22) - [x] Lista -> detalj -> skapa -> redigera -> ta bort. - [x] Knyt ihop med parse-markdown-proxy. - [x] Behall backend som enda plats for matchning, validering och affarslogik. ## Fas 4 - Inventarie parity (KLAR 2026-04-22) - [x] Lista med filter/sortering (plats + sort via Riverpod-querystate). - [x] Skapa och uppdatera inventariepost. - [x] Konsumtion och konsumtionshistorik. ## Fas 5 - Matplan parity (KLAR 2026-04-22) - [x] Veckovy med receptval per dag mot user-scopat `GET /api/meal-plan?from=&to=`. - [x] Portionsjustering per dag. - [x] Inkoplista och inventariejamforelse mot anvandarens pantry. ## UI/UX-förbättringar (KLAR 2026-04-22) - [x] Produktval med bottenark (ProductPickerField) i inventarie/pantry. - [x] Swipe-för-±1 på inventarielistan (SwipeableInventoryTile med visuell ledtråd). ## Fas 6 - Import parity ### Analys (2026-04-22) #### 6a — Recept-import (2) URL via JSON-body `{ input: string }`. - Svar: `{ markdown: string, source: 'ica'|'pdf'|'image'|'other', imageUrl?: string }`. - På lyckat resultat: navigera till `/recipes/create` med markdown-texten förifylld. - Endpoint: `POST /api/receipt-import` - Läge: filuppladdning, `multipart/form-data`, fält `file`, max 15 MB, - Svar: `ParsedReceiptItem[]` med fälten `rawName`, `quantity`, `unit`, `suggestedProductId?`, `suggestedProductName?`, `categorySuggestion?`. - På lyckat resultat: granskningssteg där användaren bekräftar/skippar rader - Komplexitetsgrad: hög — granskningsvyn är det tyngsta steget. **Nytt paket som krävs:** - `file_picker: ^8.0.0` — hanterar filval på Flutter web (ger `Uint8List bytes`, ingen filsökväg). Läggs till i `pubspec.yaml`. **Fil-/mappstruktur:** ``` flutter/lib/features/import/ domain/ quick_import_result.dart # { markdown, source, imageUrl? } parsed_receipt_item.dart # { rawName, quantity, unit, ... } data/ import_repository.dart # API-anrop (multipart + JSON URL-läge) import_providers.dart # Riverpod-providers presentation/ import_screen.dart # TabBar: "Recept" | "Kvitto" recipe_import_tab.dart # Fas 6a — fil + URL, laddningsindikator **Router och shell:** - Ny route `/import` inuti `ShellRoute` i `app_router.dart`. placeras efter "Baslager" och innan "Profil". - Multipart-uppladdning kan ta 5–30 s (OCR, LLM) — `LinearProgressIndicator` med text "Tolkar…" under hela anropet, inte en vanlig spinner. - Timeout via `http`-klienten: sätt `Duration(seconds: 120)` för import-anrop. - Nätverks- och serverfel mappas via befintlig `mapErrorToUserMessage`. **Genomförandeordning:** 1. Lägg till `file_picker` i `pubspec.yaml`. 2. Utöka `CreateRecipeScreen` med `initialMarkdown`-parameter + GoRouter extra-stöd. 3. Bygg `domain/` + `data/` (modeller, repository, providers). 4. Bygg `recipe_import_tab.dart` (fas 6a — enklare). - [x] Registrera `/import` i router och lägg till nav-destination i AppShell. - [ ] Verifiera recept-import end-to-end (fil + URL → create-screen). - [ ] Bygg `presentation/receipt_import_tab.dart` (uppladdning + granskningssteg). - Adminfunktioner migreras sist for att minimera risk i karnfloden. 1. Verifiera request/response mot befintligt backendkontrakt. 3. Kontrollera felbanor innan UI-polish. Ingen ad-hoc backendforandring goras for att "fa Flutter att funka". Backend-andringar for user-scope i pantry/matplan ar explicit beslutade och ska goras kontrollerat forst. ## Kvalitetsgrind (Definition of Done) En feature ar klar nar allt nedan ar uppfyllt: 2. Auth/rollskydd fungerar (inklusive 401/403). 3. Loading/empty/error ar konsekvent hanterat. 4. Navigation in/ut ur feature fungerar utan specialfall. 5. Smoke-test i testmiljo ar godkant. ## Leveransmodell - Leverera 1 feature i taget till testdoman. - Demo och snabb feedback innan nasta feature. - Hall dubbel drift (Next + Flutter) tills karnfloden ar stabila. - Flytta trafik gradvis nar parity ar verifierad. ## Nästa konkreta sprint (rekommenderad) 1. Fas 6: Import parity (URL/PDF/bild, robust felhantering). 2. Fas 7: Profil/admin parity. 3. Fortsatt flytt av UI-strängar till ARB (inventarie, pantry, recept). 4. Smoke-test på testdomän och avstämning. ## Tumregel - Sikta pa funktionell parity forst. - Pixel-perfect parity tas efter stabil funktion. ## Utförda förbättringar och nästa steg (2026-04-24) - Navigationslänkar har lagts till mellan recept, inventarie, baslager och matplan för att förenkla användarflödet. - Efter redigering av recept och konsumtion av inventariepost sker nu automatisk navigering till relevant vy. - Efter import av recept sker automatisk navigering till receptlistan. - Receptdetaljvyn har fått förbättrad bakgrundsbildshantering och mjukare scrollning. - Kodbasen har granskats för att säkerställa att inga absoluta Windows-sökvägar används. **Nästa steg:** - Fortsatt användartestning av nya navigationsflöden och insamling av feedback. - Finslipa UI och tillgänglighet i samband med de nya navigationsmöjligheterna. - Färdigställ kvittoimport och adminfunktioner enligt plan.