@pie-lib/editable-html-tip-tap 2.1.12-next.55 → 2.1.12-next.59
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.
|
@@ -78,13 +78,24 @@ var cssVariables = {
|
|
|
78
78
|
'--shadow': "0px 12px 33px 0px rgba(0, 0, 0, .06),\n 0px 3.618px 9.949px 0px rgba(0, 0, 0, .04)"
|
|
79
79
|
};
|
|
80
80
|
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
|
|
81
|
+
// Attributes PIE puts on the editor's contenteditable element.
|
|
82
|
+
//
|
|
83
|
+
// ProseMirror rebuilds the element's attribute set from editorProps.attributes on every view
|
|
84
|
+
// update and removes anything no longer listed, and Tiptap merges its own role="textbox" only in
|
|
85
|
+
// createView - not into editor.options, which is what setOptions re-pushes. So every attribute we
|
|
86
|
+
// want to survive has to be listed here. See PIE-1015.
|
|
87
|
+
var editorAttributes = function editorAttributes(spellCheckEnabled) {
|
|
84
88
|
return {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
89
|
+
// Tiptap's own attribute, re-declared so it survives setOptions. setEditable alone re-pushes
|
|
90
|
+
// editorProps on every mount, which is what removed it in 2.1.17.
|
|
91
|
+
role: 'textbox',
|
|
92
|
+
// PIE-owned hook for external consumers - see PIE-1016. Query [data-pie-editor], or
|
|
93
|
+
// [data-pie-editor][contenteditable="true"] to skip read-only renders.
|
|
94
|
+
'data-pie-editor': 'true',
|
|
95
|
+
// Without these the browser spellchecks the editor regardless of the spellCheck prop.
|
|
96
|
+
spellcheck: spellCheckEnabled ? 'true' : 'false',
|
|
97
|
+
autocorrect: spellCheckEnabled ? 'on' : 'off',
|
|
98
|
+
autocapitalize: spellCheckEnabled ? 'on' : 'off'
|
|
88
99
|
};
|
|
89
100
|
};
|
|
90
101
|
var EditableHtml = exports.EditableHtml = function EditableHtml(props) {
|
|
@@ -260,7 +271,7 @@ var EditableHtml = exports.EditableHtml = function EditableHtml(props) {
|
|
|
260
271
|
extensions: extensions,
|
|
261
272
|
immediatelyRender: false,
|
|
262
273
|
editorProps: {
|
|
263
|
-
attributes:
|
|
274
|
+
attributes: editorAttributes(spellCheckEnabled),
|
|
264
275
|
handleKeyDown: function handleKeyDown(view, event) {
|
|
265
276
|
if (props.onKeyDown) {
|
|
266
277
|
return props.onKeyDown(event);
|
|
@@ -300,15 +311,16 @@ var EditableHtml = exports.EditableHtml = function EditableHtml(props) {
|
|
|
300
311
|
|
|
301
312
|
// useEditor only re-applies options on its own when it is called with an empty dependency
|
|
302
313
|
// array, and this call site depends on charactersLimit, so a spellCheck change on a mounted
|
|
303
|
-
// editor has to be pushed in.
|
|
304
|
-
//
|
|
314
|
+
// editor has to be pushed in. The rest of editorProps stays as the editor already has it, and
|
|
315
|
+
// the attributes are merged rather than replaced so an attribute contributed by Tiptap or an
|
|
316
|
+
// extension can't be dropped the way role="textbox" was - see PIE-1015.
|
|
305
317
|
(0, _react.useEffect)(function () {
|
|
306
318
|
var _editor$options, _currentEditorProps$a;
|
|
307
319
|
if (!editor) {
|
|
308
320
|
return;
|
|
309
321
|
}
|
|
310
322
|
var currentEditorProps = (_editor$options = editor.options) === null || _editor$options === void 0 ? void 0 : _editor$options.editorProps;
|
|
311
|
-
var attributes =
|
|
323
|
+
var attributes = _objectSpread(_objectSpread({}, currentEditorProps === null || currentEditorProps === void 0 ? void 0 : currentEditorProps.attributes), editorAttributes(spellCheckEnabled));
|
|
312
324
|
if ((currentEditorProps === null || currentEditorProps === void 0 || (_currentEditorProps$a = currentEditorProps.attributes) === null || _currentEditorProps$a === void 0 ? void 0 : _currentEditorProps$a.spellcheck) === attributes.spellcheck) {
|
|
313
325
|
return;
|
|
314
326
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditableHtml.js","names":["_react","_interopRequireWildcard","require","_debounce","_interopRequireDefault","_react2","_styles","_starterKit","_extensionTextStyle","_extensionCharacterCount","_extensionSuperscript","_extensionSubscript","_extensionTextAlign","_extensionImage","_extensionPlaceholder","_helper","_extendedTable","_extendedTableCell","_divNode","_ensureEmptyRootDiv","_ensureListItemContentIsDiv","_extensionTableRow","_responseArea","_math","_image","_media","_css","_extendedListItem","_headingParagraph","_TiptapContainer","_size","_extensions","_excluded","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defaultToolbarOpts","position","alignment","alwaysVisible","showDone","doneOn","defaultResponseAreaProps","options","respAreaToolbar","onHandleAreaChange","DEFAULT_ACTIVE_PLUGINS","cssVariables","spellCheckAttributes","enabled","spellcheck","autocorrect","autocapitalize","EditableHtml","exports","props","_props$pluginProps","_ref","pluginProps","showParagraphs","separateParagraphs","_useState","useState","_useState2","_slicedToArray2","pendingImages","setPendingImages","_useState3","_useState4","scheduled","setScheduled","toolbarOpts","removePendingImage","useCallback","imagePos","prev","next","img","pos","toolbarOptsToUse","commitEditorContent","editor","html","getHTML","markup","_props$onChange","onChange","_props$onDone","onDone","responseAreaPropsToUse","useMemo","responseAreaProps","onInlineDropdownToolbarClose","activePluginsToUse","_ref3","_ref2","customPlugins","otherPluginProps","_objectWithoutProperties2","filteredActivePlugins","activePlugins","pluginName","nameToUse","PLUGINS_MAP","pluginInfo","disabled","buildExtensions","math","textAlign","extraCSSRules","image","imageSupport","toolbar","table","responseArea","type","languageCharacters","languageCharactersProps","keyPadCharacterRef","setKeypadInteraction","media","extensions","TextAlign","configure","types","alignments","TextStyleKit","CharacterCount","limit","charactersLimit","StarterKit","trailingNode","node","notAfter","link","autolink","linkOnPaste","ExtendedListItem","DivNode","HeadingParagraph","EnsureEmptyRootIsDiv","EnsureListItemContentIsDiv","Placeholder","placeholder","showOnlyWhenEditable","showOnlyCurrent","includeChildren","ExtendedTable","TableRow","ExtendedTableHeader","ExtendedTableCell","ResponseAreaExtension","ExplicitConstructedResponseNode","DragInTheBlankNode","InlineDropdownNode","MathTemplatedNode","MathNode","SubScript","SuperScript","Image","ImageUploadNode","imageHandling","disableImageAlignmentButtons","_props$onDone2","onDelete","src","attrs","insertImageRequested","imageInfo","getHandler","_imageInfo","addedImage","onFinish","result","_cb","cb","callback","handler","focusHandler","debounce","detach","window","removeEventListener","_insertingImage","addEventListener","add","concat","_toConsumableArray2","maxImageWidth","maxImageHeight","Media","uploadSoundSupport","CSSMark","spellCheckEnabled","spellCheck","useEditor","immediatelyRender","editorProps","attributes","handleKeyDown","view","event","onKeyDown","editable","content","normalizeInitialMarkup","onUpdate","_ref4","transaction","isDone","_props$onChange2","onBlur","_ref5","otherToolbarOpened","_toolbarOpened","isActive","schema","useEffect","editorRef","setEditable","_editor$options","_currentEditorProps$a","currentEditorProps","setOptions","nextMarkup","commands","setContent","emitUpdate","entries","_ref6","_ref7","key","value","document","documentElement","style","setProperty","editorState","useEditorState","selector","ctx","_ctx$editor","isFocused","sizeStyle","minWidth","width","maxWidth","minHeight","height","maxHeight","valueToSize","createElement","_extends2","StyledEditorContent","showParagraph","separateParagraph","styled","EditorContent","shouldForwardProp","prop","includes","_ref8","display","outline","flex","padding","margin","left","top","color","pointerEvents","whiteSpace","fontSize","marginBottom","_default"],"sources":["../../src/components/EditableHtml.jsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport debounce from 'lodash-es/debounce';\nimport { EditorContent, useEditor, useEditorState } from '@tiptap/react';\nimport { styled } from '@mui/material/styles';\nimport StarterKit from '@tiptap/starter-kit';\nimport { TextStyleKit } from '@tiptap/extension-text-style';\nimport { CharacterCount } from '@tiptap/extension-character-count';\nimport SuperScript from '@tiptap/extension-superscript';\nimport SubScript from '@tiptap/extension-subscript';\nimport TextAlign from '@tiptap/extension-text-align';\nimport Image from '@tiptap/extension-image';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { normalizeInitialMarkup } from '../utils/helper';\n\nimport ExtendedTable from '../extensions/extended-table';\nimport { ExtendedTableCell, ExtendedTableHeader } from '../extensions/extended-table-cell';\nimport { DivNode } from '../extensions/div-node';\nimport { EnsureEmptyRootIsDiv } from '../extensions/ensure-empty-root-div';\nimport { EnsureListItemContentIsDiv } from '../extensions/ensure-list-item-content-is-div';\nimport { TableRow } from '@tiptap/extension-table-row';\nimport {\n DragInTheBlankNode,\n ExplicitConstructedResponseNode,\n InlineDropdownNode,\n MathTemplatedNode,\n ResponseAreaExtension,\n} from '../extensions/responseArea';\nimport { MathNode } from '../extensions/math';\nimport { ImageUploadNode } from '../extensions/image';\nimport { Media } from '../extensions/media';\nimport { CSSMark } from '../extensions/css';\nimport { ExtendedListItem } from '../extensions/extended-list-item';\nimport { HeadingParagraph } from '../extensions/heading-paragraph';\n\nimport EditorContainer from './TiptapContainer';\nimport { valueToSize } from '../utils/size';\nimport { buildExtensions, PLUGINS_MAP } from '../extensions';\n\nconst defaultToolbarOpts = {\n position: 'bottom',\n alignment: 'left',\n alwaysVisible: false,\n showDone: true,\n doneOn: 'blur',\n};\n\nconst defaultResponseAreaProps = {\n options: {},\n respAreaToolbar: () => {},\n onHandleAreaChange: () => {},\n};\n\nconst DEFAULT_ACTIVE_PLUGINS = [\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'code',\n 'bulleted-list',\n 'numbered-list',\n 'image',\n 'math',\n 'languageCharacters',\n 'text-align',\n 'table',\n 'video',\n 'audio',\n 'responseArea',\n 'superscript',\n 'subscript',\n 'css',\n 'h3',\n 'undo',\n 'redo',\n];\n\nconst cssVariables = {\n '--white': '#fff',\n '--black': '#2e2b29',\n '--black-contrast': '#110f0e',\n '--gray-1': 'rgba(61, 37, 20, .05)',\n '--gray-2': 'rgba(61, 37, 20, .08)',\n '--gray-3': 'rgba(61, 37, 20, .12)',\n '--gray-4': 'rgba(53, 38, 28, .3)',\n '--gray-5': 'rgba(28, 25, 23, .6)',\n '--green': '#22c55e',\n '--purple': '#6a00f5',\n '--purple-contrast': '#5800cc',\n '--purple-light': 'rgba(88, 5, 255, .05)',\n '--yellow-contrast': '#facc15',\n '--yellow': 'rgba(250, 204, 21, .4)',\n '--yellow-light': '#fffae5',\n '--red': '#ff5c33',\n '--red-light': '#ffebe5',\n '--shadow': `0px 12px 33px 0px rgba(0, 0, 0, .06),\n 0px 3.618px 9.949px 0px rgba(0, 0, 0, .04)`,\n};\n\n// ProseMirror puts these on the contenteditable element. Without them the browser\n// spellchecks the editor regardless of the spellCheck prop.\nconst spellCheckAttributes = (enabled) => ({\n spellcheck: enabled ? 'true' : 'false',\n autocorrect: enabled ? 'on' : 'off',\n autocapitalize: enabled ? 'on' : 'off',\n});\n\nexport const EditableHtml = (props) => {\n const { showParagraphs, separateParagraphs } = props.pluginProps || {};\n const [pendingImages, setPendingImages] = useState([]);\n const [scheduled, setScheduled] = useState(false);\n const { toolbarOpts } = props;\n\n const removePendingImage = useCallback(\n (imagePos) => {\n setPendingImages((prev) => {\n const next = prev.filter((img) => img.pos !== imagePos);\n if (next.length === 0) {\n setScheduled(false);\n }\n return next;\n });\n },\n [setPendingImages],\n );\n\n const toolbarOptsToUse = {\n ...defaultToolbarOpts,\n ...toolbarOpts,\n };\n\n const commitEditorContent = useCallback(\n (editor) => {\n const html = editor.getHTML();\n\n if (props.markup !== html) {\n props.onChange?.(html);\n }\n\n if (toolbarOptsToUse.doneOn === 'blur') {\n props.onDone?.(html);\n }\n },\n [props.markup, props.onChange, props.onDone, toolbarOptsToUse.doneOn],\n );\n\n const responseAreaPropsToUse = useMemo(\n () => ({\n ...defaultResponseAreaProps,\n ...props.responseAreaProps,\n onInlineDropdownToolbarClose: commitEditorContent,\n }),\n [props.responseAreaProps, commitEditorContent],\n );\n\n const activePluginsToUse = useMemo(() => {\n let { customPlugins, ...otherPluginProps } = props.pluginProps || {};\n\n customPlugins = customPlugins || [];\n\n const filteredActivePlugins = (props.activePlugins || DEFAULT_ACTIVE_PLUGINS)?.filter((pluginName) => {\n const nameToUse = PLUGINS_MAP[pluginName] || pluginName;\n const pluginInfo = otherPluginProps[nameToUse] || {};\n\n return !pluginInfo || !pluginInfo.disabled;\n });\n\n return buildExtensions(filteredActivePlugins, customPlugins, {\n math: {},\n textAlign: props.textAlign,\n html: {},\n extraCSSRules: props.extraCSSRules || {},\n image: {\n ...props.imageSupport,\n },\n toolbar: {},\n table: {},\n responseArea: {\n type: responseAreaPropsToUse.type,\n },\n languageCharacters: props.languageCharactersProps,\n keyPadCharacterRef: {},\n setKeypadInteraction: {},\n media: {},\n });\n }, [props, responseAreaPropsToUse.type]);\n\n const extensions = [\n TextAlign.configure({\n types: ['heading', 'paragraph', 'div', 'headingParagraph', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'td', 'th'],\n alignments: ['left', 'right', 'center', 'justify'],\n }),\n TextStyleKit,\n CharacterCount.configure({\n limit: props.charactersLimit || 1000000,\n }),\n StarterKit.configure({\n trailingNode: {\n node: 'paragraph',\n notAfter: ['paragraph', 'div'],\n },\n // StarterKit bundles the link extension, which turns anything that looks like a URL into\n // a hyperlink as it is typed or pasted. See PIE-980 - we don't want that in any editor.\n // The mark itself stays registered so links already in the markup keep round-tripping.\n link: {\n autolink: false,\n linkOnPaste: false,\n },\n }),\n ExtendedListItem,\n DivNode,\n HeadingParagraph,\n EnsureEmptyRootIsDiv,\n EnsureListItemContentIsDiv,\n Placeholder.configure({\n placeholder: props.placeholder,\n // show placeholder even when editor is focused\n showOnlyWhenEditable: true,\n showOnlyCurrent: false, // show on all empty nodes, not only the current one\n includeChildren: true,\n }),\n ExtendedTable,\n TableRow,\n ExtendedTableHeader,\n ExtendedTableCell,\n ResponseAreaExtension.configure(responseAreaPropsToUse),\n ExplicitConstructedResponseNode.configure(responseAreaPropsToUse),\n DragInTheBlankNode.configure(responseAreaPropsToUse),\n InlineDropdownNode.configure(responseAreaPropsToUse),\n MathTemplatedNode.configure(responseAreaPropsToUse),\n MathNode.configure({\n toolbarOpts: toolbarOptsToUse,\n math: props.pluginProps?.math || {},\n }),\n SubScript,\n SuperScript,\n Image,\n ImageUploadNode.configure({\n toolbarOpts: toolbarOptsToUse,\n imageHandling: {\n disableImageAlignmentButtons: props.disableImageAlignmentButtons,\n onDone: (editor) => props.onDone?.(editor.getHTML()),\n onDelete:\n props.imageSupport &&\n props.imageSupport.delete &&\n ((node) => {\n const { src } = node.attrs;\n\n props.imageSupport.delete(src, (e) => {\n removePendingImage(node.pos);\n });\n }),\n insertImageRequested:\n props.imageSupport &&\n ((editor, imageInfo, getHandler) => {\n const [addedImage, pos] = imageInfo;\n\n const onFinish = (result) => {\n let cb;\n\n if (scheduled && result) {\n // finish editing only on success\n cb = props.onChange;\n }\n\n removePendingImage(pos);\n cb?.(editor.getHTML());\n };\n\n const callback = () => {\n /**\n * The handler is the object through which the outer context\n * communicates file upload events like: fileChosen, cancel, progress\n */\n const handler = getHandler(onFinish);\n\n // If the user closes the file picker without choosing a file, the window regains\n // focus while _insertingImage is still true — drop the stale pending entry.\n const focusHandler = debounce(() => {\n const detach = () => window.removeEventListener('focus', focusHandler);\n\n if (!editor._insertingImage) {\n detach();\n return;\n }\n\n removePendingImage(pos);\n editor._insertingImage = false;\n detach();\n }, 500);\n\n window.addEventListener('focus', focusHandler);\n\n props.imageSupport.add(handler);\n };\n\n editor._insertingImage = true;\n setPendingImages((prev) => [...prev, addedImage]);\n callback();\n }),\n maxImageWidth: props.maxImageWidth,\n maxImageHeight: props.maxImageHeight,\n },\n limit: 3,\n }),\n Media.configure({\n uploadSoundSupport: props.uploadSoundSupport,\n }),\n CSSMark.configure({\n extraCSSRules: props.extraCSSRules,\n }),\n ];\n\n // Callers that don't pass spellCheck keep the browser default (on), as they did with the\n // slate-based editor. Players that have to default to off - extended-text-entry, see\n // PIE-978 - resolve that in their controller and pass an explicit false.\n const spellCheckEnabled = props.spellCheck !== false;\n\n const editor = useEditor(\n {\n extensions,\n immediatelyRender: false,\n editorProps: {\n attributes: spellCheckAttributes(spellCheckEnabled),\n handleKeyDown(view, event) {\n if (props.onKeyDown) {\n return props.onKeyDown(event);\n }\n\n // Return false to let default behavior continue\n return false;\n },\n },\n editable: !props.disabled,\n content: normalizeInitialMarkup(props.markup),\n onUpdate: ({ editor, transaction }) => {\n if (transaction.isDone) {\n props.onChange?.(editor.getHTML());\n }\n },\n onBlur: ({ editor }) => {\n const otherToolbarOpened =\n editor._insertingImage ||\n editor._toolbarOpened ||\n editor.isActive('inline_dropdown') ||\n editor.isActive('explicit_constructed_response');\n\n if (otherToolbarOpened || !editor.schema) {\n return;\n }\n\n commitEditorContent(editor);\n },\n },\n [props.charactersLimit],\n );\n\n useEffect(() => {\n if (props.editorRef) {\n props.editorRef(editor);\n }\n }, [props.editorRef, editor]);\n\n useEffect(() => {\n editor?.setEditable(!props.disabled);\n }, [props.disabled, editor]);\n\n // useEditor only re-applies options on its own when it is called with an empty dependency\n // array, and this call site depends on charactersLimit, so a spellCheck change on a mounted\n // editor has to be pushed in. Only the attributes are replaced - the rest of editorProps\n // stays as the editor already has it.\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const currentEditorProps = editor.options?.editorProps;\n const attributes = spellCheckAttributes(spellCheckEnabled);\n\n if (currentEditorProps?.attributes?.spellcheck === attributes.spellcheck) {\n return;\n }\n\n editor.setOptions({ editorProps: { ...currentEditorProps, attributes } });\n }, [spellCheckEnabled, editor]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n const nextMarkup = normalizeInitialMarkup(props.markup);\n\n if (nextMarkup !== editor.getHTML()) {\n editor.commands.setContent(nextMarkup, { emitUpdate: false });\n }\n }, [props.markup, editor]);\n\n useEffect(() => {\n Object.entries(cssVariables).forEach(([key, value]) => {\n document.documentElement.style.setProperty(key, value);\n });\n }, []);\n\n const editorState = useEditorState({\n editor,\n selector: (ctx) => ({\n isFocused: ctx.editor?.isFocused,\n }),\n });\n\n const sizeStyle = useMemo(() => {\n const { minWidth, width, maxWidth, minHeight, height, maxHeight } = props;\n\n return {\n width: valueToSize(width),\n minWidth: valueToSize(minWidth),\n maxWidth: valueToSize(maxWidth),\n height: valueToSize(height),\n minHeight: valueToSize(minHeight),\n maxHeight: valueToSize(maxHeight),\n };\n }, [props]);\n\n return (\n <EditorContainer\n {...{\n ...props,\n activePlugins: activePluginsToUse,\n toolbarOpts: toolbarOptsToUse,\n }}\n editorState={editorState}\n editor={editor}\n >\n {editor && (\n <StyledEditorContent\n style={{\n minHeight: sizeStyle.minHeight,\n height: sizeStyle.height,\n maxHeight: sizeStyle.maxHeight,\n }}\n showParagraph={showParagraphs && !showParagraphs.disabled}\n separateParagraph={separateParagraphs && !separateParagraphs.disabled}\n editor={editor}\n />\n )}\n </EditorContainer>\n );\n};\n\nconst StyledEditorContent = styled(EditorContent, {\n shouldForwardProp: (prop) => !['showParagraph', 'separateParagraph'].includes(prop),\n})(({ showParagraph, separateParagraph }) => ({\n display: 'flex',\n outline: 'none !important',\n '& .ProseMirror': {\n flex: 1,\n padding: '5px',\n maxHeight: '500px',\n outline: 'none !important',\n position: 'initial',\n\n // reset default margins for all block paragraphs/divs in the editor\n '& > p, & > div': {\n margin: '0',\n },\n\n // Out of flow so the caret stays at the start of the block; in-flow ::before pushes the caret after the hint text.\n // :only-child ensures the placeholder is hidden whenever the editor has other content (images, upload nodes, etc.)\n // and covers the type+backspace edge case where Tiptap only adds is-empty (not is-editor-empty).\n '& p[data-placeholder].is-empty:only-child, & div[data-placeholder].is-empty:only-child': {\n position: 'relative',\n },\n '& p[data-placeholder].is-empty:only-child::before, & div[data-placeholder].is-empty:only-child::before': {\n content: 'attr(data-placeholder)',\n position: 'absolute',\n left: 0,\n top: 0,\n color: '#9CA3AF',\n pointerEvents: 'none',\n whiteSpace: 'pre-wrap',\n },\n\n ...(showParagraph && {\n '& > p:has(+ p)::after, & > div:has(+ div)::after': {\n display: 'block',\n content: '\"¶\"',\n fontSize: '1em',\n color: '#146EB3',\n },\n }),\n ...(separateParagraph && {\n '& > p:has(+ p)': {\n marginBottom: '1em',\n },\n }),\n },\n}));\n\nexport default EditableHtml;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"EditableHtml.js","names":["_react","_interopRequireWildcard","require","_debounce","_interopRequireDefault","_react2","_styles","_starterKit","_extensionTextStyle","_extensionCharacterCount","_extensionSuperscript","_extensionSubscript","_extensionTextAlign","_extensionImage","_extensionPlaceholder","_helper","_extendedTable","_extendedTableCell","_divNode","_ensureEmptyRootDiv","_ensureListItemContentIsDiv","_extensionTableRow","_responseArea","_math","_image","_media","_css","_extendedListItem","_headingParagraph","_TiptapContainer","_size","_extensions","_excluded","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","_typeof","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ownKeys","keys","getOwnPropertySymbols","filter","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defaultToolbarOpts","position","alignment","alwaysVisible","showDone","doneOn","defaultResponseAreaProps","options","respAreaToolbar","onHandleAreaChange","DEFAULT_ACTIVE_PLUGINS","cssVariables","editorAttributes","spellCheckEnabled","role","spellcheck","autocorrect","autocapitalize","EditableHtml","exports","props","_props$pluginProps","_ref","pluginProps","showParagraphs","separateParagraphs","_useState","useState","_useState2","_slicedToArray2","pendingImages","setPendingImages","_useState3","_useState4","scheduled","setScheduled","toolbarOpts","removePendingImage","useCallback","imagePos","prev","next","img","pos","toolbarOptsToUse","commitEditorContent","editor","html","getHTML","markup","_props$onChange","onChange","_props$onDone","onDone","responseAreaPropsToUse","useMemo","responseAreaProps","onInlineDropdownToolbarClose","activePluginsToUse","_ref3","_ref2","customPlugins","otherPluginProps","_objectWithoutProperties2","filteredActivePlugins","activePlugins","pluginName","nameToUse","PLUGINS_MAP","pluginInfo","disabled","buildExtensions","math","textAlign","extraCSSRules","image","imageSupport","toolbar","table","responseArea","type","languageCharacters","languageCharactersProps","keyPadCharacterRef","setKeypadInteraction","media","extensions","TextAlign","configure","types","alignments","TextStyleKit","CharacterCount","limit","charactersLimit","StarterKit","trailingNode","node","notAfter","link","autolink","linkOnPaste","ExtendedListItem","DivNode","HeadingParagraph","EnsureEmptyRootIsDiv","EnsureListItemContentIsDiv","Placeholder","placeholder","showOnlyWhenEditable","showOnlyCurrent","includeChildren","ExtendedTable","TableRow","ExtendedTableHeader","ExtendedTableCell","ResponseAreaExtension","ExplicitConstructedResponseNode","DragInTheBlankNode","InlineDropdownNode","MathTemplatedNode","MathNode","SubScript","SuperScript","Image","ImageUploadNode","imageHandling","disableImageAlignmentButtons","_props$onDone2","onDelete","src","attrs","insertImageRequested","imageInfo","getHandler","_imageInfo","addedImage","onFinish","result","_cb","cb","callback","handler","focusHandler","debounce","detach","window","removeEventListener","_insertingImage","addEventListener","add","concat","_toConsumableArray2","maxImageWidth","maxImageHeight","Media","uploadSoundSupport","CSSMark","spellCheck","useEditor","immediatelyRender","editorProps","attributes","handleKeyDown","view","event","onKeyDown","editable","content","normalizeInitialMarkup","onUpdate","_ref4","transaction","isDone","_props$onChange2","onBlur","_ref5","otherToolbarOpened","_toolbarOpened","isActive","schema","useEffect","editorRef","setEditable","_editor$options","_currentEditorProps$a","currentEditorProps","setOptions","nextMarkup","commands","setContent","emitUpdate","entries","_ref6","_ref7","key","value","document","documentElement","style","setProperty","editorState","useEditorState","selector","ctx","_ctx$editor","isFocused","sizeStyle","minWidth","width","maxWidth","minHeight","height","maxHeight","valueToSize","createElement","_extends2","StyledEditorContent","showParagraph","separateParagraph","styled","EditorContent","shouldForwardProp","prop","includes","_ref8","display","outline","flex","padding","margin","left","top","color","pointerEvents","whiteSpace","fontSize","marginBottom","_default"],"sources":["../../src/components/EditableHtml.jsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport debounce from 'lodash-es/debounce';\nimport { EditorContent, useEditor, useEditorState } from '@tiptap/react';\nimport { styled } from '@mui/material/styles';\nimport StarterKit from '@tiptap/starter-kit';\nimport { TextStyleKit } from '@tiptap/extension-text-style';\nimport { CharacterCount } from '@tiptap/extension-character-count';\nimport SuperScript from '@tiptap/extension-superscript';\nimport SubScript from '@tiptap/extension-subscript';\nimport TextAlign from '@tiptap/extension-text-align';\nimport Image from '@tiptap/extension-image';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { normalizeInitialMarkup } from '../utils/helper';\n\nimport ExtendedTable from '../extensions/extended-table';\nimport { ExtendedTableCell, ExtendedTableHeader } from '../extensions/extended-table-cell';\nimport { DivNode } from '../extensions/div-node';\nimport { EnsureEmptyRootIsDiv } from '../extensions/ensure-empty-root-div';\nimport { EnsureListItemContentIsDiv } from '../extensions/ensure-list-item-content-is-div';\nimport { TableRow } from '@tiptap/extension-table-row';\nimport {\n DragInTheBlankNode,\n ExplicitConstructedResponseNode,\n InlineDropdownNode,\n MathTemplatedNode,\n ResponseAreaExtension,\n} from '../extensions/responseArea';\nimport { MathNode } from '../extensions/math';\nimport { ImageUploadNode } from '../extensions/image';\nimport { Media } from '../extensions/media';\nimport { CSSMark } from '../extensions/css';\nimport { ExtendedListItem } from '../extensions/extended-list-item';\nimport { HeadingParagraph } from '../extensions/heading-paragraph';\n\nimport EditorContainer from './TiptapContainer';\nimport { valueToSize } from '../utils/size';\nimport { buildExtensions, PLUGINS_MAP } from '../extensions';\n\nconst defaultToolbarOpts = {\n position: 'bottom',\n alignment: 'left',\n alwaysVisible: false,\n showDone: true,\n doneOn: 'blur',\n};\n\nconst defaultResponseAreaProps = {\n options: {},\n respAreaToolbar: () => {},\n onHandleAreaChange: () => {},\n};\n\nconst DEFAULT_ACTIVE_PLUGINS = [\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'code',\n 'bulleted-list',\n 'numbered-list',\n 'image',\n 'math',\n 'languageCharacters',\n 'text-align',\n 'table',\n 'video',\n 'audio',\n 'responseArea',\n 'superscript',\n 'subscript',\n 'css',\n 'h3',\n 'undo',\n 'redo',\n];\n\nconst cssVariables = {\n '--white': '#fff',\n '--black': '#2e2b29',\n '--black-contrast': '#110f0e',\n '--gray-1': 'rgba(61, 37, 20, .05)',\n '--gray-2': 'rgba(61, 37, 20, .08)',\n '--gray-3': 'rgba(61, 37, 20, .12)',\n '--gray-4': 'rgba(53, 38, 28, .3)',\n '--gray-5': 'rgba(28, 25, 23, .6)',\n '--green': '#22c55e',\n '--purple': '#6a00f5',\n '--purple-contrast': '#5800cc',\n '--purple-light': 'rgba(88, 5, 255, .05)',\n '--yellow-contrast': '#facc15',\n '--yellow': 'rgba(250, 204, 21, .4)',\n '--yellow-light': '#fffae5',\n '--red': '#ff5c33',\n '--red-light': '#ffebe5',\n '--shadow': `0px 12px 33px 0px rgba(0, 0, 0, .06),\n 0px 3.618px 9.949px 0px rgba(0, 0, 0, .04)`,\n};\n\n// Attributes PIE puts on the editor's contenteditable element.\n//\n// ProseMirror rebuilds the element's attribute set from editorProps.attributes on every view\n// update and removes anything no longer listed, and Tiptap merges its own role=\"textbox\" only in\n// createView - not into editor.options, which is what setOptions re-pushes. So every attribute we\n// want to survive has to be listed here. See PIE-1015.\nconst editorAttributes = (spellCheckEnabled) => ({\n // Tiptap's own attribute, re-declared so it survives setOptions. setEditable alone re-pushes\n // editorProps on every mount, which is what removed it in 2.1.17.\n role: 'textbox',\n // PIE-owned hook for external consumers - see PIE-1016. Query [data-pie-editor], or\n // [data-pie-editor][contenteditable=\"true\"] to skip read-only renders.\n 'data-pie-editor': 'true',\n // Without these the browser spellchecks the editor regardless of the spellCheck prop.\n spellcheck: spellCheckEnabled ? 'true' : 'false',\n autocorrect: spellCheckEnabled ? 'on' : 'off',\n autocapitalize: spellCheckEnabled ? 'on' : 'off',\n});\n\nexport const EditableHtml = (props) => {\n const { showParagraphs, separateParagraphs } = props.pluginProps || {};\n const [pendingImages, setPendingImages] = useState([]);\n const [scheduled, setScheduled] = useState(false);\n const { toolbarOpts } = props;\n\n const removePendingImage = useCallback(\n (imagePos) => {\n setPendingImages((prev) => {\n const next = prev.filter((img) => img.pos !== imagePos);\n if (next.length === 0) {\n setScheduled(false);\n }\n return next;\n });\n },\n [setPendingImages],\n );\n\n const toolbarOptsToUse = {\n ...defaultToolbarOpts,\n ...toolbarOpts,\n };\n\n const commitEditorContent = useCallback(\n (editor) => {\n const html = editor.getHTML();\n\n if (props.markup !== html) {\n props.onChange?.(html);\n }\n\n if (toolbarOptsToUse.doneOn === 'blur') {\n props.onDone?.(html);\n }\n },\n [props.markup, props.onChange, props.onDone, toolbarOptsToUse.doneOn],\n );\n\n const responseAreaPropsToUse = useMemo(\n () => ({\n ...defaultResponseAreaProps,\n ...props.responseAreaProps,\n onInlineDropdownToolbarClose: commitEditorContent,\n }),\n [props.responseAreaProps, commitEditorContent],\n );\n\n const activePluginsToUse = useMemo(() => {\n let { customPlugins, ...otherPluginProps } = props.pluginProps || {};\n\n customPlugins = customPlugins || [];\n\n const filteredActivePlugins = (props.activePlugins || DEFAULT_ACTIVE_PLUGINS)?.filter((pluginName) => {\n const nameToUse = PLUGINS_MAP[pluginName] || pluginName;\n const pluginInfo = otherPluginProps[nameToUse] || {};\n\n return !pluginInfo || !pluginInfo.disabled;\n });\n\n return buildExtensions(filteredActivePlugins, customPlugins, {\n math: {},\n textAlign: props.textAlign,\n html: {},\n extraCSSRules: props.extraCSSRules || {},\n image: {\n ...props.imageSupport,\n },\n toolbar: {},\n table: {},\n responseArea: {\n type: responseAreaPropsToUse.type,\n },\n languageCharacters: props.languageCharactersProps,\n keyPadCharacterRef: {},\n setKeypadInteraction: {},\n media: {},\n });\n }, [props, responseAreaPropsToUse.type]);\n\n const extensions = [\n TextAlign.configure({\n types: ['heading', 'paragraph', 'div', 'headingParagraph', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'td', 'th'],\n alignments: ['left', 'right', 'center', 'justify'],\n }),\n TextStyleKit,\n CharacterCount.configure({\n limit: props.charactersLimit || 1000000,\n }),\n StarterKit.configure({\n trailingNode: {\n node: 'paragraph',\n notAfter: ['paragraph', 'div'],\n },\n // StarterKit bundles the link extension, which turns anything that looks like a URL into\n // a hyperlink as it is typed or pasted. See PIE-980 - we don't want that in any editor.\n // The mark itself stays registered so links already in the markup keep round-tripping.\n link: {\n autolink: false,\n linkOnPaste: false,\n },\n }),\n ExtendedListItem,\n DivNode,\n HeadingParagraph,\n EnsureEmptyRootIsDiv,\n EnsureListItemContentIsDiv,\n Placeholder.configure({\n placeholder: props.placeholder,\n // show placeholder even when editor is focused\n showOnlyWhenEditable: true,\n showOnlyCurrent: false, // show on all empty nodes, not only the current one\n includeChildren: true,\n }),\n ExtendedTable,\n TableRow,\n ExtendedTableHeader,\n ExtendedTableCell,\n ResponseAreaExtension.configure(responseAreaPropsToUse),\n ExplicitConstructedResponseNode.configure(responseAreaPropsToUse),\n DragInTheBlankNode.configure(responseAreaPropsToUse),\n InlineDropdownNode.configure(responseAreaPropsToUse),\n MathTemplatedNode.configure(responseAreaPropsToUse),\n MathNode.configure({\n toolbarOpts: toolbarOptsToUse,\n math: props.pluginProps?.math || {},\n }),\n SubScript,\n SuperScript,\n Image,\n ImageUploadNode.configure({\n toolbarOpts: toolbarOptsToUse,\n imageHandling: {\n disableImageAlignmentButtons: props.disableImageAlignmentButtons,\n onDone: (editor) => props.onDone?.(editor.getHTML()),\n onDelete:\n props.imageSupport &&\n props.imageSupport.delete &&\n ((node) => {\n const { src } = node.attrs;\n\n props.imageSupport.delete(src, (e) => {\n removePendingImage(node.pos);\n });\n }),\n insertImageRequested:\n props.imageSupport &&\n ((editor, imageInfo, getHandler) => {\n const [addedImage, pos] = imageInfo;\n\n const onFinish = (result) => {\n let cb;\n\n if (scheduled && result) {\n // finish editing only on success\n cb = props.onChange;\n }\n\n removePendingImage(pos);\n cb?.(editor.getHTML());\n };\n\n const callback = () => {\n /**\n * The handler is the object through which the outer context\n * communicates file upload events like: fileChosen, cancel, progress\n */\n const handler = getHandler(onFinish);\n\n // If the user closes the file picker without choosing a file, the window regains\n // focus while _insertingImage is still true — drop the stale pending entry.\n const focusHandler = debounce(() => {\n const detach = () => window.removeEventListener('focus', focusHandler);\n\n if (!editor._insertingImage) {\n detach();\n return;\n }\n\n removePendingImage(pos);\n editor._insertingImage = false;\n detach();\n }, 500);\n\n window.addEventListener('focus', focusHandler);\n\n props.imageSupport.add(handler);\n };\n\n editor._insertingImage = true;\n setPendingImages((prev) => [...prev, addedImage]);\n callback();\n }),\n maxImageWidth: props.maxImageWidth,\n maxImageHeight: props.maxImageHeight,\n },\n limit: 3,\n }),\n Media.configure({\n uploadSoundSupport: props.uploadSoundSupport,\n }),\n CSSMark.configure({\n extraCSSRules: props.extraCSSRules,\n }),\n ];\n\n // Callers that don't pass spellCheck keep the browser default (on), as they did with the\n // slate-based editor. Players that have to default to off - extended-text-entry, see\n // PIE-978 - resolve that in their controller and pass an explicit false.\n const spellCheckEnabled = props.spellCheck !== false;\n\n const editor = useEditor(\n {\n extensions,\n immediatelyRender: false,\n editorProps: {\n attributes: editorAttributes(spellCheckEnabled),\n handleKeyDown(view, event) {\n if (props.onKeyDown) {\n return props.onKeyDown(event);\n }\n\n // Return false to let default behavior continue\n return false;\n },\n },\n editable: !props.disabled,\n content: normalizeInitialMarkup(props.markup),\n onUpdate: ({ editor, transaction }) => {\n if (transaction.isDone) {\n props.onChange?.(editor.getHTML());\n }\n },\n onBlur: ({ editor }) => {\n const otherToolbarOpened =\n editor._insertingImage ||\n editor._toolbarOpened ||\n editor.isActive('inline_dropdown') ||\n editor.isActive('explicit_constructed_response');\n\n if (otherToolbarOpened || !editor.schema) {\n return;\n }\n\n commitEditorContent(editor);\n },\n },\n [props.charactersLimit],\n );\n\n useEffect(() => {\n if (props.editorRef) {\n props.editorRef(editor);\n }\n }, [props.editorRef, editor]);\n\n useEffect(() => {\n editor?.setEditable(!props.disabled);\n }, [props.disabled, editor]);\n\n // useEditor only re-applies options on its own when it is called with an empty dependency\n // array, and this call site depends on charactersLimit, so a spellCheck change on a mounted\n // editor has to be pushed in. The rest of editorProps stays as the editor already has it, and\n // the attributes are merged rather than replaced so an attribute contributed by Tiptap or an\n // extension can't be dropped the way role=\"textbox\" was - see PIE-1015.\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const currentEditorProps = editor.options?.editorProps;\n const attributes = { ...currentEditorProps?.attributes, ...editorAttributes(spellCheckEnabled) };\n\n if (currentEditorProps?.attributes?.spellcheck === attributes.spellcheck) {\n return;\n }\n\n editor.setOptions({ editorProps: { ...currentEditorProps, attributes } });\n }, [spellCheckEnabled, editor]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n const nextMarkup = normalizeInitialMarkup(props.markup);\n\n if (nextMarkup !== editor.getHTML()) {\n editor.commands.setContent(nextMarkup, { emitUpdate: false });\n }\n }, [props.markup, editor]);\n\n useEffect(() => {\n Object.entries(cssVariables).forEach(([key, value]) => {\n document.documentElement.style.setProperty(key, value);\n });\n }, []);\n\n const editorState = useEditorState({\n editor,\n selector: (ctx) => ({\n isFocused: ctx.editor?.isFocused,\n }),\n });\n\n const sizeStyle = useMemo(() => {\n const { minWidth, width, maxWidth, minHeight, height, maxHeight } = props;\n\n return {\n width: valueToSize(width),\n minWidth: valueToSize(minWidth),\n maxWidth: valueToSize(maxWidth),\n height: valueToSize(height),\n minHeight: valueToSize(minHeight),\n maxHeight: valueToSize(maxHeight),\n };\n }, [props]);\n\n return (\n <EditorContainer\n {...{\n ...props,\n activePlugins: activePluginsToUse,\n toolbarOpts: toolbarOptsToUse,\n }}\n editorState={editorState}\n editor={editor}\n >\n {editor && (\n <StyledEditorContent\n style={{\n minHeight: sizeStyle.minHeight,\n height: sizeStyle.height,\n maxHeight: sizeStyle.maxHeight,\n }}\n showParagraph={showParagraphs && !showParagraphs.disabled}\n separateParagraph={separateParagraphs && !separateParagraphs.disabled}\n editor={editor}\n />\n )}\n </EditorContainer>\n );\n};\n\nconst StyledEditorContent = styled(EditorContent, {\n shouldForwardProp: (prop) => !['showParagraph', 'separateParagraph'].includes(prop),\n})(({ showParagraph, separateParagraph }) => ({\n display: 'flex',\n outline: 'none !important',\n '& .ProseMirror': {\n flex: 1,\n padding: '5px',\n maxHeight: '500px',\n outline: 'none !important',\n position: 'initial',\n\n // reset default margins for all block paragraphs/divs in the editor\n '& > p, & > div': {\n margin: '0',\n },\n\n // Out of flow so the caret stays at the start of the block; in-flow ::before pushes the caret after the hint text.\n // :only-child ensures the placeholder is hidden whenever the editor has other content (images, upload nodes, etc.)\n // and covers the type+backspace edge case where Tiptap only adds is-empty (not is-editor-empty).\n '& p[data-placeholder].is-empty:only-child, & div[data-placeholder].is-empty:only-child': {\n position: 'relative',\n },\n '& p[data-placeholder].is-empty:only-child::before, & div[data-placeholder].is-empty:only-child::before': {\n content: 'attr(data-placeholder)',\n position: 'absolute',\n left: 0,\n top: 0,\n color: '#9CA3AF',\n pointerEvents: 'none',\n whiteSpace: 'pre-wrap',\n },\n\n ...(showParagraph && {\n '& > p:has(+ p)::after, & > div:has(+ div)::after': {\n display: 'block',\n content: '\"¶\"',\n fontSize: '1em',\n color: '#146EB3',\n },\n }),\n ...(separateParagraph && {\n '& > p:has(+ p)': {\n marginBottom: '1em',\n },\n }),\n },\n}));\n\nexport default EditableHtml;\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "2.1.12-next.
|
|
6
|
+
"version": "2.1.12-next.59+7d1b5312c",
|
|
7
7
|
"description": "",
|
|
8
8
|
"license": "ISC",
|
|
9
9
|
"main": "lib/index.js",
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
"@dnd-kit/utilities": "3.2.2",
|
|
17
17
|
"@mui/icons-material": "^7.3.4",
|
|
18
18
|
"@mui/material": "^7.3.4",
|
|
19
|
-
"@pie-lib/drag": "^4.0.
|
|
19
|
+
"@pie-lib/drag": "^4.0.7-next.82+7d1b5312c",
|
|
20
20
|
"@pie-lib/math-input": "^8.1.1",
|
|
21
21
|
"@pie-lib/math-rendering": "^5.1.0",
|
|
22
|
-
"@pie-lib/math-toolbar": "^3.0.
|
|
23
|
-
"@pie-lib/render-ui": "^6.1.
|
|
22
|
+
"@pie-lib/math-toolbar": "^3.0.7-next.82+7d1b5312c",
|
|
23
|
+
"@pie-lib/render-ui": "^6.1.4-next.82+7d1b5312c",
|
|
24
24
|
"@tiptap/core": "3.20.0",
|
|
25
25
|
"@tiptap/extension-character-count": "3.20.0",
|
|
26
26
|
"@tiptap/extension-color": "3.20.0",
|
|
@@ -59,6 +59,6 @@
|
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"react": "^18.2.0"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "7d1b5312c83ee26290dac7b9e44624f351769943",
|
|
63
63
|
"scripts": {}
|
|
64
64
|
}
|
|
@@ -602,6 +602,8 @@ describe('EditableHtml', () => {
|
|
|
602
602
|
});
|
|
603
603
|
|
|
604
604
|
expect(lastEditorAttributes()).toEqual({
|
|
605
|
+
role: 'textbox',
|
|
606
|
+
'data-pie-editor': 'true',
|
|
605
607
|
spellcheck: 'false',
|
|
606
608
|
autocorrect: 'off',
|
|
607
609
|
autocapitalize: 'off',
|
|
@@ -616,6 +618,8 @@ describe('EditableHtml', () => {
|
|
|
616
618
|
});
|
|
617
619
|
|
|
618
620
|
expect(lastEditorAttributes()).toEqual({
|
|
621
|
+
role: 'textbox',
|
|
622
|
+
'data-pie-editor': 'true',
|
|
619
623
|
spellcheck: 'true',
|
|
620
624
|
autocorrect: 'on',
|
|
621
625
|
autocapitalize: 'on',
|
|
@@ -650,7 +654,13 @@ describe('EditableHtml', () => {
|
|
|
650
654
|
|
|
651
655
|
expect(editor.setOptions).toHaveBeenCalledWith({
|
|
652
656
|
editorProps: expect.objectContaining({
|
|
653
|
-
attributes: {
|
|
657
|
+
attributes: {
|
|
658
|
+
role: 'textbox',
|
|
659
|
+
'data-pie-editor': 'true',
|
|
660
|
+
spellcheck: 'false',
|
|
661
|
+
autocorrect: 'off',
|
|
662
|
+
autocapitalize: 'off',
|
|
663
|
+
},
|
|
654
664
|
}),
|
|
655
665
|
});
|
|
656
666
|
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { render, waitFor } from '@testing-library/react';
|
|
3
|
+
import { EditableHtml } from '../components/EditableHtml';
|
|
4
|
+
|
|
5
|
+
const renderEditor = (props) =>
|
|
6
|
+
render(<EditableHtml markup="<p>hello</p>" onChange={() => {}} pluginProps={{}} {...props} />);
|
|
7
|
+
|
|
8
|
+
const prosemirror = (container) => container.querySelector('.ProseMirror');
|
|
9
|
+
|
|
10
|
+
const waitForEditor = async (container) => {
|
|
11
|
+
await waitFor(() => {
|
|
12
|
+
expect(prosemirror(container)).toBeInTheDocument();
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
describe('contenteditable attributes', () => {
|
|
17
|
+
// PIE-1015: 2.1.17 lost role="textbox" on a plain mount, because setEditable re-pushes
|
|
18
|
+
// editorProps through setOptions and ProseMirror drops any attribute no longer listed.
|
|
19
|
+
it('announces the editor as a textbox on a plain mount', async () => {
|
|
20
|
+
const { container } = renderEditor();
|
|
21
|
+
|
|
22
|
+
await waitForEditor(container);
|
|
23
|
+
|
|
24
|
+
expect(prosemirror(container).getAttribute('role')).toBe('textbox');
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// PIE-1016: a PIE-owned hook external consumers can target, unlike role or .tiptap.ProseMirror.
|
|
28
|
+
it('exposes the PIE-owned editor hook on a plain mount', async () => {
|
|
29
|
+
const { container } = renderEditor();
|
|
30
|
+
|
|
31
|
+
await waitForEditor(container);
|
|
32
|
+
|
|
33
|
+
expect(prosemirror(container).getAttribute('data-pie-editor')).toBe('true');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it('keeps both attributes when spellCheck changes on a mounted editor', async () => {
|
|
37
|
+
const { container, rerender } = renderEditor({ spellCheck: true });
|
|
38
|
+
|
|
39
|
+
await waitForEditor(container);
|
|
40
|
+
|
|
41
|
+
rerender(<EditableHtml markup="<p>hello</p>" onChange={() => {}} pluginProps={{}} spellCheck={false} />);
|
|
42
|
+
|
|
43
|
+
await waitFor(() => {
|
|
44
|
+
expect(prosemirror(container).getAttribute('spellcheck')).toBe('false');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
expect(prosemirror(container).getAttribute('role')).toBe('textbox');
|
|
48
|
+
expect(prosemirror(container).getAttribute('data-pie-editor')).toBe('true');
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it('keeps both attributes when the editor is disabled on a mounted editor', async () => {
|
|
52
|
+
const { container, rerender } = renderEditor();
|
|
53
|
+
|
|
54
|
+
await waitForEditor(container);
|
|
55
|
+
|
|
56
|
+
rerender(<EditableHtml markup="<p>hello</p>" onChange={() => {}} pluginProps={{}} disabled />);
|
|
57
|
+
|
|
58
|
+
await waitFor(() => {
|
|
59
|
+
expect(prosemirror(container).getAttribute('contenteditable')).toBe('false');
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
expect(prosemirror(container).getAttribute('role')).toBe('textbox');
|
|
63
|
+
expect(prosemirror(container).getAttribute('data-pie-editor')).toBe('true');
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Online Testing queries [data-pie-editor][contenteditable="true"] to attach its answer-save
|
|
67
|
+
// listener, so a read-only render has to carry the hook but not match that selector.
|
|
68
|
+
it('marks a read-only editor as not editable so the hook can be filtered on it', async () => {
|
|
69
|
+
const { container } = renderEditor({ disabled: true });
|
|
70
|
+
|
|
71
|
+
await waitForEditor(container);
|
|
72
|
+
|
|
73
|
+
expect(prosemirror(container).getAttribute('data-pie-editor')).toBe('true');
|
|
74
|
+
expect(prosemirror(container).getAttribute('contenteditable')).toBe('false');
|
|
75
|
+
expect(container.querySelector('[data-pie-editor][contenteditable="true"]')).toBeNull();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
@@ -96,12 +96,23 @@ const cssVariables = {
|
|
|
96
96
|
0px 3.618px 9.949px 0px rgba(0, 0, 0, .04)`,
|
|
97
97
|
};
|
|
98
98
|
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
99
|
+
// Attributes PIE puts on the editor's contenteditable element.
|
|
100
|
+
//
|
|
101
|
+
// ProseMirror rebuilds the element's attribute set from editorProps.attributes on every view
|
|
102
|
+
// update and removes anything no longer listed, and Tiptap merges its own role="textbox" only in
|
|
103
|
+
// createView - not into editor.options, which is what setOptions re-pushes. So every attribute we
|
|
104
|
+
// want to survive has to be listed here. See PIE-1015.
|
|
105
|
+
const editorAttributes = (spellCheckEnabled) => ({
|
|
106
|
+
// Tiptap's own attribute, re-declared so it survives setOptions. setEditable alone re-pushes
|
|
107
|
+
// editorProps on every mount, which is what removed it in 2.1.17.
|
|
108
|
+
role: 'textbox',
|
|
109
|
+
// PIE-owned hook for external consumers - see PIE-1016. Query [data-pie-editor], or
|
|
110
|
+
// [data-pie-editor][contenteditable="true"] to skip read-only renders.
|
|
111
|
+
'data-pie-editor': 'true',
|
|
112
|
+
// Without these the browser spellchecks the editor regardless of the spellCheck prop.
|
|
113
|
+
spellcheck: spellCheckEnabled ? 'true' : 'false',
|
|
114
|
+
autocorrect: spellCheckEnabled ? 'on' : 'off',
|
|
115
|
+
autocapitalize: spellCheckEnabled ? 'on' : 'off',
|
|
105
116
|
});
|
|
106
117
|
|
|
107
118
|
export const EditableHtml = (props) => {
|
|
@@ -320,7 +331,7 @@ export const EditableHtml = (props) => {
|
|
|
320
331
|
extensions,
|
|
321
332
|
immediatelyRender: false,
|
|
322
333
|
editorProps: {
|
|
323
|
-
attributes:
|
|
334
|
+
attributes: editorAttributes(spellCheckEnabled),
|
|
324
335
|
handleKeyDown(view, event) {
|
|
325
336
|
if (props.onKeyDown) {
|
|
326
337
|
return props.onKeyDown(event);
|
|
@@ -366,15 +377,16 @@ export const EditableHtml = (props) => {
|
|
|
366
377
|
|
|
367
378
|
// useEditor only re-applies options on its own when it is called with an empty dependency
|
|
368
379
|
// array, and this call site depends on charactersLimit, so a spellCheck change on a mounted
|
|
369
|
-
// editor has to be pushed in.
|
|
370
|
-
//
|
|
380
|
+
// editor has to be pushed in. The rest of editorProps stays as the editor already has it, and
|
|
381
|
+
// the attributes are merged rather than replaced so an attribute contributed by Tiptap or an
|
|
382
|
+
// extension can't be dropped the way role="textbox" was - see PIE-1015.
|
|
371
383
|
useEffect(() => {
|
|
372
384
|
if (!editor) {
|
|
373
385
|
return;
|
|
374
386
|
}
|
|
375
387
|
|
|
376
388
|
const currentEditorProps = editor.options?.editorProps;
|
|
377
|
-
const attributes =
|
|
389
|
+
const attributes = { ...currentEditorProps?.attributes, ...editorAttributes(spellCheckEnabled) };
|
|
378
390
|
|
|
379
391
|
if (currentEditorProps?.attributes?.spellcheck === attributes.spellcheck) {
|
|
380
392
|
return;
|