fix(editor): paste when select multiple block texts (#10227)

[BS-2512](https://linear.app/affine-design/issue/BS-2512/选中多段粘贴,多段只有第一段会被replace,这个bug还在)
This commit is contained in:
donteatfriedrice
2025-02-18 12:13:55 +00:00
parent 176e0a1950
commit 15e9acefc2
4 changed files with 236 additions and 2 deletions

View File

@@ -0,0 +1,24 @@
import type { Page } from '@playwright/test';
export async function pasteContent(
page: Page,
clipData: Record<string, unknown>
) {
await page.evaluate(
({ clipData }) => {
const e = new ClipboardEvent('paste', {
clipboardData: new DataTransfer(),
});
Object.defineProperty(e, 'target', {
writable: false,
value: document,
});
Object.keys(clipData).forEach(key => {
e.clipboardData?.setData(key, clipData[key] as string);
});
document.dispatchEvent(e);
},
{ clipData }
);
await page.waitForTimeout(100);
}

View File

@@ -0,0 +1,55 @@
import type { RichText } from '@blocksuite/affine-components/rich-text';
import type { Page } from '@playwright/test';
export async function setSelection(
page: Page,
anchorBlockId: string,
anchorOffset: number,
focusBlockId: string,
focusOffset: number
) {
await page.evaluate(
({ anchorBlockId, anchorOffset, focusBlockId, focusOffset }) => {
const editorHost = document.querySelector('editor-host');
if (!editorHost) {
throw new Error('Cannot find editor host');
}
const anchorRichText = editorHost.querySelector<RichText>(
`[data-block-id="${anchorBlockId}"] rich-text`
)!;
const anchorRichTextRange = anchorRichText.inlineEditor!.toDomRange({
index: anchorOffset,
length: 0,
})!;
const focusRichText = editorHost.querySelector<RichText>(
`[data-block-id="${focusBlockId}"] rich-text`
)!;
const focusRichTextRange = focusRichText.inlineEditor!.toDomRange({
index: focusOffset,
length: 0,
})!;
const sl = getSelection();
if (!sl) throw new Error('Cannot get selection');
const range = document.createRange();
range.setStart(
anchorRichTextRange.startContainer,
anchorRichTextRange.startOffset
);
range.setEnd(
focusRichTextRange.startContainer,
focusRichTextRange.startOffset
);
sl.removeAllRanges();
sl.addRange(range);
},
{
anchorBlockId,
anchorOffset,
focusBlockId,
focusOffset,
}
);
}