]> BookStack Code Mirror - bookstack/blob - resources/js/wysiwyg/nodes/details.ts
8071d5e8fd98017368fba2c0ef97cdc42bec87cd
[bookstack] / resources / js / wysiwyg / nodes / details.ts
1 import {
2     DOMConversion,
3     DOMConversionMap, DOMConversionOutput,
4     ElementNode,
5     LexicalEditor,
6     LexicalNode,
7     SerializedElementNode,
8 } from 'lexical';
9 import type {EditorConfig} from "lexical/LexicalEditor";
10
11 import {el} from "../utils/dom";
12
13 export class DetailsNode extends ElementNode {
14
15     static getType() {
16         return 'details';
17     }
18
19     static clone(node: DetailsNode) {
20         return new DetailsNode(node.__key);
21     }
22
23     createDOM(_config: EditorConfig, _editor: LexicalEditor) {
24         return el('details');
25     }
26
27     updateDOM(prevNode: DetailsNode, dom: HTMLElement) {
28         return false;
29     }
30
31     static importDOM(): DOMConversionMap|null {
32         return {
33             details(node: HTMLElement): DOMConversion|null {
34                 return {
35                     conversion: (element: HTMLElement): DOMConversionOutput|null => {
36                         return {
37                             node: new DetailsNode(),
38                         };
39                     },
40                     priority: 3,
41                 };
42             },
43         };
44     }
45
46     exportJSON(): SerializedElementNode {
47         return {
48             ...super.exportJSON(),
49             type: 'details',
50             version: 1,
51         };
52     }
53
54     static importJSON(serializedNode: SerializedElementNode): DetailsNode {
55         return $createDetailsNode();
56     }
57
58 }
59
60 export function $createDetailsNode() {
61     return new DetailsNode();
62 }
63
64 export function $isDetailsNode(node: LexicalNode | null | undefined) {
65     return node instanceof DetailsNode;
66 }
67
68 export class SummaryNode extends ElementNode {
69
70     static getType() {
71         return 'summary';
72     }
73
74     static clone(node: SummaryNode) {
75         return new SummaryNode(node.__key);
76     }
77
78     createDOM(_config: EditorConfig, _editor: LexicalEditor) {
79         return el('summary');
80     }
81
82     updateDOM(prevNode: DetailsNode, dom: HTMLElement) {
83         return false;
84     }
85
86     static importDOM(): DOMConversionMap|null {
87         return {
88             summary(node: HTMLElement): DOMConversion|null {
89                 return {
90                     conversion: (element: HTMLElement): DOMConversionOutput|null => {
91                         return {
92                             node: new SummaryNode(),
93                         };
94                     },
95                     priority: 3,
96                 };
97             },
98         };
99     }
100
101     exportJSON(): SerializedElementNode {
102         return {
103             ...super.exportJSON(),
104             type: 'summary',
105             version: 1,
106         };
107     }
108
109     static importJSON(serializedNode: SerializedElementNode): DetailsNode {
110         return $createSummaryNode();
111     }
112
113 }
114
115 export function $createSummaryNode() {
116     return new SummaryNode();
117 }
118
119 export function $isSummaryNode(node: LexicalNode | null | undefined) {
120     return node instanceof SummaryNode;
121 }