133 lines
7.1 KiB
Markdown
133 lines
7.1 KiB
Markdown
# 🎨 [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.
|