@payloadcms/richtext-lexical 4.0.0-canary.38 → 4.0.0-canary.39

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.
Files changed (107) hide show
  1. package/dist/exports/client/chunk-E6LSRRP2.js +2 -0
  2. package/dist/exports/client/{chunk-ATPSL6IX.js.map → chunk-E6LSRRP2.js.map} +3 -3
  3. package/dist/exports/client/chunk-ZQX5HXUL.js +2 -0
  4. package/dist/exports/client/{chunk-43E5QYAA.js.map → chunk-ZQX5HXUL.js.map} +3 -3
  5. package/dist/exports/client/{component-D5QLYS7W.js → component-6DQLENIE.js} +2 -2
  6. package/dist/exports/client/{componentInline-ZEP5JPTC.js → componentInline-HNE5G4TE.js} +2 -2
  7. package/dist/exports/client/index.js +28 -28
  8. package/dist/exports/client/index.js.map +4 -4
  9. package/dist/features/blocks/client/nodes/BlocksNode.d.ts.map +1 -1
  10. package/dist/features/blocks/client/nodes/BlocksNode.js +0 -10
  11. package/dist/features/blocks/client/nodes/BlocksNode.js.map +1 -1
  12. package/dist/features/blocks/server/nodes/BlocksNode.d.ts.map +1 -1
  13. package/dist/features/blocks/server/nodes/BlocksNode.js +1 -12
  14. package/dist/features/blocks/server/nodes/BlocksNode.js.map +1 -1
  15. package/dist/features/blocks/server/nodes/InlineBlocksNode.js +2 -2
  16. package/dist/features/blocks/server/nodes/InlineBlocksNode.js.map +1 -1
  17. package/dist/features/blocks/server/schema.d.ts +2 -0
  18. package/dist/features/blocks/server/schema.d.ts.map +1 -1
  19. package/dist/features/blocks/server/schema.js +7 -9
  20. package/dist/features/blocks/server/schema.js.map +1 -1
  21. package/dist/features/converters/lexicalToHtml/async/converters/upload.js.map +1 -1
  22. package/dist/features/converters/lexicalToHtml/sync/converters/upload.js.map +1 -1
  23. package/dist/features/converters/lexicalToJSX/converter/converters/upload.d.ts.map +1 -1
  24. package/dist/features/converters/lexicalToJSX/converter/converters/upload.js +0 -1
  25. package/dist/features/converters/lexicalToJSX/converter/converters/upload.js.map +1 -1
  26. package/dist/features/horizontalRule/client/nodes/HorizontalRuleNode.d.ts +11 -1
  27. package/dist/features/horizontalRule/client/nodes/HorizontalRuleNode.d.ts.map +1 -1
  28. package/dist/features/horizontalRule/client/nodes/HorizontalRuleNode.js +17 -0
  29. package/dist/features/horizontalRule/client/nodes/HorizontalRuleNode.js.map +1 -1
  30. package/dist/features/horizontalRule/server/nodes/HorizontalRuleNode.js +2 -2
  31. package/dist/features/horizontalRule/server/nodes/HorizontalRuleNode.js.map +1 -1
  32. package/dist/features/horizontalRule/server/schema.d.ts +1 -0
  33. package/dist/features/horizontalRule/server/schema.d.ts.map +1 -1
  34. package/dist/features/horizontalRule/server/schema.js +6 -5
  35. package/dist/features/horizontalRule/server/schema.js.map +1 -1
  36. package/dist/features/link/nodes/AutoLinkNode.d.ts.map +1 -1
  37. package/dist/features/link/nodes/AutoLinkNode.js +2 -10
  38. package/dist/features/link/nodes/AutoLinkNode.js.map +1 -1
  39. package/dist/features/link/nodes/LinkNode.d.ts.map +1 -1
  40. package/dist/features/link/nodes/LinkNode.js +2 -15
  41. package/dist/features/link/nodes/LinkNode.js.map +1 -1
  42. package/dist/features/relationship/client/nodes/RelationshipNode.d.ts.map +1 -1
  43. package/dist/features/relationship/client/nodes/RelationshipNode.js +0 -3
  44. package/dist/features/relationship/client/nodes/RelationshipNode.js.map +1 -1
  45. package/dist/features/relationship/server/nodes/RelationshipNode.d.ts.map +1 -1
  46. package/dist/features/relationship/server/nodes/RelationshipNode.js +1 -5
  47. package/dist/features/relationship/server/nodes/RelationshipNode.js.map +1 -1
  48. package/dist/features/relationship/server/schema.d.ts +1 -0
  49. package/dist/features/relationship/server/schema.d.ts.map +1 -1
  50. package/dist/features/relationship/server/schema.js +4 -2
  51. package/dist/features/relationship/server/schema.js.map +1 -1
  52. package/dist/features/toolbars/fixed/client/Toolbar/index.d.ts.map +1 -1
  53. package/dist/features/toolbars/fixed/client/Toolbar/index.js +15 -0
  54. package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
  55. package/dist/features/toolbars/inline/client/Toolbar/index.d.ts.map +1 -1
  56. package/dist/features/toolbars/inline/client/Toolbar/index.js +15 -0
  57. package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
  58. package/dist/features/toolbars/shared/useToolbarKeyboardNavigation.d.ts +5 -0
  59. package/dist/features/toolbars/shared/useToolbarKeyboardNavigation.d.ts.map +1 -0
  60. package/dist/features/toolbars/shared/useToolbarKeyboardNavigation.js +79 -0
  61. package/dist/features/toolbars/shared/useToolbarKeyboardNavigation.js.map +1 -0
  62. package/dist/features/upload/client/nodes/UploadNode.d.ts.map +1 -1
  63. package/dist/features/upload/client/nodes/UploadNode.js +0 -7
  64. package/dist/features/upload/client/nodes/UploadNode.js.map +1 -1
  65. package/dist/features/upload/server/index.d.ts +1 -1
  66. package/dist/features/upload/server/index.d.ts.map +1 -1
  67. package/dist/features/upload/server/index.js.map +1 -1
  68. package/dist/features/upload/server/nodes/UploadNode.d.ts.map +1 -1
  69. package/dist/features/upload/server/nodes/UploadNode.js +1 -9
  70. package/dist/features/upload/server/nodes/UploadNode.js.map +1 -1
  71. package/dist/features/upload/server/schema.d.ts +2 -14
  72. package/dist/features/upload/server/schema.d.ts.map +1 -1
  73. package/dist/features/upload/server/schema.js +4 -2
  74. package/dist/features/upload/server/schema.js.map +1 -1
  75. package/dist/field/Diff/converters/upload/index.js.map +1 -1
  76. package/dist/field/Diff/index.d.ts.map +1 -1
  77. package/dist/field/Diff/index.js +2 -2
  78. package/dist/field/Diff/index.js.map +1 -1
  79. package/dist/field/bundled.css +1 -1
  80. package/dist/field/rscEntry.d.ts +2 -2
  81. package/dist/field/rscEntry.d.ts.map +1 -1
  82. package/dist/field/rscEntry.js.map +1 -1
  83. package/dist/index.d.ts +3 -3
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js.map +1 -1
  86. package/dist/types/builtInNodes.d.ts +1 -1
  87. package/dist/types/builtInNodes.d.ts.map +1 -1
  88. package/dist/types/builtInNodes.js +8 -3
  89. package/dist/types/builtInNodes.js.map +1 -1
  90. package/dist/types/index.d.ts +1 -4
  91. package/dist/types/index.d.ts.map +1 -1
  92. package/dist/types/index.js.map +1 -1
  93. package/dist/types/jsonSchemaHelpers.d.ts +5 -1
  94. package/dist/types/jsonSchemaHelpers.d.ts.map +1 -1
  95. package/dist/types/jsonSchemaHelpers.js +7 -2
  96. package/dist/types/jsonSchemaHelpers.js.map +1 -1
  97. package/dist/types/nodeTypes.d.ts +5 -0
  98. package/dist/types/nodeTypes.d.ts.map +1 -1
  99. package/dist/types/nodeTypes.js.map +1 -1
  100. package/dist/utilities/generateImportMap.d.ts +2 -2
  101. package/dist/utilities/generateImportMap.d.ts.map +1 -1
  102. package/dist/utilities/generateImportMap.js.map +1 -1
  103. package/package.json +5 -5
  104. package/dist/exports/client/chunk-43E5QYAA.js +0 -2
  105. package/dist/exports/client/chunk-ATPSL6IX.js +0 -2
  106. /package/dist/exports/client/{component-D5QLYS7W.js.map → component-6DQLENIE.js.map} +0 -0
  107. /package/dist/exports/client/{componentInline-ZEP5JPTC.js.map → componentInline-HNE5G4TE.js.map} +0 -0
@@ -5,6 +5,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
5
  import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js';
6
6
  import { useLexicalEditable } from '@lexical/react/useLexicalEditable';
7
7
  import { mergeRegister } from '@lexical/utils';
8
+ import { getTranslation } from '@payloadcms/translations';
9
+ import { useTranslation } from '@payloadcms/ui';
8
10
  import { $getSelection, $isRangeSelection, $isTextNode, $onUpdate, COMMAND_PRIORITY_LOW, getDOMSelection, SELECTION_CHANGE_COMMAND } from 'lexical';
9
11
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
10
12
  import * as React from 'react';
@@ -14,6 +16,7 @@ import { getDOMRangeRect } from '../../../../../lexical/utils/getDOMRangeRect.js
14
16
  import { setFloatingElemPosition } from '../../../../../lexical/utils/setFloatingElemPosition.js';
15
17
  import { ToolbarButton } from '../../../shared/ToolbarButton/index.js';
16
18
  import { ToolbarDropdown } from '../../../shared/ToolbarDropdown/index.js';
19
+ import { useToolbarKeyboardNavigation } from '../../../shared/useToolbarKeyboardNavigation.js';
17
20
  import { useToolbarStates } from '../../../shared/useToolbarStates.js';
18
21
  import './index.css';
19
22
  function ButtonGroupItem({
@@ -87,6 +90,16 @@ function InlineToolbar({
87
90
  editor
88
91
  }) {
89
92
  const floatingToolbarRef = useRef(null);
93
+ const keyboardNavigationOptions = useMemo(() => ({
94
+ toolbarRef: floatingToolbarRef
95
+ }), []);
96
+ const {
97
+ fieldProps
98
+ } = useEditorConfigContext();
99
+ const {
100
+ i18n
101
+ } = useTranslation();
102
+ useToolbarKeyboardNavigation(keyboardNavigationOptions);
90
103
  const caretRef = useRef(null);
91
104
  const {
92
105
  editorConfig
@@ -208,8 +221,10 @@ function InlineToolbar({
208
221
  }, COMMAND_PRIORITY_LOW));
209
222
  }, [editor, $updateTextFormatFloatingToolbar]);
210
223
  return /*#__PURE__*/_jsxs("div", {
224
+ "aria-label": getTranslation(fieldProps.field.label || fieldProps.path, i18n) || fieldProps.path,
211
225
  className: "inline-toolbar-popup",
212
226
  ref: floatingToolbarRef,
227
+ role: "toolbar",
213
228
  children: [/*#__PURE__*/_jsx("div", {
214
229
  className: "caret",
215
230
  ref: caretRef
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useLexicalEditable","mergeRegister","$getSelection","$isRangeSelection","$isTextNode","$onUpdate","COMMAND_PRIORITY_LOW","getDOMSelection","SELECTION_CHANGE_COMMAND","useCallback","useEffect","useMemo","useRef","useState","React","createPortal","useEditorConfigContext","getDOMRangeRect","setFloatingElemPosition","ToolbarButton","ToolbarDropdown","useToolbarStates","ButtonGroupItem","active","anchorElem","editor","enabled","item","Component","_jsx","key","ChildComponent","ToolbarGroupComponent","group","index","toolbarStates","editorConfig","groupState","groupStates","get","DropdownIcon","type","undefined","activeItem","activeItems","_jsxs","className","items","length","Icon","map","itemState","itemStates","features","toolbarInline","groups","InlineToolbar","floatingToolbarRef","caretRef","closeFloatingToolbar","current","isOpacityZero","style","opacity","isPointerEventsNone","pointerEvents","mouseMoveListener","e","buttons","x","clientX","y","clientY","elementUnderMouse","document","elementFromPoint","contains","mouseUpListener","addEventListener","removeEventListener","$updateTextFormatFloatingToolbar","selection","nativeSelection","_window","possibleLinkEditor","querySelector","isLinkEditorVisible","rootElement","getRootElement","isCollapsed","anchorNode","rangeRect","offsetIfFlipped","alwaysDisplayOnTop","floatingElem","horizontalPosition","targetRect","anchorFlippedOffset","horizontalOffset","specialHandlingForCaret","verticalGap","scrollerElem","parentElement","update","getEditorState","read","window","registerUpdateListener","editorState","registerCommand","ref","i","useInlineToolbar","$","isText","setIsText","isEditable","t0","isComposing","getTextContent","nodes","getNodes","foundNodeWithText","node","rawTextContent","replace","updatePopup","t1","t2","t3","t4","registerRootListener","t5","InlineToolbarPlugin"],"sources":["../../../../../../src/features/toolbars/inline/client/Toolbar/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n $onUpdate,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\nimport type { ToolbarStates } from '../../../shared/useToolbarStates.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../../types.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getDOMRangeRect } from '../../../../../lexical/utils/getDOMRangeRect.js'\nimport { setFloatingElemPosition } from '../../../../../lexical/utils/setFloatingElemPosition.js'\nimport { ToolbarButton } from '../../../shared/ToolbarButton/index.js'\nimport { ToolbarDropdown } from '../../../shared/ToolbarDropdown/index.js'\nimport { useToolbarStates } from '../../../shared/useToolbarStates.js'\nimport './index.css'\n\nfunction ButtonGroupItem({\n active,\n anchorElem,\n editor,\n enabled,\n item,\n}: {\n active: boolean\n anchorElem: HTMLElement\n editor: LexicalEditor\n enabled: boolean\n item: ToolbarGroupItem\n}): React.ReactNode {\n if (item.Component) {\n return (\n item?.Component && (\n <item.Component anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n )\n }\n if (!item.ChildComponent) {\n return null\n }\n\n return (\n <ToolbarButton active={active} editor={editor} enabled={enabled} item={item} key={item.key}>\n <item.ChildComponent />\n </ToolbarButton>\n )\n}\n\nfunction ToolbarGroupComponent({\n anchorElem,\n editor,\n group,\n index,\n toolbarStates,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n group: ToolbarGroup\n index: number\n toolbarStates: ToolbarStates\n}): React.ReactNode {\n const { editorConfig } = useEditorConfigContext()\n\n const groupState = toolbarStates.groupStates.get(group.key)\n\n const DropdownIcon = useMemo(() => {\n if (group.type !== 'dropdown') {\n return undefined\n }\n const activeItem = groupState?.activeItems?.[0]\n return activeItem?.ChildComponent ?? group.ChildComponent\n }, [group, groupState?.activeItems])\n\n return (\n <div\n className={`inline-toolbar-popup__group inline-toolbar-popup__group-${group.key}`}\n data-toolbar-group-key={group.key}\n key={group.key}\n >\n {group.type === 'dropdown' && group.items.length && groupState ? (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n groupState={groupState}\n Icon={DropdownIcon}\n />\n ) : null}\n {group.type === 'buttons' && group.items.length\n ? group.items.map((item) => {\n const itemState = toolbarStates.itemStates.get(item.key)\n return (\n <ButtonGroupItem\n active={itemState?.active ?? false}\n anchorElem={anchorElem}\n editor={editor}\n enabled={itemState?.enabled ?? true}\n item={item}\n key={item.key}\n />\n )\n })\n : null}\n {index < editorConfig.features.toolbarInline?.groups.length - 1 && (\n <div className=\"divider\" />\n )}\n </div>\n )\n}\n\nfunction InlineToolbar({\n anchorElem,\n editor,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n}): React.ReactNode {\n const floatingToolbarRef = useRef<HTMLDivElement | null>(null)\n const caretRef = useRef<HTMLDivElement | null>(null)\n\n const { editorConfig } = useEditorConfigContext()\n\n const toolbarStates = useToolbarStates(editor, editorConfig?.features?.toolbarInline?.groups)\n\n const closeFloatingToolbar = useCallback(() => {\n if (floatingToolbarRef?.current) {\n const isOpacityZero = floatingToolbarRef.current.style.opacity === '0'\n const isPointerEventsNone = floatingToolbarRef.current.style.pointerEvents === 'none'\n\n if (!isOpacityZero) {\n floatingToolbarRef.current.style.opacity = '0'\n }\n if (!isPointerEventsNone) {\n floatingToolbarRef.current.style.pointerEvents = 'none'\n }\n }\n }, [floatingToolbarRef])\n\n const mouseMoveListener = useCallback(\n (e: MouseEvent) => {\n if (floatingToolbarRef?.current && (e.buttons === 1 || e.buttons === 3)) {\n const isOpacityZero = floatingToolbarRef.current.style.opacity === '0'\n const isPointerEventsNone = floatingToolbarRef.current.style.pointerEvents === 'none'\n if (!isOpacityZero || !isPointerEventsNone) {\n // Check if the mouse is not over the popup\n const x = e.clientX\n const y = e.clientY\n const elementUnderMouse = document.elementFromPoint(x, y)\n if (!floatingToolbarRef.current.contains(elementUnderMouse)) {\n // Mouse is not over the target element => not a normal click, but probably a drag\n closeFloatingToolbar()\n }\n }\n }\n },\n [closeFloatingToolbar],\n )\n\n const mouseUpListener = useCallback(() => {\n if (floatingToolbarRef?.current) {\n if (floatingToolbarRef.current.style.opacity !== '1') {\n floatingToolbarRef.current.style.opacity = '1'\n }\n if (floatingToolbarRef.current.style.pointerEvents !== 'auto') {\n floatingToolbarRef.current.style.pointerEvents = 'auto'\n }\n }\n }, [])\n\n useEffect(() => {\n document.addEventListener('mousemove', mouseMoveListener)\n document.addEventListener('mouseup', mouseUpListener)\n\n return () => {\n document.removeEventListener('mousemove', mouseMoveListener)\n document.removeEventListener('mouseup', mouseUpListener)\n }\n }, [floatingToolbarRef, mouseMoveListener, mouseUpListener])\n\n const $updateTextFormatFloatingToolbar = useCallback(() => {\n const selection = $getSelection()\n\n const nativeSelection = getDOMSelection(editor._window)\n\n if (floatingToolbarRef.current === null) {\n return\n }\n\n const possibleLinkEditor = anchorElem.querySelector(':scope > .link-editor')\n const isLinkEditorVisible =\n possibleLinkEditor !== null &&\n 'style' in possibleLinkEditor &&\n possibleLinkEditor?.style?.['opacity' as keyof typeof possibleLinkEditor.style] === '1'\n\n const rootElement = editor.getRootElement()\n if (\n selection !== null &&\n nativeSelection !== null &&\n !nativeSelection.isCollapsed &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const rangeRect = getDOMRangeRect(nativeSelection, rootElement)\n\n // Position floating toolbar\n const offsetIfFlipped = setFloatingElemPosition({\n alwaysDisplayOnTop: isLinkEditorVisible,\n anchorElem,\n floatingElem: floatingToolbarRef.current,\n horizontalPosition: 'center',\n targetRect: rangeRect,\n })\n\n // Position caret\n if (caretRef.current) {\n setFloatingElemPosition({\n anchorElem: floatingToolbarRef.current,\n anchorFlippedOffset: offsetIfFlipped,\n floatingElem: caretRef.current,\n horizontalOffset: 5,\n horizontalPosition: 'center',\n specialHandlingForCaret: true,\n targetRect: rangeRect,\n verticalGap: 8,\n })\n }\n } else {\n closeFloatingToolbar()\n }\n }, [editor, closeFloatingToolbar, anchorElem])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = () => {\n editor.getEditorState().read(() => {\n $updateTextFormatFloatingToolbar()\n })\n }\n\n window.addEventListener('resize', update)\n if (scrollerElem) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n if (scrollerElem) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [editor, $updateTextFormatFloatingToolbar, anchorElem])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n $updateTextFormatFloatingToolbar()\n })\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateTextFormatFloatingToolbar()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n $onUpdate(() => editor.read('latest', $updateTextFormatFloatingToolbar))\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateTextFormatFloatingToolbar])\n\n return (\n <div className=\"inline-toolbar-popup\" ref={floatingToolbarRef}>\n <div className=\"caret\" ref={caretRef} />\n {editorConfig?.features &&\n editorConfig.features?.toolbarInline?.groups.map((group, i) => {\n return (\n <ToolbarGroupComponent\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n index={i}\n key={group.key}\n toolbarStates={toolbarStates}\n />\n )\n })}\n </div>\n )\n}\n\nfunction useInlineToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n): null | React.ReactElement {\n const [isText, setIsText] = useState(false)\n const isEditable = useLexicalEditable()\n\n const updatePopup = useCallback(() => {\n editor.getEditorState().read(() => {\n // Should not to pop up the floating toolbar when using IME input\n if (editor.isComposing()) {\n return\n }\n const selection = $getSelection()\n const nativeSelection = getDOMSelection(editor._window)\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n (!$isRangeSelection(selection) ||\n rootElement === null ||\n !rootElement.contains(nativeSelection.anchorNode))\n ) {\n setIsText(false)\n return\n }\n\n if (!$isRangeSelection(selection)) {\n return\n }\n\n if (selection.getTextContent() !== '') {\n const nodes = selection.getNodes()\n let foundNodeWithText = false\n for (const node of nodes) {\n if ($isTextNode(node)) {\n setIsText(true)\n foundNodeWithText = true\n break\n }\n }\n if (!foundNodeWithText) {\n setIsText(false)\n }\n } else {\n setIsText(false)\n }\n\n const rawTextContent = selection.getTextContent().replace(/\\n/g, '')\n if (!selection.isCollapsed() && rawTextContent === '') {\n setIsText(false)\n return\n }\n })\n }, [editor])\n\n useEffect(() => {\n document.addEventListener('selectionchange', updatePopup)\n document.addEventListener('mouseup', updatePopup)\n return () => {\n document.removeEventListener('selectionchange', updatePopup)\n document.removeEventListener('mouseup', updatePopup)\n }\n }, [updatePopup])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(() => {\n updatePopup()\n }),\n editor.registerRootListener(() => {\n if (editor.getRootElement() === null) {\n setIsText(false)\n }\n }),\n )\n }, [editor, updatePopup])\n\n if (!isText || !isEditable) {\n return null\n }\n\n return createPortal(<InlineToolbar anchorElem={anchorElem} editor={editor} />, anchorElem)\n}\n\nexport const InlineToolbarPlugin: PluginComponentWithAnchor<undefined> = ({ anchorElem }) => {\n const [editor] = useLexicalComposerContext()\n\n return useInlineToolbar(editor, anchorElem)\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useLexicalEditable","mergeRegister","getTranslation","useTranslation","$getSelection","$isRangeSelection","$isTextNode","$onUpdate","COMMAND_PRIORITY_LOW","getDOMSelection","SELECTION_CHANGE_COMMAND","useCallback","useEffect","useMemo","useRef","useState","React","createPortal","useEditorConfigContext","getDOMRangeRect","setFloatingElemPosition","ToolbarButton","ToolbarDropdown","useToolbarKeyboardNavigation","useToolbarStates","ButtonGroupItem","active","anchorElem","editor","enabled","item","Component","_jsx","key","ChildComponent","ToolbarGroupComponent","group","index","toolbarStates","editorConfig","groupState","groupStates","get","DropdownIcon","type","undefined","activeItem","activeItems","_jsxs","className","items","length","Icon","map","itemState","itemStates","features","toolbarInline","groups","InlineToolbar","floatingToolbarRef","keyboardNavigationOptions","toolbarRef","fieldProps","i18n","caretRef","closeFloatingToolbar","current","isOpacityZero","style","opacity","isPointerEventsNone","pointerEvents","mouseMoveListener","e","buttons","x","clientX","y","clientY","elementUnderMouse","document","elementFromPoint","contains","mouseUpListener","addEventListener","removeEventListener","$updateTextFormatFloatingToolbar","selection","nativeSelection","_window","possibleLinkEditor","querySelector","isLinkEditorVisible","rootElement","getRootElement","isCollapsed","anchorNode","rangeRect","offsetIfFlipped","alwaysDisplayOnTop","floatingElem","horizontalPosition","targetRect","anchorFlippedOffset","horizontalOffset","specialHandlingForCaret","verticalGap","scrollerElem","parentElement","update","getEditorState","read","window","registerUpdateListener","editorState","registerCommand","field","label","path","ref","role","i","useInlineToolbar","$","isText","setIsText","isEditable","t0","isComposing","getTextContent","nodes","getNodes","foundNodeWithText","node","rawTextContent","replace","updatePopup","t1","t2","t3","t4","registerRootListener","t5","InlineToolbarPlugin"],"sources":["../../../../../../src/features/toolbars/inline/client/Toolbar/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport { useTranslation } from '@payloadcms/ui'\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n $onUpdate,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\nimport type { ToolbarStates } from '../../../shared/useToolbarStates.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../../types.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getDOMRangeRect } from '../../../../../lexical/utils/getDOMRangeRect.js'\nimport { setFloatingElemPosition } from '../../../../../lexical/utils/setFloatingElemPosition.js'\nimport { ToolbarButton } from '../../../shared/ToolbarButton/index.js'\nimport { ToolbarDropdown } from '../../../shared/ToolbarDropdown/index.js'\nimport { useToolbarKeyboardNavigation } from '../../../shared/useToolbarKeyboardNavigation.js'\nimport { useToolbarStates } from '../../../shared/useToolbarStates.js'\nimport './index.css'\n\nfunction ButtonGroupItem({\n active,\n anchorElem,\n editor,\n enabled,\n item,\n}: {\n active: boolean\n anchorElem: HTMLElement\n editor: LexicalEditor\n enabled: boolean\n item: ToolbarGroupItem\n}): React.ReactNode {\n if (item.Component) {\n return (\n item?.Component && (\n <item.Component anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n )\n }\n if (!item.ChildComponent) {\n return null\n }\n\n return (\n <ToolbarButton active={active} editor={editor} enabled={enabled} item={item} key={item.key}>\n <item.ChildComponent />\n </ToolbarButton>\n )\n}\n\nfunction ToolbarGroupComponent({\n anchorElem,\n editor,\n group,\n index,\n toolbarStates,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n group: ToolbarGroup\n index: number\n toolbarStates: ToolbarStates\n}): React.ReactNode {\n const { editorConfig } = useEditorConfigContext()\n\n const groupState = toolbarStates.groupStates.get(group.key)\n\n const DropdownIcon = useMemo(() => {\n if (group.type !== 'dropdown') {\n return undefined\n }\n const activeItem = groupState?.activeItems?.[0]\n return activeItem?.ChildComponent ?? group.ChildComponent\n }, [group, groupState?.activeItems])\n\n return (\n <div\n className={`inline-toolbar-popup__group inline-toolbar-popup__group-${group.key}`}\n data-toolbar-group-key={group.key}\n key={group.key}\n >\n {group.type === 'dropdown' && group.items.length && groupState ? (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n groupState={groupState}\n Icon={DropdownIcon}\n />\n ) : null}\n {group.type === 'buttons' && group.items.length\n ? group.items.map((item) => {\n const itemState = toolbarStates.itemStates.get(item.key)\n return (\n <ButtonGroupItem\n active={itemState?.active ?? false}\n anchorElem={anchorElem}\n editor={editor}\n enabled={itemState?.enabled ?? true}\n item={item}\n key={item.key}\n />\n )\n })\n : null}\n {index < editorConfig.features.toolbarInline?.groups.length - 1 && (\n <div className=\"divider\" />\n )}\n </div>\n )\n}\n\nfunction InlineToolbar({\n anchorElem,\n editor,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n}): React.ReactNode {\n const floatingToolbarRef = useRef<HTMLDivElement | null>(null)\n const keyboardNavigationOptions = useMemo(() => ({ toolbarRef: floatingToolbarRef }), [])\n const { fieldProps } = useEditorConfigContext()\n const { i18n } = useTranslation()\n\n useToolbarKeyboardNavigation(keyboardNavigationOptions)\n\n const caretRef = useRef<HTMLDivElement | null>(null)\n\n const { editorConfig } = useEditorConfigContext()\n\n const toolbarStates = useToolbarStates(editor, editorConfig?.features?.toolbarInline?.groups)\n\n const closeFloatingToolbar = useCallback(() => {\n if (floatingToolbarRef?.current) {\n const isOpacityZero = floatingToolbarRef.current.style.opacity === '0'\n const isPointerEventsNone = floatingToolbarRef.current.style.pointerEvents === 'none'\n\n if (!isOpacityZero) {\n floatingToolbarRef.current.style.opacity = '0'\n }\n if (!isPointerEventsNone) {\n floatingToolbarRef.current.style.pointerEvents = 'none'\n }\n }\n }, [floatingToolbarRef])\n\n const mouseMoveListener = useCallback(\n (e: MouseEvent) => {\n if (floatingToolbarRef?.current && (e.buttons === 1 || e.buttons === 3)) {\n const isOpacityZero = floatingToolbarRef.current.style.opacity === '0'\n const isPointerEventsNone = floatingToolbarRef.current.style.pointerEvents === 'none'\n if (!isOpacityZero || !isPointerEventsNone) {\n // Check if the mouse is not over the popup\n const x = e.clientX\n const y = e.clientY\n const elementUnderMouse = document.elementFromPoint(x, y)\n if (!floatingToolbarRef.current.contains(elementUnderMouse)) {\n // Mouse is not over the target element => not a normal click, but probably a drag\n closeFloatingToolbar()\n }\n }\n }\n },\n [closeFloatingToolbar],\n )\n\n const mouseUpListener = useCallback(() => {\n if (floatingToolbarRef?.current) {\n if (floatingToolbarRef.current.style.opacity !== '1') {\n floatingToolbarRef.current.style.opacity = '1'\n }\n if (floatingToolbarRef.current.style.pointerEvents !== 'auto') {\n floatingToolbarRef.current.style.pointerEvents = 'auto'\n }\n }\n }, [])\n\n useEffect(() => {\n document.addEventListener('mousemove', mouseMoveListener)\n document.addEventListener('mouseup', mouseUpListener)\n\n return () => {\n document.removeEventListener('mousemove', mouseMoveListener)\n document.removeEventListener('mouseup', mouseUpListener)\n }\n }, [floatingToolbarRef, mouseMoveListener, mouseUpListener])\n\n const $updateTextFormatFloatingToolbar = useCallback(() => {\n const selection = $getSelection()\n\n const nativeSelection = getDOMSelection(editor._window)\n\n if (floatingToolbarRef.current === null) {\n return\n }\n\n const possibleLinkEditor = anchorElem.querySelector(':scope > .link-editor')\n const isLinkEditorVisible =\n possibleLinkEditor !== null &&\n 'style' in possibleLinkEditor &&\n possibleLinkEditor?.style?.['opacity' as keyof typeof possibleLinkEditor.style] === '1'\n\n const rootElement = editor.getRootElement()\n if (\n selection !== null &&\n nativeSelection !== null &&\n !nativeSelection.isCollapsed &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const rangeRect = getDOMRangeRect(nativeSelection, rootElement)\n\n // Position floating toolbar\n const offsetIfFlipped = setFloatingElemPosition({\n alwaysDisplayOnTop: isLinkEditorVisible,\n anchorElem,\n floatingElem: floatingToolbarRef.current,\n horizontalPosition: 'center',\n targetRect: rangeRect,\n })\n\n // Position caret\n if (caretRef.current) {\n setFloatingElemPosition({\n anchorElem: floatingToolbarRef.current,\n anchorFlippedOffset: offsetIfFlipped,\n floatingElem: caretRef.current,\n horizontalOffset: 5,\n horizontalPosition: 'center',\n specialHandlingForCaret: true,\n targetRect: rangeRect,\n verticalGap: 8,\n })\n }\n } else {\n closeFloatingToolbar()\n }\n }, [editor, closeFloatingToolbar, anchorElem])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = () => {\n editor.getEditorState().read(() => {\n $updateTextFormatFloatingToolbar()\n })\n }\n\n window.addEventListener('resize', update)\n if (scrollerElem) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n if (scrollerElem) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [editor, $updateTextFormatFloatingToolbar, anchorElem])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n $updateTextFormatFloatingToolbar()\n })\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateTextFormatFloatingToolbar()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n $onUpdate(() => editor.read('latest', $updateTextFormatFloatingToolbar))\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateTextFormatFloatingToolbar])\n\n return (\n <div\n aria-label={\n getTranslation(fieldProps.field.label || fieldProps.path, i18n) || fieldProps.path\n }\n className=\"inline-toolbar-popup\"\n ref={floatingToolbarRef}\n role=\"toolbar\"\n >\n <div className=\"caret\" ref={caretRef} />\n {editorConfig?.features &&\n editorConfig.features?.toolbarInline?.groups.map((group, i) => {\n return (\n <ToolbarGroupComponent\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n index={i}\n key={group.key}\n toolbarStates={toolbarStates}\n />\n )\n })}\n </div>\n )\n}\n\nfunction useInlineToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n): null | React.ReactElement {\n const [isText, setIsText] = useState(false)\n const isEditable = useLexicalEditable()\n\n const updatePopup = useCallback(() => {\n editor.getEditorState().read(() => {\n // Should not to pop up the floating toolbar when using IME input\n if (editor.isComposing()) {\n return\n }\n const selection = $getSelection()\n const nativeSelection = getDOMSelection(editor._window)\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n (!$isRangeSelection(selection) ||\n rootElement === null ||\n !rootElement.contains(nativeSelection.anchorNode))\n ) {\n setIsText(false)\n return\n }\n\n if (!$isRangeSelection(selection)) {\n return\n }\n\n if (selection.getTextContent() !== '') {\n const nodes = selection.getNodes()\n let foundNodeWithText = false\n for (const node of nodes) {\n if ($isTextNode(node)) {\n setIsText(true)\n foundNodeWithText = true\n break\n }\n }\n if (!foundNodeWithText) {\n setIsText(false)\n }\n } else {\n setIsText(false)\n }\n\n const rawTextContent = selection.getTextContent().replace(/\\n/g, '')\n if (!selection.isCollapsed() && rawTextContent === '') {\n setIsText(false)\n return\n }\n })\n }, [editor])\n\n useEffect(() => {\n document.addEventListener('selectionchange', updatePopup)\n document.addEventListener('mouseup', updatePopup)\n return () => {\n document.removeEventListener('selectionchange', updatePopup)\n document.removeEventListener('mouseup', updatePopup)\n }\n }, [updatePopup])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(() => {\n updatePopup()\n }),\n editor.registerRootListener(() => {\n if (editor.getRootElement() === null) {\n setIsText(false)\n }\n }),\n )\n }, [editor, updatePopup])\n\n if (!isText || !isEditable) {\n return null\n }\n\n return createPortal(<InlineToolbar anchorElem={anchorElem} editor={editor} />, anchorElem)\n}\n\nexport const InlineToolbarPlugin: PluginComponentWithAnchor<undefined> = ({ anchorElem }) => {\n const [editor] = useLexicalComposerContext()\n\n return useInlineToolbar(editor, anchorElem)\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAGA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,kBAAkB,QAAQ;AACnC,SAASC,aAAa,QAAQ;AAC9B,SAASC,cAAc,QAAQ;AAC/B,SAASC,cAAc,QAAQ;AAC/B,SACEC,aAAa,EACbC,iBAAiB,EACjBC,WAAW,EACXC,SAAS,EACTC,oBAAoB,EACpBC,eAAe,EACfC,wBAAwB,QACnB;AACP,SAASC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AAClE,YAAYC,KAAA,MAAW;AACvB,SAASC,YAAY,QAAQ;AAM7B,SAASC,sBAAsB,QAAQ;AACvC,SAASC,eAAe,QAAQ;AAChC,SAASC,uBAAuB,QAAQ;AACxC,SAASC,aAAa,QAAQ;AAC9B,SAASC,eAAe,QAAQ;AAChC,SAASC,4BAA4B,QAAQ;AAC7C,SAASC,gBAAgB,QAAQ;AACjC,OAAO;AAEP,SAASC,gBAAgB;EACvBC,MAAM;EACNC,UAAU;EACVC,MAAM;EACNC,OAAO;EACPC;AAAI,CAOL;EACC,IAAIA,IAAA,CAAKC,SAAS,EAAE;IAClB,OACED,IAAA,EAAMC,SAAA,iBACJC,IAAA,CAACF,IAAA,CAAKC,SAAS;MAACJ,UAAA,EAAYA,UAAA;MAAYC,MAAA,EAAQA,MAAA;MAAQE,IAAA,EAAMA;OAAWA,IAAA,CAAKG,GAAG;EAGvF;EACA,IAAI,CAACH,IAAA,CAAKI,cAAc,EAAE;IACxB,OAAO;EACT;EAEA,oBACEF,IAAA,CAACX,aAAA;IAAcK,MAAA,EAAQA,MAAA;IAAQE,MAAA,EAAQA,MAAA;IAAQC,OAAA,EAASA,OAAA;IAASC,IAAA,EAAMA,IAAA;cACrE,aAAAE,IAAA,CAACF,IAAA,CAAKI,cAAc;KAD4DJ,IAAA,CAAKG,GAAG;AAI9F;AAEA,SAASE,sBAAsB;EAC7BR,UAAU;EACVC,MAAM;EACNQ,KAAK;EACLC,KAAK;EACLC;AAAa,CAOd;EACC,MAAM;IAAEC;EAAY,CAAE,GAAGrB,sBAAA;EAEzB,MAAMsB,UAAA,GAAaF,aAAA,CAAcG,WAAW,CAACC,GAAG,CAACN,KAAA,CAAMH,GAAG;EAE1D,MAAMU,YAAA,GAAe9B,OAAA,CAAQ;IAC3B,IAAIuB,KAAA,CAAMQ,IAAI,KAAK,YAAY;MAC7B,OAAOC,SAAA;IACT;IACA,MAAMC,UAAA,GAAaN,UAAA,EAAYO,WAAA,GAAc,EAAE;IAC/C,OAAOD,UAAA,EAAYZ,cAAA,IAAkBE,KAAA,CAAMF,cAAc;EAC3D,GAAG,CAACE,KAAA,EAAOI,UAAA,EAAYO,WAAA,CAAY;EAEnC,oBACEC,KAAA,CAAC;IACCC,SAAA,EAAW,2DAA2Db,KAAA,CAAMH,GAAG,EAAE;IACjF,0BAAwBG,KAAA,CAAMH,GAAG;eAGhCG,KAAA,CAAMQ,IAAI,KAAK,cAAcR,KAAA,CAAMc,KAAK,CAACC,MAAM,IAAIX,UAAA,gBAClDR,IAAA,CAACV,eAAA;MACCK,UAAA,EAAYA,UAAA;MACZC,MAAA,EAAQA,MAAA;MACRQ,KAAA,EAAOA,KAAA;MACPI,UAAA,EAAYA,UAAA;MACZY,IAAA,EAAMT;SAEN,MACHP,KAAA,CAAMQ,IAAI,KAAK,aAAaR,KAAA,CAAMc,KAAK,CAACC,MAAM,GAC3Cf,KAAA,CAAMc,KAAK,CAACG,GAAG,CAAEvB,IAAA;MACf,MAAMwB,SAAA,GAAYhB,aAAA,CAAciB,UAAU,CAACb,GAAG,CAACZ,IAAA,CAAKG,GAAG;MACvD,oBACED,IAAA,CAACP,eAAA;QACCC,MAAA,EAAQ4B,SAAA,EAAW5B,MAAA,IAAU;QAC7BC,UAAA,EAAYA,UAAA;QACZC,MAAA,EAAQA,MAAA;QACRC,OAAA,EAASyB,SAAA,EAAWzB,OAAA,IAAW;QAC/BC,IAAA,EAAMA;SACDA,IAAA,CAAKG,GAAG;IAGnB,KACA,MACHI,KAAA,GAAQE,YAAA,CAAaiB,QAAQ,CAACC,aAAa,EAAEC,MAAA,CAAOP,MAAA,GAAS,kBAC5DnB,IAAA,CAAC;MAAIiB,SAAA,EAAU;;KA3BZb,KAAA,CAAMH,GAAG;AA+BpB;AAEA,SAAS0B,cAAc;EACrBhC,UAAU;EACVC;AAAM,CAIP;EACC,MAAMgC,kBAAA,GAAqB9C,MAAA,CAA8B;EACzD,MAAM+C,yBAAA,GAA4BhD,OAAA,CAAQ,OAAO;IAAEiD,UAAA,EAAYF;EAAmB,IAAI,EAAE;EACxF,MAAM;IAAEG;EAAU,CAAE,GAAG7C,sBAAA;EACvB,MAAM;IAAE8C;EAAI,CAAE,GAAG7D,cAAA;EAEjBoB,4BAAA,CAA6BsC,yBAAA;EAE7B,MAAMI,QAAA,GAAWnD,MAAA,CAA8B;EAE/C,MAAM;IAAEyB;EAAY,CAAE,GAAGrB,sBAAA;EAEzB,MAAMoB,aAAA,GAAgBd,gBAAA,CAAiBI,MAAA,EAAQW,YAAA,EAAciB,QAAA,EAAUC,aAAA,EAAeC,MAAA;EAEtF,MAAMQ,oBAAA,GAAuBvD,WAAA,CAAY;IACvC,IAAIiD,kBAAA,EAAoBO,OAAA,EAAS;MAC/B,MAAMC,aAAA,GAAgBR,kBAAA,CAAmBO,OAAO,CAACE,KAAK,CAACC,OAAO,KAAK;MACnE,MAAMC,mBAAA,GAAsBX,kBAAA,CAAmBO,OAAO,CAACE,KAAK,CAACG,aAAa,KAAK;MAE/E,IAAI,CAACJ,aAAA,EAAe;QAClBR,kBAAA,CAAmBO,OAAO,CAACE,KAAK,CAACC,OAAO,GAAG;MAC7C;MACA,IAAI,CAACC,mBAAA,EAAqB;QACxBX,kBAAA,CAAmBO,OAAO,CAACE,KAAK,CAACG,aAAa,GAAG;MACnD;IACF;EACF,GAAG,CAACZ,kBAAA,CAAmB;EAEvB,MAAMa,iBAAA,GAAoB9D,WAAA,CACvB+D,CAAA;IACC,IAAId,kBAAA,EAAoBO,OAAA,KAAYO,CAAA,CAAEC,OAAO,KAAK,KAAKD,CAAA,CAAEC,OAAO,KAAK,IAAI;MACvE,MAAMP,eAAA,GAAgBR,kBAAA,CAAmBO,OAAO,CAACE,KAAK,CAACC,OAAO,KAAK;MACnE,MAAMC,qBAAA,GAAsBX,kBAAA,CAAmBO,OAAO,CAACE,KAAK,CAACG,aAAa,KAAK;MAC/E,IAAI,CAACJ,eAAA,IAAiB,CAACG,qBAAA,EAAqB;QAC1C;QACA,MAAMK,CAAA,GAAIF,CAAA,CAAEG,OAAO;QACnB,MAAMC,CAAA,GAAIJ,CAAA,CAAEK,OAAO;QACnB,MAAMC,iBAAA,GAAoBC,QAAA,CAASC,gBAAgB,CAACN,CAAA,EAAGE,CAAA;QACvD,IAAI,CAAClB,kBAAA,CAAmBO,OAAO,CAACgB,QAAQ,CAACH,iBAAA,GAAoB;UAC3D;UACAd,oBAAA;QACF;MACF;IACF;EACF,GACA,CAACA,oBAAA,CAAqB;EAGxB,MAAMkB,eAAA,GAAkBzE,WAAA,CAAY;IAClC,IAAIiD,kBAAA,EAAoBO,OAAA,EAAS;MAC/B,IAAIP,kBAAA,CAAmBO,OAAO,CAACE,KAAK,CAACC,OAAO,KAAK,KAAK;QACpDV,kBAAA,CAAmBO,OAAO,CAACE,KAAK,CAACC,OAAO,GAAG;MAC7C;MACA,IAAIV,kBAAA,CAAmBO,OAAO,CAACE,KAAK,CAACG,aAAa,KAAK,QAAQ;QAC7DZ,kBAAA,CAAmBO,OAAO,CAACE,KAAK,CAACG,aAAa,GAAG;MACnD;IACF;EACF,GAAG,EAAE;EAEL5D,SAAA,CAAU;IACRqE,QAAA,CAASI,gBAAgB,CAAC,aAAaZ,iBAAA;IACvCQ,QAAA,CAASI,gBAAgB,CAAC,WAAWD,eAAA;IAErC,OAAO;MACLH,QAAA,CAASK,mBAAmB,CAAC,aAAab,iBAAA;MAC1CQ,QAAA,CAASK,mBAAmB,CAAC,WAAWF,eAAA;IAC1C;EACF,GAAG,CAACxB,kBAAA,EAAoBa,iBAAA,EAAmBW,eAAA,CAAgB;EAE3D,MAAMG,gCAAA,GAAmC5E,WAAA,CAAY;IACnD,MAAM6E,SAAA,GAAYpF,aAAA;IAElB,MAAMqF,eAAA,GAAkBhF,eAAA,CAAgBmB,MAAA,CAAO8D,OAAO;IAEtD,IAAI9B,kBAAA,CAAmBO,OAAO,KAAK,MAAM;MACvC;IACF;IAEA,MAAMwB,kBAAA,GAAqBhE,UAAA,CAAWiE,aAAa,CAAC;IACpD,MAAMC,mBAAA,GACJF,kBAAA,KAAuB,QACvB,WAAWA,kBAAA,IACXA,kBAAA,EAAoBtB,KAAA,GAAQ,UAAmD,KAAK;IAEtF,MAAMyB,WAAA,GAAclE,MAAA,CAAOmE,cAAc;IACzC,IACEP,SAAA,KAAc,QACdC,eAAA,KAAoB,QACpB,CAACA,eAAA,CAAgBO,WAAW,IAC5BF,WAAA,KAAgB,QAChBA,WAAA,CAAYX,QAAQ,CAACM,eAAA,CAAgBQ,UAAU,GAC/C;MACA,MAAMC,SAAA,GAAY/E,eAAA,CAAgBsE,eAAA,EAAiBK,WAAA;MAEnD;MACA,MAAMK,eAAA,GAAkB/E,uBAAA,CAAwB;QAC9CgF,kBAAA,EAAoBP,mBAAA;QACpBlE,UAAA;QACA0E,YAAA,EAAczC,kBAAA,CAAmBO,OAAO;QACxCmC,kBAAA,EAAoB;QACpBC,UAAA,EAAYL;MACd;MAEA;MACA,IAAIjC,QAAA,CAASE,OAAO,EAAE;QACpB/C,uBAAA,CAAwB;UACtBO,UAAA,EAAYiC,kBAAA,CAAmBO,OAAO;UACtCqC,mBAAA,EAAqBL,eAAA;UACrBE,YAAA,EAAcpC,QAAA,CAASE,OAAO;UAC9BsC,gBAAA,EAAkB;UAClBH,kBAAA,EAAoB;UACpBI,uBAAA,EAAyB;UACzBH,UAAA,EAAYL,SAAA;UACZS,WAAA,EAAa;QACf;MACF;IACF,OAAO;MACLzC,oBAAA;IACF;EACF,GAAG,CAACtC,MAAA,EAAQsC,oBAAA,EAAsBvC,UAAA,CAAW;EAE7Cf,SAAA,CAAU;IACR,MAAMgG,YAAA,GAAejF,UAAA,CAAWkF,aAAa;IAE7C,MAAMC,MAAA,GAASA,CAAA;MACblF,MAAA,CAAOmF,cAAc,GAAGC,IAAI,CAAC;QAC3BzB,gCAAA;MACF;IACF;IAEA0B,MAAA,CAAO5B,gBAAgB,CAAC,UAAUyB,MAAA;IAClC,IAAIF,YAAA,EAAc;MAChBA,YAAA,CAAavB,gBAAgB,CAAC,UAAUyB,MAAA;IAC1C;IAEA,OAAO;MACLG,MAAA,CAAO3B,mBAAmB,CAAC,UAAUwB,MAAA;MACrC,IAAIF,YAAA,EAAc;QAChBA,YAAA,CAAatB,mBAAmB,CAAC,UAAUwB,MAAA;MAC7C;IACF;EACF,GAAG,CAAClF,MAAA,EAAQ2D,gCAAA,EAAkC5D,UAAA,CAAW;EAEzDf,SAAA,CAAU;IACRgB,MAAA,CAAOmF,cAAc,GAAGC,IAAI,CAAC;MAC3BzB,gCAAA;IACF;IACA,OAAOtF,aAAA,CACL2B,MAAA,CAAOsF,sBAAsB,CAAC,CAAC;MAAEC;IAAW,CAAE;MAC5CA,WAAA,CAAYH,IAAI,CAAC;QACfzB,gCAAA;MACF;IACF,IAEA3D,MAAA,CAAOwF,eAAe,CACpB1G,wBAAA,EACA;MACEH,SAAA,CAAU,MAAMqB,MAAA,CAAOoF,IAAI,CAAC,UAAUzB,gCAAA;MACtC,OAAO;IACT,GACA/E,oBAAA;EAGN,GAAG,CAACoB,MAAA,EAAQ2D,gCAAA,CAAiC;EAE7C,oBACEvC,KAAA,CAAC;IACC,cACE9C,cAAA,CAAe6D,UAAA,CAAWsD,KAAK,CAACC,KAAK,IAAIvD,UAAA,CAAWwD,IAAI,EAAEvD,IAAA,KAASD,UAAA,CAAWwD,IAAI;IAEpFtE,SAAA,EAAU;IACVuE,GAAA,EAAK5D,kBAAA;IACL6D,IAAA,EAAK;4BAELzF,IAAA,CAAC;MAAIiB,SAAA,EAAU;MAAQuE,GAAA,EAAKvD;QAC3B1B,YAAA,EAAciB,QAAA,IACbjB,YAAA,CAAaiB,QAAQ,EAAEC,aAAA,EAAeC,MAAA,CAAOL,GAAA,CAAI,CAACjB,KAAA,EAAOsF,CAAA;MACvD,oBACE1F,IAAA,CAACG,qBAAA;QACCR,UAAA,EAAYA,UAAA;QACZC,MAAA,EAAQA,MAAA;QACRQ,KAAA,EAAOA,KAAA;QACPC,KAAA,EAAOqF,CAAA;QAEPpF,aAAA,EAAeA;SADVF,KAAA,CAAMH,GAAG;IAIpB;;AAGR;AAEA,SAAA0F,iBAAA/F,MAAA,EAAAD,UAAA;EAAA,MAAAiG,CAAA,GAAA9H,EAAA;EAIE,OAAA+H,MAAA,EAAAC,SAAA,IAA4B/G,QAAA,MAAS;EACrC,MAAAgH,UAAA,GAAmB/H,kBAAA;EAAA,IAAAgI,EAAA;EAAA,IAAAJ,CAAA,QAAAhG,MAAA;IAEaoG,EAAA,GAAAA,CAAA;MAC9BpG,MAAA,CAAAmF,cAAA,CAAqB,EAAAC,IAAA;QAAA,IAEfpF,MAAA,CAAAqG,WAAA,CAAkB;UAAA;QAAA;QAGtB,MAAAzC,SAAA,GAAkBpF,aAAA;QAClB,MAAAqF,eAAA,GAAwBhF,eAAA,CAAgBmB,MAAA,CAAA8D,OAAc;QACtD,MAAAI,WAAA,GAAoBlE,MAAA,CAAAmE,cAAA,CAAqB;QAAA,IAGvCN,eAAA,SAAoB,KACnB,CAACpF,iBAAA,CAAkBmF,SAAA,KAClBM,WAAA,SAAgB,KACfA,WAAA,CAAAX,QAAA,CAAqBM,eAAA,CAAAQ,UAA0B;UAElD6B,SAAA,MAAU;UAAA;QAAA;QAAA,KAIPzH,iBAAA,CAAkBmF,SAAA;UAAA;QAAA;QAAA,IAInBA,SAAA,CAAA0C,cAAA,CAAwB,MAAO;UACjC,MAAAC,KAAA,GAAc3C,SAAA,CAAA4C,QAAA,CAAkB;UAChC,IAAAC,iBAAA;UAAwB,KACnB,MAAAC,IAAM,IAAQH,KAAA;YAAA,IACb7H,WAAA,CAAYgI,IAAA;cACdR,SAAA,KAAU;cACVO,iBAAA,CAAAA,CAAA,CAAAA,IAAA;cAAA;YAAA;UAAA;UAAA,KAICA,iBAAA;YACHP,SAAA,MAAU;UAAA;QAAA;UAGZA,SAAA,MAAU;QAAA;QAGZ,MAAAS,cAAA,GAAuB/C,SAAA,CAAA0C,cAAA,CAAwB,EAAAM,OAAA,QAAkB;QAAA,IAC7D,CAAChD,SAAA,CAAAQ,WAAA,CAAqB,KAAMuC,cAAA,KAAmB;UACjDT,SAAA,MAAU;UAAA;QAAA;MAAA,CAGd;IAAA;IACFF,CAAA,MAAAhG,MAAA;IAAAgG,CAAA,MAAAI,EAAA;EAAA;IAAAA,EAAA,GAAAJ,CAAA;EAAA;EA/CA,MAAAa,WAAA,GAAoBT,EA+CT;EAAA,IAAAU,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAf,CAAA,QAAAa,WAAA;IAEDC,EAAA,GAAAA,CAAA;MACRzD,QAAA,CAAAI,gBAAA,CAA0B,mBAAmBoD,WAAA;MAC7CxD,QAAA,CAAAI,gBAAA,CAA0B,WAAWoD,WAAA;MAAA;QAEnCxD,QAAA,CAAAK,mBAAA,CAA6B,mBAAmBmD,WAAA;QAChDxD,QAAA,CAAAK,mBAAA,CAA6B,WAAWmD,WAAA;MAAA;IAAA;IAEzCE,EAAA,IAACF,WAAA;IAAYb,CAAA,MAAAa,WAAA;IAAAb,CAAA,MAAAc,EAAA;IAAAd,CAAA,MAAAe,EAAA;EAAA;IAAAD,EAAA,GAAAd,CAAA;IAAAe,EAAA,GAAAf,CAAA;EAAA;EAPhBhH,SAAA,CAAU8H,EAOV,EAAGC,EAAa;EAAA,IAAAC,EAAA;EAAA,IAAAC,EAAA;EAAA,IAAAjB,CAAA,QAAAhG,MAAA,IAAAgG,CAAA,QAAAa,WAAA;IAENG,EAAA,GAAAA,CAAA,KACD3I,aAAA,CACL2B,MAAA,CAAAsF,sBAAA;MACEuB,WAAA;IAAA,CACF,GACA7G,MAAA,CAAAkH,oBAAA;MAAA,IACMlH,MAAA,CAAAmE,cAAA,CAAqB,UAAO;QAC9B+B,SAAA,MAAU;MAAA;IAAA,CAEd;IAEDe,EAAA,IAACjH,MAAA,EAAQ6G,WAAA;IAAYb,CAAA,MAAAhG,MAAA;IAAAgG,CAAA,MAAAa,WAAA;IAAAb,CAAA,MAAAgB,EAAA;IAAAhB,CAAA,MAAAiB,EAAA;EAAA;IAAAD,EAAA,GAAAhB,CAAA;IAAAiB,EAAA,GAAAjB,CAAA;EAAA;EAXxBhH,SAAA,CAAUgI,EAWV,EAAGC,EAAqB;EAAA,IAEpB,CAAChB,MAAA,KAAWE,UAAA;IAAA;EAAA;EAAA,IAAAgB,EAAA;EAAA,IAAAnB,CAAA,QAAAjG,UAAA,IAAAiG,CAAA,SAAAhG,MAAA;IAITmH,EAAA,GAAA9H,YAAA,CAAae,IAAA,CAAA2B,aAAA;MAAAhC,UAAA;MAAAC;IAAA,C,GAA2DD,UAAA;IAAAiG,CAAA,MAAAjG,UAAA;IAAAiG,CAAA,OAAAhG,MAAA;IAAAgG,CAAA,OAAAmB,EAAA;EAAA;IAAAA,EAAA,GAAAnB,CAAA;EAAA;EAAA,OAAxEmB,EAAwE;AAAA;AAGjF,OAAO,MAAMC,mBAAA,GAA4DhB,EAAA;EAAC;IAAArG;EAAA,IAAAqG,EAAc;EACtF,OAAApG,MAAA,IAAiB7B,yBAAA;EAAA,OAEV4H,gBAAA,CAAiB/F,MAAA,EAAQD,UAAA;AAAA,CAClC","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ import type { RefObject } from 'react';
2
+ export declare function useToolbarKeyboardNavigation({ toolbarRef, }: {
3
+ toolbarRef: RefObject<HTMLDivElement | null>;
4
+ }): void;
5
+ //# sourceMappingURL=useToolbarKeyboardNavigation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useToolbarKeyboardNavigation.d.ts","sourceRoot":"","sources":["../../../../src/features/toolbars/shared/useToolbarKeyboardNavigation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAItC,wBAAgB,4BAA4B,CAAC,EAC3C,UAAU,GACX,EAAE;IACD,UAAU,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;CAC7C,QAwFA"}
@@ -0,0 +1,79 @@
1
+ 'use client';
2
+
3
+ import { useEffect } from 'react';
4
+ export function useToolbarKeyboardNavigation({
5
+ toolbarRef
6
+ }) {
7
+ useEffect(() => {
8
+ const toolbar = toolbarRef.current;
9
+ if (!toolbar) {
10
+ return;
11
+ }
12
+ let activeButton;
13
+ const getButtons = () => Array.from(toolbar.querySelectorAll('button')).filter(button => !button.closest('[role="menu"]') && button.closest('[role="toolbar"]') === toolbar);
14
+ const updateTabStops = () => {
15
+ const buttons = getButtons();
16
+ const enabledButtons = buttons.filter(button_0 => !button_0.disabled);
17
+ if (!activeButton || !enabledButtons.includes(activeButton)) {
18
+ activeButton = enabledButtons[0];
19
+ }
20
+ for (const button_1 of buttons) {
21
+ button_1.tabIndex = button_1 === activeButton ? 0 : -1;
22
+ }
23
+ };
24
+ const handleFocus = event => {
25
+ const button_3 = getButtons().find(button_2 => button_2 === event.target);
26
+ if (button_3) {
27
+ activeButton = button_3;
28
+ updateTabStops();
29
+ }
30
+ };
31
+ const handleKeyDown = event_0 => {
32
+ if (event_0.altKey || event_0.ctrlKey || event_0.metaKey || event_0.shiftKey) {
33
+ return;
34
+ }
35
+ const buttons_0 = getButtons().filter(button_4 => !button_4.disabled);
36
+ const index = buttons_0.findIndex(button_5 => button_5 === event_0.target);
37
+ // Dropdown menus and custom inputs retain their own keyboard behavior.
38
+ if (index === -1) {
39
+ return;
40
+ }
41
+ const isRTL = getComputedStyle(toolbar).direction === 'rtl';
42
+ let nextIndex;
43
+ switch (event_0.key) {
44
+ case 'ArrowLeft':
45
+ nextIndex = index + (isRTL ? 1 : -1);
46
+ break;
47
+ case 'ArrowRight':
48
+ nextIndex = index + (isRTL ? -1 : 1);
49
+ break;
50
+ case 'End':
51
+ nextIndex = buttons_0.length - 1;
52
+ break;
53
+ case 'Home':
54
+ nextIndex = 0;
55
+ break;
56
+ default:
57
+ return;
58
+ }
59
+ event_0.preventDefault();
60
+ event_0.stopPropagation();
61
+ buttons_0[(nextIndex + buttons_0.length) % buttons_0.length]?.focus();
62
+ };
63
+ updateTabStops();
64
+ const observer = new MutationObserver(updateTabStops);
65
+ observer.observe(toolbar, {
66
+ attributeFilter: ['disabled'],
67
+ childList: true,
68
+ subtree: true
69
+ });
70
+ toolbar.addEventListener('focusin', handleFocus);
71
+ toolbar.addEventListener('keydown', handleKeyDown);
72
+ return () => {
73
+ observer.disconnect();
74
+ toolbar.removeEventListener('focusin', handleFocus);
75
+ toolbar.removeEventListener('keydown', handleKeyDown);
76
+ };
77
+ }, [toolbarRef]);
78
+ }
79
+ //# sourceMappingURL=useToolbarKeyboardNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useToolbarKeyboardNavigation.js","names":["useEffect","useToolbarKeyboardNavigation","toolbarRef","toolbar","current","activeButton","getButtons","Array","from","querySelectorAll","filter","button","closest","updateTabStops","buttons","enabledButtons","disabled","includes","tabIndex","handleFocus","event","find","target","handleKeyDown","altKey","ctrlKey","metaKey","shiftKey","index","findIndex","isRTL","getComputedStyle","direction","nextIndex","key","length","preventDefault","stopPropagation","focus","observer","MutationObserver","observe","attributeFilter","childList","subtree","addEventListener","disconnect","removeEventListener"],"sources":["../../../../src/features/toolbars/shared/useToolbarKeyboardNavigation.ts"],"sourcesContent":["'use client'\n\nimport type { RefObject } from 'react'\n\nimport { useEffect } from 'react'\n\nexport function useToolbarKeyboardNavigation({\n toolbarRef,\n}: {\n toolbarRef: RefObject<HTMLDivElement | null>\n}) {\n useEffect(() => {\n const toolbar = toolbarRef.current\n\n if (!toolbar) {\n return\n }\n\n let activeButton: HTMLButtonElement | undefined\n const getButtons = () =>\n Array.from(toolbar.querySelectorAll<HTMLButtonElement>('button')).filter(\n (button) =>\n !button.closest('[role=\"menu\"]') && button.closest('[role=\"toolbar\"]') === toolbar,\n )\n\n const updateTabStops = () => {\n const buttons = getButtons()\n const enabledButtons = buttons.filter((button) => !button.disabled)\n\n if (!activeButton || !enabledButtons.includes(activeButton)) {\n activeButton = enabledButtons[0]\n }\n\n for (const button of buttons) {\n button.tabIndex = button === activeButton ? 0 : -1\n }\n }\n\n const handleFocus = (event: FocusEvent) => {\n const button = getButtons().find((button) => button === event.target)\n\n if (button) {\n activeButton = button\n updateTabStops()\n }\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return\n }\n\n const buttons = getButtons().filter((button) => !button.disabled)\n const index = buttons.findIndex((button) => button === event.target)\n\n // Dropdown menus and custom inputs retain their own keyboard behavior.\n if (index === -1) {\n return\n }\n\n const isRTL = getComputedStyle(toolbar).direction === 'rtl'\n let nextIndex: number\n\n switch (event.key) {\n case 'ArrowLeft':\n nextIndex = index + (isRTL ? 1 : -1)\n break\n case 'ArrowRight':\n nextIndex = index + (isRTL ? -1 : 1)\n break\n case 'End':\n nextIndex = buttons.length - 1\n break\n case 'Home':\n nextIndex = 0\n break\n default:\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n buttons[(nextIndex + buttons.length) % buttons.length]?.focus()\n }\n\n updateTabStops()\n const observer = new MutationObserver(updateTabStops)\n\n observer.observe(toolbar, { attributeFilter: ['disabled'], childList: true, subtree: true })\n toolbar.addEventListener('focusin', handleFocus)\n toolbar.addEventListener('keydown', handleKeyDown)\n\n return () => {\n observer.disconnect()\n toolbar.removeEventListener('focusin', handleFocus)\n toolbar.removeEventListener('keydown', handleKeyDown)\n }\n }, [toolbarRef])\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"UploadNode.d.ts","sourceRoot":"","sources":["../../../../../src/features/upload/client/nodes/UploadNode.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACzF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAMhC,OAAO,KAAK,EAAuB,oBAAoB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAOnE,qBAAa,UAAW,SAAQ,gBAAgB;IAC9C,OAAgB,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAE9D;IAED,OAAgB,OAAO,IAAI,MAAM,CAEhC;IAED,OAAgB,SAAS,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAO9D;IAED,OAAgB,UAAU,CAAC,cAAc,EAAE,oBAAoB,GAAG,UAAU,CAqB3E;IAEQ,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,GAAG,CAAC,OAAO,CAY5E;IAEQ,UAAU,IAAI,oBAAoB,CAE1C;CACF;AAED,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,GACL,EAAE;IACD,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAA;CAC/D,GAAG,UAAU,CAMb;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,UAAU,CAEtF"}
1
+ {"version":3,"file":"UploadNode.d.ts","sourceRoot":"","sources":["../../../../../src/features/upload/client/nodes/UploadNode.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACzF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAMhC,OAAO,KAAK,EAAuB,oBAAoB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAGnG,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AAOnE,qBAAa,UAAW,SAAQ,gBAAgB;IAC9C,OAAgB,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAE9D;IAED,OAAgB,OAAO,IAAI,MAAM,CAEhC;IAED,OAAgB,SAAS,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAO9D;IAED,OAAgB,UAAU,CAAC,cAAc,EAAE,oBAAoB,GAAG,UAAU,CAa3E;IAEQ,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,YAAY,GAAG,GAAG,CAAC,OAAO,CAY5E;IAEQ,UAAU,IAAI,oBAAoB,CAE1C;CACF;AAED,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,GACL,EAAE;IACD,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAA;CAC/D,GAAG,UAAU,CAMb;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,UAAU,CAEtF"}
@@ -26,13 +26,6 @@ export class UploadNode extends UploadServerNode {
26
26
  };
27
27
  }
28
28
  static importJSON(serializedNode) {
29
- if (serializedNode.version === 1 && serializedNode?.value?.id) {
30
- serializedNode.value = serializedNode.value.id;
31
- }
32
- if (serializedNode.version === 2 && !serializedNode?.id) {
33
- serializedNode.id = new ObjectID.default().toHexString();
34
- serializedNode.version = 3;
35
- }
36
29
  const importedData = {
37
30
  id: serializedNode.id,
38
31
  fields: serializedNode.fields,
@@ -1 +1 @@
1
- {"version":3,"file":"UploadNode.js","names":["ObjectID","$applyNodeReplacement","React","$convertUploadElement","UploadServerNode","PendingUploadComponent","RawUploadComponent","lazy","then","module","default","UploadComponent","UploadNode","clone","node","getType","importDOM","img","conversion","domNode","$createUploadNode","priority","importJSON","serializedNode","version","value","id","toHexString","importedData","fields","pending","relationTo","data","setFormat","format","decorate","editor","config","__data","_jsx","className","theme","upload","__format","nodeKey","getKey","exportJSON","$isUploadNode"],"sources":["../../../../../src/features/upload/client/nodes/UploadNode.tsx"],"sourcesContent":["'use client'\nimport type { DOMConversionMap, EditorConfig, LexicalEditor, LexicalNode } from 'lexical'\nimport type { JSX } from 'react'\n\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\nimport * as React from 'react'\n\nimport type { Internal_UploadData, SerializedUploadNode, UploadData } from '../../server/schema.js'\n\nimport { $convertUploadElement } from '../../server/nodes/conversions.js'\nimport { UploadServerNode } from '../../server/nodes/UploadNode.js'\nimport { PendingUploadComponent } from '../component/pending/index.js'\n\nconst RawUploadComponent = React.lazy(() =>\n import('../../client/component/index.js').then((module) => ({ default: module.UploadComponent })),\n)\n\nexport class UploadNode extends UploadServerNode {\n static override clone(node: UploadServerNode): UploadServerNode {\n return super.clone(node)\n }\n\n static override getType(): string {\n return super.getType()\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: (domNode) => $convertUploadElement(domNode, $createUploadNode),\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n if (serializedNode.version === 2 && !serializedNode?.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n\n const importedData: Internal_UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n pending: (serializedNode as Internal_UploadData).pending,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n override decorate(editor?: LexicalEditor, config?: EditorConfig): JSX.Element {\n if ((this.__data as Internal_UploadData).pending) {\n return <PendingUploadComponent />\n }\n return (\n <RawUploadComponent\n className={config?.theme?.upload ?? 'LexicalEditorTheme__upload'}\n data={this.__data}\n format={this.__format}\n nodeKey={this.getKey()}\n />\n )\n }\n\n override exportJSON(): SerializedUploadNode {\n return super.exportJSON()\n }\n}\n\nexport function $createUploadNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n\n return $applyNodeReplacement(new UploadNode({ data: data as UploadData }))\n}\n\nexport function $isUploadNode(node: LexicalNode | null | undefined): node is UploadNode {\n return node instanceof UploadNode\n}\n"],"mappings":"AAAA;;;AAIA,OAAOA,QAAA,MAAc;AACrB,SAASC,qBAAqB,QAAQ;AACtC,YAAYC,KAAA,MAAW;AAIvB,SAASC,qBAAqB,QAAQ;AACtC,SAASC,gBAAgB,QAAQ;AACjC,SAASC,sBAAsB,QAAQ;AAEvC,MAAMC,kBAAA,gBAAqBJ,KAAA,CAAMK,IAAI,CAAC,MACpC,MAAM,CAAC,mCAAmCC,IAAI,CAAEC,MAAA,KAAY;EAAEC,OAAA,EAASD,MAAA,CAAOE;AAAgB;AAGhG,OAAO,MAAMC,UAAA,SAAmBR,gBAAA;EAC9B,OAAgBS,MAAMC,IAAsB,EAAoB;IAC9D,OAAO,KAAK,CAACD,KAAA,CAAMC,IAAA;EACrB;EAEA,OAAgBC,QAAA,EAAkB;IAChC,OAAO,KAAK,CAACA,OAAA;EACf;EAEA,OAAgBC,UAAA,EAAgD;IAC9D,OAAO;MACLC,GAAA,EAAMH,IAAA,KAAU;QACdI,UAAA,EAAaC,OAAA,IAAYhB,qBAAA,CAAsBgB,OAAA,EAASC,iBAAA;QACxDC,QAAA,EAAU;MACZ;IACF;EACF;EAEA,OAAgBC,WAAWC,cAAoC,EAAc;IAC3E,IAAIA,cAAA,CAAeC,OAAO,KAAK,KAAMD,cAAA,EAAgBE,KAAA,EAAqCC,EAAA,EAAI;MAC5FH,cAAA,CAAeE,KAAK,GAAGF,cAAC,CAAeE,KAAK,CAA+BC,EAAE;IAC/E;IACA,IAAIH,cAAA,CAAeC,OAAO,KAAK,KAAK,CAACD,cAAA,EAAgBG,EAAA,EAAI;MACvDH,cAAA,CAAeG,EAAE,GAAG,IAAI1B,QAAA,CAASU,OAAO,GAAGiB,WAAW;MACtDJ,cAAA,CAAeC,OAAO,GAAG;IAC3B;IAEA,MAAMI,YAAA,GAAoC;MACxCF,EAAA,EAAIH,cAAA,CAAeG,EAAE;MACrBG,MAAA,EAAQN,cAAA,CAAeM,MAAM;MAC7BC,OAAA,EAASP,cAAC,CAAuCO,OAAO;MACxDC,UAAA,EAAYR,cAAA,CAAeQ,UAAU;MACrCN,KAAA,EAAOF,cAAA,CAAeE;IACxB;IAEA,MAAMX,IAAA,GAAOM,iBAAA,CAAkB;MAAEY,IAAA,EAAMJ;IAAa;IACpDd,IAAA,CAAKmB,SAAS,CAACV,cAAA,CAAeW,MAAM;IAEpC,OAAOpB,IAAA;EACT;EAESqB,SAASC,MAAsB,EAAEC,MAAqB,EAAe;IAC5E,IAAI,IAAK,CAACC,MAAM,CAAyBR,OAAO,EAAE;MAChD,oBAAOS,IAAA,CAAClC,sBAAA;IACV;IACA,oBACEkC,IAAA,CAACjC,kBAAA;MACCkC,SAAA,EAAWH,MAAA,EAAQI,KAAA,EAAOC,MAAA,IAAU;MACpCV,IAAA,EAAM,IAAI,CAACM,MAAM;MACjBJ,MAAA,EAAQ,IAAI,CAACS,QAAQ;MACrBC,OAAA,EAAS,IAAI,CAACC,MAAM;;EAG1B;EAESC,WAAA,EAAmC;IAC1C,OAAO,KAAK,CAACA,UAAA;EACf;AACF;AAEA,OAAO,SAAS1B,kBAAkB;EAChCY;AAAI,CAGL;EACC,IAAI,CAACA,IAAA,EAAMN,EAAA,EAAI;IACbM,IAAA,CAAKN,EAAE,GAAG,IAAI1B,QAAA,CAASU,OAAO,GAAGiB,WAAW;EAC9C;EAEA,OAAO1B,qBAAA,CAAsB,IAAIW,UAAA,CAAW;IAAEoB,IAAA,EAAMA;EAAmB;AACzE;AAEA,OAAO,SAASe,cAAcjC,IAAoC;EAChE,OAAOA,IAAA,YAAgBF,UAAA;AACzB","ignoreList":[]}
1
+ {"version":3,"file":"UploadNode.js","names":["ObjectID","$applyNodeReplacement","React","$convertUploadElement","UploadServerNode","PendingUploadComponent","RawUploadComponent","lazy","then","module","default","UploadComponent","UploadNode","clone","node","getType","importDOM","img","conversion","domNode","$createUploadNode","priority","importJSON","serializedNode","importedData","id","fields","pending","relationTo","value","data","setFormat","format","decorate","editor","config","__data","_jsx","className","theme","upload","__format","nodeKey","getKey","exportJSON","toHexString","$isUploadNode"],"sources":["../../../../../src/features/upload/client/nodes/UploadNode.tsx"],"sourcesContent":["'use client'\nimport type { DOMConversionMap, EditorConfig, LexicalEditor, LexicalNode } from 'lexical'\nimport type { JSX } from 'react'\n\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\nimport * as React from 'react'\n\nimport type { Internal_UploadData, SerializedUploadNode, UploadData } from '../../server/schema.js'\n\nimport { $convertUploadElement } from '../../server/nodes/conversions.js'\nimport { UploadServerNode } from '../../server/nodes/UploadNode.js'\nimport { PendingUploadComponent } from '../component/pending/index.js'\n\nconst RawUploadComponent = React.lazy(() =>\n import('../../client/component/index.js').then((module) => ({ default: module.UploadComponent })),\n)\n\nexport class UploadNode extends UploadServerNode {\n static override clone(node: UploadServerNode): UploadServerNode {\n return super.clone(node)\n }\n\n static override getType(): string {\n return super.getType()\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: (domNode) => $convertUploadElement(domNode, $createUploadNode),\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadNode {\n const importedData: Internal_UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n pending: (serializedNode as Internal_UploadData).pending,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n override decorate(editor?: LexicalEditor, config?: EditorConfig): JSX.Element {\n if ((this.__data as Internal_UploadData).pending) {\n return <PendingUploadComponent />\n }\n return (\n <RawUploadComponent\n className={config?.theme?.upload ?? 'LexicalEditorTheme__upload'}\n data={this.__data}\n format={this.__format}\n nodeKey={this.getKey()}\n />\n )\n }\n\n override exportJSON(): SerializedUploadNode {\n return super.exportJSON()\n }\n}\n\nexport function $createUploadNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n\n return $applyNodeReplacement(new UploadNode({ data: data as UploadData }))\n}\n\nexport function $isUploadNode(node: LexicalNode | null | undefined): node is UploadNode {\n return node instanceof UploadNode\n}\n"],"mappings":"AAAA;;;AAIA,OAAOA,QAAA,MAAc;AACrB,SAASC,qBAAqB,QAAQ;AACtC,YAAYC,KAAA,MAAW;AAIvB,SAASC,qBAAqB,QAAQ;AACtC,SAASC,gBAAgB,QAAQ;AACjC,SAASC,sBAAsB,QAAQ;AAEvC,MAAMC,kBAAA,gBAAqBJ,KAAA,CAAMK,IAAI,CAAC,MACpC,MAAM,CAAC,mCAAmCC,IAAI,CAAEC,MAAA,KAAY;EAAEC,OAAA,EAASD,MAAA,CAAOE;AAAgB;AAGhG,OAAO,MAAMC,UAAA,SAAmBR,gBAAA;EAC9B,OAAgBS,MAAMC,IAAsB,EAAoB;IAC9D,OAAO,KAAK,CAACD,KAAA,CAAMC,IAAA;EACrB;EAEA,OAAgBC,QAAA,EAAkB;IAChC,OAAO,KAAK,CAACA,OAAA;EACf;EAEA,OAAgBC,UAAA,EAAgD;IAC9D,OAAO;MACLC,GAAA,EAAMH,IAAA,KAAU;QACdI,UAAA,EAAaC,OAAA,IAAYhB,qBAAA,CAAsBgB,OAAA,EAASC,iBAAA;QACxDC,QAAA,EAAU;MACZ;IACF;EACF;EAEA,OAAgBC,WAAWC,cAAoC,EAAc;IAC3E,MAAMC,YAAA,GAAoC;MACxCC,EAAA,EAAIF,cAAA,CAAeE,EAAE;MACrBC,MAAA,EAAQH,cAAA,CAAeG,MAAM;MAC7BC,OAAA,EAASJ,cAAC,CAAuCI,OAAO;MACxDC,UAAA,EAAYL,cAAA,CAAeK,UAAU;MACrCC,KAAA,EAAON,cAAA,CAAeM;IACxB;IAEA,MAAMf,IAAA,GAAOM,iBAAA,CAAkB;MAAEU,IAAA,EAAMN;IAAa;IACpDV,IAAA,CAAKiB,SAAS,CAACR,cAAA,CAAeS,MAAM;IAEpC,OAAOlB,IAAA;EACT;EAESmB,SAASC,MAAsB,EAAEC,MAAqB,EAAe;IAC5E,IAAI,IAAK,CAACC,MAAM,CAAyBT,OAAO,EAAE;MAChD,oBAAOU,IAAA,CAAChC,sBAAA;IACV;IACA,oBACEgC,IAAA,CAAC/B,kBAAA;MACCgC,SAAA,EAAWH,MAAA,EAAQI,KAAA,EAAOC,MAAA,IAAU;MACpCV,IAAA,EAAM,IAAI,CAACM,MAAM;MACjBJ,MAAA,EAAQ,IAAI,CAACS,QAAQ;MACrBC,OAAA,EAAS,IAAI,CAACC,MAAM;;EAG1B;EAESC,WAAA,EAAmC;IAC1C,OAAO,KAAK,CAACA,UAAA;EACf;AACF;AAEA,OAAO,SAASxB,kBAAkB;EAChCU;AAAI,CAGL;EACC,IAAI,CAACA,IAAA,EAAML,EAAA,EAAI;IACbK,IAAA,CAAKL,EAAE,GAAG,IAAIzB,QAAA,CAASU,OAAO,GAAGmC,WAAW;EAC9C;EAEA,OAAO5C,qBAAA,CAAsB,IAAIW,UAAA,CAAW;IAAEkB,IAAA,EAAMA;EAAmB;AACzE;AAEA,OAAO,SAASgB,cAAchC,IAAoC;EAChE,OAAOA,IAAA,YAAgBF,UAAA;AACzB","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import type { CollectionSlug, Field, UploadCollectionSlug } from 'payload';
2
2
  import type { UploadFeaturePropsClient } from '../client/index.js';
3
- export type { Internal_UploadData, SerializedUploadNode, UploadData, UploadDataImproved, } from './schema.js';
3
+ export type { Internal_UploadData, SerializedUploadNode, UploadData } from './schema.js';
4
4
  export type ExclusiveUploadFeatureProps = {
5
5
  /**
6
6
  * The collections that should be disabled. Overrides the `enableRichTextRelationship` property in the collection config.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAU,KAAK,EAAkB,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAIlG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAalE,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,kBAAkB,GACnB,MAAM,aAAa,CAAA;AAEpB,MAAM,MAAM,2BAA2B,GACnC;IACE;;;QAGI;IACJ,mBAAmB,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAG5C,kBAAkB,CAAC,EAAE,KAAK,CAAA;CAC3B,GACD;IAEE,mBAAmB,CAAC,EAAE,KAAK,CAAA;IAE3B;;;QAGI;IACJ,kBAAkB,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAC5C,CAAA;AAEL,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE;QACZ,CAAC,UAAU,EAAE,oBAAoB,GAAG;YAClC,MAAM,EAAE,KAAK,EAAE,CAAA;SAChB,CAAA;KACF,CAAA;IACD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,2BAA2B,CAAA;AAE/B,MAAM,MAAM,wBAAwB,GAAG;IACrC,gEAAgE;IAChE,sBAAsB,EAAE,cAAc,EAAE,CAAA;CACzC,GAAG,kBAAkB,CAAA;AAEtB,eAAO,MAAM,aAAa,sIA6JxB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAU,KAAK,EAAkB,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAIlG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAalE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExF,MAAM,MAAM,2BAA2B,GACnC;IACE;;;QAGI;IACJ,mBAAmB,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAG5C,kBAAkB,CAAC,EAAE,KAAK,CAAA;CAC3B,GACD;IAEE,mBAAmB,CAAC,EAAE,KAAK,CAAA;IAE3B;;;QAGI;IACJ,kBAAkB,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAC5C,CAAA;AAEL,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE;QACZ,CAAC,UAAU,EAAE,oBAAoB,GAAG;YAClC,MAAM,EAAE,KAAK,EAAE,CAAA;SAChB,CAAA;KACF,CAAA;IACD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,2BAA2B,CAAA;AAE/B,MAAM,MAAM,wBAAwB,GAAG;IACrC,gEAAgE;IAChE,sBAAsB,EAAE,cAAc,EAAE,CAAA;CACzC,GAAG,kBAAkB,CAAA;AAEtB,eAAO,MAAM,aAAa,sIA6JxB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["sanitizeFields","populate","createServerFeature","filterEnabledRelationshipCollections","createNode","uploadPopulationPromiseHOC","i18n","PAYLOAD_UPLOAD","UploadServerNode","createUploadNodeJSONSchema","uploadValidation","UploadFeature","feature","config","_config","isRoot","parentIsLocalized","props","unsanitizedProps","collections","enabledCollectionSlugs","uploads","map","slug","clientProps","collection","hasExtraFields","fields","length","validRelationships","c","collectionKey","requireFieldLevelRichTextEditor","ClientFeature","clientFeatureProps","generateSchemaMap","schemaMap","Map","set","markdownTransformers","nodes","getSubFields","node","req","allSubFields","collectionFields","concat","includes","relationTo","payload","collectionFieldSchema","Array","isArray","getSubFieldsData","graphQLPopulationPromises","hooks","afterRead","currentDepth","depth","draft","overrideAccess","populateArg","populationPromises","showHiddenFields","value","id","populateDepth","maxDepth","undefined","push","collectionSlug","data","key","select","defaultPopulate","jsonSchema","validations","sanitizedServerFeatureProps"],"sources":["../../../../src/features/upload/server/index.ts"],"sourcesContent":["import type { CollectionSlug, Config, Field, FieldSchemaMap, UploadCollectionSlug } from 'payload'\n\nimport { sanitizeFields } from 'payload'\n\nimport type { UploadFeaturePropsClient } from '../client/index.js'\n\nimport { populate } from '../../../populateGraphQL/populate.js'\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { filterEnabledRelationshipCollections } from '../../relationship/shared/filterEnabledRelationshipCollections.js'\nimport { createNode } from '../../typeUtilities.js'\nimport { uploadPopulationPromiseHOC } from './graphQLPopulationPromise.js'\nimport { i18n } from './i18n.js'\nimport { PAYLOAD_UPLOAD } from './markdownTransformer.js'\nimport { UploadServerNode } from './nodes/UploadNode.js'\nimport { createUploadNodeJSONSchema } from './schema.js'\nimport { uploadValidation } from './validate.js'\n\nexport type {\n Internal_UploadData,\n SerializedUploadNode,\n UploadData,\n UploadDataImproved,\n} from './schema.js'\n\nexport type ExclusiveUploadFeatureProps =\n | {\n /**\n * The collections that should be disabled. Overrides the `enableRichTextRelationship` property in the collection config.\n * When this property is set, `enabledCollections` will not be available.\n **/\n disabledCollections?: UploadCollectionSlug[]\n\n // Ensures that enabledCollections is not available when disabledCollections is set\n enabledCollections?: never\n }\n | {\n // Ensures that disabledCollections is not available when enabledCollections is set\n disabledCollections?: never\n\n /**\n * The collections that should be enabled. Overrides the `enableRichTextRelationship` property in the collection config\n * When this property is set, `disabledCollections` will not be available.\n **/\n enabledCollections?: UploadCollectionSlug[]\n }\n\nexport type UploadFeatureProps = {\n collections?: {\n [collection: UploadCollectionSlug]: {\n fields: Field[]\n }\n }\n /**\n * Sets a maximum population depth for this upload (not the fields for this upload), regardless of the remaining depth when the respective field is reached.\n * This behaves exactly like the maxDepth properties of relationship and upload fields.\n *\n * {@link https://payloadcms.com/docs/getting-started/concepts#field-level-max-depth}\n */\n maxDepth?: number\n} & ExclusiveUploadFeatureProps\n\nexport type UploadFeatureServerProps = {\n /** Collection policy resolved during feature initialization. */\n enabledCollectionSlugs: CollectionSlug[]\n} & UploadFeatureProps\n\nexport const UploadFeature = createServerFeature<\n UploadFeatureProps,\n UploadFeatureServerProps,\n UploadFeaturePropsClient\n>({\n feature: ({ config: _config, isRoot, parentIsLocalized, props: unsanitizedProps }) => {\n const props: UploadFeatureServerProps = {\n ...unsanitizedProps,\n collections: unsanitizedProps?.collections ?? {},\n enabledCollectionSlugs: filterEnabledRelationshipCollections(_config.collections, {\n ...unsanitizedProps,\n uploads: true,\n }).map(({ slug }) => slug),\n }\n\n const clientProps: UploadFeaturePropsClient = {\n collections: {},\n enabledCollectionSlugs: props.enabledCollectionSlugs,\n }\n\n if (props.collections) {\n for (const collection in props.collections) {\n clientProps.collections[collection] = {\n hasExtraFields: props.collections[collection]!.fields.length >= 1,\n }\n }\n }\n\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n collection.fields = sanitizeFields({\n config: _config as unknown as Config,\n fields: collection.fields,\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n }\n }\n\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#UploadFeatureClient',\n clientFeatureProps: clientProps,\n generateSchemaMap: ({ props }) => {\n if (!props?.collections) {\n return null\n }\n\n const schemaMap: FieldSchemaMap = new Map()\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n schemaMap.set(collectionKey, {\n fields: collection.fields,\n })\n }\n }\n\n return schemaMap\n },\n i18n,\n markdownTransformers: [PAYLOAD_UPLOAD],\n nodes: [\n createNode({\n getSubFields: ({ node, req }) => {\n if (!node) {\n let allSubFields: Field[] = []\n for (const collection in props?.collections) {\n const collectionFields = props.collections[collection]!.fields\n allSubFields = allSubFields.concat(collectionFields)\n }\n return allSubFields\n }\n if (!props.enabledCollectionSlugs.includes(node.relationTo)) {\n return null\n }\n const collection = req ? req.payload.collections[node?.relationTo] : null\n\n if (collection) {\n const collectionFieldSchema = props?.collections?.[node?.relationTo]?.fields\n\n if (Array.isArray(collectionFieldSchema)) {\n if (!collectionFieldSchema?.length) {\n return null\n }\n return collectionFieldSchema\n }\n }\n return null\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [uploadPopulationPromiseHOC(props)],\n hooks: {\n afterRead: [\n ({\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n populateArg,\n populationPromises,\n req,\n showHiddenFields,\n }) => {\n if (!node?.value || !props.enabledCollectionSlugs.includes(node.relationTo)) {\n return node\n }\n const collection = req.payload.collections[node?.relationTo]\n\n if (!collection) {\n return node\n }\n const id =\n typeof node?.value === 'object' && node.value !== null && 'id' in node.value\n ? node.value.id\n : node?.value // for backwards-compatibility\n\n const populateDepth =\n props?.maxDepth !== undefined && props?.maxDepth < depth ? props?.maxDepth : depth\n\n populationPromises.push(\n populate({\n id,\n collectionSlug: collection.config.slug,\n currentDepth,\n data: node,\n depth: populateDepth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n select:\n populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,\n showHiddenFields,\n }),\n )\n\n return node\n },\n ],\n },\n jsonSchema: createUploadNodeJSONSchema(props),\n node: UploadServerNode,\n validations: [uploadValidation(props)],\n }),\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'upload',\n})\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["sanitizeFields","populate","createServerFeature","filterEnabledRelationshipCollections","createNode","uploadPopulationPromiseHOC","i18n","PAYLOAD_UPLOAD","UploadServerNode","createUploadNodeJSONSchema","uploadValidation","UploadFeature","feature","config","_config","isRoot","parentIsLocalized","props","unsanitizedProps","collections","enabledCollectionSlugs","uploads","map","slug","clientProps","collection","hasExtraFields","fields","length","validRelationships","c","collectionKey","requireFieldLevelRichTextEditor","ClientFeature","clientFeatureProps","generateSchemaMap","schemaMap","Map","set","markdownTransformers","nodes","getSubFields","node","req","allSubFields","collectionFields","concat","includes","relationTo","payload","collectionFieldSchema","Array","isArray","getSubFieldsData","graphQLPopulationPromises","hooks","afterRead","currentDepth","depth","draft","overrideAccess","populateArg","populationPromises","showHiddenFields","value","id","populateDepth","maxDepth","undefined","push","collectionSlug","data","key","select","defaultPopulate","jsonSchema","validations","sanitizedServerFeatureProps"],"sources":["../../../../src/features/upload/server/index.ts"],"sourcesContent":["import type { CollectionSlug, Config, Field, FieldSchemaMap, UploadCollectionSlug } from 'payload'\n\nimport { sanitizeFields } from 'payload'\n\nimport type { UploadFeaturePropsClient } from '../client/index.js'\n\nimport { populate } from '../../../populateGraphQL/populate.js'\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { filterEnabledRelationshipCollections } from '../../relationship/shared/filterEnabledRelationshipCollections.js'\nimport { createNode } from '../../typeUtilities.js'\nimport { uploadPopulationPromiseHOC } from './graphQLPopulationPromise.js'\nimport { i18n } from './i18n.js'\nimport { PAYLOAD_UPLOAD } from './markdownTransformer.js'\nimport { UploadServerNode } from './nodes/UploadNode.js'\nimport { createUploadNodeJSONSchema } from './schema.js'\nimport { uploadValidation } from './validate.js'\n\nexport type { Internal_UploadData, SerializedUploadNode, UploadData } from './schema.js'\n\nexport type ExclusiveUploadFeatureProps =\n | {\n /**\n * The collections that should be disabled. Overrides the `enableRichTextRelationship` property in the collection config.\n * When this property is set, `enabledCollections` will not be available.\n **/\n disabledCollections?: UploadCollectionSlug[]\n\n // Ensures that enabledCollections is not available when disabledCollections is set\n enabledCollections?: never\n }\n | {\n // Ensures that disabledCollections is not available when enabledCollections is set\n disabledCollections?: never\n\n /**\n * The collections that should be enabled. Overrides the `enableRichTextRelationship` property in the collection config\n * When this property is set, `disabledCollections` will not be available.\n **/\n enabledCollections?: UploadCollectionSlug[]\n }\n\nexport type UploadFeatureProps = {\n collections?: {\n [collection: UploadCollectionSlug]: {\n fields: Field[]\n }\n }\n /**\n * Sets a maximum population depth for this upload (not the fields for this upload), regardless of the remaining depth when the respective field is reached.\n * This behaves exactly like the maxDepth properties of relationship and upload fields.\n *\n * {@link https://payloadcms.com/docs/getting-started/concepts#field-level-max-depth}\n */\n maxDepth?: number\n} & ExclusiveUploadFeatureProps\n\nexport type UploadFeatureServerProps = {\n /** Collection policy resolved during feature initialization. */\n enabledCollectionSlugs: CollectionSlug[]\n} & UploadFeatureProps\n\nexport const UploadFeature = createServerFeature<\n UploadFeatureProps,\n UploadFeatureServerProps,\n UploadFeaturePropsClient\n>({\n feature: ({ config: _config, isRoot, parentIsLocalized, props: unsanitizedProps }) => {\n const props: UploadFeatureServerProps = {\n ...unsanitizedProps,\n collections: unsanitizedProps?.collections ?? {},\n enabledCollectionSlugs: filterEnabledRelationshipCollections(_config.collections, {\n ...unsanitizedProps,\n uploads: true,\n }).map(({ slug }) => slug),\n }\n\n const clientProps: UploadFeaturePropsClient = {\n collections: {},\n enabledCollectionSlugs: props.enabledCollectionSlugs,\n }\n\n if (props.collections) {\n for (const collection in props.collections) {\n clientProps.collections[collection] = {\n hasExtraFields: props.collections[collection]!.fields.length >= 1,\n }\n }\n }\n\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n collection.fields = sanitizeFields({\n config: _config as unknown as Config,\n fields: collection.fields,\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n }\n }\n\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#UploadFeatureClient',\n clientFeatureProps: clientProps,\n generateSchemaMap: ({ props }) => {\n if (!props?.collections) {\n return null\n }\n\n const schemaMap: FieldSchemaMap = new Map()\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n schemaMap.set(collectionKey, {\n fields: collection.fields,\n })\n }\n }\n\n return schemaMap\n },\n i18n,\n markdownTransformers: [PAYLOAD_UPLOAD],\n nodes: [\n createNode({\n getSubFields: ({ node, req }) => {\n if (!node) {\n let allSubFields: Field[] = []\n for (const collection in props?.collections) {\n const collectionFields = props.collections[collection]!.fields\n allSubFields = allSubFields.concat(collectionFields)\n }\n return allSubFields\n }\n if (!props.enabledCollectionSlugs.includes(node.relationTo)) {\n return null\n }\n const collection = req ? req.payload.collections[node?.relationTo] : null\n\n if (collection) {\n const collectionFieldSchema = props?.collections?.[node?.relationTo]?.fields\n\n if (Array.isArray(collectionFieldSchema)) {\n if (!collectionFieldSchema?.length) {\n return null\n }\n return collectionFieldSchema\n }\n }\n return null\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [uploadPopulationPromiseHOC(props)],\n hooks: {\n afterRead: [\n ({\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n populateArg,\n populationPromises,\n req,\n showHiddenFields,\n }) => {\n if (!node?.value || !props.enabledCollectionSlugs.includes(node.relationTo)) {\n return node\n }\n const collection = req.payload.collections[node?.relationTo]\n\n if (!collection) {\n return node\n }\n const id =\n typeof node?.value === 'object' && node.value !== null && 'id' in node.value\n ? node.value.id\n : node?.value // for backwards-compatibility\n\n const populateDepth =\n props?.maxDepth !== undefined && props?.maxDepth < depth ? props?.maxDepth : depth\n\n populationPromises.push(\n populate({\n id,\n collectionSlug: collection.config.slug,\n currentDepth,\n data: node,\n depth: populateDepth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n select:\n populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,\n showHiddenFields,\n }),\n )\n\n return node\n },\n ],\n },\n jsonSchema: createUploadNodeJSONSchema(props),\n node: UploadServerNode,\n validations: [uploadValidation(props)],\n }),\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'upload',\n})\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"UploadNode.d.ts","sourceRoot":"","sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,OAAO,EACR,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAA;AAKhF,OAAO,KAAK,EAAuB,oBAAoB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAIzF,qBAAa,gBAAiB,SAAQ,kBAAkB;IACtD,MAAM,EAAE,UAAU,CAAA;IAElB,YAAY,EACV,IAAI,EACJ,MAAM,EACN,GAAG,GACJ,EAAE;QACD,IAAI,EAAE,UAAU,CAAA;QAChB,MAAM,CAAC,EAAE,iBAAiB,CAAA;QAC1B,GAAG,CAAC,EAAE,OAAO,CAAA;KACd,EAGA;IAED,OAAgB,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAM9D;IAED,OAAgB,OAAO,IAAI,MAAM,CAEhC;IAED,OAAgB,SAAS,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAO9D;IAED,OAAgB,UAAU,CAAC,cAAc,EAAE,oBAAoB,GAAG,gBAAgB,CAqBjF;IAED,MAAM,CAAC,QAAQ,IAAI,KAAK,CAEvB;IAEQ,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,WAAW,CAIrD;IAEQ,QAAQ,IAAI,GAAG,CAAC,OAAO,CAE/B;IAEQ,SAAS,IAAI,eAAe,CAYpC;IAEQ,UAAU,IAAI,oBAAoB,CAO1C;IAED,OAAO,IAAI,UAAU,CAEpB;IAED,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAG9B;IAEQ,SAAS,IAAI,KAAK,CAE1B;CACF;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,GACL,EAAE;IACD,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAA;CAC/D,GAAG,gBAAgB,CAKnB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GACnC,IAAI,IAAI,gBAAgB,CAE1B"}
1
+ {"version":3,"file":"UploadNode.d.ts","sourceRoot":"","sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,OAAO,EACR,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAA;AAKhF,OAAO,KAAK,EAAuB,oBAAoB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAIzF,qBAAa,gBAAiB,SAAQ,kBAAkB;IACtD,MAAM,EAAE,UAAU,CAAA;IAElB,YAAY,EACV,IAAI,EACJ,MAAM,EACN,GAAG,GACJ,EAAE;QACD,IAAI,EAAE,UAAU,CAAA;QAChB,MAAM,CAAC,EAAE,iBAAiB,CAAA;QAC1B,GAAG,CAAC,EAAE,OAAO,CAAA;KACd,EAGA;IAED,OAAgB,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB,CAM9D;IAED,OAAgB,OAAO,IAAI,MAAM,CAEhC;IAED,OAAgB,SAAS,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,CAO9D;IAED,OAAgB,UAAU,CAAC,cAAc,EAAE,oBAAoB,GAAG,gBAAgB,CAajF;IAED,MAAM,CAAC,QAAQ,IAAI,KAAK,CAEvB;IAEQ,SAAS,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,WAAW,CAIrD;IAEQ,QAAQ,IAAI,GAAG,CAAC,OAAO,CAE/B;IAEQ,SAAS,IAAI,eAAe,CAYpC;IAEQ,UAAU,IAAI,oBAAoB,CAM1C;IAED,OAAO,IAAI,UAAU,CAEpB;IAED,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAG9B;IAEQ,SAAS,IAAI,KAAK,CAE1B;CACF;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,GACL,EAAE;IACD,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAA;CAC/D,GAAG,gBAAgB,CAKnB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GACnC,IAAI,IAAI,gBAAgB,CAE1B"}
@@ -32,13 +32,6 @@ export class UploadServerNode extends DecoratorBlockNode {
32
32
  };
33
33
  }
34
34
  static importJSON(serializedNode) {
35
- if (serializedNode.version === 1 && serializedNode?.value?.id) {
36
- serializedNode.value = serializedNode.value.id;
37
- }
38
- if (serializedNode.version === 2 && !serializedNode?.id) {
39
- serializedNode.id = new ObjectID.default().toHexString();
40
- serializedNode.version = 3;
41
- }
42
35
  const importedData = {
43
36
  id: serializedNode.id,
44
37
  fields: serializedNode.fields,
@@ -81,8 +74,7 @@ export class UploadServerNode extends DecoratorBlockNode {
81
74
  return {
82
75
  ...super.exportJSON(),
83
76
  ...this.getData(),
84
- type: 'upload',
85
- version: 3
77
+ type: 'upload'
86
78
  };
87
79
  }
88
80
  getData() {
@@ -1 +1 @@
1
- {"version":3,"file":"UploadNode.js","names":["DecoratorBlockNode","addClassNamesToElement","ObjectID","$applyNodeReplacement","$convertUploadElement","UploadServerNode","__data","constructor","data","format","key","clone","node","__format","__key","getType","importDOM","img","conversion","domNode","$createUploadServerNode","priority","importJSON","serializedNode","version","value","id","default","toHexString","importedData","fields","pending","relationTo","setFormat","isInline","createDOM","config","element","document","createElement","theme","upload","decorate","exportDOM","setAttribute","String","formID","src","exportJSON","getData","type","getLatest","setData","writable","getWritable","updateDOM","$isUploadServerNode"],"sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n} from 'lexical'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\n\nimport type { Internal_UploadData, SerializedUploadNode, UploadData } from '../schema.js'\n\nimport { $convertUploadElement } from './conversions.js'\n\nexport class UploadServerNode extends DecoratorBlockNode {\n __data: UploadData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: UploadData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: UploadServerNode): UploadServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'upload'\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: (domNode) => $convertUploadElement(domNode, $createUploadServerNode),\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadServerNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n if (serializedNode.version === 2 && !serializedNode?.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n\n const importedData: Internal_UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n pending: (serializedNode as Internal_UploadData).pending,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadServerNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.upload)\n return element\n }\n\n override decorate(): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('img')\n const data = this.__data as Internal_UploadData\n if (data.pending) {\n element.setAttribute('data-lexical-pending-upload-form-id', String(data?.pending?.formID))\n element.setAttribute('src', data?.pending?.src || '')\n } else {\n element.setAttribute('data-lexical-upload-id', String(data?.value))\n element.setAttribute('data-lexical-upload-relation-to', data?.relationTo)\n }\n\n return { element }\n }\n\n override exportJSON(): SerializedUploadNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'upload',\n version: 3,\n }\n }\n\n getData(): UploadData {\n return this.getLatest().__data\n }\n\n setData(data: UploadData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n\n override updateDOM(): false {\n return false\n }\n}\n\nexport function $createUploadServerNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadServerNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n return $applyNodeReplacement(new UploadServerNode({ data: data as UploadData }))\n}\n\nexport function $isUploadServerNode(\n node: LexicalNode | null | undefined,\n): node is UploadServerNode {\n return node instanceof UploadServerNode\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"UploadNode.js","names":["DecoratorBlockNode","addClassNamesToElement","ObjectID","$applyNodeReplacement","$convertUploadElement","UploadServerNode","__data","constructor","data","format","key","clone","node","__format","__key","getType","importDOM","img","conversion","domNode","$createUploadServerNode","priority","importJSON","serializedNode","importedData","id","fields","pending","relationTo","value","setFormat","isInline","createDOM","config","element","document","createElement","theme","upload","decorate","exportDOM","setAttribute","String","formID","src","exportJSON","getData","type","getLatest","setData","writable","getWritable","updateDOM","default","toHexString","$isUploadServerNode"],"sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMExportOutput,\n EditorConfig,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n} from 'lexical'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport { addClassNamesToElement } from '@lexical/utils'\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\n\nimport type { Internal_UploadData, SerializedUploadNode, UploadData } from '../schema.js'\n\nimport { $convertUploadElement } from './conversions.js'\n\nexport class UploadServerNode extends DecoratorBlockNode {\n __data: UploadData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: UploadData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: UploadServerNode): UploadServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'upload'\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: (domNode) => $convertUploadElement(domNode, $createUploadServerNode),\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadServerNode {\n const importedData: Internal_UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n pending: (serializedNode as Internal_UploadData).pending,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadServerNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override createDOM(config?: EditorConfig): HTMLElement {\n const element = document.createElement('div')\n addClassNamesToElement(element, config?.theme?.upload)\n return element\n }\n\n override decorate(): JSX.Element {\n return null as unknown as JSX.Element\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('img')\n const data = this.__data as Internal_UploadData\n if (data.pending) {\n element.setAttribute('data-lexical-pending-upload-form-id', String(data?.pending?.formID))\n element.setAttribute('src', data?.pending?.src || '')\n } else {\n element.setAttribute('data-lexical-upload-id', String(data?.value))\n element.setAttribute('data-lexical-upload-relation-to', data?.relationTo)\n }\n\n return { element }\n }\n\n override exportJSON(): SerializedUploadNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'upload',\n }\n }\n\n getData(): UploadData {\n return this.getLatest().__data\n }\n\n setData(data: UploadData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n\n override updateDOM(): false {\n return false\n }\n}\n\nexport function $createUploadServerNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadServerNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n return $applyNodeReplacement(new UploadServerNode({ data: data as UploadData }))\n}\n\nexport function $isUploadServerNode(\n node: LexicalNode | null | undefined,\n): node is UploadServerNode {\n return node instanceof UploadServerNode\n}\n"],"mappings":"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","ignoreList":[]}
@@ -9,7 +9,7 @@ export type UploadData<TFields extends JsonObject = JsonObject> = {
9
9
  id: string;
10
10
  relationTo: TCollectionSlug;
11
11
  /** Either the document ID or the full populated document. */
12
- value: DataFromCollectionSlug<TCollectionSlug> | IDTypeForCollectionSlug<TCollectionSlug>;
12
+ value: IDTypeForCollectionSlug<TCollectionSlug> | TypedUploadCollection[TCollectionSlug];
13
13
  };
14
14
  }[UploadCollectionSlug];
15
15
  /** @internal Adds a pending state to `UploadData`. */
@@ -21,19 +21,6 @@ export type Internal_UploadData<TFields extends JsonObject = JsonObject> = {
21
21
  src: string;
22
22
  };
23
23
  } & UploadData<TFields>;
24
- /**
25
- * More precise variant of {@link UploadData}. Replaces `UploadData` in v4.
26
- * @internal
27
- * @todo Replace UploadData with UploadDataImproved in 4.0
28
- */
29
- export type UploadDataImproved<TFields extends JsonObject = JsonObject> = {
30
- [TCollectionSlug in UploadCollectionSlug]: {
31
- fields: TFields;
32
- id: string;
33
- relationTo: TCollectionSlug;
34
- value: IDTypeForCollectionSlug<TCollectionSlug> | TypedUploadCollection[TCollectionSlug];
35
- };
36
- }[UploadCollectionSlug];
37
24
  export type SerializedUploadNode<TSlugs extends UploadCollectionSlug = UploadCollectionSlug, TFields = {
38
25
  [k: string]: unknown;
39
26
  }> = {
@@ -46,6 +33,7 @@ export type SerializedUploadNode<TSlugs extends UploadCollectionSlug = UploadCol
46
33
  format: LexicalElementFormat;
47
34
  id: string;
48
35
  type: 'upload';
36
+ /** @deprecated Ignored when loading. Typed as required only to match Lexical's types: rich text sent through the API, CLI or MCP may not contain it. */
49
37
  version: number;
50
38
  };
51
39
  export declare const createUploadNodeJSONSchema: (props: UploadFeatureServerProps) => JSONSchemaFn;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,UAAU,EACV,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAI1D,MAAM,MAAM,UAAU,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI;KAC/D,eAAe,IAAI,oBAAoB,GAAG;QACzC,MAAM,EAAE,OAAO,CAAA;QACf,6DAA6D;QAC7D,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAC3B,6DAA6D;QAC7D,KAAK,EAAE,sBAAsB,CAAC,eAAe,CAAC,GAAG,uBAAuB,CAAC,eAAe,CAAC,CAAA;KAC1F;CACF,CAAC,oBAAoB,CAAC,CAAA;AAEvB,sDAAsD;AACtD,MAAM,MAAM,mBAAmB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI;IACzE,OAAO,CAAC,EAAE;QACR,2BAA2B;QAC3B,MAAM,EAAE,MAAM,CAAA;QACd,sCAAsC;QACtC,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;CACF,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;AAEvB;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI;KACvE,eAAe,IAAI,oBAAoB,GAAG;QACzC,MAAM,EAAE,OAAO,CAAA;QACf,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAC3B,KAAK,EAAE,uBAAuB,CAAC,eAAe,CAAC,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAA;KACzF;CACF,CAAC,oBAAoB,CAAC,CAAA;AAEvB,MAAM,MAAM,oBAAoB,CAC9B,MAAM,SAAS,oBAAoB,GAAG,oBAAoB,EAC1D,OAAO,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,IAChC;KACD,KAAK,IAAI,MAAM,GAAG;QACjB,UAAU,EAAE,KAAK,CAAA;QACjB,KAAK,EAAE,sBAAsB,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;KACtE;CACF,CAAC,MAAM,CAAC,GAAG;IACV,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,oBAAoB,CAAA;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAiCD,eAAO,MAAM,0BAA0B,UAC7B,wBAAwB,KAAG,YAmGlC,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,UAAU,EACV,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAI1D,MAAM,MAAM,UAAU,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI;KAC/D,eAAe,IAAI,oBAAoB,GAAG;QACzC,MAAM,EAAE,OAAO,CAAA;QACf,6DAA6D;QAC7D,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAC3B,6DAA6D;QAC7D,KAAK,EAAE,uBAAuB,CAAC,eAAe,CAAC,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAA;KACzF;CACF,CAAC,oBAAoB,CAAC,CAAA;AAEvB,sDAAsD;AACtD,MAAM,MAAM,mBAAmB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI;IACzE,OAAO,CAAC,EAAE;QACR,2BAA2B;QAC3B,MAAM,EAAE,MAAM,CAAA;QACd,sCAAsC;QACtC,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;CACF,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;AAEvB,MAAM,MAAM,oBAAoB,CAC9B,MAAM,SAAS,oBAAoB,GAAG,oBAAoB,EAC1D,OAAO,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,IAChC;KACD,KAAK,IAAI,MAAM,GAAG;QACjB,UAAU,EAAE,KAAK,CAAA;QACjB,KAAK,EAAE,sBAAsB,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;KACtE;CACF,CAAC,MAAM,CAAC,GAAG;IACV,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,oBAAoB,CAAA;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,QAAQ,CAAA;IACd,wJAAwJ;IACxJ,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAmCD,eAAO,MAAM,0BAA0B,UAC7B,wBAAwB,KAAG,YAmGlC,CAAA"}
@@ -6,6 +6,7 @@ const SERIALIZED_UPLOAD_NODE_TS = `export type SerializedUploadNode<TSlugs exten
6
6
  type: 'upload';
7
7
  format: LexicalElementFormat;
8
8
  id: string;
9
+ /** @deprecated Ignored when loading. Typed as required only to match Lexical's types: rich text sent through the API, CLI or MCP may not contain it. */
9
10
  version: number;
10
11
  fields: TFields;
11
12
  } & {
@@ -19,6 +20,7 @@ const SERIALIZED_UPLOAD_NODE_INPUT_TS = `export type SerializedUploadNodeInput<T
19
20
  type: 'upload';
20
21
  format: LexicalElementFormat;
21
22
  id: string;
23
+ /** @deprecated Ignored when loading. Typed as required only to match Lexical's types: rich text sent through the API, CLI or MCP may not contain it. */
22
24
  version: number;
23
25
  fields: TFields;
24
26
  } & {
@@ -113,7 +115,7 @@ export const createUploadNodeJSONSchema = props => ({
113
115
  },
114
116
  version: versionSchema
115
117
  },
116
- required: ['fields', 'format', 'id', 'relationTo', 'type', 'value', 'version']
118
+ required: ['fields', 'format', 'id', 'relationTo', 'type', 'value']
117
119
  };
118
120
  });
119
121
  let schema;
@@ -129,7 +131,7 @@ export const createUploadNodeJSONSchema = props => ({
129
131
  },
130
132
  version: versionSchema
131
133
  },
132
- required: ['type', 'version']
134
+ required: ['type']
133
135
  };
134
136
  } else {
135
137
  const baseSchema = collectionVariants.length === 1 ? collectionVariants[0] : {