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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user