From 805bb7c468c64e44b588c2a2e98da5917f882fbc Mon Sep 17 00:00:00 2001 From: hjlarry Date: Mon, 19 Jan 2026 18:01:43 +0800 Subject: [PATCH] fix node in panel sync --- .../core/collaboration-manager.ts | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/web/app/components/workflow/collaboration/core/collaboration-manager.ts b/web/app/components/workflow/collaboration/core/collaboration-manager.ts index 87f5d45ec2..10333b5bc4 100644 --- a/web/app/components/workflow/collaboration/core/collaboration-manager.ts +++ b/web/app/components/workflow/collaboration/core/collaboration-manager.ts @@ -890,13 +890,48 @@ export class CollaborationManager { this.pendingGraphImportEmit = true requestAnimationFrame(() => { this.pendingGraphImportEmit = false + const mergedNodes = this.mergeLocalNodeState(this.getNodes()) this.eventEmitter.emit('graphImport', { - nodes: this.getNodes(), + nodes: mergedNodes, edges: this.getEdges(), }) }) } + private mergeLocalNodeState(nodes: Node[]): Node[] { + const reactFlowStore = this.reactFlowStore + const state = reactFlowStore?.getState() + const localNodes = state?.getNodes() || [] + + if (localNodes.length === 0) + return nodes + + const localNodesMap = new Map(localNodes.map(node => [node.id, node])) + return nodes.map((node) => { + const localNode = localNodesMap.get(node.id) + if (!localNode) + return node + + const nextNode = cloneDeep(node) + const nextData = { ...(nextNode.data || {}) } as Node['data'] + const nextDataRecord = nextData as Record + const localData = localNode.data as Record | undefined + + if (localData) { + Object.entries(localData).forEach(([key, value]) => { + if (key === 'selected' || key.startsWith('_')) + nextDataRecord[key] = value + }) + } + + if (!Object.prototype.hasOwnProperty.call(nextDataRecord, 'selected') && localNode.selected !== undefined) + nextDataRecord.selected = localNode.selected + + nextNode.data = nextData + return nextNode + }) + } + private setupSocketEventListeners(socket: Socket): void { socket.on('collaboration_update', (update: CollaborationUpdate) => { if (update.type === 'mouse_move') {