Dieses Repository enthält das Termin-Erfassungsmaske & Management Cockpit für die Termine der Freiwilligen Feuerwehr Brittheim. Es dient zur Erfassung, Verwaltung, Visualisierung und Verteilung von Dienst- und Übungsterminen.
Das Tool läuft als moderne Single-Page-Web-App (PWA) und synchronisiert sich automatisiert mit einem externen Google Kalender.
- 📅 Terminverwaltung: Übersichtliche tabellarische Auflistung aller Termine mit Filterung nach Gruppe und schnellem Hinzufügen/Löschen von Einträgen.
- 👥 Mannschaftsverwaltung: Zuweisung von Gruppen (z. B. "Zug", "Hosi", "Alle").
- 📆 iCal/ICS-Export: Einzelne oder alle Termine können direkt als standardisierte
.ics-Kalenderdateien heruntergeladen werden, um sie in Outlook, Apple Calendar oder Google Calendar zu importieren. - 🔄 Google Calendar Synchronisation: Ein automatisiertes Headless-Synchronisationsskript gleicht tägliche Einträge aus dem Google Kalender ab und führt sie mit lokalen Terminen zusammen.
- 📱 PWA-Support: Vollständig mobiloptimiert und offlinefähig.
- Frontend Framework: Vue 3 (Composition API mit
<script setup>) - Build-Tool: Vite
- UI-Komponenten: PrimeVue v4 & PrimeIcons
- Styling: Tailwind CSS v4
- Testen: Vitest
- Kalender-Integration:
cal-parser,ics
Stelle sicher, dass du Node.js (v24 oder höher) installiert hast.
npm installnpm run devDer Server startet standardmäßig unter http://localhost:5173.
Baut die App und generiert automatisch das iCal-Archiv:
npm run buildFührt die Vitest-Unit-Tests aus:
npm run testGleicht lokale Termine in public/termine.json mit dem Google Kalender ab:
npm run sync-gcalDas Projekt nutzt zwei automatisierte GitHub-Workflows:
- Deploy to GitHub Pages (
deploy.yml): Wird bei jedem Push auf denmain-Branch ausgelöst. Baut das Projekt und veröffentlicht die statische App auf GitHub Pages. - GCal Sync (
gcal-sync.yml): Wird täglich um 04:00 UTC per Cron-Job ausgeführt. Synchronisiert die neuesten Kalenderdaten, aktualisiertpublic/termine.jsonund schiebt die Änderungen auf den Branchchore/calendar(ohne denmain-Code-Branch direkt zu belasten).