fix: resized canvas size and fixed delete comments

This commit is contained in:
Ida 2026-05-13 15:42:00 +02:00
parent 3a7a34a4f3
commit 9e36075f0e
4 changed files with 59 additions and 15 deletions

View file

@ -593,7 +593,7 @@
.canvasArea { .canvasArea {
flex: 1; flex: 1;
padding: 2rem; padding: 0;
min-height: 400px; min-height: 400px;
overflow-x: visible; overflow-x: visible;
overflow-y: hidden; overflow-y: hidden;

View file

@ -136,6 +136,7 @@ export const Automation2FlowEditor: React.FC<Automation2FlowEditorProps> = ({ in
zoom: 1, zoom: 1,
selectedNodeCount: 0, selectedNodeCount: 0,
connectionSelected: false, connectionSelected: false,
stickyNoteSelected: false,
}); });
const [canvasConnectionToolActive, setCanvasConnectionToolActive] = useState(false); const [canvasConnectionToolActive, setCanvasConnectionToolActive] = useState(false);
const [canvasStickyNotes, setCanvasStickyNotes] = useState<CanvasStickyNote[]>([]); const [canvasStickyNotes, setCanvasStickyNotes] = useState<CanvasStickyNote[]>([]);
@ -822,6 +823,7 @@ export const Automation2FlowEditor: React.FC<Automation2FlowEditorProps> = ({ in
zoomPercent: Math.round(canvasViewportEdit.zoom * 100), zoomPercent: Math.round(canvasViewportEdit.zoom * 100),
selectedNodeCount: canvasViewportEdit.selectedNodeCount, selectedNodeCount: canvasViewportEdit.selectedNodeCount,
connectionSelected: canvasViewportEdit.connectionSelected, connectionSelected: canvasViewportEdit.connectionSelected,
stickyNoteSelected: canvasViewportEdit.stickyNoteSelected,
connectionToolActive: canvasConnectionToolActive, connectionToolActive: canvasConnectionToolActive,
canUndo: canCanvasUndo, canUndo: canCanvasUndo,
canRedo: canCanvasRedo, canRedo: canCanvasRedo,

View file

@ -39,6 +39,7 @@ export interface CanvasHeaderCanvasEditProps {
zoomPercent: number; zoomPercent: number;
selectedNodeCount: number; selectedNodeCount: number;
connectionSelected: boolean; connectionSelected: boolean;
stickyNoteSelected: boolean;
connectionToolActive: boolean; connectionToolActive: boolean;
canUndo: boolean; canUndo: boolean;
canRedo: boolean; canRedo: boolean;
@ -206,7 +207,10 @@ export const CanvasHeader: React.FC<CanvasHeaderProps> = ({
}; };
const _canDeleteSelection = const _canDeleteSelection =
!!canvasEdit && (canvasEdit.selectedNodeCount > 0 || canvasEdit.connectionSelected); !!canvasEdit &&
(canvasEdit.selectedNodeCount > 0 ||
canvasEdit.connectionSelected ||
canvasEdit.stickyNoteSelected);
const _singleNodeOnly = const _singleNodeOnly =
!!canvasEdit && canvasEdit.selectedNodeCount === 1 && !canvasEdit.connectionSelected; !!canvasEdit && canvasEdit.selectedNodeCount === 1 && !canvasEdit.connectionSelected;

View file

@ -123,6 +123,8 @@ export interface FlowCanvasViewportEditState {
zoom: number; zoom: number;
selectedNodeCount: number; selectedNodeCount: number;
connectionSelected: boolean; connectionSelected: boolean;
/** Canvas-Sticky-/Kommentarnote ausgewählt (nicht Workflow-Knoten). */
stickyNoteSelected: boolean;
} }
export type FlowCanvasHandle = { export type FlowCanvasHandle = {
@ -518,8 +520,9 @@ export const FlowCanvas = forwardRef<FlowCanvasHandle, FlowCanvasProps>(function
zoom, zoom,
selectedNodeCount: selectedNodeIds.size, selectedNodeCount: selectedNodeIds.size,
connectionSelected: !!selectedConnectionId, connectionSelected: !!selectedConnectionId,
stickyNoteSelected: !!selectedStickyId,
}); });
}, [zoom, selectedNodeIds, selectedConnectionId, onViewportEditState]); }, [zoom, selectedNodeIds, selectedConnectionId, selectedStickyId, onViewportEditState]);
useEffect(() => { useEffect(() => {
onConnectionToolActiveChange?.(connectionToolActive); onConnectionToolActiveChange?.(connectionToolActive);
@ -590,17 +593,27 @@ export const FlowCanvas = forwardRef<FlowCanvasHandle, FlowCanvasProps>(function
emitHistoryCheckpoint(); emitHistoryCheckpoint();
return; return;
} }
if (selectedNodeIds.size === 0) return; if (selectedNodeIds.size > 0) {
const ids = selectedNodeIds; const ids = selectedNodeIds;
onNodesChange(nodes.filter((n) => !ids.has(n.id))); onNodesChange(nodes.filter((n) => !ids.has(n.id)));
onConnectionsChange( onConnectionsChange(
connections.filter((c) => !ids.has(c.sourceId) && !ids.has(c.targetId)) connections.filter((c) => !ids.has(c.sourceId) && !ids.has(c.targetId))
); );
setSelectedNodeIds(new Set()); setSelectedNodeIds(new Set());
setEditingNodeId(null); setEditingNodeId(null);
setEditingField(null); setEditingField(null);
setSelectedStickyId(null); setSelectedStickyId(null);
emitHistoryCheckpoint(); emitHistoryCheckpoint();
return;
}
const changeSticky = onStickyNotesChangeRef.current;
const sid = selectedStickyId;
if (sid && changeSticky) {
changeSticky(stickyNotesRef.current.filter((s) => s.id !== sid));
setSelectedStickyId(null);
setEditingStickyId(null);
emitHistoryCheckpoint();
}
}, },
duplicateSingleSelection: () => { duplicateSingleSelection: () => {
if (selectedNodeIds.size !== 1) return; if (selectedNodeIds.size !== 1) return;
@ -663,6 +676,7 @@ export const FlowCanvas = forwardRef<FlowCanvasHandle, FlowCanvasProps>(function
onNodesChange, onNodesChange,
selectedConnectionId, selectedConnectionId,
selectedNodeIds, selectedNodeIds,
selectedStickyId,
] ]
); );
@ -1199,6 +1213,15 @@ export const FlowCanvas = forwardRef<FlowCanvasHandle, FlowCanvasProps>(function
emitHistoryCheckpoint(); emitHistoryCheckpoint();
}, [selectedNodeIds, nodes, connections, onNodesChange, onConnectionsChange, emitHistoryCheckpoint]); }, [selectedNodeIds, nodes, connections, onNodesChange, onConnectionsChange, emitHistoryCheckpoint]);
const handleDeleteSelectedStickyNote = useCallback(() => {
const change = onStickyNotesChangeRef.current;
if (!selectedStickyId || !change) return;
change(stickyNotesRef.current.filter((s) => s.id !== selectedStickyId));
setSelectedStickyId(null);
setEditingStickyId(null);
emitHistoryCheckpoint();
}, [selectedStickyId, emitHistoryCheckpoint]);
React.useEffect(() => { React.useEffect(() => {
const onKeyDown = (e: KeyboardEvent) => { const onKeyDown = (e: KeyboardEvent) => {
const target = e.target as HTMLElement; const target = e.target as HTMLElement;
@ -1220,12 +1243,22 @@ export const FlowCanvas = forwardRef<FlowCanvasHandle, FlowCanvasProps>(function
} else if (selectedNodeIds.size > 0) { } else if (selectedNodeIds.size > 0) {
e.preventDefault(); e.preventDefault();
handleDeleteNode(); handleDeleteNode();
} else if (selectedStickyId && onStickyNotesChangeRef.current) {
e.preventDefault();
handleDeleteSelectedStickyNote();
} }
} }
}; };
window.addEventListener('keydown', onKeyDown); window.addEventListener('keydown', onKeyDown);
return () => window.removeEventListener('keydown', onKeyDown); return () => window.removeEventListener('keydown', onKeyDown);
}, [handleDeleteNode, handleDeleteConnection, selectedNodeIds.size, selectedConnectionId]); }, [
handleDeleteNode,
handleDeleteConnection,
handleDeleteSelectedStickyNote,
selectedNodeIds.size,
selectedConnectionId,
selectedStickyId,
]);
const handleNodeUpdate = useCallback( const handleNodeUpdate = useCallback(
(nodeId: string, updates: Partial<Pick<CanvasNode, 'title' | 'comment'>>) => { (nodeId: string, updates: Partial<Pick<CanvasNode, 'title' | 'comment'>>) => {
@ -1778,6 +1811,11 @@ export const FlowCanvas = forwardRef<FlowCanvasHandle, FlowCanvasProps>(function
backgroundColor: pal.bg, backgroundColor: pal.bg,
borderColor: pal.border, borderColor: pal.border,
}} }}
onFocus={() => {
setSelectedStickyId(sn.id);
setSelectedNodeIds(new Set());
setSelectedConnectionId(null);
}}
onDoubleClick={(e) => { onDoubleClick={(e) => {
e.stopPropagation(); e.stopPropagation();
setSelectedStickyId(sn.id); setSelectedStickyId(sn.id);