fix(editor): cut and paste surface-ref to same doc should remain surface-ref (#11639)

Close [BS-3107](https://linear.app/affine-design/issue/BS-3107/剪切-surface-ref-block-会变成指向当前文档的link-card)
This commit is contained in:
donteatfriedrice
2025-04-12 01:56:24 +00:00
parent afdc40b510
commit 4da00eba0d
2 changed files with 79 additions and 46 deletions

View File

@@ -11,12 +11,16 @@ export const surfaceRefToEmbed =
} }
}); });
slots.beforeImport.subscribe(payload => { slots.beforeImport.subscribe(payload => {
// only handle surface-ref block snapshot
if ( if (
pageId && payload.type !== 'block' ||
payload.type === 'block' && payload.snapshot.flavour !== 'affine:surface-ref'
payload.snapshot.flavour === 'affine:surface-ref' && )
!std.store.hasBlock(payload.snapshot.id) return;
) {
// turn into embed-linked-doc if the current doc is different from the pageId of the surface-ref block
const isNotSameDoc = pageId !== std.store.doc.id;
if (pageId && isNotSameDoc) {
// The blockId of the original surface-ref block // The blockId of the original surface-ref block
const blockId = payload.snapshot.id; const blockId = payload.snapshot.id;
payload.snapshot.id = std.workspace.idGenerator(); payload.snapshot.id = std.workspace.idGenerator();

View File

@@ -9,6 +9,7 @@ import {
} from '@affine-test/kit/utils/editor'; } from '@affine-test/kit/utils/editor';
import { import {
copyByKeyboard, copyByKeyboard,
cutByKeyboard,
pasteByKeyboard, pasteByKeyboard,
pressEnter, pressEnter,
} from '@affine-test/kit/utils/keyboard'; } from '@affine-test/kit/utils/keyboard';
@@ -174,56 +175,84 @@ test.describe('paste in multiple blocks text selection', () => {
}); });
}); });
test('paste surface-ref block to another doc as embed-linked-doc block', async ({ test.describe('surface-ref block', () => {
page, async function setupSurfaceRefBlock(page: Page) {
}) => { await clickEdgelessModeButton(page);
await clickEdgelessModeButton(page); const container = locateEditorContainer(page);
const container = locateEditorContainer(page); await container.click();
await container.click();
// add a shape // add a shape
await page.keyboard.press('s'); await page.keyboard.press('s');
// click to add a shape await container.click({ position: { x: 100, y: 300 } });
await container.click({ position: { x: 100, y: 300 } }); await page.waitForTimeout(50);
await page.waitForTimeout(50);
// add a frame
await page.keyboard.press('f');
await page.waitForTimeout(50);
// click on the frame title to trigger the change frame button toolbar // add a frame
const frameTitle = page.locator('affine-frame-title'); await page.keyboard.press('f');
await frameTitle.click(); await page.waitForTimeout(50);
await page.waitForTimeout(50);
const toolbar = page.locator('affine-toolbar-widget editor-toolbar'); // click on the frame title to trigger the change frame button toolbar
const frameTitle = page.locator('affine-frame-title');
await frameTitle.click();
await page.waitForTimeout(50);
const insertIntoPageButton = toolbar.getByLabel('Insert into Page'); const toolbar = page.locator('affine-toolbar-widget editor-toolbar');
await insertIntoPageButton.click(); const insertIntoPageButton = toolbar.getByLabel('Insert into Page');
await insertIntoPageButton.click();
await clickPageModeButton(page); await clickPageModeButton(page);
await waitForEditorLoad(page); await waitForEditorLoad(page);
await container.click(); await container.click();
// copy surface-ref block return { container };
const surfaceRefBlock = page.locator('affine-surface-ref'); }
await surfaceRefBlock.click();
await page.waitForSelector('affine-surface-ref .focused');
await copyByKeyboard(page);
// paste to another doc test('paste surface-ref block to another doc as embed-linked-doc block', async ({
await clickNewPageButton(page, 'page2'); page,
await pressEnter(page); }) => {
await setupSurfaceRefBlock(page);
// paste the surface-ref block // copy surface-ref block
await pasteByKeyboard(page); const surfaceRefBlock = page.locator('affine-surface-ref');
await page.waitForTimeout(50); await surfaceRefBlock.click();
await page.waitForSelector('affine-surface-ref .focused');
await copyByKeyboard(page);
const embedLinkedDocBlock = page.locator('affine-embed-linked-doc-block'); // paste to another doc
await expect(embedLinkedDocBlock).toBeVisible(); await clickNewPageButton(page, 'page2');
const embedLinkedDocBlockTitle = embedLinkedDocBlock.locator( await pressEnter(page);
'.affine-embed-linked-doc-content-title-text'
); // paste the surface-ref block
await expect(embedLinkedDocBlockTitle).toHaveText('Clipboard Test'); await pasteByKeyboard(page);
await page.waitForTimeout(50);
const embedLinkedDocBlock = page.locator('affine-embed-linked-doc-block');
await expect(embedLinkedDocBlock).toBeVisible();
const embedLinkedDocBlockTitle = embedLinkedDocBlock.locator(
'.affine-embed-linked-doc-content-title-text'
);
await expect(embedLinkedDocBlockTitle).toHaveText('Clipboard Test');
});
test('cut and paste surface-ref block to same doc should remain surface-ref block', async ({
page,
}) => {
const { container } = await setupSurfaceRefBlock(page);
// cut surface-ref block
const surfaceRefBlock = page.locator('affine-surface-ref');
await surfaceRefBlock.click();
await page.waitForSelector('affine-surface-ref .focused');
await cutByKeyboard(page);
// focus on the editor
await container.click();
// paste the surface-ref block
await pasteByKeyboard(page);
await page.waitForTimeout(50);
await expect(surfaceRefBlock).toHaveCount(1);
await expect(surfaceRefBlock).toBeVisible();
});
}); });
test.describe('paste to code block', () => { test.describe('paste to code block', () => {