Remove nennung-feature (domain models, DI modules, and UI components).

This commit is contained in:
2026-04-11 13:04:20 +02:00
parent 84128432e3
commit eda18a8ff2
22 changed files with 435 additions and 60 deletions
@@ -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)
)
}
@@ -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
)
@@ -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)
}
}