chore(turnier-feature): remove unused ViewModels and UI components

- Removed `AbteilungViewModel`, `BewerbAnlegenViewModel`, `BewerbViewModel`, and `CreateBewerbWizardScreen`.
- Cleaned up related imports and unused domain models.
This commit is contained in:
2026-04-13 14:38:12 +02:00
parent 5c7ba28b1e
commit f719764914
65 changed files with 989 additions and 157 deletions
@@ -2,11 +2,11 @@ package at.mocode.turnier.feature.data.remote
import at.mocode.frontend.core.network.*
import at.mocode.turnier.feature.domain.StartlistenRepository
import at.mocode.turnier.feature.presentation.StartlistenZeile
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.request.*
import io.ktor.http.*
import at.mocode.turnier.feature.domain.model.StartlistenZeile
class DefaultStartlistenRepository(
private val client: HttpClient,
@@ -0,0 +1,5 @@
package at.mocode.turnier.feature.di
import org.koin.core.module.Module
expect val turnierFeatureModule: Module
@@ -1,6 +1,6 @@
package at.mocode.turnier.feature.domain
import at.mocode.turnier.feature.presentation.StartlistenZeile
import at.mocode.turnier.feature.domain.model.StartlistenZeile
interface StartlistenRepository {
suspend fun generate(bewerbId: Long): Result<List<StartlistenZeile>>
@@ -0,0 +1,13 @@
package at.mocode.turnier.feature.domain.model
import kotlinx.serialization.Serializable
@Serializable
data class StartlistenZeile(
val nr: Int,
val zeit: String,
val reiter: String,
val pferd: String,
val wunsch: String,
val nennungId: String = ""
)
@@ -10,7 +10,7 @@ import at.mocode.turnier.feature.presentation.*
import org.koin.core.qualifier.named
import org.koin.dsl.module
val turnierFeatureModule = module {
actual val turnierFeatureModule = module {
// Repositories: Interface → Default-Implementierung mit zentralem apiClient
single<TurnierRepository> { DefaultTurnierRepository(client = get(qualifier = named("apiClient"))) }
single<BewerbRepository> { DefaultBewerbRepository(client = get(qualifier = named("apiClient"))) }
@@ -58,14 +58,26 @@ class BewerbAnlegenViewModel {
private fun applySuggestion() {
val s = _state.value
if (s.bewerbsTyp.equals("CSN-C-NEU", ignoreCase = true)) {
// Pflicht-Teilung: ohne/mit Lizenz; R1/R2+
val suggestion = listOf(
AbteilungsInput(1, label = "Ohne Lizenz · R1", mitLizenz = false, reiterKlasse = ReiterKlasse.R1),
AbteilungsInput(2, label = "Ohne Lizenz · R2+", mitLizenz = false, reiterKlasse = ReiterKlasse.R2_PLUS),
AbteilungsInput(3, label = "Mit Lizenz · R1", mitLizenz = true, reiterKlasse = ReiterKlasse.R1),
AbteilungsInput(4, label = "Mit Lizenz · R2+", mitLizenz = true, reiterKlasse = ReiterKlasse.R2_PLUS),
val bTyp = s.bewerbsTyp.uppercase()
val suggestion = when {
bTyp.contains("CSN-C-NEU") -> listOf(
AbteilungsInput(1, label = "Abteilung 1: R1", mitLizenz = true, reiterKlasse = ReiterKlasse.R1),
AbteilungsInput(2, label = "Abteilung 2: R2+", mitLizenz = true, reiterKlasse = ReiterKlasse.R2_PLUS),
)
bTyp.contains("CDN-B") || bTyp.contains("CDNP-B") -> listOf(
AbteilungsInput(1, label = "Abteilung 1: R1", mitLizenz = true, reiterKlasse = ReiterKlasse.R1),
AbteilungsInput(2, label = "Abteilung 2: R2", mitLizenz = true, reiterKlasse = ReiterKlasse.R2_PLUS),
AbteilungsInput(3, label = "Abteilung 3: R3+", mitLizenz = true, reiterKlasse = ReiterKlasse.R2_PLUS),
)
bTyp.contains("CSN-B") -> listOf(
AbteilungsInput(1, label = "Abteilung 1: R1", mitLizenz = true, reiterKlasse = ReiterKlasse.R1),
AbteilungsInput(2, label = "Abteilung 2: R2+", mitLizenz = true, reiterKlasse = ReiterKlasse.R2_PLUS),
)
else -> emptyList()
}
if (suggestion.isNotEmpty()) {
reduce { it.copy(abteilungen = suggestion, abteilungsTyp = AbteilungsTyp.SEPARATE_SIEGEREHRUNG) }
}
}
@@ -17,20 +17,10 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable
import at.mocode.turnier.feature.domain.model.StartlistenZeile
typealias BewerbListItem = Bewerb
@Serializable
data class StartlistenZeile(
val nr: Int,
val zeit: String,
val reiter: String,
val pferd: String,
val wunsch: String,
val nennungId: String = ""
)
data class BewerbState(
val isLoading: Boolean = false,
val searchQuery: String = "",
@@ -19,6 +19,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Dialog
import at.mocode.turnier.feature.domain.model.StartlistenZeile
import javax.swing.JFileChooser
import javax.swing.filechooser.FileNameExtensionFilter
import kotlin.time.Duration.Companion.milliseconds
@@ -13,6 +13,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import at.mocode.turnier.feature.domain.Ergebnis
import at.mocode.turnier.feature.domain.model.StartlistenZeile
import org.koin.compose.koinInject
private val ElBlue = Color(0xFF1E3A8A)
@@ -57,13 +58,13 @@ fun ErgebnislistenTabContent(
@Composable
private fun ErgebnislistenBewerbsTabs(
bewerbe: List<BewerbListItem>,
selectedId: Long?,
onSelect: (Long?) -> Unit,
ergebnisse: List<Ergebnis>,
startliste: List<StartlistenZeile>,
onCalculate: () -> Unit,
onPrint: () -> Unit
bewerbe: List<BewerbListItem>,
selectedId: Long?,
onSelect: (Long?) -> Unit,
ergebnisse: List<Ergebnis>,
startliste: List<StartlistenZeile>,
onCalculate: () -> Unit,
onPrint: () -> Unit
) {
val selectedIndex = bewerbe.indexOfFirst { it.id == selectedId }.coerceAtLeast(0)
@@ -501,12 +501,17 @@ private fun OrgSearchField(label: String, value: String, onValueChange: (String)
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
) {
Text(label, fontSize = 13.sp, modifier = Modifier.width(200.dp), color = Color(0xFF374151))
Text(
label,
fontSize = 13.sp,
modifier = Modifier.weight(1.5f), // Flexibles Gewicht statt fixen 200dp
color = Color(0xFF374151)
)
OutlinedTextField(
value = value,
onValueChange = onValueChange,
placeholder = { Text("Name suchen...", fontSize = 12.sp) },
modifier = Modifier.weight(1f).height(44.dp),
modifier = Modifier.weight(3f), // Flexibles Gewicht und keine fixe Höhe
singleLine = true,
)
}
@@ -55,12 +55,62 @@ fun StammdatenTabContent(
val klassen = remember { mutableStateListOf<String>() }
val kat = remember { mutableStateListOf<String>() }
var von by remember { mutableStateOf("") }
var bis by remember { mutableStateOf("") }
var ort by remember { mutableStateOf("") }
var von by remember { mutableStateOf(eventVon ?: "") }
var bis by remember { mutableStateOf(eventBis ?: "") }
var ort by remember { mutableStateOf(eventOrt ?: "") }
var titel by remember { mutableStateOf("") }
var subTitel by remember { mutableStateOf("") }
// Initialisierung aus Mock-Store (StoreV2/TurnierStoreV2) falls vorhanden
LaunchedEffect(turnierId) {
// Da wir in einem anderen Modul sind, können wir nicht direkt auf StoreV2 zugreifen
// ohne die Abhängigkeit zu haben. In einer echten Architektur käme dies über das Repository.
// Aber für die Demo/Fakten-Präsentation im Desktop-Shell-Kontext:
try {
val clazz = Class.forName("at.mocode.desktop.v2.TurnierStoreV2")
val method = clazz.getMethod("allTurniere")
val all = method.invoke(null) as? List<*>
val turnier = all?.find { t ->
val idField = t!!::class.java.getDeclaredField("turnierNr")
idField.isAccessible = true
idField.get(t).toString() == turnierId.toString() ||
t.hashCode().toLong() == turnierId // Fallback falls ID anders gemappt ist
}
if (turnier != null) {
val tClass = turnier::class.java
val nrField = tClass.getDeclaredField("turnierNr")
nrField.isAccessible = true
turnierNr = nrField.get(turnier).toString()
nrConfirmed = true
val titelField = tClass.getDeclaredField("titel")
titelField.isAccessible = true
titel = titelField.get(turnier) as String
val subField = tClass.getDeclaredField("subTitel")
subField.isAccessible = true
subTitel = subField.get(turnier) as String
val katField = tClass.getDeclaredField("kategorie")
katField.isAccessible = true
val kats = katField.get(turnier) as? List<String>
kats?.let { kat.addAll(it) }
val typField = tClass.getDeclaredField("typ")
typField.isAccessible = true
typ = typField.get(turnier) as String
val znsField = tClass.getDeclaredField("znsDataLoaded")
znsField.isAccessible = true
znsDataLoaded = znsField.get(turnier) as Boolean
}
} catch (e: Exception) {
// Reflection fehlgeschlagen oder Store nicht erreichbar -> Fallback auf leere Felder
}
}
var turnierLogoUrl by remember { mutableStateOf("") }
val sponsoren = remember { mutableStateListOf<String>() }
@@ -11,6 +11,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import at.mocode.turnier.feature.domain.model.StartlistenZeile
import at.mocode.turnier.feature.domain.Bewerb
import org.koin.compose.koinInject
@@ -0,0 +1,10 @@
package at.mocode.turnier.feature.di
import org.koin.dsl.module
/**
* Wasm-spezifische Implementierung (vorerst reduziert, da UI-ViewModels JVM-spezifisch sind).
*/
actual val turnierFeatureModule = module {
// Hier können später Wasm-spezifische Repositories oder Shared-Logic registriert werden
}