From 81ead5cd35d28beb45d482167141a37f52a5e3ef Mon Sep 17 00:00:00 2001 From: doouding Date: Thu, 13 Feb 2025 02:53:06 +0000 Subject: [PATCH] fix: database cross doc dragging (#10126) --- .../src/middleware/new-id-cross-doc.ts | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/blocksuite/affine/widget-drag-handle/src/middleware/new-id-cross-doc.ts b/blocksuite/affine/widget-drag-handle/src/middleware/new-id-cross-doc.ts index 5230cb370..02ae4bb61 100644 --- a/blocksuite/affine/widget-drag-handle/src/middleware/new-id-cross-doc.ts +++ b/blocksuite/affine/widget-drag-handle/src/middleware/new-id-cross-doc.ts @@ -1,3 +1,5 @@ +import { DatabaseBlockModel } from '@blocksuite/affine-model'; +import { matchModels } from '@blocksuite/affine-shared/utils'; import type { BlockStdScope } from '@blocksuite/block-std'; import type { TransformerMiddleware } from '@blocksuite/store'; @@ -5,12 +7,38 @@ export const newIdCrossDoc = (std: BlockStdScope): TransformerMiddleware => ({ slots }) => { let samePage = false; + const oldToNewIdMap = new Map(); + slots.beforeImport.on(payload => { if (payload.type === 'slice') { samePage = payload.snapshot.pageId === std.store.id; } if (payload.type === 'block' && !samePage) { - payload.snapshot.id = std.workspace.idGenerator(); + const newId = std.workspace.idGenerator(); + + oldToNewIdMap.set(payload.snapshot.id, newId); + payload.snapshot.id = newId; + } + }); + + slots.afterImport.on(payload => { + if ( + !samePage && + payload.type === 'block' && + matchModels(payload.model, [DatabaseBlockModel]) + ) { + const originalCells = payload.model.cells; + const newCells = { + ...originalCells, + }; + + Object.keys(originalCells).forEach(cellId => { + if (oldToNewIdMap.has(cellId)) { + newCells[oldToNewIdMap.get(cellId)!] = originalCells[cellId]; + } + }); + + payload.model.cells$.value = newCells; } }); };