Frontend
Verwendete Technologien
Kotlin/JS
Die gesamte Frontend-Anwendung ist in Kotlin geschrieben und wird über das Kotlin/JS-Target nach JavaScript kompiliert. Dadurch entsteht eine Single-Page-Application (SPA), die im Browser ausgeführt wird. Kotlin bringt dabei als statisch typisierte Sprache Vorteile wie Null-Safety, Data Classes und Coroutines mit.
Compose HTML
Statt klassischer JS-Frameworks wie React oder Angular wird Compose HTML (Teil von JetBrains Compose Multiplatform) als UI-Framework verwendet. Es übersetzt das aus der Android-Welt bekannte deklarative Compose-Paradigma auf das Web:
@Composable-Funktionen beschreiben die UI-Struktur.mutableStateOf/rememberverwalten reaktiven State – Änderungen lösen automatisch ein Recompose der betroffenen UI-Abschnitte aus.LaunchedEffect/DisposableEffectbehandeln Seiteneffekte (z. B. API-Aufrufe oder Event-Listener).- HTML-Elemente werden über Kotlin-DSL-Wrapper wie
Div,Span,Button,H1etc. erzeugt. - Inline-Styles werden typsicher über die
style { }DSL gesetzt (z. B.backgroundColor(colors.surface)).
Projektstruktur
Tests (composeApp/src/jsTest/)
In diesem Verzeichnis liegen die Unit-Tests, die auf kotlin-test basieren.
Frontend-Code (composeApp/src/jsMain/kotlin/)
Einstiegspunkt (main.kt und App.kt)
Die Funktion main() in main.kt ruft renderComposable(rootElementId = "root") auf und rendert die Root-Composable App() in das <div id="root">-Element der index.html. Die App-Composable enthält die zentrale Anwendungslogik: Sie prüft den Authentifizierungsstatus, verwaltet die aktuelle View als State und baut das Grund-Layout aus Sidebar und Content-Bereich auf.
Konfiguration (config/)
ApplicationConfig– Stellt dem Frontend die Backend-URL bereit.UiPreferences– Kapselt die Persistierung von UI-Einstellungen imLocalStoragedes Browsers (Dark-/Light-Modus, gewählter Kalender-Anzeigemodus, ausgewählte Kalender).
Theming (theme/)
AppTheme- Definiert das Farbsystem für die Anwendung (sowohl Light als auch Dark-Mode).
Navigation (navigation/)
Views– Eine Enum-Klasse, die alle verfügbaren Seiten für die Seitenleiste mit Label, Material-Icon-Name und URL-Route definiert.Sidebar– Die vertikale Seitenleiste, die die Navigationseinträge als Icon-Pill-Buttons rendert. Zusätzlich enthält sie einen Suche-Button, einen Theme-Toggle und einen Logout-Button.
API-Schicht (api/)
Für die Backend-API-Kommunikation wird intern die Browser Fetch API (fetch()) verwendet.
api/auth/– EnthältAuthApi(Login, Registrierung...) sowie die DatenklassenUserDtoundLoginResponse. JWT-Token werden bei authentifizierten Requests alsAuthorization: Bearer <token>Header mitgesendet.api/calendar/– EnthältCalendarApi(Kalender-CRUD, Events laden, globale Suche, Suchhistorie).
Wiederverwendbare Komponenten (shared/composables/)
View-übergreifende UI-Bausteine sind hier gebündelt:
Dialog– Stellt die GrundbausteineDialogOverlay(halbtransparenter Hintergrund mit Blur),DialogCard,DialogHeaderundDialogActions(Abbrechen-/Bestätigen-Buttons) bereit.EventDetailDialog– Zeigt die Detailansicht eines Kalenderevents in einem Dialog an.EmptyState– Eine Platzhalter-Ansicht mit Icon und Beschreibungstext, die bei leeren Ergebnissen oder Fehlern angezeigt wird.LoadingIndicator– Eine Lade-Animation, die während asynchroner Operationen eingeblendet wird.
Views (views/)
Jede Seite der Anwendung besitzt ein eigenes Sub-Package:
views/auth/– DieAuthViewimplementiert die Login- und Registrierungsseite.views/calendar/– Die Kalender-Hauptansicht mit mehreren Dateien:CalendarVieworchestriert das Laden der Kalender und Events, verwaltet den State und delegiert an die jeweilige Ansicht.CalendarToolbarenthält die Steuerleiste mit Ansichtswechsel (Tag/Woche/Monat), Vor-/Zurück-Navigation, Heute-Button und Kalender-Filter-Dropdown.CalendarDayView,CalendarWeekViewundCalendarMonthViewimplementieren jeweils die entsprechende Kalender-Darstellung.EventBlockrendert ein einzelnes Event als farbigen Block innerhalb der Kalenderansichten.CalendarModelsenthält UI-Hilfsmodelle und Datumsfunktionen.
views/settings/– DieSettingsViewbietet die Kalenderverwaltung (Hinzufügen, Löschen von Kalender-Abonnements). Unterstützt wird sie durch Komponenten im Unterordnercomponents/wieSettingsSectionundCalendarManagement.views/search/– DerGlobalSearchDialogimplementiert die globale Suche, die per Tastenkürzel (⌘K / Ctrl+K) geöffnet werden kann und Events über alle Kalender hinweg durchsucht.
Deployment
Die Anwendung wird via GitLab CI/CD automatisiert als Docker-Image gebaut und auf dem Server deployt.