@lexical/react 0.14.4 → 0.15.0
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/LexicalAutoEmbedPlugin.dev.js +17 -1
- package/LexicalAutoEmbedPlugin.dev.mjs +3 -0
- package/LexicalAutoEmbedPlugin.js +2 -0
- package/LexicalAutoEmbedPlugin.mjs +2 -0
- package/LexicalAutoEmbedPlugin.node.mjs +2 -0
- package/LexicalAutoEmbedPlugin.prod.js +6 -4
- package/LexicalAutoEmbedPlugin.prod.mjs +2 -0
- package/LexicalAutoFocusPlugin.dev.js +3 -0
- package/LexicalAutoFocusPlugin.dev.mjs +3 -0
- package/LexicalAutoFocusPlugin.js +2 -0
- package/LexicalAutoFocusPlugin.mjs +2 -0
- package/LexicalAutoFocusPlugin.node.mjs +2 -0
- package/LexicalAutoFocusPlugin.prod.js +2 -0
- package/LexicalAutoFocusPlugin.prod.mjs +2 -0
- package/LexicalAutoLinkPlugin.dev.js +9 -4
- package/LexicalAutoLinkPlugin.dev.mjs +10 -5
- package/LexicalAutoLinkPlugin.js +2 -0
- package/LexicalAutoLinkPlugin.mjs +2 -0
- package/LexicalAutoLinkPlugin.node.mjs +2 -0
- package/LexicalAutoLinkPlugin.prod.js +12 -10
- package/LexicalAutoLinkPlugin.prod.mjs +3 -1
- package/LexicalBlockWithAlignableContents.dev.js +20 -4
- package/LexicalBlockWithAlignableContents.dev.mjs +6 -3
- package/LexicalBlockWithAlignableContents.js +2 -0
- package/LexicalBlockWithAlignableContents.mjs +2 -0
- package/LexicalBlockWithAlignableContents.node.mjs +2 -0
- package/LexicalBlockWithAlignableContents.prod.js +6 -4
- package/LexicalBlockWithAlignableContents.prod.mjs +2 -0
- package/LexicalCharacterLimitPlugin.dev.js +21 -4
- package/LexicalCharacterLimitPlugin.dev.mjs +7 -3
- package/LexicalCharacterLimitPlugin.js +2 -0
- package/LexicalCharacterLimitPlugin.mjs +2 -0
- package/LexicalCharacterLimitPlugin.node.mjs +2 -0
- package/LexicalCharacterLimitPlugin.prod.js +11 -9
- package/LexicalCharacterLimitPlugin.prod.mjs +3 -1
- package/LexicalCheckListPlugin.dev.js +3 -0
- package/LexicalCheckListPlugin.dev.mjs +3 -0
- package/LexicalCheckListPlugin.js +2 -0
- package/LexicalCheckListPlugin.mjs +2 -0
- package/LexicalCheckListPlugin.node.mjs +2 -0
- package/LexicalCheckListPlugin.prod.js +2 -0
- package/LexicalCheckListPlugin.prod.mjs +2 -0
- package/LexicalClearEditorPlugin.dev.js +5 -2
- package/LexicalClearEditorPlugin.dev.mjs +7 -4
- package/LexicalClearEditorPlugin.js +2 -0
- package/LexicalClearEditorPlugin.mjs +2 -0
- package/LexicalClearEditorPlugin.node.mjs +2 -0
- package/LexicalClearEditorPlugin.prod.js +3 -1
- package/LexicalClearEditorPlugin.prod.mjs +3 -1
- package/LexicalClickableLinkPlugin.dev.js +14 -13
- package/LexicalClickableLinkPlugin.dev.mjs +14 -13
- package/LexicalClickableLinkPlugin.js +2 -0
- package/LexicalClickableLinkPlugin.mjs +2 -0
- package/LexicalClickableLinkPlugin.node.mjs +2 -0
- package/LexicalClickableLinkPlugin.prod.js +5 -4
- package/LexicalClickableLinkPlugin.prod.mjs +3 -1
- package/LexicalCollaborationContext.dev.js +3 -0
- package/LexicalCollaborationContext.dev.mjs +3 -0
- package/LexicalCollaborationContext.js +2 -0
- package/LexicalCollaborationContext.mjs +2 -0
- package/LexicalCollaborationContext.node.mjs +2 -0
- package/LexicalCollaborationContext.prod.js +2 -0
- package/LexicalCollaborationContext.prod.mjs +2 -0
- package/LexicalCollaborationPlugin.dev.js +19 -2
- package/LexicalCollaborationPlugin.dev.mjs +4 -0
- package/LexicalCollaborationPlugin.js +2 -0
- package/LexicalCollaborationPlugin.mjs +2 -0
- package/LexicalCollaborationPlugin.node.mjs +2 -0
- package/LexicalCollaborationPlugin.prod.js +12 -10
- package/LexicalCollaborationPlugin.prod.mjs +2 -0
- package/LexicalComposer.dev.js +19 -3
- package/LexicalComposer.dev.mjs +7 -4
- package/LexicalComposer.js +2 -0
- package/LexicalComposer.mjs +2 -0
- package/LexicalComposer.node.mjs +2 -0
- package/LexicalComposer.prod.js +5 -3
- package/LexicalComposer.prod.mjs +3 -1
- package/LexicalComposerContext.dev.js +3 -0
- package/LexicalComposerContext.dev.mjs +3 -0
- package/LexicalComposerContext.js +2 -0
- package/LexicalComposerContext.mjs +2 -0
- package/LexicalComposerContext.node.mjs +2 -0
- package/LexicalComposerContext.prod.js +4 -2
- package/LexicalComposerContext.prod.mjs +3 -1
- package/LexicalContentEditable.dev.js +18 -3
- package/LexicalContentEditable.dev.mjs +6 -4
- package/LexicalContentEditable.js +2 -0
- package/LexicalContentEditable.mjs +2 -0
- package/LexicalContentEditable.node.mjs +2 -0
- package/LexicalContentEditable.prod.js +6 -3
- package/LexicalContentEditable.prod.mjs +3 -1
- package/LexicalContextMenuPlugin.dev.js +24 -7
- package/LexicalContextMenuPlugin.dev.mjs +11 -7
- package/LexicalContextMenuPlugin.js +2 -0
- package/LexicalContextMenuPlugin.js.flow +12 -0
- package/LexicalContextMenuPlugin.mjs +2 -0
- package/LexicalContextMenuPlugin.node.mjs +2 -0
- package/LexicalContextMenuPlugin.prod.js +18 -16
- package/LexicalContextMenuPlugin.prod.mjs +3 -1
- package/LexicalDecoratorBlockNode.d.ts +1 -0
- package/LexicalDecoratorBlockNode.dev.js +6 -0
- package/LexicalDecoratorBlockNode.dev.mjs +6 -0
- package/LexicalDecoratorBlockNode.js +2 -0
- package/LexicalDecoratorBlockNode.mjs +2 -0
- package/LexicalDecoratorBlockNode.node.mjs +2 -0
- package/LexicalDecoratorBlockNode.prod.js +3 -1
- package/LexicalDecoratorBlockNode.prod.mjs +3 -1
- package/LexicalEditorRefPlugin.dev.js +17 -1
- package/LexicalEditorRefPlugin.dev.mjs +3 -0
- package/LexicalEditorRefPlugin.js +2 -0
- package/LexicalEditorRefPlugin.js.flow +19 -0
- package/LexicalEditorRefPlugin.mjs +2 -0
- package/LexicalEditorRefPlugin.node.mjs +2 -0
- package/LexicalEditorRefPlugin.prod.js +3 -1
- package/LexicalEditorRefPlugin.prod.mjs +2 -0
- package/LexicalErrorBoundary.dev.js +21 -5
- package/LexicalErrorBoundary.dev.mjs +3 -0
- package/LexicalErrorBoundary.js +2 -0
- package/LexicalErrorBoundary.mjs +2 -0
- package/LexicalErrorBoundary.node.mjs +2 -0
- package/LexicalErrorBoundary.prod.js +6 -4
- package/LexicalErrorBoundary.prod.mjs +2 -0
- package/LexicalHashtagPlugin.dev.js +5 -2
- package/LexicalHashtagPlugin.dev.mjs +5 -2
- package/LexicalHashtagPlugin.js +2 -0
- package/LexicalHashtagPlugin.mjs +2 -0
- package/LexicalHashtagPlugin.node.mjs +2 -0
- package/LexicalHashtagPlugin.prod.js +2 -0
- package/LexicalHashtagPlugin.prod.mjs +2 -0
- package/LexicalHistoryPlugin.dev.js +4 -0
- package/LexicalHistoryPlugin.dev.mjs +4 -0
- package/LexicalHistoryPlugin.js +2 -0
- package/LexicalHistoryPlugin.mjs +2 -0
- package/LexicalHistoryPlugin.node.mjs +2 -0
- package/LexicalHistoryPlugin.prod.js +2 -0
- package/LexicalHistoryPlugin.prod.mjs +2 -0
- package/LexicalHorizontalRuleNode.dev.js +22 -6
- package/LexicalHorizontalRuleNode.dev.mjs +8 -5
- package/LexicalHorizontalRuleNode.js +2 -0
- package/LexicalHorizontalRuleNode.mjs +2 -0
- package/LexicalHorizontalRuleNode.node.mjs +2 -0
- package/LexicalHorizontalRuleNode.prod.js +7 -5
- package/LexicalHorizontalRuleNode.prod.mjs +2 -0
- package/LexicalHorizontalRulePlugin.dev.js +3 -0
- package/LexicalHorizontalRulePlugin.dev.mjs +3 -0
- package/LexicalHorizontalRulePlugin.js +2 -0
- package/LexicalHorizontalRulePlugin.mjs +2 -0
- package/LexicalHorizontalRulePlugin.node.mjs +2 -0
- package/LexicalHorizontalRulePlugin.prod.js +2 -0
- package/LexicalHorizontalRulePlugin.prod.mjs +2 -0
- package/LexicalLinkPlugin.dev.js +6 -3
- package/LexicalLinkPlugin.dev.mjs +7 -4
- package/LexicalLinkPlugin.js +2 -0
- package/LexicalLinkPlugin.mjs +2 -0
- package/LexicalLinkPlugin.node.mjs +2 -0
- package/LexicalLinkPlugin.prod.js +3 -1
- package/LexicalLinkPlugin.prod.mjs +3 -1
- package/LexicalListPlugin.dev.js +4 -0
- package/LexicalListPlugin.dev.mjs +4 -0
- package/LexicalListPlugin.js +2 -0
- package/LexicalListPlugin.mjs +2 -0
- package/LexicalListPlugin.node.mjs +2 -0
- package/LexicalListPlugin.prod.js +2 -0
- package/LexicalListPlugin.prod.mjs +2 -0
- package/LexicalMarkdownShortcutPlugin.dev.js +3 -0
- package/LexicalMarkdownShortcutPlugin.dev.mjs +3 -0
- package/LexicalMarkdownShortcutPlugin.js +2 -0
- package/LexicalMarkdownShortcutPlugin.mjs +2 -0
- package/LexicalMarkdownShortcutPlugin.node.mjs +2 -0
- package/LexicalMarkdownShortcutPlugin.prod.js +2 -0
- package/LexicalMarkdownShortcutPlugin.prod.mjs +2 -0
- package/LexicalNestedComposer.dev.js +17 -1
- package/LexicalNestedComposer.dev.mjs +3 -0
- package/LexicalNestedComposer.js +2 -0
- package/LexicalNestedComposer.mjs +2 -0
- package/LexicalNestedComposer.node.mjs +2 -0
- package/LexicalNestedComposer.prod.js +7 -5
- package/LexicalNestedComposer.prod.mjs +3 -1
- package/LexicalNodeEventPlugin.dev.js +3 -0
- package/LexicalNodeEventPlugin.dev.mjs +3 -0
- package/LexicalNodeEventPlugin.js +2 -0
- package/LexicalNodeEventPlugin.js.flow +12 -0
- package/LexicalNodeEventPlugin.mjs +2 -0
- package/LexicalNodeEventPlugin.node.mjs +2 -0
- package/LexicalNodeEventPlugin.prod.js +2 -0
- package/LexicalNodeEventPlugin.prod.mjs +2 -0
- package/LexicalNodeMenuPlugin.dev.js +25 -8
- package/LexicalNodeMenuPlugin.dev.mjs +11 -7
- package/LexicalNodeMenuPlugin.js +2 -0
- package/LexicalNodeMenuPlugin.mjs +2 -0
- package/LexicalNodeMenuPlugin.node.mjs +2 -0
- package/LexicalNodeMenuPlugin.prod.js +17 -15
- package/LexicalNodeMenuPlugin.prod.mjs +3 -1
- package/LexicalOnChangePlugin.dev.js +5 -2
- package/LexicalOnChangePlugin.dev.mjs +7 -4
- package/LexicalOnChangePlugin.js +2 -0
- package/LexicalOnChangePlugin.mjs +2 -0
- package/LexicalOnChangePlugin.node.mjs +2 -0
- package/LexicalOnChangePlugin.prod.js +3 -1
- package/LexicalOnChangePlugin.prod.mjs +3 -1
- package/LexicalPlainTextPlugin.dev.js +26 -7
- package/LexicalPlainTextPlugin.dev.mjs +13 -7
- package/LexicalPlainTextPlugin.js +2 -0
- package/LexicalPlainTextPlugin.mjs +2 -0
- package/LexicalPlainTextPlugin.node.mjs +2 -0
- package/LexicalPlainTextPlugin.prod.js +6 -4
- package/LexicalPlainTextPlugin.prod.mjs +3 -1
- package/LexicalRichTextPlugin.dev.js +26 -7
- package/LexicalRichTextPlugin.dev.mjs +13 -7
- package/LexicalRichTextPlugin.js +2 -0
- package/LexicalRichTextPlugin.mjs +2 -0
- package/LexicalRichTextPlugin.node.mjs +2 -0
- package/LexicalRichTextPlugin.prod.js +6 -4
- package/LexicalRichTextPlugin.prod.mjs +3 -1
- package/LexicalTabIndentationPlugin.dev.js +5 -2
- package/LexicalTabIndentationPlugin.dev.mjs +5 -2
- package/LexicalTabIndentationPlugin.js +2 -0
- package/LexicalTabIndentationPlugin.mjs +2 -0
- package/LexicalTabIndentationPlugin.node.mjs +2 -0
- package/LexicalTabIndentationPlugin.prod.js +2 -0
- package/LexicalTabIndentationPlugin.prod.mjs +2 -0
- package/LexicalTableOfContents.d.ts +1 -1
- package/LexicalTableOfContents.dev.js +47 -8
- package/LexicalTableOfContents.dev.mjs +48 -9
- package/LexicalTableOfContents.js +2 -0
- package/LexicalTableOfContents.mjs +2 -0
- package/LexicalTableOfContents.node.mjs +2 -0
- package/LexicalTableOfContents.prod.js +6 -4
- package/LexicalTableOfContents.prod.mjs +3 -1
- package/LexicalTablePlugin.dev.js +28 -2
- package/LexicalTablePlugin.dev.mjs +31 -5
- package/LexicalTablePlugin.js +2 -0
- package/LexicalTablePlugin.mjs +2 -0
- package/LexicalTablePlugin.node.mjs +2 -0
- package/LexicalTablePlugin.prod.js +9 -5
- package/LexicalTablePlugin.prod.mjs +3 -1
- package/LexicalTreeView.dev.js +18 -2
- package/LexicalTreeView.dev.mjs +3 -0
- package/LexicalTreeView.js +2 -0
- package/LexicalTreeView.mjs +2 -0
- package/LexicalTreeView.node.mjs +2 -0
- package/LexicalTreeView.prod.js +5 -3
- package/LexicalTreeView.prod.mjs +2 -0
- package/LexicalTypeaheadMenuPlugin.dev.js +25 -8
- package/LexicalTypeaheadMenuPlugin.dev.mjs +11 -7
- package/LexicalTypeaheadMenuPlugin.js +2 -0
- package/LexicalTypeaheadMenuPlugin.mjs +2 -0
- package/LexicalTypeaheadMenuPlugin.node.mjs +2 -0
- package/LexicalTypeaheadMenuPlugin.prod.js +21 -19
- package/LexicalTypeaheadMenuPlugin.prod.mjs +3 -1
- package/package.json +20 -19
- package/shared/useCharacterLimit.d.ts +1 -1
- package/useLexicalEditable.dev.js +6 -2
- package/useLexicalEditable.dev.mjs +8 -4
- package/useLexicalEditable.js +2 -0
- package/useLexicalEditable.mjs +2 -0
- package/useLexicalEditable.node.mjs +2 -0
- package/useLexicalEditable.prod.js +3 -1
- package/useLexicalEditable.prod.mjs +3 -1
- package/useLexicalIsTextContentEmpty.dev.js +5 -2
- package/useLexicalIsTextContentEmpty.dev.mjs +7 -4
- package/useLexicalIsTextContentEmpty.js +2 -0
- package/useLexicalIsTextContentEmpty.mjs +2 -0
- package/useLexicalIsTextContentEmpty.node.mjs +2 -0
- package/useLexicalIsTextContentEmpty.prod.js +3 -1
- package/useLexicalIsTextContentEmpty.prod.mjs +3 -1
- package/useLexicalNodeSelection.dev.js +3 -0
- package/useLexicalNodeSelection.dev.mjs +4 -1
- package/useLexicalNodeSelection.js +2 -0
- package/useLexicalNodeSelection.mjs +2 -0
- package/useLexicalNodeSelection.node.mjs +2 -0
- package/useLexicalNodeSelection.prod.js +2 -0
- package/useLexicalNodeSelection.prod.mjs +3 -1
- package/useLexicalSubscription.dev.js +5 -2
- package/useLexicalSubscription.dev.mjs +7 -4
- package/useLexicalSubscription.js +2 -0
- package/useLexicalSubscription.mjs +2 -0
- package/useLexicalSubscription.node.mjs +2 -0
- package/useLexicalSubscription.prod.js +3 -1
- package/useLexicalSubscription.prod.mjs +3 -1
- package/useLexicalTextEntity.dev.js +3 -0
- package/useLexicalTextEntity.dev.mjs +3 -0
- package/useLexicalTextEntity.js +2 -0
- package/useLexicalTextEntity.mjs +2 -0
- package/useLexicalTextEntity.node.mjs +2 -0
- package/useLexicalTextEntity.prod.js +2 -0
- package/useLexicalTextEntity.prod.mjs +2 -0
|
@@ -3,11 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
'use strict';
|
|
8
10
|
|
|
9
11
|
var LexicalComposerContext = require('@lexical/react/LexicalComposerContext');
|
|
10
12
|
var richText = require('@lexical/rich-text');
|
|
13
|
+
var utils = require('@lexical/utils');
|
|
11
14
|
var lexical = require('lexical');
|
|
12
15
|
var react = require('react');
|
|
13
16
|
|
|
@@ -18,6 +21,7 @@ var react = require('react');
|
|
|
18
21
|
* LICENSE file in the root directory of this source tree.
|
|
19
22
|
*
|
|
20
23
|
*/
|
|
24
|
+
|
|
21
25
|
function toEntry(heading) {
|
|
22
26
|
return [heading.getKey(), heading.getTextContent(), heading.getTag()];
|
|
23
27
|
}
|
|
@@ -28,12 +32,20 @@ function $insertHeadingIntoTableOfContents(prevHeading, newHeading, currentTable
|
|
|
28
32
|
const newEntry = toEntry(newHeading);
|
|
29
33
|
let newTableOfContents = [];
|
|
30
34
|
if (prevHeading === null) {
|
|
35
|
+
// check if key already exists
|
|
36
|
+
if (currentTableOfContents.length > 0 && currentTableOfContents[0][0] === newHeading.__key) {
|
|
37
|
+
return currentTableOfContents;
|
|
38
|
+
}
|
|
31
39
|
newTableOfContents = [newEntry, ...currentTableOfContents];
|
|
32
40
|
} else {
|
|
33
41
|
for (let i = 0; i < currentTableOfContents.length; i++) {
|
|
34
42
|
const key = currentTableOfContents[i][0];
|
|
35
43
|
newTableOfContents.push(currentTableOfContents[i]);
|
|
36
44
|
if (key === prevHeading.getKey() && key !== newHeading.getKey()) {
|
|
45
|
+
// check if key already exists
|
|
46
|
+
if (i + 1 < currentTableOfContents.length && currentTableOfContents[i + 1][0] === newHeading.__key) {
|
|
47
|
+
return currentTableOfContents;
|
|
48
|
+
}
|
|
37
49
|
newTableOfContents.push(newEntry);
|
|
38
50
|
}
|
|
39
51
|
}
|
|
@@ -82,6 +94,13 @@ function $updateHeadingPosition(prevHeading, heading, currentTableOfContents) {
|
|
|
82
94
|
}
|
|
83
95
|
return newTableOfContents;
|
|
84
96
|
}
|
|
97
|
+
function $getPreviousHeading(node) {
|
|
98
|
+
let prevHeading = utils.$getNextRightPreorderNode(node);
|
|
99
|
+
while (prevHeading !== null && !richText.$isHeadingNode(prevHeading)) {
|
|
100
|
+
prevHeading = utils.$getNextRightPreorderNode(prevHeading);
|
|
101
|
+
}
|
|
102
|
+
return prevHeading;
|
|
103
|
+
}
|
|
85
104
|
function LexicalTableOfContentsPlugin({
|
|
86
105
|
children
|
|
87
106
|
}) {
|
|
@@ -100,6 +119,31 @@ function LexicalTableOfContentsPlugin({
|
|
|
100
119
|
}
|
|
101
120
|
setTableOfContents(currentTableOfContents);
|
|
102
121
|
});
|
|
122
|
+
const removeRootUpdateListener = editor.registerUpdateListener(({
|
|
123
|
+
editorState,
|
|
124
|
+
dirtyElements
|
|
125
|
+
}) => {
|
|
126
|
+
editorState.read(() => {
|
|
127
|
+
const updateChildHeadings = node => {
|
|
128
|
+
for (const child of node.getChildren()) {
|
|
129
|
+
if (richText.$isHeadingNode(child)) {
|
|
130
|
+
const prevHeading = $getPreviousHeading(child);
|
|
131
|
+
currentTableOfContents = $updateHeadingPosition(prevHeading, child, currentTableOfContents);
|
|
132
|
+
setTableOfContents(currentTableOfContents);
|
|
133
|
+
} else if (lexical.$isElementNode(child)) {
|
|
134
|
+
updateChildHeadings(child);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
// If a node is changes, all child heading positions need to be updated
|
|
140
|
+
lexical.$getRoot().getChildren().forEach(node => {
|
|
141
|
+
if (lexical.$isElementNode(node) && dirtyElements.get(node.__key)) {
|
|
142
|
+
updateChildHeadings(node);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
});
|
|
103
147
|
|
|
104
148
|
// Listen to updates to heading mutations and update state
|
|
105
149
|
const removeHeaderMutationListener = editor.registerMutationListener(richText.HeadingNode, mutatedNodes => {
|
|
@@ -108,10 +152,7 @@ function LexicalTableOfContentsPlugin({
|
|
|
108
152
|
if (mutation === 'created') {
|
|
109
153
|
const newHeading = lexical.$getNodeByKey(nodeKey);
|
|
110
154
|
if (newHeading !== null) {
|
|
111
|
-
|
|
112
|
-
while (prevHeading !== null && !richText.$isHeadingNode(prevHeading)) {
|
|
113
|
-
prevHeading = prevHeading.getPreviousSibling();
|
|
114
|
-
}
|
|
155
|
+
const prevHeading = $getPreviousHeading(newHeading);
|
|
115
156
|
currentTableOfContents = $insertHeadingIntoTableOfContents(prevHeading, newHeading, currentTableOfContents);
|
|
116
157
|
}
|
|
117
158
|
} else if (mutation === 'destroyed') {
|
|
@@ -119,10 +160,7 @@ function LexicalTableOfContentsPlugin({
|
|
|
119
160
|
} else if (mutation === 'updated') {
|
|
120
161
|
const newHeading = lexical.$getNodeByKey(nodeKey);
|
|
121
162
|
if (newHeading !== null) {
|
|
122
|
-
|
|
123
|
-
while (prevHeading !== null && !richText.$isHeadingNode(prevHeading)) {
|
|
124
|
-
prevHeading = prevHeading.getPreviousSibling();
|
|
125
|
-
}
|
|
163
|
+
const prevHeading = $getPreviousHeading(newHeading);
|
|
126
164
|
currentTableOfContents = $updateHeadingPosition(prevHeading, newHeading, currentTableOfContents);
|
|
127
165
|
}
|
|
128
166
|
}
|
|
@@ -151,6 +189,7 @@ function LexicalTableOfContentsPlugin({
|
|
|
151
189
|
return () => {
|
|
152
190
|
removeHeaderMutationListener();
|
|
153
191
|
removeTextNodeMutationListener();
|
|
192
|
+
removeRootUpdateListener();
|
|
154
193
|
};
|
|
155
194
|
}, [editor]);
|
|
156
195
|
return children(tableOfContents, editor);
|
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
|
8
10
|
import { $isHeadingNode, HeadingNode } from '@lexical/rich-text';
|
|
9
|
-
import { $
|
|
11
|
+
import { $getNextRightPreorderNode } from '@lexical/utils';
|
|
12
|
+
import { $getRoot, $isElementNode, $getNodeByKey, TextNode } from 'lexical';
|
|
10
13
|
import { useState, useEffect } from 'react';
|
|
11
14
|
|
|
12
15
|
/**
|
|
@@ -16,6 +19,7 @@ import { useState, useEffect } from 'react';
|
|
|
16
19
|
* LICENSE file in the root directory of this source tree.
|
|
17
20
|
*
|
|
18
21
|
*/
|
|
22
|
+
|
|
19
23
|
function toEntry(heading) {
|
|
20
24
|
return [heading.getKey(), heading.getTextContent(), heading.getTag()];
|
|
21
25
|
}
|
|
@@ -26,12 +30,20 @@ function $insertHeadingIntoTableOfContents(prevHeading, newHeading, currentTable
|
|
|
26
30
|
const newEntry = toEntry(newHeading);
|
|
27
31
|
let newTableOfContents = [];
|
|
28
32
|
if (prevHeading === null) {
|
|
33
|
+
// check if key already exists
|
|
34
|
+
if (currentTableOfContents.length > 0 && currentTableOfContents[0][0] === newHeading.__key) {
|
|
35
|
+
return currentTableOfContents;
|
|
36
|
+
}
|
|
29
37
|
newTableOfContents = [newEntry, ...currentTableOfContents];
|
|
30
38
|
} else {
|
|
31
39
|
for (let i = 0; i < currentTableOfContents.length; i++) {
|
|
32
40
|
const key = currentTableOfContents[i][0];
|
|
33
41
|
newTableOfContents.push(currentTableOfContents[i]);
|
|
34
42
|
if (key === prevHeading.getKey() && key !== newHeading.getKey()) {
|
|
43
|
+
// check if key already exists
|
|
44
|
+
if (i + 1 < currentTableOfContents.length && currentTableOfContents[i + 1][0] === newHeading.__key) {
|
|
45
|
+
return currentTableOfContents;
|
|
46
|
+
}
|
|
35
47
|
newTableOfContents.push(newEntry);
|
|
36
48
|
}
|
|
37
49
|
}
|
|
@@ -80,6 +92,13 @@ function $updateHeadingPosition(prevHeading, heading, currentTableOfContents) {
|
|
|
80
92
|
}
|
|
81
93
|
return newTableOfContents;
|
|
82
94
|
}
|
|
95
|
+
function $getPreviousHeading(node) {
|
|
96
|
+
let prevHeading = $getNextRightPreorderNode(node);
|
|
97
|
+
while (prevHeading !== null && !$isHeadingNode(prevHeading)) {
|
|
98
|
+
prevHeading = $getNextRightPreorderNode(prevHeading);
|
|
99
|
+
}
|
|
100
|
+
return prevHeading;
|
|
101
|
+
}
|
|
83
102
|
function LexicalTableOfContentsPlugin({
|
|
84
103
|
children
|
|
85
104
|
}) {
|
|
@@ -98,6 +117,31 @@ function LexicalTableOfContentsPlugin({
|
|
|
98
117
|
}
|
|
99
118
|
setTableOfContents(currentTableOfContents);
|
|
100
119
|
});
|
|
120
|
+
const removeRootUpdateListener = editor.registerUpdateListener(({
|
|
121
|
+
editorState,
|
|
122
|
+
dirtyElements
|
|
123
|
+
}) => {
|
|
124
|
+
editorState.read(() => {
|
|
125
|
+
const updateChildHeadings = node => {
|
|
126
|
+
for (const child of node.getChildren()) {
|
|
127
|
+
if ($isHeadingNode(child)) {
|
|
128
|
+
const prevHeading = $getPreviousHeading(child);
|
|
129
|
+
currentTableOfContents = $updateHeadingPosition(prevHeading, child, currentTableOfContents);
|
|
130
|
+
setTableOfContents(currentTableOfContents);
|
|
131
|
+
} else if ($isElementNode(child)) {
|
|
132
|
+
updateChildHeadings(child);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// If a node is changes, all child heading positions need to be updated
|
|
138
|
+
$getRoot().getChildren().forEach(node => {
|
|
139
|
+
if ($isElementNode(node) && dirtyElements.get(node.__key)) {
|
|
140
|
+
updateChildHeadings(node);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
});
|
|
101
145
|
|
|
102
146
|
// Listen to updates to heading mutations and update state
|
|
103
147
|
const removeHeaderMutationListener = editor.registerMutationListener(HeadingNode, mutatedNodes => {
|
|
@@ -106,10 +150,7 @@ function LexicalTableOfContentsPlugin({
|
|
|
106
150
|
if (mutation === 'created') {
|
|
107
151
|
const newHeading = $getNodeByKey(nodeKey);
|
|
108
152
|
if (newHeading !== null) {
|
|
109
|
-
|
|
110
|
-
while (prevHeading !== null && !$isHeadingNode(prevHeading)) {
|
|
111
|
-
prevHeading = prevHeading.getPreviousSibling();
|
|
112
|
-
}
|
|
153
|
+
const prevHeading = $getPreviousHeading(newHeading);
|
|
113
154
|
currentTableOfContents = $insertHeadingIntoTableOfContents(prevHeading, newHeading, currentTableOfContents);
|
|
114
155
|
}
|
|
115
156
|
} else if (mutation === 'destroyed') {
|
|
@@ -117,10 +158,7 @@ function LexicalTableOfContentsPlugin({
|
|
|
117
158
|
} else if (mutation === 'updated') {
|
|
118
159
|
const newHeading = $getNodeByKey(nodeKey);
|
|
119
160
|
if (newHeading !== null) {
|
|
120
|
-
|
|
121
|
-
while (prevHeading !== null && !$isHeadingNode(prevHeading)) {
|
|
122
|
-
prevHeading = prevHeading.getPreviousSibling();
|
|
123
|
-
}
|
|
161
|
+
const prevHeading = $getPreviousHeading(newHeading);
|
|
124
162
|
currentTableOfContents = $updateHeadingPosition(prevHeading, newHeading, currentTableOfContents);
|
|
125
163
|
}
|
|
126
164
|
}
|
|
@@ -149,6 +187,7 @@ function LexicalTableOfContentsPlugin({
|
|
|
149
187
|
return () => {
|
|
150
188
|
removeHeaderMutationListener();
|
|
151
189
|
removeTextNodeMutationListener();
|
|
190
|
+
removeRootUpdateListener();
|
|
152
191
|
};
|
|
153
192
|
}, [editor]);
|
|
154
193
|
return children(tableOfContents, editor);
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
'use strict'
|
|
8
10
|
const LexicalTableOfContents = process.env.NODE_ENV === 'development' ? require('./LexicalTableOfContents.dev.js') : require('./LexicalTableOfContents.prod.js');
|
|
9
11
|
module.exports = LexicalTableOfContents;
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
import * as modDev from './LexicalTableOfContents.dev.mjs';
|
|
8
10
|
import * as modProd from './LexicalTableOfContents.prod.mjs';
|
|
9
11
|
const mod = process.env.NODE_ENV === 'development' ? modDev : modProd;
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
const mod = await (process.env.NODE_ENV === 'development' ? import('./LexicalTableOfContents.dev.mjs') : import('./LexicalTableOfContents.prod.mjs'));
|
|
8
10
|
export default mod.default;
|
|
@@ -3,8 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
b.
|
|
8
|
+
|
|
9
|
+
'use strict';var h=require("@lexical/react/LexicalComposerContext"),q=require("@lexical/rich-text"),v=require("@lexical/utils"),w=require("lexical"),x=require("react");function y(d){return[d.getKey(),d.getTextContent(),d.getTag()]}function z(d,t,n){let e=[],c=y(t);d||e.push(c);for(let r of n)r[0]!==t.getKey()&&(e.push(r),d&&r[0]===d.getKey()&&e.push(c));return e}function B(d){for(d=v.$getNextRightPreorderNode(d);null!==d&&!q.$isHeadingNode(d);)d=v.$getNextRightPreorderNode(d);return d}
|
|
10
|
+
module.exports=function({children:d}){let [t,n]=x.useState([]),[e]=h.useLexicalComposerContext();x.useEffect(()=>{let c=[];e.getEditorState().read(()=>{let l=w.$getRoot().getChildren();for(let a of l)q.$isHeadingNode(a)&&c.push([a.getKey(),a.getTextContent(),a.getTag()]);n(c)});let r=e.registerUpdateListener(({editorState:l,dirtyElements:a})=>{l.read(()=>{const f=b=>{for(const g of b.getChildren())q.$isHeadingNode(g)?(b=B(g),c=z(b,g,c),n(c)):w.$isElementNode(g)&&f(g)};w.$getRoot().getChildren().forEach(b=>
|
|
11
|
+
{w.$isElementNode(b)&&a.get(b.__key)&&f(b)})})}),C=e.registerMutationListener(q.HeadingNode,l=>{e.getEditorState().read(()=>{for(const [g,m]of l)if("created"===m){var a=w.$getNodeByKey(g);if(null!==a)a:{var f=B(a),b=c;if(null===a){c=b;break a}let k=y(a),u=[];if(null===f){if(0<b.length&&b[0][0]===a.__key){c=b;break a}u=[k,...b]}else for(let p=0;p<b.length;p++){let A=b[p][0];u.push(b[p]);if(A===f.getKey()&&A!==a.getKey()){if(p+1<b.length&&b[p+1][0]===a.__key){c=b;break a}u.push(k)}}c=u}}else if("destroyed"===
|
|
12
|
+
m){f=g;a=c;b=[];for(let k of a)k[0]!==f&&b.push(k);c=b}else"updated"===m&&(f=w.$getNodeByKey(g),null!==f&&(a=B(f),c=z(a,f,c)));n(c)})}),D=e.registerMutationListener(w.TextNode,l=>{e.getEditorState().read(()=>{for(const [b,g]of l)if("updated"===g){var a=w.$getNodeByKey(b);if(null!==a&&(a=a.getParentOrThrow(),q.$isHeadingNode(a))){var f=c;let m=[];for(let k of f)k[0]===a.getKey()?m.push(y(a)):m.push(k);c=m;n(c)}}})});return()=>{C();D();r()}},[e]);return d(t,e)}
|
|
@@ -3,5 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
import{useLexicalComposerContext as t}from"@lexical/react/LexicalComposerContext";import{$isHeadingNode as e,HeadingNode as r}from"@lexical/rich-text";import{$getNextRightPreorderNode as n}from"@lexical/utils";import{$getRoot as o,$isElementNode as i,$getNodeByKey as s,TextNode as f}from"lexical";import{useState as c,useEffect as l}from"react";function u(t){return[t.getKey(),t.getTextContent(),t.getTag()]}function a(t,e,r){if(null===e)return r;const n=u(e);let o=[];if(null===t){if(r.length>0&&r[0][0]===e.__key)return r;o=[n,...r]}else for(let i=0;i<r.length;i++){const s=r[i][0];if(o.push(r[i]),s===t.getKey()&&s!==e.getKey()){if(i+1<r.length&&r[i+1][0]===e.__key)return r;o.push(n)}}return o}function g(t,e){const r=[];for(const n of e)n[0]!==t&&r.push(n);return r}function d(t,e){const r=[];for(const n of e)n[0]===t.getKey()?r.push(u(t)):r.push(n);return r}function h(t,e,r){const n=[],o=u(e);t||n.push(o);for(const i of r)i[0]!==e.getKey()&&(n.push(i),t&&i[0]===t.getKey()&&n.push(o));return n}function p(t){let r=n(t);for(;null!==r&&!e(r);)r=n(r);return r}function m({children:n}){const[u,m]=c([]),[y]=t();return l((()=>{let t=[];y.getEditorState().read((()=>{const r=o().getChildren();for(const n of r)e(n)&&t.push([n.getKey(),n.getTextContent(),n.getTag()]);m(t)}));const n=y.registerUpdateListener((({editorState:r,dirtyElements:n})=>{r.read((()=>{const r=n=>{for(const o of n.getChildren())if(e(o)){const e=p(o);t=h(e,o,t),m(t)}else i(o)&&r(o)};o().getChildren().forEach((t=>{i(t)&&n.get(t.__key)&&r(t)}))}))})),c=y.registerMutationListener(r,(e=>{y.getEditorState().read((()=>{for(const[r,n]of e)if("created"===n){const e=s(r);if(null!==e){const r=p(e);t=a(r,e,t)}}else if("destroyed"===n)t=g(r,t);else if("updated"===n){const e=s(r);if(null!==e){const r=p(e);t=h(r,e,t)}}m(t)}))})),l=y.registerMutationListener(f,(r=>{y.getEditorState().read((()=>{for(const[n,o]of r)if("updated"===o){const r=s(n);if(null!==r){const n=r.getParentOrThrow();e(n)&&(t=d(n,t),m(t))}}}))}));return()=>{c(),l(),n()}}),[y]),n(u,y)}export{m as default};
|
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
'use strict';
|
|
8
10
|
|
|
9
11
|
var LexicalComposerContext = require('@lexical/react/LexicalComposerContext');
|
|
@@ -19,6 +21,7 @@ var react = require('react');
|
|
|
19
21
|
* LICENSE file in the root directory of this source tree.
|
|
20
22
|
*
|
|
21
23
|
*/
|
|
24
|
+
|
|
22
25
|
function TablePlugin({
|
|
23
26
|
hasCellMerge = true,
|
|
24
27
|
hasCellBackgroundColor = true,
|
|
@@ -31,7 +34,7 @@ function TablePlugin({
|
|
|
31
34
|
throw Error(`TablePlugin: TableNode, TableCellNode or TableRowNode not registered on editor`);
|
|
32
35
|
}
|
|
33
36
|
}
|
|
34
|
-
return editor.registerCommand(table.INSERT_TABLE_COMMAND, ({
|
|
37
|
+
return utils.mergeRegister(editor.registerCommand(table.INSERT_TABLE_COMMAND, ({
|
|
35
38
|
columns,
|
|
36
39
|
rows,
|
|
37
40
|
includeHeaders
|
|
@@ -43,7 +46,30 @@ function TablePlugin({
|
|
|
43
46
|
firstDescendant.select();
|
|
44
47
|
}
|
|
45
48
|
return true;
|
|
46
|
-
}, lexical.COMMAND_PRIORITY_EDITOR)
|
|
49
|
+
}, lexical.COMMAND_PRIORITY_EDITOR), editor.registerNodeTransform(table.TableNode, node => {
|
|
50
|
+
const [gridMap] = table.$computeTableMapSkipCellCheck(node, null, null);
|
|
51
|
+
const maxRowLength = gridMap.reduce((curLength, row) => {
|
|
52
|
+
return Math.max(curLength, row.length);
|
|
53
|
+
}, 0);
|
|
54
|
+
for (let i = 0; i < gridMap.length; ++i) {
|
|
55
|
+
const rowLength = gridMap[i].length;
|
|
56
|
+
if (rowLength === maxRowLength) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const lastCellMap = gridMap[i][rowLength - 1];
|
|
60
|
+
const lastRowCell = lastCellMap.cell;
|
|
61
|
+
for (let j = rowLength; j < maxRowLength; ++j) {
|
|
62
|
+
// TODO: inherit header state from another header or body
|
|
63
|
+
const newCell = table.$createTableCellNode(0);
|
|
64
|
+
newCell.append(lexical.$createParagraphNode());
|
|
65
|
+
if (lastRowCell !== null) {
|
|
66
|
+
lastRowCell.insertAfter(newCell);
|
|
67
|
+
} else {
|
|
68
|
+
utils.$insertFirst(lastRowCell, newCell);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}));
|
|
47
73
|
}, [editor]);
|
|
48
74
|
react.useEffect(() => {
|
|
49
75
|
const tableSelections = new Map();
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
|
8
|
-
import { TableNode, TableCellNode, TableRowNode, INSERT_TABLE_COMMAND, $createTableNodeWithDimensions, $isTableNode, $getNodeTriplet, $computeTableMap, $isTableRowNode, $isTableCellNode,
|
|
9
|
-
import { $insertNodeToNearestRoot, $insertFirst } from '@lexical/utils';
|
|
10
|
-
import { $isTextNode, COMMAND_PRIORITY_EDITOR, $nodesOfType, $getNodeByKey } from 'lexical';
|
|
10
|
+
import { TableNode, TableCellNode, TableRowNode, INSERT_TABLE_COMMAND, $createTableNodeWithDimensions, $computeTableMapSkipCellCheck, $createTableCellNode, $isTableNode, $getNodeTriplet, $computeTableMap, $isTableRowNode, $isTableCellNode, applyTableHandlers } from '@lexical/table';
|
|
11
|
+
import { mergeRegister, $insertNodeToNearestRoot, $insertFirst } from '@lexical/utils';
|
|
12
|
+
import { $isTextNode, COMMAND_PRIORITY_EDITOR, $createParagraphNode, $nodesOfType, $getNodeByKey } from 'lexical';
|
|
11
13
|
import { useEffect } from 'react';
|
|
12
14
|
|
|
13
15
|
/**
|
|
@@ -17,6 +19,7 @@ import { useEffect } from 'react';
|
|
|
17
19
|
* LICENSE file in the root directory of this source tree.
|
|
18
20
|
*
|
|
19
21
|
*/
|
|
22
|
+
|
|
20
23
|
function TablePlugin({
|
|
21
24
|
hasCellMerge = true,
|
|
22
25
|
hasCellBackgroundColor = true,
|
|
@@ -29,7 +32,7 @@ function TablePlugin({
|
|
|
29
32
|
throw Error(`TablePlugin: TableNode, TableCellNode or TableRowNode not registered on editor`);
|
|
30
33
|
}
|
|
31
34
|
}
|
|
32
|
-
return editor.registerCommand(INSERT_TABLE_COMMAND, ({
|
|
35
|
+
return mergeRegister(editor.registerCommand(INSERT_TABLE_COMMAND, ({
|
|
33
36
|
columns,
|
|
34
37
|
rows,
|
|
35
38
|
includeHeaders
|
|
@@ -41,7 +44,30 @@ function TablePlugin({
|
|
|
41
44
|
firstDescendant.select();
|
|
42
45
|
}
|
|
43
46
|
return true;
|
|
44
|
-
}, COMMAND_PRIORITY_EDITOR)
|
|
47
|
+
}, COMMAND_PRIORITY_EDITOR), editor.registerNodeTransform(TableNode, node => {
|
|
48
|
+
const [gridMap] = $computeTableMapSkipCellCheck(node, null, null);
|
|
49
|
+
const maxRowLength = gridMap.reduce((curLength, row) => {
|
|
50
|
+
return Math.max(curLength, row.length);
|
|
51
|
+
}, 0);
|
|
52
|
+
for (let i = 0; i < gridMap.length; ++i) {
|
|
53
|
+
const rowLength = gridMap[i].length;
|
|
54
|
+
if (rowLength === maxRowLength) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const lastCellMap = gridMap[i][rowLength - 1];
|
|
58
|
+
const lastRowCell = lastCellMap.cell;
|
|
59
|
+
for (let j = rowLength; j < maxRowLength; ++j) {
|
|
60
|
+
// TODO: inherit header state from another header or body
|
|
61
|
+
const newCell = $createTableCellNode(0);
|
|
62
|
+
newCell.append($createParagraphNode());
|
|
63
|
+
if (lastRowCell !== null) {
|
|
64
|
+
lastRowCell.insertAfter(newCell);
|
|
65
|
+
} else {
|
|
66
|
+
$insertFirst(lastRowCell, newCell);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}));
|
|
45
71
|
}, [editor]);
|
|
46
72
|
useEffect(() => {
|
|
47
73
|
const tableSelections = new Map();
|
package/LexicalTablePlugin.js
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
'use strict'
|
|
8
10
|
const LexicalTablePlugin = process.env.NODE_ENV === 'development' ? require('./LexicalTablePlugin.dev.js') : require('./LexicalTablePlugin.prod.js');
|
|
9
11
|
module.exports = LexicalTablePlugin;
|
package/LexicalTablePlugin.mjs
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
import * as modDev from './LexicalTablePlugin.dev.mjs';
|
|
8
10
|
import * as modProd from './LexicalTablePlugin.prod.mjs';
|
|
9
11
|
const mod = process.env.NODE_ENV === 'development' ? modDev : modProd;
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
const mod = await (process.env.NODE_ENV === 'development' ? import('./LexicalTablePlugin.dev.mjs') : import('./LexicalTablePlugin.prod.mjs'));
|
|
8
10
|
export const TablePlugin = mod.TablePlugin;
|
|
@@ -3,9 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
a[
|
|
8
|
+
|
|
9
|
+
'use strict';var c=require("@lexical/react/LexicalComposerContext"),q=require("@lexical/table"),r=require("@lexical/utils"),t=require("lexical"),u=require("react"),v;function y(l){let m=new URLSearchParams;m.append("code",l);for(let n=1;n<arguments.length;n++)m.append("v",arguments[n]);throw Error(`Minified Lexical error #${l}; visit https://lexical.dev/docs/error?${m} for the full message or `+"use the non-minified dev environment for full errors and additional helpful warnings.");}
|
|
10
|
+
v=y&&y.__esModule&&Object.prototype.hasOwnProperty.call(y,"default")?y["default"]:y;
|
|
11
|
+
exports.TablePlugin=function({hasCellMerge:l=!0,hasCellBackgroundColor:m=!0,hasTabHandler:n=!0}){let [g]=c.useLexicalComposerContext();u.useEffect(()=>{g.hasNodes([q.TableNode,q.TableCellNode,q.TableRowNode])||v(10);return r.mergeRegister(g.registerCommand(q.INSERT_TABLE_COMMAND,({columns:a,rows:e,includeHeaders:f})=>{a=q.$createTableNodeWithDimensions(Number(e),Number(a),f);r.$insertNodeToNearestRoot(a);a=a.getFirstDescendant();t.$isTextNode(a)&&a.select();return!0},t.COMMAND_PRIORITY_EDITOR),g.registerNodeTransform(q.TableNode,
|
|
12
|
+
a=>{[a]=q.$computeTableMapSkipCellCheck(a,null,null);let e=a.reduce((b,d)=>Math.max(b,d.length),0);for(let b=0;b<a.length;++b){var f=a[b].length;if(f===e)continue;let d=a[b][f-1].cell;for(;f<e;++f){let h=q.$createTableCellNode(0);h.append(t.$createParagraphNode());null!==d?d.insertAfter(h):r.$insertFirst(d,h)}}}))},[g]);u.useEffect(()=>{let a=new Map,e=b=>{const d=b.getKey(),h=g.getElementByKey(d);h&&!a.has(d)&&(b=q.applyTableHandlers(b,h,g,n),a.set(d,b))};g.getEditorState().read(()=>{let b=t.$nodesOfType(q.TableNode);
|
|
13
|
+
for(let d of b)q.$isTableNode(d)&&e(d)});let f=g.registerMutationListener(q.TableNode,b=>{for(const [d,h]of b)"created"===h?g.getEditorState().read(()=>{const k=t.$getNodeByKey(d);q.$isTableNode(k)&&e(k)}):"destroyed"===h&&(b=a.get(d),void 0!==b&&(b.removeListeners(),a.delete(d)))});return()=>{f();for(let [,b]of a)b.removeListeners()}},[g,n]);u.useEffect(()=>{if(!l)return g.registerNodeTransform(q.TableCellNode,a=>{if(1<a.getColSpan()||1<a.getRowSpan()){var [,,e]=q.$getNodeTriplet(a);[a]=q.$computeTableMap(e,
|
|
14
|
+
a,a);let b=a.length,d=a[0].length;e=e.getFirstChild();q.$isTableRowNode(e)||v(175);let h=[];for(let k=0;k<b;k++){0!==k&&(e=e.getNextSibling(),q.$isTableRowNode(e)||v(175));let x=null;for(let w=0;w<d;w++){var f=a[k][w];let p=f.cell;if(f.startRow===k&&f.startColumn===w)x=p,h.push(p);else if(1<p.getColSpan()||1<p.getRowSpan())q.$isTableCellNode(p)||v(176),f=q.$createTableCellNode(p.__headerState),null!==x?x.insertAfter(f):r.$insertFirst(e,f)}}for(let k of h)k.setColSpan(1),k.setRowSpan(1)}})},[g,l]);
|
|
15
|
+
u.useEffect(()=>{if(!m)return g.registerNodeTransform(q.TableCellNode,a=>{null!==a.getBackgroundColor()&&a.setBackgroundColor(null)})},[g,m,l]);return null}
|
|
@@ -3,5 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
+
|
|
9
|
+
import{useLexicalComposerContext as e}from"@lexical/react/LexicalComposerContext";import{TableNode as t,TableCellNode as r,TableRowNode as o,INSERT_TABLE_COMMAND as n,$createTableNodeWithDimensions as l,$computeTableMapSkipCellCheck as s,$createTableCellNode as a,$isTableNode as i,$getNodeTriplet as c,$computeTableMap as f,$isTableRowNode as d,$isTableCellNode as u,applyTableHandlers as g}from"@lexical/table";import{mergeRegister as m,$insertNodeToNearestRoot as p,$insertFirst as h}from"@lexical/utils";import{$isTextNode as C,COMMAND_PRIORITY_EDITOR as x,$createParagraphNode as S,$nodesOfType as w,$getNodeByKey as v}from"lexical";import{useEffect as N}from"react";function b(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var y=b((function(e){const t=new URLSearchParams;t.append("code",e);for(let e=1;e<arguments.length;e++)t.append("v",arguments[e]);throw Error(`Minified Lexical error #${e}; visit https://lexical.dev/docs/error?${t} for the full message or use the non-minified dev environment for full errors and additional helpful warnings.`)}));function L({hasCellMerge:b=!0,hasCellBackgroundColor:L=!0,hasTabHandler:M=!0}){const[R]=e();return N((()=>(R.hasNodes([t,r,o])||y(10),m(R.registerCommand(n,(({columns:e,rows:t,includeHeaders:r})=>{const o=l(Number(t),Number(e),r);p(o);const n=o.getFirstDescendant();return C(n)&&n.select(),!0}),x),R.registerNodeTransform(t,(e=>{const[t]=s(e,null,null),r=t.reduce(((e,t)=>Math.max(e,t.length)),0);for(let e=0;e<t.length;++e){const o=t[e].length;if(o===r)continue;const n=t[e][o-1].cell;for(let e=o;e<r;++e){const e=a(0);e.append(S()),null!==n?n.insertAfter(e):h(n,e)}}}))))),[R]),N((()=>{const e=new Map,r=t=>{const r=t.getKey(),o=R.getElementByKey(r);if(o&&!e.has(r)){const n=g(t,o,R,M);e.set(r,n)}};R.getEditorState().read((()=>{const e=w(t);for(const t of e)i(t)&&r(t)}));const o=R.registerMutationListener(t,(t=>{for(const[o,n]of t)if("created"===n)R.getEditorState().read((()=>{const e=v(o);i(e)&&r(e)}));else if("destroyed"===n){const t=e.get(o);void 0!==t&&(t.removeListeners(),e.delete(o))}}));return()=>{o();for(const[,t]of e)t.removeListeners()}}),[R,M]),N((()=>{if(!b)return R.registerNodeTransform(r,(e=>{if(e.getColSpan()>1||e.getRowSpan()>1){const[,,t]=c(e),[r]=f(t,e,e),o=r.length,n=r[0].length;let l=t.getFirstChild();d(l)||y(175);const s=[];for(let e=0;e<o;e++){0!==e&&(l=l.getNextSibling(),d(l)||y(175));let t=null;for(let o=0;o<n;o++){const n=r[e][o],i=n.cell;if(n.startRow===e&&n.startColumn===o)t=i,s.push(i);else if(i.getColSpan()>1||i.getRowSpan()>1){u(i)||y(176);const e=a(i.__headerState);null!==t?t.insertAfter(e):h(l,e)}}}for(const e of s)e.setColSpan(1),e.setRowSpan(1)}}))}),[R,b]),N((()=>{if(!L)return R.registerNodeTransform(r,(e=>{null!==e.getBackgroundColor()&&e.setBackgroundColor(null)}))}),[R,L,b]),null}export{L as TablePlugin};
|
package/LexicalTreeView.dev.js
CHANGED
|
@@ -3,13 +3,28 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
'use strict';
|
|
8
10
|
|
|
9
11
|
var devtoolsCore = require('@lexical/devtools-core');
|
|
10
12
|
var utils = require('@lexical/utils');
|
|
11
13
|
var React = require('react');
|
|
12
14
|
|
|
15
|
+
function _interopNamespaceDefault(e) {
|
|
16
|
+
var n = Object.create(null);
|
|
17
|
+
if (e) {
|
|
18
|
+
for (var k in e) {
|
|
19
|
+
n[k] = e[k];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
n.default = e;
|
|
23
|
+
return n;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
27
|
+
|
|
13
28
|
/**
|
|
14
29
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
15
30
|
*
|
|
@@ -17,6 +32,7 @@ var React = require('react');
|
|
|
17
32
|
* LICENSE file in the root directory of this source tree.
|
|
18
33
|
*
|
|
19
34
|
*/
|
|
35
|
+
|
|
20
36
|
function TreeView({
|
|
21
37
|
treeTypeButtonClassName,
|
|
22
38
|
timeTravelButtonClassName,
|
|
@@ -26,7 +42,7 @@ function TreeView({
|
|
|
26
42
|
timeTravelPanelClassName,
|
|
27
43
|
editor
|
|
28
44
|
}) {
|
|
29
|
-
const treeElementRef = /*#__PURE__*/
|
|
45
|
+
const treeElementRef = /*#__PURE__*/React__namespace.createRef();
|
|
30
46
|
const [editorCurrentState, setEditorCurrentState] = React.useState(editor.getEditorState());
|
|
31
47
|
const commandsLog = devtoolsCore.useLexicalCommandsLog(editor);
|
|
32
48
|
React.useEffect(() => {
|
|
@@ -56,7 +72,7 @@ function TreeView({
|
|
|
56
72
|
}
|
|
57
73
|
rootElement.contentEditable = isReadonly ? 'false' : 'true';
|
|
58
74
|
};
|
|
59
|
-
return /*#__PURE__*/
|
|
75
|
+
return /*#__PURE__*/React__namespace.createElement(devtoolsCore.TreeView, {
|
|
60
76
|
treeTypeButtonClassName: treeTypeButtonClassName,
|
|
61
77
|
timeTravelButtonClassName: timeTravelButtonClassName,
|
|
62
78
|
timeTravelPanelSliderClassName: timeTravelPanelSliderClassName,
|
package/LexicalTreeView.dev.mjs
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
import { useLexicalCommandsLog, TreeView as TreeView$1, generateContent } from '@lexical/devtools-core';
|
|
8
10
|
import { mergeRegister } from '@lexical/utils';
|
|
9
11
|
import * as React from 'react';
|
|
@@ -16,6 +18,7 @@ import { useState, useEffect } from 'react';
|
|
|
16
18
|
* LICENSE file in the root directory of this source tree.
|
|
17
19
|
*
|
|
18
20
|
*/
|
|
21
|
+
|
|
19
22
|
function TreeView({
|
|
20
23
|
treeTypeButtonClassName,
|
|
21
24
|
timeTravelButtonClassName,
|
package/LexicalTreeView.js
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
'use strict'
|
|
8
10
|
const LexicalTreeView = process.env.NODE_ENV === 'development' ? require('./LexicalTreeView.dev.js') : require('./LexicalTreeView.prod.js');
|
|
9
11
|
module.exports = LexicalTreeView;
|
package/LexicalTreeView.mjs
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
import * as modDev from './LexicalTreeView.dev.mjs';
|
|
8
10
|
import * as modProd from './LexicalTreeView.prod.mjs';
|
|
9
11
|
const mod = process.env.NODE_ENV === 'development' ? modDev : modProd;
|
package/LexicalTreeView.node.mjs
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
8
|
+
|
|
7
9
|
const mod = await (process.env.NODE_ENV === 'development' ? import('./LexicalTreeView.dev.mjs') : import('./LexicalTreeView.prod.mjs'));
|
|
8
10
|
export const TreeView = mod.TreeView;
|
package/LexicalTreeView.prod.js
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
6
7
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
|
|
9
|
+
'use strict';var c=require("@lexical/devtools-core"),d=require("@lexical/utils"),e=require("react"),g=Object.create(null);if(e)for(var l in e)g[l]=e[l];g.default=e;
|
|
10
|
+
exports.TreeView=function({treeTypeButtonClassName:m,timeTravelButtonClassName:n,timeTravelPanelSliderClassName:p,timeTravelPanelButtonClassName:q,viewClassName:r,timeTravelPanelClassName:t,editor:a}){let f=g.createRef(),[u,h]=e.useState(a.getEditorState()),v=c.useLexicalCommandsLog(a);e.useEffect(()=>d.mergeRegister(a.registerUpdateListener(({editorState:b})=>{h(b)}),a.registerEditableListener(()=>{h(a.getEditorState())})),[a]);e.useEffect(()=>{let b=f.current;if(null!==b)return b.__lexicalEditor=
|
|
11
|
+
a,()=>{b.__lexicalEditor=null}},[a,f]);return g.createElement(c.TreeView,{treeTypeButtonClassName:m,timeTravelButtonClassName:n,timeTravelPanelSliderClassName:p,timeTravelPanelButtonClassName:q,viewClassName:r,timeTravelPanelClassName:t,setEditorReadOnly:b=>{const k=a.getRootElement();null!=k&&(k.contentEditable=b?"false":"true")},editorState:u,setEditorState:b=>a.setEditorState(b),generateContent:async function(b){return c.generateContent(a,v,b)},ref:f})}
|