### 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:
+12
-4
@@ -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,
|
||||
|
||||
+22
-1
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user