]> BookStack Code Mirror - bookstack/blob - resources/js/wysiwyg/actions.ts
Lexical: Completed out table menu elements, logic pending
[bookstack] / resources / js / wysiwyg / actions.ts
1 import {$getRoot, $getSelection, LexicalEditor} from "lexical";
2 import {$generateHtmlFromNodes} from "@lexical/html";
3 import {$htmlToBlockNodes} from "./helpers";
4
5
6
7 export function setEditorContentFromHtml(editor: LexicalEditor, html: string) {
8     editor.update(() => {
9         // Empty existing
10         const root = $getRoot();
11         for (const child of root.getChildren()) {
12             child.remove(true);
13         }
14
15         const nodes = $htmlToBlockNodes(editor, html);
16         root.append(...nodes);
17     });
18 }
19
20 export function appendHtmlToEditor(editor: LexicalEditor, html: string) {
21     editor.update(() => {
22         const root = $getRoot();
23         const nodes = $htmlToBlockNodes(editor, html);
24         root.append(...nodes);
25     });
26 }
27
28 export function prependHtmlToEditor(editor: LexicalEditor, html: string) {
29     editor.update(() => {
30         const root = $getRoot();
31         const nodes = $htmlToBlockNodes(editor, html);
32         let reference = root.getChildren()[0];
33         for (let i = nodes.length - 1; i >= 0; i--) {
34             if (reference) {
35                 reference.insertBefore(nodes[i]);
36             } else {
37                 root.append(nodes[i])
38             }
39             reference = nodes[i];
40         }
41     });
42 }
43
44 export function insertHtmlIntoEditor(editor: LexicalEditor, html: string) {
45     editor.update(() => {
46         const selection = $getSelection();
47         const nodes = $htmlToBlockNodes(editor, html);
48
49         const reference = selection?.getNodes()[0];
50         const referencesParents = reference?.getParents() || [];
51         const topLevel = referencesParents[referencesParents.length - 1];
52         if (topLevel && reference) {
53             for (let i = nodes.length - 1; i >= 0; i--) {
54                 reference.insertAfter(nodes[i]);
55             }
56         }
57     });
58 }
59
60 export function getEditorContentAsHtml(editor: LexicalEditor): Promise<string> {
61     return new Promise((resolve, reject) => {
62         editor.getEditorState().read(() => {
63             const html = $generateHtmlFromNodes(editor);
64             resolve(html);
65         });
66     });
67 }
68
69 export function focusEditor(editor: LexicalEditor) {
70     editor.focus(() => {}, {defaultSelection: "rootStart"});
71 }