@pie-lib/editable-html-tip-tap 1.2.0-next.33 → 1.2.0-next.34
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/CHANGELOG.md +12 -0
- package/lib/components/EditableHtml.js +3 -1
- package/lib/components/EditableHtml.js.map +1 -1
- package/lib/extensions/div-node.js +11 -3
- package/lib/extensions/div-node.js.map +1 -1
- package/lib/extensions/ensure-list-item-content-is-div.js +64 -0
- package/lib/extensions/ensure-list-item-content-is-div.js.map +1 -0
- package/lib/extensions/extended-list-item.js +15 -0
- package/lib/extensions/extended-list-item.js.map +1 -0
- package/lib/extensions/image-component.js +37 -33
- package/lib/extensions/image-component.js.map +1 -1
- package/lib/extensions/image.js +11 -2
- package/lib/extensions/image.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/EditableHtml.test.jsx +8 -0
- package/src/__tests__/index.test.jsx +2 -0
- package/src/components/EditableHtml.jsx +4 -0
- package/src/extensions/__tests__/ensure-list-item-content-is-div.test.js +44 -0
- package/src/extensions/__tests__/extended-list-item.test.js +13 -0
- package/src/extensions/__tests__/image-component.test.jsx +21 -1
- package/src/extensions/__tests__/image.test.js +15 -10
- package/src/extensions/div-node.js +12 -2
- package/src/extensions/ensure-list-item-content-is-div.js +62 -0
- package/src/extensions/extended-list-item.js +10 -0
- package/src/extensions/image-component.jsx +35 -36
- package/src/extensions/image.js +5 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,18 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [1.2.0-next.34](https://github.com/pie-framework/pie-lib/compare/@pie-lib/editable-html-tip-tap@1.2.0-next.33...@pie-lib/editable-html-tip-tap@1.2.0-next.34) (2026-04-16)
|
|
7
|
+
|
|
8
|
+
### Bug Fixes
|
|
9
|
+
|
|
10
|
+
- **editable-html-tip-tap:** handle list item to avoid default paragraph wrapping PIE-46 ([9c37dac](https://github.com/pie-framework/pie-lib/commit/9c37dac9d10940f59930d21a135cd991f238d622))
|
|
11
|
+
- streamline beforeEach setup in image component tests ([3d0fc78](https://github.com/pie-framework/pie-lib/commit/3d0fc78b9ceda1664978378ace9f6c3bbd4a2269))
|
|
12
|
+
- tests ([4c96c88](https://github.com/pie-framework/pie-lib/commit/4c96c88b791b10d747453914577178b991753961))
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- **editable-html-tip-tap:** image -add unique nodeKey attribute for identification PIE-54 ([210c0d5](https://github.com/pie-framework/pie-lib/commit/210c0d5ffda0718b52845b3b4011b98f66b0b547))
|
|
17
|
+
|
|
6
18
|
# [1.2.0-next.33](https://github.com/pie-framework/pie-lib/compare/@pie-lib/editable-html-tip-tap@1.2.0-next.32...@pie-lib/editable-html-tip-tap@1.2.0-next.33) (2026-04-16)
|
|
7
19
|
|
|
8
20
|
### Bug Fixes
|
|
@@ -28,12 +28,14 @@ var _extendedTable = _interopRequireDefault(require("../extensions/extended-tabl
|
|
|
28
28
|
var _extendedTableCell = require("../extensions/extended-table-cell");
|
|
29
29
|
var _divNode = require("../extensions/div-node");
|
|
30
30
|
var _ensureEmptyRootDiv = require("../extensions/ensure-empty-root-div");
|
|
31
|
+
var _ensureListItemContentIsDiv = require("../extensions/ensure-list-item-content-is-div");
|
|
31
32
|
var _extensionTableRow = require("@tiptap/extension-table-row");
|
|
32
33
|
var _responseArea = require("../extensions/responseArea");
|
|
33
34
|
var _math = require("../extensions/math");
|
|
34
35
|
var _image = require("../extensions/image");
|
|
35
36
|
var _media = require("../extensions/media");
|
|
36
37
|
var _css = require("../extensions/css");
|
|
38
|
+
var _extendedListItem = require("../extensions/extended-list-item");
|
|
37
39
|
var _TiptapContainer = _interopRequireDefault(require("./TiptapContainer"));
|
|
38
40
|
var _size = require("../utils/size");
|
|
39
41
|
var _extensions = require("../extensions");
|
|
@@ -138,7 +140,7 @@ var EditableHtml = exports.EditableHtml = function EditableHtml(props) {
|
|
|
138
140
|
node: 'paragraph',
|
|
139
141
|
notAfter: ['paragraph', 'div']
|
|
140
142
|
}
|
|
141
|
-
}), _divNode.DivNode, _ensureEmptyRootDiv.EnsureEmptyRootIsDiv, _extensionPlaceholder["default"].configure({
|
|
143
|
+
}), _extendedListItem.ExtendedListItem, _divNode.DivNode, _ensureEmptyRootDiv.EnsureEmptyRootIsDiv, _ensureListItemContentIsDiv.EnsureListItemContentIsDiv, _extensionPlaceholder["default"].configure({
|
|
142
144
|
placeholder: props.placeholder,
|
|
143
145
|
// show placeholder even when editor is focused
|
|
144
146
|
showOnlyWhenEditable: true,
|
|
@@ -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","_extensionTableRow","_responseArea","_math","_image","_media","_css","_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","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","activePluginsToUse","useMemo","_ref3","_props$responseAreaPr","_ref2","customPlugins","otherPluginProps","_objectWithoutProperties2","filteredActivePlugins","activePlugins","pluginName","nameToUse","PLUGINS_MAP","pluginInfo","disabled","buildExtensions","math","textAlign","html","extraCSSRules","image","imageSupport","toolbar","table","responseArea","type","responseAreaProps","languageCharacters","languageCharactersProps","keyPadCharacterRef","setKeypadInteraction","media","extensions","TextAlign","configure","types","alignments","TextStyleKit","CharacterCount","limit","charactersLimit","StarterKit","trailingNode","node","notAfter","DivNode","EnsureEmptyRootIsDiv","Placeholder","placeholder","showOnlyWhenEditable","showOnlyCurrent","includeChildren","ExtendedTable","TableRow","ExtendedTableHeader","ExtendedTableCell","ResponseAreaExtension","ExplicitConstructedResponseNode","DragInTheBlankNode","InlineDropdownNode","MathTemplatedNode","MathNode","SubScript","SuperScript","Image","ImageUploadNode","imageHandling","disableImageAlignmentButtons","onDone","editor","_props$onDone","getHTML","onDelete","src","attrs","insertImageRequested","imageInfo","getHandler","_imageInfo","addedImage","onFinish","result","_cb","cb","onChange","callback","handler","focusHandler","debounce","detach","window","removeEventListener","_insertingImage","addEventListener","add","concat","_toConsumableArray2","maxImageWidth","maxImageHeight","Media","uploadSoundSupport","CSSMark","useEditor","immediatelyRender","editorProps","handleKeyDown","view","event","onKeyDown","editable","content","normalizeInitialMarkup","markup","onUpdate","_ref4","transaction","isDone","_props$onChange","onBlur","_ref5","otherToolbarOpened","_toolbarOpened","isActive","_props$onChange2","_props$onDone2","useEffect","editorRef","setEditable","nextMarkup","commands","setContent","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 { 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';\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\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 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: props.responseAreaProps?.type,\n },\n languageCharacters: props.languageCharactersProps,\n keyPadCharacterRef: {},\n setKeypadInteraction: {},\n media: {},\n });\n }, [props]);\n\n const extensions = [\n TextAlign.configure({\n types: ['heading', 'paragraph', 'div', '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 }),\n DivNode,\n EnsureEmptyRootIsDiv,\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(props.responseAreaProps),\n ExplicitConstructedResponseNode.configure(props.responseAreaProps),\n DragInTheBlankNode.configure(props.responseAreaProps),\n InlineDropdownNode.configure(props.responseAreaProps),\n MathTemplatedNode.configure(props.responseAreaProps),\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 const editor = useEditor(\n {\n extensions,\n immediatelyRender: false,\n editorProps: {\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: debounce(({ 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) {\n return;\n }\n\n if (props.markup !== editor.getHTML()) {\n props.onChange?.(editor.getHTML());\n }\n\n if (toolbarOptsToUse.doneOn === 'blur') {\n props.onDone?.(editor.getHTML());\n }\n }, 200),\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 useEffect(() => {\n if (!editor) {\n return;\n }\n const nextMarkup = normalizeInitialMarkup(props.markup);\n\n if (nextMarkup !== editor.getHTML()) {\n editor.commands.setContent(nextMarkup, 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 '& p.is-editor-empty, & div.is-editor-empty': {\n position: 'relative',\n },\n '& p.is-editor-empty::before, & div.is-editor-empty::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 '& > div:has(+ div)': {\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","_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","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","activePluginsToUse","useMemo","_ref3","_props$responseAreaPr","_ref2","customPlugins","otherPluginProps","_objectWithoutProperties2","filteredActivePlugins","activePlugins","pluginName","nameToUse","PLUGINS_MAP","pluginInfo","disabled","buildExtensions","math","textAlign","html","extraCSSRules","image","imageSupport","toolbar","table","responseArea","type","responseAreaProps","languageCharacters","languageCharactersProps","keyPadCharacterRef","setKeypadInteraction","media","extensions","TextAlign","configure","types","alignments","TextStyleKit","CharacterCount","limit","charactersLimit","StarterKit","trailingNode","node","notAfter","ExtendedListItem","DivNode","EnsureEmptyRootIsDiv","EnsureListItemContentIsDiv","Placeholder","placeholder","showOnlyWhenEditable","showOnlyCurrent","includeChildren","ExtendedTable","TableRow","ExtendedTableHeader","ExtendedTableCell","ResponseAreaExtension","ExplicitConstructedResponseNode","DragInTheBlankNode","InlineDropdownNode","MathTemplatedNode","MathNode","SubScript","SuperScript","Image","ImageUploadNode","imageHandling","disableImageAlignmentButtons","onDone","editor","_props$onDone","getHTML","onDelete","src","attrs","insertImageRequested","imageInfo","getHandler","_imageInfo","addedImage","onFinish","result","_cb","cb","onChange","callback","handler","focusHandler","debounce","detach","window","removeEventListener","_insertingImage","addEventListener","add","concat","_toConsumableArray2","maxImageWidth","maxImageHeight","Media","uploadSoundSupport","CSSMark","useEditor","immediatelyRender","editorProps","handleKeyDown","view","event","onKeyDown","editable","content","normalizeInitialMarkup","markup","onUpdate","_ref4","transaction","isDone","_props$onChange","onBlur","_ref5","otherToolbarOpened","_toolbarOpened","isActive","_props$onChange2","_props$onDone2","useEffect","editorRef","setEditable","nextMarkup","commands","setContent","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';\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\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 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: props.responseAreaProps?.type,\n },\n languageCharacters: props.languageCharactersProps,\n keyPadCharacterRef: {},\n setKeypadInteraction: {},\n media: {},\n });\n }, [props]);\n\n const extensions = [\n TextAlign.configure({\n types: ['heading', 'paragraph', 'div', '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 }),\n ExtendedListItem,\n DivNode,\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(props.responseAreaProps),\n ExplicitConstructedResponseNode.configure(props.responseAreaProps),\n DragInTheBlankNode.configure(props.responseAreaProps),\n InlineDropdownNode.configure(props.responseAreaProps),\n MathTemplatedNode.configure(props.responseAreaProps),\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 const editor = useEditor(\n {\n extensions,\n immediatelyRender: false,\n editorProps: {\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: debounce(({ 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) {\n return;\n }\n\n if (props.markup !== editor.getHTML()) {\n props.onChange?.(editor.getHTML());\n }\n\n if (toolbarOptsToUse.doneOn === 'blur') {\n props.onDone?.(editor.getHTML());\n }\n }, 200),\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 useEffect(() => {\n if (!editor) {\n return;\n }\n const nextMarkup = normalizeInitialMarkup(props.markup);\n\n if (nextMarkup !== editor.getHTML()) {\n editor.commands.setContent(nextMarkup, 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 '& p.is-editor-empty, & div.is-editor-empty': {\n position: 'relative',\n },\n '& p.is-editor-empty::before, & div.is-editor-empty::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 '& > div:has(+ div)': {\n marginBottom: '1em',\n },\n }),\n },\n}));\n\nexport default EditableHtml;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -22,6 +22,14 @@ var DivNode = exports.DivNode = _core.Node.create({
|
|
|
22
22
|
},
|
|
23
23
|
addKeyboardShortcuts: function addKeyboardShortcuts() {
|
|
24
24
|
var _this = this;
|
|
25
|
+
var isInsideListItem = function isInsideListItem($from) {
|
|
26
|
+
for (var depth = $from.depth; depth >= 0; depth -= 1) {
|
|
27
|
+
if ($from.node(depth).type.name === 'listItem') {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return false;
|
|
32
|
+
};
|
|
25
33
|
return {
|
|
26
34
|
Enter: function Enter() {
|
|
27
35
|
var state = _this.editor.state;
|
|
@@ -29,6 +37,9 @@ var DivNode = exports.DivNode = _core.Node.create({
|
|
|
29
37
|
if ($from.parent.type.name !== 'div') {
|
|
30
38
|
return false;
|
|
31
39
|
}
|
|
40
|
+
if (isInsideListItem($from)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
32
43
|
return _this.editor.chain().focus().setNode('paragraph') // current div becomes <p>
|
|
33
44
|
.splitBlock() // create another <p>
|
|
34
45
|
.run();
|
|
@@ -58,9 +69,6 @@ var DivNode = exports.DivNode = _core.Node.create({
|
|
|
58
69
|
if (parentText.length === 0) {
|
|
59
70
|
return state.doc.childCount === 1 ? true : false;
|
|
60
71
|
}
|
|
61
|
-
|
|
62
|
-
// one character left and cursor is after it — delete
|
|
63
|
-
// only that character and stop, preventing the block-join that fires Enter.
|
|
64
72
|
if (parentText.length === 1 && $from.parentOffset === 1) {
|
|
65
73
|
var tr = state.tr;
|
|
66
74
|
tr["delete"]($from.pos - 1, $from.pos);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"div-node.js","names":["_core","require","DivNode","exports","Node","create","name","group","content","parseHTML","tag","renderHTML","_ref","HTMLAttributes","addKeyboardShortcuts","_this","
|
|
1
|
+
{"version":3,"file":"div-node.js","names":["_core","require","DivNode","exports","Node","create","name","group","content","parseHTML","tag","renderHTML","_ref","HTMLAttributes","addKeyboardShortcuts","_this","isInsideListItem","$from","depth","node","type","Enter","state","editor","selection","parent","chain","focus","setNode","splitBlock","run","Backspace","_state$selection","selectionEmpty","empty","parentText","textContent","length","doc","childCount","parentOffset","tr","pos","view","dispatch"],"sources":["../../src/extensions/div-node.js"],"sourcesContent":["// DivNode.ts\nimport { Node } from '@tiptap/core';\n\nexport const DivNode = Node.create({\n name: 'div',\n group: 'block',\n content: 'inline*',\n\n parseHTML() {\n return [{ tag: 'div' }];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', HTMLAttributes, 0];\n },\n\n addKeyboardShortcuts() {\n const isInsideListItem = ($from) => {\n for (let depth = $from.depth; depth >= 0; depth -= 1) {\n if ($from.node(depth).type.name === 'listItem') {\n return true;\n }\n }\n return false;\n };\n\n return {\n Enter: () => {\n const { state } = this.editor;\n const { $from } = state.selection;\n\n if ($from.parent.type.name !== 'div') {\n return false;\n }\n if (isInsideListItem($from)) {\n return false;\n }\n\n return this.editor\n .chain()\n .focus()\n .setNode('paragraph') // current div becomes <p>\n .splitBlock() // create another <p>\n .run();\n },\n\n // When the cursor is in a div and the user presses Backspace,\n // ProseMirror's default handler may try to join/delete the block node\n // once it becomes empty. That triggers the Enter shortcut above\n // (div → p conversion + split), making it look like a new line is\n // inserted instead of deleting.\n // We handle two cases explicitly:\n // 1. The div already IS empty → swallow the event (nothing to delete).\n // 2. The div has exactly ONE character left → delete just that character\n // using a precise transaction, then stop. This prevents ProseMirror\n // from following up with a block-join that triggers the Enter handler.\n Backspace: () => {\n const { state } = this.editor;\n const { $from, empty: selectionEmpty } = state.selection;\n\n if ($from.parent.type.name !== 'div') {\n return false;\n }\n\n if (!selectionEmpty) {\n return false;\n }\n\n const parentText = $from.parent.textContent;\n\n if (parentText.length === 0) {\n return state.doc.childCount === 1 ? true : false;\n }\n\n if (parentText.length === 1 && $from.parentOffset === 1) {\n const { tr } = state;\n tr.delete($from.pos - 1, $from.pos);\n this.editor.view.dispatch(tr);\n return true;\n }\n\n return false;\n },\n };\n },\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.EnsureListItemContentIsDiv = void 0;
|
|
7
|
+
var _core = require("@tiptap/core");
|
|
8
|
+
var _state = require("@tiptap/pm/state");
|
|
9
|
+
/**
|
|
10
|
+
* Some list operations preserve/create `paragraph` children in `listItem`.
|
|
11
|
+
* Normalize direct `listItem > paragraph` children into `div` so list content
|
|
12
|
+
* stays consistent with DivNode-based editing.
|
|
13
|
+
*/
|
|
14
|
+
var EnsureListItemContentIsDiv = exports.EnsureListItemContentIsDiv = _core.Extension.create({
|
|
15
|
+
name: 'ensureListItemContentIsDiv',
|
|
16
|
+
addProseMirrorPlugins: function addProseMirrorPlugins() {
|
|
17
|
+
var key = new _state.PluginKey(this.name);
|
|
18
|
+
return [new _state.Plugin({
|
|
19
|
+
key: key,
|
|
20
|
+
appendTransaction: function appendTransaction(transactions, _oldState, newState) {
|
|
21
|
+
if (!transactions.some(function (tr) {
|
|
22
|
+
return tr.docChanged;
|
|
23
|
+
})) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
var doc = newState.doc,
|
|
27
|
+
schema = newState.schema;
|
|
28
|
+
var divType = schema.nodes.div;
|
|
29
|
+
if (!divType) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
var positionsToConvert = [];
|
|
33
|
+
doc.descendants(function (node, pos) {
|
|
34
|
+
if (node.type.name !== 'listItem') {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
var childOffset = 1;
|
|
38
|
+
node.forEach(function (child) {
|
|
39
|
+
if (child.type.name === 'paragraph') {
|
|
40
|
+
positionsToConvert.push({
|
|
41
|
+
pos: pos + childOffset,
|
|
42
|
+
attrs: child.attrs
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
childOffset += child.nodeSize;
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
if (positionsToConvert.length === 0) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
var tr = newState.tr;
|
|
52
|
+
positionsToConvert.sort(function (a, b) {
|
|
53
|
+
return b.pos - a.pos;
|
|
54
|
+
}).forEach(function (_ref) {
|
|
55
|
+
var pos = _ref.pos,
|
|
56
|
+
attrs = _ref.attrs;
|
|
57
|
+
return tr.setNodeMarkup(pos, divType, attrs);
|
|
58
|
+
});
|
|
59
|
+
return tr;
|
|
60
|
+
}
|
|
61
|
+
})];
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=ensure-list-item-content-is-div.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-list-item-content-is-div.js","names":["_core","require","_state","EnsureListItemContentIsDiv","exports","Extension","create","name","addProseMirrorPlugins","key","PluginKey","Plugin","appendTransaction","transactions","_oldState","newState","some","tr","docChanged","doc","schema","divType","nodes","div","positionsToConvert","descendants","node","pos","type","childOffset","forEach","child","push","attrs","nodeSize","length","sort","a","b","_ref","setNodeMarkup"],"sources":["../../src/extensions/ensure-list-item-content-is-div.js"],"sourcesContent":["import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\n/**\n * Some list operations preserve/create `paragraph` children in `listItem`.\n * Normalize direct `listItem > paragraph` children into `div` so list content\n * stays consistent with DivNode-based editing.\n */\nexport const EnsureListItemContentIsDiv = Extension.create({\n name: 'ensureListItemContentIsDiv',\n\n addProseMirrorPlugins() {\n const key = new PluginKey(this.name);\n\n return [\n new Plugin({\n key,\n appendTransaction(transactions, _oldState, newState) {\n if (!transactions.some((tr) => tr.docChanged)) {\n return null;\n }\n\n const { doc, schema } = newState;\n const divType = schema.nodes.div;\n if (!divType) {\n return null;\n }\n\n const positionsToConvert = [];\n\n doc.descendants((node, pos) => {\n if (node.type.name !== 'listItem') {\n return;\n }\n\n let childOffset = 1;\n node.forEach((child) => {\n if (child.type.name === 'paragraph') {\n positionsToConvert.push({\n pos: pos + childOffset,\n attrs: child.attrs,\n });\n }\n childOffset += child.nodeSize;\n });\n });\n\n if (positionsToConvert.length === 0) {\n return null;\n }\n\n const tr = newState.tr;\n positionsToConvert\n .sort((a, b) => b.pos - a.pos)\n .forEach(({ pos, attrs }) => tr.setNodeMarkup(pos, divType, attrs));\n\n return tr;\n },\n }),\n ];\n },\n});\n"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAEA;AACA;AACA;AACA;AACA;AACO,IAAME,0BAA0B,GAAAC,OAAA,CAAAD,0BAAA,GAAGE,eAAS,CAACC,MAAM,CAAC;EACzDC,IAAI,EAAE,4BAA4B;EAElCC,qBAAqB,WAArBA,qBAAqBA,CAAA,EAAG;IACtB,IAAMC,GAAG,GAAG,IAAIC,gBAAS,CAAC,IAAI,CAACH,IAAI,CAAC;IAEpC,OAAO,CACL,IAAII,aAAM,CAAC;MACTF,GAAG,EAAHA,GAAG;MACHG,iBAAiB,WAAjBA,iBAAiBA,CAACC,YAAY,EAAEC,SAAS,EAAEC,QAAQ,EAAE;QACnD,IAAI,CAACF,YAAY,CAACG,IAAI,CAAC,UAACC,EAAE;UAAA,OAAKA,EAAE,CAACC,UAAU;QAAA,EAAC,EAAE;UAC7C,OAAO,IAAI;QACb;QAEA,IAAQC,GAAG,GAAaJ,QAAQ,CAAxBI,GAAG;UAAEC,MAAM,GAAKL,QAAQ,CAAnBK,MAAM;QACnB,IAAMC,OAAO,GAAGD,MAAM,CAACE,KAAK,CAACC,GAAG;QAChC,IAAI,CAACF,OAAO,EAAE;UACZ,OAAO,IAAI;QACb;QAEA,IAAMG,kBAAkB,GAAG,EAAE;QAE7BL,GAAG,CAACM,WAAW,CAAC,UAACC,IAAI,EAAEC,GAAG,EAAK;UAC7B,IAAID,IAAI,CAACE,IAAI,CAACrB,IAAI,KAAK,UAAU,EAAE;YACjC;UACF;UAEA,IAAIsB,WAAW,GAAG,CAAC;UACnBH,IAAI,CAACI,OAAO,CAAC,UAACC,KAAK,EAAK;YACtB,IAAIA,KAAK,CAACH,IAAI,CAACrB,IAAI,KAAK,WAAW,EAAE;cACnCiB,kBAAkB,CAACQ,IAAI,CAAC;gBACtBL,GAAG,EAAEA,GAAG,GAAGE,WAAW;gBACtBI,KAAK,EAAEF,KAAK,CAACE;cACf,CAAC,CAAC;YACJ;YACAJ,WAAW,IAAIE,KAAK,CAACG,QAAQ;UAC/B,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,IAAIV,kBAAkB,CAACW,MAAM,KAAK,CAAC,EAAE;UACnC,OAAO,IAAI;QACb;QAEA,IAAMlB,EAAE,GAAGF,QAAQ,CAACE,EAAE;QACtBO,kBAAkB,CACfY,IAAI,CAAC,UAACC,CAAC,EAAEC,CAAC;UAAA,OAAKA,CAAC,CAACX,GAAG,GAAGU,CAAC,CAACV,GAAG;QAAA,EAAC,CAC7BG,OAAO,CAAC,UAAAS,IAAA;UAAA,IAAGZ,GAAG,GAAAY,IAAA,CAAHZ,GAAG;YAAEM,KAAK,GAAAM,IAAA,CAALN,KAAK;UAAA,OAAOhB,EAAE,CAACuB,aAAa,CAACb,GAAG,EAAEN,OAAO,EAAEY,KAAK,CAAC;QAAA,EAAC;QAErE,OAAOhB,EAAE;MACX;IACF,CAAC,CAAC,CACH;EACH;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ExtendedListItem = void 0;
|
|
7
|
+
var _extensionListItem = require("@tiptap/extension-list-item");
|
|
8
|
+
/**
|
|
9
|
+
* Default list items use `paragraph block*`, so empty/new items become `<p>`.
|
|
10
|
+
* Prefer `div` first to keep consistency with DivNode at root and table cells.
|
|
11
|
+
*/
|
|
12
|
+
var ExtendedListItem = exports.ExtendedListItem = _extensionListItem.ListItem.extend({
|
|
13
|
+
content: '(div | paragraph | heading | bulletList | orderedList | blockquote | codeBlock | horizontalRule | image | imageUploadNode)+'
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=extended-list-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extended-list-item.js","names":["_extensionListItem","require","ExtendedListItem","exports","ListItem","extend","content"],"sources":["../../src/extensions/extended-list-item.js"],"sourcesContent":["import { ListItem } from '@tiptap/extension-list-item';\n\n/**\n * Default list items use `paragraph block*`, so empty/new items become `<p>`.\n * Prefer `div` first to keep consistency with DivNode at root and table cells.\n */\nexport const ExtendedListItem = ListItem.extend({\n content:\n '(div | paragraph | heading | bulletList | orderedList | blockquote | codeBlock | horizontalRule | image | imageUploadNode)+',\n});\n"],"mappings":";;;;;;AAAA,IAAAA,kBAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACO,IAAMC,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,GAAGE,2BAAQ,CAACC,MAAM,CAAC;EAC9CC,OAAO,EACL;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -123,15 +123,35 @@ function ImageComponent(props) {
|
|
|
123
123
|
var floored = width / imgRef.current.naturalWidth * 4;
|
|
124
124
|
return parseInt(floored.toFixed(0) * 25, 10);
|
|
125
125
|
}, []);
|
|
126
|
+
var findNodePos = (0, _react.useCallback)(function () {
|
|
127
|
+
var key = latestNodeRef.current.attrs.nodeKey;
|
|
128
|
+
var found = null;
|
|
129
|
+
editor.state.doc.descendants(function (n, pos) {
|
|
130
|
+
if (found !== null) return false;
|
|
131
|
+
if (n.type.name === 'imageUploadNode' && n.attrs.nodeKey === key) {
|
|
132
|
+
found = pos;
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
return found;
|
|
137
|
+
}, [editor]);
|
|
138
|
+
|
|
139
|
+
// dispatch an attribute update targeted precisely at this node by nodeKey.
|
|
140
|
+
var updateThisNode = (0, _react.useCallback)(function (newAttrs) {
|
|
141
|
+
var nodePos = findNodePos();
|
|
142
|
+
if (nodePos === null) return;
|
|
143
|
+
var currentNode = editor.state.doc.nodeAt(nodePos);
|
|
144
|
+
if (!currentNode) return;
|
|
145
|
+
editor.view.dispatch(editor.state.tr.setNodeMarkup(nodePos, undefined, _objectSpread(_objectSpread({}, currentNode.attrs), newAttrs)));
|
|
146
|
+
}, [editor, findNodePos]);
|
|
126
147
|
var applySizeData = (0, _react.useCallback)(function () {
|
|
127
148
|
if (!node.attrs.width || !imgRef.current) return;
|
|
128
|
-
var
|
|
129
|
-
|
|
149
|
+
var resizePercent = getPercentFromWidth(node.attrs.width);
|
|
150
|
+
if (node.attrs.resizePercent === resizePercent) return;
|
|
151
|
+
updateThisNode({
|
|
152
|
+
resizePercent: resizePercent
|
|
130
153
|
});
|
|
131
|
-
|
|
132
|
-
editor.commands.updateAttributes('imageUploadNode', update);
|
|
133
|
-
}
|
|
134
|
-
}, [editor, node.attrs, getPercentFromWidth]);
|
|
154
|
+
}, [node.attrs.width, node.attrs.resizePercent, getPercentFromWidth, updateThisNode]);
|
|
135
155
|
|
|
136
156
|
// keep ref in sync with latest node
|
|
137
157
|
(0, _react.useEffect)(function () {
|
|
@@ -186,11 +206,14 @@ function ImageComponent(props) {
|
|
|
186
206
|
width: w,
|
|
187
207
|
height: h
|
|
188
208
|
};
|
|
189
|
-
if (!(0, _isEqual["default"])(update,
|
|
190
|
-
|
|
209
|
+
if (!(0, _isEqual["default"])(update, {
|
|
210
|
+
width: node.attrs.width,
|
|
211
|
+
height: node.attrs.height
|
|
212
|
+
})) {
|
|
213
|
+
updateThisNode(update);
|
|
191
214
|
}
|
|
192
215
|
}
|
|
193
|
-
}, [
|
|
216
|
+
}, [node.attrs.width, node.attrs.height, maxImageWidth, maxImageHeight, updateThisNode]);
|
|
194
217
|
var updateAspect = function updateAspect(initial, next) {
|
|
195
218
|
var keepAspect = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
|
|
196
219
|
var resizeType = arguments.length > 3 ? arguments[3] : undefined;
|
|
@@ -222,34 +245,15 @@ function ImageComponent(props) {
|
|
|
222
245
|
if (next.width > 50 && next.height > 50 && next.width <= 700 && next.height <= 900) {
|
|
223
246
|
box.style.width = "".concat(next.width, "px");
|
|
224
247
|
box.style.height = "".concat(next.height, "px");
|
|
225
|
-
|
|
248
|
+
updateThisNode({
|
|
226
249
|
width: next.width,
|
|
227
250
|
height: next.height
|
|
228
|
-
};
|
|
229
|
-
if (!(0, _isEqual["default"])(update, node.attrs)) {
|
|
230
|
-
editor.commands.updateAttributes('imageUploadNode', update);
|
|
231
|
-
}
|
|
251
|
+
});
|
|
232
252
|
}
|
|
233
|
-
}, [editor,
|
|
234
|
-
|
|
235
|
-
// Helper to find this node's current position in the doc.
|
|
236
|
-
// We cannot use object identity (n === node) because ProseMirror replaces
|
|
237
|
-
// node objects after every transaction — match by src instead.
|
|
238
|
-
var findNodePos = (0, _react.useCallback)(function () {
|
|
239
|
-
var found = null;
|
|
240
|
-
var src = latestNodeRef.current.attrs.src;
|
|
241
|
-
editor.state.doc.descendants(function (n, pos) {
|
|
242
|
-
if (found !== null) return false;
|
|
243
|
-
if (n.type.name === 'imageUploadNode' && n.attrs.src === src) {
|
|
244
|
-
found = pos;
|
|
245
|
-
return false;
|
|
246
|
-
}
|
|
247
|
-
});
|
|
248
|
-
return found;
|
|
249
|
-
}, [editor]);
|
|
253
|
+
}, [editor, updateThisNode]);
|
|
250
254
|
var onChange = (0, _react.useCallback)(function (newValues) {
|
|
251
|
-
|
|
252
|
-
}, [editor]);
|
|
255
|
+
updateThisNode(newValues);
|
|
256
|
+
}, [editor, updateThisNode]);
|
|
253
257
|
var stopResize = (0, _react.useCallback)(function () {
|
|
254
258
|
window.removeEventListener('mousemove', startResize);
|
|
255
259
|
window.removeEventListener('mouseup', stopResize);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-component.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_isEqual","_debug","_LinearProgress","_styles","_react2","_reactDom","_InsertImageHandler","_ImageToolbar","_customToolbarWrapper","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","log","debug","StyledProgress","styled","LinearProgress","shouldForwardProp","prop","_ref","hideProgress","position","left","width","top","transition","opacity","StyledRoot","includes","_ref2","loading","pendingDelete","display","StyledImageContainer","_ref3","theme","alignItems","StyledImage","_ref4","active","border","concat","palette","primary","main","StyledResize","_ref5","backgroundColor","cursor","height","borderRadius","marginLeft","marginRight","sizePx","s","ImageComponent","props","_options$imageHandlin6","node","editor","attributes","onFocus","getPos","selected","options","_props$maxImageWidth","maxImageWidth","_props$maxImageHeight","maxImageHeight","alt","attrs","pos","_useState","useState","_useState2","_slicedToArray2","showToolbar","setShowToolbar","latestNodeRef","useRef","imgRef","resizeRef","toolbarRef","getPercentFromWidth","useCallback","floored","current","naturalWidth","parseInt","toFixed","applySizeData","update","resizePercent","isEqual","commands","updateAttributes","useEffect","selection","state","onlyThisNodeSelected","from","nodeSize","to","_node$attrs$src","_node$attrs","_options$imageHandlin","hasImageSrc","String","src","trim","imageHandling","insertImageRequested","finish","InsertImageHandler","resizeHandle","addEventListener","initResize","removeEventListener","loadImage","box","style","w","Math","min","h","naturalHeight","updateAspect","initial","next","keepAspect","undefined","resizeType","ratio","startResize","bounds","target","getBoundingClientRect","clientX","clientY","findNodePos","found","doc","descendants","type","name","onChange","newValues","stopResize","window","objectFit","flexAlign","center","right","alignment","createElement","NodeViewWrapper","loaded","deleteStatus","justifyContent","mode","value","percent","onDragStart","preventDefault","_extends2","draggable","ref","onLoad","className","_tiptapContainerEl","ReactDOM","createPortal","zIndex","background","boxShadow","showDone","deletable","toolbarOpts","onDelete","_options$imageHandlin2","_options$imageHandlin3","nodePos","view","dispatch","tr","nodeAt","focus","onDone","_options$imageHandlin4","_options$imageHandlin5","disableImageAlignmentButtons","imageLoaded","propTypes","PropTypes","object","isRequired","func","number","_default","exports"],"sources":["../../src/extensions/image-component.jsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport isEqual from 'lodash-es/isEqual';\nimport debug from 'debug';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport { styled } from '@mui/material/styles';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport ReactDOM from 'react-dom';\nimport InsertImageHandler from '../components/image/InsertImageHandler';\nimport ImageToolbar from '../components/image/ImageToolbar';\nimport CustomToolbarWrapper from './custom-toolbar-wrapper';\n\nconst log = debug('@pie-lib:editable-html:plugins:image:component');\n\nconst StyledProgress = styled(LinearProgress, {\n shouldForwardProp: (prop) => prop !== 'hideProgress',\n})(({ hideProgress }) => ({\n position: 'absolute',\n left: '0',\n width: 'fit-content',\n top: '0%',\n transition: 'opacity 200ms linear',\n ...(hideProgress && {\n opacity: 0,\n }),\n}));\n\nconst StyledRoot = styled('div', {\n shouldForwardProp: (prop) => !['active', 'loading', 'pendingDelete'].includes(prop),\n})(({ loading, pendingDelete }) => ({\n position: 'relative',\n display: 'flex',\n transition: 'opacity 200ms linear',\n ...(loading && {\n opacity: 0.3,\n }),\n ...(pendingDelete && {\n opacity: 0.3,\n }),\n}));\n\nconst StyledImageContainer = styled('div')(({ theme }) => ({\n position: 'relative',\n width: 'fit-content',\n display: 'flex',\n alignItems: 'center',\n '&&:hover > .resize': {\n display: 'block',\n },\n}));\n\nconst StyledImage = styled('img', {\n shouldForwardProp: (prop) => prop !== 'active',\n})(({ theme, active }) => ({\n border: active ? `solid 1px ${theme.palette.primary.main}` : 'solid 1px transparent',\n}));\n\nconst StyledResize = styled('div')(({ theme }) => ({\n backgroundColor: theme.palette.primary.main,\n cursor: 'col-resize',\n height: '35px',\n width: '5px',\n borderRadius: 8,\n marginLeft: '5px',\n marginRight: '10px',\n display: 'none',\n}));\n\nconst sizePx = (s) => (s ? `${s}px` : 'calc(20px)');\n\nfunction ImageComponent(props) {\n const {\n node,\n editor,\n attributes,\n onFocus,\n getPos,\n selected,\n options,\n maxImageWidth = 700,\n maxImageHeight = 900,\n } = props;\n const { alt } = node.attrs;\n const pos = getPos();\n\n const [showToolbar, setShowToolbar] = useState(false);\n\n const latestNodeRef = useRef(node);\n const imgRef = useRef(null);\n const resizeRef = useRef(null);\n const toolbarRef = useRef(null);\n\n const getPercentFromWidth = useCallback((width) => {\n const floored = (width / imgRef.current.naturalWidth) * 4;\n return parseInt(floored.toFixed(0) * 25, 10);\n }, []);\n\n const applySizeData = useCallback(() => {\n if (!node.attrs.width || !imgRef.current) return;\n\n const update = {\n ...node.attrs,\n resizePercent: getPercentFromWidth(node.attrs.width),\n };\n\n if (!isEqual(update, node.attrs)) {\n editor.commands.updateAttributes('imageUploadNode', update);\n }\n }, [editor, node.attrs, getPercentFromWidth]);\n\n // keep ref in sync with latest node\n useEffect(() => {\n latestNodeRef.current = { ...node, pos };\n }, [node, pos]);\n\n useEffect(() => {\n const { selection } = editor.state;\n const onlyThisNodeSelected = selection.from + node.nodeSize === selection.to;\n\n if (selected) {\n if (onlyThisNodeSelected) {\n // Only open the upload UI for a fresh placeholder. Remounting after tab switch\n // would otherwise call insertImageRequested again and reopen the file modal.\n const hasImageSrc = String(node.attrs?.src ?? '').trim();\n\n if (!hasImageSrc && options.imageHandling?.insertImageRequested) {\n options.imageHandling.insertImageRequested(\n editor,\n [node, pos],\n (finish) => new InsertImageHandler(editor, [node, pos], finish),\n );\n }\n\n setShowToolbar(selected);\n }\n } else {\n setShowToolbar(selected);\n }\n }, [editor, node, pos, selected]);\n\n useEffect(() => {\n applySizeData();\n\n const resizeHandle = resizeRef.current;\n if (resizeHandle) {\n resizeHandle.addEventListener('mousedown', initResize, false);\n }\n return () => {\n if (resizeHandle) {\n resizeHandle.removeEventListener('mousedown', initResize, false);\n }\n };\n }, []);\n\n useEffect(() => {\n applySizeData();\n });\n\n const loadImage = useCallback(() => {\n const box = imgRef.current;\n if (!box) return;\n\n if (!box.style.width || box.style.width === 'calc(20px)') {\n const w = Math.min(box.naturalWidth, maxImageWidth);\n const h = Math.min(box.naturalHeight, maxImageHeight);\n\n box.style.width = `${w}px`;\n box.style.height = `${h}px`;\n\n const update = { width: w, height: h };\n if (!isEqual(update, node.attrs)) {\n editor.commands.updateAttributes('imageUploadNode', update);\n }\n }\n }, [editor, node.attrs, maxImageWidth, maxImageHeight]);\n\n const updateAspect = (initial, next, keepAspect = true, resizeType) => {\n if (keepAspect) {\n const ratio = initial.width / initial.height;\n if (resizeType === 'height') return { width: next.height * ratio, height: next.height };\n return { width: next.width, height: next.width / ratio };\n }\n return next;\n };\n\n const startResize = useCallback(\n (e) => {\n const box = imgRef.current;\n if (!box) return;\n\n const bounds = e.target.getBoundingClientRect();\n const initial = { width: box.naturalWidth, height: box.naturalHeight };\n\n const next = updateAspect(initial, {\n width: e.clientX - bounds.left,\n height: e.clientY - bounds.top,\n });\n\n if (next.width > 50 && next.height > 50 && next.width <= 700 && next.height <= 900) {\n box.style.width = `${next.width}px`;\n box.style.height = `${next.height}px`;\n\n const update = { width: next.width, height: next.height };\n if (!isEqual(update, node.attrs)) {\n editor.commands.updateAttributes('imageUploadNode', update);\n }\n }\n },\n [editor, node.attrs],\n );\n\n // Helper to find this node's current position in the doc.\n // We cannot use object identity (n === node) because ProseMirror replaces\n // node objects after every transaction — match by src instead.\n const findNodePos = useCallback(() => {\n let found = null;\n const src = latestNodeRef.current.attrs.src;\n editor.state.doc.descendants((n, pos) => {\n if (found !== null) return false;\n if (n.type.name === 'imageUploadNode' && n.attrs.src === src) {\n found = pos;\n return false;\n }\n });\n return found;\n }, [editor]);\n\n const onChange = useCallback(\n (newValues) => {\n editor.commands.updateAttributes('imageUploadNode', newValues);\n },\n [editor],\n );\n\n const stopResize = useCallback(() => {\n window.removeEventListener('mousemove', startResize);\n window.removeEventListener('mouseup', stopResize);\n }, [startResize]);\n\n const initResize = useCallback(() => {\n window.addEventListener('mousemove', startResize);\n window.addEventListener('mouseup', stopResize);\n }, [startResize, stopResize]);\n\n const style = {\n width: sizePx(node.attrs.width),\n height: sizePx(node.attrs.height),\n objectFit: 'contain',\n };\n\n const flexAlign = { left: 'flex-start', center: 'center', right: 'flex-end' }[node.attrs.alignment] || 'flex-start';\n\n return (\n <NodeViewWrapper>\n <StyledRoot\n onFocus={onFocus}\n loading={!node.attrs.loaded}\n pendingDelete={node.attrs.deleteStatus === 'pending'}\n style={{ justifyContent: flexAlign }}\n >\n <StyledProgress mode=\"determinate\" value={node.attrs.percent || 0} hideProgress={node.attrs.loaded} />\n\n <StyledImageContainer onDragStart={(e) => e.preventDefault()}>\n <StyledImage\n {...attributes}\n active={selected && node.attrs.loaded}\n draggable={false}\n ref={imgRef}\n src={node.attrs.src}\n style={style}\n onLoad={loadImage}\n alt={node.attrs.alt}\n />\n <StyledResize ref={resizeRef} className=\"resize\" />\n </StyledImageContainer>\n </StyledRoot>\n\n {showToolbar &&\n editor._tiptapContainerEl &&\n ReactDOM.createPortal(\n <div\n ref={toolbarRef}\n style={{\n zIndex: 20,\n background: 'var(--editable-html-toolbar-bg, #efefef)',\n boxShadow:\n '0px 1px 5px 0px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 3px 1px -2px rgba(0, 0, 0, 0.12)',\n width: '100%',\n }}\n >\n <CustomToolbarWrapper\n showDone\n deletable\n toolbarOpts={options.toolbarOpts || {}}\n onDelete={() => {\n const nodePos = findNodePos();\n if (nodePos === null) return;\n\n options.imageHandling?.onDelete?.(latestNodeRef.current);\n\n editor.view.dispatch(\n editor.state.tr.delete(nodePos, nodePos + editor.state.doc.nodeAt(nodePos).nodeSize),\n );\n setShowToolbar(false);\n editor.commands.focus();\n }}\n onDone={() => {\n setShowToolbar(false);\n options.imageHandling?.onDone?.(editor);\n editor.commands.focus('end');\n }}\n >\n <ImageToolbar\n disableImageAlignmentButtons={options.imageHandling?.disableImageAlignmentButtons}\n alt={node.attrs.alt}\n imageLoaded={node.attrs.loaded}\n alignment={node.attrs.alignment || 'left'}\n onChange={onChange}\n />\n </CustomToolbarWrapper>\n </div>,\n editor._tiptapContainerEl,\n )}\n </NodeViewWrapper>\n );\n}\n\nImageComponent.propTypes = {\n node: PropTypes.object.isRequired,\n editor: PropTypes.object.isRequired,\n attributes: PropTypes.object,\n onFocus: PropTypes.func,\n maxImageWidth: PropTypes.number,\n maxImageHeight: PropTypes.number,\n};\n\nexport default ImageComponent;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"image-component.js","names":["_react","_interopRequireWildcard","require","_propTypes","_interopRequireDefault","_isEqual","_debug","_LinearProgress","_styles","_react2","_reactDom","_InsertImageHandler","_ImageToolbar","_customToolbarWrapper","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","log","debug","StyledProgress","styled","LinearProgress","shouldForwardProp","prop","_ref","hideProgress","position","left","width","top","transition","opacity","StyledRoot","includes","_ref2","loading","pendingDelete","display","StyledImageContainer","_ref3","theme","alignItems","StyledImage","_ref4","active","border","concat","palette","primary","main","StyledResize","_ref5","backgroundColor","cursor","height","borderRadius","marginLeft","marginRight","sizePx","s","ImageComponent","props","_options$imageHandlin6","node","editor","attributes","onFocus","getPos","selected","options","_props$maxImageWidth","maxImageWidth","_props$maxImageHeight","maxImageHeight","alt","attrs","pos","_useState","useState","_useState2","_slicedToArray2","showToolbar","setShowToolbar","latestNodeRef","useRef","imgRef","resizeRef","toolbarRef","getPercentFromWidth","useCallback","floored","current","naturalWidth","parseInt","toFixed","findNodePos","key","nodeKey","found","state","doc","descendants","type","name","updateThisNode","newAttrs","nodePos","currentNode","nodeAt","view","dispatch","tr","setNodeMarkup","undefined","applySizeData","resizePercent","useEffect","selection","onlyThisNodeSelected","from","nodeSize","to","_node$attrs$src","_node$attrs","_options$imageHandlin","hasImageSrc","String","src","trim","imageHandling","insertImageRequested","finish","InsertImageHandler","resizeHandle","addEventListener","initResize","removeEventListener","loadImage","box","style","w","Math","min","h","naturalHeight","update","isEqual","updateAspect","initial","next","keepAspect","resizeType","ratio","startResize","bounds","target","getBoundingClientRect","clientX","clientY","onChange","newValues","stopResize","window","objectFit","flexAlign","center","right","alignment","createElement","NodeViewWrapper","loaded","deleteStatus","justifyContent","mode","value","percent","onDragStart","preventDefault","_extends2","draggable","ref","onLoad","className","_tiptapContainerEl","ReactDOM","createPortal","zIndex","background","boxShadow","showDone","deletable","toolbarOpts","onDelete","_options$imageHandlin2","_options$imageHandlin3","commands","focus","onDone","_options$imageHandlin4","_options$imageHandlin5","disableImageAlignmentButtons","imageLoaded","propTypes","PropTypes","object","isRequired","func","number","_default","exports"],"sources":["../../src/extensions/image-component.jsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport PropTypes from 'prop-types';\nimport isEqual from 'lodash-es/isEqual';\nimport debug from 'debug';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport { styled } from '@mui/material/styles';\nimport { NodeViewWrapper } from '@tiptap/react';\nimport ReactDOM from 'react-dom';\nimport InsertImageHandler from '../components/image/InsertImageHandler';\nimport ImageToolbar from '../components/image/ImageToolbar';\nimport CustomToolbarWrapper from './custom-toolbar-wrapper';\n\nconst log = debug('@pie-lib:editable-html:plugins:image:component');\n\nconst StyledProgress = styled(LinearProgress, {\n shouldForwardProp: (prop) => prop !== 'hideProgress',\n})(({ hideProgress }) => ({\n position: 'absolute',\n left: '0',\n width: 'fit-content',\n top: '0%',\n transition: 'opacity 200ms linear',\n ...(hideProgress && {\n opacity: 0,\n }),\n}));\n\nconst StyledRoot = styled('div', {\n shouldForwardProp: (prop) => !['active', 'loading', 'pendingDelete'].includes(prop),\n})(({ loading, pendingDelete }) => ({\n position: 'relative',\n display: 'flex',\n transition: 'opacity 200ms linear',\n ...(loading && {\n opacity: 0.3,\n }),\n ...(pendingDelete && {\n opacity: 0.3,\n }),\n}));\n\nconst StyledImageContainer = styled('div')(({ theme }) => ({\n position: 'relative',\n width: 'fit-content',\n display: 'flex',\n alignItems: 'center',\n '&&:hover > .resize': {\n display: 'block',\n },\n}));\n\nconst StyledImage = styled('img', {\n shouldForwardProp: (prop) => prop !== 'active',\n})(({ theme, active }) => ({\n border: active ? `solid 1px ${theme.palette.primary.main}` : 'solid 1px transparent',\n}));\n\nconst StyledResize = styled('div')(({ theme }) => ({\n backgroundColor: theme.palette.primary.main,\n cursor: 'col-resize',\n height: '35px',\n width: '5px',\n borderRadius: 8,\n marginLeft: '5px',\n marginRight: '10px',\n display: 'none',\n}));\n\nconst sizePx = (s) => (s ? `${s}px` : 'calc(20px)');\n\nfunction ImageComponent(props) {\n const {\n node,\n editor,\n attributes,\n onFocus,\n getPos,\n selected,\n options,\n maxImageWidth = 700,\n maxImageHeight = 900,\n } = props;\n const { alt } = node.attrs;\n const pos = getPos();\n\n const [showToolbar, setShowToolbar] = useState(false);\n\n const latestNodeRef = useRef(node);\n const imgRef = useRef(null);\n const resizeRef = useRef(null);\n const toolbarRef = useRef(null);\n\n const getPercentFromWidth = useCallback((width) => {\n const floored = (width / imgRef.current.naturalWidth) * 4;\n return parseInt(floored.toFixed(0) * 25, 10);\n }, []);\n\n const findNodePos = useCallback(() => {\n const key = latestNodeRef.current.attrs.nodeKey;\n let found = null;\n editor.state.doc.descendants((n, pos) => {\n if (found !== null) return false;\n if (n.type.name === 'imageUploadNode' && n.attrs.nodeKey === key) {\n found = pos;\n return false;\n }\n });\n return found;\n }, [editor]);\n\n // dispatch an attribute update targeted precisely at this node by nodeKey.\n const updateThisNode = useCallback((newAttrs) => {\n const nodePos = findNodePos();\n if (nodePos === null) return;\n const currentNode = editor.state.doc.nodeAt(nodePos);\n if (!currentNode) return;\n editor.view.dispatch(\n editor.state.tr.setNodeMarkup(nodePos, undefined, { ...currentNode.attrs, ...newAttrs }),\n );\n }, [editor, findNodePos]);\n\n const applySizeData = useCallback(() => {\n if (!node.attrs.width || !imgRef.current) return;\n const resizePercent = getPercentFromWidth(node.attrs.width);\n if (node.attrs.resizePercent === resizePercent) return;\n updateThisNode({ resizePercent });\n }, [node.attrs.width, node.attrs.resizePercent, getPercentFromWidth, updateThisNode]);\n\n // keep ref in sync with latest node\n useEffect(() => {\n latestNodeRef.current = { ...node, pos };\n }, [node, pos]);\n\n useEffect(() => {\n const { selection } = editor.state;\n const onlyThisNodeSelected = selection.from + node.nodeSize === selection.to;\n\n if (selected) {\n if (onlyThisNodeSelected) {\n // Only open the upload UI for a fresh placeholder. Remounting after tab switch\n // would otherwise call insertImageRequested again and reopen the file modal.\n const hasImageSrc = String(node.attrs?.src ?? '').trim();\n\n if (!hasImageSrc && options.imageHandling?.insertImageRequested) {\n options.imageHandling.insertImageRequested(\n editor,\n [node, pos],\n (finish) => new InsertImageHandler(editor, [node, pos], finish),\n );\n }\n\n setShowToolbar(selected);\n }\n } else {\n setShowToolbar(selected);\n }\n }, [editor, node, pos, selected]);\n\n useEffect(() => {\n applySizeData();\n\n const resizeHandle = resizeRef.current;\n if (resizeHandle) {\n resizeHandle.addEventListener('mousedown', initResize, false);\n }\n return () => {\n if (resizeHandle) {\n resizeHandle.removeEventListener('mousedown', initResize, false);\n }\n };\n }, []);\n\n useEffect(() => {\n applySizeData();\n });\n\n const loadImage = useCallback(() => {\n const box = imgRef.current;\n if (!box) return;\n\n if (!box.style.width || box.style.width === 'calc(20px)') {\n const w = Math.min(box.naturalWidth, maxImageWidth);\n const h = Math.min(box.naturalHeight, maxImageHeight);\n\n box.style.width = `${w}px`;\n box.style.height = `${h}px`;\n\n const update = { width: w, height: h };\n if (!isEqual(update, { width: node.attrs.width, height: node.attrs.height })) {\n updateThisNode(update);\n }\n }\n }, [node.attrs.width, node.attrs.height, maxImageWidth, maxImageHeight, updateThisNode]);\n\n const updateAspect = (initial, next, keepAspect = true, resizeType) => {\n if (keepAspect) {\n const ratio = initial.width / initial.height;\n if (resizeType === 'height') return { width: next.height * ratio, height: next.height };\n return { width: next.width, height: next.width / ratio };\n }\n return next;\n };\n\n const startResize = useCallback(\n (e) => {\n const box = imgRef.current;\n if (!box) return;\n\n const bounds = e.target.getBoundingClientRect();\n const initial = { width: box.naturalWidth, height: box.naturalHeight };\n\n const next = updateAspect(initial, {\n width: e.clientX - bounds.left,\n height: e.clientY - bounds.top,\n });\n\n if (next.width > 50 && next.height > 50 && next.width <= 700 && next.height <= 900) {\n box.style.width = `${next.width}px`;\n box.style.height = `${next.height}px`;\n\n updateThisNode({ width: next.width, height: next.height });\n }\n },\n [editor, updateThisNode],\n );\n\n const onChange = useCallback(\n (newValues) => {\n updateThisNode(newValues);\n },\n [editor, updateThisNode],\n );\n\n const stopResize = useCallback(() => {\n window.removeEventListener('mousemove', startResize);\n window.removeEventListener('mouseup', stopResize);\n }, [startResize]);\n\n const initResize = useCallback(() => {\n window.addEventListener('mousemove', startResize);\n window.addEventListener('mouseup', stopResize);\n }, [startResize, stopResize]);\n\n const style = {\n width: sizePx(node.attrs.width),\n height: sizePx(node.attrs.height),\n objectFit: 'contain',\n };\n\n const flexAlign = { left: 'flex-start', center: 'center', right: 'flex-end' }[node.attrs.alignment] || 'flex-start';\n\n return (\n <NodeViewWrapper>\n <StyledRoot\n onFocus={onFocus}\n loading={!node.attrs.loaded}\n pendingDelete={node.attrs.deleteStatus === 'pending'}\n style={{ justifyContent: flexAlign }}\n >\n <StyledProgress mode=\"determinate\" value={node.attrs.percent || 0} hideProgress={node.attrs.loaded} />\n\n <StyledImageContainer onDragStart={(e) => e.preventDefault()}>\n <StyledImage\n {...attributes}\n active={selected && node.attrs.loaded}\n draggable={false}\n ref={imgRef}\n src={node.attrs.src}\n style={style}\n onLoad={loadImage}\n alt={node.attrs.alt}\n />\n <StyledResize ref={resizeRef} className=\"resize\" />\n </StyledImageContainer>\n </StyledRoot>\n\n {showToolbar &&\n editor._tiptapContainerEl &&\n ReactDOM.createPortal(\n <div\n ref={toolbarRef}\n style={{\n zIndex: 20,\n background: 'var(--editable-html-toolbar-bg, #efefef)',\n boxShadow:\n '0px 1px 5px 0px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 3px 1px -2px rgba(0, 0, 0, 0.12)',\n width: '100%',\n }}\n >\n <CustomToolbarWrapper\n showDone\n deletable\n toolbarOpts={options.toolbarOpts || {}}\n onDelete={() => {\n const nodePos = findNodePos();\n if (nodePos === null) return;\n\n options.imageHandling?.onDelete?.(latestNodeRef.current);\n\n editor.view.dispatch(\n editor.state.tr.delete(nodePos, nodePos + editor.state.doc.nodeAt(nodePos).nodeSize),\n );\n setShowToolbar(false);\n editor.commands.focus();\n }}\n onDone={() => {\n setShowToolbar(false);\n options.imageHandling?.onDone?.(editor);\n editor.commands.focus('end');\n }}\n >\n <ImageToolbar\n disableImageAlignmentButtons={options.imageHandling?.disableImageAlignmentButtons}\n alt={node.attrs.alt}\n imageLoaded={node.attrs.loaded}\n alignment={node.attrs.alignment || 'left'}\n onChange={onChange}\n />\n </CustomToolbarWrapper>\n </div>,\n editor._tiptapContainerEl,\n )}\n </NodeViewWrapper>\n );\n}\n\nImageComponent.propTypes = {\n node: PropTypes.object.isRequired,\n editor: PropTypes.object.isRequired,\n attributes: PropTypes.object,\n onFocus: PropTypes.func,\n maxImageWidth: PropTypes.number,\n maxImageHeight: PropTypes.number,\n};\n\nexport default ImageComponent;\n"],"mappings":"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","ignoreList":[]}
|
package/lib/extensions/image.js
CHANGED
|
@@ -11,6 +11,7 @@ var _react = require("@tiptap/react");
|
|
|
11
11
|
var _state = require("@tiptap/pm/state");
|
|
12
12
|
var _react2 = _interopRequireDefault(require("react"));
|
|
13
13
|
var _imageComponent = _interopRequireDefault(require("./image-component"));
|
|
14
|
+
var _propTypes = require("prop-types");
|
|
14
15
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
15
16
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
16
17
|
var ImageUploadNode = exports.ImageUploadNode = _core.Node.create({
|
|
@@ -24,6 +25,9 @@ var ImageUploadNode = exports.ImageUploadNode = _core.Node.create({
|
|
|
24
25
|
// optional
|
|
25
26
|
addAttributes: function addAttributes() {
|
|
26
27
|
return {
|
|
28
|
+
nodeKey: {
|
|
29
|
+
"default": null
|
|
30
|
+
},
|
|
27
31
|
loaded: {
|
|
28
32
|
"default": false
|
|
29
33
|
},
|
|
@@ -76,7 +80,11 @@ var ImageUploadNode = exports.ImageUploadNode = _core.Node.create({
|
|
|
76
80
|
return function (_ref2) {
|
|
77
81
|
var commands = _ref2.commands;
|
|
78
82
|
return commands.insertContent({
|
|
79
|
-
type: _this2.name
|
|
83
|
+
type: _this2.name,
|
|
84
|
+
// adding a unique nodeKey attribute to help identify this node instance later due to issues with multiple images
|
|
85
|
+
attrs: {
|
|
86
|
+
nodeKey: "img-".concat(Date.now(), "-").concat(Math.random().toString(36).slice(2))
|
|
87
|
+
}
|
|
80
88
|
});
|
|
81
89
|
};
|
|
82
90
|
}
|
|
@@ -111,7 +119,8 @@ var ImageUploadNode = exports.ImageUploadNode = _core.Node.create({
|
|
|
111
119
|
type: 'imageUploadNode',
|
|
112
120
|
attrs: {
|
|
113
121
|
src: src,
|
|
114
|
-
loaded: true
|
|
122
|
+
loaded: true,
|
|
123
|
+
nodeKey: "img-".concat(Date.now(), "-").concat(Math.random().toString(36).slice(2))
|
|
115
124
|
}
|
|
116
125
|
});
|
|
117
126
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.js","names":["_core","require","_react","_state","_react2","_interopRequireDefault","_imageComponent","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","ImageUploadNode","exports","Node","create","name","group","atom","selectable","draggable","addAttributes","loaded","deleteStatus","alignment","percent","width","height","src","alt","parseHTML","tag","renderHTML","_ref","HTMLAttributes","mergeAttributes","addNodeView","_this","ReactNodeViewRenderer","props","createElement","options","addCommands","_this2","setImageUploadNode","_ref2","commands","insertContent","type","addProseMirrorPlugins","editor","Plugin","handlePaste","view","event","_event$clipboardData","items","Array","from","clipboardData","imageItem","find","item","kind","startsWith","file","getAsFile","reader","FileReader","onload","result","
|
|
1
|
+
{"version":3,"file":"image.js","names":["_core","require","_react","_state","_react2","_interopRequireDefault","_imageComponent","_propTypes","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty2","getOwnPropertyDescriptors","defineProperties","defineProperty","ImageUploadNode","exports","Node","create","name","group","atom","selectable","draggable","addAttributes","nodeKey","loaded","deleteStatus","alignment","percent","width","height","src","alt","parseHTML","tag","renderHTML","_ref","HTMLAttributes","mergeAttributes","addNodeView","_this","ReactNodeViewRenderer","props","createElement","options","addCommands","_this2","setImageUploadNode","_ref2","commands","insertContent","type","attrs","concat","Date","now","Math","random","toString","slice","addProseMirrorPlugins","editor","Plugin","handlePaste","view","event","_event$clipboardData","items","Array","from","clipboardData","imageItem","find","item","kind","startsWith","file","getAsFile","reader","FileReader","onload","result","readAsDataURL"],"sources":["../../src/extensions/image.js"],"sourcesContent":["import { mergeAttributes, Node } from '@tiptap/core';\nimport { ReactNodeViewRenderer } from '@tiptap/react';\nimport { Plugin } from '@tiptap/pm/state';\nimport React from 'react';\nimport ImageComponent from './image-component';\nimport { node } from 'prop-types';\n\nexport const ImageUploadNode = Node.create({\n name: 'imageUploadNode',\n\n group: 'block',\n atom: true, // ✅ prevents content holes\n selectable: true, // optional\n draggable: true, // optional\n\n addAttributes() {\n return {\n nodeKey: { default: null },\n loaded: { default: false },\n deleteStatus: { default: null },\n alignment: { default: null },\n percent: { default: null },\n width: { default: null },\n height: { default: null },\n src: { default: null },\n alt: { default: null },\n };\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[data-type=\"image-upload-node\"]',\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['img', mergeAttributes(HTMLAttributes, { 'data-type': 'image-upload-node' })];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer((props) => <ImageComponent {...{ ...props, options: this.options }} />);\n },\n\n addCommands() {\n return {\n setImageUploadNode:\n () =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n // adding a unique nodeKey attribute to help identify this node instance later due to issues with multiple images\n attrs: { nodeKey: `img-${Date.now()}-${Math.random().toString(36).slice(2)}` },\n });\n },\n };\n },\n\n addProseMirrorPlugins() {\n const editor = this.editor;\n\n return [\n new Plugin({\n props: {\n handlePaste(view, event) {\n const items = Array.from(event.clipboardData?.items || []);\n\n const imageItem = items.find((item) => item.kind === 'file' && item.type.startsWith('image/'));\n\n if (!imageItem) {\n return false;\n }\n\n const file = imageItem.getAsFile();\n\n if (!file) {\n return false;\n }\n\n // Example 1: insert as base64 immediately\n const reader = new FileReader();\n\n reader.onload = () => {\n const src = reader.result;\n\n if (typeof src !== 'string') {\n return;\n }\n\n editor.commands.insertContent({\n type: 'imageUploadNode',\n attrs: {\n src,\n loaded: true,\n nodeKey: `img-${Date.now()}-${Math.random().toString(36).slice(2)}`,\n },\n });\n };\n\n reader.readAsDataURL(file);\n\n return true;\n },\n },\n }),\n ];\n },\n});\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": "1.2.0-next.
|
|
6
|
+
"version": "1.2.0-next.34",
|
|
7
7
|
"description": "",
|
|
8
8
|
"license": "ISC",
|
|
9
9
|
"main": "lib/index.js",
|
|
@@ -59,6 +59,6 @@
|
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"react": "^18.2.0"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "deace2ad16b79cd8ca6d955819d722ba36adf09e",
|
|
63
63
|
"scripts": {}
|
|
64
64
|
}
|
|
@@ -85,6 +85,14 @@ jest.mock('../extensions/ensure-empty-root-div', () => ({
|
|
|
85
85
|
EnsureEmptyRootIsDiv: {},
|
|
86
86
|
}));
|
|
87
87
|
|
|
88
|
+
jest.mock('../extensions/extended-list-item', () => ({
|
|
89
|
+
ExtendedListItem: {},
|
|
90
|
+
}));
|
|
91
|
+
|
|
92
|
+
jest.mock('../extensions/ensure-list-item-content-is-div', () => ({
|
|
93
|
+
EnsureListItemContentIsDiv: {},
|
|
94
|
+
}));
|
|
95
|
+
|
|
88
96
|
jest.mock('../extensions/responseArea', () => ({
|
|
89
97
|
ExplicitConstructedResponseNode: {
|
|
90
98
|
configure: jest.fn(() => ({})),
|
|
@@ -36,6 +36,8 @@ jest.mock('../extensions/extended-table-cell', () => ({
|
|
|
36
36
|
}));
|
|
37
37
|
jest.mock('../extensions/extended-table', () => ({ __esModule: true, default: {} }));
|
|
38
38
|
jest.mock('../extensions/ensure-empty-root-div', () => ({ EnsureEmptyRootIsDiv: {} }));
|
|
39
|
+
jest.mock('../extensions/extended-list-item', () => ({ ExtendedListItem: {} }));
|
|
40
|
+
jest.mock('../extensions/ensure-list-item-content-is-div', () => ({ EnsureListItemContentIsDiv: {} }));
|
|
39
41
|
jest.mock('../extensions/responseArea', () => ({
|
|
40
42
|
ExplicitConstructedResponseNode: { configure: jest.fn(() => ({})) },
|
|
41
43
|
DragInTheBlankNode: { configure: jest.fn(() => ({})) },
|
|
@@ -16,6 +16,7 @@ import ExtendedTable from '../extensions/extended-table';
|
|
|
16
16
|
import { ExtendedTableCell, ExtendedTableHeader } from '../extensions/extended-table-cell';
|
|
17
17
|
import { DivNode } from '../extensions/div-node';
|
|
18
18
|
import { EnsureEmptyRootIsDiv } from '../extensions/ensure-empty-root-div';
|
|
19
|
+
import { EnsureListItemContentIsDiv } from '../extensions/ensure-list-item-content-is-div';
|
|
19
20
|
import { TableRow } from '@tiptap/extension-table-row';
|
|
20
21
|
import {
|
|
21
22
|
DragInTheBlankNode,
|
|
@@ -28,6 +29,7 @@ import { MathNode } from '../extensions/math';
|
|
|
28
29
|
import { ImageUploadNode } from '../extensions/image';
|
|
29
30
|
import { Media } from '../extensions/media';
|
|
30
31
|
import { CSSMark } from '../extensions/css';
|
|
32
|
+
import { ExtendedListItem } from '../extensions/extended-list-item';
|
|
31
33
|
|
|
32
34
|
import EditorContainer from './TiptapContainer';
|
|
33
35
|
import { valueToSize } from '../utils/size';
|
|
@@ -164,8 +166,10 @@ export const EditableHtml = (props) => {
|
|
|
164
166
|
notAfter: ['paragraph', 'div'],
|
|
165
167
|
},
|
|
166
168
|
}),
|
|
169
|
+
ExtendedListItem,
|
|
167
170
|
DivNode,
|
|
168
171
|
EnsureEmptyRootIsDiv,
|
|
172
|
+
EnsureListItemContentIsDiv,
|
|
169
173
|
Placeholder.configure({
|
|
170
174
|
placeholder: props.placeholder,
|
|
171
175
|
// show placeholder even when editor is focused
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { EnsureListItemContentIsDiv } from '../ensure-list-item-content-is-div';
|
|
2
|
+
|
|
3
|
+
describe('EnsureListItemContentIsDiv', () => {
|
|
4
|
+
it('registers a ProseMirror plugin that rewrites listItem paragraph children to div', () => {
|
|
5
|
+
const plugins = EnsureListItemContentIsDiv.config.addProseMirrorPlugins();
|
|
6
|
+
expect(Array.isArray(plugins)).toBe(true);
|
|
7
|
+
expect(plugins).toHaveLength(1);
|
|
8
|
+
|
|
9
|
+
const plugin = plugins[0];
|
|
10
|
+
const divType = { name: 'div' };
|
|
11
|
+
const tr = { setNodeMarkup: jest.fn() };
|
|
12
|
+
|
|
13
|
+
const paragraphChild = {
|
|
14
|
+
type: { name: 'paragraph' },
|
|
15
|
+
attrs: { class: 'x' },
|
|
16
|
+
nodeSize: 6,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const listItemNode = {
|
|
20
|
+
type: { name: 'listItem' },
|
|
21
|
+
forEach: (cb) => cb(paragraphChild),
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const newState = {
|
|
25
|
+
schema: { nodes: { div: divType } },
|
|
26
|
+
tr,
|
|
27
|
+
doc: {
|
|
28
|
+
descendants: (cb) => cb(listItemNode, 10),
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const result = plugin.spec.appendTransaction([{ docChanged: true }], {}, newState);
|
|
33
|
+
|
|
34
|
+
expect(tr.setNodeMarkup).toHaveBeenCalledWith(11, divType, paragraphChild.attrs);
|
|
35
|
+
expect(result).toBe(tr);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('returns null when there is no document change', () => {
|
|
39
|
+
const plugin = EnsureListItemContentIsDiv.config.addProseMirrorPlugins()[0];
|
|
40
|
+
|
|
41
|
+
const result = plugin.spec.appendTransaction([{ docChanged: false }], {}, {});
|
|
42
|
+
expect(result).toBeNull();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ExtendedListItem } from '../extended-list-item';
|
|
2
|
+
|
|
3
|
+
describe('ExtendedListItem', () => {
|
|
4
|
+
it('extends listItem and prefers div over paragraph in content spec', () => {
|
|
5
|
+
expect(ExtendedListItem.name).toBe('listItem');
|
|
6
|
+
|
|
7
|
+
const content =
|
|
8
|
+
ExtendedListItem.options?.content ?? ExtendedListItem.config?.content ?? ExtendedListItem.extendOptions?.content;
|
|
9
|
+
|
|
10
|
+
expect(String(content)).toMatch(/^\(div \| paragraph/);
|
|
11
|
+
expect(String(content)).toContain('imageUploadNode');
|
|
12
|
+
});
|
|
13
|
+
});
|
|
@@ -45,13 +45,26 @@ describe('ImageComponent', () => {
|
|
|
45
45
|
},
|
|
46
46
|
state: {
|
|
47
47
|
selection,
|
|
48
|
+
doc: {
|
|
49
|
+
descendants: jest.fn(),
|
|
50
|
+
nodeAt: jest.fn(),
|
|
51
|
+
},
|
|
52
|
+
tr: {
|
|
53
|
+
setNodeMarkup: jest.fn().mockReturnThis(),
|
|
54
|
+
delete: jest.fn().mockReturnThis(),
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
view: {
|
|
58
|
+
dispatch: jest.fn(),
|
|
48
59
|
},
|
|
49
60
|
});
|
|
50
61
|
|
|
51
62
|
let mockEditor = createMockEditor();
|
|
52
63
|
|
|
53
64
|
const mockNode = {
|
|
65
|
+
type: { name: 'imageUploadNode' },
|
|
54
66
|
attrs: {
|
|
67
|
+
nodeKey: 'test-key-123',
|
|
55
68
|
src: 'test.jpg',
|
|
56
69
|
width: 100,
|
|
57
70
|
height: 100,
|
|
@@ -88,6 +101,8 @@ describe('ImageComponent', () => {
|
|
|
88
101
|
mockEditor = createMockEditor();
|
|
89
102
|
defaultProps.editor = mockEditor;
|
|
90
103
|
defaultProps.getPos = jest.fn(() => MOCK_NODE_POS);
|
|
104
|
+
mockEditor.state.doc.descendants.mockImplementation((cb) => cb(mockNode, 0));
|
|
105
|
+
mockEditor.state.doc.nodeAt.mockReturnValue(mockNode);
|
|
91
106
|
});
|
|
92
107
|
|
|
93
108
|
it('renders without crashing', () => {
|
|
@@ -261,7 +276,12 @@ describe('ImageComponent', () => {
|
|
|
261
276
|
fireEvent.click(centerButton);
|
|
262
277
|
});
|
|
263
278
|
|
|
264
|
-
expect(mockEditor.
|
|
279
|
+
expect(mockEditor.state.tr.setNodeMarkup).toHaveBeenCalledWith(
|
|
280
|
+
0,
|
|
281
|
+
undefined,
|
|
282
|
+
expect.objectContaining({ alignment: 'center' }),
|
|
283
|
+
);
|
|
284
|
+
expect(mockEditor.view.dispatch).toHaveBeenCalled();
|
|
265
285
|
});
|
|
266
286
|
|
|
267
287
|
it('toolbar is shown when selected', async () => {
|
|
@@ -144,9 +144,12 @@ describe('ImageUploadNode', () => {
|
|
|
144
144
|
insertContent: jest.fn(() => true),
|
|
145
145
|
};
|
|
146
146
|
const result = commands.setImageUploadNode()({ commands: mockCommands });
|
|
147
|
-
expect(mockCommands.insertContent).toHaveBeenCalledWith(
|
|
148
|
-
|
|
149
|
-
|
|
147
|
+
expect(mockCommands.insertContent).toHaveBeenCalledWith(
|
|
148
|
+
expect.objectContaining({
|
|
149
|
+
type: 'imageUploadNode',
|
|
150
|
+
attrs: expect.objectContaining({ nodeKey: expect.any(String) }),
|
|
151
|
+
}),
|
|
152
|
+
);
|
|
150
153
|
expect(result).toBe(true);
|
|
151
154
|
});
|
|
152
155
|
});
|
|
@@ -220,13 +223,15 @@ describe('ImageUploadNode', () => {
|
|
|
220
223
|
|
|
221
224
|
await new Promise((resolve) => queueMicrotask(resolve));
|
|
222
225
|
|
|
223
|
-
expect(insertContent).toHaveBeenCalledWith(
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
226
|
+
expect(insertContent).toHaveBeenCalledWith(
|
|
227
|
+
expect.objectContaining({
|
|
228
|
+
type: 'imageUploadNode',
|
|
229
|
+
attrs: expect.objectContaining({
|
|
230
|
+
src: 'data:image/png;base64,Zm9v',
|
|
231
|
+
loaded: true,
|
|
232
|
+
}),
|
|
233
|
+
}),
|
|
234
|
+
);
|
|
230
235
|
});
|
|
231
236
|
});
|
|
232
237
|
});
|
|
@@ -15,6 +15,15 @@ export const DivNode = Node.create({
|
|
|
15
15
|
},
|
|
16
16
|
|
|
17
17
|
addKeyboardShortcuts() {
|
|
18
|
+
const isInsideListItem = ($from) => {
|
|
19
|
+
for (let depth = $from.depth; depth >= 0; depth -= 1) {
|
|
20
|
+
if ($from.node(depth).type.name === 'listItem') {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
};
|
|
26
|
+
|
|
18
27
|
return {
|
|
19
28
|
Enter: () => {
|
|
20
29
|
const { state } = this.editor;
|
|
@@ -23,6 +32,9 @@ export const DivNode = Node.create({
|
|
|
23
32
|
if ($from.parent.type.name !== 'div') {
|
|
24
33
|
return false;
|
|
25
34
|
}
|
|
35
|
+
if (isInsideListItem($from)) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
26
38
|
|
|
27
39
|
return this.editor
|
|
28
40
|
.chain()
|
|
@@ -60,8 +72,6 @@ export const DivNode = Node.create({
|
|
|
60
72
|
return state.doc.childCount === 1 ? true : false;
|
|
61
73
|
}
|
|
62
74
|
|
|
63
|
-
// one character left and cursor is after it — delete
|
|
64
|
-
// only that character and stop, preventing the block-join that fires Enter.
|
|
65
75
|
if (parentText.length === 1 && $from.parentOffset === 1) {
|
|
66
76
|
const { tr } = state;
|
|
67
77
|
tr.delete($from.pos - 1, $from.pos);
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Extension } from '@tiptap/core';
|
|
2
|
+
import { Plugin, PluginKey } from '@tiptap/pm/state';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Some list operations preserve/create `paragraph` children in `listItem`.
|
|
6
|
+
* Normalize direct `listItem > paragraph` children into `div` so list content
|
|
7
|
+
* stays consistent with DivNode-based editing.
|
|
8
|
+
*/
|
|
9
|
+
export const EnsureListItemContentIsDiv = Extension.create({
|
|
10
|
+
name: 'ensureListItemContentIsDiv',
|
|
11
|
+
|
|
12
|
+
addProseMirrorPlugins() {
|
|
13
|
+
const key = new PluginKey(this.name);
|
|
14
|
+
|
|
15
|
+
return [
|
|
16
|
+
new Plugin({
|
|
17
|
+
key,
|
|
18
|
+
appendTransaction(transactions, _oldState, newState) {
|
|
19
|
+
if (!transactions.some((tr) => tr.docChanged)) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const { doc, schema } = newState;
|
|
24
|
+
const divType = schema.nodes.div;
|
|
25
|
+
if (!divType) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const positionsToConvert = [];
|
|
30
|
+
|
|
31
|
+
doc.descendants((node, pos) => {
|
|
32
|
+
if (node.type.name !== 'listItem') {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let childOffset = 1;
|
|
37
|
+
node.forEach((child) => {
|
|
38
|
+
if (child.type.name === 'paragraph') {
|
|
39
|
+
positionsToConvert.push({
|
|
40
|
+
pos: pos + childOffset,
|
|
41
|
+
attrs: child.attrs,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
childOffset += child.nodeSize;
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
if (positionsToConvert.length === 0) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const tr = newState.tr;
|
|
53
|
+
positionsToConvert
|
|
54
|
+
.sort((a, b) => b.pos - a.pos)
|
|
55
|
+
.forEach(({ pos, attrs }) => tr.setNodeMarkup(pos, divType, attrs));
|
|
56
|
+
|
|
57
|
+
return tr;
|
|
58
|
+
},
|
|
59
|
+
}),
|
|
60
|
+
];
|
|
61
|
+
},
|
|
62
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ListItem } from '@tiptap/extension-list-item';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Default list items use `paragraph block*`, so empty/new items become `<p>`.
|
|
5
|
+
* Prefer `div` first to keep consistency with DivNode at root and table cells.
|
|
6
|
+
*/
|
|
7
|
+
export const ExtendedListItem = ListItem.extend({
|
|
8
|
+
content:
|
|
9
|
+
'(div | paragraph | heading | bulletList | orderedList | blockquote | codeBlock | horizontalRule | image | imageUploadNode)+',
|
|
10
|
+
});
|
|
@@ -95,18 +95,36 @@ function ImageComponent(props) {
|
|
|
95
95
|
return parseInt(floored.toFixed(0) * 25, 10);
|
|
96
96
|
}, []);
|
|
97
97
|
|
|
98
|
-
const
|
|
99
|
-
|
|
98
|
+
const findNodePos = useCallback(() => {
|
|
99
|
+
const key = latestNodeRef.current.attrs.nodeKey;
|
|
100
|
+
let found = null;
|
|
101
|
+
editor.state.doc.descendants((n, pos) => {
|
|
102
|
+
if (found !== null) return false;
|
|
103
|
+
if (n.type.name === 'imageUploadNode' && n.attrs.nodeKey === key) {
|
|
104
|
+
found = pos;
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
return found;
|
|
109
|
+
}, [editor]);
|
|
100
110
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
111
|
+
// dispatch an attribute update targeted precisely at this node by nodeKey.
|
|
112
|
+
const updateThisNode = useCallback((newAttrs) => {
|
|
113
|
+
const nodePos = findNodePos();
|
|
114
|
+
if (nodePos === null) return;
|
|
115
|
+
const currentNode = editor.state.doc.nodeAt(nodePos);
|
|
116
|
+
if (!currentNode) return;
|
|
117
|
+
editor.view.dispatch(
|
|
118
|
+
editor.state.tr.setNodeMarkup(nodePos, undefined, { ...currentNode.attrs, ...newAttrs }),
|
|
119
|
+
);
|
|
120
|
+
}, [editor, findNodePos]);
|
|
105
121
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
122
|
+
const applySizeData = useCallback(() => {
|
|
123
|
+
if (!node.attrs.width || !imgRef.current) return;
|
|
124
|
+
const resizePercent = getPercentFromWidth(node.attrs.width);
|
|
125
|
+
if (node.attrs.resizePercent === resizePercent) return;
|
|
126
|
+
updateThisNode({ resizePercent });
|
|
127
|
+
}, [node.attrs.width, node.attrs.resizePercent, getPercentFromWidth, updateThisNode]);
|
|
110
128
|
|
|
111
129
|
// keep ref in sync with latest node
|
|
112
130
|
useEffect(() => {
|
|
@@ -168,11 +186,11 @@ function ImageComponent(props) {
|
|
|
168
186
|
box.style.height = `${h}px`;
|
|
169
187
|
|
|
170
188
|
const update = { width: w, height: h };
|
|
171
|
-
if (!isEqual(update, node.attrs)) {
|
|
172
|
-
|
|
189
|
+
if (!isEqual(update, { width: node.attrs.width, height: node.attrs.height })) {
|
|
190
|
+
updateThisNode(update);
|
|
173
191
|
}
|
|
174
192
|
}
|
|
175
|
-
}, [
|
|
193
|
+
}, [node.attrs.width, node.attrs.height, maxImageWidth, maxImageHeight, updateThisNode]);
|
|
176
194
|
|
|
177
195
|
const updateAspect = (initial, next, keepAspect = true, resizeType) => {
|
|
178
196
|
if (keepAspect) {
|
|
@@ -200,36 +218,17 @@ function ImageComponent(props) {
|
|
|
200
218
|
box.style.width = `${next.width}px`;
|
|
201
219
|
box.style.height = `${next.height}px`;
|
|
202
220
|
|
|
203
|
-
|
|
204
|
-
if (!isEqual(update, node.attrs)) {
|
|
205
|
-
editor.commands.updateAttributes('imageUploadNode', update);
|
|
206
|
-
}
|
|
221
|
+
updateThisNode({ width: next.width, height: next.height });
|
|
207
222
|
}
|
|
208
223
|
},
|
|
209
|
-
[editor,
|
|
224
|
+
[editor, updateThisNode],
|
|
210
225
|
);
|
|
211
226
|
|
|
212
|
-
// Helper to find this node's current position in the doc.
|
|
213
|
-
// We cannot use object identity (n === node) because ProseMirror replaces
|
|
214
|
-
// node objects after every transaction — match by src instead.
|
|
215
|
-
const findNodePos = useCallback(() => {
|
|
216
|
-
let found = null;
|
|
217
|
-
const src = latestNodeRef.current.attrs.src;
|
|
218
|
-
editor.state.doc.descendants((n, pos) => {
|
|
219
|
-
if (found !== null) return false;
|
|
220
|
-
if (n.type.name === 'imageUploadNode' && n.attrs.src === src) {
|
|
221
|
-
found = pos;
|
|
222
|
-
return false;
|
|
223
|
-
}
|
|
224
|
-
});
|
|
225
|
-
return found;
|
|
226
|
-
}, [editor]);
|
|
227
|
-
|
|
228
227
|
const onChange = useCallback(
|
|
229
228
|
(newValues) => {
|
|
230
|
-
|
|
229
|
+
updateThisNode(newValues);
|
|
231
230
|
},
|
|
232
|
-
[editor],
|
|
231
|
+
[editor, updateThisNode],
|
|
233
232
|
);
|
|
234
233
|
|
|
235
234
|
const stopResize = useCallback(() => {
|
package/src/extensions/image.js
CHANGED
|
@@ -3,6 +3,7 @@ import { ReactNodeViewRenderer } from '@tiptap/react';
|
|
|
3
3
|
import { Plugin } from '@tiptap/pm/state';
|
|
4
4
|
import React from 'react';
|
|
5
5
|
import ImageComponent from './image-component';
|
|
6
|
+
import { node } from 'prop-types';
|
|
6
7
|
|
|
7
8
|
export const ImageUploadNode = Node.create({
|
|
8
9
|
name: 'imageUploadNode',
|
|
@@ -14,6 +15,7 @@ export const ImageUploadNode = Node.create({
|
|
|
14
15
|
|
|
15
16
|
addAttributes() {
|
|
16
17
|
return {
|
|
18
|
+
nodeKey: { default: null },
|
|
17
19
|
loaded: { default: false },
|
|
18
20
|
deleteStatus: { default: null },
|
|
19
21
|
alignment: { default: null },
|
|
@@ -48,6 +50,8 @@ export const ImageUploadNode = Node.create({
|
|
|
48
50
|
({ commands }) => {
|
|
49
51
|
return commands.insertContent({
|
|
50
52
|
type: this.name,
|
|
53
|
+
// adding a unique nodeKey attribute to help identify this node instance later due to issues with multiple images
|
|
54
|
+
attrs: { nodeKey: `img-${Date.now()}-${Math.random().toString(36).slice(2)}` },
|
|
51
55
|
});
|
|
52
56
|
},
|
|
53
57
|
};
|
|
@@ -89,6 +93,7 @@ export const ImageUploadNode = Node.create({
|
|
|
89
93
|
attrs: {
|
|
90
94
|
src,
|
|
91
95
|
loaded: true,
|
|
96
|
+
nodeKey: `img-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
92
97
|
},
|
|
93
98
|
});
|
|
94
99
|
};
|