Skip to content

Commit 3dd6852

Browse files
committed
feat: Implement edge selection functionality in flow canvas
1 parent e0de4df commit 3dd6852

File tree

2 files changed

+20
-8
lines changed

2 files changed

+20
-8
lines changed

frontend/src/components/canvas/FlowCanvas.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
import '@xyflow/react/dist/style.css'
1515
import { useSelector, useDispatch } from 'react-redux'
1616
import Operator from './footer/Operator'
17-
import { setSelectedNode, deleteNode, setNodes, FlowWorkflowNode, FlowWorkflowEdge } from '../../store/flowSlice'
17+
import { setSelectedNode, deleteNode, setNodes, FlowWorkflowNode, FlowWorkflowEdge, setSelectedEdgeId } from '../../store/flowSlice'
1818
import NodeSidebar from '../nodes/nodeSidebar/NodeSidebar'
1919
import { Dropdown, DropdownMenu, DropdownSection, DropdownItem, DropdownTrigger } from '@heroui/react'
2020
import { useKeyboardShortcuts } from '../../hooks/useKeyboardShortcuts'
@@ -83,6 +83,7 @@ const FlowCanvasContent: React.FC<FlowCanvasProps> = (props) => {
8383
const edges = useSelector((state: RootState) => state.flow.edges, isEqual)
8484
const nodeConfigs = useSelector((state: RootState) => state.flow.nodeConfigs, isEqual)
8585
const selectedNodeID = useSelector((state: RootState) => state.flow.selectedNode)
86+
const selectedEdgeId = useSelector((state: RootState) => state.flow.selectedEdgeId)
8687

8788
const saveWorkflow = useSaveWorkflow()
8889

@@ -156,6 +157,7 @@ const FlowCanvasContent: React.FC<FlowCanvasProps> = (props) => {
156157
edges,
157158
hoveredNode,
158159
hoveredEdge,
160+
selectedEdgeId,
159161
handlePopoverOpen,
160162
})
161163

@@ -189,12 +191,19 @@ const FlowCanvasContent: React.FC<FlowCanvasProps> = (props) => {
189191
[dispatch]
190192
)
191193

194+
const onEdgeClick = useCallback((_event: React.MouseEvent, edge: Edge) => {
195+
dispatch(setSelectedEdgeId({ edgeId: edge.id }))
196+
}, [dispatch])
197+
192198
const onPaneClick = useCallback(() => {
193199
if (selectedNodeID) {
194200
dispatch(setSelectedNode({ nodeId: null }))
195201
}
202+
if (selectedEdgeId) {
203+
dispatch(setSelectedEdgeId({ edgeId: null }))
204+
}
196205
dispatch(setNodePanelExpanded(false))
197-
}, [dispatch, selectedNodeID])
206+
}, [dispatch, selectedNodeID, selectedEdgeId])
198207

199208
const onNodesDelete = useCallback(
200209
(deletedNodes: FlowWorkflowNode[]) => {
@@ -353,6 +362,7 @@ const FlowCanvasContent: React.FC<FlowCanvasProps> = (props) => {
353362
fitView
354363
onInit={onInit}
355364
onNodeClick={onNodeClick}
365+
onEdgeClick={onEdgeClick}
356366
onPaneClick={onPaneClick}
357367
onNodesDelete={onNodesDelete}
358368
proOptions={proOptions}

frontend/src/utils/flowUtils.tsx

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ interface StyledEdgesOptions {
283283
edges: Edge[]
284284
hoveredNode: string | null
285285
hoveredEdge: string | null
286+
selectedEdgeId: string | null
286287
handlePopoverOpen?: (params: { sourceNode: Node; targetNode: Node; edgeId: string }) => void
287288
readOnly?: boolean
288289
}
@@ -291,6 +292,7 @@ export const useStyledEdges = ({
291292
edges,
292293
hoveredNode,
293294
hoveredEdge,
295+
selectedEdgeId,
294296
handlePopoverOpen,
295297
readOnly = false,
296298
}: StyledEdgesOptions) => {
@@ -303,7 +305,7 @@ export const useStyledEdges = ({
303305
type: 'custom',
304306
style: {
305307
stroke: readOnly
306-
? edge.id === hoveredEdge
308+
? edge.id === hoveredEdge || edge.id === selectedEdgeId
307309
? isDark
308310
? '#fff'
309311
: '#000'
@@ -314,31 +316,31 @@ export const useStyledEdges = ({
314316
: isDark
315317
? '#888'
316318
: '#555'
317-
: hoveredEdge === edge.id || hoveredNode === edge.source || hoveredNode === edge.target
319+
: hoveredEdge === edge.id || edge.id === selectedEdgeId || hoveredNode === edge.source || hoveredNode === edge.target
318320
? isDark
319321
? '#fff'
320322
: '#555'
321323
: isDark
322324
? '#666'
323325
: '#999',
324326
strokeWidth: readOnly
325-
? edge.id === hoveredEdge
327+
? edge.id === hoveredEdge || edge.id === selectedEdgeId
326328
? 4
327329
: edge.source === hoveredNode || edge.target === hoveredNode
328330
? 4
329331
: 2
330-
: hoveredEdge === edge.id || hoveredNode === edge.source || hoveredNode === edge.target
332+
: hoveredEdge === edge.id || edge.id === selectedEdgeId || hoveredNode === edge.source || hoveredNode === edge.target
331333
? 3
332334
: 1.5,
333335
},
334336
data: {
335337
...edge.data,
336-
showPlusButton: edge.id === hoveredEdge,
338+
showPlusButton: edge.id === hoveredEdge || edge.id === selectedEdgeId,
337339
onPopoverOpen: handlePopoverOpen,
338340
},
339341
key: edge.id,
340342
}))
341-
}, [edges, hoveredNode, hoveredEdge, handlePopoverOpen, readOnly, isDark])
343+
}, [edges, hoveredNode, hoveredEdge, selectedEdgeId, handlePopoverOpen, readOnly, isDark])
342344
}
343345

344346
interface NodesWithModeOptions {

0 commit comments

Comments
 (0)