chore: refaktoriere Veranstaltungs-UI zu Events, implementiere ZNS-Suche und verbessere Navigationslogik
Signed-off-by: StefanMoCoAt <stefan.mo.co@gmail.com>
This commit is contained in:
@@ -1,48 +1,49 @@
|
||||
# Journal: 21. April 2026 - Abschluss der Morgen-Session (Curator)
|
||||
# Journal: 21. April 2026 - Abschluss der Vormittags-Session (Curator)
|
||||
|
||||
## 🏁 Session-Abschluss (11:15)
|
||||
## 🏁 Session-Abschluss (12:00)
|
||||
|
||||
In dieser Session haben wir die Brücke zwischen der ZNS-Datenquelle und der strukturierten Anlage von Veranstaltungen und Turnieren geschlagen. Zudem wurden die Mock-Daten für den Real-Test (Neumarkt 6-009) vervollständigt.
|
||||
In dieser Session haben wir den Navigations-Flow massiv professionalisiert und die geforderte fachliche Tiefe in die Veranstaltungsanlage integriert. Weg von reinen "Fake-Daten", hin zu einem robusten, ZNS-gestützten Workflow.
|
||||
|
||||
### ✅ Erreichte Meilensteine
|
||||
|
||||
1. **ZNS-Guard & Integration (SCS: Organizer):**
|
||||
* Der `VeranstaltungWizardScreen` prüft nun zwingend auf vorhandene Stammdaten.
|
||||
* Fehlen Daten, wird der `StammdatenImportScreen` direkt im Wizard eingebettet.
|
||||
* Modul-Abhängigkeit zu `zns-import-feature` in `veranstaltung-feature` hergestellt.
|
||||
1. **Hybrid-Suche & ZNS-Fallback (SCS: Organizer):**
|
||||
* Der `VeranstaltungWizard` durchsucht nun nicht mehr nur die lokale Datenbank, sondern bietet bei fehlenden Treffern einen automatischen Fallback auf die **ZNS-Stammdaten** an.
|
||||
* Gefundene Vereine aus den Stammdaten können mit einem Klick als neuer Veranstalter in den Workflow übernommen werden.
|
||||
|
||||
2. **Mock-Daten & Real-Integration:**
|
||||
* Erweiterung des `FakeVereinRepository` um den Verein **"Reitclub Neumarkt" (6-009)**.
|
||||
* Erweiterung des `FakeVeranstalterRepository` um denselben Verein, um den Selektions-Flow zu ermöglichen.
|
||||
* Korrektur der PLZ/Ort Daten für den "URFV Neumarkt am Wallersee" (5202 Neumarkt/W.).
|
||||
2. **Profile-Onboarding Wizard (SCS: Identity):**
|
||||
* Realisierung des `ProfileOnboardingWizard` (3 Steps: Suchen → Bestätigen → Verknüpfen).
|
||||
* Dieser Wizard klärt die Identität des Benutzers (Satznummern-Check) vor der ersten Pferdesportlochen-Aktion.
|
||||
* Nahtlose Integration in die Desktop-Shell (`ContentArea.kt`).
|
||||
|
||||
3. **Navigation & UX-Verbesserung:**
|
||||
* Aktivierung des Buttons "Diesen Verein als neuen Veranstalter anlegen" im `VeranstaltungWizard`.
|
||||
* Integration der Navigation zum `VeranstalterAnlegenWizard` via Callback-Hoisting in der `ContentArea.kt`.
|
||||
3. **Tiefe Turnier-Integration (SCS: Tournament):**
|
||||
* Der `TurnierWizard` wurde vollständig nach ADR-0024 refactored und als Komponente in Schritt 5 des `VeranstaltungWizard` eingebettet.
|
||||
* Die Child-ViewModel Injektion ermöglicht den konsistenten Datentransfer vom Turnier-Wizard zurück in die Veranstaltungsliste.
|
||||
|
||||
4. **User-Identity & Onboarding (SCS: Identity):**
|
||||
* Neuer `ProfileOnboardingWizard` zur Verknüpfung des lokalen Users mit einer ZNS-Satznummer.
|
||||
* Integration des Onboarding-Flows in die Desktop-Shell (`ContentArea.kt`).
|
||||
* Erweiterung der `AppScreen` Navigation um `/profile/onboarding`.
|
||||
4. **Fachliche Validierung (§ 39 ÖTO) (SCS: Competition):**
|
||||
* Implementierung einer dynamischen **Abteilungs-Vorschau** im Bewerbs-Wizard.
|
||||
* Das System zeigt nun proaktiv die Schwellenwerte für Abteilungstrennungen (z. B. ab 35 Nennungen in Klasse S) an, basierend auf der gewählten Klasse.
|
||||
|
||||
3. **Turnier-Wizard Refactoring (SCS: Tournament):**
|
||||
* Vollständiges Refactoring des `TurnierWizard` nach ADR-0024.
|
||||
* Einführung des `TurnierWizardViewModel` zur Entkoppelung von UI und Persistenz.
|
||||
* Integration des 3-stufigen Wizards (Basics, Sparten, Branding) in den `VeranstaltungWizard`.
|
||||
|
||||
4. **Architektur & Build:**
|
||||
* Korrektur von Modul-Abhängigkeiten in den `build.gradle.kts` Dateien.
|
||||
* Konsolidierung der SCS-Grenzen zwischen Organizer, Tournament und Identity.
|
||||
|
||||
### 🔧 Korrekturen & Optimierungen
|
||||
* **Koin-Integration:** In `VeranstaltungWizardScreen` wurde `koinViewModel` durch `koinInject` ersetzt, um Auflösungsprobleme zu beheben.
|
||||
* **Code-Cleanup:** Im `TurnierWizardViewModel` wurden ungenutzte Properties (`sponsoren`, `znsDataLoaded`, `typ`, `kategorie`) und Funktionen entfernt.
|
||||
* **Bugfix:** Der Warnhinweis bezüglich ungenutzter Parameter (`veranstaltungId`) und Properties (`repository`) im `TurnierWizardViewModel` wurde behoben.
|
||||
5. **Stabilisierung & Robustheit:**
|
||||
* Einführung von robustem UUID-Parsing mit Try-Catch Fallbacks für Mock-IDs ("v1", "v2").
|
||||
* Beseitigung von "Dead-Ends" in der Navigation durch konsistentes Callback-Hoisting.
|
||||
* **Navigations-Stabilisierung:** Behebung eines Fehlers in `DesktopApp.kt`, der Benutzer trotz vorhandener Konfiguration fälschlicherweise zum `DeviceInitialization`-Wizard umleitete.
|
||||
* **Daten-Integrität:** Ergänzung der `settings.json` um Pflichtfelder (`syncInterval`), um die Validierung im `DeviceInitializationValidator` erfolgreich zu bestehen.
|
||||
* **Logging-Transparenz:** Erweiterung der Navigations-Logs in `DesktopApp.kt` und `DesktopMainLayout.kt` zur besseren Rückverfolgbarkeit von Redirect-Entscheidungen.
|
||||
* **Identity-Integration:** Hinzufügen des `Dashboard` Screens zur Ausnahmeliste des Authentifizierungs-Gates.
|
||||
|
||||
### 📋 Status der MASTER_ROADMAP
|
||||
* **PHASE 13:** Ergänzt um "ZNS-Guard" und "Profile-Onboarding". Der Punkt "Veranstaltungs-Wizard" wurde von einer UI-Hülle zu einem funktionalen Workflow (Wiring mit Turnier-Wizard) aufgewertet.
|
||||
* **PHASE 13 (Erweitert):** Der "Veranstaltungs-Wizard" ist nun keine Wunschvorstellung mehr, sondern ein integrierter Prozess vom ZNS-Import über das Benutzer-Profil bis zur fachlich validierten Bewerbs-Anlage.
|
||||
|
||||
### 🚀 Ausblick
|
||||
Die Grundlage für eine saubere Datenkette ist gelegt. In der nächsten Session kann der Fokus auf die **Bewerbs-Anlage (§ 39 ÖTO)** und die **Echtdaten-Validierung** beim Import gelegt werden, da nun die Identitäten und Stammdaten-Guards aktiv sind.
|
||||
### 🚀 Nächste Schritte
|
||||
Die Pferdesportliche Logik (§ 39) ist nun im Wizard sichtbar. Der nächste Schritt ist die **Live-Koppelung mit dem Nennungseingang**, um die Abteilungen basierend auf Realdaten (Nennungen) automatisch vorzuschlagen.
|
||||
|
||||
*Dokumentiert durch den Curator.*
|
||||
|
||||
### 🔧 Hotfix: Build-Stabilisierung & Navigations-Fix (12:15)
|
||||
- Behebung von Kompilierungsfehlern im `ProfileOnboardingScreen.kt`:
|
||||
- Korrektur der `MsTextField` `leadingIcon` Syntax (ImageVector statt Lambda).
|
||||
- Auflösung von `firstName`/`lastName` Referenzfehlern durch Nutzung der ZNS-Reiterdaten (`vorname`/`nachname`).
|
||||
- **Navigations-Fix:**
|
||||
- Korrektur der `LaunchedEffect`-Logik in `DesktopMainLayout.kt` zur Vermeidung von automatischen Umleitungen zur `VeranstaltungVerwaltung`, die Stammdaten-Screens (Vereine, Reiter, etc.) blockierten.
|
||||
- Erweiterung des Login-Gates in `DesktopApp.kt` um alle relevanten Stammdaten-Screens (`Vereine`, `Reiter`, `Pferde`, `Funktionäre` sowie deren Profil-Ansichten), um unerwünschte Redirects im Offline-Modus zu verhindern.
|
||||
- Erfolgreiche Verifizierung durch Kompilierung des Desktop-Moduls.
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
<mxfile host="Electron" modified="2026-04-21T11:20:00.000Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.6.8 Chrome/114.0.5735.289 Electron/25.5.0 Safari/537.36" version="21.6.8" type="device">
|
||||
<diagram id="meldestelle-flow" name="Veranstaltungs-Flow">
|
||||
<mxGraphModel dx="1422" dy="798" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
|
||||
<!-- Screens (Main Container) -->
|
||||
<mxCell id="screen_init" value="<b>DeviceInitializationScreen</b><br/>(Shell: Desktop)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||
<mxGeometry x="40" y="40" width="180" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="screen_cockpit" value="<b>VeranstaltungenScreen</b><br/>(Feature: Veranstaltung)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||
<mxGeometry x="280" y="40" width="180" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="screen_auswahl" value="<b>VeranstalterAuswahlScreen</b><br/>(Feature: Veranstalter)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
|
||||
<mxGeometry x="520" y="40" width="180" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="screen_wizard" value="<b>VeranstaltungWizardScreen</b><br/>(Feature: Veranstaltung)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;verticalAlign=top;align=left;spacingLeft=5;" vertex="1" parent="1">
|
||||
<mxGeometry x="280" y="180" width="420" height="340" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Wizard Steps -->
|
||||
<mxCell id="step_zns" value="1. ZnsCheckStep" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="300" y="220" width="120" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="step_selection" value="2. VeranstalterSelection" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="300" y="270" width="120" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="step_person" value="3. Ansprechperson" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="300" y="320" width="120" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="step_meta" value="4. MetaData" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="300" y="370" width="120" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="step_turnier" value="5. TurnierAnlage" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="300" y="420" width="120" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="step_summary" value="6. Summary" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
|
||||
<mxGeometry x="300" y="470" width="120" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Components & Sub-Wizards -->
|
||||
<mxCell id="comp_turnier_wiz" value="<b>TurnierWizard</b><br/>(Injected UI)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" vertex="1" parent="1">
|
||||
<mxGeometry x="500" y="420" width="140" height="40" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="screen_v_neu" value="<b>VeranstalterAnlegenWizard</b><br/>(Feature: Veranstalter)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" vertex="1" parent="1">
|
||||
<mxGeometry x="760" y="270" width="180" height="60" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- ViewModels & Logic -->
|
||||
<mxCell id="vm_wizard" value="<b>VeranstaltungWizardViewModel</b><br/>State: WizardStep, veranstalterId, turniere<br/>Check: ZnsAvailability" style="ellipse;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;align=center;" vertex="1" parent="1">
|
||||
<mxGeometry x="40" y="300" width="220" height="100" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<!-- Connectors -->
|
||||
<mxCell id="edge1" value="Start" style="endArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" source="screen_init" target="screen_cockpit" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="edge2" value="Neu" style="endArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" source="screen_cockpit" target="screen_auswahl" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="edge3" value="ID vorhanden" style="endArrow=classic;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.75;entryY=0;entryDx=0;entryDy=0;" edge="1" source="screen_auswahl" target="screen_wizard" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="edge4" value="Anlegen" style="endArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" source="screen_auswahl" target="screen_v_neu" parent="1">
|
||||
<mxGeometry x="-0.3333" y="10" width="50" height="50" relative="1" as="geometry">
|
||||
<mxPoint as="offset" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="edge5" value="Hoisted Component" style="endArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;" edge="1" source="step_turnier" target="comp_turnier_wiz" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="edge6" value="State Management" style="endArrow=classic;startArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" source="vm_wizard" target="screen_wizard" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="edge7" value="Diesen Verein als neuen... (onClick)" style="endArrow=classic;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;fontColor=#FF0000;" edge="1" source="step_selection" target="screen_v_neu" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="edge8" value="Created (Callback)" style="endArrow=classic;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" source="screen_v_neu" target="step_selection" parent="1">
|
||||
<mxGeometry width="50" height="50" relative="1" as="geometry">
|
||||
<Array as="points">
|
||||
<mxPoint x="850" y="380" />
|
||||
<mxPoint x="480" y="380" />
|
||||
<mxPoint x="480" y="290" />
|
||||
</Array>
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
|
||||
<!-- Info Labels -->
|
||||
<mxCell id="info1" value="<b>CRASH-POINT:</b><br/>Uuid.parse() mit Fake-ID 'v1'<br/>(FIXED: FakeRepo nutzt jetzt UUIDs)" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=#b85450;fillColor=#f8cecc;fontColor=#FF0000;" vertex="1" parent="1">
|
||||
<mxGeometry x="500" y="100" width="210" height="50" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
<mxCell id="info2" value="<b>LOGGING:</b><br/>ContentArea loggt jetzt<br/>jeden Screen-Wechsel" style="text;html=1;align=center;verticalAlign=middle;resizable=0;points=[];autosize=1;strokeColor=#6c8ebf;fillColor=#dae8fc;" vertex="1" parent="1">
|
||||
<mxGeometry x="40" y="120" width="160" height="50" as="geometry" />
|
||||
</mxCell>
|
||||
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
Reference in New Issue
Block a user