chore: implement Turnier domain logic, add repository interfaces and default implementations, and disable WASM builds
This commit is contained in:
+116
-106
@@ -1,15 +1,14 @@
|
||||
package at.mocode.frontend.features.veranstalter.presentation
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.border
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.Add
|
||||
import androidx.compose.material.icons.filled.Check
|
||||
import androidx.compose.material.icons.filled.Info
|
||||
import androidx.compose.material.icons.filled.Search
|
||||
import androidx.compose.material.icons.automirrored.filled.ArrowForward
|
||||
import androidx.compose.material.icons.filled.*
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.collectAsState
|
||||
@@ -27,15 +26,7 @@ private val AccentBlue = Color(0xFF3B82F6)
|
||||
|
||||
/**
|
||||
* Screen: "Admin - Verwaltung / Veranstalter auswählen"
|
||||
*
|
||||
* Gemäß Figma Vision_03 (figma-entwurf_20 / figma-entwurf_22):
|
||||
* - Titel + Untertitel
|
||||
* - Suchfeld + "+ Neuer Veranstalter"-Button
|
||||
* - Tabelle: Vereinsname, OEPS-Nummer, Ort, Ansprechpartner, E-Mail, Login-Status
|
||||
* - Hinweis-Box
|
||||
* - Abbrechen / "Weiter zum Veranstalter"-Buttons (unten)
|
||||
*
|
||||
* TODO: Echte Daten aus customer-context laden (Phase 4/5).
|
||||
* Optimiert für Vision_03 mit dichter Tabellenansicht für Profis.
|
||||
*/
|
||||
@Composable
|
||||
fun VeranstalterAuswahlScreen(
|
||||
@@ -43,115 +34,130 @@ fun VeranstalterAuswahlScreen(
|
||||
onWeiter: (Long) -> Unit,
|
||||
onNeuerVeranstalter: () -> Unit = {},
|
||||
) {
|
||||
// MVVM + UDF: ViewModel hält gesamten Zustand, Composable rendert nur State und sendet Intents
|
||||
val repo: at.mocode.frontend.features.veranstalter.domain.VeranstalterRepository = org.koin.compose.koinInject()
|
||||
val viewModel = remember { VeranstalterViewModel(repo) }
|
||||
val state by viewModel.state.collectAsState()
|
||||
|
||||
Column(modifier = Modifier.fillMaxSize()) {
|
||||
|
||||
Column(modifier = Modifier.fillMaxSize().background(Color.White)) {
|
||||
// ── Titel ────────────────────────────────────────────────────────────
|
||||
Column(modifier = Modifier.padding(horizontal = 24.dp, vertical = 16.dp)) {
|
||||
Text(
|
||||
text = "Veranstalter für neue Veranstaltung auswählen",
|
||||
fontSize = 20.sp,
|
||||
fontWeight = FontWeight.Bold,
|
||||
)
|
||||
Text(
|
||||
text = "Wählen Sie einen bestehenden Veranstalter aus oder legen Sie einen neuen Veranstalter an.",
|
||||
fontSize = 13.sp,
|
||||
color = Color(0xFF6B7280),
|
||||
)
|
||||
Surface(shadowElevation = 4.dp, color = Color.White) {
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth().padding(16.dp),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.SpaceBetween
|
||||
) {
|
||||
Column {
|
||||
Text(
|
||||
text = "Veranstalter auswählen",
|
||||
style = MaterialTheme.typography.headlineSmall,
|
||||
fontWeight = FontWeight.Bold
|
||||
)
|
||||
Text(
|
||||
text = "Wählen Sie den Verein für die neue Veranstaltung aus.",
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
color = Color.Gray
|
||||
)
|
||||
}
|
||||
IconButton(onClick = onZurueck) {
|
||||
Icon(Icons.Default.Close, contentDescription = "Schließen")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ── Suchfeld + Neuer Veranstalter ────────────────────────────────────
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(horizontal = 24.dp, vertical = 8.dp),
|
||||
.padding(24.dp),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.spacedBy(12.dp),
|
||||
horizontalArrangement = Arrangement.spacedBy(16.dp),
|
||||
) {
|
||||
OutlinedTextField(
|
||||
value = state.searchQuery,
|
||||
onValueChange = { viewModel.send(VeranstalterIntent.SearchChanged(it)) },
|
||||
placeholder = { Text("Veranstalter suchen (Name, OEPS-Nummer, Ort)...", fontSize = 13.sp) },
|
||||
placeholder = { Text("Suche nach Name, OEPS-Nummer oder Ort...", fontSize = 14.sp) },
|
||||
leadingIcon = { Icon(Icons.Default.Search, contentDescription = null) },
|
||||
modifier = Modifier.weight(1f).height(48.dp),
|
||||
modifier = Modifier.weight(1f),
|
||||
singleLine = true,
|
||||
)
|
||||
Button(
|
||||
onClick = onNeuerVeranstalter,
|
||||
colors = ButtonDefaults.buttonColors(containerColor = PrimaryBlue),
|
||||
shape = MaterialTheme.shapes.medium
|
||||
) {
|
||||
Icon(Icons.Default.Add, contentDescription = null, modifier = Modifier.size(16.dp))
|
||||
Spacer(Modifier.width(4.dp))
|
||||
Icon(Icons.Default.Add, contentDescription = null, modifier = Modifier.size(18.dp))
|
||||
Spacer(Modifier.width(8.dp))
|
||||
Text("Neuer Veranstalter")
|
||||
}
|
||||
}
|
||||
|
||||
// ── Tabellen-Header ──────────────────────────────────────────────────
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.background(Color(0xFFF3F4F6))
|
||||
.padding(horizontal = 24.dp, vertical = 8.dp),
|
||||
Surface(
|
||||
color = Color(0xFFF9FAFB),
|
||||
modifier = Modifier.fillMaxWidth().padding(horizontal = 24.dp)
|
||||
) {
|
||||
Spacer(Modifier.width(28.dp)) // Checkmark-Spalte
|
||||
Text("Vereinsname", fontWeight = FontWeight.SemiBold, fontSize = 12.sp, modifier = Modifier.weight(2.5f))
|
||||
Text("OEPS-Nummer", fontWeight = FontWeight.SemiBold, fontSize = 12.sp, modifier = Modifier.weight(1.5f))
|
||||
Text("Ort", fontWeight = FontWeight.SemiBold, fontSize = 12.sp, modifier = Modifier.weight(1.5f))
|
||||
Text("Ansprechpartner", fontWeight = FontWeight.SemiBold, fontSize = 12.sp, modifier = Modifier.weight(1.5f))
|
||||
Text("E-Mail", fontWeight = FontWeight.SemiBold, fontSize = 12.sp, modifier = Modifier.weight(2f))
|
||||
Text("Login", fontWeight = FontWeight.SemiBold, fontSize = 12.sp, modifier = Modifier.weight(1f))
|
||||
Row(
|
||||
modifier = Modifier.padding(vertical = 12.dp, horizontal = 16.dp),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Spacer(Modifier.width(32.dp)) // Platz für Checkmark/Radio
|
||||
Text("Vereinsname", fontWeight = FontWeight.Bold, fontSize = 12.sp, modifier = Modifier.weight(2.5f))
|
||||
Text("OEPS-Nummer", fontWeight = FontWeight.Bold, fontSize = 12.sp, modifier = Modifier.weight(1.5f))
|
||||
Text("Ort", fontWeight = FontWeight.Bold, fontSize = 12.sp, modifier = Modifier.weight(1.5f))
|
||||
Text("Ansprechpartner", fontWeight = FontWeight.Bold, fontSize = 12.sp, modifier = Modifier.weight(1.5f))
|
||||
Text("E-Mail", fontWeight = FontWeight.Bold, fontSize = 12.sp, modifier = Modifier.weight(2f))
|
||||
Text("Status", fontWeight = FontWeight.Bold, fontSize = 12.sp, modifier = Modifier.weight(1f))
|
||||
}
|
||||
}
|
||||
HorizontalDivider()
|
||||
|
||||
// ── Tabellen-Inhalt ──────────────────────────────────────────────────
|
||||
LazyColumn(modifier = Modifier.weight(1f)) {
|
||||
LazyColumn(
|
||||
modifier = Modifier.weight(1f).padding(horizontal = 24.dp),
|
||||
verticalArrangement = Arrangement.spacedBy(4.dp)
|
||||
) {
|
||||
items(state.filtered) { v ->
|
||||
val isSelected = v.id == state.selectedId
|
||||
Row(
|
||||
Card(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.background(
|
||||
if (isSelected) AccentBlue.copy(alpha = 0.08f)
|
||||
else Color.Transparent,
|
||||
)
|
||||
.clickable { viewModel.send(VeranstalterIntent.Select(v.id)) }
|
||||
.padding(horizontal = 24.dp, vertical = 10.dp),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
// Auswahl-Checkmark
|
||||
Box(modifier = Modifier.width(28.dp)) {
|
||||
if (isSelected) {
|
||||
Icon(
|
||||
Icons.Default.Check,
|
||||
contentDescription = null,
|
||||
tint = AccentBlue,
|
||||
modifier = Modifier.size(18.dp),
|
||||
)
|
||||
}
|
||||
}
|
||||
Text(
|
||||
text = v.name,
|
||||
fontSize = 13.sp,
|
||||
fontWeight = if (isSelected) FontWeight.SemiBold else FontWeight.Normal,
|
||||
color = AccentBlue,
|
||||
modifier = Modifier.weight(2.5f),
|
||||
.border(
|
||||
width = 1.dp,
|
||||
color = if (isSelected) PrimaryBlue else Color(0xFFE5E7EB),
|
||||
shape = MaterialTheme.shapes.small
|
||||
),
|
||||
colors = CardDefaults.cardColors(
|
||||
containerColor = if (isSelected) Color(0xFFEFF6FF) else Color.White
|
||||
)
|
||||
Text(v.oepsNummer, fontSize = 13.sp, modifier = Modifier.weight(1.5f))
|
||||
Text(v.ort, fontSize = 13.sp, modifier = Modifier.weight(1.5f))
|
||||
// Placeholder für Ansprechpartner/E-Mail vorerst leer im ListItem-Model
|
||||
Text("-", fontSize = 13.sp, modifier = Modifier.weight(1.5f))
|
||||
Text("-", fontSize = 13.sp, modifier = Modifier.weight(2f))
|
||||
// Login-Status-Badge
|
||||
Box(modifier = Modifier.weight(1f)) {
|
||||
// Für die Referenz reicht String-Label
|
||||
Text(v.loginStatus, fontSize = 12.sp, color = Color(0xFF111827))
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.padding(vertical = 8.dp, horizontal = 16.dp),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
RadioButton(
|
||||
selected = isSelected,
|
||||
onClick = { viewModel.send(VeranstalterIntent.Select(v.id)) },
|
||||
modifier = Modifier.size(32.dp)
|
||||
)
|
||||
Text(
|
||||
text = v.name,
|
||||
fontSize = 13.sp,
|
||||
fontWeight = if (isSelected) FontWeight.Bold else FontWeight.Normal,
|
||||
color = if (isSelected) PrimaryBlue else Color.Unspecified,
|
||||
modifier = Modifier.weight(2.5f),
|
||||
)
|
||||
Text(v.oepsNummer, fontSize = 13.sp, modifier = Modifier.weight(1.5f))
|
||||
Text(v.ort, fontSize = 13.sp, modifier = Modifier.weight(1.5f))
|
||||
Text("-", fontSize = 13.sp, modifier = Modifier.weight(1.5f))
|
||||
Text("-", fontSize = 13.sp, modifier = Modifier.weight(2f))
|
||||
Text(
|
||||
text = v.loginStatus,
|
||||
fontSize = 11.sp,
|
||||
fontWeight = FontWeight.Bold,
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
}
|
||||
}
|
||||
HorizontalDivider(color = Color(0xFFE5E7EB))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -159,51 +165,55 @@ fun VeranstalterAuswahlScreen(
|
||||
Surface(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(horizontal = 24.dp, vertical = 12.dp),
|
||||
.padding(24.dp),
|
||||
color = Color(0xFFEFF6FF),
|
||||
shape = MaterialTheme.shapes.small,
|
||||
shape = MaterialTheme.shapes.medium,
|
||||
border = androidx.compose.foundation.BorderStroke(1.dp, Color(0xFFBFDBFE)),
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.padding(12.dp),
|
||||
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
||||
modifier = Modifier.padding(16.dp),
|
||||
horizontalArrangement = Arrangement.spacedBy(12.dp),
|
||||
) {
|
||||
Icon(
|
||||
Icons.Default.Info,
|
||||
contentDescription = null,
|
||||
tint = AccentBlue,
|
||||
modifier = Modifier.size(16.dp).padding(top = 2.dp),
|
||||
modifier = Modifier.size(20.dp)
|
||||
)
|
||||
Text(
|
||||
text = "Veranstalter sind Vereine, die beim österreichischen Pferdesportverband (OEPS) registriert sind. " +
|
||||
"Beim Anlegen eines neuen Veranstalters werden automatisch Login-Daten generiert und per E-Mail verschickt. " +
|
||||
"Der Veranstalter kann dann sein Profil (Logo, Kontaktdaten, etc.) selbst verwalten.",
|
||||
"Der Veranstalter kann sein Profil (Logo, Kontaktdaten, etc.) selbst verwalten.",
|
||||
fontSize = 12.sp,
|
||||
lineHeight = 18.sp,
|
||||
color = Color(0xFF1E40AF),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
HorizontalDivider()
|
||||
|
||||
// ── Aktions-Buttons ──────────────────────────────────────────────────
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(horizontal = 24.dp, vertical = 12.dp),
|
||||
horizontalArrangement = Arrangement.End,
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
OutlinedButton(onClick = onZurueck) {
|
||||
Text("Abbrechen")
|
||||
}
|
||||
Spacer(Modifier.width(12.dp))
|
||||
Button(
|
||||
onClick = { state.selectedId?.let { onWeiter(it) } },
|
||||
enabled = state.selectedId != null,
|
||||
colors = ButtonDefaults.buttonColors(containerColor = PrimaryBlue),
|
||||
Surface(shadowElevation = 8.dp, color = Color.White) {
|
||||
Row(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.padding(24.dp),
|
||||
horizontalArrangement = Arrangement.End,
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
Text("Weiter zum Veranstalter")
|
||||
TextButton(onClick = onZurueck) {
|
||||
Text("Abbrechen")
|
||||
}
|
||||
Spacer(Modifier.width(16.dp))
|
||||
Button(
|
||||
onClick = { state.selectedId?.let { onWeiter(it) } },
|
||||
enabled = state.selectedId != null,
|
||||
colors = ButtonDefaults.buttonColors(containerColor = PrimaryBlue),
|
||||
shape = MaterialTheme.shapes.medium
|
||||
) {
|
||||
Text("Weiter zur Turnier-Konfiguration")
|
||||
Spacer(Modifier.width(8.dp))
|
||||
Icon(Icons.AutoMirrored.Filled.ArrowForward, null, modifier = Modifier.size(16.dp))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-183
@@ -1,183 +0,0 @@
|
||||
package at.mocode.frontend.features.veranstalter.presentation
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.border
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.foundation.lazy.LazyColumn
|
||||
import androidx.compose.foundation.lazy.items
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.automirrored.filled.ArrowForward
|
||||
import androidx.compose.material.icons.filled.Add
|
||||
import androidx.compose.material.icons.filled.Close
|
||||
import androidx.compose.material.icons.filled.Search
|
||||
import androidx.compose.material3.*
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import at.mocode.frontend.core.designsystem.models.LoginStatus
|
||||
import at.mocode.frontend.core.designsystem.models.LoginStatusBadge
|
||||
|
||||
private val PrimaryBlue = Color(0xFF1E3A8A)
|
||||
|
||||
/**
|
||||
* Screen: "Admin - Verwaltung / Veranstalter auswählen V2"
|
||||
* Optimiert für Vision_03 mit verbesserter UI und echtem DDD-Mapping Vorbereitung.
|
||||
*/
|
||||
@Composable
|
||||
fun VeranstalterAuswahlV2(
|
||||
onZurueck: () -> Unit,
|
||||
onWeiter: (Long) -> Unit,
|
||||
onNeuerVeranstalter: () -> Unit = {},
|
||||
) {
|
||||
var selectedId by remember { mutableStateOf<Long?>(null) }
|
||||
var suchtext by remember { mutableStateOf("") }
|
||||
|
||||
// Placeholder-Daten gemäß Figma
|
||||
val veranstalter = remember {
|
||||
listOf(
|
||||
VeranstalterUiModel(
|
||||
1L,
|
||||
"Reit- und Fahrverein Wels",
|
||||
"V-OOE-1234",
|
||||
"4600 Wels",
|
||||
"Maria Huber",
|
||||
"office@rfv-wels.at",
|
||||
LoginStatus.AKTIV
|
||||
),
|
||||
VeranstalterUiModel(
|
||||
2L,
|
||||
"Pferdesportverein Linz",
|
||||
"V-OOE-5678",
|
||||
"4020 Linz",
|
||||
"Thomas Maier",
|
||||
"kontakt@psv-linz.at",
|
||||
LoginStatus.AKTIV
|
||||
),
|
||||
VeranstalterUiModel(
|
||||
3L,
|
||||
"Reitclub Eferding",
|
||||
"V-OOE-9012",
|
||||
"4070 Eferding",
|
||||
"Anna Schmid",
|
||||
"info@rc-eferding.at",
|
||||
LoginStatus.AUSSTEHEND
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
val gefiltert = veranstalter.filter {
|
||||
suchtext.isBlank() ||
|
||||
it.name.contains(suchtext, ignoreCase = true) ||
|
||||
it.oepsNummer.contains(suchtext, ignoreCase = true) ||
|
||||
it.ort.contains(suchtext, ignoreCase = true)
|
||||
}
|
||||
|
||||
Column(modifier = Modifier.fillMaxSize().background(Color.White)) {
|
||||
// Top Bar
|
||||
Surface(shadowElevation = 4.dp, color = Color.White) {
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth().padding(16.dp),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.SpaceBetween
|
||||
) {
|
||||
Column {
|
||||
Text("Veranstalter auswählen", style = MaterialTheme.typography.headlineSmall, fontWeight = FontWeight.Bold)
|
||||
Text(
|
||||
"Wählen Sie den Verein für die Veranstaltung aus.",
|
||||
style = MaterialTheme.typography.bodySmall,
|
||||
color = Color.Gray
|
||||
)
|
||||
}
|
||||
IconButton(onClick = onZurueck) {
|
||||
Icon(Icons.Default.Close, contentDescription = "Schließen")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Suche & Aktionen
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth().padding(24.dp),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.spacedBy(16.dp)
|
||||
) {
|
||||
OutlinedTextField(
|
||||
value = suchtext,
|
||||
onValueChange = { suchtext = it },
|
||||
modifier = Modifier.weight(1f),
|
||||
placeholder = { Text("Suche nach Name, OEPS-Nummer oder Ort...") },
|
||||
leadingIcon = { Icon(Icons.Default.Search, null) },
|
||||
singleLine = true
|
||||
)
|
||||
Button(
|
||||
onClick = onNeuerVeranstalter,
|
||||
colors = ButtonDefaults.buttonColors(containerColor = PrimaryBlue),
|
||||
shape = MaterialTheme.shapes.medium
|
||||
) {
|
||||
Icon(Icons.Default.Add, null)
|
||||
Spacer(Modifier.width(8.dp))
|
||||
Text("Neuer Veranstalter")
|
||||
}
|
||||
}
|
||||
|
||||
// Liste
|
||||
LazyColumn(
|
||||
modifier = Modifier.weight(1f).padding(horizontal = 24.dp),
|
||||
verticalArrangement = Arrangement.spacedBy(8.dp)
|
||||
) {
|
||||
items(gefiltert) { item ->
|
||||
val isSelected = selectedId == item.id
|
||||
Card(
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.clickable { selectedId = item.id }
|
||||
.border(
|
||||
width = 2.dp,
|
||||
color = if (isSelected) PrimaryBlue else Color.Transparent,
|
||||
shape = MaterialTheme.shapes.medium
|
||||
),
|
||||
colors = CardDefaults.cardColors(
|
||||
containerColor = if (isSelected) Color(0xFFEFF6FF) else Color(0xFFF9FAFB)
|
||||
)
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier.padding(16.dp),
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
RadioButton(selected = isSelected, onClick = { selectedId = item.id })
|
||||
Spacer(Modifier.width(16.dp))
|
||||
Column(Modifier.weight(1f)) {
|
||||
Text(item.name, fontWeight = FontWeight.Bold)
|
||||
Text("${item.oepsNummer} | ${item.ort}", style = MaterialTheme.typography.bodySmall)
|
||||
}
|
||||
LoginStatusBadge(item.loginStatus)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Footer
|
||||
Surface(shadowElevation = 8.dp, color = Color.White) {
|
||||
Row(
|
||||
modifier = Modifier.fillMaxWidth().padding(24.dp),
|
||||
horizontalArrangement = Arrangement.End,
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
TextButton(onClick = onZurueck) { Text("Abbrechen") }
|
||||
Spacer(Modifier.width(16.dp))
|
||||
Button(
|
||||
onClick = { selectedId?.let { onWeiter(it) } },
|
||||
enabled = selectedId != null,
|
||||
colors = ButtonDefaults.buttonColors(containerColor = PrimaryBlue)
|
||||
) {
|
||||
Text("Weiter zur Turnier-Konfiguration")
|
||||
Spacer(Modifier.width(8.dp))
|
||||
Icon(Icons.AutoMirrored.Filled.ArrowForward, null, modifier = Modifier.size(16.dp))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user