Projektübersicht St. Georg
Ausführliche Dokumentation der Struktur, Bereiche und Technologiestack des Projekts.
Projektübersicht
Dieses Dokument fasst den aktuellen Stand der Web-Frontend-Anwendung für das St. Georg App zusammen. Es beschreibt die Benutzerbereiche (Admin, TZ, Sternsinger, Messdiener, Pfadfinder, Jugendgottesdienst), deren Navigation sowie wichtige technische Aspekte für Entwickler:innen. Die Beispiele orientieren sich an der tatsächlichen Projektstruktur unter apps/web/src.
Inhaltsverzeichnis
- Bereiche und Seitenstruktur
- Technische Architektur
- Entwicklungsumgebung
- Routing und Navigation
- Ablauf beim Bereichswechsel
Bereiche und Seitenstruktur
Die Anwendung folgt einem Bereichskonzept, bei dem je nach aktiver Organisation unterschiedliche Menüs geladen werden. Die Organisationen sind derzeit:
Admin
- Hauptseite:
/admin– innerhalb der Routeapps/web/src/routes/_authenticated/admin/index.tsxwerden Basisinformationen der Admin-Oberfläche gerendert. - Unterseiten: Benutzerverwaltung (
/admin/organizations,/admin/users) – siehe Komponenten unterapps/web/src/routes/_authenticated/adminundapps/web/src/server/users.ts. - Zugriff: Administrationsbereich ist über TanStack Router unter
/admin/*eingebunden. Die Navigation zur Erstellung neuer Organisationen erfolgt überapps/web/src/components/form/create-organization-form.tsx, dieauthClient.organization.createbenutzt.
Messdiener
- Route:
/messdienermit entsprechendem Entry inapps/web/src/routes/_authenticated/messdiener/index.tsx. - Navigation: Gruppen wie „Übersicht“, „Cloud“, „Gruppen“, „Shop“, „Stationsspiel“, „Film“ und „Sonderurlaubsanträge“ liegen im JSON-Feld
metadata.navigation.groupsder aktiven Organisation (Beispiel in der Benutzerdatenbank). - Unterseiten:
/messdiener/gruppen/messdiener/shopmit Unterpunkten/teilnehmer,/produkte,/statistik/messdiener/karteund/messdiener/fragebogen/messdiener/songs,/messdiener/shop,/messdiener/urlaub
- Komponenten: Navigation wird von
apps/web/src/components/layout/nav-main.tsxerzeugt, liestmetadata.navigationund unterstütztexternal-Links (öffnen neuen Tab mit Lucide IconSquareArrowUpRight).
Pfadfinder
- Route:
/pfadfinder(sieheapps/web/src/routes/_authenticated/pfadfinder/index.tsx). - Navigation: analog über aktives Organisation-Metadata gesteuert. Menüs adaptieren sich je nach gespeicherten Gruppen und Untersektionen.
Sternsinger
- Route:
/sternsinger(apps/web/src/routes/_authenticated/sternsinger/index.tsx). - Navigation: Imseinverhältnis zu Messdiener, greift ebenfalls auf
metadata.navigationzurück. - Besonderheit: Sharesmap? (weitere Module können analog angehängt werden).
TZ
- Route:
/tz(apps/web/src/routes/_authenticated/tz/index.tsx). - Verwendung: Bereich für „Technische Zeit“ (TZ), ebenfalls dynamisch über Navigation-Metadaten gesteuert.
Jugendgottesdienst
- Route:
/jugendgottesdienst(apps/web/src/routes/_authenticated/jugendgottesdienst/index.tsx). - Navigation: Basiert auf gleicher Struktur.
Technische Architektur
Technologie-Stack
- Frontend: Bun + TanStack Router + React 19 + shadcn/ui + Tailwind CSS.
- Authentifizierung:
better-authmit Client-HookauthClient(sieheapps/web/src/lib/auth-client.ts). - Routing: TanStack React Router mit
createFileRoute, generiertapps/web/src/routeTree.gen.ts. - Serverfunktionen:
@tanstack/react-startfürcreateServerFn, z. B.getUser,getOrganizations,getActivOrganizationinapps/web/src/server. - Navigation: Wird über Organisations-Metadaten (
metadata.navigation.groups) gesteuert. Das JSON-Format enthältlabel,sections,itemsund optionalexternalfür externe Links. - UI: Shadcn-Komponenten (Dropdown, Sidebar, Skeleton, Avatar etc.) mit Icons von
lucide-react.
Layout
- Root-Document:
apps/web/src/routes/__root.tsxbautSidebarProvider,AppSidebar,SidebarInsetundOutletauf. Der Loader befüllt den Kontext mit Session, Organisationen und Navigationsgruppen, sodass SSR und Hydration passen. - Sidebar:
apps/web/src/components/layout/app-sidebar.tsxorchestriertTeamSwitcher,NavMain,NavUser. - Navbar Skeletons: Werden aus
apps/web/src/components/ui/skeleton.tsxaktiviert, so dass sowohl Team-Switcher als auch Nav die passende Größe behalten.
Navigation Reload Logic
- Der Loader ruft
getActivOrganization()ab, filtertmetadata.navigationviaparseNavigationGroups(inapps/web/src/lib/navigation.ts). NavMainakzeptiert die serverseitig erstellten Gruppen als Prop und überwachtauthClient.useActiveOrganization()für Aktualisierungen nach dem Team-Wechsel.TeamSwitcherbenutztauthClient.useListOrganizations()undauthClient.organization.setActive, zeigt Ladezustände mit Skeletons.
Entwicklung
Entwicklungsumgebung
- Lokales Starten:
bun devoderturbo devfür das Webpaket,turbo -F @stgeorg-app/db db:startetc. - Code-Generierung:
apps/web/src/routeTree.gen.tsvom TanStack Router automatisch erzeugt. - Typisierung: TypeScript 5+, strict-Modus. Pfade über
tsconfigmit@/*. - UI: Shadcn + Tailwind mit
tailwind.configanalog. Radix-Layouts (Sidebar, Dropdown etc.) sind im Ordnerapps/web/src/components/ui.
Dev-Flow
- Änderungen im Layout/Navigation →
apps/web/src/components/layout/(Sidebar, Navigation, TeamSwitcher). - Neue Server-Endpunkte →
apps/web/src/server/*viacreateServerFnplus zusätzliche Routes. - Auth-Handling →
apps/web/src/lib/auth-client.ts(basiert aufbetter-auth,organizationClient). - Testdaten & Migrationen →
packages/db/src/schema/auth.ts.
Best Practices
- Navigation lebt in den Organisation-Metadaten (siehe
metadata.navigation). Neue Links werden in der Datenbank ergänzt und erscheinen automatisch, weilNavMaindiese Struktur direkt nutzt. TeamSwitcherverwendetauthClient.useListOrganizations+setActive. Nach einem Wechsel ruftNavMaindie aktualisierte Organisation (via Hook) ab.- Bei Änderungen am Layout: immer
apps/web/src/components/uianpassen (Buttons, Skeletons, Sidebar-Styles). - Entwickler:innen:
authClientagiert als zentrale API-Schicht, alles was Nutzer/Organisationen betrifft, passiert über diesen Client.
Weiteres
- Admin-Tools:
apps/web/src/components/form/create-organization-form.tsx,apps/web/src/routes/_authenticated/admin/*. - Navigation mit externem Link: Das Flag
externalfügt im Menü rechts das IconSquareArrowUpRighthinzu und öffnet den Link mittarget="_blank". - Skeletons:
apps/web/src/components/ui/skeleton.tsxwird für alle Ladezustände verwendet (TeamSwitcher, NavMain). - Zusätzliche Bereiche: Alle Organisationen wie Pfadfinder, TZ, Sternsinger greifen auf dieselbe Meta-Struktur; neue Bereiche brauchen nur entsprechende Datensätze und ggf. Routen unter
apps/web/src/routes/_authenticated.