# 🎨 [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.