meldestelle/docs/04_Agents/Roadmaps/Frontend_Roadmap.md

133 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🎨 [Frontend Expert] — Zwischenstand & Roadmap
> **Stand:** 12. April 2026
> **Rolle:** KMP, Compose Desktop, State-Management, Navigation, Backend-Anbindung
---
## ✅ Erledigte Sprints
### Sprint A — Abgeschlossen
- [x] **A-1** | ViewModel-Architektur definieren & Referenz-Implementierung
- [x] MVVM mit UDF als verbindliches Muster festgelegt
- [x] `Intent`/`State`-Struktur definiert (Sealed Classes)
- [x] `VeranstalterViewModel` als vollständige Referenz-Implementierung
- [x] Muster-Dokument in `docs/06_Frontend/` abgelegt
- [x] **A-2** | Abteilungs-Logik im Bewerb-Dialog
- [x] CSN-C-NEU: Automatischer Vorschlag der Pflicht-Teilung mit 4 Abteilungen
- [x] AssistChip „Pflicht-Teilung vorgeschlagen" bei erkanntem Typ
- [x] Abteilungs-Typen `SEPARATE_SIEGEREHRUNG` / `ORGANISATORISCH` in UI
### Sprint B (Teilweise) — Abgeschlossene Punkte
- [x] **B-1** | ViewModels für alle V3-Screens
- [x] `TurnierViewModel`, `BewerbViewModel`, `PferdProfilViewModel`
- [x] `ReiterProfilViewModel`, `VereinsViewModel`, `FunktionaerViewModel`
- [x] `AbteilungViewModel` (Startliste, Ergebnisse)
### Zusätzlich erledigt (Session 02.04.2026)
- [x] Navigation V2 / Back-Stack-System implementiert
- [x] Profil-Cards mit Edit-Dialog (Veranstalter, Pferd, Reiter, Verein, Funktionär)
- [x] Onboarding: State-Lift via `rememberSaveable` (Gerätename, Sicherheitsschlüssel)
- [x] Veranstaltungs-Wizard: Bestätigungs-Dialog mit Daten-Vorschau vor finalem Anlegen
- [x] Breadcrumbs und Zurück-Navigation korrigiert
---
## 🔴 Sprint B — Offen (höchste Priorität)
- [ ] **B-2** | Ktor-Clients & Repositories für Backend-Anbindung
- [x] `HttpClient`-Factory zentral konfiguriert (Auth, Timeout, JSON, Logging, Retry)
- [x] `VeranstalterRepository` (Interface + Default-Impl mit Ktor) vollständig
- [x] `TurnierRepository` Interface in commonMain vorbereitet
- [x] Fehler-Mapping HTTP → Domain-Errors einheitlich (`DomainErrors.kt` in `core.network`)
- [x] `BewerbRepository` Interface + `DefaultBewerbRepository` (Ktor) angelegt
- [x] `AbteilungRepository` Interface + `DefaultAbteilungRepository` (Ktor) angelegt
- [x] `DefaultTurnierRepository` (Ktor) angelegt
- [x] DTOs (`TurnierDto`, `BewerbDto`, `AbteilungDto`) + Mapper in commonMain
- [x] Koin Feature-Modul `turnierFeatureModule`: alle 3 Repositories + ViewModels gebunden
- [x] Turnier/Bewerb/Abteilung Backend-Endpunkte verdrahtet (via `ApiRoutes`)
- [ ] `AuthApiClient`-Integration: Token-Provider injizierbar
- [ ] `StoreV2` schrittweise ablösen (Feature-für-Feature, Toggle `useRealBackend`)
- [ ] Akzeptanz-Tests per Fake-Server (Mock Engine, happy + error paths)
- [ ] Dokumentation `docs/06_Frontend/Networking.md`
- [ ] **B-3** | Validierungs-Live-Feedback in Edit-Dialogen
- [x] `MsValidationWrapper` vorhanden: `Error`/`Warning`/`Info` mit Icon + Farbe
- [x] `isValid` in `ReiterProfilViewModel` + `PferdProfilViewModel` für Speichern-Button
- [x] OEPS-Nummer: Live-Validierung beim Tippen (ReiterProfilViewModel, PferdProfilViewModel)
- [x] FEI-ID: Live-Validierung beim Tippen (ReiterProfilViewModel, PferdProfilViewModel)
- [x] Lizenzklasse: Live-Validierung beim Tippen (ReiterProfilViewModel)
- [x] `ReiterProfilEditDialog` mit `MsValidationWrapper` + `isError` + `enabled=state.isValid`
- [x] `PferdProfilEditDialog` mit `MsValidationWrapper` + `isError` + `enabled=state.isValid`
- [x] `ValidationResult.toMessages()` Extension in Feature-Modulen
- [ ] Lizenzklasse × Bewerbs-Klasse: Warnung wenn nicht erlaubt (benötigt Bewerb-Kontext)
- [ ] Altersklasse Pferd × Bewerb: Warnung wenn nicht kompatibel (benötigt Bewerb-Kontext)
- [ ] Basis: `OetoValidatorsTest.kt`-Grenzfälle als Akzeptanzkriterien
- [ ] **B-4** | Kassa-Screen: Veranstaltungs-Kassa
- [ ] Gesamt-Saldo-Ansicht (Salden aus allen Turnieren der Veranstaltung)
- [ ] Turnier-übergreifender Zahlvorgang (eine Zahlung, mehrere Rechnungen)
- [ ] Rechnungsvorschau je Turnier
---
## 🟠 Sprint C — Priorität 2 (nächste Woche)
- [ ] **C-1** | `StoreV2` vollständig ablösen
- [ ] Alle verbleibenden `StoreV2`-Referenzen durch echte Repositories ersetzen
- [ ] `StoreV2` entfernen nach vollständiger Migration
- [ ] **C-2** | VeranstalterNeu: Vereinssuche & Daten-Übernahme
- [ ] Vereins-Suche implementieren (Suche, Auswahl, Mapping)
- [ ] Validierung und Fehleranzeigen
- [ ] **C-3** | LAN-Sync-UI vorbereiten (ADR-0022 ✅ freigegeben)
- [ ] `SyncEvent`-Datenmodell aus `core`-Modul einbinden (KMP-shared)
- [ ] `originNodeId`-Generierung und -Persistierung beim App-Start
- [ ] WebSocket-Client auf Richter-Turm-Desk (Ktor-Client/KMP): HELLO/SYNC_PUSH/SYNC_ACK
- [ ] Geräte-Discovery-UI (gefundene Geräte im LAN via mDNS anzeigen)
- [ ] Sync-Status-Indicator in der Hauptnavigation (verbunden / getrennt / ausstehende Events)
- [ ] Offline-Indikator: ausstehende lokale Events sichtbar machen
- [ ] Domänen-Mastership beachten: Richter-Turm schreibt nur Bewertungen/Ergebnisse
- [ ] **C-4** | Lint-Bereinigung & Code-Qualität
- [x] **C-5** | Design-System Härtung (Desktop Shell) ✅ *12. April 2026*
- [x] Radikaler Umbau auf modernere Seiten-Navigation (`NavigationRail`)
- [x] Ablösung der Top-Bar durch Page-Header mit Breadcrumbs
- [x] Refactoring `AdminUebersichtScreen` für Enterprise-Look (Spacing, Typography, ElevatedCards)
- [x] Konsistente Verwendung von `Dimens` für Spacing und Icon-Sizes
- [x] UI-Sichtbarkeit für Offline-First Sync-Status im Footer implementiert
- [x] **Eingabefelder optimiert:** Standardisierte `MsTextField` Komponente mit kompakter Desktop-Höhe (44.dp) und Enterprise-Styling eingeführt und global angewendet.
- [ ] Ungenutzte Imports/Parameter entfernen
- [ ] `Long → Duration`-Konvertierungen modernisieren
- [ ] Redundante Not-null-Calls vereinfachen
> ⏸️ **USB-Stick Fallback (Export/Import UI)** — Separate Besprechung (Sprint B/C)
---
## 📌 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|----------------------------------------|-------------------|----------------------------|
| Reiter/Pferde/Vereine/Funktionäre APIs | 👷 Backend B-1 | B-2 Repository-Verdrahtung |
| Rulebook Validierungs-Spezifikation | 📜 Rulebook B-2 | B-3 Live-Validierung |
| Kassa-Service API | 👷 Backend B-2 | B-4 Kassa-Screen |
| ~~ADR-0022 LAN-Sync~~ | ✅ Erledigt | C-3 Sync-UI freigegeben |
| Wireframes Edit-Dialoge / Kassa | 🖌️ UI/UX B-1/B-3 | B-3, B-4 Implementierung |
---
## 💡 Empfehlungen (nach Priorität)
1. **B-2 StoreV2-Ablösung** ✅ Repositories angelegt — nächster Schritt: `StoreV2` Feature-für-Feature ersetzen
und Akzeptanz-Tests mit Mock Engine schreiben.
2. **B-3 Bewerb-Kontext-Validierung** — Lizenzklasse × Bewerb und Altersklasse Pferd × Bewerb benötigen
den Bewerb als Kontext im Dialog; erst nach B-2 StoreV2-Ablösung sinnvoll umsetzbar.
3. **C-2 VeranstalterNeu** — Offener Punkt aus Session 02.04; Vereinssuche fehlt noch für vollständigen Onboarding-Flow.