@payloadcms/richtext-lexical 3.86.0 → 3.87.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAoE,MAAM,OAAO,CAAA;AAqBxF,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,WAAW,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,CAuZvF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAoE,MAAM,OAAO,CAAA;AAqBxF,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,WAAW,CAAA;CAAE,GAAG,KAAK,CAAC,SAAS,CAgavF"}
@@ -5,7 +5,7 @@ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext
5
5
  import { useLexicalEditable } from '@lexical/react/useLexicalEditable';
6
6
  import { $findMatchingParent, mergeRegister } from '@lexical/utils';
7
7
  import { getTranslation } from '@payloadcms/translations';
8
- import { CloseMenuIcon, EditIcon, ExternalLinkIcon, formatDrawerSlug, useConfig, useEditDepth, useLocale, useTranslation } from '@payloadcms/ui';
8
+ import { CloseMenuIcon, EditIcon, ExternalLinkIcon, formatDrawerSlug, useConfig, useEditDepth, useLocale, useModal, useTranslation } from '@payloadcms/ui';
9
9
  import { requests } from '@payloadcms/ui/shared';
10
10
  import { $getSelection, $isLineBreakNode, $isRangeSelection, COMMAND_PRIORITY_HIGH, COMMAND_PRIORITY_LOW, getDOMSelection, KEY_ESCAPE_COMMAND, SELECTION_CHANGE_COMMAND } from 'lexical';
11
11
  import { formatAdminURL } from 'payload/shared';
@@ -57,6 +57,11 @@ export function LinkEditor({
57
57
  slug: `lexical-rich-text-link-` + uuid,
58
58
  depth: editDepth
59
59
  });
60
+ const {
61
+ modalState
62
+ } = useModal();
63
+ const isDrawerOpenRef = useRef(false);
64
+ isDrawerOpenRef.current = Boolean(modalState[drawerSlug]?.isOpen);
60
65
  const {
61
66
  toggleDrawer
62
67
  } = useLexicalDrawer(drawerSlug);
@@ -67,11 +72,15 @@ export function LinkEditor({
67
72
  editorRef.current.style.transform = 'translate(-10000px, -10000px)';
68
73
  }
69
74
  setIsAutoLink(false);
70
- setLinkUrl(null);
71
- setLinkLabel(null);
72
- setSelectedNodes([]);
73
- setStateData(undefined);
74
- }, [setIsLink, setLinkUrl, setLinkLabel, setSelectedNodes]);
75
+ // Nested fields can temporarily move selection away from the editor. Keep the backing form
76
+ // state until the drawer closes so those interactions cannot reset or unmount its fields.
77
+ if (!isDrawerOpenRef.current) {
78
+ setLinkUrl(null);
79
+ setLinkLabel(null);
80
+ setSelectedNodes([]);
81
+ setStateData(undefined);
82
+ }
83
+ }, []);
75
84
  const $updateLinkEditor = useCallback(() => {
76
85
  const selection = $getSelection();
77
86
  let selectedNodeDomRect;
@@ -155,9 +164,11 @@ export function LinkEditor({
155
164
  });
156
165
  }
157
166
  }
158
- setStateData(data);
159
167
  setIsLink(true);
160
- setSelectedNodes(selection ? selection?.getNodes() : []);
168
+ if (!isDrawerOpenRef.current) {
169
+ setStateData(data);
170
+ setSelectedNodes(selection ? selection?.getNodes() : []);
171
+ }
161
172
  if ($isAutoLinkNode(focusLinkParent)) {
162
173
  setIsAutoLink(true);
163
174
  } else {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useLexicalComposerContext","useLexicalEditable","$findMatchingParent","mergeRegister","getTranslation","CloseMenuIcon","EditIcon","ExternalLinkIcon","formatDrawerSlug","useConfig","useEditDepth","useLocale","useTranslation","requests","$getSelection","$isLineBreakNode","$isRangeSelection","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","formatAdminURL","React","useCallback","useEffect","useLayoutEffect","useRef","useState","useEditorConfigContext","getSelectedNode","setFloatingElemPositionForLinkEditor","FieldsDrawer","useLexicalDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","preventDefault","event","LinkEditor","anchorElem","editor","linkNode","setLinkNode","editorRef","selectedNodeRectRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","fieldProps","schemaPath","uuid","isEditable","config","getEntityConfig","i18n","t","stateData","setStateData","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","locale","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","toggleDrawer","setNotLink","current","style","opacity","transform","undefined","$updateLinkEditor","selection","selectedNodeDomRect","focusNode","getElementByKey","getKey","getBoundingClientRect","focusLinkParent","badNode","getNodes","filter","node","find","is","fields","getFields","data","id","getID","text","getTextContent","linkType","url","routes","admin","doc","relationTo","value","relatedField","collectionSlug","label","String","collection","Error","loadingLabel","labels","singular","replace","get","apiRoute","api","path","serverURL","headers","language","params","code","then","res","ok","status","json","useAsTitle","title","catch","editorElem","nativeSelection","_window","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","scrollerElem","parentElement","update","getEditorState","read","window","addEventListener","removeEventListener","registerUpdateListener","editorState","_jsxs","Fragment","_jsx","ref","length","href","rel","target","__fields","newTab","_Fragment","onClick","onMouseDown","tabIndex","type","drawerTitle","featureKey","handleDrawerSubmit","newLinkPayload","bareLinkFields","linkParent","getParent","schemaPathSuffix"],"sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalNode } from 'lexical'\nimport type { Data, FormState } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CloseMenuIcon,\n EditIcon,\n ExternalLinkIcon,\n formatDrawerSlug,\n useConfig,\n useEditDepth,\n useLocale,\n useTranslation,\n} from '@payloadcms/ui'\nimport { requests } from '@payloadcms/ui/shared'\nimport {\n $getSelection,\n $isLineBreakNode,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport type { LinkNode } from '../../../../nodes/LinkNode.js'\nimport type { LinkFields } from '../../../../nodes/types.js'\nimport type { LinkPayload } from '../types.js'\n\nimport { useEditorConfigContext } from '../../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getSelectedNode } from '../../../../../../lexical/utils/getSelectedNode.js'\nimport { setFloatingElemPositionForLinkEditor } from '../../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js'\nimport { FieldsDrawer } from '../../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $isAutoLinkNode } from '../../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nfunction preventDefault(\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n): void {\n event.preventDefault()\n}\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const [editor] = useLexicalComposerContext()\n // TO-DO: There are several states that should not be state, because they\n // are derived from linkNode (linkUrl, linkLabel, stateData, isLink, isAutoLink...)\n const [linkNode, setLinkNode] = useState<LinkNode>()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const selectedNodeRectRef = useRef<DOMRect | null>(null)\n const [linkUrl, setLinkUrl] = useState<null | string>(null)\n const [linkLabel, setLinkLabel] = useState<null | string>(null)\n\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n const isEditable = useLexicalEditable()\n\n const { config, getEntityConfig } = useConfig()\n\n const { i18n, t } = useTranslation<object, 'lexical:link:loadingWithEllipsis'>()\n\n const [stateData, setStateData] = useState<\n ({ id?: string; text: string } & LinkFields) | undefined\n >()\n\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n const locale = useLocale()\n\n const [isAutoLink, setIsAutoLink] = useState(false)\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-rich-text-link-` + uuid,\n depth: editDepth,\n })\n\n const { toggleDrawer } = useLexicalDrawer(drawerSlug)\n\n const setNotLink = useCallback(() => {\n setIsLink(false)\n if (editorRef && editorRef.current) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n setIsAutoLink(false)\n setLinkUrl(null)\n setLinkLabel(null)\n setSelectedNodes([])\n setStateData(undefined)\n }, [setIsLink, setLinkUrl, setLinkLabel, setSelectedNodes])\n\n const $updateLinkEditor = useCallback(() => {\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined\n\n if (!$isRangeSelection(selection) || !selection) {\n void setNotLink()\n return\n }\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n\n const focusNode = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect()\n const focusLinkParent = $findMatchingParent(focusNode, $isLinkNode)\n\n // Prevent link modal from showing if selection spans further than the link: https://github.com/facebook/lexical/issues/4064\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode)\n return (\n (focusLinkParent && !focusLinkParent.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkParent))\n )\n })\n\n if (focusLinkParent == null || badNode) {\n setNotLink()\n return\n }\n setLinkNode(focusLinkParent)\n\n const fields = focusLinkParent.getFields()\n\n // Initial state:\n const data: { text: string } & LinkFields = {\n ...fields,\n id: focusLinkParent.getID(),\n text: focusLinkParent.getTextContent(),\n }\n\n if (fields?.linkType === 'custom') {\n setLinkUrl(fields?.url ?? null)\n setLinkLabel(null)\n } else {\n // internal link\n setLinkUrl(\n `${config.routes.admin === '/' ? '' : config.routes.admin}/collections/${fields?.doc?.relationTo}/${\n fields?.doc?.value\n }`,\n )\n\n const relatedField = fields?.doc?.relationTo\n ? getEntityConfig({ collectionSlug: fields?.doc?.relationTo })\n : undefined\n if (!relatedField) {\n // Usually happens if the user removed all default fields. In this case, we let them specify the label or do not display the label at all.\n // label could be a virtual field the user added. This is useful if they want to use the link feature for things other than links.\n setLinkLabel(fields?.label ? String(fields?.label) : null)\n setLinkUrl(fields?.url ? String(fields?.url) : null)\n } else {\n const id = typeof fields.doc?.value === 'object' ? fields.doc.value.id : fields.doc?.value\n const collection = fields.doc?.relationTo\n if (!id || !collection) {\n throw new Error(`Focus link parent is missing doc.value or doc.relationTo`)\n }\n\n const loadingLabel = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('lexical:link:loadingWithEllipsis', i18n)}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(loadingLabel)\n\n requests\n .get(\n formatAdminURL({\n apiRoute: config.routes.api,\n path: `/${collection}/${id}`,\n serverURL: config.serverURL,\n }),\n {\n headers: {\n 'Accept-Language': i18n.language,\n },\n params: {\n depth: 0,\n locale: locale?.code,\n },\n },\n )\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(`HTTP error! Status: ${res.status}`)\n }\n const data = await res.json()\n const useAsTitle = relatedField?.admin?.useAsTitle || 'id'\n const title = data[useAsTitle]\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${title}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n .catch(() => {\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('general:untitled', i18n)} - ID: ${id}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n }\n }\n\n setStateData(data)\n setIsLink(true)\n setSelectedNodes(selection ? selection?.getNodes() : [])\n\n if ($isAutoLinkNode(focusLinkParent)) {\n setIsAutoLink(true)\n } else {\n setIsAutoLink(false)\n }\n\n const editorElem = editorRef.current\n const nativeSelection = getDOMSelection(editor._window)\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n if (!selectedNodeDomRect) {\n // Get the DOM rect of the selected node using the native selection. This sometimes produces the wrong\n // result, which is why we use lexical's selection preferably.\n selectedNodeDomRect = nativeSelection.getRangeAt(0).getBoundingClientRect()\n }\n\n if (selectedNodeDomRect != null) {\n selectedNodeDomRect.y += 40\n // Store the rect for positioning in useLayoutEffect after content renders\n selectedNodeRectRef.current = selectedNodeDomRect\n }\n } else if (activeElement == null || activeElement.className !== 'link-input') {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem)\n }\n setLinkUrl(null)\n setLinkLabel(null)\n }\n\n return true\n }, [\n editor,\n setNotLink,\n config.routes.admin,\n config.routes.api,\n config.serverURL,\n getEntityConfig,\n t,\n i18n,\n locale?.code,\n anchorElem,\n ])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_WITH_MODAL_COMMAND,\n (payload: LinkPayload) => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, payload)\n\n // Now, open the modal\n $updateLinkEditor()\n toggleDrawer()\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateLinkEditor, toggleDrawer, drawerSlug])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = (): void => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }\n\n window.addEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [anchorElem.parentElement, editor, $updateLinkEditor])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n void $updateLinkEditor()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n void $updateLinkEditor()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setNotLink()\n\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, $updateLinkEditor, isLink, setNotLink])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }, [editor, $updateLinkEditor])\n\n // Position the tooltip after React renders the link content\n useLayoutEffect(() => {\n if (!isLink || !editorRef.current || !anchorElem || !selectedNodeRectRef.current) {\n return\n }\n\n // Now the DOM has the actual link element, we can position the tooltip\n setFloatingElemPositionForLinkEditor(selectedNodeRectRef.current, editorRef.current, anchorElem)\n // linkNode dependency ensures re-positioning when clicking between different links with the same URL\n }, [linkUrl, linkLabel, isLink, anchorElem, linkNode])\n\n return (\n <React.Fragment>\n <div className=\"link-editor\" ref={editorRef}>\n <div className=\"link-input\">\n {linkUrl && linkUrl.length > 0 ? (\n <a href={linkUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n </a>\n ) : linkLabel != null && linkLabel.length > 0 ? (\n <>\n {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n <span className=\"link-input__label-pure\">{linkLabel}</span>\n </>\n ) : null}\n\n {isEditable && (\n <React.Fragment>\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={(event) => {\n event.preventDefault()\n toggleDrawer()\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <EditIcon />\n </button>\n {!isAutoLink && (\n <button\n aria-label=\"Remove link\"\n className=\"link-trash\"\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <CloseMenuIcon />\n </button>\n )}\n </React.Fragment>\n )}\n </div>\n </div>\n <FieldsDrawer\n className=\"lexical-link-edit-drawer\"\n data={stateData}\n drawerSlug={drawerSlug}\n drawerTitle={t('fields:editLink')}\n featureKey=\"link\"\n handleDrawerSubmit={(fields: FormState, data: Data) => {\n const newLinkPayload = data as { text: string } & LinkFields\n\n const bareLinkFields: LinkFields = {\n ...newLinkPayload,\n }\n delete bareLinkFields.text\n\n // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!).\n editor.update(() => {\n const selection = $getSelection()\n let linkParent: ElementNode | null = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0]?.getParent() ?? null\n }\n }\n\n if (linkParent && $isAutoLinkNode(linkParent)) {\n const linkNode = $createLinkNode({\n fields: bareLinkFields,\n })\n linkParent.replace(linkNode, true)\n }\n })\n\n // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to\n // it being applied to the auto link node instead of the link node.\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: bareLinkFields,\n selectedNodes,\n text: newLinkPayload.text,\n })\n }}\n schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["useLexicalComposerContext","useLexicalEditable","$findMatchingParent","mergeRegister","getTranslation","CloseMenuIcon","EditIcon","ExternalLinkIcon","formatDrawerSlug","useConfig","useEditDepth","useLocale","useModal","useTranslation","requests","$getSelection","$isLineBreakNode","$isRangeSelection","COMMAND_PRIORITY_HIGH","COMMAND_PRIORITY_LOW","getDOMSelection","KEY_ESCAPE_COMMAND","SELECTION_CHANGE_COMMAND","formatAdminURL","React","useCallback","useEffect","useLayoutEffect","useRef","useState","useEditorConfigContext","getSelectedNode","setFloatingElemPositionForLinkEditor","FieldsDrawer","useLexicalDrawer","$isAutoLinkNode","$createLinkNode","$isLinkNode","TOGGLE_LINK_COMMAND","TOGGLE_LINK_WITH_MODAL_COMMAND","preventDefault","event","LinkEditor","anchorElem","editor","linkNode","setLinkNode","editorRef","selectedNodeRectRef","linkUrl","setLinkUrl","linkLabel","setLinkLabel","fieldProps","schemaPath","uuid","isEditable","config","getEntityConfig","i18n","t","stateData","setStateData","editDepth","isLink","setIsLink","selectedNodes","setSelectedNodes","locale","isAutoLink","setIsAutoLink","drawerSlug","slug","depth","modalState","isDrawerOpenRef","current","Boolean","isOpen","toggleDrawer","setNotLink","style","opacity","transform","undefined","$updateLinkEditor","selection","selectedNodeDomRect","focusNode","getElementByKey","getKey","getBoundingClientRect","focusLinkParent","badNode","getNodes","filter","node","find","is","fields","getFields","data","id","getID","text","getTextContent","linkType","url","routes","admin","doc","relationTo","value","relatedField","collectionSlug","label","String","collection","Error","loadingLabel","labels","singular","replace","get","apiRoute","api","path","serverURL","headers","language","params","code","then","res","ok","status","json","useAsTitle","title","catch","editorElem","nativeSelection","_window","activeElement","document","rootElement","getRootElement","contains","anchorNode","getRangeAt","y","className","registerCommand","payload","dispatchCommand","scrollerElem","parentElement","update","getEditorState","read","window","addEventListener","removeEventListener","registerUpdateListener","editorState","_jsxs","Fragment","_jsx","ref","length","href","rel","target","__fields","newTab","_Fragment","onClick","onMouseDown","tabIndex","type","drawerTitle","featureKey","handleDrawerSubmit","newLinkPayload","bareLinkFields","linkParent","getParent","schemaPathSuffix"],"sources":["../../../../../../../src/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalNode } from 'lexical'\nimport type { Data, FormState } from 'payload'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n CloseMenuIcon,\n EditIcon,\n ExternalLinkIcon,\n formatDrawerSlug,\n useConfig,\n useEditDepth,\n useLocale,\n useModal,\n useTranslation,\n} from '@payloadcms/ui'\nimport { requests } from '@payloadcms/ui/shared'\nimport {\n $getSelection,\n $isLineBreakNode,\n $isRangeSelection,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n getDOMSelection,\n KEY_ESCAPE_COMMAND,\n SELECTION_CHANGE_COMMAND,\n} from 'lexical'\nimport { formatAdminURL } from 'payload/shared'\nimport React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport type { LinkNode } from '../../../../nodes/LinkNode.js'\nimport type { LinkFields } from '../../../../nodes/types.js'\nimport type { LinkPayload } from '../types.js'\n\nimport { useEditorConfigContext } from '../../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { getSelectedNode } from '../../../../../../lexical/utils/getSelectedNode.js'\nimport { setFloatingElemPositionForLinkEditor } from '../../../../../../lexical/utils/setFloatingElemPositionForLinkEditor.js'\nimport { FieldsDrawer } from '../../../../../../utilities/fieldsDrawer/Drawer.js'\nimport { useLexicalDrawer } from '../../../../../../utilities/fieldsDrawer/useLexicalDrawer.js'\nimport { $isAutoLinkNode } from '../../../../nodes/AutoLinkNode.js'\nimport { $createLinkNode, $isLinkNode, TOGGLE_LINK_COMMAND } from '../../../../nodes/LinkNode.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './commands.js'\n\nfunction preventDefault(\n event: React.KeyboardEvent<HTMLInputElement> | React.MouseEvent<HTMLElement>,\n): void {\n event.preventDefault()\n}\n\nexport function LinkEditor({ anchorElem }: { anchorElem: HTMLElement }): React.ReactNode {\n const [editor] = useLexicalComposerContext()\n // TO-DO: There are several states that should not be state, because they\n // are derived from linkNode (linkUrl, linkLabel, stateData, isLink, isAutoLink...)\n const [linkNode, setLinkNode] = useState<LinkNode>()\n\n const editorRef = useRef<HTMLDivElement | null>(null)\n const selectedNodeRectRef = useRef<DOMRect | null>(null)\n const [linkUrl, setLinkUrl] = useState<null | string>(null)\n const [linkLabel, setLinkLabel] = useState<null | string>(null)\n\n const {\n fieldProps: { schemaPath },\n uuid,\n } = useEditorConfigContext()\n const isEditable = useLexicalEditable()\n\n const { config, getEntityConfig } = useConfig()\n\n const { i18n, t } = useTranslation<object, 'lexical:link:loadingWithEllipsis'>()\n\n const [stateData, setStateData] = useState<\n ({ id?: string; text: string } & LinkFields) | undefined\n >()\n\n const editDepth = useEditDepth()\n const [isLink, setIsLink] = useState(false)\n const [selectedNodes, setSelectedNodes] = useState<LexicalNode[]>([])\n const locale = useLocale()\n\n const [isAutoLink, setIsAutoLink] = useState(false)\n\n const drawerSlug = formatDrawerSlug({\n slug: `lexical-rich-text-link-` + uuid,\n depth: editDepth,\n })\n\n const { modalState } = useModal()\n const isDrawerOpenRef = useRef(false)\n isDrawerOpenRef.current = Boolean(modalState[drawerSlug]?.isOpen)\n const { toggleDrawer } = useLexicalDrawer(drawerSlug)\n\n const setNotLink = useCallback(() => {\n setIsLink(false)\n if (editorRef && editorRef.current) {\n editorRef.current.style.opacity = '0'\n editorRef.current.style.transform = 'translate(-10000px, -10000px)'\n }\n setIsAutoLink(false)\n // Nested fields can temporarily move selection away from the editor. Keep the backing form\n // state until the drawer closes so those interactions cannot reset or unmount its fields.\n if (!isDrawerOpenRef.current) {\n setLinkUrl(null)\n setLinkLabel(null)\n setSelectedNodes([])\n setStateData(undefined)\n }\n }, [])\n\n const $updateLinkEditor = useCallback(() => {\n const selection = $getSelection()\n let selectedNodeDomRect: DOMRect | undefined\n\n if (!$isRangeSelection(selection) || !selection) {\n void setNotLink()\n return\n }\n\n // Handle the data displayed in the floating link editor & drawer when you click on a link node\n\n const focusNode = getSelectedNode(selection)\n selectedNodeDomRect = editor.getElementByKey(focusNode.getKey())?.getBoundingClientRect()\n const focusLinkParent = $findMatchingParent(focusNode, $isLinkNode)\n\n // Prevent link modal from showing if selection spans further than the link: https://github.com/facebook/lexical/issues/4064\n const badNode = selection\n .getNodes()\n .filter((node) => !$isLineBreakNode(node))\n .find((node) => {\n const linkNode = $findMatchingParent(node, $isLinkNode)\n return (\n (focusLinkParent && !focusLinkParent.is(linkNode)) ||\n (linkNode && !linkNode.is(focusLinkParent))\n )\n })\n\n if (focusLinkParent == null || badNode) {\n setNotLink()\n return\n }\n setLinkNode(focusLinkParent)\n\n const fields = focusLinkParent.getFields()\n\n // Initial state:\n const data: { text: string } & LinkFields = {\n ...fields,\n id: focusLinkParent.getID(),\n text: focusLinkParent.getTextContent(),\n }\n\n if (fields?.linkType === 'custom') {\n setLinkUrl(fields?.url ?? null)\n setLinkLabel(null)\n } else {\n // internal link\n setLinkUrl(\n `${config.routes.admin === '/' ? '' : config.routes.admin}/collections/${fields?.doc?.relationTo}/${\n fields?.doc?.value\n }`,\n )\n\n const relatedField = fields?.doc?.relationTo\n ? getEntityConfig({ collectionSlug: fields?.doc?.relationTo })\n : undefined\n if (!relatedField) {\n // Usually happens if the user removed all default fields. In this case, we let them specify the label or do not display the label at all.\n // label could be a virtual field the user added. This is useful if they want to use the link feature for things other than links.\n setLinkLabel(fields?.label ? String(fields?.label) : null)\n setLinkUrl(fields?.url ? String(fields?.url) : null)\n } else {\n const id = typeof fields.doc?.value === 'object' ? fields.doc.value.id : fields.doc?.value\n const collection = fields.doc?.relationTo\n if (!id || !collection) {\n throw new Error(`Focus link parent is missing doc.value or doc.relationTo`)\n }\n\n const loadingLabel = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('lexical:link:loadingWithEllipsis', i18n)}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(loadingLabel)\n\n requests\n .get(\n formatAdminURL({\n apiRoute: config.routes.api,\n path: `/${collection}/${id}`,\n serverURL: config.serverURL,\n }),\n {\n headers: {\n 'Accept-Language': i18n.language,\n },\n params: {\n depth: 0,\n locale: locale?.code,\n },\n },\n )\n .then(async (res) => {\n if (!res.ok) {\n throw new Error(`HTTP error! Status: ${res.status}`)\n }\n const data = await res.json()\n const useAsTitle = relatedField?.admin?.useAsTitle || 'id'\n const title = data[useAsTitle]\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${title}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n .catch(() => {\n const label = t('fields:linkedTo', {\n label: `${getTranslation(relatedField.labels.singular, i18n)} - ${t('general:untitled', i18n)} - ID: ${id}`,\n }).replace(/<[^>]*>?/g, '')\n setLinkLabel(label)\n })\n }\n }\n\n setIsLink(true)\n if (!isDrawerOpenRef.current) {\n setStateData(data)\n setSelectedNodes(selection ? selection?.getNodes() : [])\n }\n\n if ($isAutoLinkNode(focusLinkParent)) {\n setIsAutoLink(true)\n } else {\n setIsAutoLink(false)\n }\n\n const editorElem = editorRef.current\n const nativeSelection = getDOMSelection(editor._window)\n const { activeElement } = document\n\n if (editorElem === null) {\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n nativeSelection !== null &&\n rootElement !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n if (!selectedNodeDomRect) {\n // Get the DOM rect of the selected node using the native selection. This sometimes produces the wrong\n // result, which is why we use lexical's selection preferably.\n selectedNodeDomRect = nativeSelection.getRangeAt(0).getBoundingClientRect()\n }\n\n if (selectedNodeDomRect != null) {\n selectedNodeDomRect.y += 40\n // Store the rect for positioning in useLayoutEffect after content renders\n selectedNodeRectRef.current = selectedNodeDomRect\n }\n } else if (activeElement == null || activeElement.className !== 'link-input') {\n if (rootElement !== null) {\n setFloatingElemPositionForLinkEditor(null, editorElem, anchorElem)\n }\n setLinkUrl(null)\n setLinkLabel(null)\n }\n\n return true\n }, [\n editor,\n setNotLink,\n config.routes.admin,\n config.routes.api,\n config.serverURL,\n getEntityConfig,\n t,\n i18n,\n locale?.code,\n anchorElem,\n ])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerCommand(\n TOGGLE_LINK_WITH_MODAL_COMMAND,\n (payload: LinkPayload) => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, payload)\n\n // Now, open the modal\n $updateLinkEditor()\n toggleDrawer()\n\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor, $updateLinkEditor, toggleDrawer, drawerSlug])\n\n useEffect(() => {\n const scrollerElem = anchorElem.parentElement\n\n const update = (): void => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }\n\n window.addEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.addEventListener('scroll', update)\n }\n\n return () => {\n window.removeEventListener('resize', update)\n\n if (scrollerElem != null) {\n scrollerElem.removeEventListener('scroll', update)\n }\n }\n }, [anchorElem.parentElement, editor, $updateLinkEditor])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n void $updateLinkEditor()\n })\n }),\n\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n void $updateLinkEditor()\n return true\n },\n COMMAND_PRIORITY_LOW,\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setNotLink()\n\n return true\n }\n return false\n },\n COMMAND_PRIORITY_HIGH,\n ),\n )\n }, [editor, $updateLinkEditor, isLink, setNotLink])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n void $updateLinkEditor()\n })\n }, [editor, $updateLinkEditor])\n\n // Position the tooltip after React renders the link content\n useLayoutEffect(() => {\n if (!isLink || !editorRef.current || !anchorElem || !selectedNodeRectRef.current) {\n return\n }\n\n // Now the DOM has the actual link element, we can position the tooltip\n setFloatingElemPositionForLinkEditor(selectedNodeRectRef.current, editorRef.current, anchorElem)\n // linkNode dependency ensures re-positioning when clicking between different links with the same URL\n }, [linkUrl, linkLabel, isLink, anchorElem, linkNode])\n\n return (\n <React.Fragment>\n <div className=\"link-editor\" ref={editorRef}>\n <div className=\"link-input\">\n {linkUrl && linkUrl.length > 0 ? (\n <a href={linkUrl} rel=\"noopener noreferrer\" target=\"_blank\">\n {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n {linkLabel != null && linkLabel.length > 0 ? linkLabel : linkUrl}\n </a>\n ) : linkLabel != null && linkLabel.length > 0 ? (\n <>\n {linkNode?.__fields.newTab ? <ExternalLinkIcon /> : null}\n <span className=\"link-input__label-pure\">{linkLabel}</span>\n </>\n ) : null}\n\n {isEditable && (\n <React.Fragment>\n <button\n aria-label=\"Edit link\"\n className=\"link-edit\"\n onClick={(event) => {\n event.preventDefault()\n toggleDrawer()\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <EditIcon />\n </button>\n {!isAutoLink && (\n <button\n aria-label=\"Remove link\"\n className=\"link-trash\"\n onClick={() => {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }}\n onMouseDown={preventDefault}\n tabIndex={0}\n type=\"button\"\n >\n <CloseMenuIcon />\n </button>\n )}\n </React.Fragment>\n )}\n </div>\n </div>\n <FieldsDrawer\n className=\"lexical-link-edit-drawer\"\n data={stateData}\n drawerSlug={drawerSlug}\n drawerTitle={t('fields:editLink')}\n featureKey=\"link\"\n handleDrawerSubmit={(fields: FormState, data: Data) => {\n const newLinkPayload = data as { text: string } & LinkFields\n\n const bareLinkFields: LinkFields = {\n ...newLinkPayload,\n }\n delete bareLinkFields.text\n\n // See: https://github.com/facebook/lexical/pull/5536. This updates autolink nodes to link nodes whenever a change was made (which is good!).\n editor.update(() => {\n const selection = $getSelection()\n let linkParent: ElementNode | null = null\n if ($isRangeSelection(selection)) {\n linkParent = getSelectedNode(selection).getParent()\n } else {\n if (selectedNodes.length) {\n linkParent = selectedNodes[0]?.getParent() ?? null\n }\n }\n\n if (linkParent && $isAutoLinkNode(linkParent)) {\n const linkNode = $createLinkNode({\n fields: bareLinkFields,\n })\n linkParent.replace(linkNode, true)\n }\n })\n\n // Needs to happen AFTER a potential auto link => link node conversion, as otherwise, the updated text to display may be lost due to\n // it being applied to the auto link node instead of the link node.\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n fields: bareLinkFields,\n selectedNodes,\n text: newLinkPayload.text,\n })\n }}\n schemaPath={schemaPath}\n schemaPathSuffix=\"fields\"\n />\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"DrawerContent.d.ts","sourceRoot":"","sources":["../../../src/utilities/fieldsDrawer/DrawerContent.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAGvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAIpD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,aAAa,CAAC,CAuJzF,CAAA"}
1
+ {"version":3,"file":"DrawerContent.d.ts","sourceRoot":"","sources":["../../../src/utilities/fieldsDrawer/DrawerContent.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAmD,MAAM,OAAO,CAAA;AAGvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAIpD,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,aAAa,CAAC,CAwJzF,CAAA"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
4
  import { useLexicalEditable } from '@lexical/react/useLexicalEditable';
5
- import { Form, FormSubmit, RenderFields, useDocumentForm, useDocumentInfo, useServerFunctions, useTranslation } from '@payloadcms/ui';
5
+ import { Form, FormSubmit, RenderFields, useDocumentForm, useDocumentInfo, useEffectEvent, useServerFunctions, useTranslation } from '@payloadcms/ui';
6
6
  import { abortAndIgnore } from '@payloadcms/ui/shared';
7
7
  import { deepCopyObjectSimpleWithoutReactComponents } from 'payload/shared';
8
8
  import React, { useCallback, useEffect, useRef, useState } from 'react';
@@ -43,43 +43,45 @@ export const DrawerContent = ({
43
43
  const schemaFieldsPath = schemaFieldsPathOverride ?? `${schemaPath}.lexical_internal_feature.${featureKey}${schemaPathSuffix ? `.${schemaPathSuffix}` : ''}`;
44
44
  const fields = fieldMapOverride ?? featureClientSchemaMap[featureKey]?.[schemaFieldsPath] // Field Schema
45
45
  ;
46
+ // Parent form state changes after autosave. Read its latest value when initializing without
47
+ // reinitializing this drawer and discarding its unsaved form state after every parent update.
48
+ const getInitialState = useEffectEvent(async controller => {
49
+ const {
50
+ state
51
+ } = await getFormState({
52
+ id,
53
+ collectionSlug,
54
+ data: data ?? {},
55
+ docPermissions: {
56
+ fields: true
57
+ },
58
+ docPreferences: await getDocPreferences(),
59
+ documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {
60
+ excludeFiles: true
61
+ }),
62
+ globalSlug,
63
+ initialBlockData: data,
64
+ operation: 'update',
65
+ readOnly: !isEditable,
66
+ renderAllFields: true,
67
+ schemaPath: schemaFieldsPath,
68
+ signal: controller.signal
69
+ });
70
+ setInitialState(state);
71
+ });
46
72
  useEffect(() => {
47
- const controller = new AbortController();
48
- const awaitInitialState = async () => {
49
- const {
50
- state
51
- } = await getFormState({
52
- id,
53
- collectionSlug,
54
- data: data ?? {},
55
- docPermissions: {
56
- fields: true
57
- },
58
- docPreferences: await getDocPreferences(),
59
- documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {
60
- excludeFiles: true
61
- }),
62
- globalSlug,
63
- initialBlockData: data,
64
- operation: 'update',
65
- readOnly: !isEditable,
66
- renderAllFields: true,
67
- schemaPath: schemaFieldsPath,
68
- signal: controller.signal
69
- });
70
- setInitialState(state);
71
- };
72
- void awaitInitialState();
73
+ const controller_0 = new AbortController();
74
+ void getInitialState(controller_0);
73
75
  return () => {
74
- abortAndIgnore(controller);
76
+ abortAndIgnore(controller_0);
75
77
  };
76
- }, [schemaFieldsPath, id, data, getFormState, collectionSlug, isEditable, globalSlug, getDocPreferences, parentDocumentFields]);
78
+ }, [schemaFieldsPath, id, data, getFormState, collectionSlug, isEditable, globalSlug, getDocPreferences]);
77
79
  const onChange = useCallback(async ({
78
80
  formState: prevFormState
79
81
  }) => {
80
82
  abortAndIgnore(onChangeAbortControllerRef.current);
81
- const controller_0 = new AbortController();
82
- onChangeAbortControllerRef.current = controller_0;
83
+ const controller_1 = new AbortController();
84
+ onChangeAbortControllerRef.current = controller_1;
83
85
  const {
84
86
  state: state_0
85
87
  } = await getFormState({
@@ -98,7 +100,7 @@ export const DrawerContent = ({
98
100
  operation: 'update',
99
101
  readOnly: !isEditable,
100
102
  schemaPath: schemaFieldsPath,
101
- signal: controller_0.signal
103
+ signal: controller_1.signal
102
104
  });
103
105
  if (!state_0) {
104
106
  return prevFormState;
@@ -1 +1 @@
1
- {"version":3,"file":"DrawerContent.js","names":["useLexicalEditable","Form","FormSubmit","RenderFields","useDocumentForm","useDocumentInfo","useServerFunctions","useTranslation","abortAndIgnore","deepCopyObjectSimpleWithoutReactComponents","React","useCallback","useEffect","useRef","useState","v4","uuid","useEditorConfigContext","DrawerContent","data","featureKey","fieldMapOverride","handleDrawerSubmit","schemaFieldsPathOverride","schemaPath","schemaPathSuffix","t","id","collectionSlug","getDocPreferences","globalSlug","fields","parentDocumentFields","isEditable","onChangeAbortControllerRef","AbortController","initialState","setInitialState","fieldProps","featureClientSchemaMap","getFormState","schemaFieldsPath","controller","awaitInitialState","state","docPermissions","docPreferences","documentFormState","excludeFiles","initialBlockData","operation","readOnly","renderAllFields","signal","onChange","formState","prevFormState","current","initialBlockFormState","_jsxs","beforeSubmit","disableValidationOnSubmit","Array","isArray","onSubmit","_jsx","forceRender","parentIndexPath","parentPath","parentSchemaPath","permissions"],"sources":["../../../src/utilities/fieldsDrawer/DrawerContent.tsx"],"sourcesContent":["'use client'\nimport type { FormState } from 'payload'\n\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n Form,\n FormSubmit,\n RenderFields,\n useDocumentForm,\n useDocumentInfo,\n useServerFunctions,\n useTranslation,\n} from '@payloadcms/ui'\nimport { abortAndIgnore } from '@payloadcms/ui/shared'\nimport { deepCopyObjectSimpleWithoutReactComponents } from 'payload/shared'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { v4 as uuid } from 'uuid'\n\nimport type { FieldsDrawerProps } from './Drawer.js'\n\nimport { useEditorConfigContext } from '../../lexical/config/client/EditorConfigProvider.js'\n\nexport const DrawerContent: React.FC<Omit<FieldsDrawerProps, 'drawerSlug' | 'drawerTitle'>> = ({\n data,\n featureKey,\n fieldMapOverride,\n handleDrawerSubmit,\n schemaFieldsPathOverride,\n schemaPath,\n schemaPathSuffix,\n}) => {\n const { t } = useTranslation()\n const { id, collectionSlug, getDocPreferences, globalSlug } = useDocumentInfo()\n const { fields: parentDocumentFields } = useDocumentForm()\n const isEditable = useLexicalEditable()\n\n const onChangeAbortControllerRef = useRef(new AbortController())\n\n const [initialState, setInitialState] = useState<false | FormState | undefined>(false)\n\n const {\n fieldProps: { featureClientSchemaMap },\n } = useEditorConfigContext()\n\n const { getFormState } = useServerFunctions()\n\n const schemaFieldsPath =\n schemaFieldsPathOverride ??\n `${schemaPath}.lexical_internal_feature.${featureKey}${schemaPathSuffix ? `.${schemaPathSuffix}` : ''}`\n\n const fields: any = fieldMapOverride ?? featureClientSchemaMap[featureKey]?.[schemaFieldsPath] // Field Schema\n\n useEffect(() => {\n const controller = new AbortController()\n\n const awaitInitialState = async () => {\n const { state } = await getFormState({\n id,\n collectionSlug,\n data: data ?? {},\n docPermissions: {\n fields: true,\n },\n docPreferences: await getDocPreferences(),\n documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {\n excludeFiles: true,\n }),\n globalSlug,\n initialBlockData: data,\n operation: 'update',\n readOnly: !isEditable,\n renderAllFields: true,\n schemaPath: schemaFieldsPath,\n signal: controller.signal,\n })\n\n setInitialState(state)\n }\n\n void awaitInitialState()\n\n return () => {\n abortAndIgnore(controller)\n }\n }, [\n schemaFieldsPath,\n id,\n data,\n getFormState,\n collectionSlug,\n isEditable,\n globalSlug,\n getDocPreferences,\n parentDocumentFields,\n ])\n\n const onChange = useCallback(\n async ({ formState: prevFormState }: { formState: FormState }) => {\n abortAndIgnore(onChangeAbortControllerRef.current)\n\n const controller = new AbortController()\n onChangeAbortControllerRef.current = controller\n\n const { state } = await getFormState({\n id,\n collectionSlug,\n docPermissions: {\n fields: true,\n },\n docPreferences: await getDocPreferences(),\n documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {\n excludeFiles: true,\n }),\n formState: prevFormState,\n globalSlug,\n initialBlockFormState: prevFormState,\n operation: 'update',\n readOnly: !isEditable,\n schemaPath: schemaFieldsPath,\n signal: controller.signal,\n })\n\n if (!state) {\n return prevFormState\n }\n\n return state\n },\n [\n getFormState,\n id,\n isEditable,\n collectionSlug,\n getDocPreferences,\n parentDocumentFields,\n globalSlug,\n schemaFieldsPath,\n ],\n )\n\n // cleanup effect\n useEffect(() => {\n return () => {\n abortAndIgnore(onChangeAbortControllerRef.current)\n }\n }, [])\n\n if (initialState === false) {\n return null\n }\n\n return (\n <Form\n beforeSubmit={[onChange]}\n disableValidationOnSubmit\n fields={Array.isArray(fields) ? fields : []}\n initialState={initialState}\n onChange={[onChange]}\n onSubmit={handleDrawerSubmit}\n uuid={uuid()}\n >\n <RenderFields\n fields={Array.isArray(fields) ? fields : []}\n forceRender\n parentIndexPath=\"\"\n parentPath=\"\" // See Blocks feature path for details as for why this is empty\n parentSchemaPath={schemaFieldsPath}\n permissions={true}\n readOnly={!isEditable}\n />\n <FormSubmit>{t('fields:saveChanges')}</FormSubmit>\n </Form>\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"DrawerContent.js","names":["useLexicalEditable","Form","FormSubmit","RenderFields","useDocumentForm","useDocumentInfo","useEffectEvent","useServerFunctions","useTranslation","abortAndIgnore","deepCopyObjectSimpleWithoutReactComponents","React","useCallback","useEffect","useRef","useState","v4","uuid","useEditorConfigContext","DrawerContent","data","featureKey","fieldMapOverride","handleDrawerSubmit","schemaFieldsPathOverride","schemaPath","schemaPathSuffix","t","id","collectionSlug","getDocPreferences","globalSlug","fields","parentDocumentFields","isEditable","onChangeAbortControllerRef","AbortController","initialState","setInitialState","fieldProps","featureClientSchemaMap","getFormState","schemaFieldsPath","getInitialState","controller","state","docPermissions","docPreferences","documentFormState","excludeFiles","initialBlockData","operation","readOnly","renderAllFields","signal","onChange","formState","prevFormState","current","initialBlockFormState","_jsxs","beforeSubmit","disableValidationOnSubmit","Array","isArray","onSubmit","_jsx","forceRender","parentIndexPath","parentPath","parentSchemaPath","permissions"],"sources":["../../../src/utilities/fieldsDrawer/DrawerContent.tsx"],"sourcesContent":["'use client'\nimport type { FormState } from 'payload'\n\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n Form,\n FormSubmit,\n RenderFields,\n useDocumentForm,\n useDocumentInfo,\n useEffectEvent,\n useServerFunctions,\n useTranslation,\n} from '@payloadcms/ui'\nimport { abortAndIgnore } from '@payloadcms/ui/shared'\nimport { deepCopyObjectSimpleWithoutReactComponents } from 'payload/shared'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { v4 as uuid } from 'uuid'\n\nimport type { FieldsDrawerProps } from './Drawer.js'\n\nimport { useEditorConfigContext } from '../../lexical/config/client/EditorConfigProvider.js'\n\nexport const DrawerContent: React.FC<Omit<FieldsDrawerProps, 'drawerSlug' | 'drawerTitle'>> = ({\n data,\n featureKey,\n fieldMapOverride,\n handleDrawerSubmit,\n schemaFieldsPathOverride,\n schemaPath,\n schemaPathSuffix,\n}) => {\n const { t } = useTranslation()\n const { id, collectionSlug, getDocPreferences, globalSlug } = useDocumentInfo()\n const { fields: parentDocumentFields } = useDocumentForm()\n const isEditable = useLexicalEditable()\n\n const onChangeAbortControllerRef = useRef(new AbortController())\n\n const [initialState, setInitialState] = useState<false | FormState | undefined>(false)\n\n const {\n fieldProps: { featureClientSchemaMap },\n } = useEditorConfigContext()\n\n const { getFormState } = useServerFunctions()\n\n const schemaFieldsPath =\n schemaFieldsPathOverride ??\n `${schemaPath}.lexical_internal_feature.${featureKey}${schemaPathSuffix ? `.${schemaPathSuffix}` : ''}`\n\n const fields: any = fieldMapOverride ?? featureClientSchemaMap[featureKey]?.[schemaFieldsPath] // Field Schema\n\n // Parent form state changes after autosave. Read its latest value when initializing without\n // reinitializing this drawer and discarding its unsaved form state after every parent update.\n const getInitialState = useEffectEvent(async (controller: AbortController) => {\n const { state } = await getFormState({\n id,\n collectionSlug,\n data: data ?? {},\n docPermissions: {\n fields: true,\n },\n docPreferences: await getDocPreferences(),\n documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {\n excludeFiles: true,\n }),\n globalSlug,\n initialBlockData: data,\n operation: 'update',\n readOnly: !isEditable,\n renderAllFields: true,\n schemaPath: schemaFieldsPath,\n signal: controller.signal,\n })\n\n setInitialState(state)\n })\n\n useEffect(() => {\n const controller = new AbortController()\n\n void getInitialState(controller)\n\n return () => {\n abortAndIgnore(controller)\n }\n }, [\n schemaFieldsPath,\n id,\n data,\n getFormState,\n collectionSlug,\n isEditable,\n globalSlug,\n getDocPreferences,\n ])\n\n const onChange = useCallback(\n async ({ formState: prevFormState }: { formState: FormState }) => {\n abortAndIgnore(onChangeAbortControllerRef.current)\n\n const controller = new AbortController()\n onChangeAbortControllerRef.current = controller\n\n const { state } = await getFormState({\n id,\n collectionSlug,\n docPermissions: {\n fields: true,\n },\n docPreferences: await getDocPreferences(),\n documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {\n excludeFiles: true,\n }),\n formState: prevFormState,\n globalSlug,\n initialBlockFormState: prevFormState,\n operation: 'update',\n readOnly: !isEditable,\n schemaPath: schemaFieldsPath,\n signal: controller.signal,\n })\n\n if (!state) {\n return prevFormState\n }\n\n return state\n },\n [\n getFormState,\n id,\n isEditable,\n collectionSlug,\n getDocPreferences,\n parentDocumentFields,\n globalSlug,\n schemaFieldsPath,\n ],\n )\n\n // cleanup effect\n useEffect(() => {\n return () => {\n abortAndIgnore(onChangeAbortControllerRef.current)\n }\n }, [])\n\n if (initialState === false) {\n return null\n }\n\n return (\n <Form\n beforeSubmit={[onChange]}\n disableValidationOnSubmit\n fields={Array.isArray(fields) ? fields : []}\n initialState={initialState}\n onChange={[onChange]}\n onSubmit={handleDrawerSubmit}\n uuid={uuid()}\n >\n <RenderFields\n fields={Array.isArray(fields) ? fields : []}\n forceRender\n parentIndexPath=\"\"\n parentPath=\"\" // See Blocks feature path for details as for why this is empty\n parentSchemaPath={schemaFieldsPath}\n permissions={true}\n readOnly={!isEditable}\n />\n <FormSubmit>{t('fields:saveChanges')}</FormSubmit>\n </Form>\n )\n}\n"],"mappings":"AAAA;;;AAGA,SAASA,kBAAkB,QAAQ;AACnC,SACEC,IAAI,EACJC,UAAU,EACVC,YAAY,EACZC,eAAe,EACfC,eAAe,EACfC,cAAc,EACdC,kBAAkB,EAClBC,cAAc,QACT;AACP,SAASC,cAAc,QAAQ;AAC/B,SAASC,0CAA0C,QAAQ;AAC3D,OAAOC,KAAA,IAASC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AAChE,SAASC,EAAA,IAAMC,IAAI,QAAQ;AAI3B,SAASC,sBAAsB,QAAQ;AAEvC,OAAO,MAAMC,aAAA,GAAiFA,CAAC;EAC7FC,IAAI;EACJC,UAAU;EACVC,gBAAgB;EAChBC,kBAAkB;EAClBC,wBAAwB;EACxBC,UAAU;EACVC;AAAgB,CACjB;EACC,MAAM;IAAEC;EAAC,CAAE,GAAGnB,cAAA;EACd,MAAM;IAAEoB,EAAE;IAAEC,cAAc;IAAEC,iBAAiB;IAAEC;EAAU,CAAE,GAAG1B,eAAA;EAC9D,MAAM;IAAE2B,MAAA,EAAQC;EAAoB,CAAE,GAAG7B,eAAA;EACzC,MAAM8B,UAAA,GAAalC,kBAAA;EAEnB,MAAMmC,0BAAA,GAA6BrB,MAAA,CAAO,IAAIsB,eAAA;EAE9C,MAAM,CAACC,YAAA,EAAcC,eAAA,CAAgB,GAAGvB,QAAA,CAAwC;EAEhF,MAAM;IACJwB,UAAA,EAAY;MAAEC;IAAsB;EAAE,CACvC,GAAGtB,sBAAA;EAEJ,MAAM;IAAEuB;EAAY,CAAE,GAAGlC,kBAAA;EAEzB,MAAMmC,gBAAA,GACJlB,wBAAA,IACA,GAAGC,UAAA,6BAAuCJ,UAAA,GAAaK,gBAAA,GAAmB,IAAIA,gBAAA,EAAkB,GAAG,IAAI;EAEzG,MAAMM,MAAA,GAAcV,gBAAA,IAAoBkB,sBAAsB,CAACnB,UAAA,CAAW,GAAGqB,gBAAA,CAAiB,CAAC;AAAA;EAE/F;EACA;EACA,MAAMC,eAAA,GAAkBrC,cAAA,CAAe,MAAOsC,UAAA;IAC5C,MAAM;MAAEC;IAAK,CAAE,GAAG,MAAMJ,YAAA,CAAa;MACnCb,EAAA;MACAC,cAAA;MACAT,IAAA,EAAMA,IAAA,IAAQ,CAAC;MACf0B,cAAA,EAAgB;QACdd,MAAA,EAAQ;MACV;MACAe,cAAA,EAAgB,MAAMjB,iBAAA;MACtBkB,iBAAA,EAAmBtC,0CAAA,CAA2CuB,oBAAA,EAAsB;QAClFgB,YAAA,EAAc;MAChB;MACAlB,UAAA;MACAmB,gBAAA,EAAkB9B,IAAA;MAClB+B,SAAA,EAAW;MACXC,QAAA,EAAU,CAAClB,UAAA;MACXmB,eAAA,EAAiB;MACjB5B,UAAA,EAAYiB,gBAAA;MACZY,MAAA,EAAQV,UAAA,CAAWU;IACrB;IAEAhB,eAAA,CAAgBO,KAAA;EAClB;EAEAhC,SAAA,CAAU;IACR,MAAM+B,YAAA,GAAa,IAAIR,eAAA;IAEvB,KAAKO,eAAA,CAAgBC,YAAA;IAErB,OAAO;MACLnC,cAAA,CAAemC,YAAA;IACjB;EACF,GAAG,CACDF,gBAAA,EACAd,EAAA,EACAR,IAAA,EACAqB,YAAA,EACAZ,cAAA,EACAK,UAAA,EACAH,UAAA,EACAD,iBAAA,CACD;EAED,MAAMyB,QAAA,GAAW3C,WAAA,CACf,OAAO;IAAE4C,SAAA,EAAWC;EAAa,CAA4B;IAC3DhD,cAAA,CAAe0B,0BAAA,CAA2BuB,OAAO;IAEjD,MAAMd,YAAA,GAAa,IAAIR,eAAA;IACvBD,0BAAA,CAA2BuB,OAAO,GAAGd,YAAA;IAErC,MAAM;MAAEC,KAAK,EAALA;IAAK,CAAE,GAAG,MAAMJ,YAAA,CAAa;MACnCb,EAAA;MACAC,cAAA;MACAiB,cAAA,EAAgB;QACdd,MAAA,EAAQ;MACV;MACAe,cAAA,EAAgB,MAAMjB,iBAAA;MACtBkB,iBAAA,EAAmBtC,0CAAA,CAA2CuB,oBAAA,EAAsB;QAClFgB,YAAA,EAAc;MAChB;MACAO,SAAA,EAAWC,aAAA;MACX1B,UAAA;MACA4B,qBAAA,EAAuBF,aAAA;MACvBN,SAAA,EAAW;MACXC,QAAA,EAAU,CAAClB,UAAA;MACXT,UAAA,EAAYiB,gBAAA;MACZY,MAAA,EAAQV,YAAA,CAAWU;IACrB;IAEA,IAAI,CAACT,OAAA,EAAO;MACV,OAAOY,aAAA;IACT;IAEA,OAAOZ,OAAA;EACT,GACA,CACEJ,YAAA,EACAb,EAAA,EACAM,UAAA,EACAL,cAAA,EACAC,iBAAA,EACAG,oBAAA,EACAF,UAAA,EACAW,gBAAA,CACD;EAGH;EACA7B,SAAA,CAAU;IACR,OAAO;MACLJ,cAAA,CAAe0B,0BAAA,CAA2BuB,OAAO;IACnD;EACF,GAAG,EAAE;EAEL,IAAIrB,YAAA,KAAiB,OAAO;IAC1B,OAAO;EACT;EAEA,oBACEuB,KAAA,CAAC3D,IAAA;IACC4D,YAAA,EAAc,CAACN,QAAA,CAAS;IACxBO,yBAAyB;IACzB9B,MAAA,EAAQ+B,KAAA,CAAMC,OAAO,CAAChC,MAAA,IAAUA,MAAA,GAAS,EAAE;IAC3CK,YAAA,EAAcA,YAAA;IACdkB,QAAA,EAAU,CAACA,QAAA,CAAS;IACpBU,QAAA,EAAU1C,kBAAA;IACVN,IAAA,EAAMA,IAAA;4BAENiD,IAAA,CAAC/D,YAAA;MACC6B,MAAA,EAAQ+B,KAAA,CAAMC,OAAO,CAAChC,MAAA,IAAUA,MAAA,GAAS,EAAE;MAC3CmC,WAAW;MACXC,eAAA,EAAgB;MAChBC,UAAA,EAAW;MACXC,gBAAA,EAAkB5B,gBAAA;MAClB6B,WAAA,EAAa;MACbnB,QAAA,EAAU,CAAClB;qBAEbgC,IAAA,CAAChE,UAAA;gBAAYyB,CAAA,CAAE;;;AAGrB","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/richtext-lexical",
3
- "version": "3.86.0",
3
+ "version": "3.87.1",
4
4
  "description": "The officially supported Lexical richtext adapter for Payload",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -378,8 +378,8 @@
378
378
  "react-error-boundary": "4.1.2",
379
379
  "ts-essentials": "10.0.3",
380
380
  "uuid": "13.0.2",
381
- "@payloadcms/translations": "3.86.0",
382
- "@payloadcms/ui": "3.86.0"
381
+ "@payloadcms/translations": "3.87.1",
382
+ "@payloadcms/ui": "3.87.1"
383
383
  },
384
384
  "devDependencies": {
385
385
  "@babel/cli": "7.27.2",
@@ -398,16 +398,16 @@
398
398
  "esbuild": "0.27.1",
399
399
  "esbuild-sass-plugin": "3.3.1",
400
400
  "swc-plugin-transform-remove-imports": "8.3.0",
401
- "payload": "3.86.0",
402
- "@payloadcms/eslint-config": "3.28.0"
401
+ "@payloadcms/eslint-config": "3.28.0",
402
+ "payload": "3.87.1"
403
403
  },
404
404
  "peerDependencies": {
405
405
  "@faceless-ui/modal": "3.0.0",
406
406
  "@faceless-ui/scroll-info": "2.0.0",
407
407
  "react": "^19.0.1 || ^19.1.2 || ^19.2.1",
408
408
  "react-dom": "^19.0.1 || ^19.1.2 || ^19.2.1",
409
- "@payloadcms/next": "3.86.0",
410
- "payload": "3.86.0"
409
+ "@payloadcms/next": "3.87.1",
410
+ "payload": "3.87.1"
411
411
  },
412
412
  "engines": {
413
413
  "node": "^18.20.2 || >=20.9.0"
@@ -1,2 +0,0 @@
1
- import{b as R}from"./chunk-BZZVLW4U.js";import{c as q}from"react/compiler-runtime";import{jsx as x}from"react/jsx-runtime";import{Drawer as z,EditDepthProvider as G,useModal as J}from"@payloadcms/ui";import"react";import{jsx as O,jsxs as M}from"react/jsx-runtime";import{useLexicalEditable as j}from"@lexical/react/useLexicalEditable";import{Form as T,FormSubmit as v,RenderFields as N,useDocumentForm as W,useDocumentInfo as $,useServerFunctions as k,useTranslation as L}from"@payloadcms/ui";import{abortAndIgnore as _}from"@payloadcms/ui/shared";import{deepCopyObjectSimpleWithoutReactComponents as y}from"payload/shared";import{useCallback as B,useEffect as I,useRef as H,useState as U}from"react";import{v4 as V}from"uuid";var E=({data:f,featureKey:e,fieldMapOverride:p,handleDrawerSubmit:h,schemaFieldsPathOverride:o,schemaPath:g,schemaPathSuffix:m})=>{let{t:S}=L(),{id:a,collectionSlug:n,getDocPreferences:i,globalSlug:s}=$(),{fields:l}=W(),r=j(),t=H(new AbortController),[c,w]=U(!1),{fieldProps:{featureClientSchemaMap:P}}=R(),{getFormState:C}=k(),u=o??`${g}.lexical_internal_feature.${e}${m?`.${m}`:""}`,b=p??P[e]?.[u];I(()=>{let d=new AbortController;return(async()=>{let{state:D}=await C({id:a,collectionSlug:n,data:f??{},docPermissions:{fields:!0},docPreferences:await i(),documentFormState:y(l,{excludeFiles:!0}),globalSlug:s,initialBlockData:f,operation:"update",readOnly:!r,renderAllFields:!0,schemaPath:u,signal:d.signal});w(D)})(),()=>{_(d)}},[u,a,f,C,n,r,s,i,l]);let F=B(async({formState:d})=>{_(t.current);let A=new AbortController;t.current=A;let{state:D}=await C({id:a,collectionSlug:n,docPermissions:{fields:!0},docPreferences:await i(),documentFormState:y(l,{excludeFiles:!0}),formState:d,globalSlug:s,initialBlockFormState:d,operation:"update",readOnly:!r,schemaPath:u,signal:A.signal});return D||d},[C,a,r,n,i,l,s,u]);return I(()=>()=>{_(t.current)},[]),c===!1?null:M(T,{beforeSubmit:[F],disableValidationOnSubmit:!0,fields:Array.isArray(b)?b:[],initialState:c,onChange:[F],onSubmit:h,uuid:V(),children:[O(N,{fields:Array.isArray(b)?b:[],forceRender:!0,parentIndexPath:"",parentPath:"",parentSchemaPath:u,permissions:!0,readOnly:!r}),O(v,{children:S("fields:saveChanges")})]})};var de=f=>{let e=q(15),{className:p,data:h,drawerSlug:o,drawerTitle:g,featureKey:m,fieldMapOverride:S,handleDrawerSubmit:a,schemaFieldsPathOverride:n,schemaPath:i,schemaPathSuffix:s}=f,{closeModal:l}=J(),r=g??"",t;e[0]!==l||e[1]!==o||e[2]!==a?(t=(w,P)=>{l(o),setTimeout(()=>{a(w,P)},1)},e[0]=l,e[1]=o,e[2]=a,e[3]=t):t=e[3];let c;return e[4]!==p||e[5]!==h||e[6]!==o||e[7]!==m||e[8]!==S||e[9]!==n||e[10]!==i||e[11]!==s||e[12]!==r||e[13]!==t?(c=x(G,{children:x(z,{className:p,slug:o,title:r,children:x(E,{data:h,featureKey:m,fieldMapOverride:S,handleDrawerSubmit:t,schemaFieldsPathOverride:n,schemaPath:i,schemaPathSuffix:s})})}),e[4]=p,e[5]=h,e[6]=o,e[7]=m,e[8]=S,e[9]=n,e[10]=i,e[11]=s,e[12]=r,e[13]=t,e[14]=c):c=e[14],c};import{createCommand as K}from"lexical";var he=K("INSERT_UPLOAD_WITH_DRAWER_COMMAND");export{de as a,he as b};
2
- //# sourceMappingURL=chunk-QJ5EETIB.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/utilities/fieldsDrawer/Drawer.tsx", "../../../src/utilities/fieldsDrawer/DrawerContent.tsx", "../../../src/features/upload/client/drawer/commands.ts"],
4
- "sourcesContent": ["'use client'\nimport type { ClientField, Data, FormState, JsonObject } from 'payload'\n\nimport { Drawer, EditDepthProvider, useModal } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { DrawerContent } from './DrawerContent.js'\n\nexport type FieldsDrawerProps = {\n readonly className?: string\n readonly data?: Data\n readonly drawerSlug: string\n readonly drawerTitle?: string\n readonly featureKey: string\n readonly fieldMapOverride?: ClientField[]\n readonly handleDrawerSubmit: (fields: FormState, data: JsonObject) => void\n readonly schemaFieldsPathOverride?: string\n readonly schemaPath: string\n readonly schemaPathSuffix?: string\n}\n\n/**\n * This FieldsDrawer component can be used to easily create a Drawer that contains a form with fields within your feature.\n * The fields are taken directly from the schema map based on your `featureKey` and `schemaPathSuffix`. Thus, this can only\n * be used if you provide your field schema inside the `generateSchemaMap` prop of your feature.server.ts.\n */\nexport const FieldsDrawer: React.FC<FieldsDrawerProps> = ({\n className,\n data,\n drawerSlug,\n drawerTitle,\n featureKey,\n fieldMapOverride,\n handleDrawerSubmit,\n schemaFieldsPathOverride,\n schemaPath,\n schemaPathSuffix,\n}) => {\n const { closeModal } = useModal()\n // The Drawer only renders its children (and itself) if it's open. Thus, by extracting the main content\n // to DrawerContent, this should be faster\n return (\n <EditDepthProvider>\n <Drawer className={className} slug={drawerSlug} title={drawerTitle ?? ''}>\n <DrawerContent\n data={data}\n featureKey={featureKey}\n fieldMapOverride={fieldMapOverride}\n handleDrawerSubmit={(args, args2) => {\n // Simply close drawer - no need for useLexicalDrawer here as at this point,\n // we don't need to restore the cursor position. This is handled by the useEffect in useLexicalDrawer.\n closeModal(drawerSlug)\n\n // Actual drawer submit logic needs to be triggered after the drawer is closed.\n // That's because the lexical selection / cursor restore logic that is striggerer by\n // `useLexicalDrawer` neeeds to be triggered before any editor.update calls that may happen\n // in the `handleDrawerSubmit` function.\n setTimeout(() => {\n handleDrawerSubmit(args, args2)\n }, 1)\n }}\n schemaFieldsPathOverride={schemaFieldsPathOverride}\n schemaPath={schemaPath}\n schemaPathSuffix={schemaPathSuffix}\n />\n </Drawer>\n </EditDepthProvider>\n )\n}\n", "'use client'\nimport type { FormState } from 'payload'\n\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n Form,\n FormSubmit,\n RenderFields,\n useDocumentForm,\n useDocumentInfo,\n useServerFunctions,\n useTranslation,\n} from '@payloadcms/ui'\nimport { abortAndIgnore } from '@payloadcms/ui/shared'\nimport { deepCopyObjectSimpleWithoutReactComponents } from 'payload/shared'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { v4 as uuid } from 'uuid'\n\nimport type { FieldsDrawerProps } from './Drawer.js'\n\nimport { useEditorConfigContext } from '../../lexical/config/client/EditorConfigProvider.js'\n\nexport const DrawerContent: React.FC<Omit<FieldsDrawerProps, 'drawerSlug' | 'drawerTitle'>> = ({\n data,\n featureKey,\n fieldMapOverride,\n handleDrawerSubmit,\n schemaFieldsPathOverride,\n schemaPath,\n schemaPathSuffix,\n}) => {\n const { t } = useTranslation()\n const { id, collectionSlug, getDocPreferences, globalSlug } = useDocumentInfo()\n const { fields: parentDocumentFields } = useDocumentForm()\n const isEditable = useLexicalEditable()\n\n const onChangeAbortControllerRef = useRef(new AbortController())\n\n const [initialState, setInitialState] = useState<false | FormState | undefined>(false)\n\n const {\n fieldProps: { featureClientSchemaMap },\n } = useEditorConfigContext()\n\n const { getFormState } = useServerFunctions()\n\n const schemaFieldsPath =\n schemaFieldsPathOverride ??\n `${schemaPath}.lexical_internal_feature.${featureKey}${schemaPathSuffix ? `.${schemaPathSuffix}` : ''}`\n\n const fields: any = fieldMapOverride ?? featureClientSchemaMap[featureKey]?.[schemaFieldsPath] // Field Schema\n\n useEffect(() => {\n const controller = new AbortController()\n\n const awaitInitialState = async () => {\n const { state } = await getFormState({\n id,\n collectionSlug,\n data: data ?? {},\n docPermissions: {\n fields: true,\n },\n docPreferences: await getDocPreferences(),\n documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {\n excludeFiles: true,\n }),\n globalSlug,\n initialBlockData: data,\n operation: 'update',\n readOnly: !isEditable,\n renderAllFields: true,\n schemaPath: schemaFieldsPath,\n signal: controller.signal,\n })\n\n setInitialState(state)\n }\n\n void awaitInitialState()\n\n return () => {\n abortAndIgnore(controller)\n }\n }, [\n schemaFieldsPath,\n id,\n data,\n getFormState,\n collectionSlug,\n isEditable,\n globalSlug,\n getDocPreferences,\n parentDocumentFields,\n ])\n\n const onChange = useCallback(\n async ({ formState: prevFormState }: { formState: FormState }) => {\n abortAndIgnore(onChangeAbortControllerRef.current)\n\n const controller = new AbortController()\n onChangeAbortControllerRef.current = controller\n\n const { state } = await getFormState({\n id,\n collectionSlug,\n docPermissions: {\n fields: true,\n },\n docPreferences: await getDocPreferences(),\n documentFormState: deepCopyObjectSimpleWithoutReactComponents(parentDocumentFields, {\n excludeFiles: true,\n }),\n formState: prevFormState,\n globalSlug,\n initialBlockFormState: prevFormState,\n operation: 'update',\n readOnly: !isEditable,\n schemaPath: schemaFieldsPath,\n signal: controller.signal,\n })\n\n if (!state) {\n return prevFormState\n }\n\n return state\n },\n [\n getFormState,\n id,\n isEditable,\n collectionSlug,\n getDocPreferences,\n parentDocumentFields,\n globalSlug,\n schemaFieldsPath,\n ],\n )\n\n // cleanup effect\n useEffect(() => {\n return () => {\n abortAndIgnore(onChangeAbortControllerRef.current)\n }\n }, [])\n\n if (initialState === false) {\n return null\n }\n\n return (\n <Form\n beforeSubmit={[onChange]}\n disableValidationOnSubmit\n fields={Array.isArray(fields) ? fields : []}\n initialState={initialState}\n onChange={[onChange]}\n onSubmit={handleDrawerSubmit}\n uuid={uuid()}\n >\n <RenderFields\n fields={Array.isArray(fields) ? fields : []}\n forceRender\n parentIndexPath=\"\"\n parentPath=\"\" // See Blocks feature path for details as for why this is empty\n parentSchemaPath={schemaFieldsPath}\n permissions={true}\n readOnly={!isEditable}\n />\n <FormSubmit>{t('fields:saveChanges')}</FormSubmit>\n </Form>\n )\n}\n", "'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { createCommand } from 'lexical'\n\nexport const INSERT_UPLOAD_WITH_DRAWER_COMMAND: LexicalCommand<{\n replace: { nodeKey: string } | false\n}> = createCommand('INSERT_UPLOAD_WITH_DRAWER_COMMAND')\n"],
5
- "mappings": "wCAAA,OAAAA,KAAAC,MAAA,iEAGA,OAASC,UAAAA,EAAQC,qBAAAA,EAAmBC,YAAAA,MAAgB,iBACpD,MAAkB,0DCDlB,OAASC,sBAAAA,MAA0B,oCACnC,OACEC,QAAAA,EACAC,cAAAA,EACAC,gBAAAA,EACAC,mBAAAA,EACAC,mBAAAA,EACAC,sBAAAA,EACAC,kBAAAA,MACK,iBACP,OAASC,kBAAAA,MAAsB,wBAC/B,OAASC,8CAAAA,MAAkD,iBAC3D,OAAgBC,eAAAA,EAAaC,aAAAA,EAAWC,UAAAA,EAAQC,YAAAA,MAAgB,QAChE,OAASC,MAAMC,MAAY,OAMpB,IAAMC,EAAiFA,CAAC,CAC7FC,KAAAA,EACAC,WAAAA,EACAC,iBAAAA,EACAC,mBAAAA,EACAC,yBAAAA,EACAC,WAAAA,EACAC,iBAAAA,CAAgB,IACjB,CACC,GAAM,CAAEC,EAAAA,CAAC,EAAKC,EAAA,EACR,CAAEC,GAAAA,EAAIC,eAAAA,EAAgBC,kBAAAA,EAAmBC,WAAAA,CAAU,EAAKC,EAAA,EACxD,CAAEC,OAAQC,CAAoB,EAAKC,EAAA,EACnCC,EAAaC,EAAA,EAEbC,EAA6BC,EAAO,IAAIC,eAAA,EAExC,CAACC,EAAcC,CAAA,EAAmBC,EAAwC,EAAA,EAE1E,CACJC,WAAY,CAAEC,uBAAAA,CAAsB,CAAE,EACpCC,EAAA,EAEE,CAAEC,aAAAA,CAAY,EAAKC,EAAA,EAEnBC,EACJ1B,GACA,GAAGC,CAAA,6BAAuCJ,CAAA,GAAaK,EAAmB,IAAIA,CAAA,GAAqB,EAAA,GAE/FQ,EAAcZ,GAAoBwB,EAAuBzB,CAAA,IAAc6B,CAAA,EAE7EC,EAAU,IAAA,CACR,IAAMC,EAAa,IAAIX,gBA0BvB,OAxB0B,SAAA,CACxB,GAAM,CAAEY,MAAAA,CAAK,EAAK,MAAML,EAAa,CACnCnB,GAAAA,EACAC,eAAAA,EACAV,KAAMA,GAAQ,CAAC,EACfkC,eAAgB,CACdpB,OAAQ,EACV,EACAqB,eAAgB,MAAMxB,EAAA,EACtByB,kBAAmBC,EAA2CtB,EAAsB,CAClFuB,aAAc,EAChB,CAAA,EACA1B,WAAAA,EACA2B,iBAAkBvC,EAClBwC,UAAW,SACXC,SAAU,CAACxB,EACXyB,gBAAiB,GACjBrC,WAAYyB,EACZa,OAAQX,EAAWW,MACrB,CAAA,EAEApB,EAAgBU,CAAA,CAClB,GAEK,EAEE,IAAA,CACLW,EAAeZ,CAAA,CACjB,CACF,EAAG,CACDF,EACArB,EACAT,EACA4B,EACAlB,EACAO,EACAL,EACAD,EACAI,CAAA,CACD,EAED,IAAM8B,EAAWC,EACf,MAAO,CAAEC,UAAWC,CAAa,IAA4B,CAC3DJ,EAAezB,EAA2B8B,OAAO,EAEjD,IAAMjB,EAAa,IAAIX,gBACvBF,EAA2B8B,QAAUjB,EAErC,GAAM,CAAEC,MAAAA,CAAK,EAAK,MAAML,EAAa,CACnCnB,GAAAA,EACAC,eAAAA,EACAwB,eAAgB,CACdpB,OAAQ,EACV,EACAqB,eAAgB,MAAMxB,EAAA,EACtByB,kBAAmBC,EAA2CtB,EAAsB,CAClFuB,aAAc,EAChB,CAAA,EACAS,UAAWC,EACXpC,WAAAA,EACAsC,sBAAuBF,EACvBR,UAAW,SACXC,SAAU,CAACxB,EACXZ,WAAYyB,EACZa,OAAQX,EAAWW,MACrB,CAAA,EAEA,OAAKV,GACIe,CAIX,EACA,CACEpB,EACAnB,EACAQ,EACAP,EACAC,EACAI,EACAH,EACAkB,CAAA,CACD,EAUH,OANAC,EAAU,IACD,IAAA,CACLa,EAAezB,EAA2B8B,OAAO,CACnD,EACC,CAAA,CAAE,EAED3B,IAAiB,GACZ,KAIP6B,EAACC,EAAA,CACCC,aAAc,CAACR,CAAA,EACfS,0BAAyB,GACzBxC,OAAQyC,MAAMC,QAAQ1C,CAAA,EAAUA,EAAS,CAAA,EACzCQ,aAAcA,EACduB,SAAU,CAACA,CAAA,EACXY,SAAUtD,EACVuD,KAAMA,EAAA,YAENC,EAACC,EAAA,CACC9C,OAAQyC,MAAMC,QAAQ1C,CAAA,EAAUA,EAAS,CAAA,EACzC+C,YAAW,GACXC,gBAAgB,GAChBC,WAAW,GACXC,iBAAkBlC,EAClBmC,YAAa,GACbxB,SAAU,CAACxB,IAEb0C,EAACO,EAAA,UAAY3D,EAAE,oBAAA,MAGrB,EDnJO,IAAM4D,GAA4CC,GAAA,CAAA,IAAAC,EAAAC,EAAA,EAAA,EAAC,CAAAC,UAAAA,EAAAC,KAAAA,EAAAC,WAAAA,EAAAC,YAAAA,EAAAC,WAAAA,EAAAC,iBAAAA,EAAAC,mBAAAA,EAAAC,yBAAAA,EAAAC,WAAAA,EAAAC,iBAAAA,CAAA,EAAAZ,EAYxD,CAAAa,WAAAA,CAAA,EAAuBC,EAAA,EAKoCC,EAAAT,GAAe,GAAAU,EAAAf,EAAA,CAAA,IAAAY,GAAAZ,EAAA,CAAA,IAAAI,GAAAJ,EAAA,CAAA,IAAAQ,GAK9CO,EAAAA,CAAAC,EAAAC,IAAA,CAGlBL,EAAWR,CAAA,EAMXc,WAAA,IAAA,CACEV,EAAmBQ,EAAMC,CAAA,CAAA,EAAA,CACxB,CAAA,EACLjB,EAAA,CAAA,EAAAY,EAAAZ,EAAA,CAAA,EAAAI,EAAAJ,EAAA,CAAA,EAAAQ,EAAAR,EAAA,CAAA,EAAAe,GAAAA,EAAAf,EAAA,CAAA,EAAA,IAAAmB,EAAA,OAAAnB,EAAA,CAAA,IAAAE,GAAAF,EAAA,CAAA,IAAAG,GAAAH,EAAA,CAAA,IAAAI,GAAAJ,EAAA,CAAA,IAAAM,GAAAN,EAAA,CAAA,IAAAO,GAAAP,EAAA,CAAA,IAAAS,GAAAT,EAAA,EAAA,IAAAU,GAAAV,EAAA,EAAA,IAAAW,GAAAX,EAAA,EAAA,IAAAc,GAAAd,EAAA,EAAA,IAAAe,GAlBNI,EAAAC,EAAAC,EAAA,CAAAC,SACEF,EAAAG,EAAA,CAAArB,UAAAA,EAAAsB,KAAoCpB,EAAAqB,MAAmBX,EAAeQ,SACpEF,EAAAM,EAAA,CAAAvB,KAAAA,EAAAG,WAAAA,EAAAC,iBAAAA,EAAAC,mBAIsBO,EAYpBN,yBAAAA,EAAAC,WAAAA,EAAAC,iBAAAA,CAAA,CAAA,iGAlBNQ,GEvCJ,OAASQ,iBAAAA,MAAqB,UAEvB,IAAMC,GAERD,EAAc,mCAAA",
6
- "names": ["c", "_c", "Drawer", "EditDepthProvider", "useModal", "useLexicalEditable", "Form", "FormSubmit", "RenderFields", "useDocumentForm", "useDocumentInfo", "useServerFunctions", "useTranslation", "abortAndIgnore", "deepCopyObjectSimpleWithoutReactComponents", "useCallback", "useEffect", "useRef", "useState", "v4", "uuid", "DrawerContent", "data", "featureKey", "fieldMapOverride", "handleDrawerSubmit", "schemaFieldsPathOverride", "schemaPath", "schemaPathSuffix", "t", "useTranslation", "id", "collectionSlug", "getDocPreferences", "globalSlug", "useDocumentInfo", "fields", "parentDocumentFields", "useDocumentForm", "isEditable", "useLexicalEditable", "onChangeAbortControllerRef", "useRef", "AbortController", "initialState", "setInitialState", "useState", "fieldProps", "featureClientSchemaMap", "useEditorConfigContext", "getFormState", "useServerFunctions", "schemaFieldsPath", "useEffect", "controller", "state", "docPermissions", "docPreferences", "documentFormState", "deepCopyObjectSimpleWithoutReactComponents", "excludeFiles", "initialBlockData", "operation", "readOnly", "renderAllFields", "signal", "abortAndIgnore", "onChange", "useCallback", "formState", "prevFormState", "current", "initialBlockFormState", "_jsxs", "Form", "beforeSubmit", "disableValidationOnSubmit", "Array", "isArray", "onSubmit", "uuid", "_jsx", "RenderFields", "forceRender", "parentIndexPath", "parentPath", "parentSchemaPath", "permissions", "FormSubmit", "FieldsDrawer", "t0", "$", "_c", "className", "data", "drawerSlug", "drawerTitle", "featureKey", "fieldMapOverride", "handleDrawerSubmit", "schemaFieldsPathOverride", "schemaPath", "schemaPathSuffix", "closeModal", "useModal", "t1", "t2", "args", "args2", "setTimeout", "t3", "_jsx", "EditDepthProvider", "children", "Drawer", "slug", "title", "DrawerContent", "createCommand", "INSERT_UPLOAD_WITH_DRAWER_COMMAND"]
7
- }