diff --git a/.gitea/workflows/docker-publish.yaml b/.gitea/workflows/docker-publish.yaml index 94431665..5cc1cefe 100644 --- a/.gitea/workflows/docker-publish.yaml +++ b/.gitea/workflows/docker-publish.yaml @@ -84,6 +84,8 @@ jobs: rm -rf "$TARGET_DIR" mkdir -p "$TARGET_DIR" cp -r "$DIST_DIR"/. "$TARGET_DIR/" + # Kopiere Turnier-Ausschreibungen (PDFs) für Plan-B + cp docs/Neumarkt2026/*.pdf "$TARGET_DIR/" || true echo "✓ Assets für Docker vorbereitet (Stand: $(date))" diff --git a/docs/Neumarkt2026/26128.pdf b/docs/Neumarkt2026/26128.pdf new file mode 100644 index 00000000..624dbe06 Binary files /dev/null and b/docs/Neumarkt2026/26128.pdf differ diff --git a/docs/Neumarkt2026/26129.pdf b/docs/Neumarkt2026/26129.pdf new file mode 100644 index 00000000..2c348ee2 Binary files /dev/null and b/docs/Neumarkt2026/26129.pdf differ diff --git a/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/web/OnlineNennungFormular.kt b/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/web/OnlineNennungFormular.kt index cf507655..8b472f02 100644 --- a/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/web/OnlineNennungFormular.kt +++ b/frontend/features/nennung-feature/src/commonMain/kotlin/at/mocode/frontend/features/nennung/presentation/web/OnlineNennungFormular.kt @@ -214,22 +214,6 @@ fun OnlineNennungFormular( color = AppColors.Primary ) - if (!isMobile) { - Text( - text = "https://nennung.mo-code.at/#/nennung/$turnierNr", - style = MaterialTheme.typography.labelMedium, - color = AppColors.Primary.copy(alpha = 0.6f), - modifier = Modifier.padding(bottom = 4.dp) - ) - Text( - text = "v2026-04-23.7 - URL-ROUTING", // Version erhöht für URL-Routing Fix - style = MaterialTheme.typography.labelLarge, - fontWeight = FontWeight.Bold, - color = Color.Blue, // Farbe geändert für neue Version - modifier = Modifier.padding(bottom = 4.dp).background(Color.Black.copy(alpha = 0.05f)) - ) - } - Text( text = "Turnier-Nr: $turnierNr | Datum: ${if (turnierNr == "26128") "25. April 2026" else "26. April 2026"}", style = MaterialTheme.typography.titleMedium, diff --git a/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt b/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt index 8a141663..d8312d43 100644 --- a/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt +++ b/frontend/shells/meldestelle-web/src/wasmJsMain/kotlin/at/mocode/frontend/shell/web/WebMainScreen.kt @@ -35,6 +35,9 @@ private fun setWindowHash(hash: String): Unit = js("window.location.hash = hash" @OptIn(ExperimentalWasmJsInterop::class) private fun onHashChange(onChanged: () -> Unit): Unit = js("window.addEventListener('hashchange', onChanged)") +@OptIn(ExperimentalWasmJsInterop::class) +private fun openInNewTab(url: String): Unit = js("window.open(url, '_blank')") + @OptIn(ExperimentalMaterial3Api::class) @Composable fun MainAppContent() { @@ -88,6 +91,9 @@ fun MainAppContent() { }, onNennenClick = { vId, tId -> currentScreen = WebScreen.Nennung(vId, tId) + }, + onAusschreibungClick = { pdfUrl -> + openInNewTab(pdfUrl) } ) @@ -112,6 +118,15 @@ fun MainAppContent() { onBack = { currentScreen = WebScreen.Landing } ) } + + // Dezentraler Versions-Marker in der unteren rechten Ecke + Box(modifier = Modifier.fillMaxSize().padding(8.dp), contentAlignment = Alignment.BottomEnd) { + Text( + text = "v2026-04-23.9", + style = MaterialTheme.typography.labelSmall, + color = Color.LightGray.copy(alpha = 0.5f) + ) + } } } } @@ -149,7 +164,8 @@ fun Erfolgsscreen(email: String, onBack: () -> Unit) { @Composable fun LandingPage( onVeranstaltungClick: (Long) -> Unit, - onNennenClick: (Long, Long) -> Unit + onNennenClick: (Long, Long) -> Unit, + onAusschreibungClick: (String) -> Unit ) { val veranstaltungen = remember { listOf( @@ -195,7 +211,8 @@ fun LandingPage( items(veranstaltungen) { veranstaltung -> VeranstaltungsCardWeb( veranstaltung = veranstaltung, - onNennenClick = { tId -> onNennenClick(veranstaltung.id, tId) } + onNennenClick = { tId -> onNennenClick(veranstaltung.id, tId) }, + onAusschreibungClick = onAusschreibungClick ) } } @@ -204,7 +221,8 @@ fun LandingPage( @Composable fun VeranstaltungsCardWeb( veranstaltung: VeranstaltungWebModel, - onNennenClick: (Long) -> Unit + onNennenClick: (Long) -> Unit, + onAusschreibungClick: (String) -> Unit ) { Card( modifier = Modifier.fillMaxWidth(), @@ -230,7 +248,8 @@ fun VeranstaltungsCardWeb( veranstaltung.turniere.forEach { turnier -> TurnierCardWeb( turnier = turnier, - onNennenClick = { onNennenClick(turnier.id) } + onNennenClick = { onNennenClick(turnier.id) }, + onAusschreibungClick = { onAusschreibungClick(turnier.pdfUrl) } ) } } @@ -240,7 +259,8 @@ fun VeranstaltungsCardWeb( @Composable fun TurnierCardWeb( turnier: TurnierWebModel, - onNennenClick: () -> Unit + onNennenClick: () -> Unit, + onAusschreibungClick: () -> Unit ) { BoxWithConstraints { val isMobile = maxWidth < 500.dp @@ -258,7 +278,7 @@ fun TurnierCardWeb( horizontalArrangement = Arrangement.spacedBy(8.dp) ) { TextButton( - onClick = { /* PDF öffnen Logik */ }, + onClick = onAusschreibungClick, modifier = Modifier.weight(1f) ) { Icon(Icons.Default.Description, contentDescription = null) @@ -287,7 +307,7 @@ fun TurnierCardWeb( } Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { - TextButton(onClick = { /* PDF öffnen Logik */ }) { + TextButton(onClick = onAusschreibungClick) { Icon(Icons.Default.Description, contentDescription = null) Spacer(Modifier.width(4.dp)) Text("Ausschreibung")