Macht aus dem digitalen Kroki ein echtes taktisches Lagebild: Karte: - Nordpfeil-Overlay (dreht mit dem Karten-Bearing mit) - Windrichtung in 8 Richtungen setzbar (Windrose mit Drift-Pfeil + Label "Wind aus NW"), pro Einsatz gespeichert (Project.windDirection) Export (PNG & PDF): - Nordpfeil, Massstabsbalken und Windanzeige werden in die Karte eingebrannt - PDF zusätzlich: Symbol-Legende (Namen aus /api/icons) + bestehende Kopfzeile (Einsatz/Ort/Zeit/Nr) → fertiges, weitergebbares Krokier-Dokument Technik: - windDirection: Schema + idempotente Migration + Zod-Validierung + Typ - Neue Komponente MapCompass (Nordpfeil/Windrose/Wind-Setzer) - MapView verfolgt Bearing über 'rotate'-Event Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
122 lines
6.5 KiB
Markdown
122 lines
6.5 KiB
Markdown
# Lageplan – Verbesserungs-Fahrplan
|
||
|
||
Priorisierter Plan zur Weiterentwicklung. Wir arbeiten ihn Punkt für Punkt ab.
|
||
Legende Aufwand: 🟢 klein · 🟡 mittel · 🔴 gross
|
||
|
||
---
|
||
|
||
## Phase 0 – Fundament & Sicherheit
|
||
|
||
- [x] **0.1 – JWT-Secret härten** 🟢 ✅
|
||
- Gemeinsames Secret-Modul; in Produktion hart fehlschlagen, wenn `NEXTAUTH_SECRET`
|
||
fehlt 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._
|
||
- [x] **0.2 – Token-Laufzeit verkürzt** 🟢 ✅
|
||
- „Angemeldet bleiben" 30 → 14 Tage. Laufzeiten zentralisiert (`SESSION_MAX_AGE_*` in `auth.ts`).
|
||
- _Offen für später: automatische Verlängerung bei Aktivität + serverseitiger Widerruf (grösserer Umbau, braucht Live-Test)._
|
||
- [x] **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.tsx` von 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.
|
||
|
||
## Phase 1 – Einsatz vs. Übung
|
||
|
||
- [x] **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 `Ü-…`.
|
||
- [x] **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.properties` existiert)
|
||
|
||
## Phase 3 – Lage-/Rapportansicht
|
||
|
||
- [ ] **3.1 – Reduzierte Lage-View** 🟡
|
||
- Read-Only (Pendenzen + Stand + Aufgaben) für Grossbildschirm. `Rapport` + Token existieren.
|
||
|
||
## Phase 4 – Echte Kollaboration
|
||
|
||
- [x] **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 ✅
|
||
|
||
- [x] Features-Speichern atomar (`prisma.$transaction`) — kein Totalverlust-Fenster mehr
|
||
- [x] localStorage-Features pro Projekt (`lageplan-features-<id>`) statt globalem Key
|
||
- [x] Sync-Queue verwirft dauerhafte 4xx-Fehler (kein Endlos-Retry/verstopfte Queue)
|
||
- [x] `beforeunload` persistiert auch leere Listen (gelöschte Elemente gehen nicht verloren)
|
||
- [x] **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 ✅
|
||
|
||
- [x] Formel zentralisiert in `src/lib/hose-calc.ts` (eine Quelle, typisiert, testbar)
|
||
- [x] Ergebnis-Panel als React-Komponente (`MeasurePanel`) statt innerHTML/Inline-CSS
|
||
- [x] Schlauchtyp wählbar (Standard ★ vorausgewählt) statt alle gestapelt
|
||
- [x] Strahlrohrdruck einstellbar (4/5/6/8 bar)
|
||
- [x] Schlauchanzahl aus `lengthPerPieceM` + 10% Verlegereserve (Feld war vorher tot)
|
||
- [x] 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
|
||
|
||
- [x] Journal-Monolith zerlegt: SOMA + Pendenzen als eigenständige Module,
|
||
gemeinsame Typen, Karten-Hülle (`ModuleCard`)
|
||
- [x] Modul-Registry (`src/lib/modules.ts`) + Konfiguration pro Mandant
|
||
(`tenants.modulesConfig`), API `GET/PUT /api/tenant/modules`
|
||
- [x] „Module verwalten"-Dialog: an/aus, Reihenfolge, eigene Module erstellen
|
||
- [x] Generisches Tabellen-Modul (Spaltentypen Text/Haken/Zeit) mit eigener
|
||
Daten-API (`module_items`), Live-Sync über journal-refresh
|
||
- [x] 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
|
||
|
||
## Zusatz – Offline-Karten ✅ v1.5.1
|
||
|
||
- [x] Kacheln des Einsatzgebiets werden beim Öffnen eines Einsatzes automatisch
|
||
vorgeladen (Zoom 13–18, ~800 m Radius, max. 400 Kacheln, Parallelität 6)
|
||
- [x] Nutzt exakt das MapLibre-Subdomain-Schema `(x+y) % 3` → Cache-Keys passen
|
||
- [x] Bereits gecachte Kacheln werden übersprungen; Marker pro Einsatz (14 Tage)
|
||
- [x] SW cachte Kacheln schon Cache-First — jetzt auch nie besuchte Bereiche da
|
||
- Offen (später): Satellit/Swisstopo vorladen, grösserer Radius wählbar
|
||
|
||
## Zusatz – Krokier-Lagebild ✅ v1.6.0
|
||
|
||
- [x] **Nordpfeil** als Karten-Overlay, dreht mit dem Bearing mit
|
||
- [x] **Windrichtung** (8 Richtungen) setzbar, am Projekt gespeichert
|
||
(`Project.windDirection`), als Windrose mit Drift-Pfeil angezeigt
|
||
- [x] **Export als Dokument**: Nordpfeil + Massstabsbalken + Windanzeige werden
|
||
in PNG & PDF eingebrannt; PDF zusätzlich mit **Symbol-Legende** (Namen aus
|
||
/api/icons) und bestehender Kopfzeile (Einsatz/Ort/Zeit/Nr)
|
||
- Offen (später): Absperr-/Gefahrenkreis mit Meter-Eingabe, Einheiten
|
||
beschriften + Favoriten-Leiste, normgerechte taktische Zeichen
|
||
|
||
## Phase 5 – Kür
|
||
|
||
- [x] **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._
|