Add comprehensive documentation for Flutter frontend migration and backend review
Test Suite / test (24.15.0) (push) Has been cancelled
Test Suite / test (24.15.0) (push) Has been cancelled
- Introduced user guide for Flutter frontend in README.md, detailing user flows and recent improvements. - Created next steps roadmap for Flutter migration in next_steps_flutter.md, outlining current tasks and priorities. - Developed technical description for Flutter frontend in teknisk_beskrivning_flutter.md, covering architecture and security status. - Removed outdated migration documentation for Prisma P3009 and added recovery steps for failed migrations in migrering-MSI.md. - Established a release checklist for product launches in produktlansering.md, ensuring security and stability measures are met. - Formulated a systematic backend review and optimization plan in review_backend.md, focusing on reducing complexity and improving performance.
This commit is contained in:
@@ -1,236 +0,0 @@
|
||||
# Implementeringsplan: "Se kvitto"-Modal för Kvittoimporten
|
||||
|
||||
**Mål**: MVP-vägen för split-view UX – lägg till modal som visar OCR-text från parsade kvittoraderna.
|
||||
**Scope**: 2-3 timmar
|
||||
**Status**: Planering
|
||||
|
||||
---
|
||||
|
||||
## 1. Ändringar i `receipt_import_tab.dart`
|
||||
|
||||
### 1.1 Lägg till knapp "Se kvitto" i header-raden (rad ~745-752)
|
||||
|
||||
**Plats**: Höger om "Välj alla/Avmarkera alla"-knappen
|
||||
|
||||
```dart
|
||||
// Innan: Row med bara "Välj alla"-knapp
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text('${items.length} rader — tryck för att redigera', style: theme.textTheme.titleSmall),
|
||||
TextButton(...), // "Välj alla/Avmarkera alla"
|
||||
],
|
||||
)
|
||||
|
||||
// Efter: Lägg till "Se kvitto"-knapp
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Text('${items.length} rader — tryck för att redigera', style: theme.textTheme.titleSmall),
|
||||
Row(
|
||||
children: [
|
||||
TextButton.icon(
|
||||
onPressed: items.isEmpty ? null : () => _showReceiptPreview(context, items),
|
||||
icon: const Icon(Icons.description_outlined),
|
||||
label: const Text('Se kvitto'),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
TextButton(
|
||||
onPressed: () => setState(...), // Befintlig "Välj alla"
|
||||
child: Text(...),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
)
|
||||
```
|
||||
|
||||
### 1.2 Implementera `_showReceiptPreview`-metod
|
||||
|
||||
Lägg till denna metod i `_ReceiptImportTabState`:
|
||||
|
||||
```dart
|
||||
Future<void> _showReceiptPreview(BuildContext context, List<ParsedReceiptItem> items) async {
|
||||
if (!context.mounted) return;
|
||||
await showDialog(
|
||||
context: context,
|
||||
builder: (ctx) => _ReceiptPreviewDialog(items: items),
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Ny widget: `_ReceiptPreviewDialog`
|
||||
|
||||
Lägg till denna widget **i samma fil** (`receipt_import_tab.dart`), efter `_ReceiptImportResultRow`-klassen:
|
||||
|
||||
```dart
|
||||
class _ReceiptPreviewDialog extends StatelessWidget {
|
||||
final List<ParsedReceiptItem> items;
|
||||
|
||||
const _ReceiptPreviewDialog({required this.items});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final theme = Theme.of(context);
|
||||
|
||||
return AlertDialog(
|
||||
title: const Text('Kvittotexten i sin helhet'),
|
||||
content: SizedBox(
|
||||
width: 600, // Responsiv bredd på desktop
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'Här visas all OCR-parsad text från kvittot. En rad per artikel:',
|
||||
style: theme.textTheme.bodySmall?.copyWith(
|
||||
color: theme.colorScheme.onSurfaceVariant,
|
||||
),
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
color: theme.colorScheme.surfaceContainerLowest,
|
||||
border: Border.all(color: theme.colorScheme.outlineVariant),
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
),
|
||||
padding: const EdgeInsets.all(12),
|
||||
child: SelectableText.rich(
|
||||
TextSpan(
|
||||
children: items.isEmpty
|
||||
? [TextSpan(text: '(Inga rader)', style: theme.textTheme.bodySmall)]
|
||||
: items
|
||||
.asMap()
|
||||
.entries
|
||||
.map((entry) {
|
||||
final item = entry.value;
|
||||
final lineNumber = entry.key + 1;
|
||||
final lineText = _formatReceiptLine(item);
|
||||
return TextSpan(
|
||||
children: [
|
||||
TextSpan(
|
||||
text: '$lineNumber. ',
|
||||
style: theme.textTheme.labelSmall?.copyWith(
|
||||
color: theme.colorScheme.outlineVariant,
|
||||
),
|
||||
),
|
||||
TextSpan(
|
||||
text: lineText,
|
||||
style: theme.textTheme.bodySmall?.copyWith(
|
||||
fontFamily: 'monospace',
|
||||
),
|
||||
),
|
||||
const TextSpan(text: '\n'),
|
||||
],
|
||||
);
|
||||
})
|
||||
.toList(),
|
||||
),
|
||||
style: theme.textTheme.bodySmall,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: const Text('Stäng'),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
String _formatReceiptLine(ParsedReceiptItem item) {
|
||||
final parts = <String>[];
|
||||
|
||||
if (item.quantity != null) {
|
||||
parts.add('${item.quantity}');
|
||||
}
|
||||
|
||||
if (item.unit != null) {
|
||||
parts.add(item.unit!);
|
||||
}
|
||||
|
||||
parts.add(item.rawName);
|
||||
|
||||
if (item.price != null) {
|
||||
parts.add('— ${item.price} kr');
|
||||
}
|
||||
|
||||
return parts.join(' ');
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Implementeringssteg (steg-för-steg)
|
||||
|
||||
1. **Läs receipt_import_tab.dart** och identifiera raden med "Välj alla/Avmarkera alla"-knappen
|
||||
2. **Refaktorera Row**: Lägg "Se kvitto"-knapp bredvid befintliga knapp
|
||||
3. **Lägg till `_showReceiptPreview()`-metod** i `_ReceiptImportTabState`
|
||||
4. **Implementera `_ReceiptPreviewDialog`-widget** på slutet av filen
|
||||
5. **Testa**:
|
||||
- Ladda ett kvitto
|
||||
- Klicka "Se kvitto"-knappen
|
||||
- Verifiera att texten är lesbar och formaterad
|
||||
- Testa responsive bredd (dialog behöver minska på mobil)
|
||||
|
||||
---
|
||||
|
||||
## 4. Responsiv förbättring (optional)
|
||||
|
||||
Om dialogen behöver anpassas för mobil:
|
||||
|
||||
```dart
|
||||
// I _ReceiptPreviewDialog.build():
|
||||
final isWide = MediaQuery.of(context).size.width > 600;
|
||||
|
||||
return Dialog(
|
||||
insetPadding: const EdgeInsets.all(16),
|
||||
child: SizedBox(
|
||||
width: isWide ? 600 : double.maxFinite, // Full bredd på mobil
|
||||
// ...
|
||||
),
|
||||
);
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Långsiktiga förbättringar (Phase 2)
|
||||
|
||||
Se `next_steps_flutter.md` för split-view roadmap:
|
||||
- Horisontell split-view på desktop
|
||||
- Scroll-synkronisering
|
||||
- Tab-fallback på mobil
|
||||
- AI-guiding labels
|
||||
|
||||
---
|
||||
|
||||
## Ärendemal
|
||||
|
||||
**Titel**: "Se kvitto"-modal för kvittoimporten
|
||||
**Branch**: `feat/receipt-preview-modal`
|
||||
**Labels**: `enhancement`, `import-ux`, `phase-1-mvp`
|
||||
**Estimate**: 2-3h
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
@@ -1,149 +0,0 @@
|
||||
# Flutter Performance – Profileringsguide
|
||||
|
||||
## Mål
|
||||
|
||||
| Mätpunkt | Gränsvärde |
|
||||
|---|---|
|
||||
| Frame build-tid (60 Hz) | < 16 ms |
|
||||
| Frame build-tid (120 Hz) | < 8 ms |
|
||||
| Scroll jank (tappade frames) | 0 vid normal scroll |
|
||||
| Minnesfotavtryck (app) | < 200 MB |
|
||||
|
||||
---
|
||||
|
||||
## 1. Starta i profile-läge
|
||||
|
||||
Kör alltid profilmätningar i **profile mode**, inte debug. Debug-läget har JIT-kompilering och extra overhead.
|
||||
|
||||
```bash
|
||||
# Mot fysisk enhet
|
||||
flutter run --profile
|
||||
|
||||
# Mot Chrome (web)
|
||||
flutter run -d chrome --profile
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 2. Flutter DevTools – Öppna
|
||||
|
||||
```bash
|
||||
flutter pub global activate devtools
|
||||
flutter pub global run devtools
|
||||
```
|
||||
|
||||
Eller anslut direkt från terminalen när appen körs i profile mode – Flutter skriver ut en DevTools-URL.
|
||||
|
||||
---
|
||||
|
||||
## 3. Timeline – Mät frame-tider
|
||||
|
||||
1. Öppna **Performance**-fliken i DevTools.
|
||||
2. Klicka **Record**.
|
||||
3. Utför den aktion du vill mäta (t.ex. byt vy, scrolla).
|
||||
4. Klicka **Stop**.
|
||||
5. Granska:
|
||||
- **UI thread** (Dart-kod) – bör vara < 16 ms per frame.
|
||||
- **Raster thread** (GPU) – bör vara < 16 ms per frame.
|
||||
- Röda/gula staplar = jank.
|
||||
|
||||
### Kritiska mätpunkter i appen
|
||||
|
||||
| Scenario | Vad att leta efter |
|
||||
|---|---|
|
||||
| Byta vy (NavigationBar) | Frame-tid vid `StatefulShellRoute`-byte; bör vara < 32 ms totalt |
|
||||
| Scrolla receptlista | Inga röda frames; `GridView.builder` bör recykla element |
|
||||
| Scrolla adminpaneler | `ListView.builder` i embedded-läge; verifiera att ingen `NeverScrollableScrollPhysics` blockerar |
|
||||
| Kvittoimport – kryssa i rad | Endast den berörda raden bör rebuilda (`ConsumerWidget.select`) |
|
||||
| Kvittoimport – "Välj alla" | Batch-uppdatering via `setSelectedForAll` – en enda `state =` |
|
||||
|
||||
---
|
||||
|
||||
## 4. Widget Rebuild-spårning
|
||||
|
||||
Aktivera rebuild-räknare i DevTools under **Inspector → Widget rebuild counts**.
|
||||
|
||||
Alternativt: lägg till tillfällig räknare i en widget:
|
||||
|
||||
```dart
|
||||
int _buildCount = 0;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
debugPrint('${widget.runtimeType} build #${++_buildCount}');
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### Förväntade rebuild-mönster efter optimeringar
|
||||
|
||||
- `_ReceiptImportResultRow` med index X ska bara rebuilda när `selected[X]` ändras, inte när andra rader kryssas.
|
||||
- `AppShell` ska inte rebuilda vid vy-byte (StatefulShellRoute bevarar grenar).
|
||||
- Admin-paneler ska inte rebuilda hela listan vid en alias-ändring.
|
||||
|
||||
---
|
||||
|
||||
## 5. Memory Profiler
|
||||
|
||||
1. DevTools → **Memory**-fliken.
|
||||
2. Klicka **Take snapshot** före och efter en tung operation.
|
||||
3. Jämför levande objekt – leta efter läckor (ackumulerade `StreamSubscription`, `Timer`, `Notifier`).
|
||||
|
||||
---
|
||||
|
||||
## 6. flutter analyze + dart fix
|
||||
|
||||
```bash
|
||||
flutter analyze
|
||||
dart fix --apply
|
||||
```
|
||||
|
||||
Åtgärda alla varningar om `const` och onödiga rebuilds.
|
||||
|
||||
---
|
||||
|
||||
## 7. Identifierade optimeringar (genomförda)
|
||||
|
||||
| Område | Åtgärd | Effekt |
|
||||
|---|---|---|
|
||||
| Admin-paneler | Tog bort `NeverScrollableScrollPhysics` + `shrinkWrap` | Scroll fungerar, O(n) layout istället för O(n²) |
|
||||
| Admin alias-lista | `ListView.builder` istället för spread | Virtualiserad lista |
|
||||
| FABs | Explicita `heroTag` på alla FABs | Eliminerar hero-animation-krasch vid vy-byte |
|
||||
| Scrollables | `PageStorageKey` på alla listvy | Scrollposition bevaras vid vy-byte |
|
||||
| Router | `StatefulShellRoute.indexedStack` | Branch-state bevaras; ingen ombyggnad vid tab-byte |
|
||||
| Kvittoimport – resultatlista | `ListView.builder` + `SizedBox` bound height | Virtualiserad; max 620 px synlig |
|
||||
| Kvittoimport – radwidget | `ConsumerWidget` med `provider.select((s) => s?.selected[index])` | Endast ändrad rad rebuildar vid checkbox-toggle |
|
||||
| Kvittoimport – batch-API | `setSelectedForAll`, `setSelectedForIndexes`, `setImportedResult` | En `state =` och en SharedPreferences-skrivning per operation |
|
||||
|
||||
---
|
||||
|
||||
## 8. Snabbtest – Verifiera förbättringar
|
||||
|
||||
```bash
|
||||
# Kör i profile mode och öppna DevTools automatiskt
|
||||
flutter run --profile --devtools-server-address=http://127.0.0.1:9100
|
||||
```
|
||||
|
||||
Kontrollchecklista:
|
||||
|
||||
- [ ] Vy-byte NavigationBar: inga röda frames i Timeline
|
||||
- [ ] Scroll i receptlista: < 2 tappade frames per 100 frames
|
||||
- [ ] Scroll i admin-flikar: fungerar utan lock
|
||||
- [ ] Kvittoimport – checkbox-toggle: rebuild-räknare ökar bara för berörd rad
|
||||
- [ ] Kvittoimport – "Välj alla": en burst av rebuilds (en per rad), inga dubbla
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
@@ -1,53 +0,0 @@
|
||||
# Flutter Frontend - Anvandarguide
|
||||
|
||||
Detta dokument ar for anvandare och operativa testare.
|
||||
Har beskriver vi vad som fungerar i Flutter-klienten och hur den anvands i praktiken.
|
||||
|
||||
## Dokumentstatus (2026-05-03)
|
||||
|
||||
- Fokus: anvandarflode, inte implementation.
|
||||
- Teknisk detaljniva finns i `teknisk_beskrivning_flutter.md`.
|
||||
- Planering och backlog finns i `next_steps_flutter.md`.
|
||||
|
||||
## Vad appen ar
|
||||
|
||||
Flutter-webben ar en klient for Recipe App som kors i Docker och exponeras via Caddy.
|
||||
Den anvands parallellt med Next-frontenden under migrering och verifiering.
|
||||
|
||||
## Senaste forbattringar
|
||||
|
||||
- Kvittoimportens granskningsflode ar klart och stabiliserat.
|
||||
- Pagande kvittoimport sparas i klientens session och kan atertas efter refresh/navigation.
|
||||
- Tolkning av antal/forpackning i kvittorader ar forbattrad, inklusive format som `2st`.
|
||||
- AI-kategoriforslag och produktforslag visas separerat for tydligare val.
|
||||
|
||||
## Aktuella anvandarfloden
|
||||
|
||||
- Inloggning med anvandarnamn och losenord.
|
||||
- Recept: lista, skapa, redigera, radera.
|
||||
- Inventarie och baslager: skapa, redigera, konsumera.
|
||||
- Matplan: veckovy, portionsjustering, inkopslista.
|
||||
- Import: receptimport och kvittoimport med granskningssteg.
|
||||
|
||||
## Kanda begransningar
|
||||
|
||||
- Vissa adminfunktioner och avancerad AI-integration ar planerade men ej fullt migrerade.
|
||||
- Bildimport forutsatter att containrar ar uppdaterade med senaste kod.
|
||||
|
||||
## Felsokning (anvandarniva)
|
||||
|
||||
1. Om sidan visar gammalt beteende efter deploy: hard uppdatering eller inkognito.
|
||||
2. Om inloggning misslyckas: verifiera anvandarnamn/losenord (inte e-post).
|
||||
3. Om importfloden fastnar: rapportera webblasarkonsolens fel till utvecklingsteamet.
|
||||
|
||||
## Relaterade dokument
|
||||
|
||||
- `next_steps_flutter.md` - roadmap och prioriteringar.
|
||||
- `teknisk_beskrivning_flutter.md` - teknisk referens for drift/utveckling.
|
||||
- `../README.md` - overgripande produktinformation.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
@@ -1,71 +0,0 @@
|
||||
# Nasta steg: Flutter-migrering
|
||||
|
||||
Detta dokument ar Flutter-teamets roadmap och prioriteringslista.
|
||||
All historik och implementationdetaljer finns i `teknisk_beskrivning_flutter.md`.
|
||||
|
||||
## Dokumentstatus (2026-05-03)
|
||||
|
||||
- Fokus: aktiv planering framat.
|
||||
- Endast en roadmap for Flutter for att undvika dubbletter.
|
||||
|
||||
## Klart senaste sessionerna
|
||||
|
||||
- Fas 6b: granskningsflode for kvittoimport (edit, destination, merge, spara).
|
||||
- Fas 6c: separering av AI-kategorichip och produktforslagschip.
|
||||
- Fas 6d: klientpersistens for pagande kvittoimport + forbattrad antal/forpackningsinferens.
|
||||
|
||||
## Pagande arbete
|
||||
|
||||
- Robust bildimport och diagnostik i drift.
|
||||
- Aliasstrategi i kvittoimport (hybrid user-scope + global fallback via admin).
|
||||
- Utokad adminfunktionalitet i Flutter-sparet.
|
||||
|
||||
## Prioriterade nasta steg
|
||||
|
||||
1. **Kvitto-import UX förbättring (Split-view långsiktigt)**
|
||||
- MVP (kort sikt): Lägg till "Se kvitto"-modal som visar full OCR-text från parsade rader
|
||||
- Knapp i radlist-header, öppnar dialog med ScrollableText
|
||||
- Enkelt UI, höga UX-vinster
|
||||
- Implementering: ~2h
|
||||
- Långsiktigt (Phase 2): Split-view med scroll-synkronisering
|
||||
- Desktop: Horisontell split (kvitto-text vänster, radlista höger)
|
||||
- Tablet/Mobil: Tab-based fallback (radlista standard, "Se kvitto"-tab för kontext)
|
||||
- Scroll-sync mellan text och rader (om rad 3 är synlig, visa motsvarande text)
|
||||
- AI-guiding labels ("Denna rad matchade mejeri automatiskt")
|
||||
- Implementering: ~8h
|
||||
|
||||
2. Verifiera bildimport och felhantering end-to-end i testmiljo.
|
||||
3. Implementera alias-inlarning vid manuell korrigering i importflodet.
|
||||
4. Forbattra UI/UX i granskningsfloden for kvittoimport.
|
||||
5. Fortsatt migrering av kvarvarande adminfloden.
|
||||
6. Lokalisera kvarvarande delar i import- och inventarievyer.
|
||||
|
||||
## Viktiga beslut
|
||||
|
||||
- Flutter ar separat klient mot befintliga API-kontrakt.
|
||||
- Ingen klientspecifik speciallogik for datamatchning; backend ar sanningskalla.
|
||||
- Next-frontenden kor parallellt tills verifierad parity ar uppnadd.
|
||||
|
||||
## Relaterade dokument
|
||||
|
||||
- `README.md` - anvandarperspektiv.
|
||||
- `teknisk_beskrivning_flutter.md` - teknisk referens.
|
||||
- `../NEXT_STEPS.md` - overgripande roadmap for hela produkten.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
@@ -1,128 +0,0 @@
|
||||
# Teknisk Beskrivning - Flutter Frontend
|
||||
|
||||
Detta dokument ar teknisk referens for systemadministratorer och programmerare.
|
||||
Mallet ar en sammanhallen teknisk sanning utan duplicerade roadmap- eller anvandarsektioner.
|
||||
|
||||
## Dokumentstatus (2026-05-03)
|
||||
|
||||
- Fokus: arkitektur, drift och kanda gotchas.
|
||||
- User guide finns i `README.md`.
|
||||
- Planering finns i `next_steps_flutter.md`.
|
||||
|
||||
## Viktigt om miljo
|
||||
|
||||
Anvand inte absoluta Windows-sokvagar i kod eller scripts.
|
||||
Bygg och drift sker pa Linux/Ubuntu i containeriserad miljo.
|
||||
|
||||
## Senaste tekniska tillagg
|
||||
|
||||
- Sessionpersistens i klienten for pagande kvittoimport.
|
||||
- Forbattrad inferens for antal/forpackning (inklusive uttryck som `2st`).
|
||||
- Tydlig separation i UI mellan AI-kategoriforslag och produktforslag.
|
||||
- Ingen server-side persistens introducerad for kvittosession.
|
||||
- Receptskapande: review-steg med redigerbara falt for quantity/unit/note per ingrediens.
|
||||
- Receptskapande: tydlig varning i UI nar ingen produktmatchning hittas for inkluderad ingrediens.
|
||||
- Receptskapande: stod for alternativa ingredienser i parse-svar (ex. "ris eller couscous") och visning i granskningsvyn.
|
||||
- Global kopierbar feltext: copybar error-snackbar + SelectionArea pa appniva for battre felsokning/stod.
|
||||
|
||||
## Arkitektur
|
||||
|
||||
### Lager
|
||||
- Presentation: `flutter/lib/features/*/presentation`
|
||||
- State/Application: Riverpod providers/notifiers i `flutter/lib/features/*/data`
|
||||
- Data/API: `flutter/lib/core/api`
|
||||
- Platform abstraction: token storage i `flutter/lib/core/platform`
|
||||
|
||||
### Routing
|
||||
- GoRouter i `flutter/lib/core/router/app_router.dart`
|
||||
- ShellRoute for huvudnavigation
|
||||
- Fullscreen-routes for skapa/redigera/detalj
|
||||
|
||||
### Auth
|
||||
- Login via `POST /api/auth/login`
|
||||
- Token-falt: `accessToken`
|
||||
- Auth-gate i router med redirect logik
|
||||
- `guardedApiCall()` hanterar logout vid 401
|
||||
|
||||
## Sakerhetsstatus (2026-05-07)
|
||||
|
||||
Denna sektion sammanfattar sakerhetsfunktioner som ar implementerade i Flutter-klienten och hur de fungerar tekniskt.
|
||||
|
||||
### Implementerat i Flutter
|
||||
|
||||
- Auth-gating i routing:
|
||||
- Router-lagret stoppar navigation till skyddade vyer utan token/session.
|
||||
- Om backend returnerar 401 i ett skyddat API-flode hanterar `guardedApiCall()` detta och triggar logout/omdirigering.
|
||||
- Token-lagring via plattformsabstraktion:
|
||||
- `ITokenStorage` definierar kontraktet (`getToken/saveToken/deleteToken`).
|
||||
- Web-implementation (`WebTokenStorage`) lagrar token i `SharedPreferences` (web: localStorage).
|
||||
- Arkitekturen gor att mobil implementation kan bytas till `flutter_secure_storage` utan att ovrig appkod andras.
|
||||
- Minimerad klientside-auktorisering:
|
||||
- Flutter forlitar sig pa backend som auktoritetskalla for access-kontroll.
|
||||
- Klienten skickar bearer-token men gor inte egen resurstagarskapslogik som kan divergera fran serverregler.
|
||||
- Kontraktsstyrd API-hantering:
|
||||
- API-lagret accepterar 2xx pa importanrop och centraliserar felhantering.
|
||||
- Minskar risken for ad-hoc felhantering i UI och inkonsekvent beteende vid auth-fel.
|
||||
|
||||
### Viktig begransning (web)
|
||||
|
||||
- Flutter Web kan inte anvanda `httpOnly` cookies enbart pa klientsidan.
|
||||
- Nuvarande lagring i localStorage ar en praktisk kompromiss for web och innebar att XSS-hardening pa frontend och strict backend-headers/CSP ar fortsatt viktiga.
|
||||
|
||||
## API- och kontraktsprinciper
|
||||
|
||||
- Flutter foljer backend-kontrakt, ingen lokal speciallogik for matchning.
|
||||
- 2xx-svar accepteras generellt i importanrop (inte hardkodning till enbart 200).
|
||||
- Kvittoimport och receptimport ar separata floden med olika svarstyper.
|
||||
|
||||
## Kvittoimport - tekniska noter
|
||||
|
||||
- Granskningsflode med radredigering och destination (inventarie/baslager).
|
||||
- Produktval stoder tradbaserat kategori -> produkt-flode.
|
||||
- AI-kategorihint ar endast ett forslag; slutanvandaren validerar i granskningssteget.
|
||||
|
||||
## Drift och deploy
|
||||
|
||||
### Bygg och start (Flutter)
|
||||
```bash
|
||||
docker compose -f compose.yml -f compose.flutter.yml build recipe-flutter
|
||||
docker compose -f compose.yml -f compose.flutter.yml up -d --no-deps recipe-flutter
|
||||
```
|
||||
|
||||
### Viktiga verifieringar
|
||||
- Compose merge: `docker compose -f compose.yml -f compose.flutter.yml config`
|
||||
- Reachability via proxy/Caddy
|
||||
- Runtime-loggar for importfloden vid felsokning
|
||||
|
||||
## Kanda fallgropar
|
||||
|
||||
- PDF-mime kan komma som `application/octet-stream` i Flutter Web.
|
||||
- Orphan-varning ar normal nar huvudstack och Flutter-stack kors separat.
|
||||
- Cache/service worker kan visa gammal frontend efter deploy.
|
||||
- Vid massersattningar i Dart: verifiera parentesbalans i `showSnackBar(...)`-anrop innan build, annars faller web-kompilering med syntaxfel.
|
||||
|
||||
## Relaterade dokument
|
||||
|
||||
- `README.md` - anvandarguide.
|
||||
- `next_steps_flutter.md` - aktiv planering.
|
||||
- `../TEKNISK_BESKRIVNING.md` - backend/systemovergripande teknik.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
|
||||
## 2026-05-10: Admin-inventarie (CRUD, merge, filter, sortering, preview, säkerhet), user-scope, IDOR-skydd, säkerhetshärdning, optimeringar och utökad testtäckning är nu genomförda och dokumenterade i README, TEKNISK_BESKRIVNING, SÄKERHETSHÄRDNINGSPLAN och SESSIONLOGGAR.
|
||||
Reference in New Issue
Block a user