]> BookStack Code Mirror - bookstack/blob - resources/js/wysiwyg/lexical/table/LexicalCaptionNode.ts
Lexical: Linked table form to have caption toggle option
[bookstack] / resources / js / wysiwyg / lexical / table / LexicalCaptionNode.ts
1 import {
2     $createTextNode,
3     DOMConversionMap,
4     DOMExportOutput,
5     EditorConfig,
6     ElementNode,
7     LexicalEditor,
8     LexicalNode,
9     SerializedElementNode
10 } from "lexical";
11 import {TableNode} from "@lexical/table/LexicalTableNode";
12
13
14 export class CaptionNode extends ElementNode {
15     static getType(): string {
16         return 'caption';
17     }
18
19     static clone(node: CaptionNode): CaptionNode {
20         return new CaptionNode(node.__key);
21     }
22
23     createDOM(_config: EditorConfig, _editor: LexicalEditor): HTMLElement {
24         return document.createElement('caption');
25     }
26
27     updateDOM(_prevNode: unknown, _dom: HTMLElement, _config: EditorConfig): boolean {
28         return false;
29     }
30
31     isParentRequired(): true {
32         return true;
33     }
34
35     canBeEmpty(): boolean {
36         return false;
37     }
38
39     exportJSON(): SerializedElementNode {
40         return {
41             ...super.exportJSON(),
42             type: 'caption',
43             version: 1,
44         };
45     }
46
47     insertDOMIntoParent(nodeDOM: HTMLElement, parentDOM: HTMLElement): boolean {
48         parentDOM.insertBefore(nodeDOM, parentDOM.firstChild);
49         return true;
50     }
51
52     static importJSON(serializedNode: SerializedElementNode): CaptionNode {
53         return $createCaptionNode();
54     }
55
56     static importDOM(): DOMConversionMap | null {
57         return {
58             caption: (node: Node) => ({
59                 conversion(domNode: Node) {
60                     return {
61                         node: $createCaptionNode(),
62                     }
63                 },
64                 priority: 0,
65             }),
66         };
67     }
68 }
69
70 export function $createCaptionNode(): CaptionNode {
71     return new CaptionNode();
72 }
73
74 export function $isCaptionNode(node: LexicalNode | null | undefined): node is CaptionNode {
75     return node instanceof CaptionNode;
76 }
77
78 export function $tableHasCaption(table: TableNode): boolean {
79     for (const child of table.getChildren()) {
80         if ($isCaptionNode(child)) {
81             return true;
82         }
83     }
84     return false;
85 }
86
87 export function $addCaptionToTable(table: TableNode, text: string = ''): void {
88     const caption = $createCaptionNode();
89     const textNode = $createTextNode(text || ' ');
90     caption.append(textNode);
91     table.append(caption);
92 }