@webiny/lexical-nodes 5.43.3 → 6.0.0-alpha.1
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 +4 -4
- package/FontColorNode.js +96 -145
- package/FontColorNode.js.map +1 -1
- package/HeadingNode.d.ts +29 -17
- package/HeadingNode.js +181 -152
- package/HeadingNode.js.map +1 -1
- package/ImageNode.js +143 -188
- package/ImageNode.js.map +1 -1
- package/LinkNode.d.ts +2 -2
- package/LinkNode.js +251 -346
- package/LinkNode.js.map +1 -1
- package/ListItemNode.d.ts +4 -3
- package/ListItemNode.js +276 -354
- package/ListItemNode.js.map +1 -1
- package/ListNode.d.ts +28 -14
- package/ListNode.js +174 -208
- package/ListNode.js.map +1 -1
- package/ParagraphNode.d.ts +28 -16
- package/ParagraphNode.js +141 -179
- package/ParagraphNode.js.map +1 -1
- package/QuoteNode.d.ts +26 -19
- package/QuoteNode.js +104 -186
- package/QuoteNode.js.map +1 -1
- package/components/ImageNode/ContentEditable.js +7 -14
- package/components/ImageNode/ContentEditable.js.map +1 -1
- package/components/ImageNode/ImageComponent.js +104 -124
- package/components/ImageNode/ImageComponent.js.map +1 -1
- package/components/ImageNode/ImageResizer.js +78 -83
- package/components/ImageNode/ImageResizer.js.map +1 -1
- package/components/ImageNode/Placeholder.d.ts +1 -1
- package/components/ImageNode/Placeholder.js +10 -16
- package/components/ImageNode/Placeholder.js.map +1 -1
- package/components/ImageNode/SharedHistoryContext.d.ts +2 -2
- package/components/ImageNode/SharedHistoryContext.js +12 -20
- package/components/ImageNode/SharedHistoryContext.js.map +1 -1
- package/generateInitialLexicalValue.d.ts +4 -0
- package/generateInitialLexicalValue.js +27 -0
- package/generateInitialLexicalValue.js.map +1 -0
- package/index.d.ts +4 -8
- package/index.js +44 -230
- package/index.js.map +1 -1
- package/package.json +4 -4
- package/prepareLexicalState.d.ts +2 -0
- package/prepareLexicalState.js +53 -0
- package/prepareLexicalState.js.map +1 -0
- package/types.d.ts +4 -5
- package/types.js +1 -5
- package/types.js.map +1 -1
- package/utils/clearNodeFormating.d.ts +1 -1
- package/utils/clearNodeFormating.js +12 -18
- package/utils/clearNodeFormating.js.map +1 -1
- package/utils/formatList.d.ts +3 -3
- package/utils/formatList.js +171 -208
- package/utils/formatList.js.map +1 -1
- package/utils/formatToHeading.d.ts +2 -2
- package/utils/formatToHeading.js +8 -15
- package/utils/formatToHeading.js.map +1 -1
- package/utils/formatToParagraph.d.ts +1 -1
- package/utils/formatToParagraph.js +8 -16
- package/utils/formatToParagraph.js.map +1 -1
- package/utils/formatToQuote.d.ts +1 -1
- package/utils/formatToQuote.js +8 -15
- package/utils/formatToQuote.js.map +1 -1
- 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 +2 -2
- package/utils/listNode.js +37 -50
- package/utils/listNode.js.map +1 -1
- package/utils/toggleLink.d.ts +1 -1
- package/utils/toggleLink.js +41 -45
- package/utils/toggleLink.js.map +1 -1
- package/TypographyNode.d.ts +0 -39
- package/TypographyNode.js +0 -146
- package/TypographyNode.js.map +0 -1
package/ListItemNode.js
CHANGED
|
@@ -1,382 +1,306 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
exports.$isListItemNode = $isListItemNode;
|
|
9
|
-
exports.ListItemNode = void 0;
|
|
10
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
-
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
12
|
-
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
14
|
-
var _callSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/callSuper"));
|
|
15
|
-
var _superPropGet2 = _interopRequireDefault(require("@babel/runtime/helpers/superPropGet"));
|
|
16
|
-
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
17
|
-
var _lexical = require("lexical");
|
|
18
|
-
var _ListNode = require("./ListNode");
|
|
19
|
-
var _utils = require("@lexical/utils");
|
|
20
|
-
var _formatList = require("./utils/formatList");
|
|
21
|
-
var _ParagraphNode = require("./ParagraphNode");
|
|
22
|
-
var _listNode = require("./utils/listNode");
|
|
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";
|
|
23
8
|
/** @noInheritDoc */
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
}, {
|
|
47
|
-
key: "updateDOM",
|
|
48
|
-
value: function updateDOM(prevNode, dom, config) {
|
|
49
|
-
var parent = this.getParent();
|
|
50
|
-
if ((0, _ListNode.$isListNode)(parent) && parent.getListType() === "check") {
|
|
51
|
-
updateListItemChecked(dom, this, prevNode, parent);
|
|
52
|
-
}
|
|
53
|
-
// @ts-expect-error - this is always HTMLListItemElement
|
|
54
|
-
dom.value = this.__value;
|
|
55
|
-
$setListItemThemeClassNames(dom, config.theme, this);
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
}, {
|
|
59
|
-
key: "exportJSON",
|
|
60
|
-
value: function exportJSON() {
|
|
61
|
-
return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, (0, _superPropGet2.default)(ListItemNode, "exportJSON", this, 3)([])), {}, {
|
|
62
|
-
checked: this.getChecked(),
|
|
63
|
-
type: "webiny-listitem",
|
|
64
|
-
value: this.getValue(),
|
|
65
|
-
version: 1
|
|
66
|
-
});
|
|
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);
|
|
67
30
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
node.remove();
|
|
77
|
-
} else {
|
|
78
|
-
(0, _superPropGet2.default)(ListItemNode, "append", this, 3)([node]);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return this;
|
|
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);
|
|
82
39
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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();
|
|
98
75
|
} else {
|
|
99
|
-
|
|
100
|
-
var newList = (0, _ListNode.$createListNode)(list.getListType());
|
|
101
|
-
var nextSibling = this.getNextSibling();
|
|
102
|
-
while (nextSibling) {
|
|
103
|
-
var nodeToAppend = nextSibling;
|
|
104
|
-
nextSibling = nextSibling.getNextSibling();
|
|
105
|
-
newList.append(nodeToAppend);
|
|
106
|
-
}
|
|
107
|
-
list.insertAfter(replaceWithNode);
|
|
108
|
-
replaceWithNode.insertAfter(newList);
|
|
109
|
-
}
|
|
110
|
-
if (includeChildren) {
|
|
111
|
-
if (!(0, _lexical.$isElementNode)(replaceWithNode)) {
|
|
112
|
-
throw Error("includeChildren should only be true for ElementNodes");
|
|
113
|
-
}
|
|
114
|
-
this.getChildren().forEach(function (child) {
|
|
115
|
-
replaceWithNode.append(child);
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
this.remove();
|
|
119
|
-
if (list.getChildrenSize() === 0) {
|
|
120
|
-
list.remove();
|
|
76
|
+
super.append(node);
|
|
121
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)) {
|
|
122
88
|
return replaceWithNode;
|
|
123
89
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if ((0, _ListNode.$isListNode)(afterListNode)) {
|
|
137
|
-
(0, _formatList.updateChildrenListItemValue)(afterListNode);
|
|
138
|
-
}
|
|
139
|
-
return after;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Attempt to merge if the list is of the same type.
|
|
143
|
-
|
|
144
|
-
if ((0, _ListNode.$isListNode)(node) && node.getListType() === listNode.getListType()) {
|
|
145
|
-
var child = node;
|
|
146
|
-
var children = node.getChildren();
|
|
147
|
-
for (var i = children.length - 1; i >= 0; i--) {
|
|
148
|
-
child = children[i];
|
|
149
|
-
this.insertAfter(child);
|
|
150
|
-
}
|
|
151
|
-
return child;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
// Otherwise, split the list
|
|
155
|
-
// Split the lists and insert the node in between them
|
|
156
|
-
listNode.insertAfter(node);
|
|
157
|
-
if (siblings.length !== 0) {
|
|
158
|
-
var newListNode = (0, _ListNode.$createListNode)(listNode.getListType());
|
|
159
|
-
siblings.forEach(function (sibling) {
|
|
160
|
-
return newListNode.append(sibling);
|
|
161
|
-
});
|
|
162
|
-
node.insertAfter(newListNode);
|
|
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);
|
|
163
102
|
}
|
|
164
|
-
|
|
103
|
+
list.insertAfter(replaceWithNode);
|
|
104
|
+
replaceWithNode.insertAfter(newList);
|
|
165
105
|
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
var prevSibling = this.getPreviousSibling();
|
|
170
|
-
var nextSibling = this.getNextSibling();
|
|
171
|
-
(0, _superPropGet2.default)(ListItemNode, "remove", this, 3)([preserveEmptyParent]);
|
|
172
|
-
if (prevSibling && nextSibling && (0, _listNode.isNestedListNode)(prevSibling) && (0, _listNode.isNestedListNode)(nextSibling)) {
|
|
173
|
-
(0, _formatList.mergeLists)(prevSibling.getFirstChild(), nextSibling.getFirstChild());
|
|
174
|
-
nextSibling.remove();
|
|
175
|
-
} else if (nextSibling) {
|
|
176
|
-
var parent = nextSibling.getParent();
|
|
177
|
-
if ((0, _ListNode.$isListNode)(parent)) {
|
|
178
|
-
(0, _formatList.updateChildrenListItemValue)(parent);
|
|
179
|
-
}
|
|
106
|
+
if (includeChildren) {
|
|
107
|
+
if (!$isElementNode(replaceWithNode)) {
|
|
108
|
+
throw Error("includeChildren should only be true for ElementNodes");
|
|
180
109
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
key: "insertNewAfter",
|
|
184
|
-
value: function insertNewAfter() {
|
|
185
|
-
var newElement = $createListItemNode(this.__checked == null ? undefined : false);
|
|
186
|
-
this.insertAfter(newElement);
|
|
187
|
-
return newElement;
|
|
188
|
-
}
|
|
189
|
-
}, {
|
|
190
|
-
key: "collapseAtStart",
|
|
191
|
-
value: function collapseAtStart(selection) {
|
|
192
|
-
var paragraph = (0, _ParagraphNode.$createParagraphNode)();
|
|
193
|
-
var children = this.getChildren();
|
|
194
|
-
children.forEach(function (child) {
|
|
195
|
-
return paragraph.append(child);
|
|
110
|
+
this.getChildren().forEach(child => {
|
|
111
|
+
replaceWithNode.append(child);
|
|
196
112
|
});
|
|
197
|
-
var listNode = this.getParentOrThrow();
|
|
198
|
-
var listNodeParent = listNode.getParentOrThrow();
|
|
199
|
-
var isIndented = $isListItemNode(listNodeParent);
|
|
200
|
-
if (listNode.getChildrenSize() === 1) {
|
|
201
|
-
if (isIndented) {
|
|
202
|
-
// if the list node is nested, we just want to remove it,
|
|
203
|
-
// effectively unindenting it.
|
|
204
|
-
listNode.remove();
|
|
205
|
-
listNodeParent.select();
|
|
206
|
-
} else {
|
|
207
|
-
listNode.replace(paragraph);
|
|
208
|
-
// If we have selection on the list item, we'll need to move it
|
|
209
|
-
// to the paragraph
|
|
210
|
-
var anchor = selection.anchor;
|
|
211
|
-
var focus = selection.focus;
|
|
212
|
-
var key = paragraph.getKey();
|
|
213
|
-
if (anchor.type === "element" && anchor.getNode().is(this)) {
|
|
214
|
-
anchor.set(key, anchor.offset, "element");
|
|
215
|
-
}
|
|
216
|
-
if (focus.type === "element" && focus.getNode().is(this)) {
|
|
217
|
-
focus.set(key, focus.offset, "element");
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
} else {
|
|
221
|
-
listNode.insertBefore(paragraph);
|
|
222
|
-
this.remove();
|
|
223
|
-
}
|
|
224
|
-
return true;
|
|
225
|
-
}
|
|
226
|
-
}, {
|
|
227
|
-
key: "getValue",
|
|
228
|
-
value: function getValue() {
|
|
229
|
-
var self = this.getLatest();
|
|
230
|
-
return self.__value;
|
|
231
113
|
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
var self = this.getWritable();
|
|
236
|
-
self.__value = value;
|
|
114
|
+
this.remove();
|
|
115
|
+
if (list.getChildrenSize() === 0) {
|
|
116
|
+
list.remove();
|
|
237
117
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
key: "setChecked",
|
|
246
|
-
value: function setChecked(checked) {
|
|
247
|
-
var self = this.getWritable();
|
|
248
|
-
self.__checked = checked;
|
|
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;
|
|
249
125
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
return this.getLatest().__indent;
|
|
257
|
-
}
|
|
258
|
-
// ListItemNode should always have a ListNode for a parent.
|
|
259
|
-
var listNodeParent = parent.getParentOrThrow();
|
|
260
|
-
var indentLevel = 0;
|
|
261
|
-
while ($isListItemNode(listNodeParent)) {
|
|
262
|
-
listNodeParent = listNodeParent.getParentOrThrow().getParentOrThrow();
|
|
263
|
-
indentLevel++;
|
|
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);
|
|
264
132
|
}
|
|
265
|
-
return
|
|
133
|
+
return after;
|
|
266
134
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
(0, _formatList.$handleOutdent)([this]);
|
|
277
|
-
currentIndent--;
|
|
278
|
-
}
|
|
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);
|
|
279
144
|
}
|
|
280
|
-
return
|
|
145
|
+
return child;
|
|
281
146
|
}
|
|
282
|
-
}, {
|
|
283
|
-
key: "canIndent",
|
|
284
|
-
value: function canIndent() {
|
|
285
|
-
// Indent/outdent is handled specifically in the RichText logic.
|
|
286
147
|
|
|
287
|
-
|
|
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);
|
|
288
155
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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);
|
|
298
169
|
}
|
|
299
|
-
return (0, _superPropGet2.default)(ListItemNode, "insertBefore", this, 3)([nodeToInsert]);
|
|
300
170
|
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
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();
|
|
305
207
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
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;
|
|
310
231
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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++;
|
|
315
238
|
}
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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--;
|
|
321
250
|
}
|
|
322
|
-
var anchorNode = selection.anchor.getNode();
|
|
323
|
-
var focusNode = selection.focus.getNode();
|
|
324
|
-
return this.isParentOf(anchorNode) && this.isParentOf(focusNode) && this.getTextContent().length === selection.getTextContent().length;
|
|
325
251
|
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
/** @internal */
|
|
252
|
+
return this;
|
|
253
|
+
}
|
|
254
|
+
canIndent() {
|
|
255
|
+
// Indent/outdent is handled specifically in the RichText logic.
|
|
331
256
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
key: "importDOM",
|
|
342
|
-
value: function importDOM() {
|
|
343
|
-
return {
|
|
344
|
-
li: function li() {
|
|
345
|
-
return {
|
|
346
|
-
conversion: convertListItemElement,
|
|
347
|
-
priority: 0
|
|
348
|
-
};
|
|
349
|
-
}
|
|
350
|
-
};
|
|
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
|
+
}
|
|
351
266
|
}
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
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;
|
|
360
281
|
}
|
|
361
|
-
|
|
362
|
-
|
|
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
|
+
}
|
|
363
287
|
function $setListItemThemeClassNames(dom, editorThemeClasses, node) {
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
288
|
+
const classesToAdd = [];
|
|
289
|
+
const classesToRemove = [];
|
|
290
|
+
const listTheme = editorThemeClasses.list;
|
|
291
|
+
const listItemClassName = listTheme ? listTheme.listitem : undefined;
|
|
292
|
+
let nestedListItemClassName;
|
|
369
293
|
if (listTheme && listTheme.nested) {
|
|
370
294
|
nestedListItemClassName = listTheme.nested.listitem;
|
|
371
295
|
}
|
|
372
296
|
if (listItemClassName !== undefined) {
|
|
373
|
-
|
|
374
|
-
classesToAdd.push
|
|
297
|
+
const listItemClasses = listItemClassName.split(" ");
|
|
298
|
+
classesToAdd.push(...listItemClasses);
|
|
375
299
|
}
|
|
376
300
|
if (listTheme) {
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
301
|
+
const parentNode = node.getParent();
|
|
302
|
+
const isCheckList = $isListNode(parentNode) && parentNode?.getListType() === "check";
|
|
303
|
+
const checked = node.getChecked();
|
|
380
304
|
if (!isCheckList || checked) {
|
|
381
305
|
classesToRemove.push(listTheme.listitemUnchecked);
|
|
382
306
|
}
|
|
@@ -388,27 +312,25 @@ function $setListItemThemeClassNames(dom, editorThemeClasses, node) {
|
|
|
388
312
|
}
|
|
389
313
|
}
|
|
390
314
|
if (nestedListItemClassName !== undefined) {
|
|
391
|
-
|
|
392
|
-
if (node.getChildren().some(
|
|
393
|
-
|
|
394
|
-
})) {
|
|
395
|
-
classesToAdd.push.apply(classesToAdd, (0, _toConsumableArray2.default)(nestedListItemClasses));
|
|
315
|
+
const nestedListItemClasses = nestedListItemClassName.split(" ");
|
|
316
|
+
if (node.getChildren().some(child => $isListNode(child))) {
|
|
317
|
+
classesToAdd.push(...nestedListItemClasses);
|
|
396
318
|
} else {
|
|
397
|
-
classesToRemove.push
|
|
319
|
+
classesToRemove.push(...nestedListItemClasses);
|
|
398
320
|
}
|
|
399
321
|
}
|
|
400
322
|
if (classesToRemove.length > 0) {
|
|
401
|
-
|
|
323
|
+
removeClassNamesFromElement(dom, ...classesToRemove);
|
|
402
324
|
}
|
|
403
325
|
if (classesToAdd.length > 0) {
|
|
404
|
-
|
|
326
|
+
addClassNamesToElement(dom, ...classesToAdd);
|
|
405
327
|
}
|
|
406
328
|
}
|
|
407
329
|
function updateListItemChecked(dom, listItemNode, prevListItemNode, listNode) {
|
|
408
|
-
|
|
330
|
+
const isCheckList = listNode.getListType() === "check";
|
|
409
331
|
if (isCheckList) {
|
|
410
332
|
// Only add attributes for leaf list items
|
|
411
|
-
if (
|
|
333
|
+
if ($isListNode(listItemNode.getFirstChild())) {
|
|
412
334
|
dom.removeAttribute("role");
|
|
413
335
|
dom.removeAttribute("tabIndex");
|
|
414
336
|
dom.removeAttribute("aria-checked");
|
|
@@ -431,10 +353,10 @@ function convertListItemElement() {
|
|
|
431
353
|
node: $createListItemNode()
|
|
432
354
|
};
|
|
433
355
|
}
|
|
434
|
-
function $createListItemNode(checked) {
|
|
356
|
+
export function $createListItemNode(checked) {
|
|
435
357
|
return new ListItemNode(undefined, checked);
|
|
436
358
|
}
|
|
437
|
-
function $isListItemNode(node) {
|
|
359
|
+
export function $isListItemNode(node) {
|
|
438
360
|
return node instanceof ListItemNode;
|
|
439
361
|
}
|
|
440
362
|
|