diff --git a/app/w/[id]/workflow.tsx b/app/w/[id]/workflow.tsx index 7ba9872b2d..8ab503283b 100644 --- a/app/w/[id]/workflow.tsx +++ b/app/w/[id]/workflow.tsx @@ -30,6 +30,7 @@ import { executeWorkflow } from '@/lib/workflow' import { useWorkflowExecution } from '../hooks/use-workflow-execution' import { useWorkflowRegistry } from '@/stores/workflow/workflow-registry' import { useParams, useRouter } from 'next/navigation' +import { X } from 'lucide-react' /** * Represents the data structure for a workflow node @@ -71,18 +72,61 @@ const CustomEdge = (props: EdgeProps) => { targetY: props.targetY, }) + const midPoint = { + x: (props.sourceX + props.targetX) / 2, + y: (props.sourceY + props.targetY) / 2, + } + + const isSelected = props.id === props.data?.selectedEdgeId + return ( - + + {/* Invisible wider path for better click interaction */} + + {/* Visible animated path */} + + + + + {/* Delete button - only show when edge is selected */} + {isSelected && ( + +
{ + e.stopPropagation() + props.data?.onDelete?.(props.id) + }} + > + +
+
+ )} +
) } @@ -98,6 +142,7 @@ const edgeTypes: EdgeTypes = { custom: CustomEdge } */ function WorkflowCanvas() { const [selectedBlockId, setSelectedBlockId] = useState(null) + const [selectedEdgeId, setSelectedEdgeId] = useState(null) const { isExecuting, executionResult, handleRunWorkflow } = useWorkflowExecution() @@ -220,51 +265,58 @@ function WorkflowCanvas() { const onNodeClick = useCallback((event: React.MouseEvent, node: any) => { event.stopPropagation() setSelectedBlockId(node.id) + setSelectedEdgeId(null) }, []) // Handler for clicks on the empty canvas const onPaneClick = useCallback((event: React.MouseEvent) => { setSelectedBlockId(null) + setSelectedEdgeId(null) }, []) - useEffect(() => { - initializeStateLogger() + // Add this new handler + const onEdgeClick = useCallback((event: React.MouseEvent, edge: any) => { + setSelectedEdgeId(edge.id) }, []) - /** - * CSS keyframe animation for the dashed line effect - */ - const keyframeStyles = ` - @keyframes dashdraw { - from { stroke-dashoffset: 10; } - to { stroke-dashoffset: -10; } - } - ` - - // Add keyboard shortcut handler + // Add keyboard event handler useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { - if ((event.metaKey || event.ctrlKey) && event.key === 'z') { - if (event.shiftKey) { - if (canRedo()) redo() - } else { - if (canUndo()) undo() - } - event.preventDefault() + if ( + (event.key === 'Delete' || event.key === 'Backspace') && + selectedEdgeId + ) { + removeEdge(selectedEdgeId) + setSelectedEdgeId(null) } } window.addEventListener('keydown', handleKeyDown) return () => window.removeEventListener('keydown', handleKeyDown) - }, [canUndo, canRedo, undo, redo]) + }, [selectedEdgeId, removeEdge]) + + useEffect(() => { + initializeStateLogger() + }, []) + + // Update the edges to include both selectedEdgeId and onDelete handler + const edgesWithSelection = edges.map((edge) => ({ + ...edge, + data: { + selectedEdgeId, + onDelete: (edgeId: string) => { + removeEdge(edgeId) + setSelectedEdgeId(null) + }, + }, + })) return (
-