@pega/cosmos-react-rte 10.0.0-build.7.0 → 10.0.0-build.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/Editor/Editor.d.ts.map +1 -1
- package/lib/components/Editor/Editor.js +26 -19
- package/lib/components/Editor/Editor.js.map +1 -1
- package/lib/components/Editor/Editor.types.d.ts +0 -2
- package/lib/components/Editor/Editor.types.d.ts.map +1 -1
- package/lib/components/Editor/Editor.types.js.map +1 -1
- package/lib/components/Editor/Toolbar/ImageButton.d.ts.map +1 -1
- package/lib/components/Editor/Toolbar/ImageButton.js +5 -1
- package/lib/components/Editor/Toolbar/ImageButton.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAM/E,OAAO,KAAK,EAAE,WAAW,EAAgC,MAAM,gBAAgB,CAAC;;;;
|
|
1
|
+
{"version":3,"file":"Editor.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,yBAAyB,CAAC;AAM/E,OAAO,KAAK,EAAE,WAAW,EAAgC,MAAM,gBAAgB,CAAC;;;;AAsrBhF,wBAAqD"}
|
|
@@ -19,6 +19,9 @@ import { dispatchEditorClickEvent } from './hooks/useCloseOnEditorClick';
|
|
|
19
19
|
import sanitizeHtml from './sanitize';
|
|
20
20
|
// Suggestion editor has no toolbar — formatting controls are intentionally omitted
|
|
21
21
|
const SUGGESTION_TOOLBAR = [];
|
|
22
|
+
// Uses Tiptap's isEmpty so leaf/atom nodes (images, hr, tables) count as content —
|
|
23
|
+
// getText() alone returns '' for an image-only doc and would misreport it as blank.
|
|
24
|
+
const editorHasContent = (editor) => editor ? !editor.isEmpty : false;
|
|
22
25
|
const SuggestionEditor = ({ defaultValue, onGetContent, onContentChange, renderEditor }) => {
|
|
23
26
|
const editorRef = useRef(null);
|
|
24
27
|
useEffect(() => {
|
|
@@ -31,15 +34,15 @@ const SuggestionEditor = ({ defaultValue, onGetContent, onContentChange, renderE
|
|
|
31
34
|
ref: editorRef,
|
|
32
35
|
onInit: tiptapEditor => {
|
|
33
36
|
// Signal initial content state so submit button enables correctly
|
|
34
|
-
onContentChange(tiptapEditor
|
|
37
|
+
onContentChange(editorHasContent(tiptapEditor));
|
|
35
38
|
},
|
|
36
39
|
onChange: editor => {
|
|
37
|
-
onContentChange((editor
|
|
40
|
+
onContentChange(editorHasContent(editor));
|
|
38
41
|
}
|
|
39
42
|
});
|
|
40
43
|
};
|
|
41
44
|
const Editor = forwardRef(function ForwardedEditor(props, ref) {
|
|
42
|
-
const { testId, id, label, labelHidden, info, status, required, disabled, readOnly, onChange, onKeyDown, onFocus, onBlur, onImageAdded, suggestion, onInit,
|
|
45
|
+
const { testId, id, label, labelHidden, info, status, required, disabled, readOnly, onChange, onKeyDown, onFocus, onBlur, onImageAdded, suggestion, onInit, defaultValue, placeholder, children, additionalInfo, toolbar, customActions, customComponents = [], spellcheck = true, imageInsertionMode = 'all', initOptions, onRewriteClick, linkCustomSource, imageCustomSource, progress, autoFocus, height, autoResize = true, secure = false, preserveTableStyles = false, ...restProps } = props;
|
|
43
46
|
const theme = useTheme();
|
|
44
47
|
const { styleSheetTarget } = useConfiguration();
|
|
45
48
|
const t = useI18n();
|
|
@@ -152,20 +155,6 @@ const Editor = forwardRef(function ForwardedEditor(props, ref) {
|
|
|
152
155
|
}
|
|
153
156
|
}
|
|
154
157
|
});
|
|
155
|
-
// Set up unload event listener to save content before iframe is destroyed
|
|
156
|
-
useEffect(() => {
|
|
157
|
-
if (!iframeRef.current?.contentWindow || !onUnload)
|
|
158
|
-
return;
|
|
159
|
-
const iframeWindow = iframeRef.current.contentWindow;
|
|
160
|
-
const abortController = new AbortController();
|
|
161
|
-
iframeWindow.addEventListener('unload', () => {
|
|
162
|
-
const html = iframeEditorRef.current?.getHtml() ?? '';
|
|
163
|
-
onUnload(html);
|
|
164
|
-
}, { signal: abortController.signal });
|
|
165
|
-
return () => {
|
|
166
|
-
abortController.abort();
|
|
167
|
-
};
|
|
168
|
-
}, [onUnload]);
|
|
169
158
|
// Dispatch event on iframe mousedown to close all open popovers/menus
|
|
170
159
|
useEffect(() => {
|
|
171
160
|
const iframeDoc = iframeRef.current?.contentDocument;
|
|
@@ -345,12 +334,30 @@ const Editor = forwardRef(function ForwardedEditor(props, ref) {
|
|
|
345
334
|
}
|
|
346
335
|
}), [tiptapEditor, onImageAdded]);
|
|
347
336
|
const renderSuggestionEditor = useCallback((suggestionProps) => (_jsx(SuggestionEditor, { defaultValue: suggestionProps.defaultValue, disabled: suggestionProps.disabled, readOnly: suggestionProps.readOnly, onGetContent: suggestionProps.onGetContent, onContentChange: suggestionProps.onContentChange, renderEditor: ({ ref: suggestionEditorRef, onInit: suggestionOnInit, onChange: suggestionOnChange }) => (_jsx(Editor, { ref: suggestionEditorRef, label: t('ai_rewrite_result_label'), labelHidden: true, toolbar: SUGGESTION_TOOLBAR, defaultValue: suggestionProps.defaultValue, disabled: suggestionProps.disabled, readOnly: suggestionProps.readOnly, height: height, onInit: suggestionOnInit, onChange: suggestionOnChange })) })), [height, t]);
|
|
348
|
-
return (_jsxs(EditorContext.Provider, { value: ctx, children: [_jsx(StyledEditorRoot, { testId: testIds, label: label, labelFor: '', labelId: labelId, labelHidden: labelHidden, id: editorId, info: info, status: status, required: required, disabled: disabled, readOnly: readOnly, suggestion: suggestion, ref: formFieldRef, additionalInfo: additionalInfo, children: _jsxs(_Fragment, { children: [_jsx(FormControl, { ...restProps, ref: editorRef, required: required, disabled: disabled, readOnly: readOnly, status: status, as: StyledRichTextEditor, focused: focused, hasSuggestion: status === 'pending', children: _jsxs(StyledEditorContainer, { ref: editorContainerRef, children: [progress ? (_jsx(Progress, { placement: 'local', message: typeof progress === 'string' ? progress : undefined })) : null, _jsx(StyledEditorIframe, { "data-testid": testIds.iframe, title: typeof label === 'string' ? label : t('rte_text_formatting_toolbar'), role: 'application', "aria-label": typeof label === 'string' ? label : t('rte_text_formatting_toolbar'), "aria-describedby": required ? requiredDescriptionId : undefined, ref: iframeRef, tabIndex: sourceMode ? -1 : 0, "$minHeight": height?.min, "$maxHeight": height?.max, "$hidden": sourceMode }), required ? (_jsx(HiddenText, { id: requiredDescriptionId, children: t('required') })) : null, sourceMode ? (_jsx(StyledSourceTextarea, { value: sourceCode, onChange: e =>
|
|
337
|
+
return (_jsxs(EditorContext.Provider, { value: ctx, children: [_jsx(StyledEditorRoot, { testId: testIds, label: label, labelFor: '', labelId: labelId, labelHidden: labelHidden, id: editorId, info: info, status: status, required: required, disabled: disabled, readOnly: readOnly, suggestion: suggestion, ref: formFieldRef, additionalInfo: additionalInfo, children: _jsxs(_Fragment, { children: [_jsx(FormControl, { ...restProps, ref: editorRef, required: required, disabled: disabled, readOnly: readOnly, status: status, as: StyledRichTextEditor, focused: focused, hasSuggestion: status === 'pending', children: _jsxs(StyledEditorContainer, { ref: editorContainerRef, children: [progress ? (_jsx(Progress, { placement: 'local', message: typeof progress === 'string' ? progress : undefined })) : null, _jsx(StyledEditorIframe, { "data-testid": testIds.iframe, title: typeof label === 'string' ? label : t('rte_text_formatting_toolbar'), role: 'application', "aria-label": typeof label === 'string' ? label : t('rte_text_formatting_toolbar'), "aria-describedby": required ? requiredDescriptionId : undefined, ref: iframeRef, tabIndex: sourceMode ? -1 : 0, "$minHeight": height?.min, "$maxHeight": height?.max, "$hidden": sourceMode }), required ? (_jsx(HiddenText, { id: requiredDescriptionId, children: t('required') })) : null, sourceMode ? (_jsx(StyledSourceTextarea, { value: sourceCode, onChange: e => {
|
|
338
|
+
const next = e.target.value;
|
|
339
|
+
setSourceCode(next);
|
|
340
|
+
// Keep Tiptap in sync while editing source so parent components
|
|
341
|
+
// reading getHtml()/isEmpty (e.g. required-field validation on
|
|
342
|
+
// blur) see the latest content instead of the pre-toggle doc.
|
|
343
|
+
tiptapEditor?.commands.setContent(next, { emitUpdate: true });
|
|
344
|
+
}, onBlur: e => {
|
|
345
|
+
// Tiptap is hidden in source mode and never held focus, so we bridge blur; ignore intra-editor focus moves.
|
|
346
|
+
const nextFocus = e.relatedTarget;
|
|
347
|
+
if (nextFocus && editorContainerRef.current?.contains(nextFocus))
|
|
348
|
+
return;
|
|
349
|
+
onBlur?.();
|
|
350
|
+
}, spellCheck: false, "aria-label": t('rte_source_code'), "$minHeight": height?.min, "$maxHeight": height?.max })) : null, (toolbar?.length || customActions?.length) && tiptapEditor ? (_jsx(Toolbar, { testId: testIds, features: toolbar || [], editor: tiptapEditor, customActions: customActions, imageInsertionMode: imageInsertionMode, onRewriteClick: onRewriteClick, linkCustomSource: linkCustomSource, imageCustomSource: imageCustomSource, renderSuggestionEditor: renderSuggestionEditor, sourceMode: sourceMode, onSourceModeToggle: (isSourceMode) => {
|
|
349
351
|
if (isSourceMode) {
|
|
350
352
|
setSourceCode(tiptapEditor.getHTML());
|
|
351
353
|
}
|
|
352
354
|
else {
|
|
353
|
-
|
|
355
|
+
// emitUpdate so onChange fires and required-field state
|
|
356
|
+
// refreshes immediately (fixes image-only bodies added via
|
|
357
|
+
// source mode being flagged "Cannot be blank" until keystroke).
|
|
358
|
+
tiptapEditor.commands.setContent(sourceCode, { emitUpdate: true });
|
|
359
|
+
// Commit point: fires blur handlers (e.g. changeNblur/PATCH) without requiring the user to click outside.
|
|
360
|
+
onBlur?.();
|
|
354
361
|
}
|
|
355
362
|
setSourceMode(isSourceMode);
|
|
356
363
|
} })) : null, imagesEnabled && !readOnly && !disabled ? (_jsx(ImageActionButtons, { ref: editButtonRef, position: hoveredImagePosition, containerRef: editorContainerRef, onEdit: onEditButtonClick, onDelete: handleImageDelete, onMouseEnter: () => setIsOverButtons(true), onMouseLeave: () => setIsOverButtons(false), editAriaLabel: t('rte_edit_image', [currentImageAttrs?.alt || '']), deleteAriaLabel: t('rte_delete_image', [currentImageAttrs?.alt || '']), editTooltip: t('edit'), deleteTooltip: t('delete') })) : null, tablesEnabled && !readOnly && !disabled && !sourceMode ? (_jsx(TableCellMenu, { ref: tableCellMenuButtonRef, position: cellPosition, containerRef: editorContainerRef, onAddRowBelow: addRowBelow, onAddRowAbove: addRowAbove, onAddColumnAfter: addColumnAfter, onAddColumnBefore: addColumnBefore, onDeleteRow: deleteRow, onDeleteColumn: deleteColumn, onDeleteTable: deleteTable, onGoToNextCell: goToNextCell, onReturnToCell: returnToCell, onMouseEnter: () => setIsOverTableMenu(true), onMouseLeave: () => setIsOverTableMenu(false), labels: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../src/components/Editor/Editor.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Editor as TiptapEditor } from '@tiptap/core';\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n useImperativeHandle,\n useMemo,\n useCallback\n} from 'react';\nimport type { PropsWithoutRef, ReactNode, RefObject } from 'react';\nimport { css } from 'styled-components';\n\nimport {\n FormControl,\n Progress,\n HiddenText,\n useAfterInitialEffect,\n useTheme,\n useUID,\n useConsolidatedRef,\n useTestIds,\n withTestIds,\n useConfiguration,\n useI18n\n} from '@pega/cosmos-react-core';\nimport type { ForwardRefForwardPropsComponent } from '@pega/cosmos-react-core';\n\nimport StyledRichTextEditor from '../RichTextEditor/RichTextEditor.styles';\nimport type { Features } from '../RichTextEditor/Toolbar/Toolbar.types';\n\nimport EditorContext from './Editor.context';\nimport type { EditorProps, EditorState, CustomComponent } from './Editor.types';\nimport {\n StyledEditorContainer,\n StyledEditorIframe,\n StyledEditorRoot,\n StyledSourceTextarea\n} from './Editor.styles';\nimport { getEditorTestIds } from './Editor.test-ids';\nimport Toolbar from './Toolbar/Toolbar';\nimport WordCount from './Toolbar/WordCount';\nimport { ImageEditDialog } from './ImageEditDialog';\nimport type { ImageAttributes } from './ImageEditDialog';\nimport ImageActionButtons from './ImageActionButtons';\nimport TableCellMenu from './TableCellMenu';\nimport createFileItemElement from './FileItemElement';\nimport useIframeSetup from './hooks/useIframeSetup';\nimport useImageActions from './hooks/useImageActions';\nimport useTableCellMenu from './hooks/useTableCellMenu';\nimport { dispatchEditorClickEvent } from './hooks/useCloseOnEditorClick';\nimport sanitizeHtml from './sanitize';\n\n// Suggestion editor has no toolbar — formatting controls are intentionally omitted\nconst SUGGESTION_TOOLBAR: Features[] = [];\n\ninterface SuggestionEditorRenderProps {\n ref: RefObject<EditorState>;\n onInit: (tiptapEditor: TiptapEditor) => void;\n onChange: (editor?: TiptapEditor) => void;\n}\n\ninterface SuggestionEditorProps {\n defaultValue?: string;\n disabled: boolean;\n readOnly: boolean;\n onGetContent: (getContent: () => string) => void;\n onContentChange: (hasContent: boolean) => void;\n /** Render prop — receives ref and callbacks; must render an Editor-like element */\n renderEditor: (renderProps: SuggestionEditorRenderProps) => ReactNode;\n}\n\nconst SuggestionEditor = ({\n defaultValue,\n onGetContent,\n onContentChange,\n renderEditor\n}: SuggestionEditorProps) => {\n const editorRef = useRef<EditorState>(null);\n\n useEffect(() => {\n onGetContent(() => editorRef.current?.getEditor()?.getHTML() ?? '');\n }, [onGetContent]);\n\n useAfterInitialEffect(() => {\n editorRef.current?.getEditor()?.commands.setContent(defaultValue ?? '');\n }, [defaultValue]);\n\n return renderEditor({\n ref: editorRef,\n onInit: tiptapEditor => {\n // Signal initial content state so submit button enables correctly\n onContentChange(tiptapEditor.getText().trim() !== '');\n },\n onChange: editor => {\n onContentChange((editor?.getText() ?? '').trim() !== '');\n }\n });\n};\n\nconst Editor: ForwardRefForwardPropsComponent<EditorProps> = forwardRef(function ForwardedEditor(\n props: PropsWithoutRef<EditorProps>,\n ref: EditorProps['ref']\n) {\n const {\n testId,\n id,\n label,\n labelHidden,\n info,\n status,\n required,\n disabled,\n readOnly,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n onImageAdded,\n suggestion,\n onInit,\n onUnload,\n defaultValue,\n placeholder,\n children,\n additionalInfo,\n toolbar,\n customActions,\n customComponents = [],\n spellcheck = true,\n imageInsertionMode = 'all',\n initOptions,\n onRewriteClick,\n linkCustomSource,\n imageCustomSource,\n progress,\n autoFocus,\n height,\n autoResize = true,\n secure = false,\n preserveTableStyles = false,\n ...restProps\n } = props;\n\n const theme = useTheme();\n const { styleSheetTarget } = useConfiguration();\n const t = useI18n();\n const [focused, setFocused] = useState(false);\n const [tiptapEditor, setTiptapEditor] = useState<TiptapEditor | null>(null);\n const [imageEditDialog, setImageEditDialog] = useState<{\n isOpen: boolean;\n attributes: ImageAttributes | null;\n }>({ isOpen: false, attributes: null });\n const [sourceMode, setSourceMode] = useState(false);\n const [sourceCode, setSourceCode] = useState('');\n const editButtonRef = useRef<HTMLButtonElement>(null);\n const tableCellMenuButtonRef = useRef<HTMLButtonElement>(null);\n const editorContainerRef = useRef<HTMLDivElement>(null);\n const generatedId = useUID();\n const editorId = id ?? generatedId;\n const labelId = useUID();\n const requiredDescriptionId = `${editorId}-required`;\n const editorRef = useConsolidatedRef(ref);\n const formFieldRef = useRef<HTMLElement>(null);\n const pastedImages = useRef<File[]>([]);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const pendingImageActionUrlsRef = useRef<Map<string, string>>(new Map());\n\n const testIds = useTestIds(testId, getEditorTestIds);\n\n // Check if images feature is enabled\n const imagesEnabled = toolbar?.includes('images') ?? false;\n\n // Check if tables feature is enabled\n const tablesEnabled = toolbar?.includes('tables') ?? false;\n\n // Check if links feature is enabled (controls autolink behavior)\n const linksEnabled = toolbar?.includes('links') ?? false;\n\n // Check if text color feature is enabled\n const colorsEnabled = toolbar?.includes('text-color') ?? false;\n\n // Define built-in custom components and merge with user-provided ones\n const customElements: CustomComponent[] = useMemo(() => {\n const FileItemStyle = css`\n /* stylelint-disable-next-line selector-type-no-unknown */\n pega-file {\n display: inline-block;\n width: ${theme.base['content-width'].md};\n }\n `;\n\n return [\n {\n createCustomElement: createFileItemElement,\n name: 'pega-file',\n style: FileItemStyle.toString(),\n extensionAttributes: ['contenteditable']\n },\n ...customComponents\n ];\n }, [customComponents, theme]);\n\n // Register custom elements in the main window (needed for Tiptap to recognize them)\n useEffect(() => {\n customElements.forEach((component: CustomComponent) => {\n if (\n component.name &&\n component.createCustomElement &&\n !window.customElements.get(component.name)\n ) {\n const CustomElement = component.createCustomElement(window);\n window.customElements.define(component.name, CustomElement);\n }\n });\n }, [customElements]);\n\n // Sanitize defaultValue if secure mode is enabled\n const sanitizedDefaultValue = useMemo(\n () => (secure && defaultValue ? sanitizeHtml(defaultValue) : defaultValue),\n [secure, defaultValue]\n );\n\n // Mount Tiptap inside iframe using custom hook\n const { iframeEditorRef } = useIframeSetup({\n iframeRef,\n theme,\n styleSheetTarget,\n customElements,\n placeholder,\n defaultValue: sanitizedDefaultValue,\n disabled,\n readOnly,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n onInit,\n spellcheck,\n initOptions,\n onImageAdded,\n imagesEnabled,\n linksEnabled,\n colorsEnabled,\n imageInsertionMode,\n pastedImages,\n editorId,\n required,\n setTiptapEditor,\n setFocused,\n autoResize,\n secure,\n preserveTableStyles,\n onTabOut: () => {\n // Focus first toolbar button when Tab is pressed in editor\n const toolbarEl = editorContainerRef.current?.querySelector('[data-testid$=\"toolbar\"]');\n const firstButton = toolbarEl?.querySelector<HTMLElement>('button:not([disabled])');\n if (firstButton) {\n firstButton.focus();\n }\n },\n onFocusTableMenu: () => {\n tableCellMenuButtonRef.current?.focus();\n },\n onFocusPreviousCellMenu: () => {\n // Go to previous cell and then focus its menu\n if (tiptapEditor) {\n tiptapEditor.commands.goToPreviousCell();\n setTimeout(() => {\n tableCellMenuButtonRef.current?.focus();\n }, 0);\n }\n }\n });\n\n // Set up unload event listener to save content before iframe is destroyed\n useEffect(() => {\n if (!iframeRef.current?.contentWindow || !onUnload) return;\n\n const iframeWindow = iframeRef.current.contentWindow;\n const abortController = new AbortController();\n\n iframeWindow.addEventListener(\n 'unload',\n () => {\n const html = iframeEditorRef.current?.getHtml() ?? '';\n onUnload(html);\n },\n { signal: abortController.signal }\n );\n\n return () => {\n abortController.abort();\n };\n }, [onUnload]);\n\n // Dispatch event on iframe mousedown to close all open popovers/menus\n useEffect(() => {\n const iframeDoc = iframeRef.current?.contentDocument;\n if (!iframeDoc) return;\n\n const handleMouseDown = () => {\n dispatchEditorClickEvent();\n };\n\n iframeDoc.addEventListener('mousedown', handleMouseDown);\n return () => iframeDoc.removeEventListener('mousedown', handleMouseDown);\n }, [tiptapEditor]);\n\n // Set up image action buttons (edit and delete) using custom hook\n const {\n hoveredImagePosition,\n currentImageAttrs,\n currentImageElement,\n handleDelete: handleImageDelete,\n setIsOverButtons\n } = useImageActions({\n tiptapEditor,\n iframeRef,\n isDialogOpen: imageEditDialog.isOpen\n });\n\n // Set up table cell menu using custom hook (only when tables are active)\n const tableMenuEnabled = tablesEnabled && !readOnly && !disabled;\n const {\n cellPosition,\n setIsOverMenu: setIsOverTableMenu,\n addRowBelow,\n addRowAbove,\n addColumnAfter,\n addColumnBefore,\n deleteRow,\n deleteColumn,\n deleteTable\n } = useTableCellMenu({\n tiptapEditor: tableMenuEnabled ? tiptapEditor : null,\n iframeRef\n });\n\n // Handle keyboard navigation from table menu to next cell (start of content)\n const goToNextCell = useCallback(() => {\n if (tiptapEditor) {\n tiptapEditor.commands.focus();\n tiptapEditor.commands.goToNextCell();\n }\n }, [tiptapEditor]);\n\n // Handle keyboard navigation from table menu back to current cell\n const returnToCell = useCallback(() => {\n tiptapEditor?.commands.focus();\n }, [tiptapEditor]);\n\n // Store the image element when opening the dialog to target the correct node on save\n const editingImageElementRef = useRef<HTMLImageElement | null>(null);\n\n // Handle edit button click from ImageActionButtons\n const onEditButtonClick = () => {\n if (currentImageAttrs && currentImageElement) {\n // Store the element reference to target the correct node on save\n editingImageElementRef.current = currentImageElement;\n setImageEditDialog({\n isOpen: true,\n attributes: currentImageAttrs\n });\n // Don't call handleImageEdit() here - keep buttons visible while dialog is open\n }\n };\n\n // Handle image edit save\n const handleImageEditSave = (attrs: ImageAttributes) => {\n if (!tiptapEditor || !editingImageElementRef.current) {\n editingImageElementRef.current = null;\n return;\n }\n\n // Get exact position from DOM element to handle duplicate images correctly\n const pos = tiptapEditor.view.posAtDOM(editingImageElementRef.current, 0);\n\n let imageUpdated = false;\n\n if (pos >= 0) {\n const { state } = tiptapEditor;\n const node = state.doc.nodeAt(pos);\n if (!node || node.type.name !== 'image') {\n editingImageElementRef.current = null;\n return;\n }\n\n const nodeEnd = pos + node.nodeSize;\n const tr = state.tr;\n\n // Update image attributes\n tr.setNodeMarkup(pos, undefined, {\n src: attrs.src,\n alt: attrs.alt,\n ...(attrs.width && { width: attrs.width }),\n ...(attrs.height && { height: attrs.height })\n });\n\n // Handle action URL (links are marks in ProseMirror, not nodes)\n // Always remove existing link mark first, then add new one if needed\n tr.removeMark(pos, nodeEnd, state.schema.marks.link);\n if (attrs.actionUrl) {\n const linkMark = state.schema.marks.link.create({\n href: attrs.actionUrl,\n target: '_blank'\n });\n tr.addMark(pos, nodeEnd, linkMark);\n }\n\n tiptapEditor.view.dispatch(tr);\n imageUpdated = true;\n }\n\n // Clear the ref after save\n editingImageElementRef.current = null;\n\n // Trigger blur callback to persist image changes to redux\n // Without this, edited images won't be saved until user manually blurs the editor\n if (imageUpdated && onBlur) {\n onBlur();\n }\n };\n\n // Update editor when props change\n useAfterInitialEffect(() => {\n iframeEditorRef.current?.setEditable(!readOnly && !disabled);\n }, [readOnly, disabled]);\n\n // Handle autoFocus\n useEffect(() => {\n if (autoFocus && tiptapEditor) {\n tiptapEditor.commands.focus();\n }\n }, [autoFocus, tiptapEditor]);\n\n // Expose methods via ref\n useImperativeHandle(\n editorRef,\n () => ({\n focus: () => iframeEditorRef.current?.focus(),\n getPlainText: () => iframeEditorRef.current?.getPlainText() ?? '',\n getRichText: () => iframeEditorRef.current?.getRichText() ?? '',\n getHtml: () => iframeEditorRef.current?.getHtml() ?? '',\n clear: () => iframeEditorRef.current?.clear(),\n updateAttachmentAttributes: (imageId: string, uploadProgress?: number, error?: string) => {\n if (!iframeRef.current?.contentDocument) return;\n\n const iframeDoc = iframeRef.current.contentDocument;\n const imageCustomEl = iframeDoc.querySelector(`pega-file[data-id=\"${imageId}\"]`);\n\n if (imageCustomEl) {\n if (error) {\n imageCustomEl.setAttribute('data-error', error);\n } else if (uploadProgress !== undefined) {\n imageCustomEl.setAttribute('data-progress', `${uploadProgress}`);\n }\n }\n },\n appendImage: (\n imageData: { src: string; alt: string; attachmentId?: string },\n imageId: string\n ) => {\n if (!iframeRef.current?.contentDocument || !tiptapEditor) return;\n\n const iframeDoc = iframeRef.current.contentDocument;\n const imageUploadEl = iframeDoc.querySelector(`pega-file[data-id=\"${imageId}\"]`);\n\n if (imageUploadEl) {\n // Create img element\n const imgEl = iframeDoc.createElement('img');\n imgEl.setAttribute('src', imageData.src);\n imgEl.setAttribute('alt', imageData.alt);\n if (imageData.attachmentId) {\n imgEl.setAttribute('data-attachment-id', imageData.attachmentId);\n }\n\n const anchorEl = iframeDoc.createElement('a');\n const pendingActionUrl = pendingImageActionUrlsRef.current.get(imageId);\n anchorEl.setAttribute('href', pendingActionUrl || imageData.src);\n anchorEl.setAttribute('target', '_blank');\n anchorEl.setAttribute('rel', 'noopener noreferrer');\n anchorEl.appendChild(imgEl);\n\n // Replace pega-file with linked img in the DOM\n imageUploadEl.replaceWith(anchorEl);\n\n // Also update the Tiptap document\n const html = tiptapEditor.getHTML();\n const updatedHtml = html.replace(\n new RegExp(`<pega-file[^>]*data-id=[\"']${imageId}[\"'][^>]*>.*?</pega-file>`, 'g'),\n anchorEl.outerHTML\n );\n\n if (updatedHtml !== html) {\n tiptapEditor.commands.setContent(updatedHtml, { emitUpdate: false });\n }\n\n pendingImageActionUrlsRef.current.delete(imageId);\n }\n },\n insertText: (text: string) => iframeEditorRef.current?.insertText(text),\n setCursorLocationToStart: () => iframeEditorRef.current?.setCursorLocationToStart(),\n insertHtml: (html: string, overwrite?: boolean) =>\n iframeEditorRef.current?.insertHtml(html, overwrite),\n getEditor: () => iframeEditorRef.current?.getEditor() ?? null,\n element: formFieldRef.current || undefined\n }),\n [tiptapEditor]\n );\n\n const ctx = useMemo(\n () => ({\n editor: tiptapEditor,\n addImage: (image: File, imageId?: string, alt?: string, actionUrl?: string) => {\n if (!tiptapEditor || !image) return;\n\n const imgId = imageId || `img-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n\n if (actionUrl) {\n pendingImageActionUrlsRef.current.set(imgId, actionUrl);\n }\n\n // Create pega-file element to show upload progress\n const pegaFileHtml = `<pega-file data-id='${imgId}' data-progress='0' data-name='${image.name}' data-alt='${alt || image.name}' contenteditable='false'></pega-file>`;\n\n // Insert the pega-file element\n tiptapEditor.chain().focus().insertContent(pegaFileHtml).run();\n\n // Trigger the onImageAdded callback so consumer can upload and call appendImage\n onImageAdded?.(image, imgId, alt);\n }\n }),\n [tiptapEditor, onImageAdded]\n );\n\n const renderSuggestionEditor = useCallback(\n (suggestionProps: {\n defaultValue?: string;\n disabled: boolean;\n readOnly: boolean;\n onGetContent: (getContent: () => string) => void;\n onContentChange: (hasContent: boolean) => void;\n }) => (\n <SuggestionEditor\n defaultValue={suggestionProps.defaultValue}\n disabled={suggestionProps.disabled}\n readOnly={suggestionProps.readOnly}\n onGetContent={suggestionProps.onGetContent}\n onContentChange={suggestionProps.onContentChange}\n renderEditor={({\n ref: suggestionEditorRef,\n onInit: suggestionOnInit,\n onChange: suggestionOnChange\n }) => (\n <Editor\n ref={suggestionEditorRef}\n label={t('ai_rewrite_result_label')}\n labelHidden\n toolbar={SUGGESTION_TOOLBAR}\n defaultValue={suggestionProps.defaultValue}\n disabled={suggestionProps.disabled}\n readOnly={suggestionProps.readOnly}\n height={height}\n onInit={suggestionOnInit}\n onChange={suggestionOnChange}\n />\n )}\n />\n ),\n [height, t]\n );\n\n return (\n <EditorContext.Provider value={ctx}>\n <StyledEditorRoot\n testId={testIds}\n label={label}\n labelFor=''\n labelId={labelId}\n labelHidden={labelHidden}\n id={editorId}\n info={info}\n status={status}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n suggestion={suggestion}\n ref={formFieldRef}\n additionalInfo={additionalInfo}\n >\n <>\n <FormControl\n {...restProps}\n ref={editorRef}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n status={status}\n as={StyledRichTextEditor}\n focused={focused}\n hasSuggestion={status === 'pending'}\n >\n <StyledEditorContainer ref={editorContainerRef}>\n {progress ? (\n <Progress\n placement='local'\n message={typeof progress === 'string' ? progress : undefined}\n />\n ) : null}\n {/* Title attribute is required for iframe accessibility (WCAG) */}\n <StyledEditorIframe\n data-testid={testIds.iframe}\n title={typeof label === 'string' ? label : t('rte_text_formatting_toolbar')}\n role='application'\n aria-label={typeof label === 'string' ? label : t('rte_text_formatting_toolbar')}\n aria-describedby={required ? requiredDescriptionId : undefined}\n ref={iframeRef}\n tabIndex={sourceMode ? -1 : 0}\n $minHeight={height?.min}\n $maxHeight={height?.max}\n $hidden={sourceMode}\n />\n {required ? (\n <HiddenText id={requiredDescriptionId}>{t('required')}</HiddenText>\n ) : null}\n {sourceMode ? (\n <StyledSourceTextarea\n value={sourceCode}\n onChange={e => setSourceCode(e.target.value)}\n spellCheck={false}\n aria-label={t('rte_source_code')}\n $minHeight={height?.min}\n $maxHeight={height?.max}\n />\n ) : null}\n {(toolbar?.length || customActions?.length) && tiptapEditor ? (\n <Toolbar\n testId={testIds}\n features={toolbar || []}\n editor={tiptapEditor}\n customActions={customActions}\n imageInsertionMode={imageInsertionMode}\n onRewriteClick={onRewriteClick}\n linkCustomSource={linkCustomSource}\n imageCustomSource={imageCustomSource}\n renderSuggestionEditor={renderSuggestionEditor}\n sourceMode={sourceMode}\n onSourceModeToggle={(isSourceMode: boolean) => {\n if (isSourceMode) {\n setSourceCode(tiptapEditor.getHTML());\n } else {\n tiptapEditor.commands.setContent(sourceCode);\n }\n setSourceMode(isSourceMode);\n }}\n />\n ) : null}\n {imagesEnabled && !readOnly && !disabled ? (\n <ImageActionButtons\n ref={editButtonRef}\n position={hoveredImagePosition}\n containerRef={editorContainerRef}\n onEdit={onEditButtonClick}\n onDelete={handleImageDelete}\n onMouseEnter={() => setIsOverButtons(true)}\n onMouseLeave={() => setIsOverButtons(false)}\n editAriaLabel={t('rte_edit_image', [currentImageAttrs?.alt || ''])}\n deleteAriaLabel={t('rte_delete_image', [currentImageAttrs?.alt || ''])}\n editTooltip={t('edit')}\n deleteTooltip={t('delete')}\n />\n ) : null}\n {tablesEnabled && !readOnly && !disabled && !sourceMode ? (\n <TableCellMenu\n ref={tableCellMenuButtonRef}\n position={cellPosition}\n containerRef={editorContainerRef}\n onAddRowBelow={addRowBelow}\n onAddRowAbove={addRowAbove}\n onAddColumnAfter={addColumnAfter}\n onAddColumnBefore={addColumnBefore}\n onDeleteRow={deleteRow}\n onDeleteColumn={deleteColumn}\n onDeleteTable={deleteTable}\n onGoToNextCell={goToNextCell}\n onReturnToCell={returnToCell}\n onMouseEnter={() => setIsOverTableMenu(true)}\n onMouseLeave={() => setIsOverTableMenu(false)}\n labels={{\n tableOptions: t('rte_table_options'),\n addRowBelow: t('rte_add_row_below'),\n addRowAbove: t('rte_add_row_above'),\n addColumnAfter: t('rte_add_column_after'),\n addColumnBefore: t('rte_add_column_before'),\n deleteRow: t('rte_delete_row'),\n deleteColumn: t('rte_delete_column'),\n deleteTable: t('rte_delete_table')\n }}\n />\n ) : null}\n </StyledEditorContainer>\n </FormControl>\n {toolbar?.includes('word-count') && tiptapEditor ? (\n <WordCount data-testid={testIds.wordCount} editor={tiptapEditor} />\n ) : null}\n </>\n </StyledEditorRoot>\n {children}\n {imageEditDialog.attributes && (\n <ImageEditDialog\n isOpen={imageEditDialog.isOpen}\n onClose={() => {\n setImageEditDialog({ isOpen: false, attributes: null });\n }}\n onSave={handleImageEditSave}\n initialAttributes={imageEditDialog.attributes}\n target={editButtonRef.current}\n imageCustomSource={imageCustomSource}\n />\n )}\n </EditorContext.Provider>\n );\n});\n\nexport default withTestIds(Editor, getEditorTestIds);\n"]}
|
|
1
|
+
{"version":3,"file":"Editor.js","sourceRoot":"","sources":["../../../src/components/Editor/Editor.tsx"],"names":[],"mappings":"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","sourcesContent":["import type { Editor as TiptapEditor } from '@tiptap/core';\nimport {\n forwardRef,\n useEffect,\n useRef,\n useState,\n useImperativeHandle,\n useMemo,\n useCallback\n} from 'react';\nimport type { PropsWithoutRef, ReactNode, RefObject } from 'react';\nimport { css } from 'styled-components';\n\nimport {\n FormControl,\n Progress,\n HiddenText,\n useAfterInitialEffect,\n useTheme,\n useUID,\n useConsolidatedRef,\n useTestIds,\n withTestIds,\n useConfiguration,\n useI18n\n} from '@pega/cosmos-react-core';\nimport type { ForwardRefForwardPropsComponent } from '@pega/cosmos-react-core';\n\nimport StyledRichTextEditor from '../RichTextEditor/RichTextEditor.styles';\nimport type { Features } from '../RichTextEditor/Toolbar/Toolbar.types';\n\nimport EditorContext from './Editor.context';\nimport type { EditorProps, EditorState, CustomComponent } from './Editor.types';\nimport {\n StyledEditorContainer,\n StyledEditorIframe,\n StyledEditorRoot,\n StyledSourceTextarea\n} from './Editor.styles';\nimport { getEditorTestIds } from './Editor.test-ids';\nimport Toolbar from './Toolbar/Toolbar';\nimport WordCount from './Toolbar/WordCount';\nimport { ImageEditDialog } from './ImageEditDialog';\nimport type { ImageAttributes } from './ImageEditDialog';\nimport ImageActionButtons from './ImageActionButtons';\nimport TableCellMenu from './TableCellMenu';\nimport createFileItemElement from './FileItemElement';\nimport useIframeSetup from './hooks/useIframeSetup';\nimport useImageActions from './hooks/useImageActions';\nimport useTableCellMenu from './hooks/useTableCellMenu';\nimport { dispatchEditorClickEvent } from './hooks/useCloseOnEditorClick';\nimport sanitizeHtml from './sanitize';\n\n// Suggestion editor has no toolbar — formatting controls are intentionally omitted\nconst SUGGESTION_TOOLBAR: Features[] = [];\n\n// Uses Tiptap's isEmpty so leaf/atom nodes (images, hr, tables) count as content —\n// getText() alone returns '' for an image-only doc and would misreport it as blank.\nconst editorHasContent = (editor: TiptapEditor | undefined | null): boolean =>\n editor ? !editor.isEmpty : false;\n\ninterface SuggestionEditorRenderProps {\n ref: RefObject<EditorState>;\n onInit: (tiptapEditor: TiptapEditor) => void;\n onChange: (editor?: TiptapEditor) => void;\n}\n\ninterface SuggestionEditorProps {\n defaultValue?: string;\n disabled: boolean;\n readOnly: boolean;\n onGetContent: (getContent: () => string) => void;\n onContentChange: (hasContent: boolean) => void;\n /** Render prop — receives ref and callbacks; must render an Editor-like element */\n renderEditor: (renderProps: SuggestionEditorRenderProps) => ReactNode;\n}\n\nconst SuggestionEditor = ({\n defaultValue,\n onGetContent,\n onContentChange,\n renderEditor\n}: SuggestionEditorProps) => {\n const editorRef = useRef<EditorState>(null);\n\n useEffect(() => {\n onGetContent(() => editorRef.current?.getEditor()?.getHTML() ?? '');\n }, [onGetContent]);\n\n useAfterInitialEffect(() => {\n editorRef.current?.getEditor()?.commands.setContent(defaultValue ?? '');\n }, [defaultValue]);\n\n return renderEditor({\n ref: editorRef,\n onInit: tiptapEditor => {\n // Signal initial content state so submit button enables correctly\n onContentChange(editorHasContent(tiptapEditor));\n },\n onChange: editor => {\n onContentChange(editorHasContent(editor));\n }\n });\n};\n\nconst Editor: ForwardRefForwardPropsComponent<EditorProps> = forwardRef(function ForwardedEditor(\n props: PropsWithoutRef<EditorProps>,\n ref: EditorProps['ref']\n) {\n const {\n testId,\n id,\n label,\n labelHidden,\n info,\n status,\n required,\n disabled,\n readOnly,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n onImageAdded,\n suggestion,\n onInit,\n defaultValue,\n placeholder,\n children,\n additionalInfo,\n toolbar,\n customActions,\n customComponents = [],\n spellcheck = true,\n imageInsertionMode = 'all',\n initOptions,\n onRewriteClick,\n linkCustomSource,\n imageCustomSource,\n progress,\n autoFocus,\n height,\n autoResize = true,\n secure = false,\n preserveTableStyles = false,\n ...restProps\n } = props;\n\n const theme = useTheme();\n const { styleSheetTarget } = useConfiguration();\n const t = useI18n();\n const [focused, setFocused] = useState(false);\n const [tiptapEditor, setTiptapEditor] = useState<TiptapEditor | null>(null);\n const [imageEditDialog, setImageEditDialog] = useState<{\n isOpen: boolean;\n attributes: ImageAttributes | null;\n }>({ isOpen: false, attributes: null });\n const [sourceMode, setSourceMode] = useState(false);\n const [sourceCode, setSourceCode] = useState('');\n const editButtonRef = useRef<HTMLButtonElement>(null);\n const tableCellMenuButtonRef = useRef<HTMLButtonElement>(null);\n const editorContainerRef = useRef<HTMLDivElement>(null);\n const generatedId = useUID();\n const editorId = id ?? generatedId;\n const labelId = useUID();\n const requiredDescriptionId = `${editorId}-required`;\n const editorRef = useConsolidatedRef(ref);\n const formFieldRef = useRef<HTMLElement>(null);\n const pastedImages = useRef<File[]>([]);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const pendingImageActionUrlsRef = useRef<Map<string, string>>(new Map());\n\n const testIds = useTestIds(testId, getEditorTestIds);\n\n // Check if images feature is enabled\n const imagesEnabled = toolbar?.includes('images') ?? false;\n\n // Check if tables feature is enabled\n const tablesEnabled = toolbar?.includes('tables') ?? false;\n\n // Check if links feature is enabled (controls autolink behavior)\n const linksEnabled = toolbar?.includes('links') ?? false;\n\n // Check if text color feature is enabled\n const colorsEnabled = toolbar?.includes('text-color') ?? false;\n\n // Define built-in custom components and merge with user-provided ones\n const customElements: CustomComponent[] = useMemo(() => {\n const FileItemStyle = css`\n /* stylelint-disable-next-line selector-type-no-unknown */\n pega-file {\n display: inline-block;\n width: ${theme.base['content-width'].md};\n }\n `;\n\n return [\n {\n createCustomElement: createFileItemElement,\n name: 'pega-file',\n style: FileItemStyle.toString(),\n extensionAttributes: ['contenteditable']\n },\n ...customComponents\n ];\n }, [customComponents, theme]);\n\n // Register custom elements in the main window (needed for Tiptap to recognize them)\n useEffect(() => {\n customElements.forEach((component: CustomComponent) => {\n if (\n component.name &&\n component.createCustomElement &&\n !window.customElements.get(component.name)\n ) {\n const CustomElement = component.createCustomElement(window);\n window.customElements.define(component.name, CustomElement);\n }\n });\n }, [customElements]);\n\n // Sanitize defaultValue if secure mode is enabled\n const sanitizedDefaultValue = useMemo(\n () => (secure && defaultValue ? sanitizeHtml(defaultValue) : defaultValue),\n [secure, defaultValue]\n );\n\n // Mount Tiptap inside iframe using custom hook\n const { iframeEditorRef } = useIframeSetup({\n iframeRef,\n theme,\n styleSheetTarget,\n customElements,\n placeholder,\n defaultValue: sanitizedDefaultValue,\n disabled,\n readOnly,\n onChange,\n onKeyDown,\n onFocus,\n onBlur,\n onInit,\n spellcheck,\n initOptions,\n onImageAdded,\n imagesEnabled,\n linksEnabled,\n colorsEnabled,\n imageInsertionMode,\n pastedImages,\n editorId,\n required,\n setTiptapEditor,\n setFocused,\n autoResize,\n secure,\n preserveTableStyles,\n onTabOut: () => {\n // Focus first toolbar button when Tab is pressed in editor\n const toolbarEl = editorContainerRef.current?.querySelector('[data-testid$=\"toolbar\"]');\n const firstButton = toolbarEl?.querySelector<HTMLElement>('button:not([disabled])');\n if (firstButton) {\n firstButton.focus();\n }\n },\n onFocusTableMenu: () => {\n tableCellMenuButtonRef.current?.focus();\n },\n onFocusPreviousCellMenu: () => {\n // Go to previous cell and then focus its menu\n if (tiptapEditor) {\n tiptapEditor.commands.goToPreviousCell();\n setTimeout(() => {\n tableCellMenuButtonRef.current?.focus();\n }, 0);\n }\n }\n });\n\n // Dispatch event on iframe mousedown to close all open popovers/menus\n useEffect(() => {\n const iframeDoc = iframeRef.current?.contentDocument;\n if (!iframeDoc) return;\n\n const handleMouseDown = () => {\n dispatchEditorClickEvent();\n };\n\n iframeDoc.addEventListener('mousedown', handleMouseDown);\n return () => iframeDoc.removeEventListener('mousedown', handleMouseDown);\n }, [tiptapEditor]);\n\n // Set up image action buttons (edit and delete) using custom hook\n const {\n hoveredImagePosition,\n currentImageAttrs,\n currentImageElement,\n handleDelete: handleImageDelete,\n setIsOverButtons\n } = useImageActions({\n tiptapEditor,\n iframeRef,\n isDialogOpen: imageEditDialog.isOpen\n });\n\n // Set up table cell menu using custom hook (only when tables are active)\n const tableMenuEnabled = tablesEnabled && !readOnly && !disabled;\n const {\n cellPosition,\n setIsOverMenu: setIsOverTableMenu,\n addRowBelow,\n addRowAbove,\n addColumnAfter,\n addColumnBefore,\n deleteRow,\n deleteColumn,\n deleteTable\n } = useTableCellMenu({\n tiptapEditor: tableMenuEnabled ? tiptapEditor : null,\n iframeRef\n });\n\n // Handle keyboard navigation from table menu to next cell (start of content)\n const goToNextCell = useCallback(() => {\n if (tiptapEditor) {\n tiptapEditor.commands.focus();\n tiptapEditor.commands.goToNextCell();\n }\n }, [tiptapEditor]);\n\n // Handle keyboard navigation from table menu back to current cell\n const returnToCell = useCallback(() => {\n tiptapEditor?.commands.focus();\n }, [tiptapEditor]);\n\n // Store the image element when opening the dialog to target the correct node on save\n const editingImageElementRef = useRef<HTMLImageElement | null>(null);\n\n // Handle edit button click from ImageActionButtons\n const onEditButtonClick = () => {\n if (currentImageAttrs && currentImageElement) {\n // Store the element reference to target the correct node on save\n editingImageElementRef.current = currentImageElement;\n setImageEditDialog({\n isOpen: true,\n attributes: currentImageAttrs\n });\n // Don't call handleImageEdit() here - keep buttons visible while dialog is open\n }\n };\n\n // Handle image edit save\n const handleImageEditSave = (attrs: ImageAttributes) => {\n if (!tiptapEditor || !editingImageElementRef.current) {\n editingImageElementRef.current = null;\n return;\n }\n\n // Get exact position from DOM element to handle duplicate images correctly\n const pos = tiptapEditor.view.posAtDOM(editingImageElementRef.current, 0);\n\n let imageUpdated = false;\n\n if (pos >= 0) {\n const { state } = tiptapEditor;\n const node = state.doc.nodeAt(pos);\n if (!node || node.type.name !== 'image') {\n editingImageElementRef.current = null;\n return;\n }\n\n const nodeEnd = pos + node.nodeSize;\n const tr = state.tr;\n\n // Update image attributes\n tr.setNodeMarkup(pos, undefined, {\n src: attrs.src,\n alt: attrs.alt,\n ...(attrs.width && { width: attrs.width }),\n ...(attrs.height && { height: attrs.height })\n });\n\n // Handle action URL (links are marks in ProseMirror, not nodes)\n // Always remove existing link mark first, then add new one if needed\n tr.removeMark(pos, nodeEnd, state.schema.marks.link);\n if (attrs.actionUrl) {\n const linkMark = state.schema.marks.link.create({\n href: attrs.actionUrl,\n target: '_blank'\n });\n tr.addMark(pos, nodeEnd, linkMark);\n }\n\n tiptapEditor.view.dispatch(tr);\n imageUpdated = true;\n }\n\n // Clear the ref after save\n editingImageElementRef.current = null;\n\n // Trigger blur callback to persist image changes to redux\n // Without this, edited images won't be saved until user manually blurs the editor\n if (imageUpdated && onBlur) {\n onBlur();\n }\n };\n\n // Update editor when props change\n useAfterInitialEffect(() => {\n iframeEditorRef.current?.setEditable(!readOnly && !disabled);\n }, [readOnly, disabled]);\n\n // Handle autoFocus\n useEffect(() => {\n if (autoFocus && tiptapEditor) {\n tiptapEditor.commands.focus();\n }\n }, [autoFocus, tiptapEditor]);\n\n // Expose methods via ref\n useImperativeHandle(\n editorRef,\n () => ({\n focus: () => iframeEditorRef.current?.focus(),\n getPlainText: () => iframeEditorRef.current?.getPlainText() ?? '',\n getRichText: () => iframeEditorRef.current?.getRichText() ?? '',\n getHtml: () => iframeEditorRef.current?.getHtml() ?? '',\n clear: () => iframeEditorRef.current?.clear(),\n updateAttachmentAttributes: (imageId: string, uploadProgress?: number, error?: string) => {\n if (!iframeRef.current?.contentDocument) return;\n\n const iframeDoc = iframeRef.current.contentDocument;\n const imageCustomEl = iframeDoc.querySelector(`pega-file[data-id=\"${imageId}\"]`);\n\n if (imageCustomEl) {\n if (error) {\n imageCustomEl.setAttribute('data-error', error);\n } else if (uploadProgress !== undefined) {\n imageCustomEl.setAttribute('data-progress', `${uploadProgress}`);\n }\n }\n },\n appendImage: (\n imageData: { src: string; alt: string; attachmentId?: string },\n imageId: string\n ) => {\n if (!iframeRef.current?.contentDocument || !tiptapEditor) return;\n\n const iframeDoc = iframeRef.current.contentDocument;\n const imageUploadEl = iframeDoc.querySelector(`pega-file[data-id=\"${imageId}\"]`);\n\n if (imageUploadEl) {\n // Create img element\n const imgEl = iframeDoc.createElement('img');\n imgEl.setAttribute('src', imageData.src);\n imgEl.setAttribute('alt', imageData.alt);\n if (imageData.attachmentId) {\n imgEl.setAttribute('data-attachment-id', imageData.attachmentId);\n }\n\n const anchorEl = iframeDoc.createElement('a');\n const pendingActionUrl = pendingImageActionUrlsRef.current.get(imageId);\n anchorEl.setAttribute('href', pendingActionUrl || imageData.src);\n anchorEl.setAttribute('target', '_blank');\n anchorEl.setAttribute('rel', 'noopener noreferrer');\n anchorEl.appendChild(imgEl);\n\n // Replace pega-file with linked img in the DOM\n imageUploadEl.replaceWith(anchorEl);\n\n // Also update the Tiptap document\n const html = tiptapEditor.getHTML();\n const updatedHtml = html.replace(\n new RegExp(`<pega-file[^>]*data-id=[\"']${imageId}[\"'][^>]*>.*?</pega-file>`, 'g'),\n anchorEl.outerHTML\n );\n\n if (updatedHtml !== html) {\n tiptapEditor.commands.setContent(updatedHtml, { emitUpdate: false });\n }\n\n pendingImageActionUrlsRef.current.delete(imageId);\n }\n },\n insertText: (text: string) => iframeEditorRef.current?.insertText(text),\n setCursorLocationToStart: () => iframeEditorRef.current?.setCursorLocationToStart(),\n insertHtml: (html: string, overwrite?: boolean) =>\n iframeEditorRef.current?.insertHtml(html, overwrite),\n getEditor: () => iframeEditorRef.current?.getEditor() ?? null,\n element: formFieldRef.current || undefined\n }),\n [tiptapEditor]\n );\n\n const ctx = useMemo(\n () => ({\n editor: tiptapEditor,\n addImage: (image: File, imageId?: string, alt?: string, actionUrl?: string) => {\n if (!tiptapEditor || !image) return;\n\n const imgId = imageId || `img-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n\n if (actionUrl) {\n pendingImageActionUrlsRef.current.set(imgId, actionUrl);\n }\n\n // Create pega-file element to show upload progress\n const pegaFileHtml = `<pega-file data-id='${imgId}' data-progress='0' data-name='${image.name}' data-alt='${alt || image.name}' contenteditable='false'></pega-file>`;\n\n // Insert the pega-file element\n tiptapEditor.chain().focus().insertContent(pegaFileHtml).run();\n\n // Trigger the onImageAdded callback so consumer can upload and call appendImage\n onImageAdded?.(image, imgId, alt);\n }\n }),\n [tiptapEditor, onImageAdded]\n );\n\n const renderSuggestionEditor = useCallback(\n (suggestionProps: {\n defaultValue?: string;\n disabled: boolean;\n readOnly: boolean;\n onGetContent: (getContent: () => string) => void;\n onContentChange: (hasContent: boolean) => void;\n }) => (\n <SuggestionEditor\n defaultValue={suggestionProps.defaultValue}\n disabled={suggestionProps.disabled}\n readOnly={suggestionProps.readOnly}\n onGetContent={suggestionProps.onGetContent}\n onContentChange={suggestionProps.onContentChange}\n renderEditor={({\n ref: suggestionEditorRef,\n onInit: suggestionOnInit,\n onChange: suggestionOnChange\n }) => (\n <Editor\n ref={suggestionEditorRef}\n label={t('ai_rewrite_result_label')}\n labelHidden\n toolbar={SUGGESTION_TOOLBAR}\n defaultValue={suggestionProps.defaultValue}\n disabled={suggestionProps.disabled}\n readOnly={suggestionProps.readOnly}\n height={height}\n onInit={suggestionOnInit}\n onChange={suggestionOnChange}\n />\n )}\n />\n ),\n [height, t]\n );\n\n return (\n <EditorContext.Provider value={ctx}>\n <StyledEditorRoot\n testId={testIds}\n label={label}\n labelFor=''\n labelId={labelId}\n labelHidden={labelHidden}\n id={editorId}\n info={info}\n status={status}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n suggestion={suggestion}\n ref={formFieldRef}\n additionalInfo={additionalInfo}\n >\n <>\n <FormControl\n {...restProps}\n ref={editorRef}\n required={required}\n disabled={disabled}\n readOnly={readOnly}\n status={status}\n as={StyledRichTextEditor}\n focused={focused}\n hasSuggestion={status === 'pending'}\n >\n <StyledEditorContainer ref={editorContainerRef}>\n {progress ? (\n <Progress\n placement='local'\n message={typeof progress === 'string' ? progress : undefined}\n />\n ) : null}\n {/* Title attribute is required for iframe accessibility (WCAG) */}\n <StyledEditorIframe\n data-testid={testIds.iframe}\n title={typeof label === 'string' ? label : t('rte_text_formatting_toolbar')}\n role='application'\n aria-label={typeof label === 'string' ? label : t('rte_text_formatting_toolbar')}\n aria-describedby={required ? requiredDescriptionId : undefined}\n ref={iframeRef}\n tabIndex={sourceMode ? -1 : 0}\n $minHeight={height?.min}\n $maxHeight={height?.max}\n $hidden={sourceMode}\n />\n {required ? (\n <HiddenText id={requiredDescriptionId}>{t('required')}</HiddenText>\n ) : null}\n {sourceMode ? (\n <StyledSourceTextarea\n value={sourceCode}\n onChange={e => {\n const next = e.target.value;\n setSourceCode(next);\n // Keep Tiptap in sync while editing source so parent components\n // reading getHtml()/isEmpty (e.g. required-field validation on\n // blur) see the latest content instead of the pre-toggle doc.\n tiptapEditor?.commands.setContent(next, { emitUpdate: true });\n }}\n onBlur={e => {\n // Tiptap is hidden in source mode and never held focus, so we bridge blur; ignore intra-editor focus moves.\n const nextFocus = e.relatedTarget as Node | null;\n if (nextFocus && editorContainerRef.current?.contains(nextFocus)) return;\n onBlur?.();\n }}\n spellCheck={false}\n aria-label={t('rte_source_code')}\n $minHeight={height?.min}\n $maxHeight={height?.max}\n />\n ) : null}\n {(toolbar?.length || customActions?.length) && tiptapEditor ? (\n <Toolbar\n testId={testIds}\n features={toolbar || []}\n editor={tiptapEditor}\n customActions={customActions}\n imageInsertionMode={imageInsertionMode}\n onRewriteClick={onRewriteClick}\n linkCustomSource={linkCustomSource}\n imageCustomSource={imageCustomSource}\n renderSuggestionEditor={renderSuggestionEditor}\n sourceMode={sourceMode}\n onSourceModeToggle={(isSourceMode: boolean) => {\n if (isSourceMode) {\n setSourceCode(tiptapEditor.getHTML());\n } else {\n // emitUpdate so onChange fires and required-field state\n // refreshes immediately (fixes image-only bodies added via\n // source mode being flagged \"Cannot be blank\" until keystroke).\n tiptapEditor.commands.setContent(sourceCode, { emitUpdate: true });\n // Commit point: fires blur handlers (e.g. changeNblur/PATCH) without requiring the user to click outside.\n onBlur?.();\n }\n setSourceMode(isSourceMode);\n }}\n />\n ) : null}\n {imagesEnabled && !readOnly && !disabled ? (\n <ImageActionButtons\n ref={editButtonRef}\n position={hoveredImagePosition}\n containerRef={editorContainerRef}\n onEdit={onEditButtonClick}\n onDelete={handleImageDelete}\n onMouseEnter={() => setIsOverButtons(true)}\n onMouseLeave={() => setIsOverButtons(false)}\n editAriaLabel={t('rte_edit_image', [currentImageAttrs?.alt || ''])}\n deleteAriaLabel={t('rte_delete_image', [currentImageAttrs?.alt || ''])}\n editTooltip={t('edit')}\n deleteTooltip={t('delete')}\n />\n ) : null}\n {tablesEnabled && !readOnly && !disabled && !sourceMode ? (\n <TableCellMenu\n ref={tableCellMenuButtonRef}\n position={cellPosition}\n containerRef={editorContainerRef}\n onAddRowBelow={addRowBelow}\n onAddRowAbove={addRowAbove}\n onAddColumnAfter={addColumnAfter}\n onAddColumnBefore={addColumnBefore}\n onDeleteRow={deleteRow}\n onDeleteColumn={deleteColumn}\n onDeleteTable={deleteTable}\n onGoToNextCell={goToNextCell}\n onReturnToCell={returnToCell}\n onMouseEnter={() => setIsOverTableMenu(true)}\n onMouseLeave={() => setIsOverTableMenu(false)}\n labels={{\n tableOptions: t('rte_table_options'),\n addRowBelow: t('rte_add_row_below'),\n addRowAbove: t('rte_add_row_above'),\n addColumnAfter: t('rte_add_column_after'),\n addColumnBefore: t('rte_add_column_before'),\n deleteRow: t('rte_delete_row'),\n deleteColumn: t('rte_delete_column'),\n deleteTable: t('rte_delete_table')\n }}\n />\n ) : null}\n </StyledEditorContainer>\n </FormControl>\n {toolbar?.includes('word-count') && tiptapEditor ? (\n <WordCount data-testid={testIds.wordCount} editor={tiptapEditor} />\n ) : null}\n </>\n </StyledEditorRoot>\n {children}\n {imageEditDialog.attributes && (\n <ImageEditDialog\n isOpen={imageEditDialog.isOpen}\n onClose={() => {\n setImageEditDialog({ isOpen: false, attributes: null });\n }}\n onSave={handleImageEditSave}\n initialAttributes={imageEditDialog.attributes}\n target={editButtonRef.current}\n imageCustomSource={imageCustomSource}\n />\n )}\n </EditorContext.Provider>\n );\n});\n\nexport default withTestIds(Editor, getEditorTestIds);\n"]}
|
|
@@ -84,8 +84,6 @@ export interface EditorProps extends FormControlProps, BaseProps, TestIdProp {
|
|
|
84
84
|
onImageAdded?: (image: File, id: string, altText?: string) => void;
|
|
85
85
|
/** A callback for when the editor is finished initializing */
|
|
86
86
|
onInit?: (editor: TiptapEditor) => void;
|
|
87
|
-
/** A callback that runs when the iframe is about to unload, useful for saving editor state */
|
|
88
|
-
onUnload?: (value: string) => void;
|
|
89
87
|
/** Standard placeholder for an input */
|
|
90
88
|
placeholder?: string;
|
|
91
89
|
/** Default value for the RTE - HTML String */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.types.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Editor.types.d.ts","sourceRoot":"","sources":["../../../src/components/Editor/Editor.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.types.js","sourceRoot":"","sources":["../../../src/components/Editor/Editor.types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ReactNode,\n Ref,\n MouseEvent as ReactMouseEvent,\n KeyboardEvent as ReactKeyboardEvent\n} from 'react';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\n\nimport type {\n Action,\n BaseProps,\n FormControlProps,\n TestIdProp,\n AIAction\n} from '@pega/cosmos-react-core';\n\nimport type { Features } from '../RichTextEditor/Toolbar/Toolbar.types';\nimport type { RichTextEditorState } from '../RichTextEditor';\n\nexport type EditorState = RichTextEditorState & {\n getEditor: () => TiptapEditor | null;\n element?: HTMLElement;\n setCursorLocationToStart?: () => void;\n updateAttachmentAttributes: (id: string, progress?: number, error?: string) => void;\n};\n\nexport type CustomAction = {\n text: Action['text'];\n icon: NonNullable<Action['icon']>;\n onMouseDown: (e: ReactMouseEvent | ReactKeyboardEvent) => void;\n active?: (editor: TiptapEditor) => boolean;\n shortcut?: {\n pattern: string;\n description: string;\n command: (editor: TiptapEditor) => void;\n };\n 'data-testid'?: string;\n};\n\nexport type CustomComponent = {\n createCustomElement: (window: typeof globalThis) => CustomElementConstructor;\n name: string;\n extensionAttributes?: string[];\n style?: string;\n};\n\nexport interface LinkCustomSourceEditValue {\n id: string;\n text: string;\n namespace?: string;\n}\n\nexport interface LinkCustomSourceConfig {\n /** A custom picker ReactNode rendered inline in the link popover when the custom source option is selected. */\n picker?: ReactNode;\n /** Called when Apply is clicked in the link popover with custom source mode selected. Receives the link display text. */\n onSubmit?: (linkText: string) => void;\n /** Indicates whether custom-source submit is currently allowed. Defaults to true when omitted. */\n canSubmit?: boolean;\n /** Called when editing an existing custom-source link and the source field can be resolved from link markup. */\n onEditSelectionChange?: (value: LinkCustomSourceEditValue) => void;\n /** When set, opens the link popover in custom source mode with pre-populated text for editing an existing custom-source link. Set to null to dismiss. */\n edit?: LinkCustomSourceEditValue | null | undefined;\n /**\n * Called when the link popover opened via linkCustomSource.edit is dismissed.\n * reason is 'apply' when user applies changes, otherwise 'cancel'.\n * Consumer should set linkCustomSource.edit to null.\n */\n onDismissEdit?: (reason?: 'cancel' | 'apply') => void;\n}\n\nexport interface ImageCustomSourceConfig {\n /** Called when editing an existing custom-source image action URL and the source field can be resolved from action URL markup. */\n onEditSelectionChange?: (value: LinkCustomSourceEditValue) => void;\n /**\n * Called when the image edit popover that updated custom-source selection is dismissed.\n * reason is 'apply' when user applies changes, otherwise 'cancel'.\n */\n onDismissEdit?: (reason?: 'cancel' | 'apply') => void;\n /** A custom picker ReactNode rendered inline in image dialogs when the custom source option is selected. */\n picker?: ReactNode;\n /** Called when Apply is clicked in image dialogs with custom source mode selected. Returns resolved href for image action link.\n * If returning a <pega-reference ...> value, return raw (unescaped) markup; the editor will escape it as needed when inserting into HTML attributes.\n */\n onSubmit?: (imageAltText: string) => string | undefined;\n /** Indicates whether custom-source submit is currently allowed. Defaults to true when omitted. */\n canSubmit?: boolean;\n}\n\nexport interface EditorProps extends FormControlProps, BaseProps, TestIdProp {\n /** An array of strings that activate features on the toolbar */\n toolbar?: Features[];\n /** Children content */\n children?: ReactNode;\n /** A callback that supplies an object with functions that can manipulate the editor and retrieve it's content/state */\n onChange?: (editor?: TiptapEditor) => void;\n /** KeyDown event custom handlers for the editor */\n onKeyDown?: (event?: KeyboardEvent) => void;\n /** A callback that runs if the editor is focused */\n onFocus?: () => void;\n /** A callback that runs if the editor loses focus */\n onBlur?: () => void;\n /** A callback when an image is added through the toolbar image feature */\n onImageAdded?: (image: File, id: string, altText?: string) => void;\n /** A callback for when the editor is finished initializing */\n onInit?: (editor: TiptapEditor) => void;\n /**
|
|
1
|
+
{"version":3,"file":"Editor.types.js","sourceRoot":"","sources":["../../../src/components/Editor/Editor.types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n ReactNode,\n Ref,\n MouseEvent as ReactMouseEvent,\n KeyboardEvent as ReactKeyboardEvent\n} from 'react';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\n\nimport type {\n Action,\n BaseProps,\n FormControlProps,\n TestIdProp,\n AIAction\n} from '@pega/cosmos-react-core';\n\nimport type { Features } from '../RichTextEditor/Toolbar/Toolbar.types';\nimport type { RichTextEditorState } from '../RichTextEditor';\n\nexport type EditorState = RichTextEditorState & {\n getEditor: () => TiptapEditor | null;\n element?: HTMLElement;\n setCursorLocationToStart?: () => void;\n updateAttachmentAttributes: (id: string, progress?: number, error?: string) => void;\n};\n\nexport type CustomAction = {\n text: Action['text'];\n icon: NonNullable<Action['icon']>;\n onMouseDown: (e: ReactMouseEvent | ReactKeyboardEvent) => void;\n active?: (editor: TiptapEditor) => boolean;\n shortcut?: {\n pattern: string;\n description: string;\n command: (editor: TiptapEditor) => void;\n };\n 'data-testid'?: string;\n};\n\nexport type CustomComponent = {\n createCustomElement: (window: typeof globalThis) => CustomElementConstructor;\n name: string;\n extensionAttributes?: string[];\n style?: string;\n};\n\nexport interface LinkCustomSourceEditValue {\n id: string;\n text: string;\n namespace?: string;\n}\n\nexport interface LinkCustomSourceConfig {\n /** A custom picker ReactNode rendered inline in the link popover when the custom source option is selected. */\n picker?: ReactNode;\n /** Called when Apply is clicked in the link popover with custom source mode selected. Receives the link display text. */\n onSubmit?: (linkText: string) => void;\n /** Indicates whether custom-source submit is currently allowed. Defaults to true when omitted. */\n canSubmit?: boolean;\n /** Called when editing an existing custom-source link and the source field can be resolved from link markup. */\n onEditSelectionChange?: (value: LinkCustomSourceEditValue) => void;\n /** When set, opens the link popover in custom source mode with pre-populated text for editing an existing custom-source link. Set to null to dismiss. */\n edit?: LinkCustomSourceEditValue | null | undefined;\n /**\n * Called when the link popover opened via linkCustomSource.edit is dismissed.\n * reason is 'apply' when user applies changes, otherwise 'cancel'.\n * Consumer should set linkCustomSource.edit to null.\n */\n onDismissEdit?: (reason?: 'cancel' | 'apply') => void;\n}\n\nexport interface ImageCustomSourceConfig {\n /** Called when editing an existing custom-source image action URL and the source field can be resolved from action URL markup. */\n onEditSelectionChange?: (value: LinkCustomSourceEditValue) => void;\n /**\n * Called when the image edit popover that updated custom-source selection is dismissed.\n * reason is 'apply' when user applies changes, otherwise 'cancel'.\n */\n onDismissEdit?: (reason?: 'cancel' | 'apply') => void;\n /** A custom picker ReactNode rendered inline in image dialogs when the custom source option is selected. */\n picker?: ReactNode;\n /** Called when Apply is clicked in image dialogs with custom source mode selected. Returns resolved href for image action link.\n * If returning a <pega-reference ...> value, return raw (unescaped) markup; the editor will escape it as needed when inserting into HTML attributes.\n */\n onSubmit?: (imageAltText: string) => string | undefined;\n /** Indicates whether custom-source submit is currently allowed. Defaults to true when omitted. */\n canSubmit?: boolean;\n}\n\nexport interface EditorProps extends FormControlProps, BaseProps, TestIdProp {\n /** An array of strings that activate features on the toolbar */\n toolbar?: Features[];\n /** Children content */\n children?: ReactNode;\n /** A callback that supplies an object with functions that can manipulate the editor and retrieve it's content/state */\n onChange?: (editor?: TiptapEditor) => void;\n /** KeyDown event custom handlers for the editor */\n onKeyDown?: (event?: KeyboardEvent) => void;\n /** A callback that runs if the editor is focused */\n onFocus?: () => void;\n /** A callback that runs if the editor loses focus */\n onBlur?: () => void;\n /** A callback when an image is added through the toolbar image feature */\n onImageAdded?: (image: File, id: string, altText?: string) => void;\n /** A callback for when the editor is finished initializing */\n onInit?: (editor: TiptapEditor) => void;\n /** Standard placeholder for an input */\n placeholder?: string;\n /** Default value for the RTE - HTML String */\n defaultValue?: string;\n /** Will automatically focus the RTE on render if true */\n autoFocus?: boolean;\n /** Sets the height for the RTE. If no max height is set the RTE will continue to expand, otherwise an overflow will be applied */\n height?: {\n min?: number;\n max?: number;\n };\n /**\n * Determines if the editor resizes its height based on content and user interactions.\n * @default true;\n */\n autoResize?: boolean;\n /** An array of custom components, custom components must use web component API */\n customComponents?: CustomComponent[];\n /** An array of custom buttons to be inserted into the toolbar */\n customActions?: CustomAction[];\n /**\n * Enables browser spellcheck.\n * @default true\n */\n spellcheck?: boolean;\n /** Options used during init of the editor */\n initOptions?: {\n /** Disables pasting of images in editor when false */\n pasteDataImages?: boolean;\n /** Converts formatted text to plain text upon pasting */\n pasteAsText?: boolean;\n /** Disables inline, block, and replacement text patterns when false and can be array of allowed formats */\n textPatterns?: boolean;\n /** Function called during init_instance_callback as part of editor init */\n initInstanceCallback?: (editor: TiptapEditor) => void;\n /** Styles to set within the iframe's document */\n contentStyle?: string;\n };\n /** Handle to the state. */\n ref?: Ref<EditorState>;\n /**\n * Determines the image insertion mode for the editor.\n * - 'file': Only allows uploading image files from local system\n * - 'url': Only allows adding images via URL/link\n * - 'all': Allows all image files upload options\n * @default 'all'\n */\n imageInsertionMode?: 'file' | 'url' | 'all';\n /** A callback when the AI rewrite toolbar button is used. The onSuccess callback should be called with the rewritten text. */\n onRewriteClick?: (\n originalText: string,\n rewriteAction: AIAction,\n additionalInstructions: string,\n onSuccess: (rewrittenText: string) => void\n ) => void;\n /** Link custom-source configuration for inserting and editing links using consumer-provided source selection. */\n linkCustomSource?: LinkCustomSourceConfig;\n /** Image custom-source configuration for inserting image action links using consumer-provided source selection. */\n imageCustomSource?: ImageCustomSourceConfig;\n /** If there is a progress state (e.g. AI rewrite in progress), you must indicate as such. Shows a Progress overlay on the editor. */\n progress?: boolean | string;\n /**\n * Enables secure mode which sanitizes content to prevent XSS attacks.\n * Strips scripts, iframes, event handlers, and dangerous URLs.\n * @default false\n */\n secure?: boolean;\n /**\n * Preserves inline styles on table elements (table, tr, td, th).\n * Use for correspondence editing where email template styling must be preserved.\n * @default false\n */\n preserveTableStyles?: boolean;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageButton.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/ImageButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAa3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAO5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAO/D,QAAA,MAAM,WAAW,GAAI,iEAKlB;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,kBAAkB,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAC3C,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;CAC7C,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"ImageButton.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/ImageButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAa3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAO5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAO/D,QAAA,MAAM,WAAW,GAAI,iEAKlB;IACD,MAAM,EAAE,YAAY,CAAC;IACrB,kBAAkB,EAAE,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IAC3C,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;CAC7C,GAAG,YAAY,4CAyYf,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -110,7 +110,11 @@ const ImageButton = ({ editor, imageInsertionMode, imageCustomSource, ...restPro
|
|
|
110
110
|
}
|
|
111
111
|
const imageUid = createUID();
|
|
112
112
|
let insertHtml = '';
|
|
113
|
-
|
|
113
|
+
// Default to empty alt when the user leaves the field blank. The onerror
|
|
114
|
+
// handler below sets t('rte_broken_image') only if the image actually
|
|
115
|
+
// fails to load, so a working image with no alt stays accessible as
|
|
116
|
+
// decorative rather than being announced as an error by screen readers.
|
|
117
|
+
const imageAltText = imageLinkTitle || '';
|
|
114
118
|
if (hasImageCustomSource && linkImageActionUrlType === 'field') {
|
|
115
119
|
if (!canSubmitCustomSource) {
|
|
116
120
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ImageButton.js","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/ImageButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAI7E,OAAO,EACL,SAAS,EACT,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,OAAO,EACR,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,WAAW,MAAM,gEAAgE,CAAC;AAE9F,OAAO,aAAa,MAAM,4CAA4C,CAAC;AACvE,OAAO,aAAa,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,qBAAqB,MAAM,gCAAgC,CAAC;AAGnE,YAAY,CAAC,WAAW,CAAC,CAAC;AAE1B,MAAM,mBAAmB,GAAG,CAAC,KAAa,EAAE,EAAE,CAC5C,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAEnG,MAAM,WAAW,GAAG,CAAC,EACnB,MAAM,EACN,kBAAkB,EAClB,iBAAiB,EACjB,GAAG,SAAS,EAKE,EAAE,EAAE;IAClB,MAAM,CAAC,GAAG,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IAC/C,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,MAAM,CAAc,IAAI,CAAC,CAAC;IACjD,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAkB,KAAK,CAAC,CAAC;IACrF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpE,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE;QACxE,IAAI,kBAAkB,KAAK,KAAK,EAAE,CAAC;YACjC,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAQ,CAAC;IACjD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,GAAG,QAAQ,CAAkB,KAAK,CAAC,CAAC;IAC7F,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjE,MAAM,CAAC,2BAA2B,EAAE,8BAA8B,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtF,MAAM,oBAAoB,GAAG,OAAO,CAAC,iBAAiB,EAAE,MAAM,IAAI,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAC/F,MAAM,qBAAqB,GAAG,iBAAiB,EAAE,SAAS,IAAI,IAAI,CAAC;IAEnE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,kBAAkB,KAAK,KAAK,EAAE,CAAC;YACjC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAEzB,MAAM,kBAAkB,GAAG,CAAC,UAAkB,EAAE,EAAE;QAChD,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,SAA6B,QAAQ,EAAE,EAAE;QAC1D,MAAM,CAAC,EAAE,CAAC,CAAC;QACX,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACtB,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC7B,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACtB,qBAAqB,CAAC,KAAK,CAAC,CAAC;QAC7B,aAAa,CAAC,EAAE,CAAC,CAAC;QAClB,WAAW,CAAC,SAAS,CAAC,CAAC;QACvB,yBAAyB,CAAC,kBAAkB,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC1E,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,yBAAyB,CAAC,KAAK,CAAC,CAAC;QACjC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC1B,8BAA8B,CAAC,KAAK,CAAC,CAAC;QACtC,iBAAiB,EAAE,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;QAC3C,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,sDAAsD;IACtD,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,IAAI,eAAe,EAAE,CAAC;YACpB,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IACtB,qBAAqB,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;IAE1D,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,IAAI,sBAAsB,KAAK,MAAM,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,IAAI,kBAAkB,KAAK,KAAK,IAAI,kBAAkB,EAAE,CAAC;gBACvD,OAAO;YACT,CAAC;YACD,oDAAoD;YACpD,IAAI,kBAAkB,KAAK,OAAO,EAAE,CAAC;gBACnC,IAAI,CAAC,iBAAiB,EAAE,QAAQ,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3D,OAAO;gBACT,CAAC;gBACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACzD,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBACrD,SAAS,CAAC,OAAO,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,+CAA+C;YAC/C,IAAI,kBAAkB,KAAK,KAAK,IAAI,cAAc,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1E,0EAA0E;gBAC1E,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;gBAC1D,SAAS,CAAC,OAAO,CAAC,CAAC;gBACnB,OAAO;YACT,CAAC;YACD,iCAAiC;YACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YAC1C,SAAS,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;aAAM,IAAI,sBAAsB,KAAK,MAAM,EAAE,CAAC;YAC7C,IAAI,CAAC,GAAG,IAAI,YAAY,EAAE,CAAC;gBACzB,eAAe,CAAC,IAAI,CAAC,CAAC;gBACtB,OAAO;YACT,CAAC;YACD,IAAI,oBAAoB,IAAI,sBAAsB,KAAK,KAAK,IAAI,2BAA2B,EAAE,CAAC;gBAC5F,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;YAC7B,IAAI,UAAU,GAAG,EAAE,CAAC;YACpB,MAAM,YAAY,GAAG,cAAc,IAAI,CAAC,CAAC,kBAAkB,CAAC,CAAC;YAE7D,IAAI,oBAAoB,IAAI,sBAAsB,KAAK,OAAO,EAAE,CAAC;gBAC/D,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC3B,OAAO;gBACT,CAAC;gBACD,MAAM,YAAY,GAAG,iBAAiB,EAAE,QAAQ;oBAC9C,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,YAAY,CAAC;oBAC1C,CAAC,CAAC,SAAS,CAAC;gBACd,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC/E,IAAI,SAAS,EAAE,CAAC;oBACd,UAAU,GAAG,YAAY,SAAS,yDAAyD,mBAAmB,CAAC,GAAG,CAAC,cAAc,QAAQ,UAAU,mBAAmB,CAAC,YAAY,CAAC,UAAU,CAAC;gBACjM,CAAC;qBAAM,CAAC;oBACN,UAAU,GAAG,aAAa,mBAAmB,CAAC,GAAG,CAAC,cAAc,QAAQ,UAAU,mBAAmB,CAAC,YAAY,CAAC,MAAM,CAAC;gBAC5H,CAAC;YACH,CAAC;iBAAM,IACL,oBAAoB;gBACpB,sBAAsB,KAAK,KAAK;gBAChC,kBAAkB;gBAClB,CAAC,2BAA2B,EAC5B,CAAC;gBACD,MAAM,SAAS,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;gBAC1D,UAAU,GAAG,YAAY,SAAS,yDAAyD,mBAAmB,CAAC,GAAG,CAAC,cAAc,QAAQ,UAAU,mBAAmB,CAAC,YAAY,CAAC,UAAU,CAAC;YACjM,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,aAAa,mBAAmB,CAAC,GAAG,CAAC,cAAc,QAAQ,UAAU,mBAAmB,CAAC,YAAY,CAAC,MAAM,CAAC;YAC5H,CAAC;YAED,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;YAEvD,kEAAkE;YAClE,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,yDAAyD;gBACzD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;gBAChD,qBAAqB,CAAC,GAAG,EAAE;oBACzB,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAmB,gBAAgB,QAAQ,IAAI,CAAC,CAAC;oBACxF,IAAI,OAAO,EAAE,CAAC;wBACZ,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE;4BACrB,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,kBAAkB,CAAC,CAAC;wBACtC,CAAC,CAAC;oBACJ,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YACD,SAAS,CAAC,OAAO,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,SAAS,EAAE,CAAC;IACd,CAAC,CAAC;IAEF,OAAO,CACL,8BACE,KAAC,aAAa,IACZ,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,GAAG,EAAE;oBACZ,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC3B,CAAC,EACD,SAAS,EAAE,CAAC,CAAqB,EAAE,EAAE;oBACnC,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;wBACvC,CAAC,CAAC,cAAc,EAAE,CAAC;wBACnB,kBAAkB,CAAC,IAAI,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC,EACD,OAAO,EAAE,CAAC,CAAC,WAAW,CAAC,EACvB,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,KACjB,SAAS,YAEb,KAAC,IAAI,IAAC,IAAI,EAAC,SAAS,GAAG,GACT,EACf,eAAe,IAAI,cAAc,CAAC,OAAO,IAAI,CAC5C,yBACE,KAAC,gBAAgB,IACf,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC,EAC3B,QAAQ,EAAE,gBAAgB,EAC1B,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,GAAG,EAAE;wBACd,SAAS,EAAE,CAAC;oBACd,CAAC,EACD,MAAM,EAAE,cAAc,CAAC,OAAO,EAC9B,GAAG,EAAE,eAAe,YAEpB,MAAC,IAAI,IACH,SAAS,EAAE;4BACT,GAAG,EAAE,CAAC;yBACP,aAEA,kBAAkB,KAAK,KAAK,IAAI,CAC/B,KAAC,IAAI,IAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,YAC5B,MAAC,gBAAgB,IACf,IAAI,EAAC,gBAAgB,EACrB,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC,EAC5B,QAAQ,EAAE,CAAC,CAAC,EAAE;wCACZ,yBAAyB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oCAC5C,CAAC,iBACW,gBAAgB,EAC5B,MAAM,QACN,QAAQ,mBAER,KAAC,WAAW,IACV,EAAE,EAAC,MAAM,EACT,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAC1B,KAAK,EAAC,MAAM,EACZ,OAAO,EAAE,sBAAsB,KAAK,MAAM,GAC1C,EACF,KAAC,WAAW,IACV,EAAE,EAAC,MAAM,EACT,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAC1B,KAAK,EAAC,MAAM,EACZ,OAAO,EAAE,sBAAsB,KAAK,MAAM,GAC1C,IACe,GACd,CACR,EACA,sBAAsB,KAAK,MAAM,IAAI,CACpC,MAAC,IAAI,IAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,aAC5B,KAAC,SAAS,IACR,QAAQ,EAAE,KAAK,EACf,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAC1B,YAAY,EAAE,kBAAkB,EAChC,QAAQ,QACR,MAAM,EAAC,SAAS,EAChB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,EAC3C,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACvC,KAAK,EACH,QAAQ;4CACN,CAAC,CAAC;gDACE;oDACE,IAAI,EAAE,QAAQ,CAAC,IAAI;oDACnB,EAAE,EAAE,SAAS,EAAE;oDACf,SAAS,EAAE,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC;oDACxC,QAAQ,EAAE,GAAG,EAAE;wDACb,WAAW,CAAC,SAAS,CAAC,CAAC;oDACzB,CAAC;iDACF;6CACF;4CACH,CAAC,CAAC,EAAE,GAER,EACF,KAAC,KAAK,IACJ,KAAK,EAAE,CAAC,CAAC,aAAa,CAAC,EACvB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE;4CACZ,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wCAChC,CAAC,EACD,IAAI,EAAE,CAAC,CAAC,4BAA4B,CAAC,GACrC,EACD,oBAAoB,IAAI,CACvB,MAAC,gBAAgB,IACf,IAAI,EAAC,oBAAoB,EACzB,KAAK,EAAE,CAAC,CAAC,yBAAyB,CAAC,EACnC,QAAQ,EAAE,CAAC,CAAC,EAAE;4CACZ,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;4CAC3B,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gDACzC,qBAAqB,CAAC,KAAK,CAAC,CAAC;4CAC/B,CAAC;wCACH,CAAC,EACD,MAAM,mBAEN,KAAC,WAAW,IACV,KAAK,EAAE,CAAC,CAAC,cAAc,CAAC,EACxB,KAAK,EAAC,KAAK,EACX,OAAO,EAAE,kBAAkB,KAAK,KAAK,GACrC,EACF,KAAC,WAAW,IACV,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAC1B,KAAK,EAAC,OAAO,EACb,OAAO,EAAE,kBAAkB,KAAK,OAAO,GACvC,IACe,CACpB,EACA,oBAAoB,IAAI,kBAAkB,KAAK,KAAK,IAAI,CACvD,KAAC,KAAK,IACJ,KAAK,EAAE,CAAC,CAAC,eAAe,CAAC,EACzB,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,EACpD,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAChD,QAAQ,EAAE,CAAC,CAAC,EAAE;4CACZ,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;4CAChC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;4CAC5B,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;gDACpB,qBAAqB,CAAC,KAAK,CAAC,CAAC;gDAC7B,OAAO;4CACT,CAAC;4CACD,IAAI,CAAC;gDACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;gDACjC,qBAAqB,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;4CACxE,CAAC;4CAAC,MAAM,CAAC;gDACP,qBAAqB,CAAC,IAAI,CAAC,CAAC;4CAC9B,CAAC;wCACH,CAAC,GACD,CACH,EACA,oBAAoB;wCACnB,kBAAkB,KAAK,OAAO;wCAC9B,iBAAiB,EAAE,MAAM,IACtB,CACR,EACA,sBAAsB,KAAK,MAAM,IAAI,CACpC,MAAC,IAAI,IAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,aAC5B,KAAC,KAAK,IACJ,KAAK,EAAE,CAAC,CAAC,eAAe,CAAC,EACzB,KAAK,EAAE,GAAG,EACV,QAAQ,QACR,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,EAC9C,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAC1C,QAAQ,EAAE,CAAC,CAAC,EAAE;4CACZ,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;4CAChC,MAAM,CAAC,QAAQ,CAAC,CAAC;4CACjB,IAAI,CAAC;gDACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;gDACjC,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;4CAClE,CAAC;4CAAC,MAAM,CAAC;gDACP,eAAe,CAAC,IAAI,CAAC,CAAC;4CACxB,CAAC;wCACH,CAAC,GACD,EACF,KAAC,KAAK,IACJ,KAAK,EAAE,CAAC,CAAC,aAAa,CAAC,EACvB,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,CAAC,CAAC,EAAE;4CACZ,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;wCACpC,CAAC,EACD,IAAI,EAAE,CAAC,CAAC,4BAA4B,CAAC,GACrC,EACD,oBAAoB,IAAI,CACvB,MAAC,gBAAgB,IACf,IAAI,EAAC,wBAAwB,EAC7B,KAAK,EAAE,CAAC,CAAC,yBAAyB,CAAC,EACnC,QAAQ,EAAE,CAAC,CAAC,EAAE;4CACZ,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;4CAC3B,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;gDACzC,yBAAyB,CAAC,KAAK,CAAC,CAAC;4CACnC,CAAC;wCACH,CAAC,EACD,MAAM,mBAEN,KAAC,WAAW,IACV,KAAK,EAAE,CAAC,CAAC,cAAc,CAAC,EACxB,KAAK,EAAC,KAAK,EACX,OAAO,EAAE,sBAAsB,KAAK,KAAK,GACzC,EACF,KAAC,WAAW,IACV,KAAK,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAC1B,KAAK,EAAC,OAAO,EACb,OAAO,EAAE,sBAAsB,KAAK,OAAO,GAC3C,IACe,CACpB,EACA,oBAAoB,IAAI,sBAAsB,KAAK,KAAK,IAAI,CAC3D,KAAC,KAAK,IACJ,KAAK,EAAE,CAAC,CAAC,eAAe,CAAC,EACzB,KAAK,EAAE,kBAAkB,EACzB,IAAI,EAAE,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,EAC7D,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACzD,QAAQ,EAAE,CAAC,CAAC,EAAE;4CACZ,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;4CAChC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;4CAChC,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;gDACpB,8BAA8B,CAAC,KAAK,CAAC,CAAC;gDACtC,OAAO;4CACT,CAAC;4CACD,IAAI,CAAC;gDACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;gDACjC,8BAA8B,CAC5B,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAC/C,CAAC;4CACJ,CAAC;4CAAC,MAAM,CAAC;gDACP,8BAA8B,CAAC,IAAI,CAAC,CAAC;4CACvC,CAAC;wCACH,CAAC,GACD,CACH,EACA,oBAAoB;wCACnB,sBAAsB,KAAK,OAAO;wCAClC,iBAAiB,EAAE,MAAM,IACtB,CACR,IACI,GACU,GACd,CACR,IACA,CACJ,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,WAAW,CAAC","sourcesContent":["import { useState, useRef, useContext, useEffect, useCallback } from 'react';\nimport type { KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\n\nimport {\n createUID,\n FileInput,\n Grid,\n Icon,\n Input,\n RadioButton,\n RadioButtonGroup,\n registerIcon,\n useI18n\n} from '@pega/cosmos-react-core';\nimport type { ForwardProps } from '@pega/cosmos-react-core';\nimport * as pictureIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/picture.icon';\n\nimport ToolbarButton from '../../RichTextEditor/Toolbar/ToolbarButton';\nimport EditorContext from '../Editor.context';\nimport { StyledFormDialog } from '../Editor.styles';\nimport useCloseOnEditorClick from '../hooks/useCloseOnEditorClick';\nimport type { ImageCustomSourceConfig } from '../Editor.types';\n\nregisterIcon(pictureIcon);\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\nconst ImageButton = ({\n editor,\n imageInsertionMode,\n imageCustomSource,\n ...restProps\n}: {\n editor: TiptapEditor;\n imageInsertionMode: 'file' | 'url' | 'all';\n imageCustomSource?: ImageCustomSourceConfig;\n} & ForwardProps) => {\n const t = useI18n();\n const { addImage } = useContext(EditorContext);\n const [showImageDialog, setShowImageDialog] = useState(false);\n const imagebuttonRef = useRef<HTMLElement>(null);\n const imagepopoverRef = useRef(null);\n const [imageTitle, setImageTitle] = useState('');\n const [imageLinkTitle, setImageLinkTitle] = useState('');\n const [imageActionUrlType, setImageActionUrlType] = useState<'url' | 'field'>('url');\n const [imageActionUrl, setImageActionUrl] = useState('');\n const [incorrectActionUrl, setIncorrectActionUrl] = useState(false);\n const [selectedAttachmentType, setSelectedAttachmentType] = useState(() => {\n if (imageInsertionMode === 'url') {\n return 'link';\n }\n return 'file';\n });\n const [url, setUrl] = useState('');\n const [tempfile, setTempFile] = useState<File>();\n const [incorrectUrl, setIncorrectUrl] = useState(false);\n const [fileEmpty, setFileEmpty] = useState(false);\n const [linkImageActionUrlType, setLinkImageActionUrlType] = useState<'url' | 'field'>('url');\n const [linkImageActionUrl, setLinkImageActionUrl] = useState('');\n const [incorrectLinkImageActionUrl, setIncorrectLinkImageActionUrl] = useState(false);\n const hasImageCustomSource = Boolean(imageCustomSource?.picker && imageCustomSource?.onSubmit);\n const canSubmitCustomSource = imageCustomSource?.canSubmit ?? true;\n\n useEffect(() => {\n if (imageInsertionMode === 'url') {\n setSelectedAttachmentType('link');\n } else {\n setSelectedAttachmentType('file');\n }\n }, [imageInsertionMode]);\n\n const onImageInputChange = (addedFiles: File[]) => {\n setTempFile(addedFiles[0]);\n setFileEmpty(false);\n };\n\n const resetMenu = (reason: 'cancel' | 'apply' = 'cancel') => {\n setUrl('');\n setIncorrectUrl(false);\n setImageLinkTitle('');\n setImageActionUrlType('url');\n setImageActionUrl('');\n setIncorrectActionUrl(false);\n setImageTitle('');\n setTempFile(undefined);\n setSelectedAttachmentType(imageInsertionMode === 'url' ? 'link' : 'file');\n setFileEmpty(false);\n setLinkImageActionUrlType('url');\n setLinkImageActionUrl('');\n setIncorrectLinkImageActionUrl(false);\n imageCustomSource?.onDismissEdit?.(reason);\n setShowImageDialog(false);\n };\n\n // Close dialog when clicking inside the editor iframe\n const handleEditorClick = useCallback(() => {\n if (showImageDialog) {\n resetMenu();\n }\n }, [showImageDialog]);\n useCloseOnEditorClick(showImageDialog, handleEditorClick);\n\n const onImageAddSubmit = () => {\n if (selectedAttachmentType === 'file') {\n if (!tempfile) {\n setFileEmpty(true);\n return;\n }\n if (imageActionUrlType === 'url' && incorrectActionUrl) {\n return;\n }\n // Handle field-based action URL for uploaded images\n if (imageActionUrlType === 'field') {\n if (!imageCustomSource?.onSubmit || !canSubmitCustomSource) {\n return;\n }\n const actionUrl = imageCustomSource.onSubmit(imageTitle);\n addImage(tempfile, undefined, imageTitle, actionUrl);\n resetMenu('apply');\n return;\n }\n // Handle static URL action for uploaded images\n if (imageActionUrlType === 'url' && imageActionUrl && !incorrectActionUrl) {\n // Pass action URL to addImage - consumer will handle wrapping with anchor\n addImage(tempfile, undefined, imageTitle, imageActionUrl);\n resetMenu('apply');\n return;\n }\n // No action URL - just add image\n addImage(tempfile, undefined, imageTitle);\n resetMenu('apply');\n } else if (selectedAttachmentType === 'link') {\n if (!url || incorrectUrl) {\n setIncorrectUrl(true);\n return;\n }\n if (hasImageCustomSource && linkImageActionUrlType === 'url' && incorrectLinkImageActionUrl) {\n return;\n }\n\n const imageUid = createUID();\n let insertHtml = '';\n const imageAltText = imageLinkTitle || t('rte_broken_image');\n\n if (hasImageCustomSource && linkImageActionUrlType === 'field') {\n if (!canSubmitCustomSource) {\n return;\n }\n const fallbackHref = imageCustomSource?.onSubmit\n ? imageCustomSource.onSubmit(imageAltText)\n : undefined;\n const actionUrl = fallbackHref ? escapeHtmlAttribute(fallbackHref) : undefined;\n if (actionUrl) {\n insertHtml = `<a href=\"${actionUrl}\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"${escapeHtmlAttribute(url)}\" data-id=\"${imageUid}\" alt=\"${escapeHtmlAttribute(imageAltText)}\" /></a>`;\n } else {\n insertHtml = `<img src=\"${escapeHtmlAttribute(url)}\" data-id=\"${imageUid}\" alt=\"${escapeHtmlAttribute(imageAltText)}\" />`;\n }\n } else if (\n hasImageCustomSource &&\n linkImageActionUrlType === 'url' &&\n linkImageActionUrl &&\n !incorrectLinkImageActionUrl\n ) {\n const actionUrl = escapeHtmlAttribute(linkImageActionUrl);\n insertHtml = `<a href=\"${actionUrl}\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"${escapeHtmlAttribute(url)}\" data-id=\"${imageUid}\" alt=\"${escapeHtmlAttribute(imageAltText)}\" /></a>`;\n } else {\n insertHtml = `<img src=\"${escapeHtmlAttribute(url)}\" data-id=\"${imageUid}\" alt=\"${escapeHtmlAttribute(imageAltText)}\" />`;\n }\n\n editor.chain().focus().insertContent(insertHtml).run();\n\n // Add error handler for broken images if no alt text was provided\n if (!imageLinkTitle) {\n // Use the editor's document to target the correct iframe\n const editorDoc = editor.view.dom.ownerDocument;\n requestAnimationFrame(() => {\n const imageEl = editorDoc.querySelector<HTMLImageElement>(`img[data-id=\"${imageUid}\"]`);\n if (imageEl) {\n imageEl.onerror = () => {\n imageEl.alt = t('rte_broken_image');\n };\n }\n });\n }\n resetMenu('apply');\n }\n };\n\n const onImageAddCancel = () => {\n resetMenu();\n };\n\n return (\n <>\n <ToolbarButton\n ref={imagebuttonRef}\n onClick={() => {\n setShowImageDialog(true);\n }}\n onKeyDown={(e: ReactKeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setShowImageDialog(true);\n }\n }}\n tooltip={t('rte_image')}\n label={t('rte_image')}\n {...restProps}\n >\n <Icon name='picture' />\n </ToolbarButton>\n {showImageDialog && imagebuttonRef.current && (\n <form>\n <StyledFormDialog\n heading={t('rte_add_image')}\n onSubmit={onImageAddSubmit}\n onCancel={onImageAddCancel}\n onDismiss={() => {\n resetMenu();\n }}\n target={imagebuttonRef.current}\n ref={imagepopoverRef}\n >\n <Grid\n container={{\n gap: 2\n }}\n >\n {imageInsertionMode === 'all' && (\n <Grid container={{ rowGap: 2 }}>\n <RadioButtonGroup\n name='chooseListView'\n label={t('rte_image_source')}\n onChange={e => {\n setSelectedAttachmentType(e.target.value);\n }}\n data-testid='chooseListView'\n inline\n required\n >\n <RadioButton\n id='file'\n label={t('rte_image_file')}\n value='file'\n checked={selectedAttachmentType === 'file'}\n />\n <RadioButton\n id='link'\n label={t('rte_image_link')}\n value='link'\n checked={selectedAttachmentType === 'link'}\n />\n </RadioButtonGroup>\n </Grid>\n )}\n {selectedAttachmentType === 'file' && (\n <Grid container={{ rowGap: 2 }}>\n <FileInput\n multiple={false}\n label={t('rte_image_file')}\n onFilesAdded={onImageInputChange}\n required\n accept='image/*'\n info={fileEmpty ? t('rte_empty_image') : ''}\n status={fileEmpty ? 'error' : undefined}\n files={\n tempfile\n ? [\n {\n name: tempfile.name,\n id: createUID(),\n thumbnail: URL.createObjectURL(tempfile),\n onDelete: () => {\n setTempFile(undefined);\n }\n }\n ]\n : []\n }\n />\n <Input\n label={t('description')}\n value={imageTitle}\n onChange={e => {\n setImageTitle(e.target.value);\n }}\n info={t('rte_image_description_info')}\n />\n {hasImageCustomSource && (\n <RadioButtonGroup\n name='imageActionUrlType'\n label={t('rte_image_action_source')}\n onChange={e => {\n const { value } = e.target;\n if (value === 'url' || value === 'field') {\n setImageActionUrlType(value);\n }\n }}\n inline\n >\n <RadioButton\n label={t('rte_link_url')}\n value='url'\n checked={imageActionUrlType === 'url'}\n />\n <RadioButton\n label={t('rte_link_field')}\n value='field'\n checked={imageActionUrlType === 'field'}\n />\n </RadioButtonGroup>\n )}\n {hasImageCustomSource && imageActionUrlType === 'url' && (\n <Input\n label={t('rte_image_url')}\n value={imageActionUrl}\n info={incorrectActionUrl ? t('rte_invalid_url') : ''}\n status={incorrectActionUrl ? 'error' : undefined}\n onChange={e => {\n const urlInput = e.target.value;\n setImageActionUrl(urlInput);\n if (urlInput === '') {\n setIncorrectActionUrl(false);\n return;\n }\n try {\n const newUrl = new URL(urlInput);\n setIncorrectActionUrl(!['http:', 'https:'].includes(newUrl.protocol));\n } catch {\n setIncorrectActionUrl(true);\n }\n }}\n />\n )}\n {hasImageCustomSource &&\n imageActionUrlType === 'field' &&\n imageCustomSource?.picker}\n </Grid>\n )}\n {selectedAttachmentType === 'link' && (\n <Grid container={{ rowGap: 2 }}>\n <Input\n label={t('rte_image_url')}\n value={url}\n required\n info={incorrectUrl ? t('rte_invalid_url') : ''}\n status={incorrectUrl ? 'error' : undefined}\n onChange={e => {\n const urlInput = e.target.value;\n setUrl(urlInput);\n try {\n const newUrl = new URL(urlInput);\n setIncorrectUrl(!['http:', 'https:'].includes(newUrl.protocol));\n } catch {\n setIncorrectUrl(true);\n }\n }}\n />\n <Input\n label={t('description')}\n value={imageLinkTitle}\n onChange={e => {\n setImageLinkTitle(e.target.value);\n }}\n info={t('rte_image_description_info')}\n />\n {hasImageCustomSource && (\n <RadioButtonGroup\n name='linkImageActionUrlType'\n label={t('rte_image_action_source')}\n onChange={e => {\n const { value } = e.target;\n if (value === 'url' || value === 'field') {\n setLinkImageActionUrlType(value);\n }\n }}\n inline\n >\n <RadioButton\n label={t('rte_link_url')}\n value='url'\n checked={linkImageActionUrlType === 'url'}\n />\n <RadioButton\n label={t('rte_link_field')}\n value='field'\n checked={linkImageActionUrlType === 'field'}\n />\n </RadioButtonGroup>\n )}\n {hasImageCustomSource && linkImageActionUrlType === 'url' && (\n <Input\n label={t('rte_image_url')}\n value={linkImageActionUrl}\n info={incorrectLinkImageActionUrl ? t('rte_invalid_url') : ''}\n status={incorrectLinkImageActionUrl ? 'error' : undefined}\n onChange={e => {\n const urlInput = e.target.value;\n setLinkImageActionUrl(urlInput);\n if (urlInput === '') {\n setIncorrectLinkImageActionUrl(false);\n return;\n }\n try {\n const newUrl = new URL(urlInput);\n setIncorrectLinkImageActionUrl(\n !['http:', 'https:'].includes(newUrl.protocol)\n );\n } catch {\n setIncorrectLinkImageActionUrl(true);\n }\n }}\n />\n )}\n {hasImageCustomSource &&\n linkImageActionUrlType === 'field' &&\n imageCustomSource?.picker}\n </Grid>\n )}\n </Grid>\n </StyledFormDialog>\n </form>\n )}\n </>\n );\n};\n\nexport default ImageButton;\n"]}
|
|
1
|
+
{"version":3,"file":"ImageButton.js","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/ImageButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useState, useRef, useContext, useEffect, useCallback } from 'react';\nimport type { KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\n\nimport {\n createUID,\n FileInput,\n Grid,\n Icon,\n Input,\n RadioButton,\n RadioButtonGroup,\n registerIcon,\n useI18n\n} from '@pega/cosmos-react-core';\nimport type { ForwardProps } from '@pega/cosmos-react-core';\nimport * as pictureIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/picture.icon';\n\nimport ToolbarButton from '../../RichTextEditor/Toolbar/ToolbarButton';\nimport EditorContext from '../Editor.context';\nimport { StyledFormDialog } from '../Editor.styles';\nimport useCloseOnEditorClick from '../hooks/useCloseOnEditorClick';\nimport type { ImageCustomSourceConfig } from '../Editor.types';\n\nregisterIcon(pictureIcon);\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n\nconst ImageButton = ({\n editor,\n imageInsertionMode,\n imageCustomSource,\n ...restProps\n}: {\n editor: TiptapEditor;\n imageInsertionMode: 'file' | 'url' | 'all';\n imageCustomSource?: ImageCustomSourceConfig;\n} & ForwardProps) => {\n const t = useI18n();\n const { addImage } = useContext(EditorContext);\n const [showImageDialog, setShowImageDialog] = useState(false);\n const imagebuttonRef = useRef<HTMLElement>(null);\n const imagepopoverRef = useRef(null);\n const [imageTitle, setImageTitle] = useState('');\n const [imageLinkTitle, setImageLinkTitle] = useState('');\n const [imageActionUrlType, setImageActionUrlType] = useState<'url' | 'field'>('url');\n const [imageActionUrl, setImageActionUrl] = useState('');\n const [incorrectActionUrl, setIncorrectActionUrl] = useState(false);\n const [selectedAttachmentType, setSelectedAttachmentType] = useState(() => {\n if (imageInsertionMode === 'url') {\n return 'link';\n }\n return 'file';\n });\n const [url, setUrl] = useState('');\n const [tempfile, setTempFile] = useState<File>();\n const [incorrectUrl, setIncorrectUrl] = useState(false);\n const [fileEmpty, setFileEmpty] = useState(false);\n const [linkImageActionUrlType, setLinkImageActionUrlType] = useState<'url' | 'field'>('url');\n const [linkImageActionUrl, setLinkImageActionUrl] = useState('');\n const [incorrectLinkImageActionUrl, setIncorrectLinkImageActionUrl] = useState(false);\n const hasImageCustomSource = Boolean(imageCustomSource?.picker && imageCustomSource?.onSubmit);\n const canSubmitCustomSource = imageCustomSource?.canSubmit ?? true;\n\n useEffect(() => {\n if (imageInsertionMode === 'url') {\n setSelectedAttachmentType('link');\n } else {\n setSelectedAttachmentType('file');\n }\n }, [imageInsertionMode]);\n\n const onImageInputChange = (addedFiles: File[]) => {\n setTempFile(addedFiles[0]);\n setFileEmpty(false);\n };\n\n const resetMenu = (reason: 'cancel' | 'apply' = 'cancel') => {\n setUrl('');\n setIncorrectUrl(false);\n setImageLinkTitle('');\n setImageActionUrlType('url');\n setImageActionUrl('');\n setIncorrectActionUrl(false);\n setImageTitle('');\n setTempFile(undefined);\n setSelectedAttachmentType(imageInsertionMode === 'url' ? 'link' : 'file');\n setFileEmpty(false);\n setLinkImageActionUrlType('url');\n setLinkImageActionUrl('');\n setIncorrectLinkImageActionUrl(false);\n imageCustomSource?.onDismissEdit?.(reason);\n setShowImageDialog(false);\n };\n\n // Close dialog when clicking inside the editor iframe\n const handleEditorClick = useCallback(() => {\n if (showImageDialog) {\n resetMenu();\n }\n }, [showImageDialog]);\n useCloseOnEditorClick(showImageDialog, handleEditorClick);\n\n const onImageAddSubmit = () => {\n if (selectedAttachmentType === 'file') {\n if (!tempfile) {\n setFileEmpty(true);\n return;\n }\n if (imageActionUrlType === 'url' && incorrectActionUrl) {\n return;\n }\n // Handle field-based action URL for uploaded images\n if (imageActionUrlType === 'field') {\n if (!imageCustomSource?.onSubmit || !canSubmitCustomSource) {\n return;\n }\n const actionUrl = imageCustomSource.onSubmit(imageTitle);\n addImage(tempfile, undefined, imageTitle, actionUrl);\n resetMenu('apply');\n return;\n }\n // Handle static URL action for uploaded images\n if (imageActionUrlType === 'url' && imageActionUrl && !incorrectActionUrl) {\n // Pass action URL to addImage - consumer will handle wrapping with anchor\n addImage(tempfile, undefined, imageTitle, imageActionUrl);\n resetMenu('apply');\n return;\n }\n // No action URL - just add image\n addImage(tempfile, undefined, imageTitle);\n resetMenu('apply');\n } else if (selectedAttachmentType === 'link') {\n if (!url || incorrectUrl) {\n setIncorrectUrl(true);\n return;\n }\n if (hasImageCustomSource && linkImageActionUrlType === 'url' && incorrectLinkImageActionUrl) {\n return;\n }\n\n const imageUid = createUID();\n let insertHtml = '';\n // Default to empty alt when the user leaves the field blank. The onerror\n // handler below sets t('rte_broken_image') only if the image actually\n // fails to load, so a working image with no alt stays accessible as\n // decorative rather than being announced as an error by screen readers.\n const imageAltText = imageLinkTitle || '';\n\n if (hasImageCustomSource && linkImageActionUrlType === 'field') {\n if (!canSubmitCustomSource) {\n return;\n }\n const fallbackHref = imageCustomSource?.onSubmit\n ? imageCustomSource.onSubmit(imageAltText)\n : undefined;\n const actionUrl = fallbackHref ? escapeHtmlAttribute(fallbackHref) : undefined;\n if (actionUrl) {\n insertHtml = `<a href=\"${actionUrl}\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"${escapeHtmlAttribute(url)}\" data-id=\"${imageUid}\" alt=\"${escapeHtmlAttribute(imageAltText)}\" /></a>`;\n } else {\n insertHtml = `<img src=\"${escapeHtmlAttribute(url)}\" data-id=\"${imageUid}\" alt=\"${escapeHtmlAttribute(imageAltText)}\" />`;\n }\n } else if (\n hasImageCustomSource &&\n linkImageActionUrlType === 'url' &&\n linkImageActionUrl &&\n !incorrectLinkImageActionUrl\n ) {\n const actionUrl = escapeHtmlAttribute(linkImageActionUrl);\n insertHtml = `<a href=\"${actionUrl}\" target=\"_blank\" rel=\"noopener noreferrer\"><img src=\"${escapeHtmlAttribute(url)}\" data-id=\"${imageUid}\" alt=\"${escapeHtmlAttribute(imageAltText)}\" /></a>`;\n } else {\n insertHtml = `<img src=\"${escapeHtmlAttribute(url)}\" data-id=\"${imageUid}\" alt=\"${escapeHtmlAttribute(imageAltText)}\" />`;\n }\n\n editor.chain().focus().insertContent(insertHtml).run();\n\n // Add error handler for broken images if no alt text was provided\n if (!imageLinkTitle) {\n // Use the editor's document to target the correct iframe\n const editorDoc = editor.view.dom.ownerDocument;\n requestAnimationFrame(() => {\n const imageEl = editorDoc.querySelector<HTMLImageElement>(`img[data-id=\"${imageUid}\"]`);\n if (imageEl) {\n imageEl.onerror = () => {\n imageEl.alt = t('rte_broken_image');\n };\n }\n });\n }\n resetMenu('apply');\n }\n };\n\n const onImageAddCancel = () => {\n resetMenu();\n };\n\n return (\n <>\n <ToolbarButton\n ref={imagebuttonRef}\n onClick={() => {\n setShowImageDialog(true);\n }}\n onKeyDown={(e: ReactKeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setShowImageDialog(true);\n }\n }}\n tooltip={t('rte_image')}\n label={t('rte_image')}\n {...restProps}\n >\n <Icon name='picture' />\n </ToolbarButton>\n {showImageDialog && imagebuttonRef.current && (\n <form>\n <StyledFormDialog\n heading={t('rte_add_image')}\n onSubmit={onImageAddSubmit}\n onCancel={onImageAddCancel}\n onDismiss={() => {\n resetMenu();\n }}\n target={imagebuttonRef.current}\n ref={imagepopoverRef}\n >\n <Grid\n container={{\n gap: 2\n }}\n >\n {imageInsertionMode === 'all' && (\n <Grid container={{ rowGap: 2 }}>\n <RadioButtonGroup\n name='chooseListView'\n label={t('rte_image_source')}\n onChange={e => {\n setSelectedAttachmentType(e.target.value);\n }}\n data-testid='chooseListView'\n inline\n required\n >\n <RadioButton\n id='file'\n label={t('rte_image_file')}\n value='file'\n checked={selectedAttachmentType === 'file'}\n />\n <RadioButton\n id='link'\n label={t('rte_image_link')}\n value='link'\n checked={selectedAttachmentType === 'link'}\n />\n </RadioButtonGroup>\n </Grid>\n )}\n {selectedAttachmentType === 'file' && (\n <Grid container={{ rowGap: 2 }}>\n <FileInput\n multiple={false}\n label={t('rte_image_file')}\n onFilesAdded={onImageInputChange}\n required\n accept='image/*'\n info={fileEmpty ? t('rte_empty_image') : ''}\n status={fileEmpty ? 'error' : undefined}\n files={\n tempfile\n ? [\n {\n name: tempfile.name,\n id: createUID(),\n thumbnail: URL.createObjectURL(tempfile),\n onDelete: () => {\n setTempFile(undefined);\n }\n }\n ]\n : []\n }\n />\n <Input\n label={t('description')}\n value={imageTitle}\n onChange={e => {\n setImageTitle(e.target.value);\n }}\n info={t('rte_image_description_info')}\n />\n {hasImageCustomSource && (\n <RadioButtonGroup\n name='imageActionUrlType'\n label={t('rte_image_action_source')}\n onChange={e => {\n const { value } = e.target;\n if (value === 'url' || value === 'field') {\n setImageActionUrlType(value);\n }\n }}\n inline\n >\n <RadioButton\n label={t('rte_link_url')}\n value='url'\n checked={imageActionUrlType === 'url'}\n />\n <RadioButton\n label={t('rte_link_field')}\n value='field'\n checked={imageActionUrlType === 'field'}\n />\n </RadioButtonGroup>\n )}\n {hasImageCustomSource && imageActionUrlType === 'url' && (\n <Input\n label={t('rte_image_url')}\n value={imageActionUrl}\n info={incorrectActionUrl ? t('rte_invalid_url') : ''}\n status={incorrectActionUrl ? 'error' : undefined}\n onChange={e => {\n const urlInput = e.target.value;\n setImageActionUrl(urlInput);\n if (urlInput === '') {\n setIncorrectActionUrl(false);\n return;\n }\n try {\n const newUrl = new URL(urlInput);\n setIncorrectActionUrl(!['http:', 'https:'].includes(newUrl.protocol));\n } catch {\n setIncorrectActionUrl(true);\n }\n }}\n />\n )}\n {hasImageCustomSource &&\n imageActionUrlType === 'field' &&\n imageCustomSource?.picker}\n </Grid>\n )}\n {selectedAttachmentType === 'link' && (\n <Grid container={{ rowGap: 2 }}>\n <Input\n label={t('rte_image_url')}\n value={url}\n required\n info={incorrectUrl ? t('rte_invalid_url') : ''}\n status={incorrectUrl ? 'error' : undefined}\n onChange={e => {\n const urlInput = e.target.value;\n setUrl(urlInput);\n try {\n const newUrl = new URL(urlInput);\n setIncorrectUrl(!['http:', 'https:'].includes(newUrl.protocol));\n } catch {\n setIncorrectUrl(true);\n }\n }}\n />\n <Input\n label={t('description')}\n value={imageLinkTitle}\n onChange={e => {\n setImageLinkTitle(e.target.value);\n }}\n info={t('rte_image_description_info')}\n />\n {hasImageCustomSource && (\n <RadioButtonGroup\n name='linkImageActionUrlType'\n label={t('rte_image_action_source')}\n onChange={e => {\n const { value } = e.target;\n if (value === 'url' || value === 'field') {\n setLinkImageActionUrlType(value);\n }\n }}\n inline\n >\n <RadioButton\n label={t('rte_link_url')}\n value='url'\n checked={linkImageActionUrlType === 'url'}\n />\n <RadioButton\n label={t('rte_link_field')}\n value='field'\n checked={linkImageActionUrlType === 'field'}\n />\n </RadioButtonGroup>\n )}\n {hasImageCustomSource && linkImageActionUrlType === 'url' && (\n <Input\n label={t('rte_image_url')}\n value={linkImageActionUrl}\n info={incorrectLinkImageActionUrl ? t('rte_invalid_url') : ''}\n status={incorrectLinkImageActionUrl ? 'error' : undefined}\n onChange={e => {\n const urlInput = e.target.value;\n setLinkImageActionUrl(urlInput);\n if (urlInput === '') {\n setIncorrectLinkImageActionUrl(false);\n return;\n }\n try {\n const newUrl = new URL(urlInput);\n setIncorrectLinkImageActionUrl(\n !['http:', 'https:'].includes(newUrl.protocol)\n );\n } catch {\n setIncorrectLinkImageActionUrl(true);\n }\n }}\n />\n )}\n {hasImageCustomSource &&\n linkImageActionUrlType === 'field' &&\n imageCustomSource?.picker}\n </Grid>\n )}\n </Grid>\n </StyledFormDialog>\n </form>\n )}\n </>\n );\n};\n\nexport default ImageButton;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pega/cosmos-react-rte",
|
|
3
|
-
"version": "10.0.0-build.
|
|
3
|
+
"version": "10.0.0-build.8.0",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"author": "Pegasystems",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@intevation/tiptap-extension-office-paste": "^0.1.2",
|
|
18
|
-
"@pega/cosmos-react-core": "10.0.0-build.
|
|
18
|
+
"@pega/cosmos-react-core": "10.0.0-build.8.0",
|
|
19
19
|
"@popperjs/core": "^2.11.6",
|
|
20
20
|
"@tiptap/core": "^3.12.1",
|
|
21
21
|
"@tiptap/extension-blockquote": "^3.12.1",
|