diff --git a/frontend/features/veranstaltung-feature/src/jvmMain/kotlin/at/mocode/veranstaltung/feature/presentation/EventWizardScreen.kt b/frontend/features/veranstaltung-feature/src/jvmMain/kotlin/at/mocode/veranstaltung/feature/presentation/EventWizardScreen.kt index 517a09b6..5155ee59 100644 --- a/frontend/features/veranstaltung-feature/src/jvmMain/kotlin/at/mocode/veranstaltung/feature/presentation/EventWizardScreen.kt +++ b/frontend/features/veranstaltung-feature/src/jvmMain/kotlin/at/mocode/veranstaltung/feature/presentation/EventWizardScreen.kt @@ -17,6 +17,9 @@ import androidx.compose.ui.unit.dp import at.mocode.frontend.core.designsystem.components.MsFilePicker import at.mocode.frontend.core.designsystem.components.MsTextField import at.mocode.frontend.core.designsystem.theme.Dimens +import at.mocode.frontend.core.domain.config.WizardFeatureFlags +import at.mocode.frontend.core.wizard.ui.WizardScaffoldWithHotkeys +import at.mocode.frontend.core.wizard.ui.WizardStepUi import at.mocode.frontend.features.turnier.presentation.TurnierWizard import at.mocode.frontend.features.zns.import.presentation.StammdatenImportScreen import kotlin.uuid.ExperimentalUuidApi @@ -31,6 +34,31 @@ fun EventWizardScreen( ) { val state = viewModel.state + // Neuer Scaffold-Weg hinter Feature-Flag (Strangler-Pattern) + if (WizardFeatureFlags.WizardRuntimeEnabled) { + EventWizardScreenScaffolded( + state = state, + onBack = { + if (state.currentStep == WizardStep.ZNS_CHECK) onBack() else viewModel.previousStep() + }, + onNext = { viewModel.nextStep() }, + onSaveDraft = null, // Wird in einem Folge-Inkrement angebunden + onFinish = onFinish, + onNavigateToVeranstalterNeu = onNavigateToVeranstalterNeu, + renderStep = { + when (state.currentStep) { + WizardStep.ZNS_CHECK -> ZnsCheckStep(viewModel) + WizardStep.VERANSTALTER_SELECTION -> VeranstalterSelectionStep(viewModel, onNavigateToVeranstalterNeu) + WizardStep.ANSPRECHPERSON_MAPPING -> AnsprechpersonMappingStep(viewModel) + WizardStep.META_DATA -> MetaDataStep(viewModel) + WizardStep.TURNIER_ANLAGE -> TurnierAnlageStep(viewModel) + WizardStep.SUMMARY -> SummaryStep(viewModel, onFinish) + } + } + ) + return + } + Scaffold( topBar = { Column { @@ -79,6 +107,62 @@ fun EventWizardScreen( } } +@Composable +private fun EventWizardScreenScaffolded( + state: VeranstaltungWizardState, + onBack: () -> Unit, + onNext: () -> Unit, + onSaveDraft: (() -> Unit)?, + onFinish: () -> Unit, + onNavigateToVeranstalterNeu: () -> Unit, + renderStep: @Composable () -> Unit +) { + val steps = remember { + WizardStep.entries.map { + // Titel schlank aus Enum ableiten; echte Strings folgen in UI-Polishing + val title = when (it) { + WizardStep.ZNS_CHECK -> "ZNS" + WizardStep.VERANSTALTER_SELECTION -> "Veranstalter" + WizardStep.ANSPRECHPERSON_MAPPING -> "Kontakt" + WizardStep.META_DATA -> "Metadaten" + WizardStep.TURNIER_ANLAGE -> "Turniere" + WizardStep.SUMMARY -> "Zusammenfassung" + } + WizardStepUi(id = it.name, title = title) + } + } + + val currentIndex = state.currentStep.ordinal + val canBack = currentIndex > 0 + val canNext = true // Validierungslogik wird schrittweise ergänzt + + WizardScaffoldWithHotkeys( + steps = steps, + currentIndex = currentIndex, + canBack = canBack, + canNext = canNext, + onBack = onBack, + onNext = if (state.currentStep == WizardStep.SUMMARY) onFinish else onNext, + onSaveDraft = onSaveDraft, + nextLabel = if (state.currentStep == WizardStep.SUMMARY) "Fertig" else "Weiter", + backLabel = "Zurück", + finishLabel = "Fertig" + ) { + // Sticky Preview oben wie gehabt + Column(modifier = Modifier.fillMaxSize()) { + VorschauCard(state = state) + Box( + modifier = Modifier + .weight(1f) + .fillMaxWidth() + .padding(Dimens.SpacingL) + ) { + renderStep() + } + } + } +} + @Composable private fun VorschauCard(state: VeranstaltungWizardState) { Card(