mirror of
https://github.com/alkimake/paperclip.git
synced 2026-06-18 19:50:38 +09:00
Fix atomic markdown mention deletion
Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
parent
db42adf1bf
commit
bd0b76072b
7 changed files with 242 additions and 1 deletions
86
ui/src/lib/mention-deletion.test.ts
Normal file
86
ui/src/lib/mention-deletion.test.ts
Normal file
|
|
@ -0,0 +1,86 @@
|
|||
import { describe, expect, it } from "vitest";
|
||||
import { $createLinkNode, LinkNode } from "@lexical/link";
|
||||
import { buildAgentMentionHref } from "@paperclipai/shared";
|
||||
import {
|
||||
createEditor,
|
||||
$createParagraphNode,
|
||||
$createTextNode,
|
||||
$getRoot,
|
||||
$getSelection,
|
||||
$isRangeSelection,
|
||||
} from "lexical";
|
||||
import { deleteSelectedMentionChip } from "./mention-deletion";
|
||||
|
||||
function createTestEditor() {
|
||||
return createEditor({
|
||||
namespace: "mention-deletion-test",
|
||||
nodes: [LinkNode],
|
||||
onError(error: Error) {
|
||||
throw error;
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
describe("mention deletion", () => {
|
||||
it("removes the full mention when backspacing from inside the chip", () => {
|
||||
const editor = createTestEditor();
|
||||
|
||||
editor.update(() => {
|
||||
const root = $getRoot();
|
||||
const paragraph = $createParagraphNode();
|
||||
const before = $createTextNode("Hello ");
|
||||
const mention = $createLinkNode(buildAgentMentionHref("agent-123", "code"));
|
||||
const mentionText = $createTextNode("@QA");
|
||||
const after = $createTextNode(" world");
|
||||
|
||||
mention.append(mentionText);
|
||||
paragraph.append(before, mention, after);
|
||||
root.append(paragraph);
|
||||
|
||||
mentionText.selectEnd();
|
||||
|
||||
expect(deleteSelectedMentionChip("backward")).toBe(true);
|
||||
expect(root.getTextContent()).toBe("Hello world");
|
||||
|
||||
const selection = $getSelection();
|
||||
expect($isRangeSelection(selection)).toBe(true);
|
||||
if (!$isRangeSelection(selection)) {
|
||||
throw new Error("Expected range selection after backward mention deletion");
|
||||
}
|
||||
expect(selection.isCollapsed()).toBe(true);
|
||||
expect(selection.anchor.getNode().is(before)).toBe(true);
|
||||
expect(selection.anchor.offset).toBe(before.getTextContentSize());
|
||||
});
|
||||
});
|
||||
|
||||
it("removes the full mention when deleting forward from adjacent text", () => {
|
||||
const editor = createTestEditor();
|
||||
|
||||
editor.update(() => {
|
||||
const root = $getRoot();
|
||||
const paragraph = $createParagraphNode();
|
||||
const before = $createTextNode("Hello ");
|
||||
const mention = $createLinkNode(buildAgentMentionHref("agent-123", "code"));
|
||||
const mentionText = $createTextNode("@QA");
|
||||
const after = $createTextNode(" world");
|
||||
|
||||
mention.append(mentionText);
|
||||
paragraph.append(before, mention, after);
|
||||
root.append(paragraph);
|
||||
|
||||
before.selectEnd();
|
||||
|
||||
expect(deleteSelectedMentionChip("forward")).toBe(true);
|
||||
expect(root.getTextContent()).toBe("Hello world");
|
||||
|
||||
const selection = $getSelection();
|
||||
expect($isRangeSelection(selection)).toBe(true);
|
||||
if (!$isRangeSelection(selection)) {
|
||||
throw new Error("Expected range selection after forward mention deletion");
|
||||
}
|
||||
expect(selection.isCollapsed()).toBe(true);
|
||||
expect(selection.anchor.getNode().is(after)).toBe(true);
|
||||
expect(selection.anchor.offset).toBe(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue