@payloadcms/richtext-lexical 3.0.2 → 3.0.3-canary.27acdae

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 (211) hide show
  1. package/dist/exports/client/Field-OHQPCDNR.js +2 -0
  2. package/dist/exports/client/Field-OHQPCDNR.js.map +7 -0
  3. package/dist/exports/client/RelationshipComponent-XOQBVKA3.js +2 -0
  4. package/dist/exports/client/RelationshipComponent-XOQBVKA3.js.map +7 -0
  5. package/dist/exports/client/bundled.css +1 -1
  6. package/dist/exports/client/chunk-2L2Z4JHF.js +12 -0
  7. package/dist/exports/client/chunk-2L2Z4JHF.js.map +7 -0
  8. package/dist/exports/client/{chunk-C7S3V4EB.js → chunk-DOK5S7LE.js} +2 -2
  9. package/dist/exports/client/chunk-DOK5S7LE.js.map +7 -0
  10. package/dist/exports/client/chunk-KYPSISKB.js +2 -0
  11. package/dist/exports/client/chunk-KYPSISKB.js.map +7 -0
  12. package/dist/exports/client/chunk-ZTAS32RX.js +2 -0
  13. package/dist/exports/client/{chunk-MI5HS4QX.js.map → chunk-ZTAS32RX.js.map} +3 -3
  14. package/dist/exports/client/{component-H3EYQ5KG.js → component-D6PKVJ2K.js} +2 -2
  15. package/dist/exports/client/component-D6PKVJ2K.js.map +7 -0
  16. package/dist/exports/client/componentInline-EYXL5S2C.js +2 -0
  17. package/dist/exports/client/index.d.ts +3 -0
  18. package/dist/exports/client/index.d.ts.map +1 -1
  19. package/dist/exports/client/index.js +11 -11
  20. package/dist/exports/client/index.js.map +3 -3
  21. package/dist/exports/server/ast/mdx.d.ts.map +1 -1
  22. package/dist/exports/server/ast/mdx.js +6 -0
  23. package/dist/exports/server/ast/mdx.js.map +1 -1
  24. package/dist/features/align/server/i18n.d.ts.map +1 -1
  25. package/dist/features/align/server/i18n.js +6 -0
  26. package/dist/features/align/server/i18n.js.map +1 -1
  27. package/dist/features/blockquote/server/i18n.d.ts.map +1 -1
  28. package/dist/features/blockquote/server/i18n.js +3 -0
  29. package/dist/features/blockquote/server/i18n.js.map +1 -1
  30. package/dist/features/blockquote/server/index.d.ts.map +1 -1
  31. package/dist/features/blockquote/server/index.js +2 -1
  32. package/dist/features/blockquote/server/index.js.map +1 -1
  33. package/dist/features/blocks/client/component/index.d.ts.map +1 -1
  34. package/dist/features/blocks/client/component/index.js +27 -9
  35. package/dist/features/blocks/client/component/index.js.map +1 -1
  36. package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.d.ts +1 -1
  37. package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.d.ts.map +1 -1
  38. package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js.map +1 -1
  39. package/dist/features/blocks/client/componentInline/index.d.ts.map +1 -1
  40. package/dist/features/blocks/client/componentInline/index.js +27 -7
  41. package/dist/features/blocks/client/componentInline/index.js.map +1 -1
  42. package/dist/features/blocks/client/index.d.ts.map +1 -1
  43. package/dist/features/blocks/client/index.js.map +1 -1
  44. package/dist/features/blocks/server/graphQLPopulationPromise.d.ts.map +1 -1
  45. package/dist/features/blocks/server/graphQLPopulationPromise.js.map +1 -1
  46. package/dist/features/blocks/server/i18n.d.ts.map +1 -1
  47. package/dist/features/blocks/server/i18n.js +9 -0
  48. package/dist/features/blocks/server/i18n.js.map +1 -1
  49. package/dist/features/converters/html/converter/converters/paragraph.d.ts.map +1 -1
  50. package/dist/features/converters/html/converter/converters/paragraph.js +2 -1
  51. package/dist/features/converters/html/converter/converters/paragraph.js.map +1 -1
  52. package/dist/features/converters/html/converter/defaultConverters.d.ts +1 -1
  53. package/dist/features/converters/html/converter/defaultConverters.d.ts.map +1 -1
  54. package/dist/features/converters/html/converter/defaultConverters.js.map +1 -1
  55. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.d.ts.map +1 -1
  56. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js +23 -17
  57. package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
  58. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.d.ts.map +1 -1
  59. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js +4 -2
  60. package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
  61. package/dist/features/experimental_table/client/utils/debounce.d.ts.map +1 -1
  62. package/dist/features/experimental_table/client/utils/debounce.js +3 -0
  63. package/dist/features/experimental_table/client/utils/debounce.js.map +1 -1
  64. package/dist/features/experimental_table/client/utils/useDebounce.d.ts +1 -5
  65. package/dist/features/experimental_table/client/utils/useDebounce.d.ts.map +1 -1
  66. package/dist/features/experimental_table/client/utils/useDebounce.js +40 -10
  67. package/dist/features/experimental_table/client/utils/useDebounce.js.map +1 -1
  68. package/dist/features/heading/server/i18n.d.ts.map +1 -1
  69. package/dist/features/heading/server/i18n.js +3 -0
  70. package/dist/features/heading/server/i18n.js.map +1 -1
  71. package/dist/features/heading/server/index.d.ts.map +1 -1
  72. package/dist/features/heading/server/index.js +2 -1
  73. package/dist/features/heading/server/index.js.map +1 -1
  74. package/dist/features/horizontalRule/server/i18n.d.ts.map +1 -1
  75. package/dist/features/horizontalRule/server/i18n.js +3 -0
  76. package/dist/features/horizontalRule/server/i18n.js.map +1 -1
  77. package/dist/features/indent/server/i18n.d.ts.map +1 -1
  78. package/dist/features/indent/server/i18n.js +4 -0
  79. package/dist/features/indent/server/i18n.js.map +1 -1
  80. package/dist/features/link/server/i18n.d.ts.map +1 -1
  81. package/dist/features/link/server/i18n.js +4 -0
  82. package/dist/features/link/server/i18n.js.map +1 -1
  83. package/dist/features/lists/checklist/server/i18n.d.ts.map +1 -1
  84. package/dist/features/lists/checklist/server/i18n.js +3 -0
  85. package/dist/features/lists/checklist/server/i18n.js.map +1 -1
  86. package/dist/features/lists/checklist/server/index.js.map +1 -1
  87. package/dist/features/lists/orderedList/server/i18n.d.ts.map +1 -1
  88. package/dist/features/lists/orderedList/server/i18n.js +3 -0
  89. package/dist/features/lists/orderedList/server/i18n.js.map +1 -1
  90. package/dist/features/lists/orderedList/server/index.js.map +1 -1
  91. package/dist/features/lists/unorderedList/server/i18n.d.ts.map +1 -1
  92. package/dist/features/lists/unorderedList/server/i18n.js +3 -0
  93. package/dist/features/lists/unorderedList/server/i18n.js.map +1 -1
  94. package/dist/features/lists/unorderedList/server/index.js.map +1 -1
  95. package/dist/features/paragraph/server/i18n.d.ts.map +1 -1
  96. package/dist/features/paragraph/server/i18n.js +4 -0
  97. package/dist/features/paragraph/server/i18n.js.map +1 -1
  98. package/dist/features/relationship/client/components/RelationshipComponent.d.ts.map +1 -1
  99. package/dist/features/relationship/client/components/RelationshipComponent.js +1 -3
  100. package/dist/features/relationship/client/components/RelationshipComponent.js.map +1 -1
  101. package/dist/features/relationship/client/drawer/index.js.map +1 -1
  102. package/dist/features/relationship/server/i18n.d.ts.map +1 -1
  103. package/dist/features/relationship/server/i18n.js +3 -0
  104. package/dist/features/relationship/server/i18n.js.map +1 -1
  105. package/dist/features/relationship/server/nodes/RelationshipNode.d.ts +1 -1
  106. package/dist/features/relationship/server/nodes/RelationshipNode.d.ts.map +1 -1
  107. package/dist/features/relationship/server/nodes/RelationshipNode.js +3 -3
  108. package/dist/features/relationship/server/nodes/RelationshipNode.js.map +1 -1
  109. package/dist/features/toolbars/fixed/client/Toolbar/index.d.ts +2 -2
  110. package/dist/features/toolbars/fixed/client/Toolbar/index.d.ts.map +1 -1
  111. package/dist/features/toolbars/fixed/client/Toolbar/index.js +64 -71
  112. package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
  113. package/dist/features/toolbars/inline/client/Toolbar/index.js +31 -51
  114. package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
  115. package/dist/features/toolbars/shared/ToolbarButton/index.d.ts.map +1 -1
  116. package/dist/features/toolbars/shared/ToolbarButton/index.js +152 -62
  117. package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
  118. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.d.ts +1 -1
  119. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.d.ts.map +1 -1
  120. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js +4 -2
  121. package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
  122. package/dist/features/toolbars/shared/ToolbarDropdown/index.d.ts.map +1 -1
  123. package/dist/features/toolbars/shared/ToolbarDropdown/index.js +8 -20
  124. package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
  125. package/dist/features/toolbars/types.d.ts +9 -0
  126. package/dist/features/toolbars/types.d.ts.map +1 -1
  127. package/dist/features/toolbars/types.js.map +1 -1
  128. package/dist/features/typesClient.d.ts +39 -36
  129. package/dist/features/typesClient.d.ts.map +1 -1
  130. package/dist/features/typesClient.js.map +1 -1
  131. package/dist/features/typesServer.d.ts.map +1 -1
  132. package/dist/features/typesServer.js.map +1 -1
  133. package/dist/features/upload/client/component/index.js.map +1 -1
  134. package/dist/features/upload/client/drawer/index.js.map +1 -1
  135. package/dist/features/upload/client/nodes/UploadNode.d.ts +1 -1
  136. package/dist/features/upload/client/nodes/UploadNode.d.ts.map +1 -1
  137. package/dist/features/upload/client/nodes/UploadNode.js.map +1 -1
  138. package/dist/features/upload/client/plugin/index.d.ts +2 -2
  139. package/dist/features/upload/client/plugin/index.d.ts.map +1 -1
  140. package/dist/features/upload/client/plugin/index.js.map +1 -1
  141. package/dist/features/upload/server/i18n.d.ts.map +1 -1
  142. package/dist/features/upload/server/i18n.js +3 -0
  143. package/dist/features/upload/server/i18n.js.map +1 -1
  144. package/dist/features/upload/server/nodes/UploadNode.d.ts +1 -1
  145. package/dist/features/upload/server/nodes/UploadNode.d.ts.map +1 -1
  146. package/dist/features/upload/server/nodes/UploadNode.js.map +1 -1
  147. package/dist/field/Field.d.ts +1 -1
  148. package/dist/field/Field.d.ts.map +1 -1
  149. package/dist/field/Field.js +2 -1
  150. package/dist/field/Field.js.map +1 -1
  151. package/dist/field/bundled.css +1 -1
  152. package/dist/field/rscEntry.js +1 -1
  153. package/dist/field/rscEntry.js.map +1 -1
  154. package/dist/i18n.d.ts.map +1 -1
  155. package/dist/i18n.js +70 -32
  156. package/dist/i18n.js.map +1 -1
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +5 -0
  159. package/dist/index.js.map +1 -1
  160. package/dist/lexical/LexicalProvider.d.ts.map +1 -1
  161. package/dist/lexical/LexicalProvider.js.map +1 -1
  162. package/dist/lexical/config/client/sanitize.js.map +1 -1
  163. package/dist/lexical/config/server/sanitize.d.ts.map +1 -1
  164. package/dist/lexical/config/server/sanitize.js +1 -0
  165. package/dist/lexical/config/server/sanitize.js.map +1 -1
  166. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.d.ts +2 -3
  167. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.d.ts.map +1 -1
  168. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js +139 -89
  169. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
  170. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.d.ts +2 -3
  171. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.d.ts.map +1 -1
  172. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +4 -7
  173. package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
  174. package/dist/lexical/plugins/SlashMenu/index.d.ts.map +1 -1
  175. package/dist/lexical/plugins/SlashMenu/index.js +8 -14
  176. package/dist/lexical/plugins/SlashMenu/index.js.map +1 -1
  177. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.d.ts.map +1 -1
  178. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js +1 -0
  179. package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
  180. package/dist/lexical/plugins/handles/DraggableBlockPlugin/debounce.d.ts +1 -1
  181. package/dist/lexical/plugins/handles/DraggableBlockPlugin/debounce.d.ts.map +1 -1
  182. package/dist/lexical/plugins/handles/DraggableBlockPlugin/debounce.js +1 -1
  183. package/dist/lexical/plugins/handles/DraggableBlockPlugin/debounce.js.map +1 -1
  184. package/dist/utilities/buildInitialState.js +1 -1
  185. package/dist/utilities/buildInitialState.js.map +1 -1
  186. package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
  187. package/dist/utilities/generateImportMap.d.ts.map +1 -1
  188. package/dist/utilities/generateImportMap.js +4 -1
  189. package/dist/utilities/generateImportMap.js.map +1 -1
  190. package/dist/utilities/jsx/jsx.d.ts.map +1 -1
  191. package/dist/utilities/jsx/jsx.js +1 -0
  192. package/dist/utilities/jsx/jsx.js.map +1 -1
  193. package/dist/utilities/migrateSlateToLexical/index.d.ts.map +1 -1
  194. package/dist/utilities/migrateSlateToLexical/index.js +1 -1
  195. package/dist/utilities/migrateSlateToLexical/index.js.map +1 -1
  196. package/dist/validate/index.d.ts.map +1 -1
  197. package/dist/validate/index.js.map +1 -1
  198. package/package.json +7 -7
  199. package/dist/exports/client/Field-IS3XMKMO.js +0 -2
  200. package/dist/exports/client/Field-IS3XMKMO.js.map +0 -7
  201. package/dist/exports/client/RelationshipComponent-2RT3YXUT.js +0 -2
  202. package/dist/exports/client/RelationshipComponent-2RT3YXUT.js.map +0 -7
  203. package/dist/exports/client/chunk-C7S3V4EB.js.map +0 -7
  204. package/dist/exports/client/chunk-CBUZKU7S.js +0 -12
  205. package/dist/exports/client/chunk-CBUZKU7S.js.map +0 -7
  206. package/dist/exports/client/chunk-MI5HS4QX.js +0 -2
  207. package/dist/exports/client/chunk-U7O7EYCP.js +0 -2
  208. package/dist/exports/client/chunk-U7O7EYCP.js.map +0 -7
  209. package/dist/exports/client/component-H3EYQ5KG.js.map +0 -7
  210. package/dist/exports/client/componentInline-ZGO3K4TA.js +0 -2
  211. /package/dist/exports/client/{componentInline-ZGO3K4TA.js.map → componentInline-EYXL5S2C.js.map} +0 -0
@@ -14,7 +14,8 @@ function SlashMenuItem({
14
14
  isSelected,
15
15
  item,
16
16
  onClick,
17
- onMouseEnter
17
+ onMouseEnter,
18
+ ref
18
19
  }) {
19
20
  const {
20
21
  fieldProps: {
@@ -47,11 +48,7 @@ function SlashMenuItem({
47
48
  id: baseClass + '__item-' + item.key,
48
49
  onClick: onClick,
49
50
  onMouseEnter: onMouseEnter,
50
- ref: element => {
51
- item.ref = {
52
- current: element
53
- };
54
- },
51
+ ref: ref,
55
52
  role: "option",
56
53
  tabIndex: -1,
57
54
  type: "button",
@@ -152,13 +149,6 @@ export function SlashMenuPlugin({
152
149
  }
153
150
  return groupsWithItems;
154
151
  }, [queryString, editorConfig?.features.slashMenu.groups, getDynamicItems, featureClientSchemaMap, i18n, schemaPath]);
155
- const onSelectItem = useCallback((selectedItem, closeMenu, matchingString) => {
156
- closeMenu();
157
- selectedItem.onSelect({
158
- editor,
159
- queryString: matchingString
160
- });
161
- }, [editor]);
162
152
  return /*#__PURE__*/_jsx(LexicalTypeaheadMenuPlugin, {
163
153
  anchorElem: anchorElem,
164
154
  groups: groups,
@@ -192,13 +182,17 @@ export function SlashMenuPlugin({
192
182
  },
193
183
  onMouseEnter: () => {
194
184
  setSelectedItemKey(item_0.key);
185
+ },
186
+ ref: el => {
187
+ item_0.ref = {
188
+ current: el
189
+ };
195
190
  }
196
191
  }, item_0.key))]
197
192
  }, group_4.key);
198
193
  })
199
194
  }), anchorElementRef.current) : null,
200
195
  onQueryChange: setQueryString,
201
- onSelectItem: onSelectItem,
202
196
  triggerFn: checkForTriggerMatch
203
197
  });
204
198
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useLexicalComposerContext","useTranslation","useCallback","useMemo","useState","React","ReactDOM","useEditorConfigContext","LexicalTypeaheadMenuPlugin","useMenuTriggerMatch","baseClass","SlashMenuItem","isSelected","item","onClick","onMouseEnter","fieldProps","featureClientSchemaMap","schemaPath","i18n","className","key","title","label","length","substring","_jsxs","id","ref","element","current","role","tabIndex","type","Icon","_jsx","SlashMenuPlugin","anchorElem","document","body","editor","queryString","setQueryString","editorConfig","checkForTriggerMatch","minLength","getDynamicItems","groupWithItems","dynamicItem","features","slashMenu","dynamicGroups","dynamicGroupWithItems","concat","groups","groupsWithItems","groupWithItem","push","map","group","filteredItems","items","filter","itemTitle","RegExp","exec","keywords","some","keyword","dynamicItemGroups","dynamicGroup","find","onSelectItem","selectedItem","closeMenu","matchingString","onSelect","menuRenderFn","anchorElementRef","selectedItemKey","selectItemAndCleanUp","setSelectedItemKey","createPortal","groupTitle","oi","index","onQueryChange","triggerFn"],"sources":["../../../../src/lexical/plugins/SlashMenu/index.tsx"],"sourcesContent":["'use client'\nimport type { TextNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useTranslation } from '@payloadcms/ui'\nimport { useCallback, useMemo, useState } from 'react'\nimport * as React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport type {\n SlashMenuGroup,\n SlashMenuGroupInternal,\n SlashMenuItemInternal,\n SlashMenuItem as SlashMenuItemType,\n} from './LexicalTypeaheadMenuPlugin/types.js'\n\nimport { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js'\nimport './index.scss'\nimport { LexicalTypeaheadMenuPlugin } from './LexicalTypeaheadMenuPlugin/index.js'\nimport { useMenuTriggerMatch } from './useMenuTriggerMatch.js'\n\nconst baseClass = 'slash-menu-popup'\n\nfunction SlashMenuItem({\n isSelected,\n item,\n onClick,\n onMouseEnter,\n}: {\n index: number\n isSelected: boolean\n item: SlashMenuItemInternal\n onClick: () => void\n onMouseEnter: () => void\n}) {\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const { i18n } = useTranslation()\n\n let className = `${baseClass}__item ${baseClass}__item-${item.key}`\n if (isSelected) {\n className += ` ${baseClass}__item--selected`\n }\n\n let title = item.key\n if (item.label) {\n title =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Crop title to max. 25 characters\n if (title.length > 25) {\n title = title.substring(0, 25) + '...'\n }\n\n return (\n <button\n aria-selected={isSelected}\n className={className}\n id={baseClass + '__item-' + item.key}\n key={item.key}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n ref={(element) => {\n item.ref = { current: element }\n }}\n role=\"option\"\n tabIndex={-1}\n type=\"button\"\n >\n {item?.Icon && <item.Icon />}\n\n <span className={`${baseClass}__item-text`}>{title}</span>\n </button>\n )\n}\n\nexport function SlashMenuPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n const [queryString, setQueryString] = useState<null | string>(null)\n const { editorConfig } = useEditorConfigContext()\n const { i18n } = useTranslation()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const checkForTriggerMatch = useMenuTriggerMatch('/', {\n minLength: 0,\n })\n\n const getDynamicItems = useCallback(() => {\n let groupWithItems: Array<SlashMenuGroup> = []\n\n for (const dynamicItem of editorConfig.features.slashMenu.dynamicGroups) {\n if (queryString) {\n const dynamicGroupWithItems = dynamicItem({\n editor,\n queryString,\n })\n groupWithItems = groupWithItems.concat(dynamicGroupWithItems)\n }\n }\n\n return groupWithItems\n }, [editor, queryString, editorConfig?.features])\n\n const groups: SlashMenuGroup[] = useMemo(() => {\n let groupsWithItems: SlashMenuGroup[] = []\n for (const groupWithItem of editorConfig?.features.slashMenu.groups ?? []) {\n groupsWithItems.push(groupWithItem)\n }\n\n if (queryString) {\n // Filter current groups first\n // @ts-expect-error - TODO: fix this\n groupsWithItems = groupsWithItems.map((group) => {\n const filteredItems = group.items.filter((item) => {\n let itemTitle = item.key\n if (item.label) {\n itemTitle =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n\n if (new RegExp(queryString, 'gi').exec(itemTitle)) {\n return true\n }\n if (item.keywords != null) {\n return item.keywords.some((keyword) => new RegExp(queryString, 'gi').exec(keyword))\n }\n return false\n })\n if (filteredItems.length) {\n return {\n ...group,\n items: filteredItems,\n }\n }\n return null\n })\n\n groupsWithItems = groupsWithItems.filter((group) => group != null)\n\n // Now add dynamic groups\n const dynamicItemGroups = getDynamicItems()\n\n // merge dynamic items into groups\n for (const dynamicGroup of dynamicItemGroups) {\n // 1. find the group with the same name or create new one\n let group = groupsWithItems.find((group) => group.key === dynamicGroup.key)\n if (!group) {\n group = {\n ...dynamicGroup,\n items: [],\n }\n } else {\n groupsWithItems = groupsWithItems.filter((group) => group.key !== dynamicGroup.key)\n }\n\n // 2. Add items to group items array and add to sanitized.slashMenu.groupsWithItems\n if (group?.items?.length) {\n group.items = group.items.concat(group.items)\n }\n groupsWithItems.push(group)\n }\n }\n\n return groupsWithItems\n }, [\n queryString,\n editorConfig?.features.slashMenu.groups,\n getDynamicItems,\n featureClientSchemaMap,\n i18n,\n schemaPath,\n ])\n\n const onSelectItem = useCallback(\n (selectedItem: SlashMenuItemType, closeMenu: () => void, matchingString: string) => {\n closeMenu()\n\n selectedItem.onSelect({ editor, queryString: matchingString })\n },\n [editor],\n )\n\n return (\n <LexicalTypeaheadMenuPlugin\n anchorElem={anchorElem}\n groups={groups as SlashMenuGroupInternal[]}\n menuRenderFn={(\n anchorElementRef,\n { selectedItemKey, selectItemAndCleanUp, setSelectedItemKey },\n ) =>\n anchorElementRef.current && groups.length\n ? ReactDOM.createPortal(\n <div className={baseClass}>\n {groups.map((group) => {\n let groupTitle = group.key\n if (group.label && featureClientSchemaMap) {\n groupTitle =\n typeof group.label === 'function'\n ? group.label({ featureClientSchemaMap, i18n, schemaPath })\n : group.label\n }\n\n return (\n <div\n className={`${baseClass}__group ${baseClass}__group-${group.key}`}\n key={group.key}\n >\n <div className={`${baseClass}__group-title`}>{groupTitle}</div>\n {group.items.map((item, oi: number) => (\n <SlashMenuItem\n index={oi}\n isSelected={selectedItemKey === item.key}\n item={item as SlashMenuItemInternal}\n key={item.key}\n onClick={() => {\n setSelectedItemKey(item.key)\n selectItemAndCleanUp(item)\n }}\n onMouseEnter={() => {\n setSelectedItemKey(item.key)\n }}\n />\n ))}\n </div>\n )\n })}\n </div>,\n anchorElementRef.current,\n )\n : null\n }\n onQueryChange={setQueryString}\n onSelectItem={onSelectItem}\n triggerFn={checkForTriggerMatch}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["useLexicalComposerContext","useTranslation","useCallback","useMemo","useState","React","ReactDOM","useEditorConfigContext","LexicalTypeaheadMenuPlugin","useMenuTriggerMatch","baseClass","SlashMenuItem","isSelected","item","onClick","onMouseEnter","ref","fieldProps","featureClientSchemaMap","schemaPath","i18n","className","key","title","label","length","substring","_jsxs","id","role","tabIndex","type","Icon","_jsx","SlashMenuPlugin","anchorElem","document","body","editor","queryString","setQueryString","editorConfig","checkForTriggerMatch","minLength","getDynamicItems","groupWithItems","dynamicItem","features","slashMenu","dynamicGroups","dynamicGroupWithItems","concat","groups","groupsWithItems","groupWithItem","push","map","group","filteredItems","items","filter","itemTitle","RegExp","exec","keywords","some","keyword","dynamicItemGroups","dynamicGroup","find","menuRenderFn","anchorElementRef","selectedItemKey","selectItemAndCleanUp","setSelectedItemKey","current","createPortal","groupTitle","oi","index","el","onQueryChange","triggerFn"],"sources":["../../../../src/lexical/plugins/SlashMenu/index.tsx"],"sourcesContent":["'use client'\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useTranslation } from '@payloadcms/ui'\nimport { useCallback, useMemo, useState } from 'react'\nimport * as React from 'react'\nimport * as ReactDOM from 'react-dom'\n\nimport type {\n SlashMenuGroup,\n SlashMenuGroupInternal,\n SlashMenuItemInternal,\n SlashMenuItem as SlashMenuItemType,\n} from './LexicalTypeaheadMenuPlugin/types.js'\n\nimport { useEditorConfigContext } from '../../config/client/EditorConfigProvider.js'\nimport './index.scss'\nimport { LexicalTypeaheadMenuPlugin } from './LexicalTypeaheadMenuPlugin/index.js'\nimport { useMenuTriggerMatch } from './useMenuTriggerMatch.js'\n\nconst baseClass = 'slash-menu-popup'\n\nfunction SlashMenuItem({\n isSelected,\n item,\n onClick,\n onMouseEnter,\n ref,\n}: {\n index: number\n isSelected: boolean\n item: SlashMenuItemInternal\n onClick: () => void\n onMouseEnter: () => void\n ref?: React.Ref<HTMLButtonElement>\n}) {\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const { i18n } = useTranslation<{}, string>()\n\n let className = `${baseClass}__item ${baseClass}__item-${item.key}`\n if (isSelected) {\n className += ` ${baseClass}__item--selected`\n }\n\n let title = item.key\n if (item.label) {\n title =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Crop title to max. 25 characters\n if (title.length > 25) {\n title = title.substring(0, 25) + '...'\n }\n\n return (\n <button\n aria-selected={isSelected}\n className={className}\n id={baseClass + '__item-' + item.key}\n key={item.key}\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n ref={ref}\n role=\"option\"\n tabIndex={-1}\n type=\"button\"\n >\n {item?.Icon && <item.Icon />}\n\n <span className={`${baseClass}__item-text`}>{title}</span>\n </button>\n )\n}\n\nexport function SlashMenuPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n const [queryString, setQueryString] = useState<null | string>(null)\n const { editorConfig } = useEditorConfigContext()\n const { i18n } = useTranslation<{}, string>()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const checkForTriggerMatch = useMenuTriggerMatch('/', {\n minLength: 0,\n })\n\n const getDynamicItems = useCallback(() => {\n let groupWithItems: Array<SlashMenuGroup> = []\n\n for (const dynamicItem of editorConfig.features.slashMenu.dynamicGroups) {\n if (queryString) {\n const dynamicGroupWithItems = dynamicItem({\n editor,\n queryString,\n })\n groupWithItems = groupWithItems.concat(dynamicGroupWithItems)\n }\n }\n\n return groupWithItems\n }, [editor, queryString, editorConfig?.features])\n\n const groups: SlashMenuGroup[] = useMemo(() => {\n let groupsWithItems: SlashMenuGroup[] = []\n for (const groupWithItem of editorConfig?.features.slashMenu.groups ?? []) {\n groupsWithItems.push(groupWithItem)\n }\n\n if (queryString) {\n // Filter current groups first\n // @ts-expect-error - TODO: fix this\n groupsWithItems = groupsWithItems.map((group) => {\n const filteredItems = group.items.filter((item) => {\n let itemTitle = item.key\n if (item.label) {\n itemTitle =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n\n if (new RegExp(queryString, 'gi').exec(itemTitle)) {\n return true\n }\n if (item.keywords != null) {\n return item.keywords.some((keyword) => new RegExp(queryString, 'gi').exec(keyword))\n }\n return false\n })\n if (filteredItems.length) {\n return {\n ...group,\n items: filteredItems,\n }\n }\n return null\n })\n\n groupsWithItems = groupsWithItems.filter((group) => group != null)\n\n // Now add dynamic groups\n const dynamicItemGroups = getDynamicItems()\n\n // merge dynamic items into groups\n for (const dynamicGroup of dynamicItemGroups) {\n // 1. find the group with the same name or create new one\n let group = groupsWithItems.find((group) => group.key === dynamicGroup.key)\n if (!group) {\n group = {\n ...dynamicGroup,\n items: [],\n }\n } else {\n groupsWithItems = groupsWithItems.filter((group) => group.key !== dynamicGroup.key)\n }\n\n // 2. Add items to group items array and add to sanitized.slashMenu.groupsWithItems\n if (group?.items?.length) {\n group.items = group.items.concat(group.items)\n }\n groupsWithItems.push(group)\n }\n }\n\n return groupsWithItems\n }, [\n queryString,\n editorConfig?.features.slashMenu.groups,\n getDynamicItems,\n featureClientSchemaMap,\n i18n,\n schemaPath,\n ])\n\n return (\n <LexicalTypeaheadMenuPlugin\n anchorElem={anchorElem}\n groups={groups as SlashMenuGroupInternal[]}\n menuRenderFn={(\n anchorElementRef,\n { selectedItemKey, selectItemAndCleanUp, setSelectedItemKey },\n ) =>\n anchorElementRef.current && groups.length\n ? ReactDOM.createPortal(\n <div className={baseClass}>\n {groups.map((group) => {\n let groupTitle = group.key\n if (group.label && featureClientSchemaMap) {\n groupTitle =\n typeof group.label === 'function'\n ? group.label({ featureClientSchemaMap, i18n, schemaPath })\n : group.label\n }\n\n return (\n <div\n className={`${baseClass}__group ${baseClass}__group-${group.key}`}\n key={group.key}\n >\n <div className={`${baseClass}__group-title`}>{groupTitle}</div>\n {group.items.map((item, oi: number) => (\n <SlashMenuItem\n index={oi}\n isSelected={selectedItemKey === item.key}\n item={item as SlashMenuItemInternal}\n key={item.key}\n onClick={() => {\n setSelectedItemKey(item.key)\n selectItemAndCleanUp(item)\n }}\n onMouseEnter={() => {\n setSelectedItemKey(item.key)\n }}\n ref={(el) => {\n ;(item as SlashMenuItemInternal).ref = { current: el }\n }}\n />\n ))}\n </div>\n )\n })}\n </div>,\n anchorElementRef.current,\n )\n : null\n }\n onQueryChange={setQueryString}\n triggerFn={checkForTriggerMatch}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,OAAO,cAAc,CAAA;AA2LrB,wBAAgB,oBAAoB,CAAC,EACnC,UAA0B,GAC3B,EAAE;IACD,UAAU,CAAC,EAAE,WAAW,CAAA;CACzB,GAAG,KAAK,CAAC,YAAY,CAGrB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAa9B,OAAO,cAAc,CAAA;AA4LrB,wBAAgB,oBAAoB,CAAC,EACnC,UAA0B,GAC3B,EAAE;IACD,UAAU,CAAC,EAAE,WAAW,CAAA;CACzB,GAAG,KAAK,CAAC,YAAY,CAGrB"}
@@ -132,6 +132,7 @@ function useAddBlockHandle(editor, anchorElem, isEditable) {
132
132
  }, [editor, hoveredElement]);
133
133
  return /*#__PURE__*/createPortal(/*#__PURE__*/_jsx(React.Fragment, {
134
134
  children: /*#__PURE__*/_jsx("button", {
135
+ "aria-label": "Add block",
135
136
  className: "icon add-block-menu",
136
137
  onClick: event_1 => {
137
138
  handleAddClick(event_1);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["useLexicalComposerContext","$createParagraphNode","React","useCallback","useEffect","useRef","useState","createPortal","useEditorConfigContext","isHTMLElement","Point","ENABLE_SLASH_MENU_COMMAND","calculateDistanceFromScrollerElem","getNodeCloseToPoint","getTopLevelNodeKeys","isOnHandleElement","setHandlePosition","ADD_BLOCK_MENU_CLASSNAME","prevIndex","Infinity","getCurrentIndex","keysLength","Math","floor","useAddBlockHandle","editor","anchorElem","isEditable","scrollerElem","parentElement","editorConfig","blockHandleHorizontalOffset","admin","hideGutter","menuRef","hoveredElement","setHoveredElement","onDocumentMouseMove","event","target","distanceFromScrollerElem","pageX","pageY","topLevelNodeKeys","blockElem","_emptyBlockElem","blockNode","foundAtIndex","cache_threshold","horizontalOffset","point","x","y","returnEmptyParagraphs","startIndex","length","useEdgeAsDefault","node","elem","document","addEventListener","removeEventListener","current","handleAddClick","hoveredElementToUse","update","isEmptyParagraph","getType","getTextContent","newParagraph","insertAfter","setTimeout","getElementByKey","getKey","focus","select","dispatchCommand","stopPropagation","preventDefault","_jsx","Fragment","className","onClick","ref","type","AddBlockHandlePlugin","t0","t1","undefined","body","_editable"],"sources":["../../../../../src/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor, LexicalNode, ParagraphNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js'\nimport { isHTMLElement } from '../../../utils/guard.js'\nimport { Point } from '../../../utils/point.js'\nimport { ENABLE_SLASH_MENU_COMMAND } from '../../SlashMenu/LexicalTypeaheadMenuPlugin/index.js'\nimport { calculateDistanceFromScrollerElem } from '../utils/calculateDistanceFromScrollerElem.js'\nimport { getNodeCloseToPoint } from '../utils/getNodeCloseToPoint.js'\nimport { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js'\nimport { isOnHandleElement } from '../utils/isOnHandleElement.js'\nimport { setHandlePosition } from '../utils/setHandlePosition.js'\nimport './index.scss'\n\nconst ADD_BLOCK_MENU_CLASSNAME = 'add-block-menu'\n\nlet prevIndex = Infinity\n\nfunction getCurrentIndex(keysLength: number): number {\n if (keysLength === 0) {\n return Infinity\n }\n if (prevIndex >= 0 && prevIndex < keysLength) {\n return prevIndex\n }\n\n return Math.floor(keysLength / 2)\n}\n\nfunction useAddBlockHandle(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): React.ReactElement {\n const scrollerElem = anchorElem.parentElement\n\n const { editorConfig } = useEditorConfigContext()\n const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -24 : 12\n\n const menuRef = useRef<HTMLButtonElement>(null)\n const [hoveredElement, setHoveredElement] = useState<{\n elem: HTMLElement\n node: LexicalNode\n } | null>(null)\n\n useEffect(() => {\n function onDocumentMouseMove(event: MouseEvent) {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n )\n\n if (distanceFromScrollerElem === -1) {\n setHoveredElement(null)\n return\n }\n\n if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {\n return\n }\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: _emptyBlockElem,\n blockNode,\n foundAtIndex,\n } = getNodeCloseToPoint({\n anchorElem,\n cache_threshold: 0,\n editor,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n returnEmptyParagraphs: true,\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: false,\n })\n\n prevIndex = foundAtIndex\n\n if (!_emptyBlockElem) {\n return\n }\n if (\n blockNode &&\n (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem)\n ) {\n setHoveredElement({\n elem: _emptyBlockElem,\n node: blockNode,\n })\n }\n }\n\n // Since the draggableBlockElem is outside the actual editor, we need to listen to the document\n // to be able to detect when the mouse is outside the editor and respect a buffer around\n // the scrollerElem to avoid the draggableBlockElem disappearing too early.\n document?.addEventListener('mousemove', onDocumentMouseMove)\n\n return () => {\n document?.removeEventListener('mousemove', onDocumentMouseMove)\n }\n }, [scrollerElem, anchorElem, editor, hoveredElement])\n\n useEffect(() => {\n if (menuRef.current && hoveredElement?.node) {\n setHandlePosition(\n hoveredElement?.elem,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, hoveredElement, blockHandleHorizontalOffset])\n\n const handleAddClick = useCallback(\n (event) => {\n let hoveredElementToUse = hoveredElement\n if (!hoveredElementToUse?.node) {\n return\n }\n\n // 1. Update hoveredElement.node to a new paragraph node if the hoveredElement.node is not a paragraph node\n editor.update(() => {\n // Check if blockNode is an empty text node\n let isEmptyParagraph = true\n if (\n hoveredElementToUse?.node.getType() !== 'paragraph' ||\n hoveredElementToUse.node.getTextContent() !== ''\n ) {\n isEmptyParagraph = false\n }\n\n if (!isEmptyParagraph) {\n const newParagraph = $createParagraphNode()\n hoveredElementToUse?.node.insertAfter(newParagraph)\n\n setTimeout(() => {\n hoveredElementToUse = {\n elem: editor.getElementByKey(newParagraph.getKey())!,\n node: newParagraph,\n }\n setHoveredElement(hoveredElementToUse)\n }, 0)\n }\n })\n\n // 2. Focus on the new paragraph node\n setTimeout(() => {\n editor.update(() => {\n editor.focus()\n\n if (\n hoveredElementToUse?.node &&\n 'select' in hoveredElementToUse.node &&\n typeof hoveredElementToUse.node.select === 'function'\n ) {\n hoveredElementToUse.node.select()\n }\n })\n }, 1)\n\n // Make sure this is called AFTER the focusing has been processed by the browser\n // Otherwise, this won't work\n setTimeout(() => {\n editor.dispatchCommand(ENABLE_SLASH_MENU_COMMAND, {\n node: hoveredElementToUse?.node as ParagraphNode,\n })\n }, 2)\n\n event.stopPropagation()\n event.preventDefault()\n },\n [editor, hoveredElement],\n )\n\n return createPortal(\n <React.Fragment>\n <button\n className=\"icon add-block-menu\"\n onClick={(event) => {\n handleAddClick(event)\n }}\n ref={menuRef}\n type=\"button\"\n >\n <div className={isEditable ? 'icon' : ''} />\n </button>\n </React.Fragment>,\n anchorElem,\n )\n}\n\nexport function AddBlockHandlePlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n return useAddBlockHandle(editor, anchorElem, editor._editable)\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["useLexicalComposerContext","$createParagraphNode","React","useCallback","useEffect","useRef","useState","createPortal","useEditorConfigContext","isHTMLElement","Point","ENABLE_SLASH_MENU_COMMAND","calculateDistanceFromScrollerElem","getNodeCloseToPoint","getTopLevelNodeKeys","isOnHandleElement","setHandlePosition","ADD_BLOCK_MENU_CLASSNAME","prevIndex","Infinity","getCurrentIndex","keysLength","Math","floor","useAddBlockHandle","editor","anchorElem","isEditable","scrollerElem","parentElement","editorConfig","blockHandleHorizontalOffset","admin","hideGutter","menuRef","hoveredElement","setHoveredElement","onDocumentMouseMove","event","target","distanceFromScrollerElem","pageX","pageY","topLevelNodeKeys","blockElem","_emptyBlockElem","blockNode","foundAtIndex","cache_threshold","horizontalOffset","point","x","y","returnEmptyParagraphs","startIndex","length","useEdgeAsDefault","node","elem","document","addEventListener","removeEventListener","current","handleAddClick","hoveredElementToUse","update","isEmptyParagraph","getType","getTextContent","newParagraph","insertAfter","setTimeout","getElementByKey","getKey","focus","select","dispatchCommand","stopPropagation","preventDefault","_jsx","Fragment","className","onClick","ref","type","AddBlockHandlePlugin","t0","t1","undefined","body","_editable"],"sources":["../../../../../src/lexical/plugins/handles/AddBlockHandlePlugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor, LexicalNode, ParagraphNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../config/client/EditorConfigProvider.js'\nimport { isHTMLElement } from '../../../utils/guard.js'\nimport { Point } from '../../../utils/point.js'\nimport { ENABLE_SLASH_MENU_COMMAND } from '../../SlashMenu/LexicalTypeaheadMenuPlugin/index.js'\nimport { calculateDistanceFromScrollerElem } from '../utils/calculateDistanceFromScrollerElem.js'\nimport { getNodeCloseToPoint } from '../utils/getNodeCloseToPoint.js'\nimport { getTopLevelNodeKeys } from '../utils/getTopLevelNodeKeys.js'\nimport { isOnHandleElement } from '../utils/isOnHandleElement.js'\nimport { setHandlePosition } from '../utils/setHandlePosition.js'\nimport './index.scss'\n\nconst ADD_BLOCK_MENU_CLASSNAME = 'add-block-menu'\n\nlet prevIndex = Infinity\n\nfunction getCurrentIndex(keysLength: number): number {\n if (keysLength === 0) {\n return Infinity\n }\n if (prevIndex >= 0 && prevIndex < keysLength) {\n return prevIndex\n }\n\n return Math.floor(keysLength / 2)\n}\n\nfunction useAddBlockHandle(\n editor: LexicalEditor,\n anchorElem: HTMLElement,\n isEditable: boolean,\n): React.ReactElement {\n const scrollerElem = anchorElem.parentElement\n\n const { editorConfig } = useEditorConfigContext()\n const blockHandleHorizontalOffset = editorConfig?.admin?.hideGutter ? -24 : 12\n\n const menuRef = useRef<HTMLButtonElement>(null)\n const [hoveredElement, setHoveredElement] = useState<{\n elem: HTMLElement\n node: LexicalNode\n } | null>(null)\n\n useEffect(() => {\n function onDocumentMouseMove(event: MouseEvent) {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n const distanceFromScrollerElem = calculateDistanceFromScrollerElem(\n scrollerElem,\n event.pageX,\n event.pageY,\n target,\n )\n\n if (distanceFromScrollerElem === -1) {\n setHoveredElement(null)\n return\n }\n\n if (isOnHandleElement(target, ADD_BLOCK_MENU_CLASSNAME)) {\n return\n }\n const topLevelNodeKeys = getTopLevelNodeKeys(editor)\n\n const {\n blockElem: _emptyBlockElem,\n blockNode,\n foundAtIndex,\n } = getNodeCloseToPoint({\n anchorElem,\n cache_threshold: 0,\n editor,\n horizontalOffset: -distanceFromScrollerElem,\n point: new Point(event.x, event.y),\n returnEmptyParagraphs: true,\n startIndex: getCurrentIndex(topLevelNodeKeys.length),\n useEdgeAsDefault: false,\n })\n\n prevIndex = foundAtIndex\n\n if (!_emptyBlockElem) {\n return\n }\n if (\n blockNode &&\n (hoveredElement?.node !== blockNode || hoveredElement?.elem !== _emptyBlockElem)\n ) {\n setHoveredElement({\n elem: _emptyBlockElem,\n node: blockNode,\n })\n }\n }\n\n // Since the draggableBlockElem is outside the actual editor, we need to listen to the document\n // to be able to detect when the mouse is outside the editor and respect a buffer around\n // the scrollerElem to avoid the draggableBlockElem disappearing too early.\n document?.addEventListener('mousemove', onDocumentMouseMove)\n\n return () => {\n document?.removeEventListener('mousemove', onDocumentMouseMove)\n }\n }, [scrollerElem, anchorElem, editor, hoveredElement])\n\n useEffect(() => {\n if (menuRef.current && hoveredElement?.node) {\n setHandlePosition(\n hoveredElement?.elem,\n menuRef.current,\n anchorElem,\n blockHandleHorizontalOffset,\n )\n }\n }, [anchorElem, hoveredElement, blockHandleHorizontalOffset])\n\n const handleAddClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n let hoveredElementToUse = hoveredElement\n if (!hoveredElementToUse?.node) {\n return\n }\n\n // 1. Update hoveredElement.node to a new paragraph node if the hoveredElement.node is not a paragraph node\n editor.update(() => {\n // Check if blockNode is an empty text node\n let isEmptyParagraph = true\n if (\n hoveredElementToUse?.node.getType() !== 'paragraph' ||\n hoveredElementToUse.node.getTextContent() !== ''\n ) {\n isEmptyParagraph = false\n }\n\n if (!isEmptyParagraph) {\n const newParagraph = $createParagraphNode()\n hoveredElementToUse?.node.insertAfter(newParagraph)\n\n setTimeout(() => {\n hoveredElementToUse = {\n elem: editor.getElementByKey(newParagraph.getKey())!,\n node: newParagraph,\n }\n setHoveredElement(hoveredElementToUse)\n }, 0)\n }\n })\n\n // 2. Focus on the new paragraph node\n setTimeout(() => {\n editor.update(() => {\n editor.focus()\n\n if (\n hoveredElementToUse?.node &&\n 'select' in hoveredElementToUse.node &&\n typeof hoveredElementToUse.node.select === 'function'\n ) {\n hoveredElementToUse.node.select()\n }\n })\n }, 1)\n\n // Make sure this is called AFTER the focusing has been processed by the browser\n // Otherwise, this won't work\n setTimeout(() => {\n editor.dispatchCommand(ENABLE_SLASH_MENU_COMMAND, {\n node: hoveredElementToUse?.node as ParagraphNode,\n })\n }, 2)\n\n event.stopPropagation()\n event.preventDefault()\n },\n [editor, hoveredElement],\n )\n\n return createPortal(\n <React.Fragment>\n <button\n aria-label=\"Add block\"\n className=\"icon add-block-menu\"\n onClick={(event) => {\n handleAddClick(event)\n }}\n ref={menuRef}\n type=\"button\"\n >\n <div className={isEditable ? 'icon' : ''} />\n </button>\n </React.Fragment>,\n anchorElem,\n )\n}\n\nexport function AddBlockHandlePlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): React.ReactElement {\n const [editor] = useLexicalComposerContext()\n return useAddBlockHandle(editor, anchorElem, editor._editable)\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- export declare function debounce(func: (...args: any[]) => void, wait: number): (...args: any[]) => void;
1
+ export declare function debounce(func: (...args: undefined[]) => void, wait: number): (...args: undefined[]) => void;
2
2
  //# sourceMappingURL=debounce.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/debounce.ts"],"names":[],"mappings":"AACA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,aAEzC,GAAG,EAAE,UAUhC"}
1
+ {"version":3,"file":"debounce.d.ts","sourceRoot":"","sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/debounce.ts"],"names":[],"mappings":"AACA,wBAAgB,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,aAE/C,SAAS,EAAE,UAUtC"}
@@ -5,7 +5,7 @@ export function debounce(func, wait) {
5
5
  return function (...args) {
6
6
  const later = () => {
7
7
  clearTimeout(timeout);
8
- timeout = null;
8
+ timeout = undefined;
9
9
  func(...args);
10
10
  };
11
11
  clearTimeout(timeout);
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.js","names":["debounce","func","wait","timeout","args","later","clearTimeout","window","setTimeout"],"sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/debounce.ts"],"sourcesContent":["'use client'\nexport function debounce(func: (...args: any[]) => void, wait: number) {\n let timeout\n return function (...args: any[]) {\n const later = () => {\n clearTimeout(timeout)\n timeout = null\n func(...args)\n }\n\n clearTimeout(timeout)\n timeout = window.setTimeout(later, wait)\n }\n}\n"],"mappings":"AAAA;;AACA,OAAO,SAASA,SAASC,IAA8B,EAAEC,IAAY;EACnE,IAAIC,OAAA;EACJ,OAAO,UAAU,GAAGC,IAAW;IAC7B,MAAMC,KAAA,GAAQA,CAAA;MACZC,YAAA,CAAaH,OAAA;MACbA,OAAA,GAAU;MACVF,IAAA,IAAQG,IAAA;IACV;IAEAE,YAAA,CAAaH,OAAA;IACbA,OAAA,GAAUI,MAAA,CAAOC,UAAU,CAACH,KAAA,EAAOH,IAAA;EACrC;AACF","ignoreList":[]}
1
+ {"version":3,"file":"debounce.js","names":["debounce","func","wait","timeout","args","later","clearTimeout","undefined","window","setTimeout"],"sources":["../../../../../src/lexical/plugins/handles/DraggableBlockPlugin/debounce.ts"],"sourcesContent":["'use client'\nexport function debounce(func: (...args: undefined[]) => void, wait: number) {\n let timeout: number | string | undefined\n return function (...args: undefined[]) {\n const later = () => {\n clearTimeout(timeout)\n timeout = undefined\n func(...args)\n }\n\n clearTimeout(timeout)\n timeout = window.setTimeout(later, wait)\n }\n}\n"],"mappings":"AAAA;;AACA,OAAO,SAASA,SAASC,IAAoC,EAAEC,IAAY;EACzE,IAAIC,OAAA;EACJ,OAAO,UAAU,GAAGC,IAAiB;IACnC,MAAMC,KAAA,GAAQA,CAAA;MACZC,YAAA,CAAaH,OAAA;MACbA,OAAA,GAAUI,SAAA;MACVN,IAAA,IAAQG,IAAA;IACV;IAEAE,YAAA,CAAaH,OAAA;IACbA,OAAA,GAAUK,MAAA,CAAOC,UAAU,CAACJ,KAAA,EAAOH,IAAA;EACrC;AACF","ignoreList":[]}
@@ -40,7 +40,7 @@ export async function buildInitialState({
40
40
  }
41
41
  initialState[id].formState = formStateResult;
42
42
  if (node.type === 'block') {
43
- const currentFieldPreferences = context.preferences?.fields[context.field.name];
43
+ const currentFieldPreferences = context.preferences?.fields?.[context.field.name];
44
44
  const collapsedArray = currentFieldPreferences?.collapsed;
45
45
  if (collapsedArray && collapsedArray.includes(id)) {
46
46
  initialState[id].collapsed = true;
@@ -1 +1 @@
1
- {"version":3,"file":"buildInitialState.js","names":["fieldSchemasToFormState","buildInitialState","context","initialState","initialStateFromArgs","nodeData","node","children","type","blockNode","id","fields","schemaFieldsPath","lexicalFieldSchemaPath","blockType","formStateResult","collectionSlug","data","fieldSchemaMap","get","operation","permissions","preferences","renderAllFields","renderFieldFn","req","schemaPath","formState","currentFieldPreferences","field","name","collapsedArray","collapsed","includes"],"sources":["../../src/utilities/buildInitialState.ts"],"sourcesContent":["import type { SerializedLexicalNode } from 'lexical'\nimport type {\n DocumentPreferences,\n FieldSchemaMap,\n FormState,\n Operation,\n PayloadRequest,\n RichTextField,\n SanitizedFieldPermissions,\n} from 'payload'\n\nimport { fieldSchemasToFormState } from '@payloadcms/ui/forms/fieldSchemasToFormState'\n\nimport type { SerializedBlockNode } from '../nodeTypes.js'\n\nexport type InitialLexicalFormState = {\n [nodeID: string]: {\n [key: string]: any\n formState?: FormState\n }\n}\n\ntype Props = {\n context: {\n collectionSlug: string\n field: RichTextField\n fieldSchemaMap: FieldSchemaMap\n id?: number | string\n lexicalFieldSchemaPath: string\n operation: Operation\n permissions?: SanitizedFieldPermissions\n preferences: DocumentPreferences\n renderFieldFn: any\n req: PayloadRequest\n }\n initialState?: InitialLexicalFormState\n nodeData: SerializedLexicalNode[]\n}\n\nexport async function buildInitialState({\n context,\n initialState: initialStateFromArgs,\n nodeData,\n}: Props): Promise<InitialLexicalFormState> {\n let initialState: InitialLexicalFormState = initialStateFromArgs ?? {}\n for (const node of nodeData) {\n if ('children' in node) {\n initialState = await buildInitialState({\n context,\n initialState,\n nodeData: node.children as SerializedLexicalNode[],\n })\n }\n\n if (node.type === 'block' || node.type === 'inlineBlock') {\n const blockNode = node as SerializedBlockNode\n const id = blockNode?.fields?.id\n if (!id) {\n continue\n }\n\n const schemaFieldsPath =\n node.type === 'block'\n ? `${context.lexicalFieldSchemaPath}.lexical_internal_feature.blocks.lexical_blocks.${blockNode.fields.blockType}.fields`\n : `${context.lexicalFieldSchemaPath}.lexical_internal_feature.blocks.lexical_inline_blocks.${blockNode.fields.blockType}.fields`\n\n // Build form state for the block\n\n const formStateResult = await fieldSchemasToFormState({\n id: context.id,\n collectionSlug: context.collectionSlug,\n data: blockNode.fields,\n fields: (context.fieldSchemaMap.get(schemaFieldsPath) as any)?.fields,\n fieldSchemaMap: context.fieldSchemaMap,\n operation: context.operation as any, // TODO: Type\n permissions: true,\n preferences: context.preferences,\n renderAllFields: true, // If this function runs, the parent lexical field is being re-rendered => thus we can assume all its sub-fields need to be re-rendered\n renderFieldFn: context.renderFieldFn,\n req: context.req,\n schemaPath: schemaFieldsPath,\n })\n\n if (!initialState[id]) {\n initialState[id] = {}\n }\n\n initialState[id].formState = formStateResult\n\n if (node.type === 'block') {\n const currentFieldPreferences = context.preferences?.fields[context.field.name]\n const collapsedArray = currentFieldPreferences?.collapsed\n if (collapsedArray && collapsedArray.includes(id)) {\n initialState[id].collapsed = true\n }\n }\n }\n }\n return initialState\n}\n"],"mappings":"AAWA,SAASA,uBAAuB,QAAQ;AA4BxC,OAAO,eAAeC,kBAAkB;EACtCC,OAAO;EACPC,YAAA,EAAcC,oBAAoB;EAClCC;AAAQ,CACF;EACN,IAAIF,YAAA,GAAwCC,oBAAA,IAAwB,CAAC;EACrE,KAAK,MAAME,IAAA,IAAQD,QAAA,EAAU;IAC3B,IAAI,cAAcC,IAAA,EAAM;MACtBH,YAAA,GAAe,MAAMF,iBAAA,CAAkB;QACrCC,OAAA;QACAC,YAAA;QACAE,QAAA,EAAUC,IAAA,CAAKC;MACjB;IACF;IAEA,IAAID,IAAA,CAAKE,IAAI,KAAK,WAAWF,IAAA,CAAKE,IAAI,KAAK,eAAe;MACxD,MAAMC,SAAA,GAAYH,IAAA;MAClB,MAAMI,EAAA,GAAKD,SAAA,EAAWE,MAAA,EAAQD,EAAA;MAC9B,IAAI,CAACA,EAAA,EAAI;QACP;MACF;MAEA,MAAME,gBAAA,GACJN,IAAA,CAAKE,IAAI,KAAK,UACV,GAAGN,OAAA,CAAQW,sBAAsB,mDAAmDJ,SAAA,CAAUE,MAAM,CAACG,SAAS,SAAS,GACvH,GAAGZ,OAAA,CAAQW,sBAAsB,0DAA0DJ,SAAA,CAAUE,MAAM,CAACG,SAAS,SAAS;MAEpI;MAEA,MAAMC,eAAA,GAAkB,MAAMf,uBAAA,CAAwB;QACpDU,EAAA,EAAIR,OAAA,CAAQQ,EAAE;QACdM,cAAA,EAAgBd,OAAA,CAAQc,cAAc;QACtCC,IAAA,EAAMR,SAAA,CAAUE,MAAM;QACtBA,MAAA,EAAST,OAAA,CAAQgB,cAAc,CAACC,GAAG,CAACP,gBAAA,GAA2BD,MAAA;QAC/DO,cAAA,EAAgBhB,OAAA,CAAQgB,cAAc;QACtCE,SAAA,EAAWlB,OAAA,CAAQkB,SAAS;QAC5BC,WAAA,EAAa;QACbC,WAAA,EAAapB,OAAA,CAAQoB,WAAW;QAChCC,eAAA,EAAiB;QACjBC,aAAA,EAAetB,OAAA,CAAQsB,aAAa;QACpCC,GAAA,EAAKvB,OAAA,CAAQuB,GAAG;QAChBC,UAAA,EAAYd;MACd;MAEA,IAAI,CAACT,YAAY,CAACO,EAAA,CAAG,EAAE;QACrBP,YAAY,CAACO,EAAA,CAAG,GAAG,CAAC;MACtB;MAEAP,YAAY,CAACO,EAAA,CAAG,CAACiB,SAAS,GAAGZ,eAAA;MAE7B,IAAIT,IAAA,CAAKE,IAAI,KAAK,SAAS;QACzB,MAAMoB,uBAAA,GAA0B1B,OAAA,CAAQoB,WAAW,EAAEX,MAAM,CAACT,OAAA,CAAQ2B,KAAK,CAACC,IAAI,CAAC;QAC/E,MAAMC,cAAA,GAAiBH,uBAAA,EAAyBI,SAAA;QAChD,IAAID,cAAA,IAAkBA,cAAA,CAAeE,QAAQ,CAACvB,EAAA,GAAK;UACjDP,YAAY,CAACO,EAAA,CAAG,CAACsB,SAAS,GAAG;QAC/B;MACF;IACF;EACF;EACA,OAAO7B,YAAA;AACT","ignoreList":[]}
1
+ {"version":3,"file":"buildInitialState.js","names":["fieldSchemasToFormState","buildInitialState","context","initialState","initialStateFromArgs","nodeData","node","children","type","blockNode","id","fields","schemaFieldsPath","lexicalFieldSchemaPath","blockType","formStateResult","collectionSlug","data","fieldSchemaMap","get","operation","permissions","preferences","renderAllFields","renderFieldFn","req","schemaPath","formState","currentFieldPreferences","field","name","collapsedArray","collapsed","includes"],"sources":["../../src/utilities/buildInitialState.ts"],"sourcesContent":["import type { SerializedLexicalNode } from 'lexical'\nimport type {\n DocumentPreferences,\n FieldSchemaMap,\n FormState,\n Operation,\n PayloadRequest,\n RichTextField,\n SanitizedFieldPermissions,\n} from 'payload'\n\nimport { fieldSchemasToFormState } from '@payloadcms/ui/forms/fieldSchemasToFormState'\n\nimport type { SerializedBlockNode } from '../nodeTypes.js'\n\nexport type InitialLexicalFormState = {\n [nodeID: string]: {\n [key: string]: any\n formState?: FormState\n }\n}\n\ntype Props = {\n context: {\n collectionSlug: string\n field: RichTextField\n fieldSchemaMap: FieldSchemaMap\n id?: number | string\n lexicalFieldSchemaPath: string\n operation: Operation\n permissions?: SanitizedFieldPermissions\n preferences: DocumentPreferences\n renderFieldFn: any\n req: PayloadRequest\n }\n initialState?: InitialLexicalFormState\n nodeData: SerializedLexicalNode[]\n}\n\nexport async function buildInitialState({\n context,\n initialState: initialStateFromArgs,\n nodeData,\n}: Props): Promise<InitialLexicalFormState> {\n let initialState: InitialLexicalFormState = initialStateFromArgs ?? {}\n for (const node of nodeData) {\n if ('children' in node) {\n initialState = await buildInitialState({\n context,\n initialState,\n nodeData: node.children as SerializedLexicalNode[],\n })\n }\n\n if (node.type === 'block' || node.type === 'inlineBlock') {\n const blockNode = node as SerializedBlockNode\n const id = blockNode?.fields?.id\n if (!id) {\n continue\n }\n\n const schemaFieldsPath =\n node.type === 'block'\n ? `${context.lexicalFieldSchemaPath}.lexical_internal_feature.blocks.lexical_blocks.${blockNode.fields.blockType}.fields`\n : `${context.lexicalFieldSchemaPath}.lexical_internal_feature.blocks.lexical_inline_blocks.${blockNode.fields.blockType}.fields`\n\n // Build form state for the block\n\n const formStateResult = await fieldSchemasToFormState({\n id: context.id,\n collectionSlug: context.collectionSlug,\n data: blockNode.fields,\n fields: (context.fieldSchemaMap.get(schemaFieldsPath) as any)?.fields,\n fieldSchemaMap: context.fieldSchemaMap,\n operation: context.operation as any, // TODO: Type\n permissions: true,\n preferences: context.preferences,\n renderAllFields: true, // If this function runs, the parent lexical field is being re-rendered => thus we can assume all its sub-fields need to be re-rendered\n renderFieldFn: context.renderFieldFn,\n req: context.req,\n schemaPath: schemaFieldsPath,\n })\n\n if (!initialState[id]) {\n initialState[id] = {}\n }\n\n initialState[id].formState = formStateResult\n\n if (node.type === 'block') {\n const currentFieldPreferences = context.preferences?.fields?.[context.field.name]\n const collapsedArray = currentFieldPreferences?.collapsed\n if (collapsedArray && collapsedArray.includes(id)) {\n initialState[id].collapsed = true\n }\n }\n }\n }\n return initialState\n}\n"],"mappings":"AAWA,SAASA,uBAAuB,QAAQ;AA4BxC,OAAO,eAAeC,kBAAkB;EACtCC,OAAO;EACPC,YAAA,EAAcC,oBAAoB;EAClCC;AAAQ,CACF;EACN,IAAIF,YAAA,GAAwCC,oBAAA,IAAwB,CAAC;EACrE,KAAK,MAAME,IAAA,IAAQD,QAAA,EAAU;IAC3B,IAAI,cAAcC,IAAA,EAAM;MACtBH,YAAA,GAAe,MAAMF,iBAAA,CAAkB;QACrCC,OAAA;QACAC,YAAA;QACAE,QAAA,EAAUC,IAAA,CAAKC;MACjB;IACF;IAEA,IAAID,IAAA,CAAKE,IAAI,KAAK,WAAWF,IAAA,CAAKE,IAAI,KAAK,eAAe;MACxD,MAAMC,SAAA,GAAYH,IAAA;MAClB,MAAMI,EAAA,GAAKD,SAAA,EAAWE,MAAA,EAAQD,EAAA;MAC9B,IAAI,CAACA,EAAA,EAAI;QACP;MACF;MAEA,MAAME,gBAAA,GACJN,IAAA,CAAKE,IAAI,KAAK,UACV,GAAGN,OAAA,CAAQW,sBAAsB,mDAAmDJ,SAAA,CAAUE,MAAM,CAACG,SAAS,SAAS,GACvH,GAAGZ,OAAA,CAAQW,sBAAsB,0DAA0DJ,SAAA,CAAUE,MAAM,CAACG,SAAS,SAAS;MAEpI;MAEA,MAAMC,eAAA,GAAkB,MAAMf,uBAAA,CAAwB;QACpDU,EAAA,EAAIR,OAAA,CAAQQ,EAAE;QACdM,cAAA,EAAgBd,OAAA,CAAQc,cAAc;QACtCC,IAAA,EAAMR,SAAA,CAAUE,MAAM;QACtBA,MAAA,EAAST,OAAA,CAAQgB,cAAc,CAACC,GAAG,CAACP,gBAAA,GAA2BD,MAAA;QAC/DO,cAAA,EAAgBhB,OAAA,CAAQgB,cAAc;QACtCE,SAAA,EAAWlB,OAAA,CAAQkB,SAAS;QAC5BC,WAAA,EAAa;QACbC,WAAA,EAAapB,OAAA,CAAQoB,WAAW;QAChCC,eAAA,EAAiB;QACjBC,aAAA,EAAetB,OAAA,CAAQsB,aAAa;QACpCC,GAAA,EAAKvB,OAAA,CAAQuB,GAAG;QAChBC,UAAA,EAAYd;MACd;MAEA,IAAI,CAACT,YAAY,CAACO,EAAA,CAAG,EAAE;QACrBP,YAAY,CAACO,EAAA,CAAG,GAAG,CAAC;MACtB;MAEAP,YAAY,CAACO,EAAA,CAAG,CAACiB,SAAS,GAAGZ,eAAA;MAE7B,IAAIT,IAAA,CAAKE,IAAI,KAAK,SAAS;QACzB,MAAMoB,uBAAA,GAA0B1B,OAAA,CAAQoB,WAAW,EAAEX,MAAA,GAAST,OAAA,CAAQ2B,KAAK,CAACC,IAAI,CAAC;QACjF,MAAMC,cAAA,GAAiBH,uBAAA,EAAyBI,SAAA;QAChD,IAAID,cAAA,IAAkBA,cAAA,CAAeE,QAAQ,CAACvB,EAAA,GAAK;UACjDP,YAAY,CAACO,EAAA,CAAG,CAACsB,SAAS,GAAG;QAC/B;MACF;IACF;EACF;EACA,OAAO7B,YAAA;AACT","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"DrawerContent.js","names":["Form","FormSubmit","RenderFields","useDocumentInfo","useServerFunctions","useTranslation","abortAndIgnore","React","useCallback","useEffect","useRef","useState","v4","uuid","useEditorConfigContext","DrawerContent","data","featureKey","fieldMapOverride","handleDrawerSubmit","schemaFieldsPathOverride","schemaPath","schemaPathSuffix","t","id","collectionSlug","getDocPreferences","globalSlug","onChangeAbortControllerRef","AbortController","initialState","setInitialState","fieldProps","featureClientSchemaMap","permissions","getFormState","schemaFieldsPath","fields","controller","awaitInitialState","state","docPermissions","docPreferences","operation","renderAllFields","signal","onChange","formState","prevFormState","current","_jsxs","beforeSubmit","disableValidationOnSubmit","Array","isArray","onSubmit","_jsx","forceRender","parentIndexPath","parentPath","parentSchemaPath","readOnly"],"sources":["../../../src/utilities/fieldsDrawer/DrawerContent.tsx"],"sourcesContent":["'use client'\nimport type { FormState } from 'payload'\n\nimport {\n Form,\n FormSubmit,\n RenderFields,\n useDocumentInfo,\n useServerFunctions,\n useTranslation,\n} from '@payloadcms/ui'\nimport { abortAndIgnore } from '@payloadcms/ui/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\n const onChangeAbortControllerRef = useRef(new AbortController())\n\n const [initialState, setInitialState] = useState<false | FormState | undefined>(false)\n\n const {\n fieldProps: { featureClientSchemaMap, permissions },\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 globalSlug,\n operation: 'update',\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 }, [schemaFieldsPath, id, data, getFormState, collectionSlug, globalSlug, getDocPreferences])\n\n const onChange = useCallback(\n async ({ formState: prevFormState }) => {\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 formState: prevFormState,\n globalSlug,\n operation: 'update',\n schemaPath: schemaFieldsPath,\n signal: controller.signal,\n })\n\n if (!state) {\n return prevFormState\n }\n\n return state\n },\n [getFormState, id, collectionSlug, getDocPreferences, globalSlug, schemaFieldsPath],\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={permissions}\n readOnly={false}\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":["Form","FormSubmit","RenderFields","useDocumentInfo","useServerFunctions","useTranslation","abortAndIgnore","React","useCallback","useEffect","useRef","useState","v4","uuid","useEditorConfigContext","DrawerContent","data","featureKey","fieldMapOverride","handleDrawerSubmit","schemaFieldsPathOverride","schemaPath","schemaPathSuffix","t","id","collectionSlug","getDocPreferences","globalSlug","onChangeAbortControllerRef","AbortController","initialState","setInitialState","fieldProps","featureClientSchemaMap","permissions","getFormState","schemaFieldsPath","fields","controller","awaitInitialState","state","docPermissions","docPreferences","operation","renderAllFields","signal","onChange","formState","prevFormState","current","_jsxs","beforeSubmit","disableValidationOnSubmit","Array","isArray","onSubmit","_jsx","forceRender","parentIndexPath","parentPath","parentSchemaPath","readOnly"],"sources":["../../../src/utilities/fieldsDrawer/DrawerContent.tsx"],"sourcesContent":["'use client'\nimport type { FormState } from 'payload'\n\nimport {\n Form,\n FormSubmit,\n RenderFields,\n useDocumentInfo,\n useServerFunctions,\n useTranslation,\n} from '@payloadcms/ui'\nimport { abortAndIgnore } from '@payloadcms/ui/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\n const onChangeAbortControllerRef = useRef(new AbortController())\n\n const [initialState, setInitialState] = useState<false | FormState | undefined>(false)\n\n const {\n fieldProps: { featureClientSchemaMap, permissions },\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 globalSlug,\n operation: 'update',\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 }, [schemaFieldsPath, id, data, getFormState, collectionSlug, globalSlug, getDocPreferences])\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 formState: prevFormState,\n globalSlug,\n operation: 'update',\n schemaPath: schemaFieldsPath,\n signal: controller.signal,\n })\n\n if (!state) {\n return prevFormState\n }\n\n return state\n },\n [getFormState, id, collectionSlug, getDocPreferences, globalSlug, schemaFieldsPath],\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={permissions}\n readOnly={false}\n />\n <FormSubmit>{t('fields:saveChanges')}</FormSubmit>\n </Form>\n )\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"generateImportMap.d.ts","sourceRoot":"","sources":["../../src/utilities/generateImportMap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI9C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AAE1E,eAAO,MAAM,oBAAoB,SACxB;IAAE,kBAAkB,EAAE,wBAAwB,CAAA;CAAE,KAAG,eAAe,CAAC,mBAAmB,CAkD5F,CAAA"}
1
+ {"version":3,"file":"generateImportMap.d.ts","sourceRoot":"","sources":["../../src/utilities/generateImportMap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAI9C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAA;AAE1E,eAAO,MAAM,oBAAoB,SACxB;IAAE,kBAAkB,EAAE,wBAAwB,CAAA;CAAE,KAAG,eAAe,CAAC,mBAAmB,CAoD5F,CAAA"}
@@ -1,5 +1,7 @@
1
1
  import { genImportMapIterateFields } from 'payload';
2
- export const getGenerateImportMap = args => ({
2
+ export const getGenerateImportMap = args =>
3
+ // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve
4
+ ({
3
5
  addToImportMap,
4
6
  baseDir,
5
7
  config,
@@ -20,6 +22,7 @@ export const getGenerateImportMap = args => ({
20
22
  imports
21
23
  });
22
24
  } else if (resolvedFeature.componentImports?.length) {
25
+ // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve
23
26
  resolvedFeature.componentImports.forEach(component => {
24
27
  addToImportMap(component);
25
28
  });
@@ -1 +1 @@
1
- {"version":3,"file":"generateImportMap.js","names":["genImportMapIterateFields","getGenerateImportMap","args","addToImportMap","baseDir","config","importMap","imports","resolvedFeature","resolvedFeatureMap","values","componentImports","length","forEach","component","ClientComponent","ClientFeature","nodes","node","getSubFields","subFields","fields"],"sources":["../../src/utilities/generateImportMap.tsx"],"sourcesContent":["import type { RichTextAdapter } from 'payload'\n\nimport { genImportMapIterateFields } from 'payload'\n\nimport type { ResolvedServerFeatureMap } from '../features/typesServer.js'\n\nexport const getGenerateImportMap =\n (args: { resolvedFeatureMap: ResolvedServerFeatureMap }): RichTextAdapter['generateImportMap'] =>\n ({ addToImportMap, baseDir, config, importMap, imports }) => {\n addToImportMap('@payloadcms/richtext-lexical/rsc#RscEntryLexicalCell')\n addToImportMap('@payloadcms/richtext-lexical/rsc#RscEntryLexicalField')\n\n // iterate just through args.resolvedFeatureMap.values()\n for (const resolvedFeature of args.resolvedFeatureMap.values()) {\n if ('componentImports' in resolvedFeature) {\n if (typeof resolvedFeature.componentImports === 'function') {\n resolvedFeature.componentImports({\n addToImportMap,\n baseDir,\n config,\n importMap,\n imports,\n })\n } else if (resolvedFeature.componentImports?.length) {\n resolvedFeature.componentImports.forEach((component) => {\n addToImportMap(component)\n })\n }\n }\n\n const ClientComponent = resolvedFeature.ClientFeature\n if (ClientComponent) {\n addToImportMap(ClientComponent)\n }\n\n /*\n Now run for all possible sub-fields\n */\n if (resolvedFeature.nodes?.length) {\n for (const node of resolvedFeature.nodes) {\n if (typeof node?.getSubFields !== 'function') {\n continue\n }\n const subFields = node.getSubFields({})\n if (subFields?.length) {\n genImportMapIterateFields({\n addToImportMap,\n baseDir,\n config,\n fields: subFields,\n importMap,\n imports,\n })\n }\n }\n }\n }\n }\n"],"mappings":"AAEA,SAASA,yBAAyB,QAAQ;AAI1C,OAAO,MAAMC,oBAAA,GACVC,IAAA,IACD,CAAC;EAAEC,cAAc;EAAEC,OAAO;EAAEC,MAAM;EAAEC,SAAS;EAAEC;AAAO,CAAE;EACtDJ,cAAA,CAAe;EACfA,cAAA,CAAe;EAEf;EACA,KAAK,MAAMK,eAAA,IAAmBN,IAAA,CAAKO,kBAAkB,CAACC,MAAM,IAAI;IAC9D,IAAI,sBAAsBF,eAAA,EAAiB;MACzC,IAAI,OAAOA,eAAA,CAAgBG,gBAAgB,KAAK,YAAY;QAC1DH,eAAA,CAAgBG,gBAAgB,CAAC;UAC/BR,cAAA;UACAC,OAAA;UACAC,MAAA;UACAC,SAAA;UACAC;QACF;MACF,OAAO,IAAIC,eAAA,CAAgBG,gBAAgB,EAAEC,MAAA,EAAQ;QACnDJ,eAAA,CAAgBG,gBAAgB,CAACE,OAAO,CAAEC,SAAA;UACxCX,cAAA,CAAeW,SAAA;QACjB;MACF;IACF;IAEA,MAAMC,eAAA,GAAkBP,eAAA,CAAgBQ,aAAa;IACrD,IAAID,eAAA,EAAiB;MACnBZ,cAAA,CAAeY,eAAA;IACjB;IAEA;;;IAGA,IAAIP,eAAA,CAAgBS,KAAK,EAAEL,MAAA,EAAQ;MACjC,KAAK,MAAMM,IAAA,IAAQV,eAAA,CAAgBS,KAAK,EAAE;QACxC,IAAI,OAAOC,IAAA,EAAMC,YAAA,KAAiB,YAAY;UAC5C;QACF;QACA,MAAMC,SAAA,GAAYF,IAAA,CAAKC,YAAY,CAAC,CAAC;QACrC,IAAIC,SAAA,EAAWR,MAAA,EAAQ;UACrBZ,yBAAA,CAA0B;YACxBG,cAAA;YACAC,OAAA;YACAC,MAAA;YACAgB,MAAA,EAAQD,SAAA;YACRd,SAAA;YACAC;UACF;QACF;MACF;IACF;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"generateImportMap.js","names":["genImportMapIterateFields","getGenerateImportMap","args","addToImportMap","baseDir","config","importMap","imports","resolvedFeature","resolvedFeatureMap","values","componentImports","length","forEach","component","ClientComponent","ClientFeature","nodes","node","getSubFields","subFields","fields"],"sources":["../../src/utilities/generateImportMap.tsx"],"sourcesContent":["import type { RichTextAdapter } from 'payload'\n\nimport { genImportMapIterateFields } from 'payload'\n\nimport type { ResolvedServerFeatureMap } from '../features/typesServer.js'\n\nexport const getGenerateImportMap =\n (args: { resolvedFeatureMap: ResolvedServerFeatureMap }): RichTextAdapter['generateImportMap'] =>\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n ({ addToImportMap, baseDir, config, importMap, imports }) => {\n addToImportMap('@payloadcms/richtext-lexical/rsc#RscEntryLexicalCell')\n addToImportMap('@payloadcms/richtext-lexical/rsc#RscEntryLexicalField')\n\n // iterate just through args.resolvedFeatureMap.values()\n for (const resolvedFeature of args.resolvedFeatureMap.values()) {\n if ('componentImports' in resolvedFeature) {\n if (typeof resolvedFeature.componentImports === 'function') {\n resolvedFeature.componentImports({\n addToImportMap,\n baseDir,\n config,\n importMap,\n imports,\n })\n } else if (resolvedFeature.componentImports?.length) {\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n resolvedFeature.componentImports.forEach((component) => {\n addToImportMap(component)\n })\n }\n }\n\n const ClientComponent = resolvedFeature.ClientFeature\n if (ClientComponent) {\n addToImportMap(ClientComponent)\n }\n\n /*\n Now run for all possible sub-fields\n */\n if (resolvedFeature.nodes?.length) {\n for (const node of resolvedFeature.nodes) {\n if (typeof node?.getSubFields !== 'function') {\n continue\n }\n const subFields = node.getSubFields({})\n if (subFields?.length) {\n genImportMapIterateFields({\n addToImportMap,\n baseDir,\n config,\n fields: subFields,\n importMap,\n imports,\n })\n }\n }\n }\n }\n }\n"],"mappings":"AAEA,SAASA,yBAAyB,QAAQ;AAI1C,OAAO,MAAMC,oBAAA,GACVC,IAAA;AACD;AACA,CAAC;EAAEC,cAAc;EAAEC,OAAO;EAAEC,MAAM;EAAEC,SAAS;EAAEC;AAAO,CAAE;EACtDJ,cAAA,CAAe;EACfA,cAAA,CAAe;EAEf;EACA,KAAK,MAAMK,eAAA,IAAmBN,IAAA,CAAKO,kBAAkB,CAACC,MAAM,IAAI;IAC9D,IAAI,sBAAsBF,eAAA,EAAiB;MACzC,IAAI,OAAOA,eAAA,CAAgBG,gBAAgB,KAAK,YAAY;QAC1DH,eAAA,CAAgBG,gBAAgB,CAAC;UAC/BR,cAAA;UACAC,OAAA;UACAC,MAAA;UACAC,SAAA;UACAC;QACF;MACF,OAAO,IAAIC,eAAA,CAAgBG,gBAAgB,EAAEC,MAAA,EAAQ;QACnD;QACAJ,eAAA,CAAgBG,gBAAgB,CAACE,OAAO,CAAEC,SAAA;UACxCX,cAAA,CAAeW,SAAA;QACjB;MACF;IACF;IAEA,MAAMC,eAAA,GAAkBP,eAAA,CAAgBQ,aAAa;IACrD,IAAID,eAAA,EAAiB;MACnBZ,cAAA,CAAeY,eAAA;IACjB;IAEA;;;IAGA,IAAIP,eAAA,CAAgBS,KAAK,EAAEL,MAAA,EAAQ;MACjC,KAAK,MAAMM,IAAA,IAAQV,eAAA,CAAgBS,KAAK,EAAE;QACxC,IAAI,OAAOC,IAAA,EAAMC,YAAA,KAAiB,YAAY;UAC5C;QACF;QACA,MAAMC,SAAA,GAAYF,IAAA,CAAKC,YAAY,CAAC,CAAC;QACrC,IAAIC,SAAA,EAAWR,MAAA,EAAQ;UACrBZ,yBAAA,CAA0B;YACxBG,cAAA;YACAC,OAAA;YACAC,MAAA;YACAgB,MAAA,EAAQD,SAAA;YACRd,SAAA;YACAC;UACF;QACF;MACF;IACF;EACF;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"jsx.d.ts","sourceRoot":"","sources":["../../../src/utilities/jsx/jsx.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,GAAG,MAAM,CA0BlF;AAeD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAoB5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,MAAM,CAgB3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM;;;EAmBpD"}
1
+ {"version":3,"file":"jsx.d.ts","sourceRoot":"","sources":["../../../src/utilities/jsx/jsx.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAAE,GAAG,MAAM,CA0BlF;AAeD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAqB5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,MAAM,CAgB3E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM;;;EAmBpD"}
@@ -55,6 +55,7 @@ export function frontmatterToObject(frontmatter) {
55
55
  if (inFrontmatter) {
56
56
  const [key, ...valueParts] = line.split(':');
57
57
  const value = valueParts.join(':').trim();
58
+ // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve
58
59
  result[key.trim()] = value;
59
60
  }
60
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jsx.js","names":["propsToJSXString","props","propsArray","key","value","Object","entries","push","escapeQuotes","Array","isArray","map","v","JSON","stringify","replacer","join","str","replace","frontmatterToObject","frontmatter","lines","trim","split","result","inFrontmatter","line","valueParts","objectToFrontmatter","obj","length","extractFrontmatter","mdxContent","frontmatterRegex","match","contentWithoutFrontmatter","slice","content"],"sources":["../../../src/utilities/jsx/jsx.ts"],"sourcesContent":["/**\n * Converts an object of props to a JSX props string.\n *\n * This function is the inverse of `extractPropsFromJSXPropsString`.\n */\nexport function propsToJSXString({ props }: { props: Record<string, any> }): string {\n const propsArray: string[] = []\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === 'string') {\n // Handle simple string props\n propsArray.push(`${key}=\"${escapeQuotes(value)}\"`)\n } else if (typeof value === 'number') {\n // Handle number and boolean props\n propsArray.push(`${key}={${value}}`)\n } else if (typeof value === 'boolean') {\n if (value) {\n propsArray.push(`${key}`)\n }\n } else if (value !== null && typeof value === 'object') {\n if (Array.isArray(value)) {\n // Handle array props\n propsArray.push(`${key}={[${value.map((v) => JSON.stringify(v, replacer)).join(', ')}]}`)\n } else {\n // Handle complex object props\n propsArray.push(`${key}={${JSON.stringify(value, replacer)}}`)\n }\n }\n }\n\n return propsArray.join(' ')\n}\n\n// Helper function to escape quotes in string values\nfunction escapeQuotes(str: string): string {\n return str.replace(/\"/g, '&quot;')\n}\n\n// Custom replacer function for JSON.stringify to handle single quotes\nfunction replacer(key: string, value: any): any {\n if (typeof value === 'string') {\n return value.replace(/'/g, \"\\\\'\")\n }\n return value\n}\n\n/**\n * Converts a frontmatter string to an object.\n */\nexport function frontmatterToObject(frontmatter: string): Record<string, any> {\n const lines = frontmatter.trim().split('\\n')\n const result = {}\n let inFrontmatter = false\n\n for (const line of lines) {\n if (line.trim() === '---') {\n inFrontmatter = !inFrontmatter\n continue\n }\n\n if (inFrontmatter) {\n const [key, ...valueParts] = line.split(':')\n const value = valueParts.join(':').trim()\n\n result[key.trim()] = value\n }\n }\n\n return result\n}\n\n/**\n * Converts an object to a frontmatter string.\n */\nexport function objectToFrontmatter(obj: Record<string, any>): null | string {\n if (!Object.entries(obj)?.length) {\n return null\n }\n let frontmatter = '---\\n'\n\n for (const [key, value] of Object.entries(obj)) {\n if (Array.isArray(value)) {\n frontmatter += `${key}: ${value.join(', ')}\\n`\n } else {\n frontmatter += `${key}: ${value}\\n`\n }\n }\n\n frontmatter += '---\\n'\n return frontmatter\n}\n\n/**\n * Takes an MDX content string and extracts the frontmatter and content.\n *\n * The resulting object contains the mdx content without the frontmatter and the frontmatter itself.\n */\nexport function extractFrontmatter(mdxContent: string) {\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n const frontmatterRegex = /^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n/\n const match = mdxContent.match(frontmatterRegex)\n\n if (match) {\n const frontmatter = match[0]\n const contentWithoutFrontmatter = mdxContent.slice(frontmatter.length).trim()\n return {\n content: contentWithoutFrontmatter,\n frontmatter: frontmatter.trim(),\n }\n } else {\n // If no frontmatter is found, return the original content\n return {\n content: mdxContent.trim(),\n frontmatter: '',\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"jsx.js","names":["propsToJSXString","props","propsArray","key","value","Object","entries","push","escapeQuotes","Array","isArray","map","v","JSON","stringify","replacer","join","str","replace","frontmatterToObject","frontmatter","lines","trim","split","result","inFrontmatter","line","valueParts","objectToFrontmatter","obj","length","extractFrontmatter","mdxContent","frontmatterRegex","match","contentWithoutFrontmatter","slice","content"],"sources":["../../../src/utilities/jsx/jsx.ts"],"sourcesContent":["/**\n * Converts an object of props to a JSX props string.\n *\n * This function is the inverse of `extractPropsFromJSXPropsString`.\n */\nexport function propsToJSXString({ props }: { props: Record<string, any> }): string {\n const propsArray: string[] = []\n\n for (const [key, value] of Object.entries(props)) {\n if (typeof value === 'string') {\n // Handle simple string props\n propsArray.push(`${key}=\"${escapeQuotes(value)}\"`)\n } else if (typeof value === 'number') {\n // Handle number and boolean props\n propsArray.push(`${key}={${value}}`)\n } else if (typeof value === 'boolean') {\n if (value) {\n propsArray.push(`${key}`)\n }\n } else if (value !== null && typeof value === 'object') {\n if (Array.isArray(value)) {\n // Handle array props\n propsArray.push(`${key}={[${value.map((v) => JSON.stringify(v, replacer)).join(', ')}]}`)\n } else {\n // Handle complex object props\n propsArray.push(`${key}={${JSON.stringify(value, replacer)}}`)\n }\n }\n }\n\n return propsArray.join(' ')\n}\n\n// Helper function to escape quotes in string values\nfunction escapeQuotes(str: string): string {\n return str.replace(/\"/g, '&quot;')\n}\n\n// Custom replacer function for JSON.stringify to handle single quotes\nfunction replacer(key: string, value: any): any {\n if (typeof value === 'string') {\n return value.replace(/'/g, \"\\\\'\")\n }\n return value\n}\n\n/**\n * Converts a frontmatter string to an object.\n */\nexport function frontmatterToObject(frontmatter: string): Record<string, any> {\n const lines = frontmatter.trim().split('\\n')\n const result = {}\n let inFrontmatter = false\n\n for (const line of lines) {\n if (line.trim() === '---') {\n inFrontmatter = !inFrontmatter\n continue\n }\n\n if (inFrontmatter) {\n const [key, ...valueParts] = line.split(':')\n const value = valueParts.join(':').trim()\n\n // @ts-expect-error - vestiges of when tsconfig was not strict. Feel free to improve\n result[key.trim()] = value\n }\n }\n\n return result\n}\n\n/**\n * Converts an object to a frontmatter string.\n */\nexport function objectToFrontmatter(obj: Record<string, any>): null | string {\n if (!Object.entries(obj)?.length) {\n return null\n }\n let frontmatter = '---\\n'\n\n for (const [key, value] of Object.entries(obj)) {\n if (Array.isArray(value)) {\n frontmatter += `${key}: ${value.join(', ')}\\n`\n } else {\n frontmatter += `${key}: ${value}\\n`\n }\n }\n\n frontmatter += '---\\n'\n return frontmatter\n}\n\n/**\n * Takes an MDX content string and extracts the frontmatter and content.\n *\n * The resulting object contains the mdx content without the frontmatter and the frontmatter itself.\n */\nexport function extractFrontmatter(mdxContent: string) {\n // eslint-disable-next-line regexp/no-super-linear-backtracking\n const frontmatterRegex = /^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n/\n const match = mdxContent.match(frontmatterRegex)\n\n if (match) {\n const frontmatter = match[0]\n const contentWithoutFrontmatter = mdxContent.slice(frontmatter.length).trim()\n return {\n content: contentWithoutFrontmatter,\n frontmatter: frontmatter.trim(),\n }\n } else {\n // If no frontmatter is found, return the original content\n return {\n content: mdxContent.trim(),\n frontmatter: '',\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/migrateSlateToLexical/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAyC,OAAO,EAAE,MAAM,SAAS,CAAA;AAI7E;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,iBAoC5E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utilities/migrateSlateToLexical/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAyC,OAAO,EAAE,MAAM,SAAS,CAAA;AAI7E;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,iBAoC5E"}
@@ -1,4 +1,4 @@
1
- import { migrateDocumentFieldsRecursively } from './migrateDocumentFieldsRecursively.js';
1
+ /* eslint-disable no-console */import { migrateDocumentFieldsRecursively } from './migrateDocumentFieldsRecursively.js';
2
2
  /**
3
3
  * This goes through every single collection and field in the payload config, and migrates its data from Slate to Lexical. This does not support sub-fields within slate.
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["migrateDocumentFieldsRecursively","migrateSlateToLexical","payload","collections","config","errors","allLocales","localization","localeCodes","totalCollections","length","locale","curCollection","collection","migrateCollection","cur","max","global","globals","migrateGlobal","console","error","JSON","stringify","log","slug","document","findGlobal","depth","draft","undefined","overrideAccess","found","migrateDocument","fields","updateGlobal","data","_status","e","push","documentCount","count","totalDocs","page","migrated","documents","find","pagination","docs","id","update"],"sources":["../../../src/utilities/migrateSlateToLexical/index.ts"],"sourcesContent":["import type { CollectionConfig, Field, GlobalConfig, Payload } from 'payload'\n\nimport { migrateDocumentFieldsRecursively } from './migrateDocumentFieldsRecursively.js'\n\n/**\n * This goes through every single collection and field in the payload config, and migrates its data from Slate to Lexical. This does not support sub-fields within slate.\n *\n * It will only translate fields fulfilling all these requirements:\n * - field schema uses lexical editor\n * - lexical editor has SlateToLexicalFeature added\n * - saved field data is in Slate format\n *\n * @param payload\n */\nexport async function migrateSlateToLexical({ payload }: { payload: Payload }) {\n const collections = payload.config.collections\n\n const errors = []\n\n const allLocales = payload.config.localization ? payload.config.localization.localeCodes : [null]\n\n const totalCollections = collections.length\n for (const locale of allLocales) {\n let curCollection = 0\n for (const collection of collections) {\n curCollection++\n await migrateCollection({\n collection,\n cur: curCollection,\n errors,\n locale,\n max: totalCollections,\n payload,\n })\n }\n for (const global of payload.config.globals) {\n await migrateGlobal({\n errors,\n global,\n locale,\n payload,\n })\n }\n }\n\n if (errors.length) {\n console.error(`Found ${errors.length} errors::`, JSON.stringify(errors, null, 2))\n } else {\n console.log('Migration successful - no errors')\n }\n}\n\nasync function migrateGlobal({\n errors,\n global,\n locale,\n payload,\n}: {\n errors: any[]\n global: GlobalConfig\n locale: null | string\n payload: Payload\n}) {\n console.log(`SlateToLexical: ${locale}: Migrating global:`, global.slug)\n\n const document = await payload.findGlobal({\n slug: global.slug,\n depth: 0,\n draft: true,\n locale: locale || undefined,\n overrideAccess: true,\n })\n\n const found = migrateDocument({\n document,\n fields: global.fields,\n })\n\n if (found) {\n try {\n await payload.updateGlobal({\n slug: global.slug,\n data: document,\n depth: 0,\n draft: document?._status === 'draft',\n locale: locale || undefined,\n })\n // Catch it, because some errors were caused by the user previously (e.g. invalid relationships) and will throw an error now, even though they are not related to the migration\n } catch (e) {\n console.log('Error updating global', e, {\n slug: global.slug,\n })\n errors.push(e)\n }\n }\n}\n\nasync function migrateCollection({\n collection,\n cur,\n errors,\n locale,\n max,\n payload,\n}: {\n collection: CollectionConfig\n cur: number\n errors: any[]\n locale: null | string\n max: number\n payload: Payload\n}) {\n console.log(\n `SlateToLexical: ${locale}: Migrating collection:`,\n collection.slug,\n '(' + cur + '/' + max + ')',\n )\n\n const documentCount = (\n await payload.count({\n collection: collection.slug,\n depth: 0,\n locale: locale || undefined,\n })\n ).totalDocs\n\n let page = 1\n let migrated = 0\n\n while (migrated < documentCount) {\n const documents = await payload.find({\n collection: collection.slug,\n depth: 0,\n draft: true,\n locale: locale || undefined,\n overrideAccess: true,\n page,\n pagination: true,\n })\n\n for (const document of documents.docs) {\n migrated++\n console.log(\n `SlateToLexical: ${locale}: Migrating collection:`,\n collection.slug,\n '(' +\n cur +\n '/' +\n max +\n ') - Migrating Document: ' +\n document.id +\n ' (' +\n migrated +\n '/' +\n documentCount +\n ')',\n )\n const found = migrateDocument({\n document,\n fields: collection.fields,\n })\n\n if (found) {\n try {\n await payload.update({\n id: document.id,\n collection: collection.slug,\n data: document,\n depth: 0,\n draft: document?._status === 'draft',\n locale: locale || undefined,\n })\n // Catch it, because some errors were caused by the user previously (e.g. invalid relationships) and will throw an error now, even though they are not related to the migration\n } catch (e) {\n errors.push(e)\n\n console.log('Error updating collection', e, {\n id: document.id,\n slug: collection.slug,\n })\n }\n }\n }\n page++\n }\n}\n\nfunction migrateDocument({\n document,\n fields,\n}: {\n document: Record<string, unknown>\n fields: Field[]\n}): boolean {\n return !!migrateDocumentFieldsRecursively({\n data: document,\n fields,\n found: 0,\n })\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["migrateDocumentFieldsRecursively","migrateSlateToLexical","payload","collections","config","errors","allLocales","localization","localeCodes","totalCollections","length","locale","curCollection","collection","migrateCollection","cur","max","global","globals","migrateGlobal","console","error","JSON","stringify","log","slug","document","findGlobal","depth","draft","undefined","overrideAccess","found","migrateDocument","fields","updateGlobal","data","_status","e","push","documentCount","count","totalDocs","page","migrated","documents","find","pagination","docs","id","update"],"sources":["../../../src/utilities/migrateSlateToLexical/index.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport type { CollectionConfig, Field, GlobalConfig, Payload } from 'payload'\n\nimport { migrateDocumentFieldsRecursively } from './migrateDocumentFieldsRecursively.js'\n\n/**\n * This goes through every single collection and field in the payload config, and migrates its data from Slate to Lexical. This does not support sub-fields within slate.\n *\n * It will only translate fields fulfilling all these requirements:\n * - field schema uses lexical editor\n * - lexical editor has SlateToLexicalFeature added\n * - saved field data is in Slate format\n *\n * @param payload\n */\nexport async function migrateSlateToLexical({ payload }: { payload: Payload }) {\n const collections = payload.config.collections\n\n const errors: unknown[] = []\n\n const allLocales = payload.config.localization ? payload.config.localization.localeCodes : [null]\n\n const totalCollections = collections.length\n for (const locale of allLocales) {\n let curCollection = 0\n for (const collection of collections) {\n curCollection++\n await migrateCollection({\n collection,\n cur: curCollection,\n errors,\n locale,\n max: totalCollections,\n payload,\n })\n }\n for (const global of payload.config.globals) {\n await migrateGlobal({\n errors,\n global,\n locale,\n payload,\n })\n }\n }\n\n if (errors.length) {\n console.error(`Found ${errors.length} errors::`, JSON.stringify(errors, null, 2))\n } else {\n console.log('Migration successful - no errors')\n }\n}\n\nasync function migrateGlobal({\n errors,\n global,\n locale,\n payload,\n}: {\n errors: unknown[]\n global: GlobalConfig\n locale: null | string\n payload: Payload\n}) {\n console.log(`SlateToLexical: ${locale}: Migrating global:`, global.slug)\n\n const document = await payload.findGlobal({\n slug: global.slug,\n depth: 0,\n draft: true,\n locale: locale || undefined,\n overrideAccess: true,\n })\n\n const found = migrateDocument({\n document,\n fields: global.fields,\n })\n\n if (found) {\n try {\n await payload.updateGlobal({\n slug: global.slug,\n data: document,\n depth: 0,\n draft: document?._status === 'draft',\n locale: locale || undefined,\n })\n // Catch it, because some errors were caused by the user previously (e.g. invalid relationships) and will throw an error now, even though they are not related to the migration\n } catch (e) {\n console.log('Error updating global', e, {\n slug: global.slug,\n })\n errors.push(e)\n }\n }\n}\n\nasync function migrateCollection({\n collection,\n cur,\n errors,\n locale,\n max,\n payload,\n}: {\n collection: CollectionConfig\n cur: number\n errors: unknown[]\n locale: null | string\n max: number\n payload: Payload\n}) {\n console.log(\n `SlateToLexical: ${locale}: Migrating collection:`,\n collection.slug,\n '(' + cur + '/' + max + ')',\n )\n\n const documentCount = (\n await payload.count({\n collection: collection.slug,\n depth: 0,\n locale: locale || undefined,\n })\n ).totalDocs\n\n let page = 1\n let migrated = 0\n\n while (migrated < documentCount) {\n const documents = await payload.find({\n collection: collection.slug,\n depth: 0,\n draft: true,\n locale: locale || undefined,\n overrideAccess: true,\n page,\n pagination: true,\n })\n\n for (const document of documents.docs) {\n migrated++\n console.log(\n `SlateToLexical: ${locale}: Migrating collection:`,\n collection.slug,\n '(' +\n cur +\n '/' +\n max +\n ') - Migrating Document: ' +\n document.id +\n ' (' +\n migrated +\n '/' +\n documentCount +\n ')',\n )\n const found = migrateDocument({\n document,\n fields: collection.fields,\n })\n\n if (found) {\n try {\n await payload.update({\n id: document.id,\n collection: collection.slug,\n data: document,\n depth: 0,\n draft: document?._status === 'draft',\n locale: locale || undefined,\n })\n // Catch it, because some errors were caused by the user previously (e.g. invalid relationships) and will throw an error now, even though they are not related to the migration\n } catch (e) {\n errors.push(e)\n\n console.log('Error updating collection', e, {\n id: document.id,\n slug: collection.slug,\n })\n }\n }\n }\n page++\n }\n}\n\nfunction migrateDocument({\n document,\n fields,\n}: {\n document: Record<string, unknown>\n fields: Field[]\n}): boolean {\n return !!migrateDocumentFieldsRecursively({\n data: document,\n fields,\n found: 0,\n })\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAA2B,MAAM,SAAS,CAAA;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEtD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAI7E,eAAO,MAAM,mBAAmB,sBAE7B;IACD,YAAY,EAAE,2BAA2B,CAAA;CAC1C,8GAuDA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validate/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAA+C,MAAM,SAAS,CAAA;AACjG,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEtD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAA;AAI7E,eAAO,MAAM,mBAAmB,sBAE7B;IACD,YAAY,EAAE,2BAA2B,CAAA;CAC1C,8GAuDA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["validateNodes","richTextValidateHOC","editorConfig","richTextValidate","value","options","req","t","required","hasChildren","root","children","length","hasOnlyEmptyParagraph","type","paragraphNode","paragraphNodeChild","rootNodes","Array","isArray","nodes","nodeValidations","features","validations","validation"],"sources":["../../src/validate/index.ts"],"sourcesContent":["import type { SerializedEditorState, SerializedParagraphNode } from 'lexical'\nimport type { RichTextField, Validate } from 'payload'\n\nimport type { SanitizedServerEditorConfig } from '../lexical/config/types.js'\n\nimport { validateNodes } from './validateNodes.js'\n\nexport const richTextValidateHOC = ({\n editorConfig,\n}: {\n editorConfig: SanitizedServerEditorConfig\n}) => {\n const richTextValidate: Validate<SerializedEditorState, unknown, unknown, RichTextField> = async (\n value,\n options,\n ) => {\n const {\n req: { t },\n required,\n } = options\n\n if (required) {\n const hasChildren = !!value?.root?.children?.length\n\n let hasOnlyEmptyParagraph = false\n if (value?.root?.children?.length === 1) {\n if (value?.root?.children[0]?.type === 'paragraph') {\n const paragraphNode = value?.root?.children[0] as SerializedParagraphNode\n\n if (!paragraphNode?.children || paragraphNode?.children?.length === 0) {\n hasOnlyEmptyParagraph = true\n } else if (paragraphNode?.children?.length === 1) {\n const paragraphNodeChild = paragraphNode?.children[0]\n if (paragraphNodeChild.type === 'text') {\n if (!paragraphNodeChild?.['text']?.length) {\n hasOnlyEmptyParagraph = true\n }\n }\n }\n }\n }\n\n if (!hasChildren || hasOnlyEmptyParagraph) {\n return t('validation:required')\n }\n }\n\n // Traverse through nodes and validate them. Just like a node can hook into the population process (e.g. link or relationship nodes),\n // they can also hook into the validation process. E.g. a block node probably has fields with validation rules.\n\n const rootNodes = value?.root?.children\n if (rootNodes && Array.isArray(rootNodes) && rootNodes?.length) {\n return await validateNodes({\n nodes: rootNodes,\n nodeValidations: editorConfig.features.validations,\n validation: {\n options,\n value,\n },\n })\n }\n\n return true\n }\n\n return richTextValidate\n}\n"],"mappings":"AAKA,SAASA,aAAa,QAAQ;AAE9B,OAAO,MAAMC,mBAAA,GAAsBA,CAAC;EAClCC;AAAY,CAGb;EACC,MAAMC,gBAAA,GAAqF,MAAAA,CACzFC,KAAA,EACAC,OAAA;IAEA,MAAM;MACJC,GAAA,EAAK;QAAEC;MAAC,CAAE;MACVC;IAAQ,CACT,GAAGH,OAAA;IAEJ,IAAIG,QAAA,EAAU;MACZ,MAAMC,WAAA,GAAc,CAAC,CAACL,KAAA,EAAOM,IAAA,EAAMC,QAAA,EAAUC,MAAA;MAE7C,IAAIC,qBAAA,GAAwB;MAC5B,IAAIT,KAAA,EAAOM,IAAA,EAAMC,QAAA,EAAUC,MAAA,KAAW,GAAG;QACvC,IAAIR,KAAA,EAAOM,IAAA,EAAMC,QAAQ,CAAC,EAAE,EAAEG,IAAA,KAAS,aAAa;UAClD,MAAMC,aAAA,GAAgBX,KAAA,EAAOM,IAAA,EAAMC,QAAQ,CAAC,EAAE;UAE9C,IAAI,CAACI,aAAA,EAAeJ,QAAA,IAAYI,aAAA,EAAeJ,QAAA,EAAUC,MAAA,KAAW,GAAG;YACrEC,qBAAA,GAAwB;UAC1B,OAAO,IAAIE,aAAA,EAAeJ,QAAA,EAAUC,MAAA,KAAW,GAAG;YAChD,MAAMI,kBAAA,GAAqBD,aAAA,EAAeJ,QAAQ,CAAC,EAAE;YACrD,IAAIK,kBAAA,CAAmBF,IAAI,KAAK,QAAQ;cACtC,IAAI,CAACE,kBAAA,GAAqB,OAAO,EAAEJ,MAAA,EAAQ;gBACzCC,qBAAA,GAAwB;cAC1B;YACF;UACF;QACF;MACF;MAEA,IAAI,CAACJ,WAAA,IAAeI,qBAAA,EAAuB;QACzC,OAAON,CAAA,CAAE;MACX;IACF;IAEA;IACA;IAEA,MAAMU,SAAA,GAAYb,KAAA,EAAOM,IAAA,EAAMC,QAAA;IAC/B,IAAIM,SAAA,IAAaC,KAAA,CAAMC,OAAO,CAACF,SAAA,KAAcA,SAAA,EAAWL,MAAA,EAAQ;MAC9D,OAAO,MAAMZ,aAAA,CAAc;QACzBoB,KAAA,EAAOH,SAAA;QACPI,eAAA,EAAiBnB,YAAA,CAAaoB,QAAQ,CAACC,WAAW;QAClDC,UAAA,EAAY;UACVnB,OAAA;UACAD;QACF;MACF;IACF;IAEA,OAAO;EACT;EAEA,OAAOD,gBAAA;AACT","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["validateNodes","richTextValidateHOC","editorConfig","richTextValidate","value","options","req","t","required","hasChildren","root","children","length","hasOnlyEmptyParagraph","type","paragraphNode","paragraphNodeChild","rootNodes","Array","isArray","nodes","nodeValidations","features","validations","validation"],"sources":["../../src/validate/index.ts"],"sourcesContent":["import type { SerializedEditorState, SerializedParagraphNode, SerializedTextNode } from 'lexical'\nimport type { RichTextField, Validate } from 'payload'\n\nimport type { SanitizedServerEditorConfig } from '../lexical/config/types.js'\n\nimport { validateNodes } from './validateNodes.js'\n\nexport const richTextValidateHOC = ({\n editorConfig,\n}: {\n editorConfig: SanitizedServerEditorConfig\n}) => {\n const richTextValidate: Validate<SerializedEditorState, unknown, unknown, RichTextField> = async (\n value,\n options,\n ) => {\n const {\n req: { t },\n required,\n } = options\n\n if (required) {\n const hasChildren = !!value?.root?.children?.length\n\n let hasOnlyEmptyParagraph = false\n if (value?.root?.children?.length === 1) {\n if (value?.root?.children[0]?.type === 'paragraph') {\n const paragraphNode = value?.root?.children[0] as SerializedParagraphNode\n\n if (!paragraphNode?.children || paragraphNode?.children?.length === 0) {\n hasOnlyEmptyParagraph = true\n } else if (paragraphNode?.children?.length === 1) {\n const paragraphNodeChild = paragraphNode?.children[0]\n if (paragraphNodeChild.type === 'text') {\n if (!(paragraphNodeChild as SerializedTextNode | undefined)?.['text']?.length) {\n hasOnlyEmptyParagraph = true\n }\n }\n }\n }\n }\n\n if (!hasChildren || hasOnlyEmptyParagraph) {\n return t('validation:required')\n }\n }\n\n // Traverse through nodes and validate them. Just like a node can hook into the population process (e.g. link or relationship nodes),\n // they can also hook into the validation process. E.g. a block node probably has fields with validation rules.\n\n const rootNodes = value?.root?.children\n if (rootNodes && Array.isArray(rootNodes) && rootNodes?.length) {\n return await validateNodes({\n nodes: rootNodes,\n nodeValidations: editorConfig.features.validations,\n validation: {\n options,\n value,\n },\n })\n }\n\n return true\n }\n\n return richTextValidate\n}\n"],"mappings":"AAKA,SAASA,aAAa,QAAQ;AAE9B,OAAO,MAAMC,mBAAA,GAAsBA,CAAC;EAClCC;AAAY,CAGb;EACC,MAAMC,gBAAA,GAAqF,MAAAA,CACzFC,KAAA,EACAC,OAAA;IAEA,MAAM;MACJC,GAAA,EAAK;QAAEC;MAAC,CAAE;MACVC;IAAQ,CACT,GAAGH,OAAA;IAEJ,IAAIG,QAAA,EAAU;MACZ,MAAMC,WAAA,GAAc,CAAC,CAACL,KAAA,EAAOM,IAAA,EAAMC,QAAA,EAAUC,MAAA;MAE7C,IAAIC,qBAAA,GAAwB;MAC5B,IAAIT,KAAA,EAAOM,IAAA,EAAMC,QAAA,EAAUC,MAAA,KAAW,GAAG;QACvC,IAAIR,KAAA,EAAOM,IAAA,EAAMC,QAAQ,CAAC,EAAE,EAAEG,IAAA,KAAS,aAAa;UAClD,MAAMC,aAAA,GAAgBX,KAAA,EAAOM,IAAA,EAAMC,QAAQ,CAAC,EAAE;UAE9C,IAAI,CAACI,aAAA,EAAeJ,QAAA,IAAYI,aAAA,EAAeJ,QAAA,EAAUC,MAAA,KAAW,GAAG;YACrEC,qBAAA,GAAwB;UAC1B,OAAO,IAAIE,aAAA,EAAeJ,QAAA,EAAUC,MAAA,KAAW,GAAG;YAChD,MAAMI,kBAAA,GAAqBD,aAAA,EAAeJ,QAAQ,CAAC,EAAE;YACrD,IAAIK,kBAAA,CAAmBF,IAAI,KAAK,QAAQ;cACtC,IAAI,CAAEE,kBAAA,GAAwD,OAAO,EAAEJ,MAAA,EAAQ;gBAC7EC,qBAAA,GAAwB;cAC1B;YACF;UACF;QACF;MACF;MAEA,IAAI,CAACJ,WAAA,IAAeI,qBAAA,EAAuB;QACzC,OAAON,CAAA,CAAE;MACX;IACF;IAEA;IACA;IAEA,MAAMU,SAAA,GAAYb,KAAA,EAAOM,IAAA,EAAMC,QAAA;IAC/B,IAAIM,SAAA,IAAaC,KAAA,CAAMC,OAAO,CAACF,SAAA,KAAcA,SAAA,EAAWL,MAAA,EAAQ;MAC9D,OAAO,MAAMZ,aAAA,CAAc;QACzBoB,KAAA,EAAOH,SAAA;QACPI,eAAA,EAAiBnB,YAAA,CAAaoB,QAAQ,CAACC,WAAW;QAClDC,UAAA,EAAY;UACVnB,OAAA;UACAD;QACF;MACF;IACF;IAEA,OAAO;EACT;EAEA,OAAOD,gBAAA;AACT","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/richtext-lexical",
3
- "version": "3.0.2",
3
+ "version": "3.0.3-canary.27acdae",
4
4
  "description": "The officially supported Lexical richtext adapter for Payload",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "repository": {
@@ -340,8 +340,8 @@
340
340
  "react-error-boundary": "4.0.13",
341
341
  "ts-essentials": "10.0.3",
342
342
  "uuid": "10.0.0",
343
- "@payloadcms/ui": "3.0.2",
344
- "@payloadcms/translations": "3.0.2"
343
+ "@payloadcms/translations": "3.0.3-canary.27acdae",
344
+ "@payloadcms/ui": "3.0.3-canary.27acdae"
345
345
  },
346
346
  "devDependencies": {
347
347
  "@babel/cli": "^7.24.5",
@@ -361,8 +361,8 @@
361
361
  "esbuild-sass-plugin": "3.3.1",
362
362
  "eslint-plugin-react-compiler": "19.0.0-beta-a7bf2bd-20241110",
363
363
  "swc-plugin-transform-remove-imports": "1.15.0",
364
- "@payloadcms/eslint-config": "3.0.0",
365
- "payload": "3.0.2"
364
+ "payload": "3.0.3-canary.27acdae",
365
+ "@payloadcms/eslint-config": "3.0.0"
366
366
  },
367
367
  "peerDependencies": {
368
368
  "@faceless-ui/modal": "3.0.0-beta.2",
@@ -379,8 +379,8 @@
379
379
  "lexical": "0.20.0",
380
380
  "react": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020",
381
381
  "react-dom": "^19.0.0 || ^19.0.0-rc-65a56d0e-20241020",
382
- "@payloadcms/next": "3.0.2",
383
- "payload": "3.0.2"
382
+ "@payloadcms/next": "3.0.3-canary.27acdae",
383
+ "payload": "3.0.3-canary.27acdae"
384
384
  },
385
385
  "engines": {
386
386
  "node": "^18.20.2 || >=20.9.0"