[BS-2512](https://linear.app/affine-design/issue/BS-2512/选中多段粘贴,多段只有第一段会被replace,这个bug还在)
56 lines
1.5 KiB
TypeScript
56 lines
1.5 KiB
TypeScript
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,
|
|
}
|
|
);
|
|
}
|