### feat: füge Validierung und Fehler-Handling zur Veranstalter-Erstellung hinzu

- Implementiere Validierungslogik im `VeranstalterWizardViewModel` (Pflichtfelder, E-Mail-Format).
- Zeige Validierungsfehler direkt in der `VeranstalterNeuScreen` an.
- Erweiterung der State-Klasse um `errors` für direktes UI-Feedback.
This commit is contained in:
2026-04-22 00:06:42 +02:00
parent f8913f81b8
commit f18b002f4e
3 changed files with 38 additions and 8 deletions
@@ -146,25 +146,33 @@ fun VeranstalterNeuScreen(
value = state.name,
onValueChange = { viewModel.send(VeranstalterWizardIntent.UpdateName(it)) },
label = "Vereinsname *",
modifier = Modifier.fillMaxWidth()
modifier = Modifier.fillMaxWidth(),
isError = state.errors.containsKey("name"),
errorMessage = state.errors["name"]
)
MsTextField(
value = state.oepsNummer,
onValueChange = { viewModel.send(VeranstalterWizardIntent.UpdateOeps(it)) },
label = "OEBS-Nummer *",
modifier = Modifier.fillMaxWidth()
modifier = Modifier.fillMaxWidth(),
isError = state.errors.containsKey("oeps"),
errorMessage = state.errors["oeps"]
)
MsTextField(
value = state.ansprechpartner,
onValueChange = { viewModel.send(VeranstalterWizardIntent.UpdateAnsprechpartner(it)) },
label = "Ansprechperson *",
modifier = Modifier.fillMaxWidth()
modifier = Modifier.fillMaxWidth(),
isError = state.errors.containsKey("ansprechpartner"),
errorMessage = state.errors["ansprechpartner"]
)
MsTextField(
value = state.email,
onValueChange = { viewModel.send(VeranstalterWizardIntent.UpdateEmail(it)) },
label = "E-Mail (für Login-Daten) *",
modifier = Modifier.fillMaxWidth()
modifier = Modifier.fillMaxWidth(),
isError = state.errors.containsKey("email"),
errorMessage = state.errors["email"]
)
MsTextField(
value = state.telefon,
@@ -37,7 +37,8 @@ data class VeranstalterWizardState(
val reiterSearchQuery: String = "",
val reiterSearchResults: List<ZnsRemoteReiter> = emptyList(),
val isSearchingVerein: Boolean = false,
val isSearchingReiter: Boolean = false
val isSearchingReiter: Boolean = false,
val errors: Map<String, String> = emptyMap()
)
sealed interface VeranstalterWizardIntent {
@@ -160,7 +161,27 @@ class VeranstalterWizardViewModel(
}
}
private fun validate(): Boolean {
val errors = mutableMapOf<String, String>()
val s = _state.value
if (s.name.isBlank()) errors["name"] = "Vereinsname ist erforderlich"
if (s.oepsNummer.isBlank()) errors["oeps"] = "OEBS-Nummer ist erforderlich"
if (s.ansprechpartner.isBlank()) errors["ansprechpartner"] = "Ansprechperson ist erforderlich"
if (s.email.isBlank()) {
errors["email"] = "E-Mail ist erforderlich"
} else if (!s.email.contains("@") || !s.email.contains(".")) {
errors["email"] = "Ungültiges E-Mail Format"
}
_state.value = _state.value.copy(errors = errors)
return errors.isEmpty()
}
private fun save() {
if (!validate()) return
val s = _state.value
_state.value = _state.value.copy(isSaving = true)
scope.launch {