@@ -5,18 +5,19 @@ import {
5
5
LexicalEditor ,
6
6
LexicalNode ,
7
7
SerializedElementNode , Spread ,
8
- EditorConfig ,
8
+ EditorConfig , DOMExportOutput ,
9
9
} from 'lexical' ;
10
10
11
- import { el } from "../../utils/dom" ;
12
11
import { extractDirectionFromElement } from "lexical/nodes/common" ;
13
12
14
13
export type SerializedDetailsNode = Spread < {
15
14
id : string ;
15
+ summary : string ;
16
16
} , SerializedElementNode >
17
17
18
18
export class DetailsNode extends ElementNode {
19
19
__id : string = '' ;
20
+ __summary : string = '' ;
20
21
21
22
static getType ( ) {
22
23
return 'details' ;
@@ -32,10 +33,21 @@ export class DetailsNode extends ElementNode {
32
33
return self . __id ;
33
34
}
34
35
36
+ setSummary ( summary : string ) {
37
+ const self = this . getWritable ( ) ;
38
+ self . __summary = summary ;
39
+ }
40
+
41
+ getSummary ( ) : string {
42
+ const self = this . getLatest ( ) ;
43
+ return self . __summary ;
44
+ }
45
+
35
46
static clone ( node : DetailsNode ) : DetailsNode {
36
47
const newNode = new DetailsNode ( node . __key ) ;
37
48
newNode . __id = node . __id ;
38
49
newNode . __dir = node . __dir ;
50
+ newNode . __summary = node . __summary ;
39
51
return newNode ;
40
52
}
41
53
@@ -49,6 +61,11 @@ export class DetailsNode extends ElementNode {
49
61
el . setAttribute ( 'dir' , this . __dir ) ;
50
62
}
51
63
64
+ const summary = document . createElement ( 'summary' ) ;
65
+ summary . textContent = this . __summary ;
66
+ summary . setAttribute ( 'contenteditable' , 'false' ) ;
67
+ el . append ( summary ) ;
68
+
52
69
return el ;
53
70
}
54
71
@@ -71,20 +88,42 @@ export class DetailsNode extends ElementNode {
71
88
node . setDirection ( extractDirectionFromElement ( element ) ) ;
72
89
}
73
90
91
+ const summaryElem = Array . from ( element . children ) . find ( e => e . nodeName === 'SUMMARY' ) ;
92
+ node . setSummary ( summaryElem ?. textContent || '' ) ;
93
+
74
94
return { node} ;
75
95
} ,
76
96
priority : 3 ,
77
97
} ;
78
98
} ,
99
+ summary ( node : HTMLElement ) : DOMConversion | null {
100
+ return {
101
+ conversion : ( element : HTMLElement ) : DOMConversionOutput | null => {
102
+ return { node : 'ignore' } ;
103
+ } ,
104
+ priority : 3 ,
105
+ } ;
106
+ } ,
79
107
} ;
80
108
}
81
109
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' ) ;
115
+ }
116
+
117
+ return { element} ;
118
+ }
119
+
82
120
exportJSON ( ) : SerializedDetailsNode {
83
121
return {
84
122
...super . exportJSON ( ) ,
85
123
type : 'details' ,
86
124
version : 1 ,
87
125
id : this . __id ,
126
+ summary : this . __summary ,
88
127
} ;
89
128
}
90
129
@@ -104,58 +143,3 @@ export function $createDetailsNode() {
104
143
export function $isDetailsNode ( node : LexicalNode | null | undefined ) : node is DetailsNode {
105
144
return node instanceof DetailsNode ;
106
145
}
107
-
108
- export class SummaryNode extends ElementNode {
109
-
110
- static getType ( ) {
111
- return 'summary' ;
112
- }
113
-
114
- static clone ( node : SummaryNode ) {
115
- return new SummaryNode ( node . __key ) ;
116
- }
117
-
118
- createDOM ( _config : EditorConfig , _editor : LexicalEditor ) {
119
- return el ( 'summary' ) ;
120
- }
121
-
122
- updateDOM ( prevNode : DetailsNode , dom : HTMLElement ) {
123
- return false ;
124
- }
125
-
126
- static importDOM ( ) : DOMConversionMap | null {
127
- return {
128
- summary ( node : HTMLElement ) : DOMConversion | null {
129
- return {
130
- conversion : ( element : HTMLElement ) : DOMConversionOutput | null => {
131
- return {
132
- node : new SummaryNode ( ) ,
133
- } ;
134
- } ,
135
- priority : 3 ,
136
- } ;
137
- } ,
138
- } ;
139
- }
140
-
141
- exportJSON ( ) : SerializedElementNode {
142
- return {
143
- ...super . exportJSON ( ) ,
144
- type : 'summary' ,
145
- version : 1 ,
146
- } ;
147
- }
148
-
149
- static importJSON ( serializedNode : SerializedElementNode ) : SummaryNode {
150
- return $createSummaryNode ( ) ;
151
- }
152
-
153
- }
154
-
155
- export function $createSummaryNode ( ) : SummaryNode {
156
- return new SummaryNode ( ) ;
157
- }
158
-
159
- export function $isSummaryNode ( node : LexicalNode | null | undefined ) : node is SummaryNode {
160
- return node instanceof SummaryNode ;
161
- }
0 commit comments