@webiny/lexical-nodes 0.0.0-unstable.06b2ede40f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FontColorNode.d.ts +43 -0
- package/FontColorNode.js +122 -0
- package/FontColorNode.js.map +1 -0
- package/HeadingNode.d.ts +40 -0
- package/HeadingNode.js +195 -0
- package/HeadingNode.js.map +1 -0
- package/ImageNode.d.ts +56 -0
- package/ImageNode.js +164 -0
- package/ImageNode.js.map +1 -0
- package/LICENSE +21 -0
- package/LinkNode.d.ts +101 -0
- package/LinkNode.js +327 -0
- package/LinkNode.js.map +1 -0
- package/ListItemNode.d.ts +43 -0
- package/ListItemNode.js +363 -0
- package/ListItemNode.js.map +1 -0
- package/ListNode.d.ts +53 -0
- package/ListNode.js +248 -0
- package/ListNode.js.map +1 -0
- package/ParagraphNode.d.ts +39 -0
- package/ParagraphNode.js +157 -0
- package/ParagraphNode.js.map +1 -0
- package/QuoteNode.d.ts +38 -0
- package/QuoteNode.js +120 -0
- package/QuoteNode.js.map +1 -0
- package/README.md +6 -0
- package/components/ImageNode/ContentEditable.css +22 -0
- package/components/ImageNode/ContentEditable.d.ts +12 -0
- package/components/ImageNode/ContentEditable.js +19 -0
- package/components/ImageNode/ContentEditable.js.map +1 -0
- package/components/ImageNode/ImageComponent.css +43 -0
- package/components/ImageNode/ImageComponent.d.ts +18 -0
- package/components/ImageNode/ImageComponent.js +235 -0
- package/components/ImageNode/ImageComponent.js.map +1 -0
- package/components/ImageNode/ImageResizer.d.ts +24 -0
- package/components/ImageNode/ImageResizer.js +211 -0
- package/components/ImageNode/ImageResizer.js.map +1 -0
- package/components/ImageNode/Placeholder.css +20 -0
- package/components/ImageNode/Placeholder.d.ts +15 -0
- package/components/ImageNode/Placeholder.js +24 -0
- package/components/ImageNode/Placeholder.js.map +1 -0
- package/components/ImageNode/SharedHistoryContext.d.ts +10 -0
- package/components/ImageNode/SharedHistoryContext.js +19 -0
- package/components/ImageNode/SharedHistoryContext.js.map +1 -0
- package/generateInitialLexicalValue.d.ts +4 -0
- package/generateInitialLexicalValue.js +27 -0
- package/generateInitialLexicalValue.js.map +1 -0
- package/index.d.ts +19 -0
- package/index.js +51 -0
- package/index.js.map +1 -0
- package/package.json +39 -0
- package/prepareLexicalState.d.ts +2 -0
- package/prepareLexicalState.js +53 -0
- package/prepareLexicalState.js.map +1 -0
- package/types.d.ts +11 -0
- package/types.js +3 -0
- package/types.js.map +1 -0
- package/utils/clearNodeFormating.d.ts +2 -0
- package/utils/clearNodeFormating.js +23 -0
- package/utils/clearNodeFormating.js.map +1 -0
- package/utils/formatList.d.ts +19 -0
- package/utils/formatList.js +412 -0
- package/utils/formatList.js.map +1 -0
- package/utils/formatToHeading.d.ts +3 -0
- package/utils/formatToHeading.js +19 -0
- package/utils/formatToHeading.js.map +1 -0
- package/utils/formatToParagraph.d.ts +2 -0
- package/utils/formatToParagraph.js +13 -0
- package/utils/formatToParagraph.js.map +1 -0
- package/utils/formatToQuote.d.ts +2 -0
- package/utils/formatToQuote.js +19 -0
- package/utils/formatToQuote.js.map +1 -0
- package/utils/getStyleId.d.ts +11 -0
- package/utils/getStyleId.js +14 -0
- package/utils/getStyleId.js.map +1 -0
- package/utils/listNode.d.ts +21 -0
- package/utils/listNode.js +103 -0
- package/utils/listNode.js.map +1 -0
- package/utils/toggleLink.d.ts +8 -0
- package/utils/toggleLink.js +131 -0
- package/utils/toggleLink.js.map +1 -0
package/ListItemNode.js
ADDED
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { $isElementNode, $isRangeSelection, ElementNode } from "lexical";
|
|
2
|
+
import { $createListNode, $isListNode } from "./ListNode";
|
|
3
|
+
import { addClassNamesToElement, removeClassNamesFromElement } from "@lexical/utils";
|
|
4
|
+
import { $handleIndent, $handleOutdent, mergeLists, updateChildrenListItemValue } from "./utils/formatList";
|
|
5
|
+
import { $createParagraphNode, $isParagraphNode } from "./ParagraphNode";
|
|
6
|
+
import { isNestedListNode } from "./utils/listNode";
|
|
7
|
+
export const LIST_ITEM_TYPE = "wby-list-item";
|
|
8
|
+
/** @noInheritDoc */
|
|
9
|
+
export class ListItemNode extends ElementNode {
|
|
10
|
+
/** @internal */
|
|
11
|
+
|
|
12
|
+
/** @internal */
|
|
13
|
+
|
|
14
|
+
static getType() {
|
|
15
|
+
return LIST_ITEM_TYPE;
|
|
16
|
+
}
|
|
17
|
+
static clone(node) {
|
|
18
|
+
return new ListItemNode(node.__value, node.__checked, node.__key);
|
|
19
|
+
}
|
|
20
|
+
constructor(value, checked, key) {
|
|
21
|
+
super(key);
|
|
22
|
+
this.__value = value === undefined ? 1 : value;
|
|
23
|
+
this.__checked = checked;
|
|
24
|
+
}
|
|
25
|
+
createDOM(config) {
|
|
26
|
+
const element = document.createElement("li");
|
|
27
|
+
const parent = this.getParent();
|
|
28
|
+
if ($isListNode(parent) && parent.getListType() === "check") {
|
|
29
|
+
updateListItemChecked(element, this, null, parent);
|
|
30
|
+
}
|
|
31
|
+
element.value = this.__value;
|
|
32
|
+
$setListItemThemeClassNames(element, config.theme, this);
|
|
33
|
+
return element;
|
|
34
|
+
}
|
|
35
|
+
updateDOM(prevNode, dom, config) {
|
|
36
|
+
const parent = this.getParent();
|
|
37
|
+
if ($isListNode(parent) && parent.getListType() === "check") {
|
|
38
|
+
updateListItemChecked(dom, this, prevNode, parent);
|
|
39
|
+
}
|
|
40
|
+
// @ts-expect-error - this is always HTMLListItemElement
|
|
41
|
+
dom.value = this.__value;
|
|
42
|
+
$setListItemThemeClassNames(dom, config.theme, this);
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
static importDOM() {
|
|
46
|
+
return {
|
|
47
|
+
li: () => ({
|
|
48
|
+
conversion: convertListItemElement,
|
|
49
|
+
priority: 0
|
|
50
|
+
})
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
static importJSON(serializedNode) {
|
|
54
|
+
const node = new ListItemNode(serializedNode.value, serializedNode.checked);
|
|
55
|
+
node.setFormat(serializedNode.format);
|
|
56
|
+
node.setIndent(serializedNode.indent);
|
|
57
|
+
node.setDirection(serializedNode.direction);
|
|
58
|
+
return node;
|
|
59
|
+
}
|
|
60
|
+
exportJSON() {
|
|
61
|
+
return {
|
|
62
|
+
...super.exportJSON(),
|
|
63
|
+
checked: this.getChecked(),
|
|
64
|
+
type: LIST_ITEM_TYPE,
|
|
65
|
+
value: this.getValue()
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
append(...nodes) {
|
|
69
|
+
for (let i = 0; i < nodes.length; i++) {
|
|
70
|
+
const node = nodes[i];
|
|
71
|
+
if ($isElementNode(node) && this.canMergeWith(node)) {
|
|
72
|
+
const children = node.getChildren();
|
|
73
|
+
this.append(...children);
|
|
74
|
+
node.remove();
|
|
75
|
+
} else {
|
|
76
|
+
super.append(node);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return this;
|
|
80
|
+
}
|
|
81
|
+
replace(replaceWithNode, includeChildren) {
|
|
82
|
+
if ($isListItemNode(replaceWithNode)) {
|
|
83
|
+
return super.replace(replaceWithNode);
|
|
84
|
+
}
|
|
85
|
+
this.setIndent(0);
|
|
86
|
+
const list = this.getParentOrThrow();
|
|
87
|
+
if (!$isListNode(list)) {
|
|
88
|
+
return replaceWithNode;
|
|
89
|
+
}
|
|
90
|
+
if (list.__first === this.getKey()) {
|
|
91
|
+
list.insertBefore(replaceWithNode);
|
|
92
|
+
} else if (list.__last === this.getKey()) {
|
|
93
|
+
list.insertAfter(replaceWithNode);
|
|
94
|
+
} else {
|
|
95
|
+
// Split the list
|
|
96
|
+
const newList = $createListNode(list.getListType());
|
|
97
|
+
let nextSibling = this.getNextSibling();
|
|
98
|
+
while (nextSibling) {
|
|
99
|
+
const nodeToAppend = nextSibling;
|
|
100
|
+
nextSibling = nextSibling.getNextSibling();
|
|
101
|
+
newList.append(nodeToAppend);
|
|
102
|
+
}
|
|
103
|
+
list.insertAfter(replaceWithNode);
|
|
104
|
+
replaceWithNode.insertAfter(newList);
|
|
105
|
+
}
|
|
106
|
+
if (includeChildren) {
|
|
107
|
+
if (!$isElementNode(replaceWithNode)) {
|
|
108
|
+
throw Error("includeChildren should only be true for ElementNodes");
|
|
109
|
+
}
|
|
110
|
+
this.getChildren().forEach(child => {
|
|
111
|
+
replaceWithNode.append(child);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
this.remove();
|
|
115
|
+
if (list.getChildrenSize() === 0) {
|
|
116
|
+
list.remove();
|
|
117
|
+
}
|
|
118
|
+
return replaceWithNode;
|
|
119
|
+
}
|
|
120
|
+
insertAfter(node) {
|
|
121
|
+
const listNode = this.getParentOrThrow();
|
|
122
|
+
if (!$isListNode(listNode)) {
|
|
123
|
+
console.log("insertAfter: webiny list node is not parent of list item node");
|
|
124
|
+
return listNode;
|
|
125
|
+
}
|
|
126
|
+
const siblings = this.getNextSiblings();
|
|
127
|
+
if ($isListItemNode(node)) {
|
|
128
|
+
const after = super.insertAfter(node);
|
|
129
|
+
const afterListNode = node.getParentOrThrow();
|
|
130
|
+
if ($isListNode(afterListNode)) {
|
|
131
|
+
updateChildrenListItemValue(afterListNode);
|
|
132
|
+
}
|
|
133
|
+
return after;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Attempt to merge if the list is of the same type.
|
|
137
|
+
|
|
138
|
+
if ($isListNode(node) && node.getListType() === listNode.getListType()) {
|
|
139
|
+
let child = node;
|
|
140
|
+
const children = node.getChildren();
|
|
141
|
+
for (let i = children.length - 1; i >= 0; i--) {
|
|
142
|
+
child = children[i];
|
|
143
|
+
this.insertAfter(child);
|
|
144
|
+
}
|
|
145
|
+
return child;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Otherwise, split the list
|
|
149
|
+
// Split the lists and insert the node in between them
|
|
150
|
+
listNode.insertAfter(node);
|
|
151
|
+
if (siblings.length !== 0) {
|
|
152
|
+
const newListNode = $createListNode(listNode.getListType());
|
|
153
|
+
siblings.forEach(sibling => newListNode.append(sibling));
|
|
154
|
+
node.insertAfter(newListNode);
|
|
155
|
+
}
|
|
156
|
+
return node;
|
|
157
|
+
}
|
|
158
|
+
remove(preserveEmptyParent) {
|
|
159
|
+
const prevSibling = this.getPreviousSibling();
|
|
160
|
+
const nextSibling = this.getNextSibling();
|
|
161
|
+
super.remove(preserveEmptyParent);
|
|
162
|
+
if (prevSibling && nextSibling && isNestedListNode(prevSibling) && isNestedListNode(nextSibling)) {
|
|
163
|
+
mergeLists(prevSibling.getFirstChild(), nextSibling.getFirstChild());
|
|
164
|
+
nextSibling.remove();
|
|
165
|
+
} else if (nextSibling) {
|
|
166
|
+
const parent = nextSibling.getParent();
|
|
167
|
+
if ($isListNode(parent)) {
|
|
168
|
+
updateChildrenListItemValue(parent);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
insertNewAfter() {
|
|
173
|
+
const newElement = $createListItemNode(this.__checked == null ? undefined : false);
|
|
174
|
+
this.insertAfter(newElement);
|
|
175
|
+
return newElement;
|
|
176
|
+
}
|
|
177
|
+
collapseAtStart(selection) {
|
|
178
|
+
const paragraph = $createParagraphNode();
|
|
179
|
+
const children = this.getChildren();
|
|
180
|
+
children.forEach(child => paragraph.append(child));
|
|
181
|
+
const listNode = this.getParentOrThrow();
|
|
182
|
+
const listNodeParent = listNode.getParentOrThrow();
|
|
183
|
+
const isIndented = $isListItemNode(listNodeParent);
|
|
184
|
+
if (listNode.getChildrenSize() === 1) {
|
|
185
|
+
if (isIndented) {
|
|
186
|
+
// if the list node is nested, we just want to remove it,
|
|
187
|
+
// effectively unindenting it.
|
|
188
|
+
listNode.remove();
|
|
189
|
+
listNodeParent.select();
|
|
190
|
+
} else {
|
|
191
|
+
listNode.replace(paragraph);
|
|
192
|
+
// If we have selection on the list item, we'll need to move it
|
|
193
|
+
// to the paragraph
|
|
194
|
+
const anchor = selection.anchor;
|
|
195
|
+
const focus = selection.focus;
|
|
196
|
+
const key = paragraph.getKey();
|
|
197
|
+
if (anchor.type === "element" && anchor.getNode().is(this)) {
|
|
198
|
+
anchor.set(key, anchor.offset, "element");
|
|
199
|
+
}
|
|
200
|
+
if (focus.type === "element" && focus.getNode().is(this)) {
|
|
201
|
+
focus.set(key, focus.offset, "element");
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
} else {
|
|
205
|
+
listNode.insertBefore(paragraph);
|
|
206
|
+
this.remove();
|
|
207
|
+
}
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
getValue() {
|
|
211
|
+
const self = this.getLatest();
|
|
212
|
+
return self.__value;
|
|
213
|
+
}
|
|
214
|
+
setValue(value) {
|
|
215
|
+
const self = this.getWritable();
|
|
216
|
+
self.__value = value;
|
|
217
|
+
}
|
|
218
|
+
getChecked() {
|
|
219
|
+
const self = this.getLatest();
|
|
220
|
+
return self.__checked;
|
|
221
|
+
}
|
|
222
|
+
setChecked(checked) {
|
|
223
|
+
const self = this.getWritable();
|
|
224
|
+
self.__checked = checked;
|
|
225
|
+
}
|
|
226
|
+
getIndent() {
|
|
227
|
+
// If we don't have a parent, we are likely serializing
|
|
228
|
+
const parent = this.getParent();
|
|
229
|
+
if (parent === null) {
|
|
230
|
+
return this.getLatest().__indent;
|
|
231
|
+
}
|
|
232
|
+
// ListItemNode should always have a ListNode for a parent.
|
|
233
|
+
let listNodeParent = parent.getParentOrThrow();
|
|
234
|
+
let indentLevel = 0;
|
|
235
|
+
while ($isListItemNode(listNodeParent)) {
|
|
236
|
+
listNodeParent = listNodeParent.getParentOrThrow().getParentOrThrow();
|
|
237
|
+
indentLevel++;
|
|
238
|
+
}
|
|
239
|
+
return indentLevel;
|
|
240
|
+
}
|
|
241
|
+
setIndent(indent) {
|
|
242
|
+
let currentIndent = this.getIndent();
|
|
243
|
+
while (currentIndent !== indent) {
|
|
244
|
+
if (currentIndent < indent) {
|
|
245
|
+
$handleIndent([this]);
|
|
246
|
+
currentIndent++;
|
|
247
|
+
} else {
|
|
248
|
+
$handleOutdent([this]);
|
|
249
|
+
currentIndent--;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return this;
|
|
253
|
+
}
|
|
254
|
+
canIndent() {
|
|
255
|
+
// Indent/outdent is handled specifically in the RichText logic.
|
|
256
|
+
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
insertBefore(nodeToInsert) {
|
|
260
|
+
if ($isListItemNode(nodeToInsert)) {
|
|
261
|
+
const parent = this.getParentOrThrow();
|
|
262
|
+
if ($isListNode(parent)) {
|
|
263
|
+
const siblings = this.getNextSiblings();
|
|
264
|
+
updateChildrenListItemValue(parent, siblings);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return super.insertBefore(nodeToInsert);
|
|
268
|
+
}
|
|
269
|
+
canInsertAfter(node) {
|
|
270
|
+
return $isListNode(node);
|
|
271
|
+
}
|
|
272
|
+
canReplaceWith(replacement) {
|
|
273
|
+
return $isListItemNode(replacement);
|
|
274
|
+
}
|
|
275
|
+
canMergeWith(node) {
|
|
276
|
+
return $isParagraphNode(node) || $isListItemNode(node);
|
|
277
|
+
}
|
|
278
|
+
extractWithChild(child, selection) {
|
|
279
|
+
if (!$isRangeSelection(selection)) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
const anchorNode = selection.anchor.getNode();
|
|
283
|
+
const focusNode = selection.focus.getNode();
|
|
284
|
+
return this.isParentOf(anchorNode) && this.isParentOf(focusNode) && this.getTextContent().length === selection.getTextContent().length;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
function $setListItemThemeClassNames(dom, editorThemeClasses, node) {
|
|
288
|
+
const classesToAdd = [];
|
|
289
|
+
const classesToRemove = [];
|
|
290
|
+
const listTheme = editorThemeClasses.list;
|
|
291
|
+
const listItemClassName = listTheme ? listTheme.listitem : undefined;
|
|
292
|
+
let nestedListItemClassName;
|
|
293
|
+
if (listTheme && listTheme.nested) {
|
|
294
|
+
nestedListItemClassName = listTheme.nested.listitem;
|
|
295
|
+
}
|
|
296
|
+
if (listItemClassName !== undefined) {
|
|
297
|
+
const listItemClasses = listItemClassName.split(" ");
|
|
298
|
+
classesToAdd.push(...listItemClasses);
|
|
299
|
+
}
|
|
300
|
+
if (listTheme) {
|
|
301
|
+
const parentNode = node.getParent();
|
|
302
|
+
const isCheckList = $isListNode(parentNode) && parentNode?.getListType() === "check";
|
|
303
|
+
const checked = node.getChecked();
|
|
304
|
+
if (!isCheckList || checked) {
|
|
305
|
+
classesToRemove.push(listTheme.listitemUnchecked);
|
|
306
|
+
}
|
|
307
|
+
if (!isCheckList || !checked) {
|
|
308
|
+
classesToRemove.push(listTheme.listitemChecked);
|
|
309
|
+
}
|
|
310
|
+
if (isCheckList) {
|
|
311
|
+
classesToAdd.push(checked ? listTheme.listitemChecked : listTheme.listitemUnchecked);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (nestedListItemClassName !== undefined) {
|
|
315
|
+
const nestedListItemClasses = nestedListItemClassName.split(" ");
|
|
316
|
+
if (node.getChildren().some(child => $isListNode(child))) {
|
|
317
|
+
classesToAdd.push(...nestedListItemClasses);
|
|
318
|
+
} else {
|
|
319
|
+
classesToRemove.push(...nestedListItemClasses);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
if (classesToRemove.length > 0) {
|
|
323
|
+
removeClassNamesFromElement(dom, ...classesToRemove);
|
|
324
|
+
}
|
|
325
|
+
if (classesToAdd.length > 0) {
|
|
326
|
+
addClassNamesToElement(dom, ...classesToAdd);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
function updateListItemChecked(dom, listItemNode, prevListItemNode, listNode) {
|
|
330
|
+
const isCheckList = listNode.getListType() === "check";
|
|
331
|
+
if (isCheckList) {
|
|
332
|
+
// Only add attributes for leaf list items
|
|
333
|
+
if ($isListNode(listItemNode.getFirstChild())) {
|
|
334
|
+
dom.removeAttribute("role");
|
|
335
|
+
dom.removeAttribute("tabIndex");
|
|
336
|
+
dom.removeAttribute("aria-checked");
|
|
337
|
+
} else {
|
|
338
|
+
dom.setAttribute("role", "checkbox");
|
|
339
|
+
dom.setAttribute("tabIndex", "-1");
|
|
340
|
+
if (!prevListItemNode || listItemNode.__checked !== prevListItemNode.__checked) {
|
|
341
|
+
dom.setAttribute("aria-checked", listItemNode.getChecked() ? "true" : "false");
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
} else {
|
|
345
|
+
// Clean up checked state
|
|
346
|
+
if (listItemNode.getChecked() != null) {
|
|
347
|
+
listItemNode.setChecked(undefined);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
function convertListItemElement() {
|
|
352
|
+
return {
|
|
353
|
+
node: $createListItemNode()
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
export function $createListItemNode(checked) {
|
|
357
|
+
return new ListItemNode(undefined, checked);
|
|
358
|
+
}
|
|
359
|
+
export function $isListItemNode(node) {
|
|
360
|
+
return node instanceof ListItemNode;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
//# sourceMappingURL=ListItemNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["$isElementNode","$isRangeSelection","ElementNode","$createListNode","$isListNode","addClassNamesToElement","removeClassNamesFromElement","$handleIndent","$handleOutdent","mergeLists","updateChildrenListItemValue","$createParagraphNode","$isParagraphNode","isNestedListNode","LIST_ITEM_TYPE","ListItemNode","getType","clone","node","__value","__checked","__key","constructor","value","checked","key","undefined","createDOM","config","element","document","createElement","parent","getParent","getListType","updateListItemChecked","$setListItemThemeClassNames","theme","updateDOM","prevNode","dom","importDOM","li","conversion","convertListItemElement","priority","importJSON","serializedNode","setFormat","format","setIndent","indent","setDirection","direction","exportJSON","getChecked","type","getValue","append","nodes","i","length","canMergeWith","children","getChildren","remove","replace","replaceWithNode","includeChildren","$isListItemNode","list","getParentOrThrow","__first","getKey","insertBefore","__last","insertAfter","newList","nextSibling","getNextSibling","nodeToAppend","Error","forEach","child","getChildrenSize","listNode","console","log","siblings","getNextSiblings","after","afterListNode","newListNode","sibling","preserveEmptyParent","prevSibling","getPreviousSibling","getFirstChild","insertNewAfter","newElement","$createListItemNode","collapseAtStart","selection","paragraph","listNodeParent","isIndented","select","anchor","focus","getNode","is","set","offset","self","getLatest","setValue","getWritable","setChecked","getIndent","__indent","indentLevel","currentIndent","canIndent","nodeToInsert","canInsertAfter","canReplaceWith","replacement","extractWithChild","anchorNode","focusNode","isParentOf","getTextContent","editorThemeClasses","classesToAdd","classesToRemove","listTheme","listItemClassName","listitem","nestedListItemClassName","nested","listItemClasses","split","push","parentNode","isCheckList","listitemUnchecked","listitemChecked","nestedListItemClasses","some","listItemNode","prevListItemNode","removeAttribute","setAttribute"],"sources":["ListItemNode.ts"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMConversionOutput,\n EditorConfig,\n EditorThemeClasses,\n LexicalNode,\n NodeKey,\n ParagraphNode,\n RangeSelection,\n SerializedElementNode,\n Spread\n} from \"lexical\";\nimport { $isElementNode, $isRangeSelection, ElementNode } from \"lexical\";\nimport type { ListNode } from \"~/ListNode\";\nimport { $createListNode, $isListNode } from \"~/ListNode\";\nimport { addClassNamesToElement, removeClassNamesFromElement } from \"@lexical/utils\";\nimport {\n $handleIndent,\n $handleOutdent,\n mergeLists,\n updateChildrenListItemValue\n} from \"~/utils/formatList\";\nimport { $createParagraphNode, $isParagraphNode } from \"~/ParagraphNode\";\nimport { isNestedListNode } from \"~/utils/listNode\";\n\nexport const LIST_ITEM_TYPE = \"wby-list-item\";\n\nexport type SerializedWebinyListItemNode = Spread<\n {\n checked: boolean | undefined;\n type: typeof LIST_ITEM_TYPE;\n value: number;\n },\n SerializedElementNode\n>;\n\n/** @noInheritDoc */\nexport class ListItemNode extends ElementNode {\n /** @internal */\n __value: number;\n /** @internal */\n __checked?: boolean;\n\n static override getType(): string {\n return LIST_ITEM_TYPE;\n }\n\n static override clone(node: ListItemNode): ListItemNode {\n return new ListItemNode(node.__value, node.__checked, node.__key);\n }\n\n constructor(value?: number, checked?: boolean, key?: NodeKey) {\n super(key);\n this.__value = value === undefined ? 1 : value;\n this.__checked = checked;\n }\n\n override createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement(\"li\");\n const parent = this.getParent();\n if ($isListNode(parent) && parent.getListType() === \"check\") {\n updateListItemChecked(element, this, null, parent);\n }\n element.value = this.__value;\n $setListItemThemeClassNames(element, config.theme, this);\n\n return element;\n }\n\n override updateDOM(prevNode: ListItemNode, dom: HTMLElement, config: EditorConfig): boolean {\n const parent = this.getParent();\n if ($isListNode(parent) && parent.getListType() === \"check\") {\n updateListItemChecked(dom, this, prevNode, parent);\n }\n // @ts-expect-error - this is always HTMLListItemElement\n dom.value = this.__value;\n $setListItemThemeClassNames(dom, config.theme, this);\n\n return false;\n }\n\n static override importDOM(): DOMConversionMap | null {\n return {\n li: () => ({\n conversion: convertListItemElement,\n priority: 0\n })\n };\n }\n\n static override importJSON(serializedNode: SerializedWebinyListItemNode): ListItemNode {\n const node = new ListItemNode(serializedNode.value, serializedNode.checked);\n node.setFormat(serializedNode.format);\n node.setIndent(serializedNode.indent);\n node.setDirection(serializedNode.direction);\n return node;\n }\n\n override exportJSON(): SerializedWebinyListItemNode {\n return {\n ...super.exportJSON(),\n checked: this.getChecked(),\n type: LIST_ITEM_TYPE,\n value: this.getValue()\n };\n }\n\n override append(...nodes: LexicalNode[]): this {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if ($isElementNode(node) && this.canMergeWith(node)) {\n const children = node.getChildren();\n this.append(...children);\n node.remove();\n } else {\n super.append(node);\n }\n }\n\n return this;\n }\n\n override replace<N extends LexicalNode>(replaceWithNode: N, includeChildren?: boolean): N {\n if ($isListItemNode(replaceWithNode)) {\n return super.replace(replaceWithNode);\n }\n this.setIndent(0);\n const list = this.getParentOrThrow();\n if (!$isListNode(list)) {\n return replaceWithNode;\n }\n if (list.__first === this.getKey()) {\n list.insertBefore(replaceWithNode);\n } else if (list.__last === this.getKey()) {\n list.insertAfter(replaceWithNode);\n } else {\n // Split the list\n const newList = $createListNode(list.getListType());\n let nextSibling = this.getNextSibling();\n while (nextSibling) {\n const nodeToAppend = nextSibling;\n nextSibling = nextSibling.getNextSibling();\n newList.append(nodeToAppend);\n }\n list.insertAfter(replaceWithNode);\n replaceWithNode.insertAfter(newList);\n }\n if (includeChildren) {\n if (!$isElementNode(replaceWithNode)) {\n throw Error(\"includeChildren should only be true for ElementNodes\");\n }\n\n this.getChildren().forEach((child: LexicalNode) => {\n replaceWithNode.append(child);\n });\n }\n this.remove();\n if (list.getChildrenSize() === 0) {\n list.remove();\n }\n return replaceWithNode;\n }\n\n override insertAfter(node: LexicalNode): LexicalNode {\n const listNode = this.getParentOrThrow();\n\n if (!$isListNode(listNode)) {\n console.log(\"insertAfter: webiny list node is not parent of list item node\");\n return listNode;\n }\n\n const siblings = this.getNextSiblings();\n\n if ($isListItemNode(node)) {\n const after = super.insertAfter(node);\n const afterListNode = node.getParentOrThrow();\n\n if ($isListNode(afterListNode)) {\n updateChildrenListItemValue(afterListNode);\n }\n\n return after;\n }\n\n // Attempt to merge if the list is of the same type.\n\n if ($isListNode(node) && node.getListType() === listNode.getListType()) {\n let child = node;\n const children = node.getChildren<ListNode>();\n\n for (let i = children.length - 1; i >= 0; i--) {\n child = children[i];\n\n this.insertAfter(child);\n }\n\n return child;\n }\n\n // Otherwise, split the list\n // Split the lists and insert the node in between them\n listNode.insertAfter(node);\n\n if (siblings.length !== 0) {\n const newListNode = $createListNode(listNode.getListType());\n\n siblings.forEach(sibling => newListNode.append(sibling));\n\n node.insertAfter(newListNode);\n }\n\n return node;\n }\n\n override remove(preserveEmptyParent?: boolean): void {\n const prevSibling = this.getPreviousSibling();\n const nextSibling = this.getNextSibling();\n super.remove(preserveEmptyParent);\n\n if (\n prevSibling &&\n nextSibling &&\n isNestedListNode(prevSibling) &&\n isNestedListNode(nextSibling)\n ) {\n mergeLists(prevSibling.getFirstChild(), nextSibling.getFirstChild());\n nextSibling.remove();\n } else if (nextSibling) {\n const parent = nextSibling.getParent();\n\n if ($isListNode(parent)) {\n updateChildrenListItemValue(parent);\n }\n }\n }\n\n override insertNewAfter(): ListItemNode | ParagraphNode {\n const newElement = $createListItemNode(this.__checked == null ? undefined : false);\n this.insertAfter(newElement);\n\n return newElement;\n }\n\n override collapseAtStart(selection: RangeSelection): true {\n const paragraph = $createParagraphNode();\n const children = this.getChildren();\n children.forEach(child => paragraph.append(child));\n const listNode = this.getParentOrThrow();\n const listNodeParent = listNode.getParentOrThrow();\n const isIndented = $isListItemNode(listNodeParent);\n\n if (listNode.getChildrenSize() === 1) {\n if (isIndented) {\n // if the list node is nested, we just want to remove it,\n // effectively unindenting it.\n listNode.remove();\n listNodeParent.select();\n } else {\n listNode.replace(paragraph);\n // If we have selection on the list item, we'll need to move it\n // to the paragraph\n const anchor = selection.anchor;\n const focus = selection.focus;\n const key = paragraph.getKey();\n\n if (anchor.type === \"element\" && anchor.getNode().is(this)) {\n anchor.set(key, anchor.offset, \"element\");\n }\n\n if (focus.type === \"element\" && focus.getNode().is(this)) {\n focus.set(key, focus.offset, \"element\");\n }\n }\n } else {\n listNode.insertBefore(paragraph);\n this.remove();\n }\n\n return true;\n }\n\n getValue(): number {\n const self = this.getLatest();\n\n return self.__value;\n }\n\n setValue(value: number): void {\n const self = this.getWritable();\n self.__value = value;\n }\n\n getChecked(): boolean | undefined {\n const self = this.getLatest();\n\n return self.__checked;\n }\n\n setChecked(checked?: boolean): void {\n const self = this.getWritable();\n self.__checked = checked;\n }\n\n override getIndent(): number {\n // If we don't have a parent, we are likely serializing\n const parent = this.getParent();\n if (parent === null) {\n return this.getLatest().__indent;\n }\n // ListItemNode should always have a ListNode for a parent.\n let listNodeParent = parent.getParentOrThrow();\n let indentLevel = 0;\n while ($isListItemNode(listNodeParent)) {\n listNodeParent = listNodeParent.getParentOrThrow().getParentOrThrow();\n indentLevel++;\n }\n\n return indentLevel;\n }\n\n override setIndent(indent: number): this {\n let currentIndent = this.getIndent();\n while (currentIndent !== indent) {\n if (currentIndent < indent) {\n $handleIndent([this]);\n currentIndent++;\n } else {\n $handleOutdent([this]);\n currentIndent--;\n }\n }\n\n return this;\n }\n\n override canIndent(): false {\n // Indent/outdent is handled specifically in the RichText logic.\n\n return false;\n }\n\n override insertBefore(nodeToInsert: LexicalNode): LexicalNode {\n if ($isListItemNode(nodeToInsert)) {\n const parent = this.getParentOrThrow();\n\n if ($isListNode(parent)) {\n const siblings = this.getNextSiblings();\n updateChildrenListItemValue(parent, siblings);\n }\n }\n\n return super.insertBefore(nodeToInsert);\n }\n\n override canInsertAfter(node: LexicalNode): boolean {\n return $isListNode(node);\n }\n\n override canReplaceWith(replacement: LexicalNode): boolean {\n return $isListItemNode(replacement);\n }\n\n override canMergeWith(node: LexicalNode): boolean {\n return $isParagraphNode(node) || $isListItemNode(node);\n }\n\n override extractWithChild(child: LexicalNode, selection: RangeSelection): boolean {\n if (!$isRangeSelection(selection)) {\n return false;\n }\n\n const anchorNode = selection.anchor.getNode();\n const focusNode = selection.focus.getNode();\n\n return (\n this.isParentOf(anchorNode) &&\n this.isParentOf(focusNode) &&\n this.getTextContent().length === selection.getTextContent().length\n );\n }\n}\n\nfunction $setListItemThemeClassNames(\n dom: HTMLElement,\n editorThemeClasses: EditorThemeClasses,\n node: ListItemNode\n): void {\n const classesToAdd = [];\n const classesToRemove = [];\n const listTheme = editorThemeClasses.list;\n const listItemClassName = listTheme ? listTheme.listitem : undefined;\n let nestedListItemClassName;\n\n if (listTheme && listTheme.nested) {\n nestedListItemClassName = listTheme.nested.listitem;\n }\n\n if (listItemClassName !== undefined) {\n const listItemClasses = listItemClassName.split(\" \");\n classesToAdd.push(...listItemClasses);\n }\n\n if (listTheme) {\n const parentNode = node.getParent();\n const isCheckList = $isListNode(parentNode) && parentNode?.getListType() === \"check\";\n const checked = node.getChecked();\n\n if (!isCheckList || checked) {\n classesToRemove.push(listTheme.listitemUnchecked);\n }\n\n if (!isCheckList || !checked) {\n classesToRemove.push(listTheme.listitemChecked);\n }\n\n if (isCheckList) {\n classesToAdd.push(checked ? listTheme.listitemChecked : listTheme.listitemUnchecked);\n }\n }\n\n if (nestedListItemClassName !== undefined) {\n const nestedListItemClasses = nestedListItemClassName.split(\" \");\n\n if (node.getChildren().some(child => $isListNode(child))) {\n classesToAdd.push(...nestedListItemClasses);\n } else {\n classesToRemove.push(...nestedListItemClasses);\n }\n }\n\n if (classesToRemove.length > 0) {\n removeClassNamesFromElement(dom, ...classesToRemove);\n }\n\n if (classesToAdd.length > 0) {\n addClassNamesToElement(dom, ...classesToAdd);\n }\n}\n\nfunction updateListItemChecked(\n dom: HTMLElement,\n listItemNode: ListItemNode,\n prevListItemNode: ListItemNode | null,\n listNode: ListNode\n): void {\n const isCheckList = listNode.getListType() === \"check\";\n\n if (isCheckList) {\n // Only add attributes for leaf list items\n if ($isListNode(listItemNode.getFirstChild())) {\n dom.removeAttribute(\"role\");\n dom.removeAttribute(\"tabIndex\");\n dom.removeAttribute(\"aria-checked\");\n } else {\n dom.setAttribute(\"role\", \"checkbox\");\n dom.setAttribute(\"tabIndex\", \"-1\");\n\n if (!prevListItemNode || listItemNode.__checked !== prevListItemNode.__checked) {\n dom.setAttribute(\"aria-checked\", listItemNode.getChecked() ? \"true\" : \"false\");\n }\n }\n } else {\n // Clean up checked state\n if (listItemNode.getChecked() != null) {\n listItemNode.setChecked(undefined);\n }\n }\n}\n\nfunction convertListItemElement(): DOMConversionOutput {\n return { node: $createListItemNode() };\n}\n\nexport function $createListItemNode(checked?: boolean): ListItemNode {\n return new ListItemNode(undefined, checked);\n}\n\nexport function $isListItemNode(node: LexicalNode | null | undefined): node is ListItemNode {\n return node instanceof ListItemNode;\n}\n"],"mappings":"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","ignoreList":[]}
|
package/ListNode.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { DOMConversion, DOMConversionMap, DOMExportOutput, EditorConfig, LexicalEditor, LexicalNode, NodeKey, SerializedElementNode, Spread } from "lexical";
|
|
2
|
+
import { ElementNode } from "lexical";
|
|
3
|
+
import type { EditorTheme } from "@webiny/lexical-theme";
|
|
4
|
+
import type { ListNodeTagType } from "@lexical/list/LexicalListNode";
|
|
5
|
+
import type { ListType } from "@lexical/list";
|
|
6
|
+
import type { TypographyStylesNode } from "./types";
|
|
7
|
+
export type SerializedWebinyListNode = Spread<{
|
|
8
|
+
styleId?: string;
|
|
9
|
+
className?: string;
|
|
10
|
+
listType: ListType;
|
|
11
|
+
start: number;
|
|
12
|
+
tag: ListNodeTagType;
|
|
13
|
+
type: "wby-list";
|
|
14
|
+
}, SerializedElementNode>;
|
|
15
|
+
type ListNodeOptions = {
|
|
16
|
+
styleId?: string;
|
|
17
|
+
className?: string;
|
|
18
|
+
start?: number;
|
|
19
|
+
key?: NodeKey;
|
|
20
|
+
};
|
|
21
|
+
export declare class ListNode extends ElementNode implements TypographyStylesNode {
|
|
22
|
+
/** @internal */
|
|
23
|
+
__tag: ListNodeTagType;
|
|
24
|
+
/** @internal */
|
|
25
|
+
__start: number;
|
|
26
|
+
/** @internal */
|
|
27
|
+
__listType: ListType;
|
|
28
|
+
private __styleId;
|
|
29
|
+
private __className;
|
|
30
|
+
constructor(listType: ListType, options?: ListNodeOptions);
|
|
31
|
+
static getType(): string;
|
|
32
|
+
createDOM(config: EditorConfig): HTMLElement;
|
|
33
|
+
exportDOM(editor: LexicalEditor): DOMExportOutput;
|
|
34
|
+
static clone(node: ListNode): ListNode;
|
|
35
|
+
getStyleId(): string | undefined;
|
|
36
|
+
setStyleId(styleId: string | undefined): void;
|
|
37
|
+
setClassName(className: string | undefined): void;
|
|
38
|
+
getClassName(): string | undefined;
|
|
39
|
+
static importJSON(serializedNode: SerializedWebinyListNode): ListNode;
|
|
40
|
+
exportJSON(): SerializedWebinyListNode;
|
|
41
|
+
static importDomConversionMap(): DOMConversion<HTMLElement> | null;
|
|
42
|
+
static importDOM(): DOMConversionMap | null;
|
|
43
|
+
updateDOM(prevNode: ListNode, dom: HTMLElement, config: EditorConfig): boolean;
|
|
44
|
+
extractWithChild(child: LexicalNode): boolean;
|
|
45
|
+
getListType(): ListType;
|
|
46
|
+
getStart(): number;
|
|
47
|
+
private getTag;
|
|
48
|
+
protected updateElementWithThemeClasses(element: HTMLElement, theme: EditorTheme): HTMLElement;
|
|
49
|
+
private setDefaultTypography;
|
|
50
|
+
}
|
|
51
|
+
export declare function $createListNode(listType: ListType, styleId?: string, start?: number): ListNode;
|
|
52
|
+
export declare function $isListNode(node: LexicalNode | null | undefined): node is ListNode;
|
|
53
|
+
export {};
|