@pega/cosmos-react-rte 10.0.0-build.5.9 → 10.0.0-build.7.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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnchorButton.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/AnchorButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAsB3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAK5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAyB9D,UAAU,iBAAiB;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;CAC3C;AAED,QAAA,MAAM,YAAY,GAAI,iDAKnB,iBAAiB,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"AnchorButton.d.ts","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/AnchorButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,cAAc,CAAC;AAsB3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAK5D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAyB9D,UAAU,iBAAiB;IACzB,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;IACrB,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;CAC3C;AAED,QAAA,MAAM,YAAY,GAAI,iDAKnB,iBAAiB,GAAG,YAAY,4CAuelC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -165,6 +165,20 @@ const AnchorButton = ({ osx, editor, linkCustomSource, ...restProps }) => {
|
|
|
165
165
|
}
|
|
166
166
|
resetMenu('apply');
|
|
167
167
|
}, [url, linkText, editor, resetMenu]);
|
|
168
|
+
const canSubmit = linkSourceType === 'url'
|
|
169
|
+
? Boolean(url.trim()) && urlMatch
|
|
170
|
+
: Boolean(linkCustomSource?.onSubmit) && canSubmitCustomSource;
|
|
171
|
+
const applyLink = useCallback(() => {
|
|
172
|
+
if (!canSubmit) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (linkSourceType === 'url') {
|
|
176
|
+
createLink();
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
linkCustomSource?.onSubmit?.(linkText);
|
|
180
|
+
resetMenu('apply');
|
|
181
|
+
}, [canSubmit, createLink, linkCustomSource, linkSourceType, linkText, resetMenu]);
|
|
168
182
|
useEffect(() => {
|
|
169
183
|
const isOpening = anchorMenu && !wasAnchorMenuVisibleRef.current;
|
|
170
184
|
wasAnchorMenuVisibleRef.current = anchorMenu;
|
|
@@ -275,23 +289,34 @@ const AnchorButton = ({ osx, editor, linkCustomSource, ...restProps }) => {
|
|
|
275
289
|
iframeWindow?.addEventListener('keydown', handleCtrlK);
|
|
276
290
|
return () => iframeWindow?.removeEventListener('keydown', handleCtrlK);
|
|
277
291
|
}, [editor]);
|
|
278
|
-
// Escape to close
|
|
292
|
+
// Escape to close / Enter to submit - listen on both iframe and parent document
|
|
279
293
|
// since focus may be in either location depending on how the popover was opened
|
|
280
294
|
useEffect(() => {
|
|
281
|
-
const
|
|
295
|
+
const handleKeyboardShortcut = (e) => {
|
|
282
296
|
if (e.key === 'Escape' && anchorMenu) {
|
|
283
297
|
e.preventDefault();
|
|
284
298
|
cancelAnchorCreation();
|
|
285
299
|
}
|
|
300
|
+
else if (e.key === 'Enter' &&
|
|
301
|
+
anchorMenu &&
|
|
302
|
+
canSubmit &&
|
|
303
|
+
(e.target === textInputEl || e.target === urlInputEl)) {
|
|
304
|
+
e.preventDefault();
|
|
305
|
+
applyLink();
|
|
306
|
+
}
|
|
286
307
|
};
|
|
287
308
|
const iframeWindow = editor.view.dom.ownerDocument.defaultView;
|
|
288
|
-
iframeWindow?.addEventListener('keydown',
|
|
289
|
-
|
|
309
|
+
iframeWindow?.addEventListener('keydown', handleKeyboardShortcut);
|
|
310
|
+
if (iframeWindow !== window) {
|
|
311
|
+
document.addEventListener('keydown', handleKeyboardShortcut);
|
|
312
|
+
}
|
|
290
313
|
return () => {
|
|
291
|
-
iframeWindow?.removeEventListener('keydown',
|
|
292
|
-
|
|
314
|
+
iframeWindow?.removeEventListener('keydown', handleKeyboardShortcut);
|
|
315
|
+
if (iframeWindow !== window) {
|
|
316
|
+
document.removeEventListener('keydown', handleKeyboardShortcut);
|
|
317
|
+
}
|
|
293
318
|
};
|
|
294
|
-
}, [editor, anchorMenu, cancelAnchorCreation]);
|
|
319
|
+
}, [editor, anchorMenu, canSubmit, applyLink, cancelAnchorCreation, textInputEl, urlInputEl]);
|
|
295
320
|
useEscape(cancelAnchorCreation, popoverEl);
|
|
296
321
|
useLayoutEffect(() => {
|
|
297
322
|
if (shouldFocusInput) {
|
|
@@ -307,7 +332,7 @@ const AnchorButton = ({ osx, editor, linkCustomSource, ...restProps }) => {
|
|
|
307
332
|
useEffect(() => {
|
|
308
333
|
// These events must be added here so they run before the native event in useArrows (used in the toolbar).
|
|
309
334
|
const onKeyDown = (e) => {
|
|
310
|
-
if (e.key !== 'Escape') {
|
|
335
|
+
if (e.key !== 'Escape' && e.key !== 'Enter') {
|
|
311
336
|
e.stopPropagation();
|
|
312
337
|
}
|
|
313
338
|
};
|
|
@@ -318,19 +343,9 @@ const AnchorButton = ({ osx, editor, linkCustomSource, ...restProps }) => {
|
|
|
318
343
|
urlInputEl?.removeEventListener('keydown', onKeyDown);
|
|
319
344
|
};
|
|
320
345
|
}, [textInputEl, urlInputEl]);
|
|
321
|
-
const linkFormContent = (_jsx(Form, { as: 'div', actions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: 'secondary', onClick: cancelAnchorCreation, type: 'button', children: t('cancel') }), _jsx(Button, { variant: 'primary', disabled:
|
|
322
|
-
? !url.trim() || !urlMatch
|
|
323
|
-
: !linkCustomSource?.onSubmit || !canSubmitCustomSource, onClick: (e) => {
|
|
346
|
+
const linkFormContent = (_jsx(Form, { as: 'div', actions: _jsxs(_Fragment, { children: [_jsx(Button, { variant: 'secondary', onClick: cancelAnchorCreation, type: 'button', children: t('cancel') }), _jsx(Button, { variant: 'primary', disabled: !canSubmit, onClick: (e) => {
|
|
324
347
|
e.preventDefault();
|
|
325
|
-
|
|
326
|
-
createLink();
|
|
327
|
-
return;
|
|
328
|
-
}
|
|
329
|
-
if (!linkCustomSource?.onSubmit) {
|
|
330
|
-
return;
|
|
331
|
-
}
|
|
332
|
-
linkCustomSource.onSubmit(linkText);
|
|
333
|
-
resetMenu('apply');
|
|
348
|
+
applyLink();
|
|
334
349
|
}, children: t('apply') })] }), children: _jsxs(Grid, { container: { rowGap: 2 }, children: [_jsx(Input, { label: t('rte_link_text'), value: linkText, onClick: preventDef, onChange: (e) => setLinkText(e.target.value), ref: setTextInputEl }), hasFieldLinkMode && (_jsxs(RadioButtonGroup, { name: 'linkSourceType', label: t('rte_link_source'), onChange: e => {
|
|
335
350
|
const { value } = e.target;
|
|
336
351
|
if (value === 'url' || value === 'field') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnchorButton.js","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/AnchorButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useRef, useState, useEffect, useLayoutEffect, useCallback } from 'react';\nimport type { ChangeEvent, MouseEvent, KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\nimport styled from 'styled-components';\n\nimport {\n Button,\n CardContent,\n Grid,\n Icon,\n registerIcon,\n Input,\n RadioButton,\n RadioButtonGroup,\n useOuterEvent,\n Form,\n useI18n,\n Text,\n useElement,\n useEscape,\n TouchDialog,\n isTouchDevice,\n defaultThemeProp\n} from '@pega/cosmos-react-core';\nimport type { ForwardProps } from '@pega/cosmos-react-core';\nimport * as chainIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/chain.icon';\n\nimport ToolbarButton from '../../RichTextEditor/Toolbar/ToolbarButton';\nimport { getKeyCommand } from '../../RichTextEditor/Toolbar/utils';\nimport type { LinkCustomSourceConfig } from '../Editor.types';\nimport { StyledEditPopover } from '../Editor.styles';\nimport useCloseOnEditorClick from '../hooks/useCloseOnEditorClick';\n\nregisterIcon(chainIcon);\n\nconst StyledTouchDialogContent = styled(CardContent)(\n ({ theme }) => `\n flex: 1;\n\n > div {\n display: flex;\n flex-direction: column;\n min-height: 100%;\n }\n\n > div > div:not([aria-hidden='true']):nth-last-child(2) {\n margin-top: auto;\n padding-block-end: ${theme.base.spacing};\n }\n`\n);\n\nStyledTouchDialogContent.defaultProps = defaultThemeProp;\n\ninterface AnchorButtonProps {\n osx: boolean;\n editor: TiptapEditor;\n linkCustomSource?: LinkCustomSourceConfig;\n}\n\nconst AnchorButton = ({\n osx,\n editor,\n linkCustomSource,\n ...restProps\n}: AnchorButtonProps & ForwardProps) => {\n const t = useI18n();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const touchDialogRef = useRef<HTMLDivElement>(null);\n const [textInputEl, setTextInputEl] = useElement<HTMLInputElement>();\n const [urlInputEl, setUrlInputEl] = useElement<HTMLInputElement>();\n const [popoverEl, setPopoverEl] = useElement<HTMLDivElement>();\n const [linkText, setLinkText] = useState('');\n const [url, setUrl] = useState('');\n const [urlMatch, setUrlMatch] = useState(true);\n const [anchorMenu, setAnchorMenu] = useState(false);\n const [shouldFocusInput, setShouldFocusInput] = useState(false);\n const [linkSourceType, setLinkSourceType] = useState<'url' | 'field'>('url');\n const hasFieldLinkMode = Boolean(linkCustomSource?.picker && linkCustomSource?.onSubmit);\n const canSubmitCustomSource = linkCustomSource?.canSubmit ?? true;\n const wasAnchorMenuVisibleRef = useRef(false);\n // Store the original selection range when menu opens so we can restore it when creating the link\n const originalSelectionRef = useRef<{ from: number; to: number } | null>(null);\n // Track whether the popover was opened via linkCustomSource.edit\n const openedViaEditCustomSourceRef = useRef(false);\n // Track whether popover was initialized from an existing field link (selection-based edit path)\n const initializedFromExistingFieldLinkRef = useRef(false);\n const tooltip = getKeyCommand(osx, ({ ctrl }) => `${t('rte_link')} (${ctrl}K)`);\n\n const parseCustomSourceFromHref = useCallback((href: string) => {\n const decodedHref = href\n .replaceAll('"', '\"')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('&', '&');\n if (!decodedHref.includes('<pega-reference')) {\n return null;\n }\n\n const idMatch = /data-rule-id=[\"']([^\"']+)[\"']/i.exec(decodedHref);\n if (!idMatch) {\n return null;\n }\n\n const namespaceMatch = /data-rule-namespace=[\"']([^\"']+)[\"']/i.exec(decodedHref);\n return {\n id: idMatch[1],\n namespace: namespaceMatch?.[1]\n };\n }, []);\n\n const openMenu = (opts: { focusInput?: boolean } = {}) => {\n // Save the original selection before opening the menu\n const { from, to } = editor.state.selection;\n originalSelectionRef.current = { from, to };\n initializedFromExistingFieldLinkRef.current = false;\n setAnchorMenu(true);\n if (opts.focusInput) {\n setShouldFocusInput(true);\n }\n };\n\n const resetMenu = useCallback(\n (dismissReason: 'cancel' | 'apply' = 'cancel') => {\n setLinkText('');\n setUrl('');\n setUrlMatch(true);\n setAnchorMenu(false);\n setLinkSourceType('url');\n originalSelectionRef.current = null;\n initializedFromExistingFieldLinkRef.current = false;\n if (openedViaEditCustomSourceRef.current) {\n openedViaEditCustomSourceRef.current = false;\n linkCustomSource?.onDismissEdit?.(dismissReason);\n }\n },\n [linkCustomSource]\n );\n\n useOuterEvent('mousedown', [popoverEl, buttonRef, touchDialogRef], () => {\n if (anchorMenu) {\n resetMenu();\n }\n });\n\n // Close menu when clicking inside the editor iframe\n const handleEditorClick = useCallback(() => {\n if (anchorMenu) {\n resetMenu();\n }\n }, [anchorMenu, resetMenu]);\n useCloseOnEditorClick(anchorMenu, handleEditorClick);\n\n const isValidUrl = (urlString: string): boolean => {\n if (!urlString.trim()) return false;\n const allowedProtocols = /^(https?|mailto|tel):/i;\n const hasProtocol = /^[a-z][a-z0-9.+-]*:/i.test(urlString);\n\n try {\n const testUrl = hasProtocol ? urlString : `https://${urlString}`;\n if (hasProtocol && !allowedProtocols.test(urlString)) {\n return false;\n }\n const urlObj = new URL(testUrl);\n return URL.canParse?.(testUrl) ?? Boolean(urlObj.href);\n } catch {\n return false;\n }\n };\n\n const createLink = useCallback(() => {\n if (!url || !isValidUrl(url)) {\n return;\n }\n\n // Only allow safe protocols to prevent XSS (e.g., javascript: URLs)\n const allowedProtocols = /^(https?|mailto|tel):/i;\n const hasProtocol = /^[a-z][a-z0-9.+-]*:/i.test(url);\n\n let normalizedUrl: string;\n if (hasProtocol) {\n // Reject URLs with disallowed protocols\n if (!allowedProtocols.test(url)) {\n return;\n }\n normalizedUrl = url;\n } else {\n normalizedUrl = `https://${url}`;\n }\n\n // Use the original selection to determine if text was selected in the editor\n const originalSelection = originalSelectionRef.current;\n\n if (originalSelection && originalSelection.from !== originalSelection.to) {\n // Text was originally selected - restore selection and apply link\n // Then collapse selection to end and clear stored mark so subsequent typing isn't linked\n editor\n .chain()\n .focus()\n .setTextSelection({ from: originalSelection.from, to: originalSelection.to })\n .setLink({ href: normalizedUrl })\n .setTextSelection(originalSelection.to)\n .unsetMark('link')\n .run();\n } else if (linkText) {\n // No text was originally selected, insert new link with the text entered in modal\n editor\n .chain()\n .focus()\n .insertContent({\n type: 'text',\n text: linkText,\n marks: [{ type: 'link', attrs: { href: normalizedUrl } }]\n })\n .unsetMark('link')\n .insertContent(' ')\n .run();\n }\n resetMenu('apply');\n }, [url, linkText, editor, resetMenu]);\n\n useEffect(() => {\n const isOpening = anchorMenu && !wasAnchorMenuVisibleRef.current;\n wasAnchorMenuVisibleRef.current = anchorMenu;\n\n if (isOpening && originalSelectionRef.current) {\n // Use the stored original selection to populate the modal\n // This avoids issues where focus shift may collapse the editor selection\n const { from, to } = originalSelectionRef.current;\n const text = editor.state.doc.textBetween(from, to);\n const linkMark = editor.getAttributes('link');\n\n if (linkMark.href) {\n // Check if href contains a pega-reference (escaped or unescaped)\n const isPegaReference =\n linkMark.href.includes('<pega-reference') || linkMark.href.includes('<pega-reference');\n if (isPegaReference) {\n const customSourceValue = parseCustomSourceFromHref(linkMark.href);\n if (customSourceValue) {\n initializedFromExistingFieldLinkRef.current = true;\n linkCustomSource?.onEditSelectionChange?.({\n id: customSourceValue.id,\n text: text || '',\n namespace: customSourceValue.namespace\n });\n } else {\n initializedFromExistingFieldLinkRef.current = false;\n linkCustomSource?.onEditSelectionChange?.({ id: '', text: '', namespace: undefined });\n }\n // Don't populate URL field with pega-reference - leave it empty\n // The field picker will handle field links\n if (hasFieldLinkMode) {\n setLinkSourceType('field');\n }\n setLinkText(text || '');\n } else {\n initializedFromExistingFieldLinkRef.current = false;\n linkCustomSource?.onEditSelectionChange?.({ id: '', text: '', namespace: undefined });\n setLinkSourceType('url');\n setUrl(linkMark.href);\n setLinkText(text || '');\n }\n } else {\n initializedFromExistingFieldLinkRef.current = false;\n linkCustomSource?.onEditSelectionChange?.({ id: '', text: '', namespace: undefined });\n setLinkSourceType('url');\n setLinkText(text || '');\n }\n } else if (!anchorMenu) {\n resetMenu();\n }\n }, [\n anchorMenu,\n editor,\n hasFieldLinkMode,\n linkCustomSource,\n parseCustomSourceFromHref,\n resetMenu\n ]);\n\n useEffect(() => {\n if (linkCustomSource?.edit && hasFieldLinkMode) {\n openedViaEditCustomSourceRef.current = true;\n initializedFromExistingFieldLinkRef.current = true;\n setLinkText(linkCustomSource.edit.text);\n setLinkSourceType('field');\n setAnchorMenu(true);\n }\n }, [linkCustomSource, hasFieldLinkMode]);\n\n const preventDef = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const isLinkActive = () => {\n return editor.isActive('link') && editor.isFocused;\n };\n\n const cancelAnchorCreation = useCallback(\n (event?: KeyboardEvent | MouseEvent) => {\n if (\n ((event && 'key' in event && event.key === 'Escape') ||\n event?.type === 'click' ||\n !event) &&\n anchorMenu\n ) {\n if (event && 'key' in event && event.key === 'Escape') {\n event.stopPropagation();\n }\n const originalSelection = originalSelectionRef.current;\n\n resetMenu();\n if (originalSelection) {\n // Refocus the original active selection in the editor\n editor\n .chain()\n .focus()\n .setTextSelection({ from: originalSelection.from, to: originalSelection.to })\n .run();\n } else {\n buttonRef.current?.focus();\n }\n }\n },\n [anchorMenu, editor, resetMenu]\n );\n\n // Ctrl+K shortcut to open link dialog from within the editor iframe\n useEffect(() => {\n const handleCtrlK = (e: KeyboardEvent) => {\n if (e.key === 'k' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n openMenu({ focusInput: true });\n }\n };\n\n const iframeWindow = editor.view.dom.ownerDocument.defaultView;\n iframeWindow?.addEventListener('keydown', handleCtrlK);\n return () => iframeWindow?.removeEventListener('keydown', handleCtrlK);\n }, [editor]);\n\n // Escape to close popover - listen on both iframe and parent document\n // since focus may be in either location depending on how the popover was opened\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && anchorMenu) {\n e.preventDefault();\n cancelAnchorCreation();\n }\n };\n const iframeWindow = editor.view.dom.ownerDocument.defaultView;\n iframeWindow?.addEventListener('keydown', handleEscape);\n document.addEventListener('keydown', handleEscape);\n return () => {\n iframeWindow?.removeEventListener('keydown', handleEscape);\n document.removeEventListener('keydown', handleEscape);\n };\n }, [editor, anchorMenu, cancelAnchorCreation]);\n\n useEscape(cancelAnchorCreation, popoverEl);\n\n useLayoutEffect(() => {\n if (shouldFocusInput) {\n const originalSelection = originalSelectionRef.current;\n const hasActiveSelection =\n originalSelection && originalSelection.from !== originalSelection.to;\n const inputToFocus = hasActiveSelection ? urlInputEl : textInputEl;\n if (inputToFocus) {\n inputToFocus.focus();\n setShouldFocusInput(false);\n }\n }\n }, [textInputEl, urlInputEl, shouldFocusInput]);\n\n useEffect(() => {\n // These events must be added here so they run before the native event in useArrows (used in the toolbar).\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') {\n e.stopPropagation();\n }\n };\n textInputEl?.addEventListener('keydown', onKeyDown);\n urlInputEl?.addEventListener('keydown', onKeyDown);\n return () => {\n textInputEl?.removeEventListener('keydown', onKeyDown);\n urlInputEl?.removeEventListener('keydown', onKeyDown);\n };\n }, [textInputEl, urlInputEl]);\n\n const linkFormContent = (\n <Form\n as='div'\n actions={\n <>\n <Button variant='secondary' onClick={cancelAnchorCreation} type='button'>\n {t('cancel')}\n </Button>\n <Button\n variant='primary'\n disabled={\n linkSourceType === 'url'\n ? !url.trim() || !urlMatch\n : !linkCustomSource?.onSubmit || !canSubmitCustomSource\n }\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n if (linkSourceType === 'url') {\n createLink();\n return;\n }\n if (!linkCustomSource?.onSubmit) {\n return;\n }\n linkCustomSource.onSubmit(linkText);\n resetMenu('apply');\n }}\n >\n {t('apply')}\n </Button>\n </>\n }\n >\n <Grid container={{ rowGap: 2 }}>\n <Input\n label={t('rte_link_text')}\n value={linkText}\n onClick={preventDef}\n onChange={(e: ChangeEvent<HTMLInputElement>) => setLinkText(e.target.value)}\n ref={setTextInputEl}\n />\n {hasFieldLinkMode && (\n <RadioButtonGroup\n name='linkSourceType'\n label={t('rte_link_source')}\n onChange={e => {\n const { value } = e.target;\n if (value === 'url' || value === 'field') {\n setLinkSourceType(value);\n if (\n value === 'field' &&\n !openedViaEditCustomSourceRef.current &&\n !initializedFromExistingFieldLinkRef.current\n ) {\n linkCustomSource?.onEditSelectionChange?.({\n id: '',\n text: '',\n namespace: undefined\n });\n }\n }\n }}\n inline\n >\n <RadioButton label={t('rte_link_url')} value='url' checked={linkSourceType === 'url'} />\n <RadioButton\n label={t('rte_link_field')}\n value='field'\n checked={linkSourceType === 'field'}\n />\n </RadioButtonGroup>\n )}\n {linkSourceType === 'url' ? (\n <Input\n label={t('rte_link_url')}\n value={url}\n onClick={preventDef}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n const urlInput = e.target.value;\n setUrl(urlInput);\n if (!urlMatch) {\n setUrlMatch(true);\n }\n }}\n onBlur={() => {\n setUrlMatch(!url || isValidUrl(url));\n }}\n info={url && !urlMatch ? t('rte_invalid_url') : ''}\n status={url && !urlMatch ? 'error' : undefined}\n ref={setUrlInputEl}\n />\n ) : (\n linkCustomSource?.picker\n )}\n </Grid>\n </Form>\n );\n\n return (\n <>\n <ToolbarButton\n ref={buttonRef}\n onMouseDown={e => {\n e.preventDefault();\n openMenu();\n }}\n onKeyDown={(e: ReactKeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openMenu({ focusInput: true });\n }\n }}\n active={isLinkActive()}\n tooltip={tooltip}\n label={t('rte_link')}\n {...restProps}\n >\n <Icon name='chain' />\n </ToolbarButton>\n {isTouchDevice ? (\n <TouchDialog\n ref={touchDialogRef}\n open={anchorMenu}\n heading={t('rte_add_link')}\n onDismiss={() => cancelAnchorCreation()}\n >\n <StyledTouchDialogContent>{linkFormContent}</StyledTouchDialogContent>\n </TouchDialog>\n ) : (\n <StyledEditPopover\n show={anchorMenu}\n target={buttonRef.current}\n ref={setPopoverEl}\n placement='bottom'\n >\n <CardContent>\n <Text variant='h2'>{t('rte_add_link')}</Text>\n {linkFormContent}\n </CardContent>\n </StyledEditPopover>\n )}\n </>\n );\n};\n\nexport default AnchorButton;\n"]}
|
|
1
|
+
{"version":3,"file":"AnchorButton.js","sourceRoot":"","sources":["../../../../src/components/Editor/Toolbar/AnchorButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useRef, useState, useEffect, useLayoutEffect, useCallback } from 'react';\nimport type { ChangeEvent, MouseEvent, KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport type { Editor as TiptapEditor } from '@tiptap/core';\nimport styled from 'styled-components';\n\nimport {\n Button,\n CardContent,\n Grid,\n Icon,\n registerIcon,\n Input,\n RadioButton,\n RadioButtonGroup,\n useOuterEvent,\n Form,\n useI18n,\n Text,\n useElement,\n useEscape,\n TouchDialog,\n isTouchDevice,\n defaultThemeProp\n} from '@pega/cosmos-react-core';\nimport type { ForwardProps } from '@pega/cosmos-react-core';\nimport * as chainIcon from '@pega/cosmos-react-core/lib/components/Icon/icons/chain.icon';\n\nimport ToolbarButton from '../../RichTextEditor/Toolbar/ToolbarButton';\nimport { getKeyCommand } from '../../RichTextEditor/Toolbar/utils';\nimport type { LinkCustomSourceConfig } from '../Editor.types';\nimport { StyledEditPopover } from '../Editor.styles';\nimport useCloseOnEditorClick from '../hooks/useCloseOnEditorClick';\n\nregisterIcon(chainIcon);\n\nconst StyledTouchDialogContent = styled(CardContent)(\n ({ theme }) => `\n flex: 1;\n\n > div {\n display: flex;\n flex-direction: column;\n min-height: 100%;\n }\n\n > div > div:not([aria-hidden='true']):nth-last-child(2) {\n margin-top: auto;\n padding-block-end: ${theme.base.spacing};\n }\n`\n);\n\nStyledTouchDialogContent.defaultProps = defaultThemeProp;\n\ninterface AnchorButtonProps {\n osx: boolean;\n editor: TiptapEditor;\n linkCustomSource?: LinkCustomSourceConfig;\n}\n\nconst AnchorButton = ({\n osx,\n editor,\n linkCustomSource,\n ...restProps\n}: AnchorButtonProps & ForwardProps) => {\n const t = useI18n();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const touchDialogRef = useRef<HTMLDivElement>(null);\n const [textInputEl, setTextInputEl] = useElement<HTMLInputElement>();\n const [urlInputEl, setUrlInputEl] = useElement<HTMLInputElement>();\n const [popoverEl, setPopoverEl] = useElement<HTMLDivElement>();\n const [linkText, setLinkText] = useState('');\n const [url, setUrl] = useState('');\n const [urlMatch, setUrlMatch] = useState(true);\n const [anchorMenu, setAnchorMenu] = useState(false);\n const [shouldFocusInput, setShouldFocusInput] = useState(false);\n const [linkSourceType, setLinkSourceType] = useState<'url' | 'field'>('url');\n const hasFieldLinkMode = Boolean(linkCustomSource?.picker && linkCustomSource?.onSubmit);\n const canSubmitCustomSource = linkCustomSource?.canSubmit ?? true;\n const wasAnchorMenuVisibleRef = useRef(false);\n // Store the original selection range when menu opens so we can restore it when creating the link\n const originalSelectionRef = useRef<{ from: number; to: number } | null>(null);\n // Track whether the popover was opened via linkCustomSource.edit\n const openedViaEditCustomSourceRef = useRef(false);\n // Track whether popover was initialized from an existing field link (selection-based edit path)\n const initializedFromExistingFieldLinkRef = useRef(false);\n const tooltip = getKeyCommand(osx, ({ ctrl }) => `${t('rte_link')} (${ctrl}K)`);\n\n const parseCustomSourceFromHref = useCallback((href: string) => {\n const decodedHref = href\n .replaceAll('"', '\"')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('&', '&');\n if (!decodedHref.includes('<pega-reference')) {\n return null;\n }\n\n const idMatch = /data-rule-id=[\"']([^\"']+)[\"']/i.exec(decodedHref);\n if (!idMatch) {\n return null;\n }\n\n const namespaceMatch = /data-rule-namespace=[\"']([^\"']+)[\"']/i.exec(decodedHref);\n return {\n id: idMatch[1],\n namespace: namespaceMatch?.[1]\n };\n }, []);\n\n const openMenu = (opts: { focusInput?: boolean } = {}) => {\n // Save the original selection before opening the menu\n const { from, to } = editor.state.selection;\n originalSelectionRef.current = { from, to };\n initializedFromExistingFieldLinkRef.current = false;\n setAnchorMenu(true);\n if (opts.focusInput) {\n setShouldFocusInput(true);\n }\n };\n\n const resetMenu = useCallback(\n (dismissReason: 'cancel' | 'apply' = 'cancel') => {\n setLinkText('');\n setUrl('');\n setUrlMatch(true);\n setAnchorMenu(false);\n setLinkSourceType('url');\n originalSelectionRef.current = null;\n initializedFromExistingFieldLinkRef.current = false;\n if (openedViaEditCustomSourceRef.current) {\n openedViaEditCustomSourceRef.current = false;\n linkCustomSource?.onDismissEdit?.(dismissReason);\n }\n },\n [linkCustomSource]\n );\n\n useOuterEvent('mousedown', [popoverEl, buttonRef, touchDialogRef], () => {\n if (anchorMenu) {\n resetMenu();\n }\n });\n\n // Close menu when clicking inside the editor iframe\n const handleEditorClick = useCallback(() => {\n if (anchorMenu) {\n resetMenu();\n }\n }, [anchorMenu, resetMenu]);\n useCloseOnEditorClick(anchorMenu, handleEditorClick);\n\n const isValidUrl = (urlString: string): boolean => {\n if (!urlString.trim()) return false;\n const allowedProtocols = /^(https?|mailto|tel):/i;\n const hasProtocol = /^[a-z][a-z0-9.+-]*:/i.test(urlString);\n\n try {\n const testUrl = hasProtocol ? urlString : `https://${urlString}`;\n if (hasProtocol && !allowedProtocols.test(urlString)) {\n return false;\n }\n const urlObj = new URL(testUrl);\n return URL.canParse?.(testUrl) ?? Boolean(urlObj.href);\n } catch {\n return false;\n }\n };\n\n const createLink = useCallback(() => {\n if (!url || !isValidUrl(url)) {\n return;\n }\n\n // Only allow safe protocols to prevent XSS (e.g., javascript: URLs)\n const allowedProtocols = /^(https?|mailto|tel):/i;\n const hasProtocol = /^[a-z][a-z0-9.+-]*:/i.test(url);\n\n let normalizedUrl: string;\n if (hasProtocol) {\n // Reject URLs with disallowed protocols\n if (!allowedProtocols.test(url)) {\n return;\n }\n normalizedUrl = url;\n } else {\n normalizedUrl = `https://${url}`;\n }\n\n // Use the original selection to determine if text was selected in the editor\n const originalSelection = originalSelectionRef.current;\n\n if (originalSelection && originalSelection.from !== originalSelection.to) {\n // Text was originally selected - restore selection and apply link\n // Then collapse selection to end and clear stored mark so subsequent typing isn't linked\n editor\n .chain()\n .focus()\n .setTextSelection({ from: originalSelection.from, to: originalSelection.to })\n .setLink({ href: normalizedUrl })\n .setTextSelection(originalSelection.to)\n .unsetMark('link')\n .run();\n } else if (linkText) {\n // No text was originally selected, insert new link with the text entered in modal\n editor\n .chain()\n .focus()\n .insertContent({\n type: 'text',\n text: linkText,\n marks: [{ type: 'link', attrs: { href: normalizedUrl } }]\n })\n .unsetMark('link')\n .insertContent(' ')\n .run();\n }\n resetMenu('apply');\n }, [url, linkText, editor, resetMenu]);\n\n const canSubmit =\n linkSourceType === 'url'\n ? Boolean(url.trim()) && urlMatch\n : Boolean(linkCustomSource?.onSubmit) && canSubmitCustomSource;\n\n const applyLink = useCallback(() => {\n if (!canSubmit) {\n return;\n }\n\n if (linkSourceType === 'url') {\n createLink();\n return;\n }\n\n linkCustomSource?.onSubmit?.(linkText);\n resetMenu('apply');\n }, [canSubmit, createLink, linkCustomSource, linkSourceType, linkText, resetMenu]);\n\n useEffect(() => {\n const isOpening = anchorMenu && !wasAnchorMenuVisibleRef.current;\n wasAnchorMenuVisibleRef.current = anchorMenu;\n\n if (isOpening && originalSelectionRef.current) {\n // Use the stored original selection to populate the modal\n // This avoids issues where focus shift may collapse the editor selection\n const { from, to } = originalSelectionRef.current;\n const text = editor.state.doc.textBetween(from, to);\n const linkMark = editor.getAttributes('link');\n\n if (linkMark.href) {\n // Check if href contains a pega-reference (escaped or unescaped)\n const isPegaReference =\n linkMark.href.includes('<pega-reference') || linkMark.href.includes('<pega-reference');\n if (isPegaReference) {\n const customSourceValue = parseCustomSourceFromHref(linkMark.href);\n if (customSourceValue) {\n initializedFromExistingFieldLinkRef.current = true;\n linkCustomSource?.onEditSelectionChange?.({\n id: customSourceValue.id,\n text: text || '',\n namespace: customSourceValue.namespace\n });\n } else {\n initializedFromExistingFieldLinkRef.current = false;\n linkCustomSource?.onEditSelectionChange?.({ id: '', text: '', namespace: undefined });\n }\n // Don't populate URL field with pega-reference - leave it empty\n // The field picker will handle field links\n if (hasFieldLinkMode) {\n setLinkSourceType('field');\n }\n setLinkText(text || '');\n } else {\n initializedFromExistingFieldLinkRef.current = false;\n linkCustomSource?.onEditSelectionChange?.({ id: '', text: '', namespace: undefined });\n setLinkSourceType('url');\n setUrl(linkMark.href);\n setLinkText(text || '');\n }\n } else {\n initializedFromExistingFieldLinkRef.current = false;\n linkCustomSource?.onEditSelectionChange?.({ id: '', text: '', namespace: undefined });\n setLinkSourceType('url');\n setLinkText(text || '');\n }\n } else if (!anchorMenu) {\n resetMenu();\n }\n }, [\n anchorMenu,\n editor,\n hasFieldLinkMode,\n linkCustomSource,\n parseCustomSourceFromHref,\n resetMenu\n ]);\n\n useEffect(() => {\n if (linkCustomSource?.edit && hasFieldLinkMode) {\n openedViaEditCustomSourceRef.current = true;\n initializedFromExistingFieldLinkRef.current = true;\n setLinkText(linkCustomSource.edit.text);\n setLinkSourceType('field');\n setAnchorMenu(true);\n }\n }, [linkCustomSource, hasFieldLinkMode]);\n\n const preventDef = (e: MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n };\n\n const isLinkActive = () => {\n return editor.isActive('link') && editor.isFocused;\n };\n\n const cancelAnchorCreation = useCallback(\n (event?: KeyboardEvent | MouseEvent) => {\n if (\n ((event && 'key' in event && event.key === 'Escape') ||\n event?.type === 'click' ||\n !event) &&\n anchorMenu\n ) {\n if (event && 'key' in event && event.key === 'Escape') {\n event.stopPropagation();\n }\n const originalSelection = originalSelectionRef.current;\n\n resetMenu();\n if (originalSelection) {\n // Refocus the original active selection in the editor\n editor\n .chain()\n .focus()\n .setTextSelection({ from: originalSelection.from, to: originalSelection.to })\n .run();\n } else {\n buttonRef.current?.focus();\n }\n }\n },\n [anchorMenu, editor, resetMenu]\n );\n\n // Ctrl+K shortcut to open link dialog from within the editor iframe\n useEffect(() => {\n const handleCtrlK = (e: KeyboardEvent) => {\n if (e.key === 'k' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n openMenu({ focusInput: true });\n }\n };\n\n const iframeWindow = editor.view.dom.ownerDocument.defaultView;\n iframeWindow?.addEventListener('keydown', handleCtrlK);\n return () => iframeWindow?.removeEventListener('keydown', handleCtrlK);\n }, [editor]);\n\n // Escape to close / Enter to submit - listen on both iframe and parent document\n // since focus may be in either location depending on how the popover was opened\n useEffect(() => {\n const handleKeyboardShortcut = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && anchorMenu) {\n e.preventDefault();\n cancelAnchorCreation();\n } else if (\n e.key === 'Enter' &&\n anchorMenu &&\n canSubmit &&\n (e.target === textInputEl || e.target === urlInputEl)\n ) {\n e.preventDefault();\n applyLink();\n }\n };\n const iframeWindow = editor.view.dom.ownerDocument.defaultView;\n iframeWindow?.addEventListener('keydown', handleKeyboardShortcut);\n if (iframeWindow !== window) {\n document.addEventListener('keydown', handleKeyboardShortcut);\n }\n return () => {\n iframeWindow?.removeEventListener('keydown', handleKeyboardShortcut);\n if (iframeWindow !== window) {\n document.removeEventListener('keydown', handleKeyboardShortcut);\n }\n };\n }, [editor, anchorMenu, canSubmit, applyLink, cancelAnchorCreation, textInputEl, urlInputEl]);\n\n useEscape(cancelAnchorCreation, popoverEl);\n\n useLayoutEffect(() => {\n if (shouldFocusInput) {\n const originalSelection = originalSelectionRef.current;\n const hasActiveSelection =\n originalSelection && originalSelection.from !== originalSelection.to;\n const inputToFocus = hasActiveSelection ? urlInputEl : textInputEl;\n if (inputToFocus) {\n inputToFocus.focus();\n setShouldFocusInput(false);\n }\n }\n }, [textInputEl, urlInputEl, shouldFocusInput]);\n\n useEffect(() => {\n // These events must be added here so they run before the native event in useArrows (used in the toolbar).\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape' && e.key !== 'Enter') {\n e.stopPropagation();\n }\n };\n textInputEl?.addEventListener('keydown', onKeyDown);\n urlInputEl?.addEventListener('keydown', onKeyDown);\n return () => {\n textInputEl?.removeEventListener('keydown', onKeyDown);\n urlInputEl?.removeEventListener('keydown', onKeyDown);\n };\n }, [textInputEl, urlInputEl]);\n\n const linkFormContent = (\n <Form\n as='div'\n actions={\n <>\n <Button variant='secondary' onClick={cancelAnchorCreation} type='button'>\n {t('cancel')}\n </Button>\n <Button\n variant='primary'\n disabled={!canSubmit}\n onClick={(e: MouseEvent) => {\n e.preventDefault();\n applyLink();\n }}\n >\n {t('apply')}\n </Button>\n </>\n }\n >\n <Grid container={{ rowGap: 2 }}>\n <Input\n label={t('rte_link_text')}\n value={linkText}\n onClick={preventDef}\n onChange={(e: ChangeEvent<HTMLInputElement>) => setLinkText(e.target.value)}\n ref={setTextInputEl}\n />\n {hasFieldLinkMode && (\n <RadioButtonGroup\n name='linkSourceType'\n label={t('rte_link_source')}\n onChange={e => {\n const { value } = e.target;\n if (value === 'url' || value === 'field') {\n setLinkSourceType(value);\n if (\n value === 'field' &&\n !openedViaEditCustomSourceRef.current &&\n !initializedFromExistingFieldLinkRef.current\n ) {\n linkCustomSource?.onEditSelectionChange?.({\n id: '',\n text: '',\n namespace: undefined\n });\n }\n }\n }}\n inline\n >\n <RadioButton label={t('rte_link_url')} value='url' checked={linkSourceType === 'url'} />\n <RadioButton\n label={t('rte_link_field')}\n value='field'\n checked={linkSourceType === 'field'}\n />\n </RadioButtonGroup>\n )}\n {linkSourceType === 'url' ? (\n <Input\n label={t('rte_link_url')}\n value={url}\n onClick={preventDef}\n onChange={(e: ChangeEvent<HTMLInputElement>) => {\n const urlInput = e.target.value;\n setUrl(urlInput);\n if (!urlMatch) {\n setUrlMatch(true);\n }\n }}\n onBlur={() => {\n setUrlMatch(!url || isValidUrl(url));\n }}\n info={url && !urlMatch ? t('rte_invalid_url') : ''}\n status={url && !urlMatch ? 'error' : undefined}\n ref={setUrlInputEl}\n />\n ) : (\n linkCustomSource?.picker\n )}\n </Grid>\n </Form>\n );\n\n return (\n <>\n <ToolbarButton\n ref={buttonRef}\n onMouseDown={e => {\n e.preventDefault();\n openMenu();\n }}\n onKeyDown={(e: ReactKeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openMenu({ focusInput: true });\n }\n }}\n active={isLinkActive()}\n tooltip={tooltip}\n label={t('rte_link')}\n {...restProps}\n >\n <Icon name='chain' />\n </ToolbarButton>\n {isTouchDevice ? (\n <TouchDialog\n ref={touchDialogRef}\n open={anchorMenu}\n heading={t('rte_add_link')}\n onDismiss={() => cancelAnchorCreation()}\n >\n <StyledTouchDialogContent>{linkFormContent}</StyledTouchDialogContent>\n </TouchDialog>\n ) : (\n <StyledEditPopover\n show={anchorMenu}\n target={buttonRef.current}\n ref={setPopoverEl}\n placement='bottom'\n >\n <CardContent>\n <Text variant='h2'>{t('rte_add_link')}</Text>\n {linkFormContent}\n </CardContent>\n </StyledEditPopover>\n )}\n </>\n );\n};\n\nexport default AnchorButton;\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.7.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.7.0",
|
|
19
19
|
"@popperjs/core": "^2.11.6",
|
|
20
20
|
"@tiptap/core": "^3.12.1",
|
|
21
21
|
"@tiptap/extension-blockquote": "^3.12.1",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"@types/react": "^17.0.62 || ^18.3.3",
|
|
47
47
|
"@types/react-dom": "^17.0.20 || ^18.3.0",
|
|
48
48
|
"@types/stylis": "^4.2.7",
|
|
49
|
-
"dompurify": "^3.
|
|
49
|
+
"dompurify": "^3.4.15",
|
|
50
50
|
"global-tld-list": "0.0.862",
|
|
51
51
|
"marked": "^15.0.6",
|
|
52
52
|
"parse5": "^6.0.1",
|