diff --git a/ROADMAP.md b/ROADMAP.md index e451712..7e0bce1 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -47,8 +47,10 @@ Legende Aufwand: 🟢 klein · 🟡 mittel · 🔴 gross ## Phase 4 – Echte Kollaboration -- [ ] **4.1 – Karte & Journal getrennt live-editierbar** 🔴 - - Single-Editor-Lock aufbrechen; Socket.io-Sync erweitern. +- [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._ ## Phase 5 – Kür diff --git a/package.json b/package.json index 84d42f5..466b0a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lageplan", - "version": "1.4.7", + "version": "1.4.8", "description": "Feuerwehr Lageplan - Krokier-App für Einsatzdokumentation", "private": true, "scripts": { diff --git a/src/app/app/page.tsx b/src/app/app/page.tsx index d4ad4d5..9875fae 100644 --- a/src/app/app/page.tsx +++ b/src/app/app/page.tsx @@ -377,8 +377,12 @@ export default function AppPage() { }, [authLoading, user, router]) const roleCanEdit = user ? (user.role === 'SERVER_ADMIN' || user.role === 'TENANT_ADMIN' || user.role === 'OPERATOR') : false - // User can only edit if they have the role AND they hold the editing lock (or no one is editing) - const canEdit = !presentationLocked && roleCanEdit && (isEditingByMe || !editingBy) + // Karte: nur mit Editing-Lock bearbeitbar (verhindert Zeichen-Konflikte). + // Journal/Cockpit: unabhängig vom Karten-Lock — so kann eine Person zeichnen, + // während eine andere parallel das Journal führt (Führungsstab-Szenario). + const canEditMap = !presentationLocked && roleCanEdit && (isEditingByMe || !editingBy) + const canEditJournal = !presentationLocked && roleCanEdit + const canEdit = canEditMap // Abwärtskompatibel für Karten-bezogene Stellen const isReadOnly = !!editingBy && !isEditingByMe // Auto-save: localStorage persistence + debounced API save + beacon on unload @@ -870,12 +874,12 @@ export default function AppPage() { {isReadOnly ? (
- {editingBy?.name} bearbeitet gerade — Live-Ansicht (alle 5s aktualisiert) + {editingBy?.name} bearbeitet die Karte — Live-Ansicht{roleCanEdit ? ' · Journal bleibt für Sie bearbeitbar' : ''}
) : isEditingByMe ? (
- Sie bearbeiten — andere sehen Ihre Änderungen in Echtzeit + Sie bearbeiten die Karte — andere sehen Ihre Änderungen in Echtzeit
) : (
@@ -941,7 +945,7 @@ export default function AppPage() { setCurrentProject((prev) => (prev ? { ...prev, exerciseEvaluation: value } : prev)) @@ -956,7 +960,7 @@ export default function AppPage() { einsatzleiter={currentProject?.einsatzleiter || ''} journalfuehrer={currentProject?.journalfuehrer || ''} einsatzNr={(currentProject as any)?.einsatzNr || ''} - canEdit={canEdit} + canEdit={canEditJournal} tenantId={tenant?.id || null} tenantName={tenant?.name || ''} tenantLogoUrl={tenant?.id ? `/api/admin/tenants/${tenant.id}/logo/serve` : null}