fix(ui): Freigeben-Button in Topbar + Toolbar-Farben nicht mehr abgeschnitten (v1.6.7)
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 32m5s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 32m5s
- Freigeben: prominenter grüner Button neben Speichern, sichtbar solange man den Bearbeitungs-Lock hält (war nur als versteckter Link in der Statuszeile) - Linke Toolbar kompakter (flachere Buttons/Trenner, pb-3), damit Farben und Linienstärke auf kleineren Screens nicht mehr unten rauslaufen 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.6",
|
"version": "1.6.7",
|
||||||
"description": "Feuerwehr Lageplan - Krokier-App für Einsatzdokumentation",
|
"description": "Feuerwehr Lageplan - Krokier-App für Einsatzdokumentation",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1030,6 +1030,9 @@ export default function AppPage() {
|
|||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
windLive={windLive}
|
windLive={windLive}
|
||||||
|
isEditingByMe={isEditingByMe}
|
||||||
|
onStopEditing={handleStopEditing}
|
||||||
|
editingLoading={editingLoading}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{/* Kompakte Status-Zeile — eine Zeile mit Chips statt bis zu vier gestapelten Bannern.
|
{/* Kompakte Status-Zeile — eine Zeile mit Chips statt bis zu vier gestapelten Bannern.
|
||||||
|
|||||||
@@ -83,8 +83,8 @@ export function LeftToolbar({
|
|||||||
}: LeftToolbarProps) {
|
}: LeftToolbarProps) {
|
||||||
return (
|
return (
|
||||||
<TooltipProvider delayDuration={300}>
|
<TooltipProvider delayDuration={300}>
|
||||||
<aside data-tour="toolbar" className="w-14 lg:w-20 border-r border-border bg-card flex flex-col items-center py-1.5 lg:py-2 shrink-0 overflow-y-auto overflow-x-hidden z-10">
|
<aside data-tour="toolbar" className="w-14 lg:w-20 border-r border-border bg-card flex flex-col items-center py-1 lg:py-2 pb-3 shrink-0 overflow-y-auto overflow-x-hidden z-10">
|
||||||
{/* Draw Tools — Touch-Ziele mind. 44px auf Mobil/Tablet */}
|
{/* Draw Tools — Touch-Ziele gross genug für Finger */}
|
||||||
<div className="flex flex-col gap-0.5">
|
<div className="flex flex-col gap-0.5">
|
||||||
{drawTools.map((tool) => (
|
{drawTools.map((tool) => (
|
||||||
<Tooltip key={tool.mode}>
|
<Tooltip key={tool.mode}>
|
||||||
@@ -92,7 +92,7 @@ export function LeftToolbar({
|
|||||||
<Button
|
<Button
|
||||||
variant={drawMode === tool.mode ? 'default' : 'ghost'}
|
variant={drawMode === tool.mode ? 'default' : 'ghost'}
|
||||||
size="icon"
|
size="icon"
|
||||||
className="w-11 h-11 lg:w-12 lg:h-12"
|
className="w-11 h-10 lg:w-12 lg:h-12"
|
||||||
onClick={() => onDrawModeChange(tool.mode)}
|
onClick={() => onDrawModeChange(tool.mode)}
|
||||||
disabled={!canEdit && tool.mode !== 'select'}
|
disabled={!canEdit && tool.mode !== 'select'}
|
||||||
>
|
>
|
||||||
@@ -106,16 +106,16 @@ export function LeftToolbar({
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="w-8 lg:w-12 h-px bg-border my-1" />
|
<div className="w-8 lg:w-12 h-px bg-border my-0.5 lg:my-1" />
|
||||||
|
|
||||||
{/* Undo/Redo — mobil gestapelt (44px), Desktop 2-spaltig */}
|
{/* Undo/Redo — mobil gestapelt (flach), Desktop 2-spaltig */}
|
||||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-0.5">
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-0.5">
|
||||||
<Tooltip>
|
<Tooltip>
|
||||||
<TooltipTrigger asChild>
|
<TooltipTrigger asChild>
|
||||||
<Button
|
<Button
|
||||||
variant="ghost"
|
variant="ghost"
|
||||||
size="icon"
|
size="icon"
|
||||||
className="w-11 h-11 lg:w-8 lg:h-8"
|
className="w-11 h-9 lg:w-8 lg:h-8"
|
||||||
onClick={onUndo}
|
onClick={onUndo}
|
||||||
disabled={!canEdit}
|
disabled={!canEdit}
|
||||||
>
|
>
|
||||||
@@ -132,7 +132,7 @@ export function LeftToolbar({
|
|||||||
<Button
|
<Button
|
||||||
variant="ghost"
|
variant="ghost"
|
||||||
size="icon"
|
size="icon"
|
||||||
className="w-11 h-11 lg:w-8 lg:h-8"
|
className="w-11 h-9 lg:w-8 lg:h-8"
|
||||||
onClick={onRedo}
|
onClick={onRedo}
|
||||||
disabled={!canEdit}
|
disabled={!canEdit}
|
||||||
>
|
>
|
||||||
@@ -146,10 +146,10 @@ export function LeftToolbar({
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="w-8 lg:w-12 h-px bg-border my-1" />
|
<div className="w-8 lg:w-12 h-px bg-border my-0.5 lg:my-1" />
|
||||||
|
|
||||||
{/* Color Picker - 2-col grid, grössere Swatches für Touch */}
|
{/* Color Picker - 2-col grid, grössere Swatches für Touch */}
|
||||||
<div className="grid grid-cols-2 gap-1">
|
<div className="grid grid-cols-2 gap-1 shrink-0">
|
||||||
{colors.map((color) => (
|
{colors.map((color) => (
|
||||||
<button
|
<button
|
||||||
key={color.value}
|
key={color.value}
|
||||||
@@ -167,10 +167,10 @@ export function LeftToolbar({
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="w-8 lg:w-12 h-px bg-border my-1" />
|
<div className="w-8 lg:w-12 h-px bg-border my-0.5 lg:my-1" />
|
||||||
|
|
||||||
{/* Linienstärke */}
|
{/* Linienstärke */}
|
||||||
<div className="flex flex-col gap-1">
|
<div className="flex flex-col gap-0.5 shrink-0">
|
||||||
{widths.map((w) => (
|
{widths.map((w) => (
|
||||||
<button
|
<button
|
||||||
key={w.value}
|
key={w.value}
|
||||||
@@ -178,7 +178,7 @@ export function LeftToolbar({
|
|||||||
disabled={!canEdit}
|
disabled={!canEdit}
|
||||||
title={`Linienstärke: ${w.label}`}
|
title={`Linienstärke: ${w.label}`}
|
||||||
className={cn(
|
className={cn(
|
||||||
'w-11 h-8 lg:w-12 lg:h-8 rounded-md flex items-center justify-center transition-colors',
|
'w-11 h-7 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',
|
selectedWidth === w.value ? 'bg-primary/15 ring-1 ring-primary' : 'hover:bg-accent',
|
||||||
!canEdit && 'opacity-50 cursor-not-allowed'
|
!canEdit && 'opacity-50 cursor-not-allowed'
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -80,6 +80,12 @@ interface TopbarProps {
|
|||||||
onTogglePresentationLock?: () => void
|
onTogglePresentationLock?: () => void
|
||||||
/** Windrichtung wird live aktualisiert (für die Live-Anzeige oben) */
|
/** Windrichtung wird live aktualisiert (für die Live-Anzeige oben) */
|
||||||
windLive?: boolean
|
windLive?: boolean
|
||||||
|
/** true, wenn der aktuelle Nutzer den Bearbeitungs-Lock hält */
|
||||||
|
isEditingByMe?: boolean
|
||||||
|
/** Karte speichern & für andere freigeben (Lock lösen) */
|
||||||
|
onStopEditing?: () => void
|
||||||
|
/** Lock-Aktion läuft gerade */
|
||||||
|
editingLoading?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Topbar({
|
export function Topbar({
|
||||||
@@ -107,6 +113,9 @@ export function Topbar({
|
|||||||
presentationLocked,
|
presentationLocked,
|
||||||
onTogglePresentationLock,
|
onTogglePresentationLock,
|
||||||
windLive,
|
windLive,
|
||||||
|
isEditingByMe,
|
||||||
|
onStopEditing,
|
||||||
|
editingLoading,
|
||||||
}: TopbarProps) {
|
}: TopbarProps) {
|
||||||
const [isLoadDialogOpen, setIsLoadDialogOpen] = useState(false)
|
const [isLoadDialogOpen, setIsLoadDialogOpen] = useState(false)
|
||||||
const [isHoseSettingsOpen, setIsHoseSettingsOpen] = useState(false)
|
const [isHoseSettingsOpen, setIsHoseSettingsOpen] = useState(false)
|
||||||
@@ -236,6 +245,21 @@ export function Topbar({
|
|||||||
{isSaving ? <Loader2 className="w-5 h-5 animate-spin" /> : <Save className="w-5 h-5" />}
|
{isSaving ? <Loader2 className="w-5 h-5 animate-spin" /> : <Save className="w-5 h-5" />}
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
|
{/* Freigeben — nur sichtbar, solange ich den Bearbeitungs-Lock halte.
|
||||||
|
Speichert und gibt die Karte für andere frei. Grün = ich bin am Zeichnen. */}
|
||||||
|
{isEditingByMe && onStopEditing && (
|
||||||
|
<Button
|
||||||
|
variant="outline"
|
||||||
|
className="h-9 md:h-10 px-2 md:px-2.5 shrink-0 border-green-500 text-green-700 hover:bg-green-50 dark:text-green-400 dark:hover:bg-green-950/40"
|
||||||
|
onClick={onStopEditing}
|
||||||
|
disabled={editingLoading}
|
||||||
|
title="Karte speichern & für andere freigeben"
|
||||||
|
>
|
||||||
|
{editingLoading ? <Loader2 className="w-5 h-5 animate-spin lg:mr-1" /> : <Unlock className="w-5 h-5 lg:mr-1" />}
|
||||||
|
<span className="hidden lg:inline">Freigeben</span>
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
|
||||||
{/* Neu — Split-Button für Einsatz/Übung (ein Akzent statt zwei farbiger Buttons) */}
|
{/* Neu — Split-Button für Einsatz/Übung (ein Akzent statt zwei farbiger Buttons) */}
|
||||||
<DropdownMenu>
|
<DropdownMenu>
|
||||||
<DropdownMenuTrigger asChild>
|
<DropdownMenuTrigger asChild>
|
||||||
|
|||||||
Reference in New Issue
Block a user