fix: resolve stale selection bug in network diagram PropertiesPanel
Selection state now stores IDs and derives objects from live arrays, so edits in PropertiesPanel inputs reflect immediately. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -20,8 +20,8 @@ interface NetworkCanvasProps {
|
|||||||
onNodesChange: OnNodesChange
|
onNodesChange: OnNodesChange
|
||||||
onEdgesChange: OnEdgesChange
|
onEdgesChange: OnEdgesChange
|
||||||
onConnect: OnConnect
|
onConnect: OnConnect
|
||||||
onNodeSelect: (node: Node | null) => void
|
onNodeSelect: (nodeId: string | null) => void
|
||||||
onEdgeSelect: (edge: Edge | null) => void
|
onEdgeSelect: (edgeId: string | null) => void
|
||||||
onDrop: (event: React.DragEvent) => void
|
onDrop: (event: React.DragEvent) => void
|
||||||
onDragOver: (event: React.DragEvent) => void
|
onDragOver: (event: React.DragEvent) => void
|
||||||
}
|
}
|
||||||
@@ -39,10 +39,10 @@ export function NetworkCanvas({
|
|||||||
}: NetworkCanvasProps) {
|
}: NetworkCanvasProps) {
|
||||||
const handleSelectionChange = useCallback(({ nodes: selectedNodes, edges: selectedEdges }: { nodes: Node[]; edges: Edge[] }) => {
|
const handleSelectionChange = useCallback(({ nodes: selectedNodes, edges: selectedEdges }: { nodes: Node[]; edges: Edge[] }) => {
|
||||||
if (selectedNodes.length === 1) {
|
if (selectedNodes.length === 1) {
|
||||||
onNodeSelect(selectedNodes[0])
|
onNodeSelect(selectedNodes[0].id)
|
||||||
onEdgeSelect(null)
|
onEdgeSelect(null)
|
||||||
} else if (selectedEdges.length === 1) {
|
} else if (selectedEdges.length === 1) {
|
||||||
onEdgeSelect(selectedEdges[0])
|
onEdgeSelect(selectedEdges[0].id)
|
||||||
onNodeSelect(null)
|
onNodeSelect(null)
|
||||||
} else {
|
} else {
|
||||||
onNodeSelect(null)
|
onNodeSelect(null)
|
||||||
|
|||||||
@@ -36,8 +36,11 @@ function DiagramEditorInner() {
|
|||||||
const [nodes, setNodes, onNodesChange] = useNodesState<Node>([])
|
const [nodes, setNodes, onNodesChange] = useNodesState<Node>([])
|
||||||
const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([])
|
const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([])
|
||||||
|
|
||||||
const [selectedNode, setSelectedNode] = useState<Node | null>(null)
|
const [selectedNodeId, setSelectedNodeId] = useState<string | null>(null)
|
||||||
const [selectedEdge, setSelectedEdge] = useState<Edge | null>(null)
|
const [selectedEdgeId, setSelectedEdgeId] = useState<string | null>(null)
|
||||||
|
|
||||||
|
const selectedNode = selectedNodeId ? nodes.find(n => n.id === selectedNodeId) ?? null : null
|
||||||
|
const selectedEdge = selectedEdgeId ? edges.find(e => e.id === selectedEdgeId) ?? null : null
|
||||||
|
|
||||||
const [isDirty, setIsDirty] = useState(false)
|
const [isDirty, setIsDirty] = useState(false)
|
||||||
const [isSaving, setIsSaving] = useState(false)
|
const [isSaving, setIsSaving] = useState(false)
|
||||||
@@ -256,32 +259,19 @@ function DiagramEditorInner() {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
setSelectedEdge(prev => {
|
|
||||||
if (!prev || prev.id !== edgeId) return prev
|
|
||||||
return {
|
|
||||||
...prev,
|
|
||||||
label: updates.label !== undefined ? (updates.label || undefined) : prev.label,
|
|
||||||
data: {
|
|
||||||
...(prev.data || {}),
|
|
||||||
...(updates.connectionType !== undefined ? { connectionType: updates.connectionType } : {}),
|
|
||||||
...(updates.speed !== undefined ? { speed: updates.speed } : {}),
|
|
||||||
...(updates.notes !== undefined ? { notes: updates.notes } : {}),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
})
|
|
||||||
setIsDirty(true)
|
setIsDirty(true)
|
||||||
}, [setEdges])
|
}, [setEdges])
|
||||||
|
|
||||||
const handleDeleteNode = useCallback((nodeId: string) => {
|
const handleDeleteNode = useCallback((nodeId: string) => {
|
||||||
setNodes(nds => nds.filter(n => n.id !== nodeId))
|
setNodes(nds => nds.filter(n => n.id !== nodeId))
|
||||||
setEdges(eds => eds.filter(e => e.source !== nodeId && e.target !== nodeId))
|
setEdges(eds => eds.filter(e => e.source !== nodeId && e.target !== nodeId))
|
||||||
setSelectedNode(null)
|
setSelectedNodeId(null)
|
||||||
setIsDirty(true)
|
setIsDirty(true)
|
||||||
}, [setNodes, setEdges])
|
}, [setNodes, setEdges])
|
||||||
|
|
||||||
const handleDeleteEdge = useCallback((edgeId: string) => {
|
const handleDeleteEdge = useCallback((edgeId: string) => {
|
||||||
setEdges(eds => eds.filter(e => e.id !== edgeId))
|
setEdges(eds => eds.filter(e => e.id !== edgeId))
|
||||||
setSelectedEdge(null)
|
setSelectedEdgeId(null)
|
||||||
setIsDirty(true)
|
setIsDirty(true)
|
||||||
}, [setEdges])
|
}, [setEdges])
|
||||||
|
|
||||||
@@ -398,8 +388,8 @@ function DiagramEditorInner() {
|
|||||||
onNodesChange={handleNodesChange}
|
onNodesChange={handleNodesChange}
|
||||||
onEdgesChange={handleEdgesChange}
|
onEdgesChange={handleEdgesChange}
|
||||||
onConnect={onConnect}
|
onConnect={onConnect}
|
||||||
onNodeSelect={setSelectedNode}
|
onNodeSelect={setSelectedNodeId}
|
||||||
onEdgeSelect={setSelectedEdge}
|
onEdgeSelect={setSelectedEdgeId}
|
||||||
onDrop={onDrop}
|
onDrop={onDrop}
|
||||||
onDragOver={onDragOver}
|
onDragOver={onDragOver}
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user