Jede Feuerwehr stellt ihr Cockpit selbst zusammen (Wunsch: modular & einfach): M0 – Zerlegt: - SOMA + Pendenzen als eigenständige Modul-Komponenten, gemeinsame Typen (journal/types.ts), einheitliche ModuleCard-Hülle M1 – Registry & Verwaltung: - Modul-Registry src/lib/modules.ts, Konfiguration pro Mandant in tenants.modulesConfig (JSONB, idempotente Migration) - API GET/PUT /api/tenant/modules (normalisiert + validiert via normalizeModules) - "Module"-Button im Journal (Admins): an/aus, Reihenfolge hoch/runter, eigene Module löschen M2 – Eigene Module: - Generisches Tabellen-Modul: frei definierbare Spalten (Text / Haken mit Zeitstempel / Auto-Zeit), max 8 Spalten - Generische Daten-API /api/projects/[id]/modules/[moduleId]/items (+ [itemId]), neue Tabelle module_items, Live-Sync über journal-refresh Events M3 – Feld-Vorlagen: - Checkliste, Atemschutz-Überwachung (Trupp/Druck/Zeit/Draussen), Kräfte vor Ort (Name/Funktion/seit/Weg), Lagemeldungen (Hauptbereich), leeres Modul mit Spalten-Editor Eingebaute Module (Journal/SOMA/Pendenzen) bleiben ohne Konfiguration exakt wie bisher — kaputte Configs fallen sicher auf den Standard zurück. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.4 KiB
5.4 KiB
Lageplan – Verbesserungs-Fahrplan
Priorisierter Plan zur Weiterentwicklung. Wir arbeiten ihn Punkt für Punkt ab. Legende Aufwand: 🟢 klein · 🟡 mittel · 🔴 gross
Phase 0 – Fundament & Sicherheit
- 0.1 – JWT-Secret härten 🟢 ✅
- Gemeinsames Secret-Modul; in Produktion hart fehlschlagen, wenn
NEXTAUTH_SECRETfehlt oder < 32 Zeichen. Kein öffentlich bekannter Fallback mehr. - Betrifft:
src/lib/auth.ts,src/middleware.ts - Hinweis: Cookie-Flags (httpOnly/secure/sameSite) sind bereits korrekt.
- Gemeinsames Secret-Modul; in Produktion hart fehlschlagen, wenn
- 0.2 – Token-Laufzeit verkürzt 🟢 ✅
- „Angemeldet bleiben" 30 → 14 Tage. Laufzeiten zentralisiert (
SESSION_MAX_AGE_*inauth.ts). - Offen für später: automatische Verlängerung bei Aktivität + serverseitiger Widerruf (grösserer Umbau, braucht Live-Test).
- „Angemeldet bleiben" 30 → 14 Tage. Laufzeiten zentralisiert (
- 0.3 – Benutzer-/Mandanten-Verwaltung 🟡 ✅
- Super-Admin sieht ALLE Benutzer über alle Mandanten (Mandant-Spalte, letzte
Anmeldung, Status), sperren/entsperren (
User.isActive), Passwort-Reset, Suche. - Anlegen mit Mandanten-Auswahl (verhindert verwaiste User).
admin/page.tsxvon 1365 → ~230 Zeilen entwirrt: je Bereich eine eigene Komponente (tenants/users/projects/icons/categories-tab), toter Code entfernt.- Offen (später): Rollen-Dualität (User.role vs. Membership.role) vereinheitlichen.
- Super-Admin sieht ALLE Benutzer über alle Mandanten (Mandant-Spalte, letzte
Anmeldung, Status), sperren/entsperren (
Phase 1 – Einsatz vs. Übung
- 1.1 –
mode-Feld am Projekt 🟢 ✅- Feld
mode(EINSATZ/UEBUNG) im Schema + Auto-Migration + Validierung. - Auswahl beim Erstellen (Segmented-Control), Badge in Projektliste, eigene Nummer
Ü-….
- Feld
- 1.2 – UI je nach Modus 🟡 ✅
- Direkte Buttons „Neuer Einsatz" (rot) / „Neue Übung" (blau) in der Topbar.
- Übung → Übungs-Cockpit statt Journal: Übungsziele + Zielerreichung + Auswertung.
- Deutliches „ÜBUNG"-Banner, Sidebar-Tab heisst bei Übung „Auswertung".
Phase 2 – Symbole aufräumen & ergänzen
- 2.1 – Kategorien vereinheitlichen 🟢 (Motorspritze, Hydrant, Leitern …)
- 2.2 – Fehlende taktische Zeichen 🟡 (Warteraum, Rettungsachse … – Input von Fabian)
- 2.3 – Symbol-Schönheitsfehler 🟢 (Eingang/Treppe Umriss, Absperrung Seitenlinien)
- 2.4 – Custom-Felder pro Symbol 🟢 (z. B. Stockwerke;
Item.propertiesexistiert)
Phase 3 – Lage-/Rapportansicht
- 3.1 – Reduzierte Lage-View 🟡
- Read-Only (Pendenzen + Stand + Aufgaben) für Grossbildschirm.
Rapport+ Token existieren.
- Read-Only (Pendenzen + Stand + Aufgaben) für Grossbildschirm.
Phase 4 – Echte Kollaboration
- 4.1 – Karte & Journal parallel bearbeitbar 🟡 ✅
- Editor-Lock gilt nur noch für die Karte; Journal/Cockpit unabhängig editierbar.
- Live-Sync für Journal existierte bereits (Socket → journal-refresh).
- Offen (Kür): echtes gleichzeitiges Zeichnen (Co-Drawing) — bewusst nicht gebaut.
Zusatz – Robustheit / Datensicherheit ✅
- Features-Speichern atomar (
prisma.$transaction) — kein Totalverlust-Fenster mehr - localStorage-Features pro Projekt (
lageplan-features-<id>) statt globalem Key - Sync-Queue verwirft dauerhafte 4xx-Fehler (kein Endlos-Retry/verstopfte Queue)
beforeunloadpersistiert auch leere Listen (gelöschte Elemente gehen nicht verloren)- 5: Optimistische Nebenläufigkeit —
Project.featuresVersion+ Versions-Check beim Speichern. Ein veralteter (z.B. offline) Stand überschreibt neuere Änderungen nicht mehr still, sondern erzeugt 409 → Client übernimmt Server-Stand + Warnung. Offline-Queue verwirft konfliktierende 4xx. (Merge pro Element / echtes Co-Drawing weiterhin offen.)
Zusatz – Leitungsrechner professionalisiert ✅
- Formel zentralisiert in
src/lib/hose-calc.ts(eine Quelle, typisiert, testbar) - Ergebnis-Panel als React-Komponente (
MeasurePanel) statt innerHTML/Inline-CSS - Schlauchtyp wählbar (Standard ★ vorausgewählt) statt alle gestapelt
- Strahlrohrdruck einstellbar (4/5/6/8 bar)
- Schlauchanzahl aus
lengthPerPieceM+ 10% Verlegereserve (Feld war vorher tot) - Ehrliche Höhendaten-Anzeige (Quelle bzw. Warnung „keine Höhendaten")
- Offen (später): Berechnungsparameter pro Mandant, mehrere Leitungen/Pumpenkette, Elevation-Proxy mit Cache, Ergebnis als speicherbares Lageplan-Objekt.
Zusatz – Modul-Baukasten (Einsatz-Cockpit) ✅ v1.5.0
- Journal-Monolith zerlegt: SOMA + Pendenzen als eigenständige Module,
gemeinsame Typen, Karten-Hülle (
ModuleCard) - Modul-Registry (
src/lib/modules.ts) + Konfiguration pro Mandant (tenants.modulesConfig), APIGET/PUT /api/tenant/modules - „Module verwalten"-Dialog: an/aus, Reihenfolge, eigene Module erstellen
- Generisches Tabellen-Modul (Spaltentypen Text/Haken/Zeit) mit eigener
Daten-API (
module_items), Live-Sync über journal-refresh - Vorlagen: Checkliste, Atemschutz-Überwachung, Kräfte vor Ort, Lagemeldungen, leeres Modul
- Offen (später): Übungs-Cockpit auf denselben Baukasten umstellen, Modul-Daten in Rapport-PDF übernehmen
Phase 5 – Kür
- 5.1 – Linien-Typ-Abfrage 🟡 ✅
- Beim Zeichnen einer Linie/eines Pfeils fragt der Dialog nun den Typ ab: Normal (gewählte Farbe), Leitung (blau, dicker), Rettungsachse (grün, gestrichelt – als freizuhaltende Achse klar erkennbar).
- Typ in
properties.lineType; eigener MapLibre-Layer mit Dash-Muster für Rettungsachse.
Fortschritt wird hier laufend abgehakt.