@pega/cosmos-react-rte 2.0.0-dev.12.1 → 2.0.0-dev.14.2
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/lib/components/RichTextEditor/DecoratorComponents/CodeBlock.js +1 -1
- package/lib/components/RichTextEditor/DecoratorComponents/CodeBlock.js.map +1 -1
- package/lib/components/RichTextEditor/DecoratorComponents/Table.d.ts +2 -0
- package/lib/components/RichTextEditor/DecoratorComponents/Table.d.ts.map +1 -1
- package/lib/components/RichTextEditor/DecoratorComponents/Table.js +4 -3
- package/lib/components/RichTextEditor/DecoratorComponents/Table.js.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.context.d.ts +2 -2
- package/lib/components/RichTextEditor/RichTextEditor.context.d.ts.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.context.js.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.d.ts.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.js +27 -17
- package/lib/components/RichTextEditor/RichTextEditor.js.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.styles.d.ts +2 -0
- package/lib/components/RichTextEditor/RichTextEditor.styles.d.ts.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.styles.js +103 -43
- package/lib/components/RichTextEditor/RichTextEditor.styles.js.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.types.d.ts +2 -0
- package/lib/components/RichTextEditor/RichTextEditor.types.d.ts.map +1 -1
- package/lib/components/RichTextEditor/RichTextEditor.types.js.map +1 -1
- package/lib/components/RichTextEditor/RichTextViewer.d.ts.map +1 -1
- package/lib/components/RichTextEditor/RichTextViewer.js +7 -16
- package/lib/components/RichTextEditor/RichTextViewer.js.map +1 -1
- package/lib/components/RichTextEditor/Toolbar/TextSelect.d.ts.map +1 -1
- package/lib/components/RichTextEditor/Toolbar/TextSelect.js +13 -10
- package/lib/components/RichTextEditor/Toolbar/TextSelect.js.map +1 -1
- package/lib/components/RichTextEditor/Toolbar/Toolbar.d.ts.map +1 -1
- package/lib/components/RichTextEditor/Toolbar/Toolbar.js +2 -0
- package/lib/components/RichTextEditor/Toolbar/Toolbar.js.map +1 -1
- package/lib/components/RichTextEditor/utils/ListCommands.js +2 -2
- package/lib/components/RichTextEditor/utils/ListCommands.js.map +1 -1
- package/lib/components/RichTextEditor/utils/htmlConverter.d.ts.map +1 -1
- package/lib/components/RichTextEditor/utils/htmlConverter.js +43 -19
- package/lib/components/RichTextEditor/utils/htmlConverter.js.map +1 -1
- package/lib/components/RichTextEditor/utils/markdownConverter.d.ts.map +1 -1
- package/lib/components/RichTextEditor/utils/markdownConverter.js +7 -1
- package/lib/components/RichTextEditor/utils/markdownConverter.js.map +1 -1
- package/package.json +13 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichTextViewer.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiD,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"RichTextViewer.d.ts","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiD,MAAM,OAAO,CAAC;AAK1E,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAIvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D,QAAA,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,GAAG,YAAY,CAmC1D,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -2,15 +2,12 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { forwardRef, useMemo, useState, useEffect } from 'react';
|
|
3
3
|
import { Slate, Editable, withReact } from 'slate-react';
|
|
4
4
|
import { createEditor } from 'slate';
|
|
5
|
-
import
|
|
5
|
+
import dompurify from 'dompurify';
|
|
6
6
|
import convertMarkdown from './utils/markdownConverter';
|
|
7
7
|
import { nodeRenderer, leafRenderer } from './utils/renderers';
|
|
8
|
-
import { EditorContainer, StyledRichTextViewer } from './RichTextEditor.styles';
|
|
9
|
-
import { convertHtml } from './utils/htmlConverter';
|
|
8
|
+
import { EditorContainer, StyledHtml, StyledRichTextViewer } from './RichTextEditor.styles';
|
|
10
9
|
const RichTextViewer = forwardRef(({ content, type, interactionRenderers, markdownMap, ...restProps }, ref) => {
|
|
11
|
-
const t = useI18n();
|
|
12
10
|
const editor = useMemo(() => withReact(createEditor()), []);
|
|
13
|
-
const [error, setError] = useState(false);
|
|
14
11
|
const [nodes, setNodes] = useState([]);
|
|
15
12
|
useEffect(() => {
|
|
16
13
|
if (type === 'markdown') {
|
|
@@ -19,18 +16,12 @@ const RichTextViewer = forwardRef(({ content, type, interactionRenderers, markdo
|
|
|
19
16
|
if (type === 'richtext') {
|
|
20
17
|
setNodes(JSON.parse(content));
|
|
21
18
|
}
|
|
22
|
-
if (type === 'html') {
|
|
23
|
-
try {
|
|
24
|
-
const convertedHtmlNodes = convertHtml(content, interactionRenderers);
|
|
25
|
-
setNodes(convertedHtmlNodes);
|
|
26
|
-
setError(false);
|
|
27
|
-
}
|
|
28
|
-
catch (e) {
|
|
29
|
-
setError(true);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
19
|
}, [content]);
|
|
33
|
-
|
|
20
|
+
const sanitizedHtml = useMemo(() => (type === 'html' ? dompurify.sanitize(content) : ''), [content, type]);
|
|
21
|
+
if (type === 'html') {
|
|
22
|
+
return _jsx(StyledHtml, { dangerouslySetInnerHTML: { __html: sanitizedHtml } }, void 0);
|
|
23
|
+
}
|
|
24
|
+
return (_jsx(StyledRichTextViewer, Object.assign({ ref: ref }, restProps, { children: _jsx(Slate, Object.assign({ editor: editor, value: nodes, onChange: () => { } }, { children: _jsx(EditorContainer, { children: _jsx(Editable, { readOnly: true, renderElement: nodeRenderer, renderLeaf: leafRenderer }, void 0) }, void 0) }), void 0) }), void 0));
|
|
34
25
|
});
|
|
35
26
|
export default RichTextViewer;
|
|
36
27
|
//# sourceMappingURL=RichTextViewer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RichTextViewer.js","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAW,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"RichTextViewer.js","sourceRoot":"","sources":["../../../src/components/RichTextEditor/RichTextViewer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAW,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAiB,YAAY,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,SAAS,MAAM,WAAW,CAAC;AAIlC,OAAO,eAAe,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE5F,MAAM,cAAc,GAA2C,UAAU,CACvE,CACE,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,GAAG,SAAS,EAAuB,EACvF,GAAwB,EACxB,EAAE;IACF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAqB,EAAE,CAAC,CAAC;IAE3D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,KAAK,UAAU,EAAE;YACvB,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC;SACvE;QACD,IAAI,IAAI,KAAK,UAAU,EAAE;YACvB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;SAC/B;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAC1D,CAAC,OAAO,EAAE,IAAI,CAAC,CAChB,CAAC;IAEF,IAAI,IAAI,KAAK,MAAM,EAAE;QACnB,OAAO,KAAC,UAAU,IAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,WAAI,CAAC;KAC3E;IACD,OAAO,CACL,KAAC,oBAAoB,kBAAC,GAAG,EAAE,GAAG,IAAM,SAAS,cAC3C,KAAC,KAAK,kBAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,gBACrD,KAAC,eAAe,cACd,KAAC,QAAQ,IAAC,QAAQ,QAAC,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,WAAI,WAC5D,YACZ,YACa,CACxB,CAAC;AACJ,CAAC,CACF,CAAC;AAEF,eAAe,cAAc,CAAC","sourcesContent":["import { FC, Ref, forwardRef, useMemo, useState, useEffect } from 'react';\nimport { Slate, Editable, withReact } from 'slate-react';\nimport { Element, Text, createEditor } from 'slate';\nimport dompurify from 'dompurify';\n\nimport { ForwardProps } from '@pega/cosmos-react-core';\n\nimport convertMarkdown from './utils/markdownConverter';\nimport { nodeRenderer, leafRenderer } from './utils/renderers';\nimport { RichTextViewerProps } from './RichTextViewer.types';\nimport { EditorContainer, StyledHtml, StyledRichTextViewer } from './RichTextEditor.styles';\n\nconst RichTextViewer: FC<RichTextViewerProps & ForwardProps> = forwardRef(\n (\n { content, type, interactionRenderers, markdownMap, ...restProps }: RichTextViewerProps,\n ref: Ref<HTMLDivElement>\n ) => {\n const editor = useMemo(() => withReact(createEditor()), []);\n const [nodes, setNodes] = useState<(Element | Text)[]>([]);\n\n useEffect(() => {\n if (type === 'markdown') {\n setNodes(convertMarkdown(content, interactionRenderers, markdownMap));\n }\n if (type === 'richtext') {\n setNodes(JSON.parse(content));\n }\n }, [content]);\n\n const sanitizedHtml = useMemo(\n () => (type === 'html' ? dompurify.sanitize(content) : ''),\n [content, type]\n );\n\n if (type === 'html') {\n return <StyledHtml dangerouslySetInnerHTML={{ __html: sanitizedHtml }} />;\n }\n return (\n <StyledRichTextViewer ref={ref} {...restProps}>\n <Slate editor={editor} value={nodes} onChange={() => {}}>\n <EditorContainer>\n <Editable readOnly renderElement={nodeRenderer} renderLeaf={leafRenderer} />\n </EditorContainer>\n </Slate>\n </StyledRichTextViewer>\n );\n }\n);\n\nexport default RichTextViewer;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextSelect.d.ts","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/Toolbar/TextSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAA4D,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"TextSelect.d.ts","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/Toolbar/TextSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAA4D,MAAM,OAAO,CAAC;AA0ErF,QAAA,MAAM,UAAU,EAAE,EAAE,CAAC;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,CA2FpC,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -2,11 +2,12 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import { useRef, useState, useCallback } from 'react';
|
|
3
3
|
import { ReactEditor, useSlate } from 'slate-react';
|
|
4
4
|
import styled, { css } from 'styled-components';
|
|
5
|
-
import { Popover, Icon,
|
|
5
|
+
import { Popover, Icon, useOuterEvent, Menu, Button, defaultThemeProp, useI18n, Tooltip, calculateFontSize } from '@pega/cosmos-react-core';
|
|
6
6
|
import EditorCommands from '../utils/EditorCommands';
|
|
7
7
|
import { useRTEContext } from '../RichTextEditor.context';
|
|
8
8
|
import { getKeyCommand } from './utils';
|
|
9
9
|
const StyledTextSelect = styled(Button)(({ theme }) => {
|
|
10
|
+
const fontSizes = calculateFontSize(theme.base['font-size'], theme.base['font-scale']);
|
|
10
11
|
return css `
|
|
11
12
|
color: ${theme.base.palette['foreground-color']};
|
|
12
13
|
display: inline-flex;
|
|
@@ -14,14 +15,10 @@ const StyledTextSelect = styled(Button)(({ theme }) => {
|
|
|
14
15
|
border-radius: calc(0.25 * ${theme.base['border-radius']});
|
|
15
16
|
height: calc(4 * ${theme.base.spacing});
|
|
16
17
|
padding: calc(0.5 * ${theme.base.spacing});
|
|
18
|
+
font-size: ${fontSizes.xxs};
|
|
17
19
|
|
|
18
20
|
span {
|
|
19
|
-
|
|
20
|
-
top: -0.0625rem;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
${StyledIcon} {
|
|
24
|
-
margin-inline-start: calc(0.5 * ${theme.base.spacing});
|
|
21
|
+
white-space: nowrap;
|
|
25
22
|
}
|
|
26
23
|
|
|
27
24
|
:focus {
|
|
@@ -57,6 +54,7 @@ const TextSelect = ({ osx }) => {
|
|
|
57
54
|
const t = useI18n();
|
|
58
55
|
const { disabled } = useRTEContext();
|
|
59
56
|
const [open, setOpen] = useState(false);
|
|
57
|
+
const [selecting, setSelecting] = useState(false);
|
|
60
58
|
const buttonRef = useRef(null);
|
|
61
59
|
const popoverRef = useRef(null);
|
|
62
60
|
const menuRef = useRef(null);
|
|
@@ -73,27 +71,32 @@ const TextSelect = ({ osx }) => {
|
|
|
73
71
|
ReactEditor.focus(editor);
|
|
74
72
|
}
|
|
75
73
|
setOpen(false);
|
|
74
|
+
setSelecting(true);
|
|
76
75
|
};
|
|
77
76
|
return (_jsxs(_Fragment, { children: [_jsxs(StyledTextSelect, Object.assign({ variant: 'simple', type: 'button', disabled: disabled, icon: false, ref: buttonRef, onMouseDown: (e) => {
|
|
78
77
|
e.preventDefault();
|
|
79
78
|
e.stopPropagation();
|
|
80
79
|
setOpen(true);
|
|
81
80
|
}, onKeyDown: (e) => {
|
|
82
|
-
if (e.key === 'Enter') {
|
|
81
|
+
if (e.key === 'Enter' && !selecting) {
|
|
83
82
|
e.preventDefault();
|
|
84
83
|
setOpen(true);
|
|
85
84
|
}
|
|
85
|
+
else if (e.key === 'Enter') {
|
|
86
|
+
e.preventDefault();
|
|
87
|
+
setSelecting(false);
|
|
88
|
+
}
|
|
86
89
|
else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
|
|
87
90
|
setOpen(false);
|
|
88
91
|
}
|
|
89
|
-
}, onClick: (e) => e.stopPropagation(), "aria-expanded": open, "aria-label": `Text formatting toolbar. ${t('rte_heading_style')}. ${textMapping[EditorCommands.getActiveBlockType(editor)]} selected`, "aria-haspopup": true }, { children: [_jsx("span", { children: textMapping[EditorCommands.getActiveBlockType(editor)] }, void 0), _jsx(Icon, { name: '
|
|
92
|
+
}, onClick: (e) => e.stopPropagation(), "aria-expanded": open, "aria-label": `Text formatting toolbar. ${t('rte_heading_style')}. ${textMapping[EditorCommands.getActiveBlockType(editor)]} selected`, "aria-haspopup": true }, { children: [_jsx("span", { children: textMapping[EditorCommands.getActiveBlockType(editor)] }, void 0), _jsx(Icon, { name: 'arrow-micro-down' }, void 0)] }), void 0), buttonRef.current && (_jsx(Tooltip, Object.assign({ target: buttonRef.current, showDelay: 'none', hideDelay: 'none' }, { children: t('rte_heading_style') }), void 0)), _jsx(Popover, Object.assign({ show: open, as: StyledSelectMenu, target: buttonRef.current, placement: 'bottom-start', ref: popoverRef, onMouseDown: (e) => {
|
|
90
93
|
e.preventDefault();
|
|
91
94
|
} }, { children: _jsx(Menu, { items: textFormats.map(({ text, type, subText }) => ({
|
|
92
95
|
id: type,
|
|
93
96
|
primary: text,
|
|
94
97
|
secondary: [subText],
|
|
95
98
|
selected: type === EditorCommands.getActiveBlockType(editor)
|
|
96
|
-
})), mode: 'single-select', ref: menuRef, onItemClick: onTextSelect }, void 0) }), void 0)] }, void 0));
|
|
99
|
+
})), focusControlEl: buttonRef.current || undefined, mode: 'single-select', ref: menuRef, onItemClick: onTextSelect }, void 0) }), void 0)] }, void 0));
|
|
97
100
|
};
|
|
98
101
|
export default TextSelect;
|
|
99
102
|
//# sourceMappingURL=TextSelect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextSelect.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/Toolbar/TextSelect.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAM,MAAM,EAAE,QAAQ,EAAc,WAAW,EAAiB,MAAM,OAAO,CAAC;AAErF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACL,OAAO,EACP,IAAI,EACJ,
|
|
1
|
+
{"version":3,"file":"TextSelect.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/Toolbar/TextSelect.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FC, useRef, useState, MouseEvent, useCallback, KeyboardEvent } from 'react';\nimport { Element } from 'slate';\nimport { ReactEditor, useSlate } from 'slate-react';\nimport styled, { css } from 'styled-components';\n\nimport {\n Popover,\n Icon,\n useOuterEvent,\n Menu,\n Button,\n defaultThemeProp,\n useI18n,\n Tooltip,\n calculateFontSize\n} from '@pega/cosmos-react-core';\n\nimport EditorCommands from '../utils/EditorCommands';\nimport { useRTEContext } from '../RichTextEditor.context';\n\nimport { getKeyCommand } from './utils';\n\nconst StyledTextSelect = styled(Button)(({ theme }) => {\n const fontSizes = calculateFontSize(theme.base['font-size'], theme.base['font-scale']);\n return css`\n color: ${theme.base.palette['foreground-color']};\n display: inline-flex;\n align-items: center;\n border-radius: calc(0.25 * ${theme.base['border-radius']});\n height: calc(4 * ${theme.base.spacing});\n padding: calc(0.5 * ${theme.base.spacing});\n font-size: ${fontSizes.xxs};\n\n span {\n white-space: nowrap;\n }\n\n :focus {\n box-shadow: ${theme.base.shadow.focus};\n }\n `;\n});\n\nStyledTextSelect.defaultProps = defaultThemeProp;\n\nconst StyledSelectMenu = styled.div`\n min-width: 10rem;\n`;\n\nconst textMapping: { [key: string]: string } = {\n paragraph: 'Normal',\n 'heading-1': 'Heading 1',\n 'heading-2': 'Heading 2',\n 'heading-3': 'Heading 3',\n 'heading-4': 'Heading 4',\n '': 'Normal'\n};\n\nconst getTextCommand = (num: number, osx: boolean) => {\n return getKeyCommand(osx, ({ ctrl, alt }) => `${ctrl}${alt}${num}`);\n};\n\nconst getTextFormats = (\n osx: boolean\n): { text: string; subText: string; type: Element['type'] }[] => {\n return [\n { text: 'Normal', subText: getTextCommand(0, osx), type: 'paragraph' },\n { text: 'Heading 1', subText: getTextCommand(1, osx), type: 'heading-1' },\n { text: 'Heading 2', subText: getTextCommand(2, osx), type: 'heading-2' },\n { text: 'Heading 3', subText: getTextCommand(3, osx), type: 'heading-3' },\n { text: 'Heading 4', subText: getTextCommand(4, osx), type: 'heading-4' }\n ];\n};\n\nconst TextSelect: FC<{ osx: boolean }> = ({ osx }) => {\n const t = useI18n();\n const { disabled } = useRTEContext();\n const [open, setOpen] = useState(false);\n const [selecting, setSelecting] = useState(false);\n const buttonRef = useRef(null);\n const popoverRef = useRef(null);\n const menuRef = useRef(null);\n const editor = useSlate();\n\n const textFormats = useCallback(() => {\n return getTextFormats(osx);\n }, [osx])();\n\n useOuterEvent('click', [buttonRef, popoverRef, menuRef], () => {\n setOpen(false);\n });\n\n const onTextSelect = (type: Element['type']) => {\n EditorCommands.setBlock(type, editor);\n if (!ReactEditor.isFocused(editor)) {\n ReactEditor.focus(editor);\n }\n setOpen(false);\n setSelecting(true);\n };\n\n return (\n <>\n <StyledTextSelect\n variant='simple'\n type='button'\n disabled={disabled}\n icon={false}\n ref={buttonRef}\n onMouseDown={(e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setOpen(true);\n }}\n onKeyDown={(e: KeyboardEvent) => {\n if (e.key === 'Enter' && !selecting) {\n e.preventDefault();\n setOpen(true);\n } else if (e.key === 'Enter') {\n e.preventDefault();\n setSelecting(false);\n } else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {\n setOpen(false);\n }\n }}\n onClick={(e: MouseEvent) => e.stopPropagation()}\n aria-expanded={open}\n aria-label={`Text formatting toolbar. ${t('rte_heading_style')}. ${\n textMapping[EditorCommands.getActiveBlockType(editor)]\n } selected`}\n aria-haspopup\n >\n <span>{textMapping[EditorCommands.getActiveBlockType(editor)]}</span>\n <Icon name='arrow-micro-down' />\n </StyledTextSelect>\n {buttonRef.current && (\n <Tooltip target={buttonRef.current} showDelay='none' hideDelay='none'>\n {t('rte_heading_style')}\n </Tooltip>\n )}\n <Popover\n show={open}\n as={StyledSelectMenu}\n target={buttonRef.current}\n placement='bottom-start'\n ref={popoverRef}\n onMouseDown={(e: MouseEvent) => {\n e.preventDefault();\n }}\n >\n <Menu\n items={textFormats.map(({ text, type, subText }) => ({\n id: type,\n primary: text,\n secondary: [subText],\n selected: type === EditorCommands.getActiveBlockType(editor)\n }))}\n focusControlEl={buttonRef.current || undefined}\n mode='single-select'\n ref={menuRef}\n onItemClick={onTextSelect as (id: string) => void}\n />\n </Popover>\n </>\n );\n};\n\nexport default TextSelect;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/Toolbar/Toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAA+B,MAAM,OAAO,CAAC;AAmBxD,OAAO,EAAa,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/Toolbar/Toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAA+B,MAAM,OAAO,CAAC;AAmBxD,OAAO,EAAa,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAuBtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,CAAC,EAAE,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C;AAyID,QAAA,MAAM,OAAO,EAAE,EAAE,CAAC,YAAY,CA4E7B,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
|
@@ -15,6 +15,8 @@ import { getKeyCommand } from './utils';
|
|
|
15
15
|
const StyledToolbar = styled.div `
|
|
16
16
|
background-color: ${props => props.theme.base.palette['primary-background']};
|
|
17
17
|
border-radius: calc(0.25 * ${props => props.theme.base['border-radius']});
|
|
18
|
+
overflow: auto;
|
|
19
|
+
padding: 0.125rem;
|
|
18
20
|
${props => props.sticky &&
|
|
19
21
|
css `
|
|
20
22
|
position: sticky;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/Toolbar/Toolbar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FC, useState, useEffect, useRef } from 'react';\nimport { Text } from 'slate';\nimport { useSlate, useFocused, ReactEditor } from 'slate-react';\nimport styled, { css } from 'styled-components';\n\nimport {\n Flex,\n Icon,\n useArrows,\n useI18n,\n defaultThemeProp,\n TranslationPack\n} from '@pega/cosmos-react-core';\nimport { TranslationFunction } from '@pega/cosmos-react-core/lib/i18n/translate';\n\nimport EditorCommands from '../utils/EditorCommands';\nimport ListCommands from '../utils/ListCommands';\n\nimport ToolbarButton from './ToolbarButton';\nimport { StyleType, Features } from './Toolbar.types';\nimport TableButton from './TableButton';\nimport AnchorButton from './AnchorButton';\nimport ImageButton from './ImageButton';\nimport TextSelect from './TextSelect';\nimport IndentButton from './IndentButton';\nimport { getKeyCommand } from './utils';\n\nconst StyledToolbar = styled.div<{ sticky?: boolean }>`\n background-color: ${props => props.theme.base.palette['primary-background']};\n border-radius: calc(0.25 * ${props => props.theme.base['border-radius']});\n ${props =>\n props.sticky &&\n css`\n position: sticky;\n bottom: 0;\n `}\n`;\n\nStyledToolbar.defaultProps = defaultThemeProp;\n\nexport interface ToolbarProps {\n features: Features[];\n sticky?: boolean;\n setFocusableBtn: (el: HTMLElement) => void;\n}\n\ntype StyleButtonType = {\n style: StyleType;\n text: string;\n icon?: string;\n label?: string;\n format: Exclude<keyof Text, 'text'>;\n tooltip: string;\n};\n\n// Function that returns the text styling buttons\nfunction renderStyleButtons(\n editor: ReactEditor,\n t: TranslationFunction<TranslationPack>,\n focused: boolean,\n osx: boolean\n) {\n const inlineStyleButtons: StyleButtonType[] = [\n {\n style: 'BOLD',\n text: 'B',\n format: 'bold',\n label: t('rte_bold'),\n tooltip: getKeyCommand(\n osx,\n ({ ctrl, shift }) => `${t('rte_bold')} (${ctrl}B, ${ctrl}${shift}B)`\n )\n },\n {\n style: 'ITALIC',\n text: 'I',\n format: 'italic',\n label: t('rte_italic'),\n tooltip: getKeyCommand(\n osx,\n ({ ctrl, shift }) => `${t('rte_italic')} (${ctrl}I, ${ctrl}${shift}I)`\n )\n },\n {\n style: 'STRIKE-THROUGH',\n text: 'S',\n format: 'line-through',\n label: t('rte_strike_through'),\n tooltip: getKeyCommand(\n osx,\n ({ ctrl, shift }) => `${t('rte_strike_through')} (${ctrl}${shift}X)`\n )\n }\n ];\n\n return inlineStyleButtons.map(({ format, style, text, label, tooltip }) => {\n return (\n <ToolbarButton\n key={style}\n onMouseDown={e => {\n e.preventDefault();\n if (!focused) {\n ReactEditor.focus(editor);\n }\n setTimeout(() => {\n EditorCommands.toggleFormat(format, editor);\n }, 0);\n }}\n styleType={style}\n active={EditorCommands.isFormatActive(format, editor)}\n tooltip={tooltip}\n label={label}\n >\n {text}\n </ToolbarButton>\n );\n });\n}\n\n// Function that returns the cut, copy and paste buttons\nfunction renderCutCopyPaste(\n editor: ReactEditor,\n t: TranslationFunction<TranslationPack>,\n osx: boolean\n) {\n const CutCopyPasteButtons = [\n {\n text: 'Cut',\n icon: 'scissors',\n label: t('rte_cut'),\n func: () => {\n document.execCommand('cut');\n },\n tooltip: getKeyCommand(osx, ({ ctrl }) => `${t('rte_cut')} (${ctrl}X)`)\n },\n {\n text: 'Copy',\n icon: 'copy',\n label: t('rte_copy'),\n func: () => {\n document.execCommand('copy');\n },\n tooltip: getKeyCommand(osx, ({ ctrl }) => `${t('rte_copy')} (${ctrl}C)`)\n },\n {\n text: 'Paste',\n icon: 'clipboard-data',\n label: t('rte_paste'),\n func: () => {\n navigator.clipboard.readText().then(text => {\n EditorCommands.replaceWithText(editor, editor.selection, text);\n });\n },\n tooltip: getKeyCommand(osx, ({ ctrl }) => `${t('rte_paste')} (${ctrl}V)`)\n }\n ];\n\n return CutCopyPasteButtons.map(btn => {\n return (\n <ToolbarButton\n onMouseDown={e => {\n e.preventDefault();\n btn.func();\n }}\n key={btn.text}\n tooltip={btn.tooltip}\n label={btn.label}\n >\n <Icon name={btn.icon} />\n </ToolbarButton>\n );\n });\n}\n\n// Takes the features array and transforms it into a map for faster lookup\nfunction createActiveFeaturesMap(features: Features[]) {\n return features.reduce((acc, feature) => {\n return { ...acc, [feature]: true };\n }, {} as { [F in Features]: boolean });\n}\n\nconst Toolbar: FC<ToolbarProps> = (props: ToolbarProps) => {\n const { features, sticky, setFocusableBtn } = props;\n const editor = useSlate();\n const focused = useFocused();\n const t = useI18n();\n const [osx, setOsx] = useState(false);\n const toolbarRef = useRef<HTMLElement>(null);\n\n useArrows(toolbarRef, { selector: 'button', dir: 'left-right' });\n\n const [activeFeatures, setActiveFeatures] = useState(createActiveFeaturesMap(features));\n\n useEffect(() => {\n const btn = toolbarRef?.current?.querySelector('button');\n if (btn) setFocusableBtn(btn);\n }, [toolbarRef.current]);\n\n useEffect(() => {\n setActiveFeatures(createActiveFeaturesMap(features));\n }, [features]);\n\n useEffect(() => {\n if (navigator.appVersion.includes('Mac')) setOsx(true);\n }, []);\n\n return (\n <Flex as={StyledToolbar} sticky={sticky} container={{ justify: 'between' }} ref={toolbarRef}>\n <Flex container={{ alignItems: 'end' }}>\n <TextSelect osx={osx} />\n {activeFeatures['inline-styling'] && renderStyleButtons(editor, t, focused, osx)}\n {activeFeatures.lists && (\n <>\n <ToolbarButton\n onMouseDown={e => {\n e.preventDefault();\n ListCommands.toggleList('unordered-list', editor);\n }}\n active={EditorCommands.isBlockActive('unordered-list', editor)}\n tooltip={getKeyCommand(\n osx,\n ({ ctrl, shift }) => `${t('rte_bulleted_list')} (${ctrl}${shift}L)`\n )}\n label={t('rte_bulleted_list')}\n >\n <Icon name='list' />\n </ToolbarButton>\n <ToolbarButton\n onMouseDown={e => {\n e.preventDefault();\n ListCommands.toggleList('ordered-list', editor);\n }}\n active={EditorCommands.isBlockActive('ordered-list', editor)}\n tooltip={t('rte_numbered_list')}\n label={t('rte_numbered_list')}\n >\n <Icon name='list-number' />\n </ToolbarButton>\n </>\n )}\n {activeFeatures.indentation && (\n <>\n <IndentButton type='indent' osx={osx} />\n <IndentButton type='unindent' osx={osx} />\n </>\n )}\n {activeFeatures.tables && <TableButton />}\n </Flex>\n <Flex container={{ alignItems: 'end' }}>\n {activeFeatures.links && <AnchorButton osx={osx} />}\n {activeFeatures.images && <ImageButton />}\n </Flex>\n {activeFeatures['cut-copy-paste'] && (\n <Flex container={{ alignItems: 'end' }}>{renderCutCopyPaste(editor, t, osx)}</Flex>\n )}\n </Flex>\n );\n};\n\nexport default Toolbar;\n"]}
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/Toolbar/Toolbar.tsx"],"names":[],"mappings":"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","sourcesContent":["import { FC, useState, useEffect, useRef } from 'react';\nimport { Text } from 'slate';\nimport { useSlate, useFocused, ReactEditor } from 'slate-react';\nimport styled, { css } from 'styled-components';\n\nimport {\n Flex,\n Icon,\n useArrows,\n useI18n,\n defaultThemeProp,\n TranslationPack\n} from '@pega/cosmos-react-core';\nimport { TranslationFunction } from '@pega/cosmos-react-core/lib/i18n/translate';\n\nimport EditorCommands from '../utils/EditorCommands';\nimport ListCommands from '../utils/ListCommands';\n\nimport ToolbarButton from './ToolbarButton';\nimport { StyleType, Features } from './Toolbar.types';\nimport TableButton from './TableButton';\nimport AnchorButton from './AnchorButton';\nimport ImageButton from './ImageButton';\nimport TextSelect from './TextSelect';\nimport IndentButton from './IndentButton';\nimport { getKeyCommand } from './utils';\n\nconst StyledToolbar = styled.div<{ sticky?: boolean }>`\n background-color: ${props => props.theme.base.palette['primary-background']};\n border-radius: calc(0.25 * ${props => props.theme.base['border-radius']});\n overflow: auto;\n padding: 0.125rem;\n ${props =>\n props.sticky &&\n css`\n position: sticky;\n bottom: 0;\n `}\n`;\n\nStyledToolbar.defaultProps = defaultThemeProp;\n\nexport interface ToolbarProps {\n features: Features[];\n sticky?: boolean;\n setFocusableBtn: (el: HTMLElement) => void;\n}\n\ntype StyleButtonType = {\n style: StyleType;\n text: string;\n icon?: string;\n label?: string;\n format: Exclude<keyof Text, 'text'>;\n tooltip: string;\n};\n\n// Function that returns the text styling buttons\nfunction renderStyleButtons(\n editor: ReactEditor,\n t: TranslationFunction<TranslationPack>,\n focused: boolean,\n osx: boolean\n) {\n const inlineStyleButtons: StyleButtonType[] = [\n {\n style: 'BOLD',\n text: 'B',\n format: 'bold',\n label: t('rte_bold'),\n tooltip: getKeyCommand(\n osx,\n ({ ctrl, shift }) => `${t('rte_bold')} (${ctrl}B, ${ctrl}${shift}B)`\n )\n },\n {\n style: 'ITALIC',\n text: 'I',\n format: 'italic',\n label: t('rte_italic'),\n tooltip: getKeyCommand(\n osx,\n ({ ctrl, shift }) => `${t('rte_italic')} (${ctrl}I, ${ctrl}${shift}I)`\n )\n },\n {\n style: 'STRIKE-THROUGH',\n text: 'S',\n format: 'line-through',\n label: t('rte_strike_through'),\n tooltip: getKeyCommand(\n osx,\n ({ ctrl, shift }) => `${t('rte_strike_through')} (${ctrl}${shift}X)`\n )\n }\n ];\n\n return inlineStyleButtons.map(({ format, style, text, label, tooltip }) => {\n return (\n <ToolbarButton\n key={style}\n onMouseDown={e => {\n e.preventDefault();\n if (!focused) {\n ReactEditor.focus(editor);\n }\n setTimeout(() => {\n EditorCommands.toggleFormat(format, editor);\n }, 0);\n }}\n styleType={style}\n active={EditorCommands.isFormatActive(format, editor)}\n tooltip={tooltip}\n label={label}\n >\n {text}\n </ToolbarButton>\n );\n });\n}\n\n// Function that returns the cut, copy and paste buttons\nfunction renderCutCopyPaste(\n editor: ReactEditor,\n t: TranslationFunction<TranslationPack>,\n osx: boolean\n) {\n const CutCopyPasteButtons = [\n {\n text: 'Cut',\n icon: 'scissors',\n label: t('rte_cut'),\n func: () => {\n document.execCommand('cut');\n },\n tooltip: getKeyCommand(osx, ({ ctrl }) => `${t('rte_cut')} (${ctrl}X)`)\n },\n {\n text: 'Copy',\n icon: 'copy',\n label: t('rte_copy'),\n func: () => {\n document.execCommand('copy');\n },\n tooltip: getKeyCommand(osx, ({ ctrl }) => `${t('rte_copy')} (${ctrl}C)`)\n },\n {\n text: 'Paste',\n icon: 'clipboard-data',\n label: t('rte_paste'),\n func: () => {\n navigator.clipboard.readText().then(text => {\n EditorCommands.replaceWithText(editor, editor.selection, text);\n });\n },\n tooltip: getKeyCommand(osx, ({ ctrl }) => `${t('rte_paste')} (${ctrl}V)`)\n }\n ];\n\n return CutCopyPasteButtons.map(btn => {\n return (\n <ToolbarButton\n onMouseDown={e => {\n e.preventDefault();\n btn.func();\n }}\n key={btn.text}\n tooltip={btn.tooltip}\n label={btn.label}\n >\n <Icon name={btn.icon} />\n </ToolbarButton>\n );\n });\n}\n\n// Takes the features array and transforms it into a map for faster lookup\nfunction createActiveFeaturesMap(features: Features[]) {\n return features.reduce((acc, feature) => {\n return { ...acc, [feature]: true };\n }, {} as { [F in Features]: boolean });\n}\n\nconst Toolbar: FC<ToolbarProps> = (props: ToolbarProps) => {\n const { features, sticky, setFocusableBtn } = props;\n const editor = useSlate();\n const focused = useFocused();\n const t = useI18n();\n const [osx, setOsx] = useState(false);\n const toolbarRef = useRef<HTMLElement>(null);\n\n useArrows(toolbarRef, { selector: 'button', dir: 'left-right' });\n\n const [activeFeatures, setActiveFeatures] = useState(createActiveFeaturesMap(features));\n\n useEffect(() => {\n const btn = toolbarRef?.current?.querySelector('button');\n if (btn) setFocusableBtn(btn);\n }, [toolbarRef.current]);\n\n useEffect(() => {\n setActiveFeatures(createActiveFeaturesMap(features));\n }, [features]);\n\n useEffect(() => {\n if (navigator.appVersion.includes('Mac')) setOsx(true);\n }, []);\n\n return (\n <Flex as={StyledToolbar} sticky={sticky} container={{ justify: 'between' }} ref={toolbarRef}>\n <Flex container={{ alignItems: 'end' }}>\n <TextSelect osx={osx} />\n {activeFeatures['inline-styling'] && renderStyleButtons(editor, t, focused, osx)}\n {activeFeatures.lists && (\n <>\n <ToolbarButton\n onMouseDown={e => {\n e.preventDefault();\n ListCommands.toggleList('unordered-list', editor);\n }}\n active={EditorCommands.isBlockActive('unordered-list', editor)}\n tooltip={getKeyCommand(\n osx,\n ({ ctrl, shift }) => `${t('rte_bulleted_list')} (${ctrl}${shift}L)`\n )}\n label={t('rte_bulleted_list')}\n >\n <Icon name='list' />\n </ToolbarButton>\n <ToolbarButton\n onMouseDown={e => {\n e.preventDefault();\n ListCommands.toggleList('ordered-list', editor);\n }}\n active={EditorCommands.isBlockActive('ordered-list', editor)}\n tooltip={t('rte_numbered_list')}\n label={t('rte_numbered_list')}\n >\n <Icon name='list-number' />\n </ToolbarButton>\n </>\n )}\n {activeFeatures.indentation && (\n <>\n <IndentButton type='indent' osx={osx} />\n <IndentButton type='unindent' osx={osx} />\n </>\n )}\n {activeFeatures.tables && <TableButton />}\n </Flex>\n <Flex container={{ alignItems: 'end' }}>\n {activeFeatures.links && <AnchorButton osx={osx} />}\n {activeFeatures.images && <ImageButton />}\n </Flex>\n {activeFeatures['cut-copy-paste'] && (\n <Flex container={{ alignItems: 'end' }}>{renderCutCopyPaste(editor, t, osx)}</Flex>\n )}\n </Flex>\n );\n};\n\nexport default Toolbar;\n"]}
|
|
@@ -36,7 +36,7 @@ const commands = {
|
|
|
36
36
|
match: matchListItem,
|
|
37
37
|
mode: 'lowest'
|
|
38
38
|
});
|
|
39
|
-
if (['Backspace', '
|
|
39
|
+
if (['Backspace', 'Enter'].includes(event.key) && listItemNodeEntry) {
|
|
40
40
|
const [listItemNode, listItemPath] = listItemNodeEntry;
|
|
41
41
|
// Getting the text node
|
|
42
42
|
const [[textNode]] = Editor.nodes(editor, {
|
|
@@ -93,7 +93,7 @@ const commands = {
|
|
|
93
93
|
// Set the selection to the new list item created
|
|
94
94
|
Transforms.setSelection(editor, { focus: selectionPoint, anchor: selectionPoint });
|
|
95
95
|
}
|
|
96
|
-
else {
|
|
96
|
+
else if (editor.selection?.anchor.offset === 0) {
|
|
97
97
|
commands.unNestList(editor);
|
|
98
98
|
}
|
|
99
99
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListCommands.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/ListCommands.ts"],"names":[],"mappings":"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","sourcesContent":["import { KeyboardEvent } from 'react';\nimport { Editor, Node, Element, Path, Transforms, CosmosCustom, Text, NodeEntry } from 'slate';\n\nimport { createUID } from '@pega/cosmos-react-core';\n\nimport { LIST_TYPES, TEXT_TYPES } from './utils.types';\n\ntype FullListItemElement = CosmosCustom.ListItemElement & {\n id: string;\n parentId: string;\n order: number;\n level: number;\n};\n\nconst matchList = (n: Node): n is CosmosCustom.ListElement =>\n Element.isElement(n) && LIST_TYPES.includes(n.type);\n\nconst matchListItem = (n: Node): n is CosmosCustom.ListItemElement =>\n Element.isElement(n) && n.type === 'list-item';\n\nconst getNextPathBelow = (path: Path) => {\n path[path.length - 1] = path[path.length - 1] + 1;\n return path;\n};\n\nconst commands = {\n toggleList: (type: 'unordered-list' | 'ordered-list', editor: Editor) => {\n const [listItemInSelection] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchListItem\n });\n\n if (!listItemInSelection) {\n Transforms.wrapNodes(editor, { type, children: [] });\n Transforms.wrapNodes(editor, {\n type: 'list-item',\n order: 1,\n level: 1,\n id: createUID(),\n children: []\n });\n } else {\n Transforms.setNodes(editor, { type }, { match: matchList });\n }\n },\n checkListEnter: (editor: Editor, event: KeyboardEvent<any>) => {\n /* Gets the list item node at your selection in the lowest part of the tree.\n Your selection could technically be in multiple list items in the tree because\n the lists can be nested. That is what the mode: 'lowest' arg is for. */\n const [listItemNodeEntry] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchListItem,\n mode: 'lowest'\n });\n\n if (['Backspace', 'Delete', 'Enter'].includes(event.key) && listItemNodeEntry) {\n const [listItemNode, listItemPath] = listItemNodeEntry;\n // Getting the text node\n const [[textNode]] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: Text.isText\n });\n // Getting the parent list-item node\n const [[parentNode]] = Editor.nodes(editor, {\n at: editor.selection || undefined,\n match: matchListItem,\n mode: 'highest'\n });\n\n let belowListItemPath;\n try {\n belowListItemPath = Path.next(listItemPath);\n } catch {\n belowListItemPath = undefined;\n }\n\n if (textNode.text !== '') {\n // If the text node the selection is in is not empty, and the key that was pressed is Enter\n if (event.key === 'Enter') {\n event.preventDefault();\n const newId = createUID();\n const copiedChildren: Element[] = [];\n // If this list-item has another list nested inside of it\n if (listItemNode.children.length === 2) {\n // Copy the list nested inside\n const copiedList = { ...listItemNode.children[1] } as CosmosCustom.ListElement;\n // Add a new parentId to all the children in the list\n copiedList.children = copiedList.children.map(node => {\n return { ...node, parentId: newId };\n });\n copiedChildren.push(copiedList);\n // Remove the list\n Transforms.removeNodes(editor, { at: [...listItemPath, 1] });\n }\n /* Create a new list item with the copied children as it's children,\n and insert it into the editor */\n Transforms.insertNodes(editor, {\n type: 'list-item',\n order: listItemNode.order ? listItemNode.order + 1 : 0,\n level: listItemNode.level ? listItemNode.level : 1,\n id: newId,\n parentId: parentNode.id,\n children: [{ type: 'paragraph', children: [{ text: '' }] }, ...copiedChildren]\n });\n /* Nodes needs to be lifted one level higher because it will be inserted\n into the list item itself rather than it's parent list */\n Transforms.liftNodes<CosmosCustom.ListItemElement>(editor, {\n match: n => matchListItem(n) && n.id === newId\n });\n const selectionPoint = { path: [...Path.next(listItemPath), 0, 0], offset: 0 };\n // Set the selection to the new list item created\n Transforms.setSelection(editor, { focus: selectionPoint, anchor: selectionPoint });\n } else {\n commands.unNestList(editor);\n }\n } else if (parentNode && parentNode.children.length > 1) {\n // Un nest this list item from it's parent\n event.preventDefault();\n commands.unNestList(editor);\n } else if (belowListItemPath) {\n // Break out of the list\n event.preventDefault();\n Transforms.unwrapNodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchListItem\n });\n Transforms.liftNodes(editor);\n }\n }\n },\n nestList: (editor: Editor) => {\n const [listItemNodeEntry] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchListItem,\n mode: 'lowest'\n });\n\n let listType: `${'un' | ''}ordered-list` = 'unordered-list';\n const [highestList] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchList,\n mode: 'highest'\n });\n\n if (highestList) {\n listType = highestList[0].type;\n }\n\n const [listItemNode, listItemPath] = (listItemNodeEntry as NodeEntry<FullListItemElement>) || [\n undefined,\n undefined\n ];\n\n // Try to find the path to the node above the selected list item\n let abovePath;\n try {\n abovePath = Path.previous(listItemPath);\n } catch {\n abovePath = undefined;\n }\n\n // Only nest the list if there is a list item above the list item trying to be nested\n if (listItemNode && abovePath && listItemNode.level < 3) {\n // Get the list item and it's path from above the current list item\n const [[aboveListItemNode, aboveListItemPath]] = Editor.nodes<CosmosCustom.ListItemElement>(\n editor,\n {\n at: abovePath,\n match: n => matchListItem(n) && n.level === listItemNode.level\n }\n );\n // Gets the path for the text node above list-item\n const [[, innerTextNodePath]] = Editor.nodes<CosmosCustom.TextElement>(editor, {\n at: abovePath,\n match: n => Element.isElement(n) && TEXT_TYPES.includes(n.type)\n });\n\n let copiedSubListNodes: CosmosCustom.ListItemElement[] = [];\n const newListItemChildren = [listItemNode.children[0]];\n if (listItemNode.children.length && listItemNode.children.length > 1) {\n // Copy the item to be nested's sub list if it has one\n const subList = listItemNode.children[1] as CosmosCustom.ListElement;\n if (subList) {\n copiedSubListNodes = [...subList.children];\n }\n }\n\n // If the above list item has a sub list\n if (aboveListItemNode.children.length > 1) {\n // Get the list items in the sub list of the above list item\n const { children } = aboveListItemNode.children[1] as CosmosCustom.ListElement;\n // Gets the last list item in the above sub list\n const [[parentSubListItem, parentSubListItemPath]] = Editor.nodes<FullListItemElement>(\n editor,\n {\n at: aboveListItemPath,\n match: n =>\n matchListItem(n) &&\n n.order === children.length &&\n (n.level as number) - 1 === listItemNode.level\n }\n );\n\n // Gets the path after the last list item in the above sub list\n const nextParentSubListItemPath = Path.next(parentSubListItemPath);\n\n /* Inserts a copy of the list-item you are nesting below the lowest list item\n in the above sub list, as well as copies of any children the list-item you are\n nesting had. */\n let subOrderCount = parentSubListItem.order + 1;\n Transforms.insertNodes(\n editor,\n [\n {\n ...listItemNode,\n level: listItemNode.level + 1,\n order: parentSubListItem.order + 1,\n parentId: aboveListItemNode.id,\n children: newListItemChildren\n },\n ...copiedSubListNodes.map(n => {\n subOrderCount += 1;\n return {\n ...n,\n level: listItemNode.level + 1,\n order: subOrderCount,\n parentId: aboveListItemNode.id\n };\n })\n ],\n { at: nextParentSubListItemPath }\n );\n } else {\n const nextInnerTextNodePath = getNextPathBelow(innerTextNodePath);\n // Nest the selected list item into a new list and then into the above list item\n let subOrderCount = 1;\n Transforms.insertNodes(\n editor,\n {\n type: listType,\n children: [\n {\n ...listItemNode,\n order: 1,\n level: listItemNode.level + 1,\n parentId: aboveListItemNode.id,\n children: newListItemChildren\n },\n ...copiedSubListNodes.map(n => {\n subOrderCount += 1;\n return {\n ...n,\n level: listItemNode.level + 1,\n order: subOrderCount,\n parentId: aboveListItemNode.id\n };\n })\n ]\n },\n { at: nextInnerTextNodePath, mode: 'lowest' }\n );\n }\n\n // Remove the old list item as we just copied it into the correct place\n Transforms.removeNodes(editor, { at: listItemPath });\n }\n },\n unNestList: (editor: Editor) => {\n // Get the current node to be un nested\n const [[node, nodePath]] = Editor.nodes<FullListItemElement>(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchListItem,\n mode: 'lowest'\n });\n const [singleItemList] = Editor.nodes<CosmosCustom.ListElement>(editor, {\n match: n => matchList(n) && n.children.length === 1,\n mode: 'highest'\n });\n\n if (singleItemList) {\n Transforms.unwrapNodes(editor, { match: matchListItem });\n Transforms.unwrapNodes(editor, { match: matchList });\n return;\n }\n // Attempt to get the highest parent in the nested list if it exists\n const [highestParent] = Editor.nodes<FullListItemElement>(editor, {\n at: editor.selection || undefined,\n match: n => matchListItem(n) && node.level - (n.level as number) === 2,\n mode: 'lowest'\n });\n // Get the parent list node if it exists (list item)\n const [[parentNode]] = Editor.nodes<FullListItemElement>(editor, {\n at: editor.selection || undefined,\n match: n => matchListItem(n) && node.level - (n.level as number) === 1,\n mode: 'lowest'\n });\n // Get the parent list\n const [[parentList]] = Editor.nodes(editor, {\n at: editor.selection || undefined,\n match: matchList,\n mode: 'lowest'\n });\n if (parentNode && parentNode.children.length > 1) {\n let newParentId;\n if (highestParent) {\n const [highestParentNode] = highestParent;\n newParentId = highestParentNode.id;\n }\n\n // Setting the node to un nests new order and level\n Transforms.setNodes<CosmosCustom.ListItemElement>(\n editor,\n {\n level: node.level - 1,\n order: parentNode.order + 1\n },\n { at: nodePath, match: n => matchListItem(n) && n.id === node.id }\n );\n\n // Set the level of any children under the node we are un nesting\n Transforms.setNodes<CosmosCustom.ListItemElement>(\n editor,\n { level: node.level },\n {\n at: nodePath,\n match: n => matchListItem(n) && (n.level as number) > node.level\n }\n );\n\n // If there's a new parent id set it, otherwise unset the parent id entirely\n if (newParentId) {\n Transforms.setNodes<CosmosCustom.ListItemElement>(\n editor,\n { parentId: newParentId },\n { at: nodePath, match: n => matchListItem(n) && n.id === node.id }\n );\n } else {\n Transforms.unsetNodes<CosmosCustom.ListItemElement>(editor, 'parentId', {\n at: nodePath,\n match: n => matchListItem(n) && n.id === node.id\n });\n }\n\n const listItemsExistBelow = node.order < parentList.children.length;\n\n if (listItemsExistBelow) {\n // Getting the inner text node inside of the list item in order to get the next path\n const [[, innerTextNodePath]] = Editor.nodes(editor, {\n at: nodePath,\n match: matchList\n });\n const nextPath = Path.next(innerTextNodePath);\n const copiedChildren = [];\n\n let count = 1;\n // Copy the children from the parent list that are below the list item we are un nesting\n for (let i = node.order; i < parentList.children.length; i += 1) {\n copiedChildren.push({\n ...parentList.children[i],\n parentId: node.id,\n order: count\n });\n count += 1;\n }\n\n // Insert a new list with the copied children into the un nested list item\n Transforms.insertNodes(\n editor,\n {\n type: parentList.type,\n children: [...copiedChildren]\n },\n { at: nextPath }\n );\n\n const [[newParentList, newParentListPath]] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchList,\n mode: 'lowest'\n });\n\n let order = 0;\n // Set the nodes below the list item being un nested\n Transforms.setNodes<CosmosCustom.ListItemElement>(\n editor,\n {\n parentId: node.id,\n order\n },\n {\n match: n => {\n if (!matchListItem(n)) return false;\n\n if (n.parentId === node.id) order += 1;\n return n.parentId === node.id;\n }\n }\n );\n\n // Removing all old nodes from that were under the un nested item\n for (let i = newParentList.children.length - 1; i >= node.order; i -= 1) {\n const childPath = [...newParentListPath, i];\n Transforms.removeNodes(editor, { at: childPath, match: matchListItem });\n }\n }\n\n // Lift the current node at the users selection out of it's parent node twice\n Transforms.liftNodes(editor, { match: matchListItem });\n Transforms.liftNodes(editor, { match: matchListItem });\n }\n }\n};\n\nexport default commands;\n"]}
|
|
1
|
+
{"version":3,"file":"ListCommands.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/ListCommands.ts"],"names":[],"mappings":"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","sourcesContent":["import { KeyboardEvent } from 'react';\nimport { Editor, Node, Element, Path, Transforms, CosmosCustom, Text, NodeEntry } from 'slate';\n\nimport { createUID } from '@pega/cosmos-react-core';\n\nimport { LIST_TYPES, TEXT_TYPES } from './utils.types';\n\ntype FullListItemElement = CosmosCustom.ListItemElement & {\n id: string;\n parentId: string;\n order: number;\n level: number;\n};\n\nconst matchList = (n: Node): n is CosmosCustom.ListElement =>\n Element.isElement(n) && LIST_TYPES.includes(n.type);\n\nconst matchListItem = (n: Node): n is CosmosCustom.ListItemElement =>\n Element.isElement(n) && n.type === 'list-item';\n\nconst getNextPathBelow = (path: Path) => {\n path[path.length - 1] = path[path.length - 1] + 1;\n return path;\n};\n\nconst commands = {\n toggleList: (type: 'unordered-list' | 'ordered-list', editor: Editor) => {\n const [listItemInSelection] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchListItem\n });\n\n if (!listItemInSelection) {\n Transforms.wrapNodes(editor, { type, children: [] });\n Transforms.wrapNodes(editor, {\n type: 'list-item',\n order: 1,\n level: 1,\n id: createUID(),\n children: []\n });\n } else {\n Transforms.setNodes(editor, { type }, { match: matchList });\n }\n },\n checkListEnter: (editor: Editor, event: KeyboardEvent<any>) => {\n /* Gets the list item node at your selection in the lowest part of the tree.\n Your selection could technically be in multiple list items in the tree because\n the lists can be nested. That is what the mode: 'lowest' arg is for. */\n const [listItemNodeEntry] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchListItem,\n mode: 'lowest'\n });\n\n if (['Backspace', 'Enter'].includes(event.key) && listItemNodeEntry) {\n const [listItemNode, listItemPath] = listItemNodeEntry;\n // Getting the text node\n const [[textNode]] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: Text.isText\n });\n // Getting the parent list-item node\n const [[parentNode]] = Editor.nodes(editor, {\n at: editor.selection || undefined,\n match: matchListItem,\n mode: 'highest'\n });\n\n let belowListItemPath;\n try {\n belowListItemPath = Path.next(listItemPath);\n } catch {\n belowListItemPath = undefined;\n }\n\n if (textNode.text !== '') {\n // If the text node the selection is in is not empty, and the key that was pressed is Enter\n if (event.key === 'Enter') {\n event.preventDefault();\n const newId = createUID();\n const copiedChildren: Element[] = [];\n // If this list-item has another list nested inside of it\n if (listItemNode.children.length === 2) {\n // Copy the list nested inside\n const copiedList = { ...listItemNode.children[1] } as CosmosCustom.ListElement;\n // Add a new parentId to all the children in the list\n copiedList.children = copiedList.children.map(node => {\n return { ...node, parentId: newId };\n });\n copiedChildren.push(copiedList);\n // Remove the list\n Transforms.removeNodes(editor, { at: [...listItemPath, 1] });\n }\n /* Create a new list item with the copied children as it's children,\n and insert it into the editor */\n Transforms.insertNodes(editor, {\n type: 'list-item',\n order: listItemNode.order ? listItemNode.order + 1 : 0,\n level: listItemNode.level ? listItemNode.level : 1,\n id: newId,\n parentId: parentNode.id,\n children: [{ type: 'paragraph', children: [{ text: '' }] }, ...copiedChildren]\n });\n /* Nodes needs to be lifted one level higher because it will be inserted\n into the list item itself rather than it's parent list */\n Transforms.liftNodes<CosmosCustom.ListItemElement>(editor, {\n match: n => matchListItem(n) && n.id === newId\n });\n const selectionPoint = { path: [...Path.next(listItemPath), 0, 0], offset: 0 };\n // Set the selection to the new list item created\n Transforms.setSelection(editor, { focus: selectionPoint, anchor: selectionPoint });\n } else if (editor.selection?.anchor.offset === 0) {\n commands.unNestList(editor);\n }\n } else if (parentNode && parentNode.children.length > 1) {\n // Un nest this list item from it's parent\n event.preventDefault();\n commands.unNestList(editor);\n } else if (belowListItemPath) {\n // Break out of the list\n event.preventDefault();\n Transforms.unwrapNodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchListItem\n });\n Transforms.liftNodes(editor);\n }\n }\n },\n nestList: (editor: Editor) => {\n const [listItemNodeEntry] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchListItem,\n mode: 'lowest'\n });\n\n let listType: `${'un' | ''}ordered-list` = 'unordered-list';\n const [highestList] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchList,\n mode: 'highest'\n });\n\n if (highestList) {\n listType = highestList[0].type;\n }\n\n const [listItemNode, listItemPath] = (listItemNodeEntry as NodeEntry<FullListItemElement>) || [\n undefined,\n undefined\n ];\n\n // Try to find the path to the node above the selected list item\n let abovePath;\n try {\n abovePath = Path.previous(listItemPath);\n } catch {\n abovePath = undefined;\n }\n\n // Only nest the list if there is a list item above the list item trying to be nested\n if (listItemNode && abovePath && listItemNode.level < 3) {\n // Get the list item and it's path from above the current list item\n const [[aboveListItemNode, aboveListItemPath]] = Editor.nodes<CosmosCustom.ListItemElement>(\n editor,\n {\n at: abovePath,\n match: n => matchListItem(n) && n.level === listItemNode.level\n }\n );\n // Gets the path for the text node above list-item\n const [[, innerTextNodePath]] = Editor.nodes<CosmosCustom.TextElement>(editor, {\n at: abovePath,\n match: n => Element.isElement(n) && TEXT_TYPES.includes(n.type)\n });\n\n let copiedSubListNodes: CosmosCustom.ListItemElement[] = [];\n const newListItemChildren = [listItemNode.children[0]];\n if (listItemNode.children.length && listItemNode.children.length > 1) {\n // Copy the item to be nested's sub list if it has one\n const subList = listItemNode.children[1] as CosmosCustom.ListElement;\n if (subList) {\n copiedSubListNodes = [...subList.children];\n }\n }\n\n // If the above list item has a sub list\n if (aboveListItemNode.children.length > 1) {\n // Get the list items in the sub list of the above list item\n const { children } = aboveListItemNode.children[1] as CosmosCustom.ListElement;\n // Gets the last list item in the above sub list\n const [[parentSubListItem, parentSubListItemPath]] = Editor.nodes<FullListItemElement>(\n editor,\n {\n at: aboveListItemPath,\n match: n =>\n matchListItem(n) &&\n n.order === children.length &&\n (n.level as number) - 1 === listItemNode.level\n }\n );\n\n // Gets the path after the last list item in the above sub list\n const nextParentSubListItemPath = Path.next(parentSubListItemPath);\n\n /* Inserts a copy of the list-item you are nesting below the lowest list item\n in the above sub list, as well as copies of any children the list-item you are\n nesting had. */\n let subOrderCount = parentSubListItem.order + 1;\n Transforms.insertNodes(\n editor,\n [\n {\n ...listItemNode,\n level: listItemNode.level + 1,\n order: parentSubListItem.order + 1,\n parentId: aboveListItemNode.id,\n children: newListItemChildren\n },\n ...copiedSubListNodes.map(n => {\n subOrderCount += 1;\n return {\n ...n,\n level: listItemNode.level + 1,\n order: subOrderCount,\n parentId: aboveListItemNode.id\n };\n })\n ],\n { at: nextParentSubListItemPath }\n );\n } else {\n const nextInnerTextNodePath = getNextPathBelow(innerTextNodePath);\n // Nest the selected list item into a new list and then into the above list item\n let subOrderCount = 1;\n Transforms.insertNodes(\n editor,\n {\n type: listType,\n children: [\n {\n ...listItemNode,\n order: 1,\n level: listItemNode.level + 1,\n parentId: aboveListItemNode.id,\n children: newListItemChildren\n },\n ...copiedSubListNodes.map(n => {\n subOrderCount += 1;\n return {\n ...n,\n level: listItemNode.level + 1,\n order: subOrderCount,\n parentId: aboveListItemNode.id\n };\n })\n ]\n },\n { at: nextInnerTextNodePath, mode: 'lowest' }\n );\n }\n\n // Remove the old list item as we just copied it into the correct place\n Transforms.removeNodes(editor, { at: listItemPath });\n }\n },\n unNestList: (editor: Editor) => {\n // Get the current node to be un nested\n const [[node, nodePath]] = Editor.nodes<FullListItemElement>(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchListItem,\n mode: 'lowest'\n });\n const [singleItemList] = Editor.nodes<CosmosCustom.ListElement>(editor, {\n match: n => matchList(n) && n.children.length === 1,\n mode: 'highest'\n });\n\n if (singleItemList) {\n Transforms.unwrapNodes(editor, { match: matchListItem });\n Transforms.unwrapNodes(editor, { match: matchList });\n return;\n }\n // Attempt to get the highest parent in the nested list if it exists\n const [highestParent] = Editor.nodes<FullListItemElement>(editor, {\n at: editor.selection || undefined,\n match: n => matchListItem(n) && node.level - (n.level as number) === 2,\n mode: 'lowest'\n });\n // Get the parent list node if it exists (list item)\n const [[parentNode]] = Editor.nodes<FullListItemElement>(editor, {\n at: editor.selection || undefined,\n match: n => matchListItem(n) && node.level - (n.level as number) === 1,\n mode: 'lowest'\n });\n // Get the parent list\n const [[parentList]] = Editor.nodes(editor, {\n at: editor.selection || undefined,\n match: matchList,\n mode: 'lowest'\n });\n if (parentNode && parentNode.children.length > 1) {\n let newParentId;\n if (highestParent) {\n const [highestParentNode] = highestParent;\n newParentId = highestParentNode.id;\n }\n\n // Setting the node to un nests new order and level\n Transforms.setNodes<CosmosCustom.ListItemElement>(\n editor,\n {\n level: node.level - 1,\n order: parentNode.order + 1\n },\n { at: nodePath, match: n => matchListItem(n) && n.id === node.id }\n );\n\n // Set the level of any children under the node we are un nesting\n Transforms.setNodes<CosmosCustom.ListItemElement>(\n editor,\n { level: node.level },\n {\n at: nodePath,\n match: n => matchListItem(n) && (n.level as number) > node.level\n }\n );\n\n // If there's a new parent id set it, otherwise unset the parent id entirely\n if (newParentId) {\n Transforms.setNodes<CosmosCustom.ListItemElement>(\n editor,\n { parentId: newParentId },\n { at: nodePath, match: n => matchListItem(n) && n.id === node.id }\n );\n } else {\n Transforms.unsetNodes<CosmosCustom.ListItemElement>(editor, 'parentId', {\n at: nodePath,\n match: n => matchListItem(n) && n.id === node.id\n });\n }\n\n const listItemsExistBelow = node.order < parentList.children.length;\n\n if (listItemsExistBelow) {\n // Getting the inner text node inside of the list item in order to get the next path\n const [[, innerTextNodePath]] = Editor.nodes(editor, {\n at: nodePath,\n match: matchList\n });\n const nextPath = Path.next(innerTextNodePath);\n const copiedChildren = [];\n\n let count = 1;\n // Copy the children from the parent list that are below the list item we are un nesting\n for (let i = node.order; i < parentList.children.length; i += 1) {\n copiedChildren.push({\n ...parentList.children[i],\n parentId: node.id,\n order: count\n });\n count += 1;\n }\n\n // Insert a new list with the copied children into the un nested list item\n Transforms.insertNodes(\n editor,\n {\n type: parentList.type,\n children: [...copiedChildren]\n },\n { at: nextPath }\n );\n\n const [[newParentList, newParentListPath]] = Editor.nodes(editor, {\n at: editor.selection?.anchor.path || undefined,\n match: matchList,\n mode: 'lowest'\n });\n\n let order = 0;\n // Set the nodes below the list item being un nested\n Transforms.setNodes<CosmosCustom.ListItemElement>(\n editor,\n {\n parentId: node.id,\n order\n },\n {\n match: n => {\n if (!matchListItem(n)) return false;\n\n if (n.parentId === node.id) order += 1;\n return n.parentId === node.id;\n }\n }\n );\n\n // Removing all old nodes from that were under the un nested item\n for (let i = newParentList.children.length - 1; i >= node.order; i -= 1) {\n const childPath = [...newParentListPath, i];\n Transforms.removeNodes(editor, { at: childPath, match: matchListItem });\n }\n }\n\n // Lift the current node at the users selection out of it's parent node twice\n Transforms.liftNodes(editor, { match: matchListItem });\n Transforms.liftNodes(editor, { match: matchListItem });\n }\n }\n};\n\nexport default commands;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"htmlConverter.d.ts","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/htmlConverter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"htmlConverter.d.ts","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/htmlConverter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAY9D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;CAkBjB,CAAC;AAGX,eAAO,MAAM,oBAAoB;;;;;CAKvB,CAAC;AAgIX,eAAO,MAAM,WAAW,SAChB,MAAM,yBACW,mBAAmB,CAAC,sBAAsB,CAAC,KACjE,CAAC,aAAa,GAAG,UAAU,CAAC,EAe9B,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { parse } from 'parse5';
|
|
|
2
2
|
import parseTextToCustomSlateNodes from './interactionRenderer';
|
|
3
3
|
const checkElement = (node) => !!node && node.nodeName !== '#text' && node.nodeName !== '#comment';
|
|
4
4
|
const checkTextNode = (node) => !!node && node.nodeName === '#text';
|
|
5
|
+
const checkComment = (node) => !!node && node.nodeName === '#comment';
|
|
5
6
|
// Mapping of HTML tags to slate types. b, del, i, and a tags are labeled as skip because they need special logic
|
|
6
7
|
export const htmlToSlateMap = {
|
|
7
8
|
h1: 'heading-1',
|
|
@@ -68,6 +69,14 @@ const getAttributes = (node) => {
|
|
|
68
69
|
};
|
|
69
70
|
const getSlateNode = (node, parentNode, interactionRenderers) => {
|
|
70
71
|
if (checkTextNode(node)) {
|
|
72
|
+
if (node.parentNode.nodeName === 'body') {
|
|
73
|
+
return {
|
|
74
|
+
node: {
|
|
75
|
+
type: 'paragraph',
|
|
76
|
+
children: [{ text: node.value }]
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
71
80
|
// Make sure to spread any parent style attributes for slates text nodes
|
|
72
81
|
const children = parseTextToCustomSlateNodes(node.value, interactionRenderers);
|
|
73
82
|
if (children.length === 1) {
|
|
@@ -98,34 +107,49 @@ const getSlateNode = (node, parentNode, interactionRenderers) => {
|
|
|
98
107
|
};
|
|
99
108
|
}
|
|
100
109
|
const attributes = getAttributes(node);
|
|
101
|
-
const nodeObj = {
|
|
110
|
+
const nodeObj = {
|
|
111
|
+
type: type || 'paragraph',
|
|
112
|
+
...attributes,
|
|
113
|
+
children: [{ text: '' }]
|
|
114
|
+
};
|
|
102
115
|
return { node: nodeObj };
|
|
103
116
|
};
|
|
104
117
|
// Recursive function that will convert Parse5Nodes into Slate compatible nodes
|
|
105
118
|
const convertNodes = (nodes, parentNode, interactionRenderers) => {
|
|
106
|
-
|
|
119
|
+
const returnNodes = [];
|
|
120
|
+
nodes.forEach(node => {
|
|
107
121
|
const { node: slateNode, collapseNext } = getSlateNode(node, parentNode, interactionRenderers);
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
if (
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
122
|
+
if (!checkComment(node)) {
|
|
123
|
+
let returnNode = slateNode;
|
|
124
|
+
if (checkElement(node) && node.childNodes && node.childNodes.length) {
|
|
125
|
+
if (collapseNext) {
|
|
126
|
+
returnNode = convertNodes(node.childNodes, slateNode, interactionRenderers)[0];
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
slateNode.children = convertNodes(node.childNodes, undefined, interactionRenderers);
|
|
130
|
+
returnNode = slateNode;
|
|
131
|
+
}
|
|
116
132
|
}
|
|
133
|
+
returnNodes.push(returnNode);
|
|
117
134
|
}
|
|
118
|
-
return returnNode;
|
|
119
135
|
});
|
|
136
|
+
return returnNodes;
|
|
120
137
|
};
|
|
138
|
+
const defaultValue = [{ type: 'paragraph', children: [{ text: '' }] }];
|
|
121
139
|
export const convertHtml = (html, interactionRenderers) => {
|
|
122
|
-
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
140
|
+
// Wrap the html in another body in case the value given has no body
|
|
141
|
+
const doc = parse(`<body>${html}</body>`);
|
|
142
|
+
let nodesToConvert = doc.childNodes;
|
|
143
|
+
// If we have a root tag
|
|
144
|
+
if (doc.childNodes.length === 1) {
|
|
145
|
+
const root = doc.childNodes[0];
|
|
146
|
+
if (!checkElement(root))
|
|
147
|
+
return defaultValue;
|
|
148
|
+
const body = root.childNodes[1];
|
|
149
|
+
if (!checkElement(body))
|
|
150
|
+
return defaultValue;
|
|
151
|
+
nodesToConvert = body.childNodes;
|
|
152
|
+
}
|
|
153
|
+
return convertNodes(nodesToConvert, undefined, interactionRenderers);
|
|
130
154
|
};
|
|
131
155
|
//# sourceMappingURL=htmlConverter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"htmlConverter.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/htmlConverter.ts"],"names":[],"mappings":"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","sourcesContent":["import { parse } from 'parse5';\n// Use namespaced types to more easily differentiate between similar types (ie, ChildNode from parse5 and Node from slate).\nimport type * as parse5 from 'parse5';\nimport type * as slate from 'slate';\n\nimport { RichTextViewerProps } from '../RichTextViewer.types';\n\nimport parseTextToCustomSlateNodes from './interactionRenderer';\n\nconst checkElement = (node: parse5.ChildNode | undefined): node is parse5.Element =>\n !!node && node.nodeName !== '#text' && node.nodeName !== '#comment';\nconst checkTextNode = (node: parse5.ChildNode | undefined): node is parse5.TextNode =>\n !!node && node.nodeName === '#text';\n\n// Mapping of HTML tags to slate types. b, del, i, and a tags are labeled as skip because they need special logic\nexport const htmlToSlateMap = {\n h1: 'heading-1',\n h2: 'heading-2',\n h3: 'heading-3',\n h4: 'heading-4',\n ul: 'unordered-list',\n ol: 'ordered-list',\n li: 'list-item',\n table: 'table',\n tr: 'table-row',\n td: 'table-cell',\n tbody: 'table-body',\n p: 'paragraph',\n img: 'image',\n b: 'skip',\n del: 'skip',\n i: 'skip',\n a: 'skip'\n} as const;\n\n// Inline HTML tags to slate types\nexport const inlineHtmlToStyleMap = {\n b: 'bold',\n del: 'line-through',\n i: 'italic',\n a: 'href'\n} as const;\n\n// Maps HTML Attributes to an object. Right now this is specifically used for list items.\nconst getAttributes = (node: parse5.ChildNode) => {\n if (checkElement(node) && node.attrs.length) {\n switch (node.nodeName) {\n case 'li':\n return Object.fromEntries(\n node.attrs.flatMap(attr => {\n // eslint-disable-next-line sonarjs/no-nested-switch\n switch (attr.name) {\n case 'data-id':\n return [['id', attr.value]];\n case 'data-parent-id':\n return [['parentId', attr.value]];\n case 'data-level':\n return [['level', attr.value]];\n case 'data-order':\n return [['order', attr.value]];\n default:\n return [];\n }\n })\n );\n case 'img': {\n const imgAttrs = ['src', 'alt'];\n const attrsObj: { [key: string]: string } = {};\n for (let i = 0; i < node.attrs.length; i += 1) {\n const { name, value } = node.attrs[i];\n if (imgAttrs.includes(name)) {\n attrsObj[name] = value;\n }\n }\n return attrsObj;\n }\n default:\n return {};\n }\n }\n return {};\n};\n\nconst getSlateNode = (\n node: parse5.ChildNode,\n parentNode?: slate.Element | slate.Text,\n interactionRenderers?: RichTextViewerProps['interactionRenderers']\n): { node: slate.Element | slate.Text; collapseNext?: boolean } => {\n if (checkTextNode(node)) {\n // Make sure to spread any parent style attributes for slates text nodes\n const children = parseTextToCustomSlateNodes(node.value, interactionRenderers);\n if (children.length === 1) {\n return { node: { ...parentNode, ...children[0] } as slate.Text };\n }\n return {\n node: {\n ...parentNode,\n children\n } as slate.Element\n };\n }\n\n const type = htmlToSlateMap[node.nodeName as keyof typeof htmlToSlateMap];\n /*\n If the type of the HTML tag is an inline (b, i, del, a) we want to let the recursive function know\n that it needs to collapse the next node, also we are setting the correct style mark to true\n */\n if (type === 'skip') {\n const style = inlineHtmlToStyleMap[node.nodeName as 'b' | 'i' | 'del' | 'a'];\n let value: string | boolean = true;\n if (node.nodeName === 'a') {\n const hrefObj = node.attrs?.find(attr => attr.name === 'href');\n value = hrefObj ? hrefObj.value : value;\n }\n return {\n node: { ...parentNode, [style]: value, text: '' } as slate.Text,\n collapseNext: true\n };\n }\n\n const attributes = getAttributes(node);\n const nodeObj = { type, ...attributes, children: [{ text: '' }] } as slate.Element;\n return { node: nodeObj };\n};\n\n// Recursive function that will convert Parse5Nodes into Slate compatible nodes\nconst convertNodes = (\n nodes: parse5.ChildNode[],\n parentNode?: slate.Element | slate.Text,\n interactionRenderers?: RichTextViewerProps['interactionRenderers']\n): (slate.Element | slate.Text)[] => {\n return nodes.map(node => {\n const { node: slateNode, collapseNext } = getSlateNode(node, parentNode, interactionRenderers);\n let returnNode = slateNode;\n if (checkElement(node) && node.childNodes && node.childNodes.length) {\n if (collapseNext) {\n returnNode = convertNodes(node.childNodes, slateNode, interactionRenderers)[0];\n } else {\n (slateNode as slate.Element).children = convertNodes(\n node.childNodes,\n undefined,\n interactionRenderers\n );\n returnNode = slateNode;\n }\n }\n\n return returnNode;\n });\n};\n\nexport const convertHtml = (\n html: string,\n interactionRenderers?: RichTextViewerProps['interactionRenderers']\n): (slate.Element | slate.Text)[] => {\n const doc = parse(html);\n\n const root = doc.childNodes[0];\n if (!checkElement(root)) return [];\n\n const body = root.childNodes[1];\n if (!checkElement(body)) return [];\n\n return convertNodes(body.childNodes, undefined, interactionRenderers);\n};\n"]}
|
|
1
|
+
{"version":3,"file":"htmlConverter.js","sourceRoot":"","sources":["../../../../src/components/RichTextEditor/utils/htmlConverter.ts"],"names":[],"mappings":"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","sourcesContent":["import { parse } from 'parse5';\n// Use namespaced types to more easily differentiate between similar types (ie, ChildNode from parse5 and Node from slate).\nimport type * as parse5 from 'parse5';\nimport type * as slate from 'slate';\n\nimport { RichTextViewerProps } from '../RichTextViewer.types';\n\nimport parseTextToCustomSlateNodes from './interactionRenderer';\n\nconst checkElement = (node: parse5.ChildNode | undefined): node is parse5.Element =>\n !!node && node.nodeName !== '#text' && node.nodeName !== '#comment';\nconst checkTextNode = (node: parse5.ChildNode | undefined): node is parse5.TextNode =>\n !!node && node.nodeName === '#text';\nconst checkComment = (node: parse5.ChildNode | undefined): node is parse5.TextNode =>\n !!node && node.nodeName === '#comment';\n\n// Mapping of HTML tags to slate types. b, del, i, and a tags are labeled as skip because they need special logic\nexport const htmlToSlateMap = {\n h1: 'heading-1',\n h2: 'heading-2',\n h3: 'heading-3',\n h4: 'heading-4',\n ul: 'unordered-list',\n ol: 'ordered-list',\n li: 'list-item',\n table: 'table',\n tr: 'table-row',\n td: 'table-cell',\n tbody: 'table-body',\n p: 'paragraph',\n img: 'image',\n b: 'skip',\n del: 'skip',\n i: 'skip',\n a: 'skip'\n} as const;\n\n// Inline HTML tags to slate types\nexport const inlineHtmlToStyleMap = {\n b: 'bold',\n del: 'line-through',\n i: 'italic',\n a: 'href'\n} as const;\n\n// Maps HTML Attributes to an object. Right now this is specifically used for list items.\nconst getAttributes = (node: parse5.ChildNode) => {\n if (checkElement(node) && node.attrs.length) {\n switch (node.nodeName) {\n case 'li':\n return Object.fromEntries(\n node.attrs.flatMap(attr => {\n // eslint-disable-next-line sonarjs/no-nested-switch\n switch (attr.name) {\n case 'data-id':\n return [['id', attr.value]];\n case 'data-parent-id':\n return [['parentId', attr.value]];\n case 'data-level':\n return [['level', attr.value]];\n case 'data-order':\n return [['order', attr.value]];\n default:\n return [];\n }\n })\n );\n case 'img': {\n const imgAttrs = ['src', 'alt'];\n const attrsObj: { [key: string]: string } = {};\n for (let i = 0; i < node.attrs.length; i += 1) {\n const { name, value } = node.attrs[i];\n if (imgAttrs.includes(name)) {\n attrsObj[name] = value;\n }\n }\n return attrsObj;\n }\n default:\n return {};\n }\n }\n return {};\n};\n\nconst getSlateNode = (\n node: parse5.ChildNode,\n parentNode?: slate.Element | slate.Text,\n interactionRenderers?: RichTextViewerProps['interactionRenderers']\n): { node: slate.Element | slate.Text; collapseNext?: boolean } => {\n if (checkTextNode(node)) {\n if (node.parentNode.nodeName === 'body') {\n return {\n node: {\n type: 'paragraph',\n children: [{ text: node.value }]\n }\n };\n }\n // Make sure to spread any parent style attributes for slates text nodes\n const children = parseTextToCustomSlateNodes(node.value, interactionRenderers);\n if (children.length === 1) {\n return { node: { ...parentNode, ...children[0] } as slate.Text };\n }\n return {\n node: {\n ...parentNode,\n children\n } as slate.Element\n };\n }\n\n const type = htmlToSlateMap[node.nodeName as keyof typeof htmlToSlateMap];\n /*\n If the type of the HTML tag is an inline (b, i, del, a) we want to let the recursive function know\n that it needs to collapse the next node, also we are setting the correct style mark to true\n */\n if (type === 'skip') {\n const style = inlineHtmlToStyleMap[node.nodeName as 'b' | 'i' | 'del' | 'a'];\n let value: string | boolean = true;\n if (node.nodeName === 'a') {\n const hrefObj = node.attrs?.find(attr => attr.name === 'href');\n value = hrefObj ? hrefObj.value : value;\n }\n return {\n node: { ...parentNode, [style]: value, text: '' } as slate.Text,\n collapseNext: true\n };\n }\n\n const attributes = getAttributes(node);\n const nodeObj = {\n type: type || 'paragraph',\n ...attributes,\n children: [{ text: '' }]\n } as slate.Element;\n return { node: nodeObj };\n};\n\n// Recursive function that will convert Parse5Nodes into Slate compatible nodes\nconst convertNodes = (\n nodes: parse5.ChildNode[],\n parentNode?: slate.Element | slate.Text,\n interactionRenderers?: RichTextViewerProps['interactionRenderers']\n): (slate.Element | slate.Text)[] => {\n const returnNodes: (slate.Element | slate.Text)[] = [];\n nodes.forEach(node => {\n const { node: slateNode, collapseNext } = getSlateNode(node, parentNode, interactionRenderers);\n if (!checkComment(node)) {\n let returnNode = slateNode;\n if (checkElement(node) && node.childNodes && node.childNodes.length) {\n if (collapseNext) {\n returnNode = convertNodes(node.childNodes, slateNode, interactionRenderers)[0];\n } else {\n (slateNode as slate.Element).children = convertNodes(\n node.childNodes,\n undefined,\n interactionRenderers\n );\n returnNode = slateNode;\n }\n }\n\n returnNodes.push(returnNode);\n }\n });\n return returnNodes;\n};\n\nconst defaultValue = [{ type: 'paragraph', children: [{ text: '' }] } as slate.Element];\n\nexport const convertHtml = (\n html: string,\n interactionRenderers?: RichTextViewerProps['interactionRenderers']\n): (slate.Element | slate.Text)[] => {\n // Wrap the html in another body in case the value given has no body\n const doc = parse(`<body>${html}</body>`);\n let nodesToConvert = doc.childNodes;\n // If we have a root tag\n if (doc.childNodes.length === 1) {\n const root = doc.childNodes[0];\n if (!checkElement(root)) return defaultValue;\n\n const body = root.childNodes[1];\n if (!checkElement(body)) return defaultValue;\n\n nodesToConvert = body.childNodes;\n }\n return convertNodes(nodesToConvert, undefined, interactionRenderers);\n};\n"]}
|