Commit graph

10 commits

Author SHA1 Message Date
Daniel Michelberger
08af521d19 fix: Bestätigungsdialog und Farbvalidierung bei Flag-Verwaltung
- Ersetze native confirm() durch app.confirm.request() mit themingfähigem Dialog
- Erweitere Fehlermeldung beim Löschen mit Hinweis auf Marker-Abhängigkeiten
- Validiere Hex-Farben (#rrggbb) vor dem Speichern
- Konsistenz mit Projektmuster (events, runs, riders, times)
2026-08-06 19:11:38 +02:00
Daniel Michelberger
c44ec4377f feat: Verwaltung der Flag-Typen
Die Flag-Verwaltungsseite ermöglicht Team-Admins und -Besitzern, die Marker-Typen
für Trails zu erstellen, bearbeiten und zu löschen. Einfache Mitglieder sehen die
Flags nur. Hinweistexte informieren über Berechtigungen und ermöglichen Nicht-Admins,
die Benutzeroberfläche zu verstehen.
2026-08-06 19:06:58 +02:00
Daniel Michelberger
8e256d0184 fix: HTML-Beschreibung sanitizen und Key in Status-Schleife ergänzen
DOMPurify filtert trail.description vor {@html}, da nur Paten/Admins das
editor-Feld setzen dürfen, ungefiltert aber Skriptcode bei allen
Team-Mitgliedern ausführen könnte. Der Sanitizer läuft browser-gated, da
DOMPurify serverseitig kein DOM hat. Zusätzlich Key in der
Status-Buttons-Schleife ergänzt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 18:56:03 +02:00
Daniel Michelberger
a45c5d2908 feat: Trail-Detailseite mit Karte, Höhenprofil, Markern und Kommentaren
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 18:41:53 +02:00
Daniel Michelberger
7bc128601a fix: Karte lazy-loaded, formatKm bei 0, Enter im Dialog
- TrailMap: IntersectionObserver für WebGL-Kontexte (max 8-16 gleichzeitig)
  → Karte erst laden, wenn sichtbar, rootMargin 200px für frühes Laden
- Trail-Liste: formatKm zeigt 0 m als "0,0 km" statt "–"
- Trail-Anlegen: Enter im Namensfeld triggert save(), saving-Guard hinzugefügt

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 18:34:58 +02:00
Daniel Michelberger
60d5891bc9 feat: Trail-Liste mit Vorschaukarten
Übersichtsseite zeigt alle Trails des Teams als Grid mit Kartvorschau,
Status-Badge und Kennzahlen. Dialog für Trail-Erstellung mit GPX-Upload
im nächsten Schritt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 18:27:33 +02:00
Daniel Michelberger
616694a7f5 feat: Trail-Stores registrieren und Navigationseintrag ergänzen
Die vier Trail-Stores (trails, trailVersions, trailFlags, trailMarkers)
werden im Dashboard-Layout per Context bereitgestellt, laden ihre Daten
beim Mount, abonnieren Realtime-Updates und werden beim Unmount wieder
aufgeräumt. Zusätzlich ergänzt ein Navigationseintrag „Trails" mit dem
Route-Icon aus lucide-svelte.
2026-08-06 18:11:14 +02:00
Daniel Michelberger
ef8c05bd7c style: TeamSwitcher und Design-Umschalter nach links vor die Navigation 2026-08-06 17:21:03 +02:00
Daniel Michelberger
ced89ed9d2 style: Titel "Zeitnahme" aus dem App-Header entfernen 2026-08-06 16:53:52 +02:00
Daniel Michelberger
1061a8b9ad chore: Repo-Struktur mit frontend/ und backend/ aufsetzen
Die SvelteKit-App liegt unter frontend/, das Backend unter backend/ als
eigenständige PocketBase-Instanz mit Dockerfile, docker-compose und
versioniertem Schema.

- PocketBase-URL über PUBLIC_PB_URL konfigurierbar, Default bleibt die
  produktive Instanz https://api.stammtisch-hersbruck.de
- Schema als Snapshot-Migration der sechs fachlichen Collections
  (users, teams, events, runs, riders, times), abgezogen von der
  produktiven Instanz. Verifiziert: ein Erststart gegen leere pb_data
  legt alle sechs an, Felder und API-Rules stimmen überein.
- pb_data und pb_migrations als Bind-Mounts, damit Daten persistieren und
  im Admin-UI erzeugte Migrationen im Repo landen
- Veraltete Dokumentation entfernt: pocketbase_schema.json nannte
  Collections (stages, results, organizers), die es nicht gibt

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-06 13:16:43 +02:00