@toptal/picasso-rich-text-editor 4.2.1 → 5.0.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/LexicalEditor/styles.d.ts +1 -1
- package/LexicalEditor/styles.js +10 -3
- package/LexicalEditor/styles.js.map +1 -1
- package/LexicalEditor/utils/cleanup-html-output.js +2 -0
- package/LexicalEditor/utils/cleanup-html-output.js.map +1 -1
- package/LexicalEditor/utils/cleanup-html-output.test.js +12 -0
- package/LexicalEditor/utils/cleanup-html-output.test.js.map +1 -1
- package/LexicalEditor/utils/create-lexical-theme.js +2 -0
- package/LexicalEditor/utils/create-lexical-theme.js.map +1 -1
- package/LexicalEditor/utils/hasChildDOMNodeTag.d.ts +2 -0
- package/LexicalEditor/utils/hasChildDOMNodeTag.js +12 -0
- package/LexicalEditor/utils/hasChildDOMNodeTag.js.map +1 -0
- package/LexicalEditor/utils/hasChildDOMNodeTag.test.d.ts +1 -0
- package/LexicalEditor/utils/hasChildDOMNodeTag.test.js +39 -0
- package/LexicalEditor/utils/hasChildDOMNodeTag.test.js.map +1 -0
- package/LexicalEditor/utils/index.d.ts +1 -0
- package/LexicalEditor/utils/index.js +1 -0
- package/LexicalEditor/utils/index.js.map +1 -1
- package/LexicalEditorToolbarPlugin/LexicalEditorToolbarPlugin.js +16 -2
- package/LexicalEditorToolbarPlugin/LexicalEditorToolbarPlugin.js.map +1 -1
- package/RichText/components/CodeBlock.d.ts +6 -0
- package/RichText/components/CodeBlock.js +10 -0
- package/RichText/components/CodeBlock.js.map +1 -0
- package/RichText/components/index.d.ts +2 -0
- package/RichText/components/index.js +2 -0
- package/RichText/components/index.js.map +1 -1
- package/RichText/components/styles.d.ts +4 -10
- package/RichText/components/styles.js +17 -0
- package/RichText/components/styles.js.map +1 -1
- package/RichText/hooks/useRichText/useRichText.js +2 -2
- package/RichText/hooks/useRichText/useRichText.js.map +1 -1
- package/RichText/types.d.ts +1 -1
- package/RichTextEditorToolbar/RichTextEditorToolbar.js +5 -4
- package/RichTextEditorToolbar/RichTextEditorToolbar.js.map +1 -1
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/package.json +2 -2
- package/plugins/CodeBlockPlugin/CodeBlockButton.d.ts +6 -0
- package/plugins/CodeBlockPlugin/CodeBlockButton.js +98 -0
- package/plugins/CodeBlockPlugin/CodeBlockButton.js.map +1 -0
- package/plugins/CodeBlockPlugin/CodeBlockPlugin.d.ts +8 -0
- package/plugins/CodeBlockPlugin/CodeBlockPlugin.js +43 -0
- package/plugins/CodeBlockPlugin/CodeBlockPlugin.js.map +1 -0
- package/plugins/CodeBlockPlugin/index.d.ts +1 -0
- package/plugins/CodeBlockPlugin/index.js +2 -0
- package/plugins/CodeBlockPlugin/index.js.map +1 -0
- package/plugins/CodeBlockPlugin/nodes/CodeBlockNode.d.ts +18 -0
- package/plugins/CodeBlockPlugin/nodes/CodeBlockNode.js +135 -0
- package/plugins/CodeBlockPlugin/nodes/CodeBlockNode.js.map +1 -0
- package/plugins/CodeBlockPlugin/nodes/CodeBlockTextNode.d.ts +14 -0
- package/plugins/CodeBlockPlugin/nodes/CodeBlockTextNode.js +43 -0
- package/plugins/CodeBlockPlugin/nodes/CodeBlockTextNode.js.map +1 -0
- package/plugins/CodeBlockPlugin/nodes/index.d.ts +8 -0
- package/plugins/CodeBlockPlugin/nodes/index.js +15 -0
- package/plugins/CodeBlockPlugin/nodes/index.js.map +1 -0
- package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.d.ts +4 -0
- package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.js +12 -0
- package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.js.map +1 -0
- package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.test.d.ts +1 -0
- package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.test.js +66 -0
- package/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.test.js.map +1 -0
- package/plugins/CodeBlockPlugin/utils/index.d.ts +1 -0
- package/plugins/CodeBlockPlugin/utils/index.js +2 -0
- package/plugins/CodeBlockPlugin/utils/index.js.map +1 -0
- package/plugins/CodePlugin/CodeButton.js +3 -2
- package/plugins/CodePlugin/CodeButton.js.map +1 -1
- package/plugins/ImagePlugin/components/ImagePluginButton/ImagePluginButton.js +2 -2
- package/plugins/ImagePlugin/components/ImagePluginButton/ImagePluginButton.js.map +1 -1
- package/plugins/LinkPlugin/LinkPluginButton.js +3 -2
- package/plugins/LinkPlugin/LinkPluginButton.js.map +1 -1
- package/plugins/api.d.ts +2 -0
- package/plugins/api.js +9 -2
- package/plugins/api.js.map +1 -1
- package/plugins/index.d.ts +1 -0
- package/plugins/index.js +1 -0
- package/plugins/index.js.map +1 -1
- package/utils/html-to-hast.js +1 -0
- package/utils/html-to-hast.js.map +1 -1
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { CodeBlock16 } from '@toptal/picasso';
|
|
2
|
+
import React, { useCallback, useState } from 'react';
|
|
3
|
+
import { $createLineBreakNode, $createParagraphNode, $getSelection, $isElementNode, $isRangeSelection, ElementNode, } from 'lexical';
|
|
4
|
+
import { $getNearestNodeOfType } from '@lexical/utils';
|
|
5
|
+
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
|
6
|
+
import { $setBlocksType } from '@lexical/selection';
|
|
7
|
+
import { useRTEPluginContext, useRTEUpdate } from '../api';
|
|
8
|
+
import RichTextEditorButton from '../../RichTextEditorButton';
|
|
9
|
+
import { $createCodeBlockTextNode, $createCodeBlockNode, $isCodeBlockNode, } from './nodes';
|
|
10
|
+
import { getSelectedNode } from '../../LexicalEditor/utils';
|
|
11
|
+
// go up through the tree and find the nearest block node (paragraph, heading, list, etc)
|
|
12
|
+
const getParentBlockNode = (node) => {
|
|
13
|
+
if (!node) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const elementNode = $getNearestNodeOfType(node, ElementNode);
|
|
17
|
+
if (!elementNode) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
if (elementNode.isInline()) {
|
|
21
|
+
return getParentBlockNode(elementNode.getParent());
|
|
22
|
+
}
|
|
23
|
+
return elementNode;
|
|
24
|
+
};
|
|
25
|
+
const getBlockNodesInSelection = () => {
|
|
26
|
+
const selection = $getSelection();
|
|
27
|
+
if (!$isRangeSelection(selection)) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
let blockNodesInSelection = selection
|
|
31
|
+
.getNodes()
|
|
32
|
+
.filter($isElementNode)
|
|
33
|
+
.filter(node => node.isInline() === false);
|
|
34
|
+
const isBlockNodesEmpty = blockNodesInSelection.length === 0;
|
|
35
|
+
if (isBlockNodesEmpty) {
|
|
36
|
+
const selectedNode = getSelectedNode(selection);
|
|
37
|
+
const blockNode = getParentBlockNode(selectedNode);
|
|
38
|
+
if (!blockNode) {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
blockNodesInSelection = [blockNode];
|
|
42
|
+
}
|
|
43
|
+
return blockNodesInSelection;
|
|
44
|
+
};
|
|
45
|
+
const appendTextToCodeBlock = (node, codeBlock, isLast) => {
|
|
46
|
+
const text = node.getTextContent();
|
|
47
|
+
if (text) {
|
|
48
|
+
codeBlock.append($createCodeBlockTextNode(text));
|
|
49
|
+
}
|
|
50
|
+
if (!isLast) {
|
|
51
|
+
codeBlock.append($createLineBreakNode());
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const replaceChildrenNodesWithRawText = (selection) => {
|
|
55
|
+
$setBlocksType(selection, () => $createParagraphNode());
|
|
56
|
+
const codeBlock = $createCodeBlockNode();
|
|
57
|
+
const blockNodesInSelection = getBlockNodesInSelection();
|
|
58
|
+
if (blockNodesInSelection.length === 0) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
blockNodesInSelection.forEach((node, index) => {
|
|
62
|
+
const isLast = index === blockNodesInSelection.length - 1;
|
|
63
|
+
appendTextToCodeBlock(node, codeBlock, isLast);
|
|
64
|
+
if (isLast) {
|
|
65
|
+
node.insertAfter(codeBlock);
|
|
66
|
+
}
|
|
67
|
+
node.remove();
|
|
68
|
+
});
|
|
69
|
+
codeBlock.select();
|
|
70
|
+
};
|
|
71
|
+
const CodeBlockButton = ({ 'data-testid': testId }) => {
|
|
72
|
+
const [isButtonActive, setButtonActive] = useState(false);
|
|
73
|
+
const [editor] = useLexicalComposerContext();
|
|
74
|
+
const { disabled, focused } = useRTEPluginContext();
|
|
75
|
+
const handleClick = useCallback(() => {
|
|
76
|
+
editor.update(() => {
|
|
77
|
+
const selection = $getSelection();
|
|
78
|
+
if ($isRangeSelection(selection)) {
|
|
79
|
+
if (isButtonActive) {
|
|
80
|
+
return $setBlocksType(selection, () => $createParagraphNode());
|
|
81
|
+
}
|
|
82
|
+
replaceChildrenNodesWithRawText(selection);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}, [editor, isButtonActive]);
|
|
86
|
+
useRTEUpdate(() => {
|
|
87
|
+
const selection = $getSelection();
|
|
88
|
+
if ($isRangeSelection(selection)) {
|
|
89
|
+
const node = getSelectedNode(selection);
|
|
90
|
+
const parent = node.getParent();
|
|
91
|
+
const isCodeBlockSelected = $isCodeBlockNode(parent) || $isCodeBlockNode(node);
|
|
92
|
+
setButtonActive(isCodeBlockSelected);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
return (React.createElement(RichTextEditorButton, { icon: React.createElement(CodeBlock16, null), onClick: handleClick, active: isButtonActive, disabled: disabled || !focused, "data-testid": testId }));
|
|
96
|
+
};
|
|
97
|
+
export default CodeBlockButton;
|
|
98
|
+
//# sourceMappingURL=CodeBlockButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBlockButton.js","sourceRoot":"","sources":["../../../src/plugins/CodeBlockPlugin/CodeBlockButton.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
|
+
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
|
3
|
+
import { mergeRegister } from '@lexical/utils';
|
|
4
|
+
import { $createTextNode, TextNode } from 'lexical';
|
|
5
|
+
import { RTEPluginMeta, Toolbar } from '../api';
|
|
6
|
+
import CodeBlockButton from './CodeBlockButton';
|
|
7
|
+
import { $isCodeBlockNode, CodeBlockNode, $createCodeBlockTextNode, CodeBlockTextNode, } from './nodes';
|
|
8
|
+
const PLUGIN_NAME = 'code-block';
|
|
9
|
+
const textNodeTransform = (node) => {
|
|
10
|
+
// Since CodeNode has flat children structure we only need to check
|
|
11
|
+
// if node's parent is a code node and run highlighting if so
|
|
12
|
+
const parentNode = node.getParent();
|
|
13
|
+
if ($isCodeBlockNode(parentNode)) {
|
|
14
|
+
const text = node.getTextContent();
|
|
15
|
+
const codeTextNode = $createCodeBlockTextNode(text);
|
|
16
|
+
node.replace(codeTextNode);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
// when code block is converted to paragraph
|
|
20
|
+
const codeBlockTextNodeTransform = (node) => {
|
|
21
|
+
const parentNode = node.getParent();
|
|
22
|
+
if ($isCodeBlockNode(parentNode)) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
node.replace($createTextNode(node.__text));
|
|
26
|
+
};
|
|
27
|
+
const CodeBlockPlugin = ({ testIds = {} }) => {
|
|
28
|
+
const [editor] = useLexicalComposerContext();
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
return mergeRegister(editor.registerNodeTransform(TextNode, textNodeTransform), editor.registerNodeTransform(CodeBlockTextNode, codeBlockTextNodeTransform));
|
|
31
|
+
}, [editor]);
|
|
32
|
+
return (React.createElement(React.Fragment, null,
|
|
33
|
+
React.createElement(Toolbar, { keyName: PLUGIN_NAME },
|
|
34
|
+
React.createElement(CodeBlockButton, { "data-testid": testIds.button }))));
|
|
35
|
+
};
|
|
36
|
+
CodeBlockPlugin[RTEPluginMeta] = {
|
|
37
|
+
name: PLUGIN_NAME,
|
|
38
|
+
lexical: {
|
|
39
|
+
nodes: [CodeBlockNode, CodeBlockTextNode],
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
export default CodeBlockPlugin;
|
|
43
|
+
//# sourceMappingURL=CodeBlockPlugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBlockPlugin.js","sourceRoot":"","sources":["../../../src/plugins/CodeBlockPlugin/CodeBlockPlugin.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGnD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,SAAS,CAAA;AAEhB,MAAM,WAAW,GAAG,YAAY,CAAA;AAQhC,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAQ,EAAE;IACjD,mEAAmE;IACnE,6DAA6D;IAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;IAEnC,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QAElC,MAAM,YAAY,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAA;QAEnD,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;KAC3B;AACH,CAAC,CAAA;AAED,4CAA4C;AAC5C,MAAM,0BAA0B,GAAG,CAAC,IAAuB,EAAQ,EAAE;IACnE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;IAEnC,IAAI,gBAAgB,CAAC,UAAU,CAAC,EAAE;QAChC,OAAM;KACP;IAED,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,MAAM,eAAe,GAAqB,CAAC,EAAE,OAAO,GAAG,EAAE,EAAS,EAAE,EAAE;IACpE,MAAM,CAAC,MAAM,CAAC,GAAG,yBAAyB,EAAE,CAAA;IAE5C,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,aAAa,CAClB,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,EACzD,MAAM,CAAC,qBAAqB,CAC1B,iBAAiB,EACjB,0BAA0B,CAC3B,CACF,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IAEZ,OAAO,CACL;QACE,oBAAC,OAAO,IAAC,OAAO,EAAE,WAAW;YAC3B,oBAAC,eAAe,mBAAc,OAAO,CAAC,MAAM,GAAI,CACxC,CACT,CACJ,CAAA;AACH,CAAC,CAAA;AAED,eAAe,CAAC,aAAa,CAAC,GAAG;IAC/B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE;QACP,KAAK,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC;KAC1C;CACF,CAAA;AAED,eAAe,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default, Props } from './CodeBlockPlugin';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/plugins/CodeBlockPlugin/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { DOMConversionMap, DOMExportOutput, EditorConfig, NodeKey, ParagraphNode, RangeSelection, SerializedElementNode } from 'lexical';
|
|
2
|
+
import { ElementNode } from 'lexical';
|
|
3
|
+
import type { CodeBlockTextNode } from '../nodes';
|
|
4
|
+
export declare class CodeBlockNode extends ElementNode {
|
|
5
|
+
static getType(): string;
|
|
6
|
+
static clone(node: CodeBlockNode): CodeBlockNode;
|
|
7
|
+
constructor(key?: NodeKey);
|
|
8
|
+
createDOM(config: EditorConfig): HTMLElement;
|
|
9
|
+
updateDOM(): boolean;
|
|
10
|
+
exportDOM(): DOMExportOutput;
|
|
11
|
+
static importDOM(): DOMConversionMap | null;
|
|
12
|
+
static importJSON(serializedNode: SerializedElementNode): CodeBlockNode;
|
|
13
|
+
exportJSON(): SerializedElementNode;
|
|
14
|
+
canIndent(): boolean;
|
|
15
|
+
extractWithChild(): boolean;
|
|
16
|
+
insertNewAfter(selection: RangeSelection, restoreSelection?: boolean): null | ParagraphNode | CodeBlockTextNode;
|
|
17
|
+
collapseAtStart(): boolean;
|
|
18
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { $createLineBreakNode, $createParagraphNode, ElementNode, } from 'lexical';
|
|
2
|
+
import { $createCodeBlockNode, $createCodeBlockTextNode, $isCodeBlockTextNode, } from '../nodes';
|
|
3
|
+
import hasChildDOMNodeTag from '../../../LexicalEditor/utils/hasChildDOMNodeTag';
|
|
4
|
+
import { getFirstCodeNodeOfLine } from '../utils';
|
|
5
|
+
const convertPreElement = () => {
|
|
6
|
+
return { node: $createCodeBlockNode() };
|
|
7
|
+
};
|
|
8
|
+
const ELEMENT_TYPE = 'code-block';
|
|
9
|
+
export class CodeBlockNode extends ElementNode {
|
|
10
|
+
static getType() {
|
|
11
|
+
return ELEMENT_TYPE;
|
|
12
|
+
}
|
|
13
|
+
static clone(node) {
|
|
14
|
+
return new CodeBlockNode(node.__key);
|
|
15
|
+
}
|
|
16
|
+
constructor(key) {
|
|
17
|
+
super(key);
|
|
18
|
+
}
|
|
19
|
+
createDOM(config) {
|
|
20
|
+
const element = document.createElement('code');
|
|
21
|
+
const theme = config.theme;
|
|
22
|
+
const className = theme.codeBlock;
|
|
23
|
+
if (className !== undefined) {
|
|
24
|
+
element.className = className;
|
|
25
|
+
}
|
|
26
|
+
return element;
|
|
27
|
+
}
|
|
28
|
+
updateDOM() {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
exportDOM() {
|
|
32
|
+
const element = document.createElement('pre');
|
|
33
|
+
return { element };
|
|
34
|
+
}
|
|
35
|
+
static importDOM() {
|
|
36
|
+
return {
|
|
37
|
+
// Typically <pre> is used for code blocks, and <code> for inline code styles
|
|
38
|
+
// but if it's a multi line <code> we'll create a block. Pass through to
|
|
39
|
+
// inline format handled by TextNode otherwise.
|
|
40
|
+
code: (node) => {
|
|
41
|
+
const isMultiLine = node.textContent != null &&
|
|
42
|
+
(/\r?\n/.test(node.textContent) || hasChildDOMNodeTag(node, 'BR'));
|
|
43
|
+
return isMultiLine
|
|
44
|
+
? {
|
|
45
|
+
conversion: convertPreElement,
|
|
46
|
+
priority: 1,
|
|
47
|
+
}
|
|
48
|
+
: null;
|
|
49
|
+
},
|
|
50
|
+
pre: () => ({
|
|
51
|
+
conversion: convertPreElement,
|
|
52
|
+
priority: 0,
|
|
53
|
+
}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
static importJSON(serializedNode) {
|
|
57
|
+
const node = $createCodeBlockNode();
|
|
58
|
+
node.setFormat(serializedNode.format);
|
|
59
|
+
node.setIndent(serializedNode.indent);
|
|
60
|
+
node.setDirection(serializedNode.direction);
|
|
61
|
+
return node;
|
|
62
|
+
}
|
|
63
|
+
exportJSON() {
|
|
64
|
+
return Object.assign(Object.assign({}, super.exportJSON()), { type: ELEMENT_TYPE, version: 1 });
|
|
65
|
+
}
|
|
66
|
+
canIndent() {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
extractWithChild() {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
// eslint-disable-next-line max-statements, complexity
|
|
73
|
+
insertNewAfter(selection, restoreSelection = true) {
|
|
74
|
+
const children = this.getChildren();
|
|
75
|
+
const childrenLength = children.length;
|
|
76
|
+
if (childrenLength >= 2 &&
|
|
77
|
+
children[childrenLength - 1].getTextContent() === '\n' &&
|
|
78
|
+
children[childrenLength - 2].getTextContent() === '\n' &&
|
|
79
|
+
selection.isCollapsed() &&
|
|
80
|
+
selection.anchor.key === this.__key &&
|
|
81
|
+
selection.anchor.offset === childrenLength) {
|
|
82
|
+
children[childrenLength - 1].remove();
|
|
83
|
+
children[childrenLength - 2].remove();
|
|
84
|
+
const newElement = $createParagraphNode();
|
|
85
|
+
this.insertAfter(newElement, restoreSelection);
|
|
86
|
+
return newElement;
|
|
87
|
+
}
|
|
88
|
+
// If the selection is within the codeblock, find all leading tabs and
|
|
89
|
+
// spaces of the current line. Create a new line that has all those
|
|
90
|
+
// tabs and spaces, such that leading indentation is preserved.
|
|
91
|
+
const anchor = selection.anchor;
|
|
92
|
+
const focus = selection.focus;
|
|
93
|
+
const firstPoint = anchor.isBefore(focus) ? anchor : focus;
|
|
94
|
+
const firstSelectionNode = firstPoint.getNode();
|
|
95
|
+
if ($isCodeBlockTextNode(firstSelectionNode)) {
|
|
96
|
+
let node = getFirstCodeNodeOfLine(firstSelectionNode);
|
|
97
|
+
const insertNodes = [];
|
|
98
|
+
// eslint-disable-next-line no-constant-condition
|
|
99
|
+
while (true) {
|
|
100
|
+
if ($isCodeBlockTextNode(node)) {
|
|
101
|
+
const text = node.getTextContent();
|
|
102
|
+
const textSize = node.getTextContentSize();
|
|
103
|
+
// eslint-disable-next-line max-depth
|
|
104
|
+
for (let spaces = 0; spaces < textSize && text[spaces] === ' '; spaces++) {
|
|
105
|
+
// eslint-disable-next-line max-depth
|
|
106
|
+
if (spaces !== 0) {
|
|
107
|
+
insertNodes.push($createCodeBlockTextNode(' '.repeat(spaces)));
|
|
108
|
+
}
|
|
109
|
+
// eslint-disable-next-line max-depth
|
|
110
|
+
if (spaces !== textSize) {
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
node = node.getNextSibling();
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (insertNodes.length > 0) {
|
|
121
|
+
selection.insertNodes([$createLineBreakNode(), ...insertNodes]);
|
|
122
|
+
return insertNodes[insertNodes.length - 1];
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
collapseAtStart() {
|
|
128
|
+
const paragraph = $createParagraphNode();
|
|
129
|
+
const children = this.getChildren();
|
|
130
|
+
children.forEach(child => paragraph.append(child));
|
|
131
|
+
this.replace(paragraph);
|
|
132
|
+
return true;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=CodeBlockNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBlockNode.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/nodes/CodeBlockNode.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { SerializedTextNode, EditorConfig, NodeKey } from 'lexical';
|
|
2
|
+
import { TextNode } from 'lexical';
|
|
3
|
+
import type { CodeBlockNode } from '../nodes';
|
|
4
|
+
export declare class CodeBlockTextNode extends TextNode {
|
|
5
|
+
constructor(text: string, key?: NodeKey);
|
|
6
|
+
static getType(): string;
|
|
7
|
+
static clone(node: CodeBlockTextNode): CodeBlockTextNode;
|
|
8
|
+
static importJSON(serializedNode: SerializedTextNode): CodeBlockTextNode;
|
|
9
|
+
createDOM(config: EditorConfig): HTMLElement;
|
|
10
|
+
exportJSON(): SerializedTextNode;
|
|
11
|
+
setFormat(): this;
|
|
12
|
+
isParentRequired(): boolean;
|
|
13
|
+
createParentElementNode(): CodeBlockNode;
|
|
14
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { TextNode } from 'lexical';
|
|
2
|
+
import { $createCodeBlockNode, $createCodeBlockTextNode } from '../nodes';
|
|
3
|
+
const ELEMENT_TYPE = 'code-block-text';
|
|
4
|
+
export class CodeBlockTextNode extends TextNode {
|
|
5
|
+
constructor(text, key) {
|
|
6
|
+
super(text, key);
|
|
7
|
+
}
|
|
8
|
+
static getType() {
|
|
9
|
+
return ELEMENT_TYPE;
|
|
10
|
+
}
|
|
11
|
+
static clone(node) {
|
|
12
|
+
return new CodeBlockTextNode(node.__text, node.__key);
|
|
13
|
+
}
|
|
14
|
+
static importJSON(serializedNode) {
|
|
15
|
+
console.log('importJSON');
|
|
16
|
+
const { text } = serializedNode;
|
|
17
|
+
const node = $createCodeBlockTextNode(text);
|
|
18
|
+
return node;
|
|
19
|
+
}
|
|
20
|
+
createDOM(config) {
|
|
21
|
+
const element = super.createDOM(config);
|
|
22
|
+
const theme = config.theme;
|
|
23
|
+
const className = theme.codeBlockText;
|
|
24
|
+
if (className !== undefined) {
|
|
25
|
+
element.className = className;
|
|
26
|
+
}
|
|
27
|
+
return element;
|
|
28
|
+
}
|
|
29
|
+
exportJSON() {
|
|
30
|
+
return Object.assign(Object.assign({}, super.exportJSON()), { type: ELEMENT_TYPE, version: 1 });
|
|
31
|
+
}
|
|
32
|
+
// prevent formatting
|
|
33
|
+
setFormat() {
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
isParentRequired() {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
createParentElementNode() {
|
|
40
|
+
return $createCodeBlockNode();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=CodeBlockTextNode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodeBlockTextNode.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/nodes/CodeBlockTextNode.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAElC,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAGzE,MAAM,YAAY,GAAG,iBAAiB,CAAA;AAEtC,MAAM,OAAO,iBAAkB,SAAQ,QAAQ;IAC7C,YAAY,IAAY,EAAE,GAAa;QACrC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAClB,CAAC;IAED,MAAM,CAAC,OAAO;QACZ,OAAO,YAAY,CAAA;IACrB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAuB;QAClC,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IACvD,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,cAAkC;QAClD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;QACzB,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,CAAA;QAE/B,MAAM,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAA;QAE3C,OAAO,IAAI,CAAA;IACb,CAAC;IAED,SAAS,CAAC,MAAoB;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAEvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAA;QAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,CAAA;QAErC,IAAI,SAAS,KAAK,SAAS,EAAE;YAC3B,OAAO,CAAC,SAAS,GAAG,SAAS,CAAA;SAC9B;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,UAAU;QACR,uCACK,KAAK,CAAC,UAAU,EAAE,KACrB,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,CAAC,IACX;IACH,CAAC;IAED,qBAAqB;IACrB,SAAS;QACP,OAAO,IAAI,CAAA;IACb,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAA;IACb,CAAC;IAED,uBAAuB;QACrB,OAAO,oBAAoB,EAAE,CAAA;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LexicalNode } from 'lexical';
|
|
2
|
+
import { CodeBlockNode } from './CodeBlockNode';
|
|
3
|
+
import { CodeBlockTextNode } from './CodeBlockTextNode';
|
|
4
|
+
export declare const $createCodeBlockNode: () => CodeBlockNode;
|
|
5
|
+
export declare const $isCodeBlockNode: (node: LexicalNode | null | undefined) => node is CodeBlockNode;
|
|
6
|
+
export declare const $isCodeBlockTextNode: (node: LexicalNode | CodeBlockTextNode | null | undefined) => node is CodeBlockTextNode;
|
|
7
|
+
export declare const $createCodeBlockTextNode: (text: string) => CodeBlockTextNode;
|
|
8
|
+
export { CodeBlockNode, CodeBlockTextNode };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { $applyNodeReplacement } from 'lexical';
|
|
2
|
+
import { CodeBlockNode } from './CodeBlockNode';
|
|
3
|
+
import { CodeBlockTextNode } from './CodeBlockTextNode';
|
|
4
|
+
export const $createCodeBlockNode = () => $applyNodeReplacement(new CodeBlockNode());
|
|
5
|
+
export const $isCodeBlockNode = (node) => {
|
|
6
|
+
return node instanceof CodeBlockNode;
|
|
7
|
+
};
|
|
8
|
+
export const $isCodeBlockTextNode = (node) => {
|
|
9
|
+
return node instanceof CodeBlockTextNode;
|
|
10
|
+
};
|
|
11
|
+
export const $createCodeBlockTextNode = (text) => {
|
|
12
|
+
return $applyNodeReplacement(new CodeBlockTextNode(text));
|
|
13
|
+
};
|
|
14
|
+
export { CodeBlockNode, CodeBlockTextNode };
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/nodes/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAkB,EAAE,CACtD,qBAAqB,CAAC,IAAI,aAAa,EAAE,CAAC,CAAA;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAoC,EACb,EAAE;IACzB,OAAO,IAAI,YAAY,aAAa,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,IAAwD,EAC7B,EAAE;IAC7B,OAAO,IAAI,YAAY,iBAAiB,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAY,EAAqB,EAAE;IAC1E,OAAO,qBAAqB,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAA;AAC3D,CAAC,CAAA;AAED,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { $isCodeBlockTextNode } from '../nodes';
|
|
2
|
+
const getFirstCodeNodeOfLine = (anchor) => {
|
|
3
|
+
let previousNode = anchor;
|
|
4
|
+
let node = anchor;
|
|
5
|
+
while ($isCodeBlockTextNode(node)) {
|
|
6
|
+
previousNode = node;
|
|
7
|
+
node = node.getPreviousSibling();
|
|
8
|
+
}
|
|
9
|
+
return previousNode;
|
|
10
|
+
};
|
|
11
|
+
export default getFirstCodeNodeOfLine;
|
|
12
|
+
//# sourceMappingURL=getFirstCodeNodeOfLine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFirstCodeNodeOfLine.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAE/C,MAAM,sBAAsB,GAAG,CAC7B,MAAyC,EACC,EAAE;IAC5C,IAAI,YAAY,GAAG,MAAM,CAAA;IACzB,IAAI,IAAI,GAAuB,MAAM,CAAA;IAErC,OAAO,oBAAoB,CAAC,IAAI,CAAC,EAAE;QACjC,YAAY,GAAG,IAAI,CAAA;QACnB,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAA;KACjC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC,CAAA;AAED,eAAe,sBAAsB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { $isCodeBlockTextNode } from '../nodes';
|
|
2
|
+
import getFirstCodeNodeOfLine from './getFirstCodeNodeOfLine';
|
|
3
|
+
jest.mock('../nodes', () => ({
|
|
4
|
+
__esModule: true,
|
|
5
|
+
$isCodeBlockTextNode: jest.fn(),
|
|
6
|
+
}));
|
|
7
|
+
// Mocking the function and methods
|
|
8
|
+
const getPreviousSibling = jest.fn();
|
|
9
|
+
const $isCodeBlockTextNodeMock = $isCodeBlockTextNode;
|
|
10
|
+
describe('getFirstCodeNodeOfLine', () => {
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
jest.resetAllMocks();
|
|
13
|
+
});
|
|
14
|
+
describe('when the provided node is a CodeBlockTextNode', () => {
|
|
15
|
+
it('returns the first CodeBlockTextNode', () => {
|
|
16
|
+
const codeBlockTextNode = {
|
|
17
|
+
getPreviousSibling,
|
|
18
|
+
};
|
|
19
|
+
$isCodeBlockTextNodeMock
|
|
20
|
+
.mockReturnValueOnce(true)
|
|
21
|
+
.mockReturnValueOnce(false);
|
|
22
|
+
getPreviousSibling.mockReturnValueOnce(null);
|
|
23
|
+
const result = getFirstCodeNodeOfLine(codeBlockTextNode);
|
|
24
|
+
expect(result).toBe(codeBlockTextNode);
|
|
25
|
+
expect($isCodeBlockTextNode).toHaveBeenCalledWith(codeBlockTextNode);
|
|
26
|
+
expect(getPreviousSibling).toHaveBeenCalledTimes(1);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe('when the provided node is a LineBreakNode', () => {
|
|
30
|
+
it('returns the provided node as it is', () => {
|
|
31
|
+
const lineBreakNode = {
|
|
32
|
+
getPreviousSibling,
|
|
33
|
+
};
|
|
34
|
+
$isCodeBlockTextNodeMock.mockReturnValue(false);
|
|
35
|
+
const result = getFirstCodeNodeOfLine(lineBreakNode);
|
|
36
|
+
expect(result).toBe(lineBreakNode);
|
|
37
|
+
expect($isCodeBlockTextNodeMock).toHaveBeenCalledWith(lineBreakNode);
|
|
38
|
+
expect(getPreviousSibling).toHaveBeenCalledTimes(0);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe('when the provided node is a CodeBlockTextNode with a non-CodeBlockTextNode in the sibling chain', () => {
|
|
42
|
+
it('returns the first CodeBlockTextNode until the non-CodeBlockTextNode', () => {
|
|
43
|
+
const firstCodeBlockTextNode = {
|
|
44
|
+
getPreviousSibling,
|
|
45
|
+
};
|
|
46
|
+
const secondCodeBlockTextNode = { getPreviousSibling };
|
|
47
|
+
const nonCodeBlockTextNode = { getPreviousSibling };
|
|
48
|
+
const thirdCodeBlockTextNode = { getPreviousSibling };
|
|
49
|
+
$isCodeBlockTextNodeMock
|
|
50
|
+
.mockReturnValueOnce(true)
|
|
51
|
+
.mockReturnValueOnce(true)
|
|
52
|
+
.mockReturnValueOnce(false)
|
|
53
|
+
.mockReturnValueOnce(true);
|
|
54
|
+
getPreviousSibling
|
|
55
|
+
.mockReturnValueOnce(secondCodeBlockTextNode)
|
|
56
|
+
.mockReturnValueOnce(nonCodeBlockTextNode)
|
|
57
|
+
.mockReturnValueOnce(thirdCodeBlockTextNode)
|
|
58
|
+
.mockReturnValueOnce(null);
|
|
59
|
+
const result = getFirstCodeNodeOfLine(firstCodeBlockTextNode);
|
|
60
|
+
expect(result).toBe(secondCodeBlockTextNode);
|
|
61
|
+
expect($isCodeBlockTextNode).toHaveBeenCalledTimes(3);
|
|
62
|
+
expect(getPreviousSibling).toHaveBeenCalledTimes(2);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
//# sourceMappingURL=getFirstCodeNodeOfLine.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getFirstCodeNodeOfLine.test.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/utils/getFirstCodeNodeOfLine.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as getFirstCodeNodeOfLine } from './getFirstCodeNodeOfLine';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/plugins/CodeBlockPlugin/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAA"}
|
|
@@ -7,7 +7,7 @@ import RichTextEditorButton from '../../RichTextEditorButton';
|
|
|
7
7
|
const CodeButton = ({ 'data-testid': testId }) => {
|
|
8
8
|
const [active, setActive] = useState(false);
|
|
9
9
|
const [editor] = useLexicalComposerContext();
|
|
10
|
-
const { disabled, focused } = useRTEPluginContext();
|
|
10
|
+
const { disabled, focused, disabledFormatting } = useRTEPluginContext();
|
|
11
11
|
useRTEUpdate(() => {
|
|
12
12
|
const selection = $getSelection();
|
|
13
13
|
if ($isRangeSelection(selection)) {
|
|
@@ -17,7 +17,8 @@ const CodeButton = ({ 'data-testid': testId }) => {
|
|
|
17
17
|
const handleCodeClick = () => {
|
|
18
18
|
editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'code');
|
|
19
19
|
};
|
|
20
|
-
|
|
20
|
+
const isDisabled = disabled || !focused || disabledFormatting;
|
|
21
|
+
return (React.createElement(RichTextEditorButton, { icon: React.createElement(Code16, null), onClick: handleCodeClick, active: isDisabled ? false : active, disabled: isDisabled, "data-testid": testId }));
|
|
21
22
|
};
|
|
22
23
|
export default CodeButton;
|
|
23
24
|
//# sourceMappingURL=CodeButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodeButton.js","sourceRoot":"","sources":["../../../src/plugins/CodePlugin/CodeButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC/E,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAC1D,OAAO,oBAAoB,MAAM,4BAA4B,CAAA;AAM7D,MAAM,UAAU,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAS,EAAE,EAAE;IACtD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,yBAAyB,EAAE,CAAA;IAC5C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"CodeButton.js","sourceRoot":"","sources":["../../../src/plugins/CodePlugin/CodeButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAC/E,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAC1D,OAAO,oBAAoB,MAAM,4BAA4B,CAAA;AAM7D,MAAM,UAAU,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAS,EAAE,EAAE;IACtD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,yBAAyB,EAAE,CAAA;IAC5C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,mBAAmB,EAAE,CAAA;IAEvE,YAAY,CAAC,GAAG,EAAE;QAChB,MAAM,SAAS,GAAG,aAAa,EAAE,CAAA;QAEjC,IAAI,iBAAiB,CAAC,SAAS,CAAC,EAAE;YAChC,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;SACvC;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,MAAM,CAAC,eAAe,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAA;IACrD,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,QAAQ,IAAI,CAAC,OAAO,IAAI,kBAAkB,CAAA;IAE7D,OAAO,CACL,oBAAC,oBAAoB,IACnB,IAAI,EAAE,oBAAC,MAAM,OAAG,EAChB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EACnC,QAAQ,EAAE,UAAU,iBACP,MAAM,GACnB,CACH,CAAA;AACH,CAAC,CAAA;AAED,eAAe,UAAU,CAAA"}
|
|
@@ -3,8 +3,8 @@ import React from 'react';
|
|
|
3
3
|
import { useRTEPluginContext } from '../../../api';
|
|
4
4
|
import RichTextEditorButton from '../../../../RichTextEditorButton';
|
|
5
5
|
const ImagePluginButton = ({ 'data-testid': testId, onClick }) => {
|
|
6
|
-
const { disabled, focused } = useRTEPluginContext();
|
|
7
|
-
return (React.createElement(RichTextEditorButton, { icon: React.createElement(Image16, null), onClick: onClick, disabled: disabled || !focused, "data-testid": testId }));
|
|
6
|
+
const { disabled, focused, disabledFormatting } = useRTEPluginContext();
|
|
7
|
+
return (React.createElement(RichTextEditorButton, { icon: React.createElement(Image16, null), onClick: onClick, disabled: disabled || !focused || disabledFormatting, "data-testid": testId }));
|
|
8
8
|
};
|
|
9
9
|
export default ImagePluginButton;
|
|
10
10
|
//# sourceMappingURL=ImagePluginButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImagePluginButton.js","sourceRoot":"","sources":["../../../../../src/plugins/ImagePlugin/components/ImagePluginButton/ImagePluginButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,oBAAoB,MAAM,kCAAkC,CAAA;AAOnE,MAAM,iBAAiB,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAS,EAAE,EAAE;IACtE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"ImagePluginButton.js","sourceRoot":"","sources":["../../../../../src/plugins/ImagePlugin/components/ImagePluginButton/ImagePluginButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,oBAAoB,MAAM,kCAAkC,CAAA;AAOnE,MAAM,iBAAiB,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAS,EAAE,EAAE;IACtE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,mBAAmB,EAAE,CAAA;IAEvE,OAAO,CACL,oBAAC,oBAAoB,IACnB,IAAI,EAAE,oBAAC,OAAO,OAAG,EACjB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,IAAI,CAAC,OAAO,IAAI,kBAAkB,iBACvC,MAAM,GACnB,CACH,CAAA;AACH,CAAC,CAAA;AAED,eAAe,iBAAiB,CAAA"}
|
|
@@ -10,7 +10,7 @@ import { sanitizeUrl, validateUrl } from './utils/url';
|
|
|
10
10
|
const LinkPluginButton = ({ 'data-testid': testId }) => {
|
|
11
11
|
const [active, setActive] = useState(false);
|
|
12
12
|
const [editor] = useLexicalComposerContext();
|
|
13
|
-
const { disabled, focused } = useRTEPluginContext();
|
|
13
|
+
const { disabled, focused, disabledFormatting } = useRTEPluginContext();
|
|
14
14
|
useRTEUpdate(() => {
|
|
15
15
|
const selection = $getSelection();
|
|
16
16
|
if ($isRangeSelection(selection)) {
|
|
@@ -58,7 +58,8 @@ const LinkPluginButton = ({ 'data-testid': testId }) => {
|
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
60
|
}, [editor, active]);
|
|
61
|
-
|
|
61
|
+
const isDisabled = disabled || !focused || disabledFormatting;
|
|
62
|
+
return (React.createElement(RichTextEditorButton, { icon: React.createElement(Link16, null), onClick: onLinkClick, active: isDisabled ? false : active, disabled: isDisabled, "data-testid": testId }));
|
|
62
63
|
};
|
|
63
64
|
export default LinkPluginButton;
|
|
64
65
|
//# sourceMappingURL=LinkPluginButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LinkPluginButton.js","sourceRoot":"","sources":["../../../src/plugins/LinkPlugin/LinkPluginButton.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,eAAe,GAChB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAA;AACjF,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC3E,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAC1D,OAAO,oBAAoB,MAAM,4BAA4B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAMtD,MAAM,gBAAgB,GAAG,CAAC,EAAE,aAAa,EAAE,MAAM,EAAS,EAAE,EAAE;IAC5D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,CAAC,MAAM,CAAC,GAAG,yBAAyB,EAAE,CAAA;IAC5C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,mBAAmB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"LinkPluginButton.js","sourceRoot":"","sources":["../../../src/plugins/LinkPlugin/LinkPluginButton.tsx"],"names":[],"mappings":"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"}
|