chore: implementiere Suche nach Veranstalter via OEPS-Nummer, verbessere UI-Flow im Veranstaltungs-Wizard und erweitere VereinRepository um OEPS-Abfrage
Desktop CI — Headless Tests & Build / Compose Desktop — Tests (headless) & Build (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., backend/infrastructure/gateway/Dockerfile, api-gateway, api-gateway) (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., backend/services/ping/Dockerfile, ping-service, ping-service) (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., config/docker/caddy/web-app/Dockerfile, web-app, web-app) (push) Has been cancelled
Build and Publish Docker Images / build-and-push (., config/docker/keycloak/Dockerfile, keycloak, keycloak) (push) Has been cancelled

Signed-off-by: StefanMoCoAt <stefan.mo.co@gmail.com>
This commit is contained in:
2026-04-21 09:27:35 +02:00
parent 30b53584f8
commit 7acd9ea4c2
17 changed files with 230 additions and 58 deletions
@@ -23,6 +23,16 @@ class DeviceInitializationViewModel(
val uiState: StateFlow<DeviceInitializationUiState> = _uiState.asStateFlow()
init {
val existingSettings = at.mocode.frontend.features.device.initialization.data.local.DeviceInitializationSettingsManager.loadSettings()
if (existingSettings != null) {
println("[DeviceInit] Bestehende Einstellungen geladen.")
_uiState.update { it.copy(
settings = existingSettings,
isLocked = existingSettings.isConfigured,
currentStep = 1 // Direkt zu Schritt 2 (Konfig), da Rolle schon gewählt
) }
}
viewModelScope.launch {
discoveryService.discoveredServices.collect { services ->
_uiState.update { it.copy(discoveredMasters = services) }
@@ -119,17 +119,15 @@ actual fun DeviceInitializationConfig(
steps = 59,
enabled = !uiState.isLocked
)
} else {
} else if (!uiState.isLocked) {
// Button zum Abschließen für Clients, da diese keinen Slider/Clients haben
Spacer(Modifier.height(8.dp))
if (!uiState.isLocked) {
Button(
onClick = { viewModel.completeInitialization() },
modifier = Modifier.fillMaxWidth(),
enabled = DeviceInitializationValidator.canContinue(settings)
) {
Text("Konfiguration abschließen")
}
Button(
onClick = { viewModel.completeInitialization() },
modifier = Modifier.fillMaxWidth(),
enabled = DeviceInitializationValidator.canContinue(settings)
) {
Text("Konfiguration abschließen")
}
}
@@ -245,7 +243,7 @@ actual fun DeviceInitializationConfig(
Text("Client hinzufügen")
}
}
} else if (settings.networkRole != NetworkRole.MASTER) {
} else if (settings.networkRole != NetworkRole.MASTER && !uiState.isLocked) {
HorizontalDivider(Modifier, DividerDefaults.Thickness, DividerDefaults.color)
Text("🔍 Verfügbare Master im Netzwerk", style = MaterialTheme.typography.titleSmall)
@@ -277,7 +275,7 @@ actual fun DeviceInitializationConfig(
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
if (settings.networkRole == NetworkRole.MASTER && uiState.isLocked) {
if (settings.networkRole == NetworkRole.MASTER && uiState.isLocked && settings.expectedClients.isNotEmpty()) {
HorizontalDivider(Modifier, DividerDefaults.Thickness, DividerDefaults.color)
Text("👥 Erwartete Clients", style = MaterialTheme.typography.titleSmall)
settings.expectedClients.forEach { client ->