fix: database cross doc dragging (#10126)
This commit is contained in:
@@ -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 { BlockStdScope } from '@blocksuite/block-std';
|
||||||
import type { TransformerMiddleware } from '@blocksuite/store';
|
import type { TransformerMiddleware } from '@blocksuite/store';
|
||||||
|
|
||||||
@@ -5,12 +7,38 @@ export const newIdCrossDoc =
|
|||||||
(std: BlockStdScope): TransformerMiddleware =>
|
(std: BlockStdScope): TransformerMiddleware =>
|
||||||
({ slots }) => {
|
({ slots }) => {
|
||||||
let samePage = false;
|
let samePage = false;
|
||||||
|
const oldToNewIdMap = new Map<string, string>();
|
||||||
|
|
||||||
slots.beforeImport.on(payload => {
|
slots.beforeImport.on(payload => {
|
||||||
if (payload.type === 'slice') {
|
if (payload.type === 'slice') {
|
||||||
samePage = payload.snapshot.pageId === std.store.id;
|
samePage = payload.snapshot.pageId === std.store.id;
|
||||||
}
|
}
|
||||||
if (payload.type === 'block' && !samePage) {
|
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;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user