3 DOMConversionMap, DOMConversionOutput,
7 SerializedElementNode, Spread,
8 EditorConfig, DOMExportOutput,
11 import {extractDirectionFromElement} from "lexical/nodes/common";
13 export type SerializedDetailsNode = Spread<{
16 }, SerializedElementNode>
18 export class DetailsNode extends ElementNode {
20 __summary: string = '';
27 const self = this.getWritable();
32 const self = this.getLatest();
36 setSummary(summary: string) {
37 const self = this.getWritable();
38 self.__summary = summary;
41 getSummary(): string {
42 const self = this.getLatest();
43 return self.__summary;
46 static clone(node: DetailsNode): DetailsNode {
47 const newNode = new DetailsNode(node.__key);
48 newNode.__id = node.__id;
49 newNode.__dir = node.__dir;
50 newNode.__summary = node.__summary;
54 createDOM(_config: EditorConfig, _editor: LexicalEditor) {
55 const el = document.createElement('details');
57 el.setAttribute('id', this.__id);
61 el.setAttribute('dir', this.__dir);
64 const summary = document.createElement('summary');
65 summary.textContent = this.__summary;
66 summary.setAttribute('contenteditable', 'false');
72 updateDOM(prevNode: DetailsNode, dom: HTMLElement) {
73 return prevNode.__id !== this.__id
74 || prevNode.__dir !== this.__dir;
77 static importDOM(): DOMConversionMap|null {
79 details(node: HTMLElement): DOMConversion|null {
81 conversion: (element: HTMLElement): DOMConversionOutput|null => {
82 const node = new DetailsNode();
84 node.setId(element.id);
88 node.setDirection(extractDirectionFromElement(element));
91 const summaryElem = Array.from(element.children).find(e => e.nodeName === 'SUMMARY');
92 node.setSummary(summaryElem?.textContent || '');
99 summary(node: HTMLElement): DOMConversion|null {
101 conversion: (element: HTMLElement): DOMConversionOutput|null => {
102 return {node: 'ignore'};
110 exportDOM(editor: LexicalEditor): DOMExportOutput {
111 const element = this.createDOM(editor._config, editor);
112 const editable = element.querySelectorAll('[contenteditable]');
113 for (const elem of editable) {
114 elem.removeAttribute('contenteditable');
120 exportJSON(): SerializedDetailsNode {
122 ...super.exportJSON(),
126 summary: this.__summary,
130 static importJSON(serializedNode: SerializedDetailsNode): DetailsNode {
131 const node = $createDetailsNode();
132 node.setId(serializedNode.id);
133 node.setDirection(serializedNode.direction);
139 export function $createDetailsNode() {
140 return new DetailsNode();
143 export function $isDetailsNode(node: LexicalNode | null | undefined): node is DetailsNode {
144 return node instanceof DetailsNode;