Remove veranstalter-feature (repositories, UI components, and domain models).

This commit is contained in:
Stefan Mogeritsch 2026-04-11 13:29:04 +02:00
parent eda18a8ff2
commit ccefcd4588
26 changed files with 137 additions and 135 deletions

View File

@ -16,6 +16,9 @@ Versionierung folgt [Semantic Versioning](https://semver.org/lang/de/).
## [Unreleased] ## [Unreleased]
### Hinzugefügt ### Hinzugefügt
- **Bugfix**: Behebung von Build-Fehlern im `veranstalter-feature` nach der Paket-Konsolidierung.
- **Frontend**: `FakeVeranstalterRepository` in `commonMain` implementiert, um saubere KMP-DI zu ermöglichen.
- **Frontend**: Veraltete Imports und Referenzen im `meldestelle-desktop` Shell und Previews korrigiert.
- **Architektur:** Fachliches Konzept für Zeitplan-Optimierung (Drag & Drop) erstellt (`konzept-zeitplan-optimierung-de.md`). - **Architektur:** Fachliches Konzept für Zeitplan-Optimierung (Drag & Drop) erstellt (`konzept-zeitplan-optimierung-de.md`).
- **Architektur:** Spezifikation des Status-Automaten für Nennungen und Synchronisations-Logik (`status-automat-nennungen-de.md`). - **Architektur:** Spezifikation des Status-Automaten für Nennungen und Synchronisations-Logik (`status-automat-nennungen-de.md`).
- **Rulebook:** Überprüfung und Spezifikation der Parcoursbesichtigung zu Pferd (§43 ÖTO) inkl. 5-Minuten-Puffer-Regel. - **Rulebook:** Überprüfung und Spezifikation der Parcoursbesichtigung zu Pferd (§43 ÖTO) inkl. 5-Minuten-Puffer-Regel.
@ -82,6 +85,12 @@ Versionierung folgt [Semantic Versioning](https://semver.org/lang/de/).
- **Domain:** Striktere Spartenlizenz-Prüfung in `Reiter.hasLizenzForSparte` implementiert (RD1..RD3 nur DRESSUR; R1..R4 nur SPRINGEN). Behebt Testfehler „isEligible verweigert Start ohne passende Spartenlizenz“ im `LicenseMatrixServiceTest`. - **Domain:** Striktere Spartenlizenz-Prüfung in `Reiter.hasLizenzForSparte` implementiert (RD1..RD3 nur DRESSUR; R1..R4 nur SPRINGEN). Behebt Testfehler „isEligible verweigert Start ohne passende Spartenlizenz“ im `LicenseMatrixServiceTest`.
### Behoben
- **Backend (Entries):** Fehlschlagenden Unit-Test `berechneStartzeiten sollte Zeiten korrekt aufsummieren` korrigiert; der Test berücksichtigt nun den neuen 5-minütigen ÖTO-konformen Puffer nach der Parcoursbesichtigung (§43).
- **Frontend (Desktop):** Build-Fehler ("No matching variant") beim `funktionaer-feature` behoben; fehlendes `build.gradle.kts` mit JVM-Target und Compose/Koin-Abhängigkeiten ergänzt.
- **Frontend (Desktop):** Massive Inkonsistenzen in der Paketstruktur des `veranstalter-feature` bereinigt; alle Komponenten (ViewModel, Screens, Mocks) auf das Standardpaket `at.mocode.frontend.features.veranstalter` konsolidiert, um Redeklarationen und Import-Fehler zu beheben.
- **Frontend (Desktop):** Kompilierfehler im `VeranstalterDetailScreen` durch korrekte Paket-Referenzierung des `FakeVeranstaltungStore` gelöst.
### Dokumentation ### Dokumentation
- **Masterdata/Docs:** `REITER_LIZENZEN.md` überarbeitet: - **Masterdata/Docs:** `REITER_LIZENZEN.md` überarbeitet:
- Strikte Sparten-Trennung dokumentiert (RD1..RD3 nur Dressur; R1..R4 nur Springen). - Strikte Sparten-Trennung dokumentiert (RD1..RD3 nur Dressur; R1..R4 nur Springen).

View File

@ -69,10 +69,10 @@ class StartlistenServiceTest {
val zeiten = service.berechneStartzeiten(startliste, bewerb, abteilung) val zeiten = service.berechneStartzeiten(startliste, bewerb, abteilung)
// 08:00 + 10m Besichtigung = 08:10 (Starter 1) // 08:00 + 10m Besichtigung + 5m ÖTO-Puffer = 08:15 (Starter 1)
// 08:10 + 5m Reitdauer = 08:15 (Starter 2) // 08:15 + 5m Reitdauer = 08:20 (Starter 2)
assertEquals(LocalTime(8, 10), zeiten[1]) assertEquals(LocalTime(8, 15), zeiten[1])
assertEquals(LocalTime(8, 15), zeiten[2]) assertEquals(LocalTime(8, 20), zeiten[2])
} }
@Test @Test

View File

@ -15,8 +15,7 @@ Status: April 2026
## 🚧 Ausstehende Migrationen (von `at.mocode.desktop.v2` zu Features) ## 🚧 Ausstehende Migrationen (von `at.mocode.desktop.v2` zu Features)
Die folgenden Komponenten in `meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/v2/` basieren noch auf `StoreV2` (In-Memory Mock) und sollten in KMP-Module überführt werden: Die folgenden Komponenten in `meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/v2/` basieren noch auf `StoreV2` (In-Memory Mock) und sollten in KMP-Module überführt werden:
1. **Veranstalter-Management**: `VeranstalterVerwaltungScreen.kt`, `VeranstalterDetailV2` -> Neues `veranstalter-feature` (Vollständige Integration). 1. **Onboarding**: `OnboardingScreen.kt` -> Design-System Integration erfolgt, KMP-Modul folgt.
2. **Onboarding**: `OnboardingScreen.kt` -> Design-System Integration erfolgt, KMP-Modul folgt.
## 🧹 Architektur-Cleanup ## 🧹 Architektur-Cleanup
- [ ] `at.mocode.desktop.v2.StoreV2` entfernen, sobald alle Screens auf ViewModels und API-Repositories umgestellt sind. - [ ] `at.mocode.desktop.v2.StoreV2` entfernen, sobald alle Screens auf ViewModels und API-Repositories umgestellt sind.
@ -25,3 +24,8 @@ Die folgenden Komponenten in `meldestelle-desktop/src/jvmMain/kotlin/at/mocode/d
- [ ] Paketnamen vereinheitlichen: `at.mocode.zns.feature` -> `at.mocode.frontend.features.zns`. - [ ] Paketnamen vereinheitlichen: `at.mocode.zns.feature` -> `at.mocode.frontend.features.zns`.
- [ ] `AppScreen.kt`: Veraltete (Legacy) Routen und Regexe entfernen. - [ ] `AppScreen.kt`: Veraltete (Legacy) Routen und Regexe entfernen.
- [ ] `DesktopMainLayout.kt`: Die `when`-Zweige für `v2` Screens aufräumen, sobald die Module bereit sind. - [ ] `DesktopMainLayout.kt`: Die `when`-Zweige für `v2` Screens aufräumen, sobald die Module bereit sind.
## ✅ Abgeschlossen am 11.04.2026
- Migration `pferde-feature`, `reiter-feature`, `funktionaer-feature`, `veranstalter-feature`.
- Integration in `DesktopMainLayout` und `AppScreen`.
- Bereinigung der Repository-Pakete.

View File

@ -2,12 +2,12 @@
type: Roadmap type: Roadmap
status: ACTIVE status: ACTIVE
owner: Lead Architect owner: Lead Architect
last_update: 2026-04-10 last_update: 2026-04-11
--- ---
# MASTER ROADMAP: Meldestelle-Biest # MASTER ROADMAP: Meldestelle-Biest
🏗️ **[Lead Architect]** | 30. März 2026 🏗️ **[Lead Architect]** | 11. April 2026
**Strategisches Ziel:** **Strategisches Ziel:**
Entwicklung einer ÖTO-konformen, offline-fähigen Turnier-Meldestelle als Compose Desktop App (KMP). Entwicklung einer ÖTO-konformen, offline-fähigen Turnier-Meldestelle als Compose Desktop App (KMP).
@ -234,7 +234,9 @@ und über definierte Schnittstellen kommunizieren.
* [x] **Konzept:** Fachliches Konzept für Zeitplan-Optimierung (Drag & Drop) erstellt. ✓ * [x] **Konzept:** Fachliches Konzept für Zeitplan-Optimierung (Drag & Drop) erstellt. ✓
* [x] **Konzept:** Status-Automat für Nennungen & Zeitplan-Synchronisation spezifiziert. ✓ * [x] **Konzept:** Status-Automat für Nennungen & Zeitplan-Synchronisation spezifiziert. ✓
* [x] **Frontend-Standardisierung:** `nennung-feature` refactored und in Desktop-Shell integriert. ✓ * [x] **Frontend-Standardisierung:** `nennung-feature` refactored und in Desktop-Shell integriert. ✓
* [x] **Cleanup:** `FRONTEND_CLEANUP_TODO.md` für Migration von `v2` Screens erstellt. ✓ * [x] **Rulebook-Check:** ÖTO §43 "Parcoursbesichtigung zu Pferd" eingearbeitet. ✓
* [x] **Feature-Migration:** Pferde-, Reiter-, Funktionärs- und Veranstalter-Module vollständig auf KMP umgestellt. ✓
* [x] **Cleanup:** `FRONTEND_CLEANUP_TODO.md` für Migration von `v2` Screens weitestgehend abgeschlossen. ✓
* [ ] **Zeitplan:** Dynamische Verschiebung von Bewerben (Drag & Drop im Kalender). * [ ] **Zeitplan:** Dynamische Verschiebung von Bewerben (Drag & Drop im Kalender).
* [ ] **Protokoll:** Implementierung eines Event-Logs für manuelle Eingriffe in Startlisten. * [ ] **Protokoll:** Implementierung eines Event-Logs für manuelle Eingriffe in Startlisten.
* [ ] **Export:** Startlisten-Export für ZNS (XML-B-Satz). * [ ] **Export:** Startlisten-Export für ZNS (XML-B-Satz).

View File

@ -44,14 +44,15 @@
- [x] Drag & Drop Logik für Kalender-Ansicht entworfen - [x] Drag & Drop Logik für Kalender-Ansicht entworfen
- [x] Konzept-Dokument in `docs/01_Architecture/` abgelegt → `docs/01_Architecture/konzept-zeitplan-optimierung-de.md` - [x] Konzept-Dokument in `docs/01_Architecture/` abgelegt → `docs/01_Architecture/konzept-zeitplan-optimierung-de.md`
- [ ] **C-2** | MASTER_ROADMAP aktualisieren - [x] **C-2** | MASTER_ROADMAP aktualisieren
- [x] Phase 9 Fortschritt reflektieren - [x] Phase 9 Fortschritt reflektieren
- [x] Link zum Zeitplan-Konzept ergänzt - [x] Link zum Zeitplan-Konzept ergänzt
- [x] Feature-Migration (Frontend) dokumentiert
- [ ] Weitere Sprints (D, E) grob skizzieren - [ ] Weitere Sprints (D, E) grob skizzieren
--- ---
## 🔵 Sprint D — Geplant ## 🟠 Sprint D — In Arbeit
- [ ] **D-1** | USB-Stick Fallback (Sync) - [ ] **D-1** | USB-Stick Fallback (Sync)
- [ ] Technische Machbarkeit (File-Storage vs. SQLite-Export) prüfen - [ ] Technische Machbarkeit (File-Storage vs. SQLite-Export) prüfen

View File

@ -1,6 +1,6 @@
# 🗂️ Sprint Execution Order — Meldestelle-Biest # 🗂️ Sprint Execution Order — Meldestelle-Biest
> **Stand:** 10. April 2026 | **Phase:** 9 — Zeitplan & Protokollierung > **Stand:** 11. April 2026 | **Phase:** 9 — Zeitplan & Protokollierung
> **Erstellt von:** 🏗️ Lead Architect > **Erstellt von:** 🏗️ Lead Architect
> **Strategisches Ziel:** Desktop-MVP mit Event-First-Workflow, Offline-First, ÖTO-Konformität > **Strategisches Ziel:** Desktop-MVP mit Event-First-Workflow, Offline-First, ÖTO-Konformität
@ -11,13 +11,13 @@
| Agent | Sprint A | Sprint B | Sprint C | Nächste Aktion | | Agent | Sprint A | Sprint B | Sprint C | Nächste Aktion |
|---------------|------------------|------------------------------------------|-------------------|-------------------------------------------------------| |---------------|------------------|------------------------------------------|-------------------|-------------------------------------------------------|
| 🏗️ Architect | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | Zeitplan-Optimierung (ADR/Konzept) | | 🏗️ Architect | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | Zeitplan-Optimierung (ADR/Konzept) |
| 👷 Backend | ✅ Abgeschlossen | ✅ B-1/B-2 fertig | ⬜ Nicht gestartet | C-1 Nennungs-Service Erweiterung | | 👷 Backend | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | C-1 Nennungs-Service Erweiterung |
| 🎨 Frontend | ✅ Abgeschlossen | 🟡 B-2/B-3 teilweise / B-4 offen | ⬜ Nicht gestartet | B-4 Kassa-Screen & StoreV2-Ablösung | | 🎨 Frontend | ✅ Abgeschlossen | ✅ B-2/B-3/B-4 fertig | 🟡 In Arbeit | C-2 Zeitplan Drag & Drop |
| 📜 Rulebook | ✅ Abgeschlossen | ✅ B-2 abgeschlossen | 🟡 In Arbeit | Parcoursbesichtigung-Rulebook Check | | 📜 Rulebook | ✅ Abgeschlossen | ✅ Abgeschlossen | ✅ C-1 fertig | Regelwerk-Validierung Zeitplan |
| 🐧 DevOps | ✅ Abgeschlossen | ✅ Abgeschlossen | ✅ C-1/C-2 fertig | C-3 Produktions-Deployment | | 🐧 DevOps | ✅ Abgeschlossen | ✅ Abgeschlossen | ✅ C-1/C-2 fertig | C-3 Produktions-Deployment |
| 🧐 QA | ✅ Abgeschlossen | ✅ B-1/B-3 fertig | ⬜ Nicht gestartet | B-2 Onboarding-Tests | | 🧐 QA | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | Zeitplan-Optimierung Tests |
| 🖌️ UI/UX | ✅ Abgeschlossen | ✅ B-1/B-4 fertig | ⬜ Nicht gestartet | C-1 Wireframes in Compose umsetzen | | 🖌️ UI/UX | ✅ Abgeschlossen | ✅ Abgeschlossen | ⬜ Nicht gestartet | C-1 Wireframes in Compose umsetzen |
| 🧹 Curator | ✅ Abgeschlossen | ✅ B-1/B-2 fertig | ⬜ Nicht gestartet | Session-Dokumentation & Changelog | | 🧹 Curator | ✅ Abgeschlossen | ✅ Abgeschlossen | 🟡 In Arbeit | Dokumentations-Audit |
--- ---
@ -27,7 +27,7 @@ Diese Aufgaben blockieren andere Agenten und müssen zuerst erledigt werden:
| Priorität | Agent | Aufgabe | Blockiert | | Priorität | Agent | Aufgabe | Blockiert |
|-----------|---------------|-----------------------------------------------|---------------------------------------------------| |-----------|---------------|-----------------------------------------------|---------------------------------------------------|
| 🔴 P1 | 🎨 Frontend | B-2: StoreV2-Ablösung | 🧐 QA: B-4 ViewModel-Tests | | 🔴 P1 | 🎨 Frontend | C-2: Zeitplan Drag & Drop | 🧐 QA: Zeitplan-Tests |
--- ---

View File

@ -0,0 +1,33 @@
/**
* Feature-Modul: Funktionärs-Verwaltung (Desktop-only)
*/
plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.composeMultiplatform)
alias(libs.plugins.composeCompiler)
}
group = "at.mocode.clients"
version = "1.0.0"
kotlin {
jvm()
sourceSets {
jvmMain.dependencies {
implementation(projects.frontend.core.designSystem)
implementation(projects.frontend.core.domain)
implementation(projects.frontend.core.navigation)
implementation(compose.desktop.currentOs)
implementation(compose.foundation)
implementation(compose.runtime)
implementation(compose.material3)
implementation(compose.ui)
implementation(compose.materialIconsExtended)
implementation(libs.bundles.kmp.common)
implementation(libs.koin.core)
implementation(libs.koin.compose)
implementation(libs.koin.compose.viewmodel)
}
}
}

View File

@ -18,6 +18,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import at.mocode.frontend.features.nennung.domain.* import at.mocode.frontend.features.nennung.domain.*
import kotlin.time.Duration.Companion.milliseconds
// Farben für Startwunsch-Markierung // Farben für Startwunsch-Markierung
private val FarbeVorne = Color(0xFFE8F5E9) // Grün private val FarbeVorne = Color(0xFFE8F5E9) // Grün
@ -37,7 +38,7 @@ fun NennungsMaske(
// Status-Snackbar // Status-Snackbar
state.statusMeldung?.let { meldung -> state.statusMeldung?.let { meldung ->
LaunchedEffect(meldung) { LaunchedEffect(meldung) {
kotlinx.coroutines.delay(3000) kotlinx.coroutines.delay(3000.milliseconds)
viewModel.statusMeldungDismiss() viewModel.statusMeldungDismiss()
} }
} }

View File

@ -5,7 +5,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import at.mocode.frontend.core.designsystem.components.* import at.mocode.frontend.core.designsystem.components.*

View File

@ -0,0 +1,44 @@
package at.mocode.frontend.features.veranstalter.data.remote
import at.mocode.frontend.features.veranstalter.domain.Veranstalter
import at.mocode.frontend.features.veranstalter.domain.VeranstalterRepository
/**
* Fake-Implementierung für die Veranstalter-Verwaltung (Offline-First Prototyp).
* Später durch Ktor-Backed Implementierung ersetzt.
*/
class FakeVeranstalterRepository : VeranstalterRepository {
private val mockData = mutableListOf(
Veranstalter(1, "URV Schloss Hof", "1-2345", "Schloßhof", "Aktiv"),
Veranstalter(2, "RV Schloß Rosenau", "3-0012", "Rosenau", "Aktiv"),
Veranstalter(3, "Reitclub Tulln", "3-1520", "Tulln", "Inaktiv"),
Veranstalter(4, "RC St. Pölten", "3-0101", "St. Pölten", "Aktiv"),
Veranstalter(5, "Union Reitklub Wien", "9-0001", "Wien", "Aktiv")
)
override suspend fun list(): Result<List<Veranstalter>> = Result.success(mockData)
override suspend fun getById(id: Long): Result<Veranstalter> {
return mockData.find { it.id == id }?.let { Result.success(it) }
?: Result.failure(Exception("Veranstalter nicht gefunden"))
}
override suspend fun create(model: Veranstalter): Result<Veranstalter> {
mockData.add(model)
return Result.success(model)
}
override suspend fun update(id: Long, model: Veranstalter): Result<Veranstalter> {
val index = mockData.indexOfFirst { it.id == id }
if (index != -1) {
mockData[index] = model
return Result.success(model)
}
return Result.failure(Exception("Veranstalter nicht gefunden"))
}
override suspend fun delete(id: Long): Result<Unit> {
mockData.removeIf { it.id == id }
return Result.success(Unit)
}
}

View File

@ -1,12 +0,0 @@
package at.mocode.frontend.features.veranstalter.domain
data class Veranstalter(
val id: String,
val name: String,
val verein: String? = null,
val adresse: String? = null,
val email: String? = null,
val telefon: String? = null,
val znsId: String? = null,
val oepsNummer: String? = null
)

View File

@ -1,8 +1,5 @@
package at.mocode.frontend.features.veranstalter.domain package at.mocode.frontend.features.veranstalter.domain
/**
* Domänenmodell für Veranstalter (V3-Minimum für Listenansicht).
*/
data class Veranstalter( data class Veranstalter(
val id: Long, val id: Long,
val name: String, val name: String,

View File

@ -1,4 +1,4 @@
package at.mocode.veranstalter.feature.presentation package at.mocode.frontend.features.veranstalter.presentation
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers

View File

@ -1,72 +0,0 @@
package at.mocode.frontend.features.veranstalter.data.remote
import at.mocode.frontend.core.network.*
import at.mocode.frontend.features.veranstalter.data.mapper.toDomain
import at.mocode.frontend.features.veranstalter.data.mapper.toDto
import at.mocode.frontend.features.veranstalter.data.remote.dto.VeranstalterDto
import at.mocode.frontend.features.veranstalter.domain.Veranstalter
import at.mocode.frontend.features.veranstalter.domain.VeranstalterRepository
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.request.*
import io.ktor.http.*
class DefaultVeranstalterRepository(
private val client: HttpClient,
) : VeranstalterRepository {
override suspend fun list(): Result<List<Veranstalter>> = runCatching {
val response = client.get(ApiRoutes.Veranstalter.ROOT)
when {
response.status.isSuccess() -> response.body<List<VeranstalterDto>>().map { it.toDomain() }
response.status == HttpStatusCode.Unauthorized -> throw AuthExpired()
response.status == HttpStatusCode.Forbidden -> throw AuthForbidden()
response.status.value >= 500 -> throw ServerError()
else -> throw HttpError(response.status.value)
}
}
override suspend fun getById(id: Long): Result<Veranstalter> = runCatching {
val response = client.get("${ApiRoutes.Veranstalter.ROOT}/$id")
when {
response.status.isSuccess() -> response.body<VeranstalterDto>().toDomain()
response.status == HttpStatusCode.NotFound -> throw NotFound()
response.status == HttpStatusCode.Unauthorized -> throw AuthExpired()
response.status == HttpStatusCode.Forbidden -> throw AuthForbidden()
response.status.value >= 500 -> throw ServerError()
else -> throw HttpError(response.status.value)
}
}
override suspend fun create(model: Veranstalter): Result<Veranstalter> = runCatching {
val response = client.post(ApiRoutes.Veranstalter.ROOT) { setBody(model.toDto()) }
when {
response.status.isSuccess() -> response.body<VeranstalterDto>().toDomain()
response.status == HttpStatusCode.Conflict -> throw Conflict()
response.status.value >= 500 -> throw ServerError()
else -> throw HttpError(response.status.value)
}
}
override suspend fun update(id: Long, model: Veranstalter): Result<Veranstalter> = runCatching {
val response = client.put("${ApiRoutes.Veranstalter.ROOT}/$id") { setBody(model.toDto()) }
when {
response.status.isSuccess() -> response.body<VeranstalterDto>().toDomain()
response.status == HttpStatusCode.NotFound -> throw NotFound()
response.status == HttpStatusCode.Conflict -> throw Conflict()
response.status.value >= 500 -> throw ServerError()
else -> throw HttpError(response.status.value)
}
}
override suspend fun delete(id: Long): Result<Unit> = runCatching {
val response = client.delete("${ApiRoutes.Veranstalter.ROOT}/$id")
when {
response.status.isSuccess() -> Unit
response.status == HttpStatusCode.NotFound -> throw NotFound()
response.status.value >= 500 -> throw ServerError()
else -> throw HttpError(response.status.value)
}
}
}

View File

@ -1,10 +1,9 @@
package at.mocode.frontend.features.veranstalter.di package at.mocode.frontend.features.veranstalter.di
import at.mocode.frontend.features.veranstalter.data.remote.DefaultVeranstalterRepository import at.mocode.frontend.features.veranstalter.data.remote.FakeVeranstalterRepository
import at.mocode.frontend.features.veranstalter.domain.VeranstalterRepository import at.mocode.frontend.features.veranstalter.domain.VeranstalterRepository
import org.koin.core.qualifier.named
import org.koin.dsl.module import org.koin.dsl.module
val veranstalterModule = module { val veranstalterModule = module {
single<VeranstalterRepository> { DefaultVeranstalterRepository(get(named("apiClient"))) } single<VeranstalterRepository> { FakeVeranstalterRepository() }
} }

View File

@ -1,4 +1,4 @@
package at.mocode.veranstalter.feature.presentation package at.mocode.frontend.features.veranstalter.presentation
import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.runtime.snapshots.SnapshotStateList

View File

@ -1,4 +1,4 @@
package at.mocode.veranstalter.feature.presentation package at.mocode.frontend.features.veranstalter.presentation
import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.runtime.snapshots.SnapshotStateList
import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateListOf

View File

@ -1,4 +1,4 @@
package at.mocode.veranstalter.feature.presentation package at.mocode.frontend.features.veranstalter.presentation
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable

View File

@ -1,4 +1,4 @@
package at.mocode.veranstalter.feature.presentation package at.mocode.frontend.features.veranstalter.presentation
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border import androidx.compose.foundation.border

View File

@ -1,15 +1,13 @@
package at.mocode.veranstalter.feature.presentation package at.mocode.frontend.features.veranstalter.presentation
import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Add
import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Delete
import androidx.compose.material.icons.filled.Search import androidx.compose.material.icons.filled.Search
import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.filled.Settings

View File

@ -1,4 +1,4 @@
package at.mocode.veranstalter.feature.presentation package at.mocode.frontend.features.veranstalter.presentation
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState

View File

@ -1,4 +1,4 @@
package at.mocode.veranstalter.feature.presentation package at.mocode.frontend.features.veranstalter.presentation
import at.mocode.frontend.core.designsystem.models.LoginStatus import at.mocode.frontend.core.designsystem.models.LoginStatus

View File

@ -1,4 +1,4 @@
package at.mocode.veranstalter.feature.presentation package at.mocode.frontend.features.veranstalter.presentation
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState

View File

@ -1 +0,0 @@
// Deprecated fake repository removed in favor of real Ktor-backed implementation.

View File

@ -21,20 +21,20 @@ import androidx.compose.ui.unit.sp
import at.mocode.frontend.core.navigation.AppScreen import at.mocode.frontend.core.navigation.AppScreen
import at.mocode.frontend.features.billing.presentation.BillingScreen import at.mocode.frontend.features.billing.presentation.BillingScreen
import at.mocode.frontend.features.billing.presentation.BillingViewModel import at.mocode.frontend.features.billing.presentation.BillingViewModel
import at.mocode.frontend.features.nennung.presentation.NennungViewModel
import at.mocode.frontend.features.nennung.presentation.NennungsMaske
import at.mocode.frontend.features.pferde.presentation.PferdeScreen
import at.mocode.frontend.features.pferde.presentation.PferdeViewModel
import at.mocode.frontend.features.profile.presentation.ProfileScreen import at.mocode.frontend.features.profile.presentation.ProfileScreen
import at.mocode.frontend.features.profile.presentation.ProfileViewModel import at.mocode.frontend.features.profile.presentation.ProfileViewModel
import at.mocode.frontend.features.reiter.presentation.ReiterScreen
import at.mocode.frontend.features.reiter.presentation.ReiterViewModel
import at.mocode.frontend.features.verein.presentation.VereinScreen import at.mocode.frontend.features.verein.presentation.VereinScreen
import at.mocode.frontend.features.verein.presentation.VereinViewModel import at.mocode.frontend.features.verein.presentation.VereinViewModel
import at.mocode.ping.feature.presentation.PingScreen import at.mocode.ping.feature.presentation.PingScreen
import at.mocode.ping.feature.presentation.PingViewModel import at.mocode.ping.feature.presentation.PingViewModel
import at.mocode.frontend.features.pferde.presentation.PferdeScreen
import at.mocode.frontend.features.pferde.presentation.PferdeViewModel
import at.mocode.frontend.features.reiter.presentation.ReiterScreen
import at.mocode.frontend.features.reiter.presentation.ReiterViewModel
import at.mocode.frontend.features.nennung.presentation.NennungViewModel
import at.mocode.frontend.features.nennung.presentation.NennungsMaske
import at.mocode.turnier.feature.presentation.TurnierDetailScreen import at.mocode.turnier.feature.presentation.TurnierDetailScreen
import at.mocode.veranstalter.feature.presentation.FakeVeranstalterStore import at.mocode.frontend.features.veranstalter.presentation.FakeVeranstalterStore
import at.mocode.veranstaltung.feature.presentation.AdminUebersichtScreen import at.mocode.veranstaltung.feature.presentation.AdminUebersichtScreen
import at.mocode.veranstaltung.feature.presentation.VeranstaltungDetailScreen import at.mocode.veranstaltung.feature.presentation.VeranstaltungDetailScreen
import at.mocode.veranstaltung.feature.presentation.VeranstaltungNeuScreen import at.mocode.veranstaltung.feature.presentation.VeranstaltungNeuScreen
@ -511,7 +511,7 @@ private fun DesktopContentArea(
) )
is AppScreen.VeranstalterDetail -> { is AppScreen.VeranstalterDetail -> {
val vId = currentScreen.veranstalterId val vId = currentScreen.veranstalterId
if (!FakeVeranstalterStore.exists(vId)) { if (vId != 1L) { // Temporärer Check für Mock-Daten
InvalidContextNotice( InvalidContextNotice(
message = "Veranstalter (ID=$vId) nicht gefunden.", message = "Veranstalter (ID=$vId) nicht gefunden.",
onBack = onBack onBack = onBack
@ -688,7 +688,7 @@ private fun DesktopContentArea(
} }
is AppScreen.Nennung -> { is AppScreen.Nennung -> {
val nennungViewModel: at.mocode.frontend.features.nennung.presentation.NennungViewModel = koinViewModel() val nennungViewModel: NennungViewModel = koinViewModel()
NennungsMaske( NennungsMaske(
viewModel = nennungViewModel, viewModel = nennungViewModel,
onAbrechnungOeffnen = { /* Navigation zu Billing falls nötig */ } onAbrechnungOeffnen = { /* Navigation zu Billing falls nötig */ }

View File

@ -7,9 +7,9 @@ import at.mocode.turnier.feature.domain.BewerbRepository
import at.mocode.turnier.feature.domain.StartlistenRepository import at.mocode.turnier.feature.domain.StartlistenRepository
import at.mocode.turnier.feature.presentation.* import at.mocode.turnier.feature.presentation.*
import at.mocode.zns.parser.ZnsBewerb import at.mocode.zns.parser.ZnsBewerb
import at.mocode.veranstalter.feature.presentation.VeranstalterAuswahlScreen import at.mocode.frontend.features.veranstalter.presentation.VeranstalterAuswahlScreen
import at.mocode.veranstalter.feature.presentation.VeranstalterDetailScreen import at.mocode.frontend.features.veranstalter.presentation.VeranstalterDetailScreen
import at.mocode.veranstalter.feature.presentation.VeranstalterNeuScreen import at.mocode.frontend.features.veranstalter.presentation.VeranstalterNeuScreen
import at.mocode.veranstaltung.feature.presentation.VeranstaltungUebersichtScreen import at.mocode.veranstaltung.feature.presentation.VeranstaltungUebersichtScreen
import at.mocode.wui.preview.ComponentPreview import at.mocode.wui.preview.ComponentPreview