chore: remove obsolete screens from meldestelle-desktop module
Build and Publish Docker Images / build-and-push (., backend/infrastructure/gateway/Dockerfile, api-gateway, api-gateway) (push) Failing after 2m56s
Build and Publish Docker Images / build-and-push (., backend/services/ping/Dockerfile, ping-service, ping-service) (push) Failing after 3m3s
Build and Publish Docker Images / build-and-push (., config/docker/caddy/web-app/Dockerfile, web-app, web-app) (push) Failing after 2m49s
Build and Publish Docker Images / build-and-push (., config/docker/keycloak/Dockerfile, keycloak, keycloak) (push) Successful in 2m13s

- Deleted unused screens including `AdminUebersichtScreen`, `AktorScreens`, `StammdatenImportScreen`, `TurnierDetailScreen`, and supporting components such as `PlaceholderContent`.
- Cleaned up references and placeholders to streamline module structure.

Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
2026-03-26 15:08:38 +01:00
parent 1d393fdefe
commit c2b3b5889f
50 changed files with 5067 additions and 1016 deletions
+163
View File
@@ -0,0 +1,163 @@
# Frontend-Architektur-Richtlinien
> **Status:** Verbindlich ab 26.03.2026
> **Zuständig:** 🏗️ Lead Architect
> **Zweck:** Verhindert Architektur-Drift und inkonsistente Schichtentrennung.
---
## Die 3 Schichten
```
frontend/
├── core/ ← Infrastruktur (plattformübergreifend, kein Business-Code)
├── features/ ← Fachliche Bausteine (je ein Bounded Context)
└── shells/ ← Ausführbare Apps (nur Verdrahtung, kein Fach-UI)
```
---
## Schicht 1: `core/`
### Aufgabe
Gemeinsame Infrastruktur, die von **allen** Features und Shells genutzt wird.
### Module
| Modul | Inhalt |
|-----------------|-----------------------------------------------------------------|
| `auth` | Login, Token-Management, OIDC/PKCE, `LoginScreen` |
| `design-system` | Farben, Typografie, gemeinsame UI-Komponenten, `SharedUiModels` |
| `domain` | Gemeinsame Domain-Modelle (plattformübergreifend) |
| `navigation` | `AppScreen`-Sealed-Class (einzige Wahrheit über alle Routen) |
| `network` | Ktor-Client, `NetworkConfig` |
| `local-db` | SQLDelight/Room-Setup, `DatabaseProvider` |
| `sync` | Offline-Sync-Infrastruktur |
### Regeln
- ✅ Darf importieren: externe Libraries, andere `core`-Module (keine Zyklen)
- ❌ Darf NICHT importieren: `features/*`, `shells/*`
- ❌ Kein Business-Code, keine fachlichen Screens
---
## Schicht 2: `features/`
### Aufgabe
Jedes Feature kapselt **einen Bounded Context** vollständig: Daten, Logik und UI.
### Pflicht-Struktur eines Feature-Moduls
```
features/<name>-feature/
└── src/
└── jvmMain/kotlin/at/mocode/<name>/feature/
├── data/ ← Repository, API-Client
├── domain/ ← Modelle, Use Cases
├── presentation/ ← ViewModel + Screen-Composables ← PFLICHT
└── di/ ← Koin-Module
```
### Vorhandene Features
| Feature | Bounded Context |
|-------------------------|-----------------------------------------------|
| `ping-feature` | Verbindungstest / Sync-Status |
| `nennung-feature` | Nennungs-Erfassung am Turnier |
| `zns-import-feature` | ZNS-Stammdaten-Import |
| `veranstalter-feature` | Veranstalter-Auswahl, -Detail, -Neuanlage |
| `veranstaltung-feature` | Veranstaltungs-Übersicht, -Detail, -Neuanlage |
| `turnier-feature` | Turnier-Detail, alle Tabs, Akteure |
### Regeln
- ✅ Darf importieren: `core/*`
- ❌ Darf NICHT importieren: andere `features/*`, `shells/*`
-**Jedes Feature MUSS seinen eigenen Screen in `presentation/` haben**
- ❌ Screen-Composables gehören NICHT in den Shell
---
## Schicht 3: `shells/`
### Aufgabe
Einstiegspunkt einer konkreten App. Verdrahtet Features und Core zu einer lauffähigen Anwendung.
### Erlaubter Inhalt im Shell
```
shells/<name>/
└── src/jvmMain/kotlin/at/mocode/desktop/
├── main.kt ← App-Einstiegspunkt, Koin-Init
├── DesktopApp.kt ← Root-Composable, Login-Gate
├── di/DesktopModule.kt ← Shell-spezifische DI
├── navigation/ ← Navigation-Port (optional)
└── screens/
├── layout/DesktopMainLayout.kt ← Navigation + Layout-Gerüst
└── preview/ScreenPreviews.kt ← @Preview-Funktionen (IDE-only)
```
### Regeln
- ✅ Darf importieren: `core/*`, `features/*`
- ✅ Darf enthalten: `main.kt`, `DesktopApp.kt`, DI-Verdrahtung, Layout, Previews
- ❌ Darf NICHT enthalten: fachliche Screen-Composables (gehören in Features)
- ❌ Darf NICHT enthalten: ViewModels, Repositories, Business-Logik
---
## Abhängigkeits-Diagramm
```
shells/meldestelle-desktop
├── core/auth
├── core/design-system
├── core/domain
├── core/navigation
├── core/network
├── core/local-db
├── core/sync
├── features/ping-feature
├── features/nennung-feature
├── features/zns-import-feature
├── features/veranstalter-feature
├── features/veranstaltung-feature
└── features/turnier-feature
features/* → core/* (nur)
core/* → (keine internen Abhängigkeiten außer erlaubte core-zu-core)
```
---
## Checkliste: Neues Feature anlegen
1. `frontend/features/<name>-feature/` Verzeichnis anlegen
2. `build.gradle.kts` nach Vorlage `nennung-feature` erstellen
3. Eintrag in `settings.gradle.kts` unter `// --- FEATURES ---` hinzufügen
4. Eintrag in `shells/meldestelle-desktop/build.gradle.kts` unter `// Feature-Module` hinzufügen
5. Screen in `presentation/` implementieren
6. DI-Modul in `di/` implementieren
7. DI-Modul in `shells/.../main.kt` registrieren
8. Route in `core/navigation/AppScreen.kt` eintragen
9. Navigation-Case in `shells/.../screens/layout/DesktopMainLayout.kt` eintragen
---
## Anti-Patterns (verboten)
| Anti-Pattern | Warum verboten |
|------------------------------------|------------------------------------------------------|
| Screen-Composable direkt im Shell | Verletzt Schichttrennung, nicht wiederverwendbar |
| Feature importiert anderes Feature | Erzeugt Kopplung, verhindert unabhängige Entwicklung |
| `core` importiert `features` | Zirkuläre Abhängigkeit |
| Shared-Modelle im Shell definieren | Gehören in `core/design-system` oder `core/domain` |
| ViewModel im Shell | Gehört ins Feature |
---
*Letzte Aktualisierung: 26.03.2026 — nach Architektur-Refactor (Screens aus Shell in Features verschoben)*
@@ -0,0 +1,200 @@
---
type: Reference
status: ACTIVE
owner: Lead Architect
last_update: 2026-03-26
---
# Navigation & Routing Diagramm — Meldestelle Desktop
🏗️ **[Lead Architect]** | 26. März 2026
Dieses Dokument visualisiert alle Screens und Navigationsübergänge der Compose Desktop App.
Generiert aus: `frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/`
---
## 1. Übersicht: NavRail-Einstiegspunkte
Die linke Navigationsleiste (NavRail) bietet folgende Direkteinstiege:
| Icon | Label | Ziel-Screen | Status |
|------|-------------------|--------------------|-----------------------------|
| 📅 | Veranstaltungen | `Veranstaltungen` | ✅ Implementiert |
| 🏇 | Reiter | `Reiter` | ⬜ Placeholder |
| 🐴 | Pferde | `Pferde` | ⬜ Placeholder |
| 👤 | Funktionäre | `Funktionaere` | ⬜ Placeholder |
| 🏆 | Meisterschaften | `Meisterschaften` | ⬜ Placeholder |
| 🥇 | Cups | `Cups` | ⬜ Placeholder |
| 📥 | Stammdaten-Import | `StammdatenImport` | 🟡 UI fertig, Polling offen |
---
## 2. Vollständiges Navigationsfluss-Diagramm
```mermaid
flowchart TD
%% ─── App-Start & Auth ───────────────────────────────────────────
START([App Start]) --> LOGIN
LOGIN["🔐 Login\n/auth/login"]
LOGIN -->|"onSuccess (returnTo)"| VERANSTALTUNGEN
AUTH_GUARD{{"🛡️ Auth Guard\n(nicht eingeloggt?)"}}
AUTH_GUARD -->|"nicht authentifiziert"| LOGIN
%% ─── NavRail Top-Level ──────────────────────────────────────────
NAVRAIL(["🗂️ NavRail"])
NAVRAIL --> VERANSTALTUNGEN
NAVRAIL --> REITER
NAVRAIL --> PFERDE
NAVRAIL --> FUNKTIONAERE
NAVRAIL --> MEISTERSCHAFTEN
NAVRAIL --> CUPS
NAVRAIL --> STAMMDATEN_IMPORT
%% ─── Veranstaltungen-Flow ───────────────────────────────────────
VERANSTALTUNGEN["📅 Veranstaltungen\n(AdminUebersichtScreen)\n/veranstaltungen"]
VERANSTALTUNGEN -->|"+ Neue Veranstaltung"| VERANSTALTER_AUSWAHL
VERANSTALTUNGEN -->|"Veranstaltung öffnen (id)"| VERANSTALTUNG_DETAIL
VERANSTALTER_AUSWAHL["🏢 Veranstalter auswählen\n/veranstalter/auswahl"]
VERANSTALTER_AUSWAHL -->|"Zurück"| VERANSTALTUNGEN
VERANSTALTER_AUSWAHL -->|"Weiter (veranstalterId)"| VERANSTALTER_DETAIL
VERANSTALTER_DETAIL["🏢 Veranstalter Detail\n/veranstalter/{id}"]
VERANSTALTER_DETAIL -->|"Zurück"| VERANSTALTER_AUSWAHL
VERANSTALTER_DETAIL -->|"Veranstaltung öffnen (vId)"| VERANSTALTUNG_UEBERSICHT
VERANSTALTER_DETAIL -->|"Neue Veranstaltung gespeichert"| VERANSTALTER_DETAIL
VERANSTALTUNG_UEBERSICHT["📋 Veranstaltung Übersicht\n/veranstalter/{verId}/veranstaltung/{vId}"]
VERANSTALTUNG_UEBERSICHT -->|"Zurück"| VERANSTALTER_DETAIL
VERANSTALTUNG_UEBERSICHT -->|"Turnier öffnen (tId)"| TURNIER_DETAIL
VERANSTALTUNG_UEBERSICHT -->|"+ Neues Turnier"| TURNIER_NEU
VERANSTALTUNG_DETAIL["📄 Veranstaltung Detail\n/veranstaltung/{id}"]
VERANSTALTUNG_DETAIL -->|"Zurück"| VERANSTALTUNGEN
VERANSTALTUNG_DETAIL -->|"+ Neues Turnier"| TURNIER_NEU
VERANSTALTUNG_DETAIL -->|"Turnier öffnen (tId)"| TURNIER_DETAIL
VERANSTALTUNG_NEU[" Neue Veranstaltung\n/veranstaltung/neu"]
VERANSTALTUNG_NEU -->|"Zurück"| VERANSTALTUNGEN
VERANSTALTUNG_NEU -->|"Speichern"| VERANSTALTUNGEN
TURNIER_DETAIL["🏟️ Turnier Detail\n/veranstaltung/{vId}/turnier/{tId}\n(inkl. Nennungs-Tab ⭐)"]
TURNIER_DETAIL -->|"Zurück"| VERANSTALTUNG_DETAIL
TURNIER_NEU[" Neues Turnier\n/veranstaltung/{vId}/turnier/neu"]
TURNIER_NEU -->|"Zurück"| VERANSTALTUNG_DETAIL
TURNIER_NEU -->|"Speichern"| VERANSTALTUNG_DETAIL
%% ─── Stammdaten-Import ──────────────────────────────────────────
STAMMDATEN_IMPORT["📥 Stammdaten Import\n/stammdaten/import\n(ZNS ZIP-Import)"]
%% ─── Placeholder Screens ────────────────────────────────────────
REITER["🏇 Reiter\n/reiter\n⬜ Placeholder"]
PFERDE["🐴 Pferde\n/pferde\n⬜ Placeholder"]
FUNKTIONAERE["👤 Funktionäre\n/funktionaere\n⬜ Placeholder"]
MEISTERSCHAFTEN["🏆 Meisterschaften\n/meisterschaften\n⬜ Placeholder"]
CUPS["🥇 Cups\n/cups\n⬜ Placeholder"]
%% ─── Logout ─────────────────────────────────────────────────────
LOGOUT(["🚪 Logout"])
LOGOUT -->|"Token löschen"| LOGIN
%% ─── Styling ────────────────────────────────────────────────────
style LOGIN fill:#f0a500,color:#000
style AUTH_GUARD fill:#e74c3c,color:#fff
style VERANSTALTUNGEN fill:#2ecc71,color:#000
style TURNIER_DETAIL fill:#3498db,color:#fff
style STAMMDATEN_IMPORT fill:#9b59b6,color:#fff
style REITER fill:#bdc3c7,color:#555
style PFERDE fill:#bdc3c7,color:#555
style FUNKTIONAERE fill:#bdc3c7,color:#555
style MEISTERSCHAFTEN fill:#bdc3c7,color:#555
style CUPS fill:#bdc3c7,color:#555
```
---
## 3. Screens nach Status
### ✅ Vollständig implementiert
| Screen | Route | Komponente |
|-----------------------------|---------------------------------------------|-----------------------------------------|
| Login | `/auth/login` | `LoginScreen` |
| Veranstaltungen (Übersicht) | `/veranstaltungen` | `AdminUebersichtScreen` |
| Veranstalter Auswahl | `/veranstalter/auswahl` | `VeranstalterAuswahlScreen` |
| Veranstalter Detail | `/veranstalter/{id}` | `VeranstalterDetailScreen` |
| Veranstaltung Übersicht | `/veranstalter/{verId}/veranstaltung/{vId}` | `VeranstaltungUebersichtScreen` |
| Veranstaltung Detail | `/veranstaltung/{id}` | `VeranstaltungDetailScreen` |
| Veranstaltung Neu | `/veranstaltung/neu` | `VeranstaltungNeuScreen` |
| Turnier Detail | `/veranstaltung/{vId}/turnier/{tId}` | `TurnierDetailScreen` + `NennungsMaske` |
| Turnier Neu | `/veranstaltung/{vId}/turnier/neu` | `TurnierNeuScreen` |
### 🟡 Teilweise implementiert
| Screen | Route | Offen |
|-------------------|----------------------|------------------------------------------------|
| Stammdaten Import | `/stammdaten/import` | Status-Polling zum Backend fehlt (ZNS Phase 3) |
### ⬜ Placeholder (NavRail sichtbar, Screen leer)
| Screen | Route |
|-----------------|--------------------|
| Reiter | `/reiter` |
| Pferde | `/pferde` |
| Funktionäre | `/funktionaere` |
| Meisterschaften | `/meisterschaften` |
| Cups | `/cups` |
### 🗑️ Definiert aber nicht in Desktop-Navigation eingebunden
| Screen | Route | Hinweis |
|------------------|----------------------|---------------------------------|
| Landing | `/` | Web-App Relikt |
| Home | `/home` | Web-App Relikt |
| Dashboard | `/dashboard` | Web-App Relikt |
| Ping | `/ping` | Dev/Health-Check |
| Profile | `/profile` | Web-App Relikt |
| OrganizerProfile | `/organizer/profile` | Web-App Relikt |
| AuthCallback | `/auth/callback` | Web-App Relikt (OAuth Redirect) |
| Nennung | `/nennung` | Web-App Relikt |
| CreateTournament | `/tournament/create` | Web-App Relikt |
---
## 4. Wichtige Hinweise
### Auth Guard
Jeder Screen (außer `Login`) ist durch den Auth Guard geschützt:
```
if (!authState.isAuthenticated && currentScreen !is AppScreen.Login) {
nav.navigateToScreen(AppScreen.Login(returnTo = AppScreen.Veranstaltungen))
}
```
### Web-App Relikte im AppScreen
Es existieren 9 Screens (`Landing`, `Home`, `Dashboard`, `Ping`, `Profile`, `OrganizerProfile`,
`AuthCallback`, `Nennung`, `CreateTournament`), die aus der alten Web-App stammen und in der
Desktop-App nicht gerendert werden. → **Offene Entscheidung:** Bereinigen oder für zukünftige
Web-App-Phase behalten? Siehe ADR-Bedarf.
### Nennungs-Tab ⭐
Der `TurnierDetailScreen` enthält den wichtigsten fachlichen Screen: die `NennungsMaske`
(Bewerbe-Tab). Dies ist das Herzstück des `registration-context`.
---
## 5. Referenzen
- Quellcode: `frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/DesktopApp.kt`
- Quellcode: `frontend/shells/meldestelle-desktop/src/jvmMain/kotlin/at/mocode/desktop/screens/DesktopMainLayout.kt`
- Quellcode: `frontend/core/src/commonMain/kotlin/at/mocode/frontend/core/navigation/AppScreen.kt`
- ZNS-Importer Roadmap: `docs/01_Architecture/Roadmap_ZNS_Importer.md`
- Figma Design-Baseline: Vision_03 (ADR Session Log 2026-03-24)