chore: consolidate redundant controllers in mail-service, improve backend stability, refine desktop UX, and enhance Vereinsverwaltung functionality
This commit is contained in:
+4
-31
@@ -63,14 +63,7 @@ actual fun DeviceInitializationConfig(
|
||||
errorText = "Mindestens ${DeviceInitializationValidator.MIN_NAME_LENGTH} Zeichen erforderlich.",
|
||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
|
||||
keyboardActions = KeyboardActions(onNext = { focusManager.moveFocus(FocusDirection.Next) }),
|
||||
modifier = Modifier.focusRequester(deviceNameFocus).onKeyEvent {
|
||||
if (it.key == Key.Enter && it.type == KeyEventType.KeyUp) {
|
||||
focusManager.moveFocus(FocusDirection.Next)
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
modifier = Modifier.focusRequester(deviceNameFocus)
|
||||
)
|
||||
|
||||
var passwordVisible by remember { mutableStateOf(false) }
|
||||
@@ -95,18 +88,7 @@ actual fun DeviceInitializationConfig(
|
||||
}
|
||||
}
|
||||
),
|
||||
modifier = Modifier.focusRequester(sharedKeyFocus).onKeyEvent {
|
||||
if (it.key == Key.Enter && it.type == KeyEventType.KeyUp) {
|
||||
if (settings.networkRole == NetworkRole.MASTER) {
|
||||
focusManager.moveFocus(FocusDirection.Next)
|
||||
} else if (DeviceInitializationValidator.canContinue(settings)) {
|
||||
viewModel.completeInitialization()
|
||||
}
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
},
|
||||
modifier = Modifier.focusRequester(sharedKeyFocus),
|
||||
trailingIcon = {
|
||||
IconButton(onClick = { passwordVisible = !passwordVisible }) {
|
||||
Icon(
|
||||
@@ -123,17 +105,8 @@ actual fun DeviceInitializationConfig(
|
||||
onValueChange = { viewModel.updateSettings { s -> s.copy(backupPath = it) } },
|
||||
label = { Text("Backup-Verzeichnis (Pfad)") },
|
||||
placeholder = { Text("/pfad/zu/den/backups") },
|
||||
modifier = Modifier.fillMaxWidth().focusRequester(backupPathFocus).onKeyEvent {
|
||||
if (it.key == Key.Enter && it.type == KeyEventType.KeyUp) {
|
||||
selectBackupPath(settings.backupPath) { selectedPath ->
|
||||
viewModel.updateSettings { s -> s.copy(backupPath = selectedPath) }
|
||||
}
|
||||
true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
},
|
||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
|
||||
modifier = Modifier.fillMaxWidth().focusRequester(backupPathFocus),
|
||||
keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
|
||||
keyboardActions = KeyboardActions(
|
||||
onNext = { focusManager.moveFocus(FocusDirection.Next) }
|
||||
),
|
||||
|
||||
+18
-2
@@ -50,10 +50,26 @@ class NennungRemoteRepository(private val client: HttpClient) {
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun sendeAntwort(email: String, turnierNr: String, vorname: String, nachname: String): Result<Unit> {
|
||||
return try {
|
||||
client.post("$mailServiceUrl/api/mail/send-reply") {
|
||||
parameter("email", email)
|
||||
parameter("turnierNr", turnierNr)
|
||||
parameter("vorname", vorname)
|
||||
parameter("nachname", nachname)
|
||||
}
|
||||
Result.success(Unit)
|
||||
} catch (e: Exception) {
|
||||
Result.failure(e)
|
||||
}
|
||||
}
|
||||
|
||||
suspend fun markiereAlsGelesen(id: String): Result<Unit> {
|
||||
return try {
|
||||
// Endpunkt müsste im Backend noch implementiert werden, falls gewünscht.
|
||||
// Für jetzt simuliert:
|
||||
client.put("$mailServiceUrl/api/mail/nennungen/$id/status") {
|
||||
contentType(ContentType.Application.Json)
|
||||
setBody("GELESEN")
|
||||
}
|
||||
Result.success(Unit)
|
||||
} catch (e: Exception) {
|
||||
Result.failure(e)
|
||||
|
||||
+18
-1
@@ -12,10 +12,27 @@ data class Verein(
|
||||
val oepsNr: String? = null,
|
||||
val ort: String? = null,
|
||||
val plz: String? = null,
|
||||
val strasse: String? = null,
|
||||
val hausnummer: String? = null,
|
||||
val bundesland: String? = null,
|
||||
val land: String = "AUT",
|
||||
val status: VereinStatus = VereinStatus.AKTIV
|
||||
val status: VereinStatus = VereinStatus.AKTIV,
|
||||
val logoUrl: String? = null,
|
||||
val logoBase64: String? = null
|
||||
)
|
||||
|
||||
enum class Bundesland(val label: String) {
|
||||
BURGENLAND("Burgenland"),
|
||||
KAERNTEN("Kärnten"),
|
||||
NIEDEROESTERREICH("Niederösterreich"),
|
||||
OBEROESTERREICH("Oberösterreich"),
|
||||
SALZBURG("Salzburg"),
|
||||
STEIERMARK("Steiermark"),
|
||||
TIROL("Tirol"),
|
||||
VORARLBERG("Vorarlberg"),
|
||||
WIEN("Wien")
|
||||
}
|
||||
|
||||
enum class VereinStatus(val label: String, val color: Color) {
|
||||
AKTIV("Aktiv", Color(0xFF2E7D32)),
|
||||
RUHEND("Ruhend", Color(0xFFE65100)),
|
||||
|
||||
+236
-36
@@ -1,13 +1,28 @@
|
||||
package at.mocode.frontend.features.verein.presentation
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.border
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.shape.CircleShape
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Business
|
||||
import androidx.compose.material.icons.filled.Image
|
||||
import androidx.compose.material.icons.filled.Map
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.platform.LocalUriHandler
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import at.mocode.frontend.core.designsystem.components.*
|
||||
import at.mocode.frontend.core.designsystem.models.PlaceholderContent
|
||||
import at.mocode.frontend.features.verein.domain.Bundesland
|
||||
import at.mocode.frontend.features.verein.domain.Verein
|
||||
import at.mocode.frontend.features.verein.domain.VereinStatus
|
||||
|
||||
@@ -27,28 +42,153 @@ fun VereinScreen(
|
||||
)
|
||||
},
|
||||
detail = {
|
||||
if (uiState.isEditing) {
|
||||
VereinEditorContent(
|
||||
uiState = uiState,
|
||||
onNameChange = viewModel::onEditNameChange,
|
||||
onLangnameChange = viewModel::onEditLangnameChange,
|
||||
onOepsNrChange = viewModel::onEditOepsNrChange,
|
||||
onOrtChange = viewModel::onEditOrtChange,
|
||||
onPlzChange = viewModel::onEditPlzChange,
|
||||
onStatusChange = viewModel::onEditStatusChange,
|
||||
onSave = viewModel::onSave,
|
||||
onCancel = viewModel::onCancel
|
||||
)
|
||||
} else {
|
||||
PlaceholderContent(
|
||||
title = "Kein Verein ausgewählt",
|
||||
subtitle = "Wählen Sie einen Verein aus der Liste aus oder legen Sie einen neuen an."
|
||||
)
|
||||
Column(Modifier.fillMaxSize()) {
|
||||
if (uiState.selectedVerein != null || uiState.isEditing) {
|
||||
// --- Preview Bereich ---
|
||||
VereinCardPreview(
|
||||
name = if (uiState.isEditing) uiState.editName else uiState.selectedVerein?.name ?: "",
|
||||
langname = if (uiState.isEditing) uiState.editLangname else uiState.selectedVerein?.langname,
|
||||
ort = if (uiState.isEditing) uiState.editOrt else uiState.selectedVerein?.ort,
|
||||
plz = if (uiState.isEditing) uiState.editPlz else uiState.selectedVerein?.plz,
|
||||
strasse = if (uiState.isEditing) uiState.editStrasse else uiState.selectedVerein?.strasse,
|
||||
hausnummer = if (uiState.isEditing) uiState.editHausnummer else uiState.selectedVerein?.hausnummer,
|
||||
bundesland = if (uiState.isEditing) uiState.editBundesland else uiState.selectedVerein?.bundesland,
|
||||
logoUrl = if (uiState.isEditing) uiState.editLogoUrl else uiState.selectedVerein?.logoUrl,
|
||||
status = if (uiState.isEditing) uiState.editStatus else uiState.selectedVerein?.status ?: VereinStatus.AKTIV
|
||||
)
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
HorizontalDivider(thickness = 0.5.dp, color = MaterialTheme.colorScheme.outlineVariant)
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
if (uiState.isEditing) {
|
||||
VereinEditorContent(
|
||||
uiState = uiState,
|
||||
onNameChange = viewModel::onEditNameChange,
|
||||
onLangnameChange = viewModel::onEditLangnameChange,
|
||||
onOepsNrChange = viewModel::onEditOepsNrChange,
|
||||
onOrtChange = viewModel::onEditOrtChange,
|
||||
onPlzChange = viewModel::onEditPlzChange,
|
||||
onStrasseChange = viewModel::onEditStrasseChange,
|
||||
onHausnummerChange = viewModel::onEditHausnummerChange,
|
||||
onBundeslandChange = viewModel::onEditBundeslandChange,
|
||||
onStatusChange = viewModel::onEditStatusChange,
|
||||
onLogoUrlChange = viewModel::onEditLogoUrlChange,
|
||||
onSave = viewModel::onSave,
|
||||
onCancel = viewModel::onCancel
|
||||
)
|
||||
}
|
||||
} else {
|
||||
PlaceholderContent(
|
||||
title = "Kein Verein ausgewählt",
|
||||
subtitle = "Wählen Sie einen Verein aus der Liste aus oder legen Sie einen neuen an."
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun VereinCardPreview(
|
||||
name: String,
|
||||
langname: String?,
|
||||
ort: String?,
|
||||
plz: String?,
|
||||
strasse: String?,
|
||||
hausnummer: String?,
|
||||
bundesland: String?,
|
||||
logoUrl: String?,
|
||||
status: VereinStatus
|
||||
) {
|
||||
val uriHandler = LocalUriHandler.current
|
||||
|
||||
Card(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f)),
|
||||
shape = RoundedCornerShape(12.dp)
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.padding(16.dp),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.spacedBy(16.dp)
|
||||
) {
|
||||
// Logo Placeholder / Image
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.size(80.dp)
|
||||
.clip(CircleShape)
|
||||
.background(MaterialTheme.colorScheme.primary.copy(alpha = 0.1f))
|
||||
.border(1.dp, MaterialTheme.colorScheme.primary.copy(alpha = 0.2f), CircleShape),
|
||||
contentAlignment = Alignment.Center
|
||||
) {
|
||||
if (!logoUrl.isNullOrBlank()) {
|
||||
Icon(Icons.Default.Business, null, modifier = Modifier.size(40.dp), tint = MaterialTheme.colorScheme.primary)
|
||||
} else {
|
||||
Icon(Icons.Default.Business, null, modifier = Modifier.size(40.dp), tint = MaterialTheme.colorScheme.primary)
|
||||
}
|
||||
}
|
||||
|
||||
Column(modifier = Modifier.weight(1f)) {
|
||||
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) {
|
||||
Text(
|
||||
text = name.ifBlank { "Vereinsname" },
|
||||
style = MaterialTheme.typography.titleLarge,
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
MsStatusBadge(
|
||||
text = status.label,
|
||||
containerColor = status.color.copy(alpha = 0.1f),
|
||||
contentColor = status.color
|
||||
)
|
||||
}
|
||||
if (!langname.isNullOrBlank()) {
|
||||
Text(langname, style = MaterialTheme.typography.bodyMedium, color = Color.Gray)
|
||||
}
|
||||
|
||||
val adresse = buildString {
|
||||
if (!strasse.isNullOrBlank()) {
|
||||
append(strasse)
|
||||
if (!hausnummer.isNullOrBlank()) append(" $hausnummer")
|
||||
append(", ")
|
||||
}
|
||||
if (!plz.isNullOrBlank()) append("$plz ")
|
||||
if (!ort.isNullOrBlank()) append(ort)
|
||||
if (!bundesland.isNullOrBlank()) {
|
||||
if (isNotEmpty() && !endsWith(", ")) append(", ")
|
||||
append(bundesland)
|
||||
}
|
||||
}
|
||||
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.spacedBy(16.dp),
|
||||
modifier = Modifier.padding(top = 4.dp)
|
||||
) {
|
||||
Text(
|
||||
text = if (adresse.isNotBlank()) "📍 $adresse" else "Keine Adresse angegeben",
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
color = MaterialTheme.colorScheme.primary,
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
|
||||
if (adresse.isNotBlank()) {
|
||||
MsButton(
|
||||
text = "📍 Maps",
|
||||
onClick = {
|
||||
val query = adresse.replace(" ", "+")
|
||||
uriHandler.openUri("https://www.google.com/maps/search/?api=1&query=$query")
|
||||
},
|
||||
variant = ButtonVariant.TEXT,
|
||||
size = ButtonSize.SMALL
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun VereinListContent(
|
||||
uiState: VereinUiState,
|
||||
@@ -116,11 +256,15 @@ private fun VereinEditorContent(
|
||||
onOepsNrChange: (String) -> Unit,
|
||||
onOrtChange: (String) -> Unit,
|
||||
onPlzChange: (String) -> Unit,
|
||||
onStrasseChange: (String) -> Unit,
|
||||
onHausnummerChange: (String) -> Unit,
|
||||
onBundeslandChange: (String) -> Unit,
|
||||
onStatusChange: (VereinStatus) -> Unit,
|
||||
onLogoUrlChange: (String) -> Unit,
|
||||
onSave: () -> Unit,
|
||||
onCancel: () -> Unit
|
||||
) {
|
||||
Column(modifier = Modifier.fillMaxSize()) {
|
||||
Column(modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState())) {
|
||||
MsActionToolbar(
|
||||
title = if (uiState.selectedVerein == null) "Neuer Verein" else "Verein Details",
|
||||
onSave = onSave,
|
||||
@@ -129,21 +273,47 @@ private fun VereinEditorContent(
|
||||
|
||||
Spacer(Modifier.height(24.dp))
|
||||
|
||||
MsTextField(
|
||||
value = uiState.editName,
|
||||
onValueChange = onNameChange,
|
||||
label = "Name (Kurz)",
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
|
||||
Column(modifier = Modifier.weight(1f)) {
|
||||
MsTextField(
|
||||
value = uiState.editName,
|
||||
onValueChange = onNameChange,
|
||||
label = "Name (Kurz)",
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
MsTextField(
|
||||
value = uiState.editLangname,
|
||||
onValueChange = onLangnameChange,
|
||||
label = "Vollständiger Name",
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
MsTextField(
|
||||
value = uiState.editLangname,
|
||||
onValueChange = onLangnameChange,
|
||||
label = "Vollständiger Name",
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
)
|
||||
}
|
||||
|
||||
// Logo Upload Sektion
|
||||
Column(
|
||||
modifier = Modifier
|
||||
.width(200.dp)
|
||||
.height(120.dp)
|
||||
.clip(RoundedCornerShape(8.dp))
|
||||
.background(MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.3f))
|
||||
.border(1.dp, MaterialTheme.colorScheme.outlineVariant, RoundedCornerShape(8.dp)),
|
||||
horizontalAlignment = Alignment.CenterHorizontally,
|
||||
verticalArrangement = Arrangement.Center
|
||||
) {
|
||||
Icon(Icons.Default.Image, null, tint = MaterialTheme.colorScheme.primary.copy(alpha = 0.5f))
|
||||
Text("Logo hierher ziehen", style = MaterialTheme.typography.labelSmall, color = Color.Gray)
|
||||
Spacer(Modifier.height(4.dp))
|
||||
MsButton(
|
||||
text = "Wählen",
|
||||
onClick = { /* FilePicker Call via JFileChooser (JVM only) */ },
|
||||
variant = ButtonVariant.SECONDARY,
|
||||
size = ButtonSize.SMALL
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
@@ -166,19 +336,49 @@ private fun VereinEditorContent(
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
Text("Adresse", style = MaterialTheme.typography.titleSmall, fontWeight = FontWeight.Bold)
|
||||
Spacer(Modifier.height(8.dp))
|
||||
|
||||
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
|
||||
MsTextField(
|
||||
value = uiState.editStrasse,
|
||||
onValueChange = onStrasseChange,
|
||||
label = "Straße",
|
||||
modifier = Modifier.weight(0.7f)
|
||||
)
|
||||
MsTextField(
|
||||
value = uiState.editHausnummer,
|
||||
onValueChange = onHausnummerChange,
|
||||
label = "Nr.",
|
||||
modifier = Modifier.weight(0.3f)
|
||||
)
|
||||
}
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
|
||||
MsTextField(
|
||||
value = uiState.editPlz,
|
||||
onValueChange = onPlzChange,
|
||||
label = "PLZ",
|
||||
modifier = Modifier.weight(0.3f)
|
||||
modifier = Modifier.weight(0.2f)
|
||||
)
|
||||
MsTextField(
|
||||
value = uiState.editOrt,
|
||||
onValueChange = onOrtChange,
|
||||
label = "Ort",
|
||||
modifier = Modifier.weight(0.7f)
|
||||
modifier = Modifier.weight(0.4f)
|
||||
)
|
||||
MsEnumDropdown(
|
||||
label = "Bundesland",
|
||||
options = Bundesland.entries.toTypedArray(),
|
||||
selectedOption = Bundesland.entries.find { it.label == uiState.editBundesland },
|
||||
onOptionSelected = { onBundeslandChange(it.label) },
|
||||
optionLabel = { it.label },
|
||||
modifier = Modifier.weight(0.4f)
|
||||
)
|
||||
}
|
||||
|
||||
Spacer(Modifier.height(32.dp))
|
||||
}
|
||||
}
|
||||
|
||||
+44
-4
@@ -26,7 +26,12 @@ data class VereinUiState(
|
||||
val editOepsNr: String = "",
|
||||
val editOrt: String = "",
|
||||
val editPlz: String = "",
|
||||
val editStatus: VereinStatus = VereinStatus.AKTIV
|
||||
val editStrasse: String = "",
|
||||
val editHausnummer: String = "",
|
||||
val editBundesland: String = "",
|
||||
val editStatus: VereinStatus = VereinStatus.AKTIV,
|
||||
val editLogoUrl: String = "",
|
||||
val editLogoBase64: String = ""
|
||||
)
|
||||
|
||||
/**
|
||||
@@ -99,10 +104,35 @@ open class VereinViewModel(
|
||||
editOepsNr = verein.oepsNr ?: "",
|
||||
editOrt = verein.ort ?: "",
|
||||
editPlz = verein.plz ?: "",
|
||||
editStatus = verein.status
|
||||
editStrasse = verein.strasse ?: "",
|
||||
editHausnummer = verein.hausnummer ?: "",
|
||||
editBundesland = verein.bundesland ?: "",
|
||||
editStatus = verein.status,
|
||||
editLogoUrl = verein.logoUrl ?: "",
|
||||
editLogoBase64 = verein.logoBase64 ?: ""
|
||||
)
|
||||
}
|
||||
|
||||
fun onEditStrasseChange(value: String) {
|
||||
uiState = uiState.copy(editStrasse = value)
|
||||
}
|
||||
|
||||
fun onEditHausnummerChange(value: String) {
|
||||
uiState = uiState.copy(editHausnummer = value)
|
||||
}
|
||||
|
||||
fun onEditBundeslandChange(value: String) {
|
||||
uiState = uiState.copy(editBundesland = value)
|
||||
}
|
||||
|
||||
fun onEditLogoBase64Change(value: String) {
|
||||
uiState = uiState.copy(editLogoBase64 = value)
|
||||
}
|
||||
|
||||
fun onEditLogoUrlChange(value: String) {
|
||||
uiState = uiState.copy(editLogoUrl = value)
|
||||
}
|
||||
|
||||
fun onEditNameChange(value: String) {
|
||||
uiState = uiState.copy(editName = value)
|
||||
}
|
||||
@@ -138,7 +168,12 @@ open class VereinViewModel(
|
||||
oepsNr = uiState.editOepsNr,
|
||||
ort = uiState.editOrt,
|
||||
plz = uiState.editPlz,
|
||||
status = uiState.editStatus
|
||||
strasse = uiState.editStrasse,
|
||||
hausnummer = uiState.editHausnummer,
|
||||
bundesland = uiState.editBundesland,
|
||||
status = uiState.editStatus,
|
||||
logoUrl = uiState.editLogoUrl.ifBlank { null },
|
||||
logoBase64 = uiState.editLogoBase64.ifBlank { null }
|
||||
)
|
||||
|
||||
viewModelScope.launch {
|
||||
@@ -169,7 +204,12 @@ open class VereinViewModel(
|
||||
editOepsNr = "",
|
||||
editOrt = "",
|
||||
editPlz = "",
|
||||
editStatus = VereinStatus.AKTIV
|
||||
editStrasse = "",
|
||||
editHausnummer = "",
|
||||
editBundesland = "",
|
||||
editStatus = VereinStatus.AKTIV,
|
||||
editLogoUrl = "",
|
||||
editLogoBase64 = ""
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user