Remove nennung-feature (domain models, DI modules, and UI components).
This commit is contained in:
+17
@@ -0,0 +1,17 @@
|
||||
package at.mocode.frontend.features.funktionaer.di
|
||||
|
||||
import at.mocode.frontend.features.funktionaer.presentation.*
|
||||
import org.koin.dsl.module
|
||||
|
||||
val funktionaerModule = module {
|
||||
single<FunktionaerRepository> { MockFunktionaerRepository() }
|
||||
factory { FunktionaerViewModel(get()) }
|
||||
}
|
||||
|
||||
class MockFunktionaerRepository : FunktionaerRepository {
|
||||
override suspend fun list(): List<FunktionaerListItem> = listOf(
|
||||
FunktionaerListItem(1, "Wolfgang Schier", "RICHTER", "G3"),
|
||||
FunktionaerListItem(2, "Alice Schwab", "RICHTER", "INTERNATIONAL"),
|
||||
FunktionaerListItem(3, "Dietmar Gstöttner", "PARCOURSBAUER", null)
|
||||
)
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
package at.mocode.frontend.features.funktionaer.domain
|
||||
|
||||
data class Funktionaer(
|
||||
val id: Long,
|
||||
val vorname: String,
|
||||
val nachname: String,
|
||||
val richterNummer: String? = null,
|
||||
val rollen: List<String> = emptyList(),
|
||||
val richterQualifikation: String? = null,
|
||||
val qualifiziertFuerSparten: List<String> = emptyList(),
|
||||
val email: String? = null,
|
||||
val telefon: String? = null,
|
||||
val vereinsNummer: String? = null,
|
||||
val istAktiv: Boolean = true
|
||||
)
|
||||
+103
@@ -0,0 +1,103 @@
|
||||
package at.mocode.frontend.features.funktionaer.presentation
|
||||
|
||||
import androidx.compose.foundation.layout.*
|
||||
import androidx.compose.material3.CircularProgressIndicator
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.unit.dp
|
||||
import at.mocode.frontend.core.designsystem.components.*
|
||||
import at.mocode.frontend.core.designsystem.models.PlaceholderContent
|
||||
|
||||
@Composable
|
||||
fun FunktionaerScreen(
|
||||
viewModel: FunktionaerViewModel
|
||||
) {
|
||||
val state by viewModel.state.collectAsState()
|
||||
|
||||
MsMasterDetailLayout(
|
||||
master = {
|
||||
FunktionaerListContent(
|
||||
state = state,
|
||||
onSearchChange = { viewModel.send(FunktionaerIntent.SearchChanged(it)) },
|
||||
onFunktionaerSelected = { viewModel.send(FunktionaerIntent.Select(it)) }
|
||||
)
|
||||
},
|
||||
detail = {
|
||||
if (state.selectedId != null) {
|
||||
val selected = state.list.find { it.id == state.selectedId }
|
||||
if (selected != null) {
|
||||
FunktionaerDetailContent(selected)
|
||||
}
|
||||
} else {
|
||||
PlaceholderContent(
|
||||
title = "Kein Funktionär ausgewählt",
|
||||
subtitle = "Wählen Sie einen Funktionär aus der Liste aus."
|
||||
)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun FunktionaerListContent(
|
||||
state: FunktionaerState,
|
||||
onSearchChange: (String) -> Unit,
|
||||
onFunktionaerSelected: (Long) -> Unit
|
||||
) {
|
||||
Column(modifier = Modifier.fillMaxSize()) {
|
||||
MsFilterBar(
|
||||
searchQuery = state.searchQuery,
|
||||
onSearchQueryChange = onSearchChange,
|
||||
resultCount = state.filtered.size
|
||||
)
|
||||
|
||||
Spacer(Modifier.height(8.dp))
|
||||
|
||||
if (state.isLoading) {
|
||||
Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
|
||||
CircularProgressIndicator()
|
||||
}
|
||||
} else {
|
||||
MsDataTable(
|
||||
items = state.filtered,
|
||||
columns = listOf(
|
||||
MsColumnDefinition(
|
||||
title = "Name",
|
||||
weight = 1f,
|
||||
cellRenderer = { Text(it.name, style = MaterialTheme.typography.bodySmall) }
|
||||
),
|
||||
MsColumnDefinition(
|
||||
title = "Rolle",
|
||||
width = 150.dp,
|
||||
cellRenderer = { Text(it.rolle, style = MaterialTheme.typography.bodySmall) }
|
||||
),
|
||||
MsColumnDefinition(
|
||||
title = "Lizenz",
|
||||
width = 100.dp,
|
||||
cellRenderer = { Text(it.lizenz ?: "-", style = MaterialTheme.typography.bodySmall) }
|
||||
)
|
||||
),
|
||||
onRowClick = { onFunktionaerSelected(it.id) }
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun FunktionaerDetailContent(item: FunktionaerListItem) {
|
||||
Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {
|
||||
Text(item.name, style = MaterialTheme.typography.headlineMedium)
|
||||
Spacer(Modifier.height(8.dp))
|
||||
Text("Rolle: ${item.rolle}", style = MaterialTheme.typography.bodyLarge)
|
||||
item.lizenz?.let {
|
||||
Text("Lizenz: $it", style = MaterialTheme.typography.bodyLarge)
|
||||
}
|
||||
Spacer(Modifier.height(24.dp))
|
||||
Text("Weitere Details folgen in der nächsten Ausbaustufe.", style = MaterialTheme.typography.bodyMedium)
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
package at.mocode.nennung.feature.di
|
||||
package at.mocode.frontend.features.nennung.di
|
||||
|
||||
import at.mocode.nennung.feature.presentation.NennungViewModel
|
||||
import at.mocode.frontend.features.nennung.presentation.NennungViewModel
|
||||
import org.koin.core.module.dsl.viewModel
|
||||
import org.koin.dsl.module
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package at.mocode.nennung.feature.domain
|
||||
package at.mocode.frontend.features.nennung.domain
|
||||
|
||||
// --- Pferd ---
|
||||
data class Pferd(
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
package at.mocode.nennung.feature.presentation
|
||||
package at.mocode.frontend.features.nennung.presentation
|
||||
|
||||
import at.mocode.nennung.feature.domain.*
|
||||
import at.mocode.frontend.features.nennung.domain.*
|
||||
import androidx.lifecycle.ViewModel
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
package at.mocode.nennung.feature.presentation
|
||||
package at.mocode.frontend.features.nennung.presentation
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.clickable
|
||||
@@ -17,7 +17,7 @@ import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import at.mocode.nennung.feature.domain.*
|
||||
import at.mocode.frontend.features.nennung.domain.*
|
||||
|
||||
// Farben für Startwunsch-Markierung
|
||||
private val FarbeVorne = Color(0xFFE8F5E9) // Grün
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
package at.mocode.frontend.features.pferde.di
|
||||
|
||||
import at.mocode.frontend.features.pferde.presentation.PferdeViewModel
|
||||
import org.koin.dsl.module
|
||||
|
||||
val pferdeModule = module {
|
||||
factory { PferdeViewModel() }
|
||||
}
|
||||
+6
-1
@@ -12,7 +12,12 @@ data class Pferd(
|
||||
val geschlecht: Geschlecht = Geschlecht.WALLACH,
|
||||
val farbe: String = "",
|
||||
val geburtsjahr: Int? = null,
|
||||
val status: PferdeStatus = PferdeStatus.AKTIV
|
||||
val status: PferdeStatus = PferdeStatus.AKTIV,
|
||||
val feiId: String? = null,
|
||||
val oepsNummer: String? = null,
|
||||
val vater: String? = null,
|
||||
val mutter: String? = null,
|
||||
val besitzer: String? = null
|
||||
)
|
||||
|
||||
enum class Geschlecht(val label: String) {
|
||||
|
||||
+38
-6
@@ -38,6 +38,9 @@ fun PferdeScreen(
|
||||
onFarbeChange = viewModel::onEditFarbeChange,
|
||||
onGeburtsjahrChange = viewModel::onEditGeburtsjahrChange,
|
||||
onStatusChange = viewModel::onEditStatusChange,
|
||||
onFeiIdChange = viewModel::onEditFeiIdChange,
|
||||
onOepsNummerChange = viewModel::onEditOepsNummerChange,
|
||||
onBesitzerChange = viewModel::onEditBesitzerChange,
|
||||
onSave = viewModel::onSave,
|
||||
onCancel = viewModel::onCancel
|
||||
)
|
||||
@@ -105,6 +108,9 @@ private fun PferdeEditorContent(
|
||||
onFarbeChange: (String) -> Unit,
|
||||
onGeburtsjahrChange: (String) -> Unit,
|
||||
onStatusChange: (PferdeStatus) -> Unit,
|
||||
onFeiIdChange: (String) -> Unit,
|
||||
onOepsNummerChange: (String) -> Unit,
|
||||
onBesitzerChange: (String) -> Unit,
|
||||
onSave: () -> Unit,
|
||||
onCancel: () -> Unit
|
||||
) {
|
||||
@@ -134,6 +140,23 @@ private fun PferdeEditorContent(
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
|
||||
MsTextField(
|
||||
value = uiState.editFeiId,
|
||||
onValueChange = onFeiIdChange,
|
||||
label = "FEI ID",
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
MsTextField(
|
||||
value = uiState.editOepsNummer,
|
||||
onValueChange = onOepsNummerChange,
|
||||
label = "ÖPS Nummer",
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
}
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
|
||||
MsEnumDropdown(
|
||||
label = "Geschlecht",
|
||||
@@ -160,16 +183,25 @@ private fun PferdeEditorContent(
|
||||
label = "Geburtsjahr",
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
MsEnumDropdown(
|
||||
label = "Status",
|
||||
options = PferdeStatus.entries.toTypedArray(),
|
||||
selectedOption = uiState.editStatus,
|
||||
onOptionSelected = onStatusChange,
|
||||
optionLabel = { it.label },
|
||||
MsTextField(
|
||||
value = uiState.editBesitzer,
|
||||
onValueChange = onBesitzerChange,
|
||||
label = "Besitzer",
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
}
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
MsEnumDropdown(
|
||||
label = "Status",
|
||||
options = PferdeStatus.entries.toTypedArray(),
|
||||
selectedOption = uiState.editStatus,
|
||||
onOptionSelected = onStatusChange,
|
||||
optionLabel = { it.label },
|
||||
modifier = Modifier.width(300.dp)
|
||||
)
|
||||
|
||||
Spacer(Modifier.height(24.dp))
|
||||
|
||||
if (uiState.editStatus == PferdeStatus.INAKTIV) {
|
||||
|
||||
+22
-3
@@ -3,6 +3,7 @@ package at.mocode.frontend.features.pferde.presentation
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.lifecycle.ViewModel
|
||||
import at.mocode.frontend.features.pferde.domain.Geschlecht
|
||||
import at.mocode.frontend.features.pferde.domain.Pferd
|
||||
import at.mocode.frontend.features.pferde.domain.PferdeStatus
|
||||
@@ -21,13 +22,16 @@ data class PferdeUiState(
|
||||
val editGeschlecht: Geschlecht = Geschlecht.WALLACH,
|
||||
val editFarbe: String = "",
|
||||
val editGeburtsjahr: String = "",
|
||||
val editStatus: PferdeStatus = PferdeStatus.AKTIV
|
||||
val editStatus: PferdeStatus = PferdeStatus.AKTIV,
|
||||
val editFeiId: String = "",
|
||||
val editOepsNummer: String = "",
|
||||
val editBesitzer: String = ""
|
||||
)
|
||||
|
||||
/**
|
||||
* ViewModel für die Pferde-Verwaltung.
|
||||
*/
|
||||
open class PferdeViewModel(initialLoad: Boolean = true) {
|
||||
open class PferdeViewModel(initialLoad: Boolean = true) : ViewModel() {
|
||||
var uiState by mutableStateOf(PferdeUiState())
|
||||
protected set
|
||||
|
||||
@@ -60,10 +64,25 @@ open class PferdeViewModel(initialLoad: Boolean = true) {
|
||||
editGeschlecht = pferd.geschlecht,
|
||||
editFarbe = pferd.farbe,
|
||||
editGeburtsjahr = pferd.geburtsjahr?.toString() ?: "",
|
||||
editStatus = pferd.status
|
||||
editStatus = pferd.status,
|
||||
editFeiId = pferd.feiId ?: "",
|
||||
editOepsNummer = pferd.oepsNummer ?: "",
|
||||
editBesitzer = pferd.besitzer ?: ""
|
||||
)
|
||||
}
|
||||
|
||||
fun onEditFeiIdChange(value: String) {
|
||||
uiState = uiState.copy(editFeiId = value)
|
||||
}
|
||||
|
||||
fun onEditOepsNummerChange(value: String) {
|
||||
uiState = uiState.copy(editOepsNummer = value)
|
||||
}
|
||||
|
||||
fun onEditBesitzerChange(value: String) {
|
||||
uiState = uiState.copy(editBesitzer = value)
|
||||
}
|
||||
|
||||
fun onEditNameChange(value: String) {
|
||||
uiState = uiState.copy(editName = value)
|
||||
}
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
package at.mocode.frontend.features.reiter.di
|
||||
|
||||
import at.mocode.frontend.features.reiter.presentation.ReiterViewModel
|
||||
import org.koin.dsl.module
|
||||
|
||||
val reiterModule = module {
|
||||
factory { ReiterViewModel() }
|
||||
}
|
||||
+7
-1
@@ -12,7 +12,13 @@ data class Reiter(
|
||||
val satznummer: String?,
|
||||
val lizenz: LizenzKlasse = LizenzKlasse.KEINE,
|
||||
val sparte: Sparte = Sparte.KEINE,
|
||||
val status: ReiterStatus = ReiterStatus.AKTIV
|
||||
val status: ReiterStatus = ReiterStatus.AKTIV,
|
||||
val feiId: String? = null,
|
||||
val oepsNummer: String? = null,
|
||||
val geburtsdatum: String? = null,
|
||||
val email: String? = null,
|
||||
val telefon: String? = null,
|
||||
val verein: String? = null
|
||||
) {
|
||||
val name: String get() = "$vorname $nachname"
|
||||
}
|
||||
|
||||
+63
@@ -34,6 +34,12 @@ fun ReiterScreen(
|
||||
onNachnameChange = viewModel::onEditNameChange,
|
||||
onLizenzChange = viewModel::onEditLizenzChange,
|
||||
onSparteChange = viewModel::onEditSparteChange,
|
||||
onFeiIdChange = viewModel::onEditFeiIdChange,
|
||||
onOepsNummerChange = viewModel::onEditOepsNummerChange,
|
||||
onGeburtsdatumChange = viewModel::onEditGeburtsdatumChange,
|
||||
onEmailChange = viewModel::onEditEmailChange,
|
||||
onTelefonChange = viewModel::onEditTelefonChange,
|
||||
onVereinChange = viewModel::onEditVereinChange,
|
||||
onSave = viewModel::onSave,
|
||||
onCancel = viewModel::onCancel
|
||||
)
|
||||
@@ -104,6 +110,12 @@ private fun ReiterEditorContent(
|
||||
onNachnameChange: (String) -> Unit,
|
||||
onLizenzChange: (LizenzKlasse) -> Unit,
|
||||
onSparteChange: (Sparte) -> Unit,
|
||||
onFeiIdChange: (String) -> Unit,
|
||||
onOepsNummerChange: (String) -> Unit,
|
||||
onGeburtsdatumChange: (String) -> Unit,
|
||||
onEmailChange: (String) -> Unit,
|
||||
onTelefonChange: (String) -> Unit,
|
||||
onVereinChange: (String) -> Unit,
|
||||
onSave: () -> Unit,
|
||||
onCancel: () -> Unit
|
||||
) {
|
||||
@@ -133,6 +145,57 @@ private fun ReiterEditorContent(
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
|
||||
MsTextField(
|
||||
value = uiState.editFeiId,
|
||||
onValueChange = onFeiIdChange,
|
||||
label = "FEI ID",
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
MsTextField(
|
||||
value = uiState.editOepsNummer,
|
||||
onValueChange = onOepsNummerChange,
|
||||
label = "ÖPS Nummer",
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
}
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
|
||||
MsTextField(
|
||||
value = uiState.editGeburtsdatum,
|
||||
onValueChange = onGeburtsdatumChange,
|
||||
label = "Geburtsdatum",
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
MsTextField(
|
||||
value = uiState.editVerein,
|
||||
onValueChange = onVereinChange,
|
||||
label = "Verein",
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
}
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
|
||||
MsTextField(
|
||||
value = uiState.editEmail,
|
||||
onValueChange = onEmailChange,
|
||||
label = "E-Mail",
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
MsTextField(
|
||||
value = uiState.editTelefon,
|
||||
onValueChange = onTelefonChange,
|
||||
label = "Telefon",
|
||||
modifier = Modifier.weight(1f)
|
||||
)
|
||||
}
|
||||
|
||||
Spacer(Modifier.height(16.dp))
|
||||
|
||||
Row(horizontalArrangement = Arrangement.spacedBy(16.dp)) {
|
||||
MsEnumDropdown(
|
||||
label = "Lizenzklasse",
|
||||
|
||||
+23
-3
@@ -3,6 +3,7 @@ package at.mocode.frontend.features.reiter.presentation
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.lifecycle.ViewModel
|
||||
import at.mocode.frontend.features.reiter.domain.LizenzKlasse
|
||||
import at.mocode.frontend.features.reiter.domain.Reiter
|
||||
import at.mocode.frontend.features.reiter.domain.ReiterStatus
|
||||
@@ -21,14 +22,20 @@ data class ReiterUiState(
|
||||
val editVorname: String = "",
|
||||
val editLizenz: LizenzKlasse = LizenzKlasse.KEINE,
|
||||
val editSparte: Sparte = Sparte.KEINE,
|
||||
val editStatus: ReiterStatus = ReiterStatus.AKTIV
|
||||
val editStatus: ReiterStatus = ReiterStatus.AKTIV,
|
||||
val editFeiId: String = "",
|
||||
val editOepsNummer: String = "",
|
||||
val editGeburtsdatum: String = "",
|
||||
val editEmail: String = "",
|
||||
val editTelefon: String = "",
|
||||
val editVerein: String = ""
|
||||
)
|
||||
|
||||
/**
|
||||
* ViewModel für die Reiter-Verwaltung.
|
||||
* In einem echten Szenario würden wir hier ein Repository injizieren.
|
||||
*/
|
||||
open class ReiterViewModel(initialLoad: Boolean = true) {
|
||||
open class ReiterViewModel(initialLoad: Boolean = true) : ViewModel() {
|
||||
var uiState by mutableStateOf(ReiterUiState())
|
||||
protected set
|
||||
|
||||
@@ -62,10 +69,23 @@ open class ReiterViewModel(initialLoad: Boolean = true) {
|
||||
editName = reiter.nachname,
|
||||
editLizenz = reiter.lizenz,
|
||||
editSparte = reiter.sparte,
|
||||
editStatus = reiter.status
|
||||
editStatus = reiter.status,
|
||||
editFeiId = reiter.feiId ?: "",
|
||||
editOepsNummer = reiter.oepsNummer ?: "",
|
||||
editGeburtsdatum = reiter.geburtsdatum ?: "",
|
||||
editEmail = reiter.email ?: "",
|
||||
editTelefon = reiter.telefon ?: "",
|
||||
editVerein = reiter.verein ?: ""
|
||||
)
|
||||
}
|
||||
|
||||
fun onEditFeiIdChange(value: String) { uiState = uiState.copy(editFeiId = value) }
|
||||
fun onEditOepsNummerChange(value: String) { uiState = uiState.copy(editOepsNummer = value) }
|
||||
fun onEditGeburtsdatumChange(value: String) { uiState = uiState.copy(editGeburtsdatum = value) }
|
||||
fun onEditEmailChange(value: String) { uiState = uiState.copy(editEmail = value) }
|
||||
fun onEditTelefonChange(value: String) { uiState = uiState.copy(editTelefon = value) }
|
||||
fun onEditVereinChange(value: String) { uiState = uiState.copy(editVerein = value) }
|
||||
|
||||
fun onEditVornameChange(value: String) {
|
||||
uiState = uiState.copy(editVorname = value)
|
||||
}
|
||||
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
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
|
||||
)
|
||||
Reference in New Issue
Block a user