fix: workflow node selection state not sync caused problem (#36390)

This commit is contained in:
Joel 2026-05-19 20:29:16 +08:00 committed by GitHub
parent 809f513ccb
commit 0b48a7e991
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 48 additions and 7 deletions

View File

@ -484,6 +484,51 @@ describe('useNodesInteractions', () => {
expect(nodesArg[0]?.data.selected).toBe(false)
})
it('keeps ReactFlow and node data selection in sync when selecting another node', () => {
currentNodes = [
createNode({
id: 'knowledge-retrieval-node',
selected: true,
data: {
type: BlockEnum.KnowledgeRetrieval,
title: 'Knowledge Retrieval',
desc: '',
selected: true,
},
}),
createNode({
id: 'answer-node',
position: { x: 100, y: 0 },
data: {
type: BlockEnum.Answer,
title: 'Answer',
desc: '',
},
}),
]
rfState.nodes = currentNodes as unknown as typeof rfState.nodes
const { result } = renderWorkflowHook(() => useNodesInteractions(), {
historyStore: {
nodes: currentNodes,
edges: currentEdges,
},
})
act(() => {
result.current.handleNodeSelect('answer-node')
})
const nodesArg = rfState.setNodes.mock.calls[0]?.[0] as Node[]
const knowledgeNode = nodesArg.find(node => node.id === 'knowledge-retrieval-node')
const answerNode = nodesArg.find(node => node.id === 'answer-node')
expect(knowledgeNode?.selected).toBe(false)
expect(knowledgeNode?.data.selected).toBe(false)
expect(answerNode?.selected).toBe(true)
expect(answerNode?.data.selected).toBe(true)
})
it('skips clipboard copy when bundled/selected nodes have no metadata', () => {
currentNodes = [
createNode({

View File

@ -440,16 +440,12 @@ export const useNodesInteractions = () => {
if (initShowLastRunTab)
workflowStore.setState({ initShowLastRunTab: true })
const { nodes, setNodes, edges, setEdges } = collaborativeWorkflow.getState()
const selectedNode = nodes.find(node => node.data.selected)
if (!cancelSelection && selectedNode?.id === nodeId)
return
const newNodes = produce(nodes, (draft) => {
draft.forEach((node) => {
if (node.id === nodeId)
node.data.selected = !cancelSelection
else node.data.selected = false
const selected = node.id === nodeId && !cancelSelection
node.selected = selected
node.data.selected = selected
})
})
setNodes(newNodes, false)