feat(verein-feature): add Vereinsverwaltung module with screens, ViewModel, and integration
- Introduced `verein-feature` module for managing Vereine, including list, detail, and editor views using `MsMasterDetailLayout`. - Added new domain models (`Verein`, `VereinStatus`) and integrated mock data for development. - Registered the new feature in `settings.gradle.kts` and `DesktopMainLayout.kt`, including breadcrumb navigation and entry point. - Updated `VeranstaltungenUebersichtV2` to add Vereine as a quick-access KPI tile. - Removed unnecessary logout functionality and adjusted the root navigation for consistency. Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
@@ -1,9 +1,18 @@
|
||||
---
|
||||
type: Journal
|
||||
status: ACTIVE
|
||||
owner: Curator
|
||||
last_update: 2026-03-31
|
||||
---
|
||||
## Nachtrag 31.03.2026 15:45
|
||||
|
||||
- **Fehlerbehebung Desktop-Shell Build:**
|
||||
- **`VereinViewModel.kt`:** Das ViewModel erbt nun korrekt von `androidx.lifecycle.ViewModel`. Dies behebt einen "
|
||||
Intersection Type" Fehler in `DesktopMainLayout.kt`, der beim Aufruf von `koinViewModel()` auftrat.
|
||||
- **`VereinFeatureModule.kt`:** Die Koin-Konfiguration wurde wieder auf den Standard `viewModelOf(::VereinViewModel)`
|
||||
umgestellt, da das ViewModel nun die korrekte Basisklasse besitzt.
|
||||
- **Verifikation:** Die Desktop-Shell (`:frontend:shells:meldestelle-desktop`) kompiliert nun wieder fehlerfrei.
|
||||
|
||||
## Nachtrag 31.03.2026 15:30
|
||||
|
||||
- **Fehlerbehebung `verein-feature`:**
|
||||
- **`VereinScreens.kt`:** Korrektur des `MsFilterBar`-Aufrufs. Der Parameter `onAddClick` wurde durch einen `actions`
|
||||
Block mit einer `MsButton`-Komponente ersetzt, um dem Design-System zu entsprechen.
|
||||
- **Verifikation:** Erfolgreicher Build des Moduls via `./gradlew :frontend:features:verein-feature:compileKotlinJvm`.
|
||||
|
||||
# Session Log: Event-First Workflow & UX-Polish (Initialer Schliff)
|
||||
|
||||
@@ -11,7 +20,7 @@ last_update: 2026-03-31
|
||||
|
||||
Im Rahmen der MVP-Phase wurde der Fokus auf den "Event-First" Workflow gelegt. Ziel ist es, dass die App direkt mit der
|
||||
Turnierverwaltung (Offline-First) startet, ohne den Nutzer durch ein separates Onboarding oder Login zu zwingen, solange
|
||||
er lokal arbeitet.
|
||||
er lokal arbeitet. Zudem wurde eine konsistente Vereinsverwaltung gefordert, analog zu Reitern und Pferden.
|
||||
|
||||
## Durchgeführte Änderungen
|
||||
|
||||
@@ -19,18 +28,25 @@ er lokal arbeitet.
|
||||
|
||||
- **Direkter Einstieg:** Die App startet nun direkt im Screen `AppScreen.Veranstaltungen`.
|
||||
- **Anpassung DesktopApp.kt:** Das Login-Gate wurde so erweitert, dass alle für den Turnier-Workflow relevanten
|
||||
Screens (Veranstaltungen, Veranstalter, Turniere) auch ohne Authentifizierung zugänglich sind.
|
||||
Screens (Veranstaltungen, Veranstalter, Turniere, Vereine) auch ohne Authentifizierung zugänglich sind.
|
||||
|
||||
### 2. Veranstaltungen-Übersicht (Gesamtliste)
|
||||
|
||||
- **Neuer Screen `VeranstaltungenUebersichtV2`:** Implementierung einer zentralen Übersicht, die alle im lokalen Store
|
||||
vorhandenen Veranstaltungen über alle Veranstalter hinweg anzeigt.
|
||||
- **Funktionalität:**
|
||||
- Listendarstellung mit Titel, Verein, Datum und Status.
|
||||
- Navigation zum "Cockpit" einer Veranstaltung (`VeranstaltungUebersicht`).
|
||||
- Button zur Neuanlage einer Veranstaltung (leitet zur Veranstalter-Auswahl weiter).
|
||||
- **KPI-Kacheln:** Erweiterung um eine Kachel "VEREINE", die als Schnelleinstieg zur Vereinsverwaltung dient.
|
||||
|
||||
### 3. Integriertes Onboarding
|
||||
### 3. Vereins-Feature (Neu)
|
||||
|
||||
- **Neues Modul `verein-feature`:** Analog zu `reiter-feature` und `pferde-feature` wurde ein dediziertes Modul für die
|
||||
Vereinsverwaltung erstellt.
|
||||
- **Funktionalität:**
|
||||
- **Domain:** Modell `Verein` mit Feldern für Name, Langname, OePS-Nr, Ort, PLZ und Status.
|
||||
- **Presentation:** `VereinViewModel` (mit Such- und Filterlogik) und `VereinScreen` (Master-Detail-Layout).
|
||||
- **Integration:** Koin-Modul `vereinFeatureModule` registriert und Navigation in `DesktopMainLayout.kt` integriert (
|
||||
inkl. Breadcrumbs).
|
||||
|
||||
### 4. Integriertes Onboarding (Wizard)
|
||||
|
||||
- **Wizard-Erweiterung:** Das Geräte-Onboarding (Name & Sicherheitsschlüssel) wurde direkt in den
|
||||
`VeranstaltungKonfigV2`-Wizard integriert. Nutzer müssen die Hardware-Informationen erst angeben, wenn sie die erste
|
||||
@@ -40,14 +56,16 @@ er lokal arbeitet.
|
||||
|
||||
- **StoreV2.seed():** Es wurden realistische Testdaten für "Neumarkt 2026" und "Linz 2026" inklusive zugehöriger
|
||||
Turniere angelegt, um den Workflow sofort testbar zu machen.
|
||||
- **Stammdaten:** Hinzufügen von `oepsStammdaten` (Mock-Vereine) im `StoreV2` für die Suche im Anlage-Prozess.
|
||||
|
||||
## Betroffene Dateien
|
||||
|
||||
- `frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/DesktopApp.kt`
|
||||
- `frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/screens/layout/DesktopMainLayout.kt`
|
||||
- `frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/v2/VeranstaltungScreens.kt` (Neu:
|
||||
`VeranstaltungenUebersichtV2`)
|
||||
- `frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/v2/Stores.kt` (Neu: `allEvents()`, `seed()`)
|
||||
`VeranstaltungenUebersichtV2`, `VeranstalterAnlegenWizard`)
|
||||
- `frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/v2/Stores.kt` (Neu: `allEvents()`, `seed()`,
|
||||
`oepsStammdaten`)
|
||||
- `frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/main.kt` (Aufruf `seed()`)
|
||||
|
||||
## Nächste Schritte
|
||||
@@ -55,3 +73,51 @@ er lokal arbeitet.
|
||||
- [ ] Verifikation der Detail-Ansicht für Turniere.
|
||||
- [ ] Implementierung der mDNS Discovery für die lokale Vernetzung.
|
||||
- [ ] ADR für das PDF-Rendering entwerfen.
|
||||
|
||||
## Nachtrag 31.03.2026 14:55
|
||||
|
||||
- **Datumswahl-Optimierung:** In `VeranstaltungKonfigV2` wurden die Textfelder für das Start- und Enddatum durch
|
||||
Material 3 `DatePickerDialoge` ersetzt.
|
||||
- **Interaktion:** Die Felder sind nun schreibgeschützt und öffnen bei Klick (oder Klick auf das Kalender-Icon) einen
|
||||
grafischen Kalender.
|
||||
- **Validierung:** Eine Logik wurde implementiert, die sicherstellt, dass das Enddatum nicht vor dem Startdatum liegen
|
||||
kann. Falls dies der Fall ist, wird das Feld rot markiert und eine Fehlermeldung angezeigt.
|
||||
- **Button-Status:** Der "Weiter"-Button in Schritt 2 ist nur aktiv, wenn Titel und Startdatum gesetzt sind und der
|
||||
Datumsbereich gültig ist.
|
||||
- **Technik:** Nutzung von `java.time.LocalDate` und `DateTimeFormatter.ISO_LOCAL_DATE` für konsistente
|
||||
Datumsverarbeitung auf der JVM.
|
||||
|
||||
## Nachtrag 31.03.2026 14:45
|
||||
|
||||
- **Neuer Wizard "Veranstalter anlegen":** Ein 2-stufiger Prozess zur Erfassung neuer Vereine.
|
||||
- **Schritt 1: Stammdaten-Suche:** Suche in `oepsStammdaten` nach Name, Ort oder OEPS-Nummer.
|
||||
- **Schritt 2: Datenbestätigung:** Übernahme der Daten aus den Stammdaten oder manuelle Erfassung/Korrektur.
|
||||
- **Flow-Optimierung:** Nach dem Anlegen eines neuen Veranstalters im `VeranstaltungKonfigV2`-Wizard springt die App nun
|
||||
automatisch zu "Schritt 2: Basisdaten der Veranstaltung".
|
||||
- **UI-Cleanup:** Import von `Icons.Default.Close` für den Abbrechen-Button im neuen Wizard.
|
||||
|
||||
## Nachtrag 31.03.2026 14:15
|
||||
|
||||
- **Neuer Wizard "Veranstaltung anlegen":** Der Prozess wurde in einen 3-stufigen Wizard umgewandelt.
|
||||
- **Schritt 1: Veranstalterwahl:** Suche in bestehenden Vereinen oder Neuanlage eines Vereins direkt im Wizard.
|
||||
- **Schritt 2: Basisdaten:** Titel, Untertitel, Datum von/bis und Austragungsort.
|
||||
- **Schritt 3: Zusatzdaten & Branding:** Logo-URL/Pfad und Sponsoren-Liste (mit Live-Vorschau der Chips).
|
||||
- **Modell-Erweiterung:** `VeranstaltungV2` wurde um `ort`, `untertitel`, `logoUrl` und eine reaktive Liste von
|
||||
`sponsoren` erweitert.
|
||||
- **Navigation:** Die `VeranstaltungKonfig` in `AppScreen` erlaubt nun eine optionale `veranstalterId`. Falls keine
|
||||
übergeben wird (Aufruf aus Cockpit), startet der Wizard bei Schritt 1 (Veranstalterwahl).
|
||||
- **UI-Polish:** Einsatz von `LinearProgressIndicator` für den Fortschritt und `Surface`-Karten für die Vereinsauswahl.
|
||||
|
||||
## Nachtrag 31.03.2026 13:55
|
||||
|
||||
- **Suche & Filter:** In der `VeranstaltungenUebersichtV2` wurde eine Suchfunktion (Titel/Verein) und ein
|
||||
Status-Filter (via Filter-Chips) implementiert.
|
||||
- **Datenmodell:** `VeranstaltungV2` wurde um ein Feld `beschreibung` erweitert.
|
||||
- **UI-Anpassung:** Die Beschreibung wird nun in der Liste unter dem Titel/Verein angezeigt, um mehr Kontext zu bieten.
|
||||
Status-Badges wurden für bessere Lesbarkeit auf `Surface` mit `primaryContainer` umgestellt.
|
||||
|
||||
## Nachtrag 31.03.2026 13:45
|
||||
|
||||
- **TopBar-Anpassung:** Der Root-Link "🏠 Admin - Verwaltung" wurde in "Veranstaltungen" umbenannt.
|
||||
- **UI-Cleanup:** Der Logout-Button wurde aus der TopBar entfernt, da die App primär im Offline-First/Lokal-Modus
|
||||
betrieben wird.
|
||||
|
||||
Reference in New Issue
Block a user