diff --git a/package.json b/package.json index 4f120bd..c8732b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "lageplan", - "version": "1.3.4", + "version": "1.3.5", "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 22c73d6..627a32d 100644 --- a/src/app/app/page.tsx +++ b/src/app/app/page.tsx @@ -50,7 +50,8 @@ export default function AppPage() { const [isFullscreen, setIsFullscreen] = useState(false) const [auditLog, setAuditLog] = useState<{ time: string; action: string }[]>([]) const [isAuditOpen, setIsAuditOpen] = useState(false) - + const [presentationLocked, setPresentationLocked] = useState(false) + const [isSidebarCollapsed, setIsSidebarCollapsed] = useState(false) const [lastMapScreenshot, setLastMapScreenshot] = useState('') const [defaultSymbolScale, setDefaultSymbolScale] = useState(1.5) @@ -375,7 +376,7 @@ export default function AppPage() { 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 = roleCanEdit && (isEditingByMe || !editingBy) + const canEdit = !presentationLocked && roleCanEdit && (isEditingByMe || !editingBy) const isReadOnly = !!editingBy && !isEditingByMe // Auto-save: localStorage persistence + debounced API save + beacon on unload @@ -806,6 +807,14 @@ export default function AppPage() { userRole={user?.role} onLogout={logout} onStartTour={() => { resetOnboardingTour(); setShowTour(true) }} + presentationLocked={presentationLocked} + onTogglePresentationLock={() => { + const next = !presentationLocked + setPresentationLocked(next) + if (next && isEditingByMe) { + handleStopEditing() + } + }} /> {/* Offline banner */} diff --git a/src/components/layout/topbar.tsx b/src/components/layout/topbar.tsx index 8a8fa68..dcc8376 100644 --- a/src/components/layout/topbar.tsx +++ b/src/components/layout/topbar.tsx @@ -39,6 +39,8 @@ import { Shield, MapPin, HelpCircle, + Lock, + Unlock, } from 'lucide-react' import { HoseSettingsDialog } from '@/components/dialogs/hose-settings-dialog' import type { Project, DrawFeature } from '@/types' @@ -66,6 +68,8 @@ interface TopbarProps { userRole?: string onLogout?: () => void onStartTour?: () => void + presentationLocked?: boolean + onTogglePresentationLock?: () => void } export function Topbar({ @@ -89,6 +93,8 @@ export function Topbar({ userRole, onLogout, onStartTour, + presentationLocked, + onTogglePresentationLock, }: TopbarProps) { const [isLoadDialogOpen, setIsLoadDialogOpen] = useState(false) const [isHoseSettingsOpen, setIsHoseSettingsOpen] = useState(false) @@ -172,6 +178,16 @@ export function Topbar({ {isSaving ? 'Speichern...' : 'Speichern'} + +