feat(network): improve connector editing
This commit is contained in:
@@ -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'}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
)}
|
)}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
Reference in New Issue
Block a user