fix(ux): Gefahrenzone-Werkzeug + Linienstärke + Text-Reset (v1.6.6)
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 33m35s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 33m35s
Aus interner UX-Review: - Gefahrenzone-Werkzeug (Shortcut D) fehlte komplett in der Werkzeugleiste → am Handy (ohne Tastatur) gar nicht auslösbar. Jetzt mit AlertTriangle-Icon drin. - Linienstärke-Regler ergänzt (Dünn/Mittel/Dick) — die Props selectedWidth/ onWidthChange waren vorhanden, aber nirgends bedienbar. - Text-Dialog setzt sich beim Öffnen zurück (kein alter Text nach Abbrechen mehr). - Einsatz-Beschreibung als mehrzeiliges Textfeld statt einzeiligem Input. Hinweis: Audit-Trail-Trigger bewusst NICHT wieder ergänzt — war auf ausdrücklichen Wunsch aus dem Menü entfernt worden. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "lageplan",
|
"name": "lageplan",
|
||||||
"version": "1.6.5",
|
"version": "1.6.6",
|
||||||
"description": "Feuerwehr Lageplan - Krokier-App für Einsatzdokumentation",
|
"description": "Feuerwehr Lageplan - Krokier-App für Einsatzdokumentation",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -419,12 +419,14 @@ export function ProjectDialog({
|
|||||||
|
|
||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
<Label htmlFor="project-description">Beschreibung</Label>
|
<Label htmlFor="project-description">Beschreibung</Label>
|
||||||
<Input
|
<textarea
|
||||||
id="project-description"
|
id="project-description"
|
||||||
value={description}
|
value={description}
|
||||||
onChange={(e) => setDescription(e.target.value)}
|
onChange={(e) => setDescription(e.target.value)}
|
||||||
placeholder="Optionale Notizen zum Einsatz"
|
placeholder="Optionale Notizen zum Einsatz"
|
||||||
disabled={isCreating}
|
disabled={isCreating}
|
||||||
|
rows={3}
|
||||||
|
className="w-full rounded-md border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring disabled:opacity-60 resize-y"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { useState } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
import { Button } from '@/components/ui/button'
|
import { Button } from '@/components/ui/button'
|
||||||
import { Input } from '@/components/ui/input'
|
import { Input } from '@/components/ui/input'
|
||||||
import { Label } from '@/components/ui/label'
|
import { Label } from '@/components/ui/label'
|
||||||
@@ -23,6 +23,11 @@ export function TextDialog({ open, onOpenChange, onConfirm, selectedColor }: Tex
|
|||||||
const [text, setText] = useState('')
|
const [text, setText] = useState('')
|
||||||
const [fontSize, setFontSize] = useState(16)
|
const [fontSize, setFontSize] = useState(16)
|
||||||
|
|
||||||
|
// Beim Öffnen zurücksetzen — sonst erscheint beim nächsten Text der alte Inhalt
|
||||||
|
useEffect(() => {
|
||||||
|
if (open) { setText(''); setFontSize(16) }
|
||||||
|
}, [open])
|
||||||
|
|
||||||
const handleConfirm = () => {
|
const handleConfirm = () => {
|
||||||
if (text.trim()) {
|
if (text.trim()) {
|
||||||
onConfirm(text.trim(), fontSize)
|
onConfirm(text.trim(), fontSize)
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import {
|
|||||||
MoveRight,
|
MoveRight,
|
||||||
Ruler,
|
Ruler,
|
||||||
Eraser,
|
Eraser,
|
||||||
|
AlertTriangle,
|
||||||
} from 'lucide-react'
|
} from 'lucide-react'
|
||||||
import type { DrawMode } from '@/types'
|
import type { DrawMode } from '@/types'
|
||||||
import { cn } from '@/lib/utils'
|
import { cn } from '@/lib/utils'
|
||||||
@@ -58,10 +59,17 @@ const drawTools: { mode: DrawMode; icon: typeof MousePointer2; label: string; sh
|
|||||||
{ mode: 'freehand', icon: Pencil, label: 'Freihand', shortcut: 'F' },
|
{ mode: 'freehand', icon: Pencil, label: 'Freihand', shortcut: 'F' },
|
||||||
{ mode: 'arrow', icon: MoveRight, label: 'Pfeil / Route', shortcut: 'A' },
|
{ mode: 'arrow', icon: MoveRight, label: 'Pfeil / Route', shortcut: 'A' },
|
||||||
{ mode: 'text', icon: Type, label: 'Text', shortcut: 'T' },
|
{ mode: 'text', icon: Type, label: 'Text', shortcut: 'T' },
|
||||||
|
{ mode: 'dangerzone', icon: AlertTriangle, label: 'Gefahrenzone', shortcut: 'D' },
|
||||||
{ mode: 'eraser', icon: Eraser, label: 'Radiergummi', shortcut: 'E' },
|
{ mode: 'eraser', icon: Eraser, label: 'Radiergummi', shortcut: 'E' },
|
||||||
{ mode: 'measure', icon: Ruler, label: 'Messen', shortcut: 'M' },
|
{ mode: 'measure', icon: Ruler, label: 'Messen', shortcut: 'M' },
|
||||||
]
|
]
|
||||||
|
|
||||||
|
const widths = [
|
||||||
|
{ value: 2, label: 'Dünn' },
|
||||||
|
{ value: 4, label: 'Mittel' },
|
||||||
|
{ value: 7, label: 'Dick' },
|
||||||
|
]
|
||||||
|
|
||||||
export function LeftToolbar({
|
export function LeftToolbar({
|
||||||
drawMode,
|
drawMode,
|
||||||
onDrawModeChange,
|
onDrawModeChange,
|
||||||
@@ -158,6 +166,30 @@ export function LeftToolbar({
|
|||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="w-8 lg:w-12 h-px bg-border my-1" />
|
||||||
|
|
||||||
|
{/* Linienstärke */}
|
||||||
|
<div className="flex flex-col gap-1">
|
||||||
|
{widths.map((w) => (
|
||||||
|
<button
|
||||||
|
key={w.value}
|
||||||
|
onClick={() => onWidthChange(w.value)}
|
||||||
|
disabled={!canEdit}
|
||||||
|
title={`Linienstärke: ${w.label}`}
|
||||||
|
className={cn(
|
||||||
|
'w-11 h-8 lg:w-12 lg:h-8 rounded-md flex items-center justify-center transition-colors',
|
||||||
|
selectedWidth === w.value ? 'bg-primary/15 ring-1 ring-primary' : 'hover:bg-accent',
|
||||||
|
!canEdit && 'opacity-50 cursor-not-allowed'
|
||||||
|
)}
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
className="rounded-full bg-foreground"
|
||||||
|
style={{ width: '20px', height: `${w.value}px` }}
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
</TooltipProvider>
|
</TooltipProvider>
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user