feat(network): improve connector editing

This commit is contained in:
chihlasm
2026-04-14 02:56:28 +00:00
parent 3cd4084f78
commit 36721eb5af
4 changed files with 21 additions and 2 deletions

View File

@@ -6,6 +6,7 @@ import {
MiniMap, MiniMap,
BackgroundVariant, BackgroundVariant,
type OnConnect, type OnConnect,
type OnReconnect,
type OnNodesChange, type OnNodesChange,
type OnEdgesChange, type OnEdgesChange,
type Node, type Node,
@@ -23,6 +24,7 @@ interface NetworkCanvasProps {
onNodesChange: OnNodesChange onNodesChange: OnNodesChange
onEdgesChange: OnEdgesChange onEdgesChange: OnEdgesChange
onConnect: OnConnect onConnect: OnConnect
onReconnect: OnReconnect<Edge>
onNodeSelect: (nodeId: string | null) => void onNodeSelect: (nodeId: string | null) => void
onEdgeSelect: (edgeId: string | null) => void onEdgeSelect: (edgeId: string | null) => void
onDrop: (event: React.DragEvent) => void onDrop: (event: React.DragEvent) => void
@@ -41,6 +43,7 @@ export function NetworkCanvas({
onNodesChange, onNodesChange,
onEdgesChange, onEdgesChange,
onConnect, onConnect,
onReconnect,
onNodeSelect, onNodeSelect,
onEdgeSelect, onEdgeSelect,
onDrop, onDrop,
@@ -85,6 +88,7 @@ export function NetworkCanvas({
onNodesChange={onNodesChange} onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange} onEdgesChange={onEdgesChange}
onConnect={onConnect} onConnect={onConnect}
onReconnect={onReconnect}
onSelectionChange={handleSelectionChange} onSelectionChange={handleSelectionChange}
onPaneClick={handlePaneClick} onPaneClick={handlePaneClick}
onDrop={onDrop} onDrop={onDrop}
@@ -94,6 +98,9 @@ export function NetworkCanvas({
nodeTypes={nodeTypes} nodeTypes={nodeTypes}
edgeTypes={edgeTypes} edgeTypes={edgeTypes}
defaultEdgeOptions={{ type: 'connection' }} defaultEdgeOptions={{ type: 'connection' }}
edgesReconnectable
reconnectRadius={20}
connectionRadius={24}
deleteKeyCode={['Backspace', 'Delete']} deleteKeyCode={['Backspace', 'Delete']}
multiSelectionKeyCode="Shift" multiSelectionKeyCode="Shift"
panOnDrag={interactionMode === 'pan'} panOnDrag={interactionMode === 'pan'}

View File

@@ -257,6 +257,9 @@ export function PropertiesPanel({
<h3 className="text-xs font-semibold text-heading">Connection</h3> <h3 className="text-xs font-semibold text-heading">Connection</h3>
</div> </div>
<div className="flex flex-1 flex-col gap-3 overflow-y-auto p-3"> <div className="flex flex-1 flex-col gap-3 overflow-y-auto p-3">
<div className="rounded border border-default bg-elevated/40 px-2.5 py-2 text-[10px] text-muted-foreground">
Drag either end of the line on the canvas to reconnect it to a different asset.
</div>
<div className="flex flex-col gap-1"> <div className="flex flex-col gap-1">
<FieldLabel>Label</FieldLabel> <FieldLabel>Label</FieldLabel>
<FieldInput <FieldInput

View File

@@ -9,8 +9,8 @@ export function BaseHandle({ className, children, ...props }: ComponentProps<typ
<Handle <Handle
{...props} {...props}
className={cn( className={cn(
'h-[10px] w-[10px] rounded-full border border-default bg-elevated transition-opacity', 'h-[14px] w-[14px] rounded-full border border-default bg-elevated transition-opacity',
'opacity-0 group-hover:opacity-100', 'opacity-0 group-hover:opacity-100 group-focus-within:opacity-100',
className, className,
)} )}
> >

View File

@@ -5,6 +5,7 @@ import {
useNodesState, useNodesState,
useEdgesState, useEdgesState,
addEdge, addEdge,
reconnectEdge,
useReactFlow, useReactFlow,
getNodesBounds, getNodesBounds,
getViewportForBounds, getViewportForBounds,
@@ -402,6 +403,13 @@ function DiagramEditorInner() {
setIsDirty(true) setIsDirty(true)
}, [nodes, edges, pushHistory, setEdges]) }, [nodes, edges, pushHistory, setEdges])
const onReconnect = useCallback((oldEdge: Edge, newConnection: Connection) => {
pushHistory(nodes, edges)
setEdges(eds => reconnectEdge(oldEdge, newConnection, eds))
setSelectedEdgeId(oldEdge.id)
setIsDirty(true)
}, [nodes, edges, pushHistory, setEdges])
const onDragOver = useCallback((event: React.DragEvent) => { const onDragOver = useCallback((event: React.DragEvent) => {
event.preventDefault() event.preventDefault()
event.dataTransfer.dropEffect = 'move' event.dataTransfer.dropEffect = 'move'
@@ -822,6 +830,7 @@ function DiagramEditorInner() {
onNodesChange={handleNodesChange} onNodesChange={handleNodesChange}
onEdgesChange={handleEdgesChange} onEdgesChange={handleEdgesChange}
onConnect={onConnect} onConnect={onConnect}
onReconnect={onReconnect}
onNodeSelect={setSelectedNodeId} onNodeSelect={setSelectedNodeId}
onEdgeSelect={setSelectedEdgeId} onEdgeSelect={setSelectedEdgeId}
onDrop={onDrop} onDrop={onDrop}