@payloadcms/richtext-lexical 4.0.0-internal.cc18726 → 4.0.0-internal.cd47d20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/exports/client/Field-BPLEYPXV.js +2 -0
- package/dist/exports/client/Field-BPLEYPXV.js.map +7 -0
- package/dist/exports/client/bundled.css +1 -1
- package/dist/exports/client/index.js +27 -27
- package/dist/exports/client/index.js.map +4 -4
- package/dist/features/blocks/client/component/BlockReordering/index.d.ts +11 -0
- package/dist/features/blocks/client/component/BlockReordering/index.d.ts.map +1 -0
- package/dist/features/blocks/client/component/BlockReordering/index.js +18 -0
- package/dist/features/blocks/client/component/BlockReordering/index.js.map +1 -0
- package/dist/features/blocks/client/component/index.d.ts +0 -6
- package/dist/features/blocks/client/component/index.d.ts.map +1 -1
- package/dist/features/blocks/client/component/index.js +126 -69
- package/dist/features/blocks/client/component/index.js.map +1 -1
- package/dist/features/blocks/client/component/useBlockReordering.d.ts +16 -0
- package/dist/features/blocks/client/component/useBlockReordering.d.ts.map +1 -0
- package/dist/features/blocks/client/component/useBlockReordering.js +178 -0
- package/dist/features/blocks/client/component/useBlockReordering.js.map +1 -0
- package/dist/features/converters/lexicalToHtml/async/converters/heading.js +1 -1
- package/dist/features/converters/lexicalToHtml/async/converters/heading.js.map +1 -1
- package/dist/features/converters/lexicalToHtml/async/converters/list.d.ts.map +1 -1
- package/dist/features/converters/lexicalToHtml/async/converters/list.js +4 -3
- package/dist/features/converters/lexicalToHtml/async/converters/list.js.map +1 -1
- package/dist/features/converters/lexicalToHtml/sync/converters/heading.js +1 -1
- package/dist/features/converters/lexicalToHtml/sync/converters/heading.js.map +1 -1
- package/dist/features/converters/lexicalToHtml/sync/converters/list.d.ts.map +1 -1
- package/dist/features/converters/lexicalToHtml/sync/converters/list.js +4 -3
- package/dist/features/converters/lexicalToHtml/sync/converters/list.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/heading.d.ts.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/heading.js +2 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/heading.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/list.d.ts.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/list.js +2 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/list.js.map +1 -1
- package/dist/features/converters/utilities/payloadPopulateFn.d.ts.map +1 -1
- package/dist/features/converters/utilities/payloadPopulateFn.js +4 -2
- package/dist/features/converters/utilities/payloadPopulateFn.js.map +1 -1
- package/dist/features/heading/constants.d.ts +2 -0
- package/dist/features/heading/constants.d.ts.map +1 -0
- package/dist/features/heading/constants.js +2 -0
- package/dist/features/heading/constants.js.map +1 -0
- package/dist/features/heading/server/index.d.ts.map +1 -1
- package/dist/features/heading/server/index.js +5 -1
- package/dist/features/heading/server/index.js.map +1 -1
- package/dist/features/heading/server/validate.d.ts +6 -0
- package/dist/features/heading/server/validate.d.ts.map +1 -0
- package/dist/features/heading/server/validate.js +15 -0
- package/dist/features/heading/server/validate.js.map +1 -0
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +1 -0
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
- package/dist/features/lists/checklist/server/index.d.ts.map +1 -1
- package/dist/features/lists/checklist/server/index.js +5 -2
- package/dist/features/lists/checklist/server/index.js.map +1 -1
- package/dist/features/lists/orderedList/server/index.d.ts.map +1 -1
- package/dist/features/lists/orderedList/server/index.js +5 -2
- package/dist/features/lists/orderedList/server/index.js.map +1 -1
- package/dist/features/lists/shared/constants.d.ts +2 -0
- package/dist/features/lists/shared/constants.d.ts.map +1 -0
- package/dist/features/lists/shared/constants.js +2 -0
- package/dist/features/lists/shared/constants.js.map +1 -0
- package/dist/features/lists/shared/validate.d.ts +5 -0
- package/dist/features/lists/shared/validate.d.ts.map +1 -0
- package/dist/features/lists/shared/validate.js +15 -0
- package/dist/features/lists/shared/validate.js.map +1 -0
- package/dist/features/lists/unorderedList/server/index.d.ts.map +1 -1
- package/dist/features/lists/unorderedList/server/index.js +5 -2
- package/dist/features/lists/unorderedList/server/index.js.map +1 -1
- package/dist/features/relationship/client/index.d.ts +2 -2
- package/dist/features/relationship/client/index.d.ts.map +1 -1
- package/dist/features/relationship/client/index.js.map +1 -1
- package/dist/features/relationship/client/plugins/index.d.ts +2 -2
- package/dist/features/relationship/client/plugins/index.d.ts.map +1 -1
- package/dist/features/relationship/client/plugins/index.js +27 -31
- package/dist/features/relationship/client/plugins/index.js.map +1 -1
- package/dist/features/relationship/client/utils/useEnabledRelationships.d.ts +2 -4
- package/dist/features/relationship/client/utils/useEnabledRelationships.d.ts.map +1 -1
- package/dist/features/relationship/client/utils/useEnabledRelationships.js +53 -20
- package/dist/features/relationship/client/utils/useEnabledRelationships.js.map +1 -1
- package/dist/features/relationship/server/graphQLPopulationPromise.d.ts +2 -2
- package/dist/features/relationship/server/graphQLPopulationPromise.d.ts.map +1 -1
- package/dist/features/relationship/server/graphQLPopulationPromise.js +2 -2
- package/dist/features/relationship/server/graphQLPopulationPromise.js.map +1 -1
- package/dist/features/relationship/server/index.d.ts +8 -1
- package/dist/features/relationship/server/index.d.ts.map +1 -1
- package/dist/features/relationship/server/index.js +28 -11
- package/dist/features/relationship/server/index.js.map +1 -1
- package/dist/features/relationship/server/schema.d.ts +2 -2
- package/dist/features/relationship/server/schema.d.ts.map +1 -1
- package/dist/features/relationship/server/schema.js +5 -10
- package/dist/features/relationship/server/schema.js.map +1 -1
- package/dist/features/relationship/shared/filterEnabledRelationshipCollections.d.ts +1 -6
- package/dist/features/relationship/shared/filterEnabledRelationshipCollections.d.ts.map +1 -1
- package/dist/features/relationship/shared/filterEnabledRelationshipCollections.js +1 -5
- package/dist/features/relationship/shared/filterEnabledRelationshipCollections.js.map +1 -1
- package/dist/features/table/client/plugins/TableActionMenuPlugin/computeSelectionCount.d.ts +8 -0
- package/dist/features/table/client/plugins/TableActionMenuPlugin/computeSelectionCount.d.ts.map +1 -0
- package/dist/features/table/client/plugins/TableActionMenuPlugin/computeSelectionCount.js +19 -0
- package/dist/features/table/client/plugins/TableActionMenuPlugin/computeSelectionCount.js.map +1 -0
- package/dist/features/table/client/plugins/TableActionMenuPlugin/index.d.ts.map +1 -1
- package/dist/features/table/client/plugins/TableActionMenuPlugin/index.js +17 -44
- package/dist/features/table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
- package/dist/features/table/client/plugins/TableCellResizerPlugin/index.d.ts.map +1 -1
- package/dist/features/table/client/plugins/TableCellResizerPlugin/index.js +41 -18
- package/dist/features/table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarButton/index.d.ts.map +1 -1
- package/dist/features/toolbars/shared/ToolbarButton/index.js +1 -0
- package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.d.ts.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js +85 -32
- package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/index.css +16 -11
- package/dist/features/upload/client/index.d.ts +3 -2
- package/dist/features/upload/client/index.d.ts.map +1 -1
- package/dist/features/upload/client/index.js.map +1 -1
- package/dist/features/upload/client/plugin/index.d.ts.map +1 -1
- package/dist/features/upload/client/plugin/index.js +47 -52
- package/dist/features/upload/client/plugin/index.js.map +1 -1
- package/dist/features/upload/server/graphQLPopulationPromise.d.ts +2 -2
- package/dist/features/upload/server/graphQLPopulationPromise.d.ts.map +1 -1
- package/dist/features/upload/server/graphQLPopulationPromise.js +1 -1
- package/dist/features/upload/server/graphQLPopulationPromise.js.map +1 -1
- package/dist/features/upload/server/index.d.ts +6 -2
- package/dist/features/upload/server/index.d.ts.map +1 -1
- package/dist/features/upload/server/index.js +18 -14
- package/dist/features/upload/server/index.js.map +1 -1
- package/dist/features/upload/server/schema.d.ts +2 -2
- package/dist/features/upload/server/schema.d.ts.map +1 -1
- package/dist/features/upload/server/schema.js +4 -8
- package/dist/features/upload/server/schema.js.map +1 -1
- package/dist/features/upload/server/validate.d.ts +2 -2
- package/dist/features/upload/server/validate.d.ts.map +1 -1
- package/dist/features/upload/server/validate.js +3 -0
- package/dist/features/upload/server/validate.js.map +1 -1
- package/dist/field/Diff/converters/listitem/index.d.ts.map +1 -1
- package/dist/field/Diff/converters/listitem/index.js +2 -1
- package/dist/field/Diff/converters/listitem/index.js.map +1 -1
- package/dist/field/Diff/index.d.ts +3 -2
- package/dist/field/Diff/index.d.ts.map +1 -1
- package/dist/field/Diff/index.js +1 -0
- package/dist/field/Diff/index.js.map +1 -1
- package/dist/field/RenderLexical/index.d.ts +3 -1
- package/dist/field/RenderLexical/index.d.ts.map +1 -1
- package/dist/field/RenderLexical/index.js +23 -23
- package/dist/field/RenderLexical/index.js.map +1 -1
- package/dist/field/ViewSelector.d.ts.map +1 -1
- package/dist/field/ViewSelector.js +1 -0
- package/dist/field/ViewSelector.js.map +1 -1
- package/dist/field/bundled.css +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lexical/LexicalEditor.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.d.ts.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +16 -2
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/useKeyboardReordering.d.ts +7 -0
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/useKeyboardReordering.d.ts.map +1 -0
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/useKeyboardReordering.js +65 -0
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/useKeyboardReordering.js.map +1 -0
- package/dist/lexical/ui/icons/H3/index.d.ts.map +1 -1
- package/dist/lexical/ui/icons/H3/index.js +13 -6
- package/dist/lexical/ui/icons/H3/index.js.map +1 -1
- package/dist/lexical/ui/icons/H4/index.d.ts.map +1 -1
- package/dist/lexical/ui/icons/H4/index.js +13 -6
- package/dist/lexical/ui/icons/H4/index.js.map +1 -1
- package/dist/lexical/ui/icons/H5/index.d.ts.map +1 -1
- package/dist/lexical/ui/icons/H5/index.js +13 -6
- package/dist/lexical/ui/icons/H5/index.js.map +1 -1
- package/dist/lexical/ui/icons/H6/index.d.ts.map +1 -1
- package/dist/lexical/ui/icons/H6/index.js +13 -6
- package/dist/lexical/ui/icons/H6/index.js.map +1 -1
- package/dist/utilities/upgradeLexicalData/index.js +6 -3
- package/dist/utilities/upgradeLexicalData/index.js.map +1 -1
- package/package.json +21 -21
- package/dist/dependencyChecker.spec.js +0 -16
- package/dist/dependencyChecker.spec.js.map +0 -1
- package/dist/exports/client/Field-F22V5L4V.js +0 -2
- package/dist/exports/client/Field-F22V5L4V.js.map +0 -7
- package/dist/features/converters/lexicalToHtml/sync/alignment.spec.js +0 -92
- package/dist/features/converters/lexicalToHtml/sync/alignment.spec.js.map +0 -1
- package/dist/features/converters/lexicalToPlaintext/convertLexicalToPlaintext.spec.js +0 -180
- package/dist/features/converters/lexicalToPlaintext/convertLexicalToPlaintext.spec.js.map +0 -1
- package/dist/features/link/markdownTransformer.spec.js +0 -195
- package/dist/features/link/markdownTransformer.spec.js.map +0 -1
- package/dist/features/toolbars/fixed/client/Toolbar/horizontalWheelScroll.spec.js +0 -65
- package/dist/features/toolbars/fixed/client/Toolbar/horizontalWheelScroll.spec.js.map +0 -1
- package/dist/lexical/utils/markdown/convertFromMarkdownString.spec.js +0 -88
- package/dist/lexical/utils/markdown/convertFromMarkdownString.spec.js.map +0 -1
- package/dist/lexical/utils/url.spec.js +0 -114
- package/dist/lexical/utils/url.spec.js.map +0 -1
- package/dist/utilities/jsx/jsx.spec.js +0 -178
- package/dist/utilities/jsx/jsx.spec.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Tooltip","useTranslation","$addUpdateTag","React","useCallback","useEffect","useMemo","useRef","useState","useEditorConfigContext","baseClass","ToolbarButton","active","children","editor","enabled","item","i18n","fieldProps","featureClientSchemaMap","schemaPath","showTooltip","setShowTooltip","buttonRef","current","removeAttribute","tooltipLabel","label","key","replace","c","toUpperCase","className","filter","Boolean","join","handleClick","focus","update","onSelect","isActive","handleMouseDown","e","preventDefault","currentTarget","setAttribute","_jsxs","disabled","onClick","onMouseDown","onPointerEnter","onPointerLeave","ref","type","_jsx","show"],"sources":["../../../../../src/features/toolbars/shared/ToolbarButton/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { Tooltip, useTranslation } from '@payloadcms/ui'\nimport { $addUpdateTag } from 'lexical'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport type { ToolbarGroupItem } from '../../types.js'\n\nimport { useEditorConfigContext } from '../../../../lexical/config/client/EditorConfigProvider.js'\nimport './index.css'\n\nconst baseClass = 'toolbar-popup__button'\n\nexport const ToolbarButton = ({\n active = false,\n children,\n editor,\n enabled = true,\n item,\n}: {\n active?: boolean\n children: React.JSX.Element\n editor: LexicalEditor\n enabled?: boolean\n item: ToolbarGroupItem\n}) => {\n const { i18n } = useTranslation<{}, string>()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const [showTooltip, setShowTooltip] = useState(false)\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n // Clear pressing state when active prop changes (React has re-rendered)\n useEffect(() => {\n buttonRef.current?.removeAttribute('data-pressing')\n }, [active])\n\n const tooltipLabel = useMemo(() => {\n if (item.label) {\n return typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Convert camelCase key to Title Case (e.g. \"inlineCode\" -> \"Inline Code\")\n return item.key.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/^./, (c) => c.toUpperCase())\n }, [featureClientSchemaMap, i18n, schemaPath, item])\n\n const className = useMemo(() => {\n return [\n baseClass,\n !enabled ? 'disabled' : '',\n active ? 'active' : '',\n item.key ? `${baseClass}-${item.key}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n }, [active, enabled, item.key])\n\n const handleClick = useCallback(() => {\n if (!enabled) {\n return\n }\n\n editor.focus(() => {\n editor.update(() => {\n $addUpdateTag('toolbar')\n })\n // We need to wrap the onSelect in the callback, so the editor is properly focused before the onSelect is called.\n item.onSelect?.({\n editor,\n isActive: active,\n })\n })\n }, [editor, item, active, enabled])\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n // This fixes a bug where you are unable to click the button if you are in a NESTED editor (editor in blocks field in editor).\n // Thus only happens if you click on the SVG of the button. Clicking on the outside works. Related issue: https://github.com/payloadcms/payload/issues/4025\n // TODO: Find out why exactly it happens and why e.preventDefault() on the mouseDown fixes it. Write that down here, or potentially fix a root cause, if there is any.\n e.preventDefault()\n // Suppress hover flash between mouseup and React adding .active class\n ;(e.currentTarget as HTMLElement).setAttribute('data-pressing', '')\n }, [])\n\n return (\n <button\n aria-label={tooltipLabel}\n className={className}\n data-button-key={item.key}\n disabled={!enabled}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n onPointerEnter={() => setShowTooltip(true)}\n onPointerLeave={() => {\n setShowTooltip(false)\n buttonRef.current?.removeAttribute('data-pressing')\n }}\n ref={buttonRef}\n type=\"button\"\n >\n <Tooltip className={`${baseClass}__tooltip`} show={showTooltip}>\n {tooltipLabel}\n </Tooltip>\n {children}\n </button>\n )\n}\n"],"mappings":"AAAA;;;AAGA,SAASA,OAAO,EAAEC,cAAc,QAAQ;AACxC,SAASC,aAAa,QAAQ;AAC9B,OAAOC,KAAA,IAASC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AAIzE,SAASC,sBAAsB,QAAQ;AACvC,OAAO;AAEP,MAAMC,SAAA,GAAY;AAElB,OAAO,MAAMC,aAAA,GAAgBA,CAAC;EAC5BC,MAAA,GAAS,KAAK;EACdC,QAAQ;EACRC,MAAM;EACNC,OAAA,GAAU,IAAI;EACdC;AAAI,CAOL;EACC,MAAM;IAAEC;EAAI,CAAE,GAAGhB,cAAA;EACjB,MAAM;IACJiB,UAAA,EAAY;MAAEC,sBAAsB;MAAEC;IAAU;EAAE,CACnD,GAAGX,sBAAA;EAEJ,MAAM,CAACY,WAAA,EAAaC,cAAA,CAAe,GAAGd,QAAA,CAAS;EAC/C,MAAMe,SAAA,GAAYhB,MAAA,CAA0B;EAE5C;EACAF,SAAA,CAAU;IACRkB,SAAA,CAAUC,OAAO,EAAEC,eAAA,CAAgB;EACrC,GAAG,CAACb,MAAA,CAAO;EAEX,MAAMc,YAAA,GAAepB,OAAA,CAAQ;IAC3B,IAAIU,IAAA,CAAKW,KAAK,EAAE;MACd,OAAO,OAAOX,IAAA,CAAKW,KAAK,KAAK,aACzBX,IAAA,CAAKW,KAAK,CAAC;QAAER,sBAAA;QAAwBF,IAAA;QAAMG;MAAW,KACtDJ,IAAA,CAAKW,KAAK;IAChB;IACA;IACA,OAAOX,IAAA,CAAKY,GAAG,CAACC,OAAO,CAAC,mBAAmB,SAASA,OAAO,CAAC,MAAOC,CAAA,IAAMA,CAAA,CAAEC,WAAW;EACxF,GAAG,CAACZ,sBAAA,EAAwBF,IAAA,EAAMG,UAAA,EAAYJ,IAAA,CAAK;EAEnD,MAAMgB,SAAA,GAAY1B,OAAA,CAAQ;IACxB,OAAO,CACLI,SAAA,EACA,CAACK,OAAA,GAAU,aAAa,IACxBH,MAAA,GAAS,WAAW,IACpBI,IAAA,CAAKY,GAAG,GAAG,GAAGlB,SAAA,IAAaM,IAAA,CAAKY,GAAG,EAAE,GAAG,GACzC,CACEK,MAAM,CAACC,OAAA,EACPC,IAAI,CAAC;EACV,GAAG,CAACvB,MAAA,EAAQG,OAAA,EAASC,IAAA,CAAKY,GAAG,CAAC;EAE9B,MAAMQ,WAAA,GAAchC,WAAA,CAAY;IAC9B,IAAI,CAACW,OAAA,EAAS;MACZ;IACF;IAEAD,MAAA,CAAOuB,KAAK,CAAC;MACXvB,MAAA,CAAOwB,MAAM,CAAC;QACZpC,aAAA,CAAc;MAChB;MACA;MACAc,IAAA,CAAKuB,QAAQ,GAAG;QACdzB,MAAA;QACA0B,QAAA,EAAU5B;MACZ;IACF;EACF,GAAG,CAACE,MAAA,EAAQE,IAAA,EAAMJ,MAAA,EAAQG,OAAA,CAAQ;EAElC,MAAM0B,eAAA,GAAkBrC,WAAA,CAAasC,CAAA;IACnC;IACA;IACA;IACAA,CAAA,CAAEC,cAAc;IAEdD,CAAA,CAAEE,aAAa,CAAiBC,YAAY,CAAC,iBAAiB;EAClE,GAAG,EAAE;EAEL,oBACEC,KAAA,CAAC;IACC,cAAYpB,YAAA;
|
|
1
|
+
{"version":3,"file":"index.js","names":["Tooltip","useTranslation","$addUpdateTag","React","useCallback","useEffect","useMemo","useRef","useState","useEditorConfigContext","baseClass","ToolbarButton","active","children","editor","enabled","item","i18n","fieldProps","featureClientSchemaMap","schemaPath","showTooltip","setShowTooltip","buttonRef","current","removeAttribute","tooltipLabel","label","key","replace","c","toUpperCase","className","filter","Boolean","join","handleClick","focus","update","onSelect","isActive","handleMouseDown","e","preventDefault","currentTarget","setAttribute","_jsxs","undefined","disabled","onClick","onMouseDown","onPointerEnter","onPointerLeave","ref","type","_jsx","show"],"sources":["../../../../../src/features/toolbars/shared/ToolbarButton/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { Tooltip, useTranslation } from '@payloadcms/ui'\nimport { $addUpdateTag } from 'lexical'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\n\nimport type { ToolbarGroupItem } from '../../types.js'\n\nimport { useEditorConfigContext } from '../../../../lexical/config/client/EditorConfigProvider.js'\nimport './index.css'\n\nconst baseClass = 'toolbar-popup__button'\n\nexport const ToolbarButton = ({\n active = false,\n children,\n editor,\n enabled = true,\n item,\n}: {\n active?: boolean\n children: React.JSX.Element\n editor: LexicalEditor\n enabled?: boolean\n item: ToolbarGroupItem\n}) => {\n const { i18n } = useTranslation<{}, string>()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n\n const [showTooltip, setShowTooltip] = useState(false)\n const buttonRef = useRef<HTMLButtonElement>(null)\n\n // Clear pressing state when active prop changes (React has re-rendered)\n useEffect(() => {\n buttonRef.current?.removeAttribute('data-pressing')\n }, [active])\n\n const tooltipLabel = useMemo(() => {\n if (item.label) {\n return typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Convert camelCase key to Title Case (e.g. \"inlineCode\" -> \"Inline Code\")\n return item.key.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/^./, (c) => c.toUpperCase())\n }, [featureClientSchemaMap, i18n, schemaPath, item])\n\n const className = useMemo(() => {\n return [\n baseClass,\n !enabled ? 'disabled' : '',\n active ? 'active' : '',\n item.key ? `${baseClass}-${item.key}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n }, [active, enabled, item.key])\n\n const handleClick = useCallback(() => {\n if (!enabled) {\n return\n }\n\n editor.focus(() => {\n editor.update(() => {\n $addUpdateTag('toolbar')\n })\n // We need to wrap the onSelect in the callback, so the editor is properly focused before the onSelect is called.\n item.onSelect?.({\n editor,\n isActive: active,\n })\n })\n }, [editor, item, active, enabled])\n\n const handleMouseDown = useCallback((e: React.MouseEvent) => {\n // This fixes a bug where you are unable to click the button if you are in a NESTED editor (editor in blocks field in editor).\n // Thus only happens if you click on the SVG of the button. Clicking on the outside works. Related issue: https://github.com/payloadcms/payload/issues/4025\n // TODO: Find out why exactly it happens and why e.preventDefault() on the mouseDown fixes it. Write that down here, or potentially fix a root cause, if there is any.\n e.preventDefault()\n // Suppress hover flash between mouseup and React adding .active class\n ;(e.currentTarget as HTMLElement).setAttribute('data-pressing', '')\n }, [])\n\n return (\n <button\n aria-label={tooltipLabel}\n aria-pressed={item.isActive ? active : undefined}\n className={className}\n data-button-key={item.key}\n disabled={!enabled}\n onClick={handleClick}\n onMouseDown={handleMouseDown}\n onPointerEnter={() => setShowTooltip(true)}\n onPointerLeave={() => {\n setShowTooltip(false)\n buttonRef.current?.removeAttribute('data-pressing')\n }}\n ref={buttonRef}\n type=\"button\"\n >\n <Tooltip className={`${baseClass}__tooltip`} show={showTooltip}>\n {tooltipLabel}\n </Tooltip>\n {children}\n </button>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropDown.d.ts","sourceRoot":"","sources":["../../../../../src/features/toolbars/shared/ToolbarDropdown/DropDown.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AACtE,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"DropDown.d.ts","sourceRoot":"","sources":["../../../../../src/features/toolbars/shared/ToolbarDropdown/DropDown.tsx"],"names":[],"mappings":"AAEA,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AACtE,OAAO,KAAK,EAAE,EACZ,KAAK,SAAS,EAOf,MAAM,OAAO,CAAA;AAEd,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAUtD,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,OAAO,GACR,EAAE;IACD,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,MAAM,EAAE,aAAa,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,EAAE,KAAK,CAAC,SAAS,CAAA;IACrB,IAAI,EAAE,gBAAgB,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,GAAG,KAAK,CAAC,SAAS,CAoElB;AAqGD,wBAAgB,QAAQ,CAAC,EACvB,eAAe,EACf,eAAe,EACf,QAAQ,EACR,QAAgB,EAChB,WAAW,EACX,IAAI,EACJ,wBAAwB,EACxB,KAAK,EACL,oBAAoB,GACrB,EAAE;IACD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE,SAAS,CAAA;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,KAAK,CAAC,EAAE,CAAA;IACf,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAA;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B,GAAG,KAAK,CAAC,SAAS,CAkIlB"}
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
4
4
|
import { Button } from '@payloadcms/ui';
|
|
5
5
|
import { $addUpdateTag, isDOMNode } from 'lexical';
|
|
6
|
-
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
7
|
-
import { createPortal } from 'react-dom';
|
|
6
|
+
import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';
|
|
8
7
|
const baseClass = 'toolbar-popup__dropdown-item';
|
|
9
8
|
const DropDownContext = /*#__PURE__*/React.createContext(null);
|
|
10
9
|
export function DropDownItem({
|
|
@@ -39,7 +38,10 @@ export function DropDownItem({
|
|
|
39
38
|
className: className,
|
|
40
39
|
disabled: enabled === false,
|
|
41
40
|
extraButtonProps: {
|
|
42
|
-
'
|
|
41
|
+
'aria-checked': item.isActive ? Boolean(active) : undefined,
|
|
42
|
+
'data-item-key': itemKey,
|
|
43
|
+
role: item.isActive ? 'menuitemcheckbox' : 'menuitem',
|
|
44
|
+
tabIndex: -1
|
|
43
45
|
},
|
|
44
46
|
icon: Icon,
|
|
45
47
|
iconPosition: "left",
|
|
@@ -69,11 +71,13 @@ export function DropDownItem({
|
|
|
69
71
|
});
|
|
70
72
|
}
|
|
71
73
|
function DropDownItems({
|
|
74
|
+
id,
|
|
72
75
|
children,
|
|
73
76
|
dropdownKey,
|
|
74
77
|
dropDownRef,
|
|
75
78
|
itemsContainerClassNames,
|
|
76
|
-
onClose
|
|
79
|
+
onClose,
|
|
80
|
+
shouldAutoFocus
|
|
77
81
|
}) {
|
|
78
82
|
const [items, setItems] = useState();
|
|
79
83
|
const [highlightedItem, setHighlightedItem] = useState();
|
|
@@ -87,25 +91,31 @@ function DropDownItems({
|
|
|
87
91
|
const {
|
|
88
92
|
key
|
|
89
93
|
} = event;
|
|
90
|
-
|
|
94
|
+
const enabledItems = items.filter(item => !item.current?.disabled);
|
|
95
|
+
if (['ArrowDown', 'ArrowUp', 'Escape'].includes(key)) {
|
|
91
96
|
event.preventDefault();
|
|
92
97
|
}
|
|
93
|
-
if (key === 'Escape'
|
|
98
|
+
if (key === 'Escape') {
|
|
94
99
|
onClose();
|
|
100
|
+
} else if (key === 'Tab') {
|
|
101
|
+
setTimeout(() => onClose({
|
|
102
|
+
restoreFocus: false
|
|
103
|
+
}));
|
|
95
104
|
} else if (key === 'ArrowUp') {
|
|
96
105
|
setHighlightedItem(prev_0 => {
|
|
97
106
|
if (prev_0 == null) {
|
|
98
|
-
return
|
|
107
|
+
return enabledItems[0];
|
|
99
108
|
}
|
|
100
|
-
const index =
|
|
101
|
-
return
|
|
109
|
+
const index = enabledItems.indexOf(prev_0) - 1;
|
|
110
|
+
return enabledItems[index === -1 ? enabledItems.length - 1 : index];
|
|
102
111
|
});
|
|
103
112
|
} else if (key === 'ArrowDown') {
|
|
104
113
|
setHighlightedItem(prev_1 => {
|
|
105
114
|
if (prev_1 == null) {
|
|
106
|
-
return
|
|
115
|
+
return enabledItems[0];
|
|
107
116
|
}
|
|
108
|
-
|
|
117
|
+
const index_0 = enabledItems.indexOf(prev_1);
|
|
118
|
+
return enabledItems[index_0 === enabledItems.length - 1 ? 0 : index_0 + 1];
|
|
109
119
|
});
|
|
110
120
|
}
|
|
111
121
|
};
|
|
@@ -113,21 +123,25 @@ function DropDownItems({
|
|
|
113
123
|
registerItem
|
|
114
124
|
}), [registerItem]);
|
|
115
125
|
useEffect(() => {
|
|
116
|
-
if (items != null && highlightedItem == null) {
|
|
117
|
-
setHighlightedItem(items
|
|
126
|
+
if (shouldAutoFocus && items != null && highlightedItem == null) {
|
|
127
|
+
setHighlightedItem(items.find(item_0 => !item_0.current?.disabled));
|
|
118
128
|
}
|
|
119
129
|
if (highlightedItem != null && highlightedItem?.current != null) {
|
|
120
130
|
highlightedItem.current.focus();
|
|
121
131
|
}
|
|
122
|
-
}, [items, highlightedItem]);
|
|
132
|
+
}, [items, highlightedItem, shouldAutoFocus]);
|
|
123
133
|
return /*#__PURE__*/_jsx(DropDownContext, {
|
|
124
134
|
value: contextValue,
|
|
125
135
|
children: /*#__PURE__*/_jsx("div", {
|
|
126
136
|
className: (itemsContainerClassNames ?? ['toolbar-popup__dropdown-items']).join(' '),
|
|
127
137
|
"data-dropdown-key": dropdownKey,
|
|
128
138
|
"data-theme": "dark",
|
|
139
|
+
id: id,
|
|
129
140
|
onKeyDown: handleKeyDown,
|
|
141
|
+
popover: "manual",
|
|
130
142
|
ref: dropDownRef,
|
|
143
|
+
role: "menu",
|
|
144
|
+
tabIndex: -1,
|
|
131
145
|
children: children
|
|
132
146
|
})
|
|
133
147
|
});
|
|
@@ -145,10 +159,15 @@ export function DropDown({
|
|
|
145
159
|
}) {
|
|
146
160
|
const dropDownRef = useRef(null);
|
|
147
161
|
const buttonRef = useRef(null);
|
|
162
|
+
const openedViaKeyboardRef = useRef(false);
|
|
163
|
+
const generatedId = useId();
|
|
164
|
+
const menuId = `toolbar-dropdown-${dropdownKey}-${generatedId}`;
|
|
148
165
|
const [showDropDown, setShowDropDown] = useState(false);
|
|
149
|
-
const handleClose = (
|
|
166
|
+
const handleClose = ({
|
|
167
|
+
restoreFocus = true
|
|
168
|
+
} = {}) => {
|
|
150
169
|
setShowDropDown(false);
|
|
151
|
-
if (buttonRef?.current != null) {
|
|
170
|
+
if (restoreFocus && buttonRef?.current != null) {
|
|
152
171
|
buttonRef.current.focus();
|
|
153
172
|
}
|
|
154
173
|
};
|
|
@@ -156,13 +175,37 @@ export function DropDown({
|
|
|
156
175
|
const button = buttonRef.current;
|
|
157
176
|
const dropDown = dropDownRef.current;
|
|
158
177
|
if (showDropDown && button !== null && dropDown !== null) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
178
|
+
if (!dropDown.matches(':popover-open')) {
|
|
179
|
+
dropDown.showPopover();
|
|
180
|
+
}
|
|
181
|
+
const updatePosition = () => {
|
|
182
|
+
const {
|
|
183
|
+
bottom,
|
|
184
|
+
left,
|
|
185
|
+
top
|
|
186
|
+
} = button.getBoundingClientRect();
|
|
187
|
+
const offset = 8;
|
|
188
|
+
const gap = 5;
|
|
189
|
+
const below = bottom + gap;
|
|
190
|
+
const above = top - dropDown.offsetHeight - gap;
|
|
191
|
+
const maxTop = Math.max(offset, window.innerHeight - dropDown.offsetHeight - offset);
|
|
192
|
+
const preferredTop = below + dropDown.offsetHeight + offset <= window.innerHeight ? below : above >= offset ? above : below;
|
|
193
|
+
dropDown.style.position = 'fixed';
|
|
194
|
+
dropDown.style.top = `${Math.max(offset, Math.min(preferredTop, maxTop))}px`;
|
|
195
|
+
dropDown.style.left = `${Math.max(8, Math.min(left - 5, window.innerWidth - dropDown.offsetWidth - 20))}px`;
|
|
196
|
+
};
|
|
197
|
+
updatePosition();
|
|
198
|
+
window.addEventListener('resize', updatePosition);
|
|
199
|
+
window.addEventListener('scroll', updatePosition, {
|
|
200
|
+
capture: true,
|
|
201
|
+
passive: true
|
|
202
|
+
});
|
|
203
|
+
return () => {
|
|
204
|
+
window.removeEventListener('resize', updatePosition);
|
|
205
|
+
window.removeEventListener('scroll', updatePosition, {
|
|
206
|
+
capture: true
|
|
207
|
+
});
|
|
208
|
+
};
|
|
166
209
|
}
|
|
167
210
|
}, [dropDownRef, buttonRef, showDropDown]);
|
|
168
211
|
useEffect(() => {
|
|
@@ -188,23 +231,27 @@ export function DropDown({
|
|
|
188
231
|
};
|
|
189
232
|
}
|
|
190
233
|
}, [dropDownRef, buttonRef, showDropDown, stopCloseOnClickSelf]);
|
|
191
|
-
const portal = /*#__PURE__*/createPortal(/*#__PURE__*/_jsx(DropDownItems, {
|
|
192
|
-
dropdownKey: dropdownKey,
|
|
193
|
-
dropDownRef: dropDownRef,
|
|
194
|
-
itemsContainerClassNames: itemsContainerClassNames,
|
|
195
|
-
onClose: handleClose,
|
|
196
|
-
children: children
|
|
197
|
-
}), document.body);
|
|
198
234
|
return /*#__PURE__*/_jsxs(React.Fragment, {
|
|
199
235
|
children: [/*#__PURE__*/_jsxs("button", {
|
|
236
|
+
"aria-controls": menuId,
|
|
237
|
+
"aria-expanded": showDropDown,
|
|
238
|
+
"aria-haspopup": "menu",
|
|
200
239
|
"aria-label": buttonAriaLabel,
|
|
201
240
|
className: buttonClassName + (showDropDown ? ' active' : ''),
|
|
202
241
|
"data-dropdown-key": dropdownKey,
|
|
203
242
|
disabled: disabled,
|
|
204
243
|
onClick: event_0 => {
|
|
205
244
|
event_0.preventDefault();
|
|
245
|
+
openedViaKeyboardRef.current = false;
|
|
206
246
|
setShowDropDown(!showDropDown);
|
|
207
247
|
},
|
|
248
|
+
onKeyDown: event_1 => {
|
|
249
|
+
if (event_1.key === 'Enter' || event_1.key === ' ') {
|
|
250
|
+
event_1.preventDefault();
|
|
251
|
+
openedViaKeyboardRef.current = true;
|
|
252
|
+
setShowDropDown(!showDropDown);
|
|
253
|
+
}
|
|
254
|
+
},
|
|
208
255
|
onMouseDown: e => {
|
|
209
256
|
// This fixes a bug where you are unable to click the button if you are in a NESTED editor (editor in blocks field in editor).
|
|
210
257
|
// Thus only happens if you click on the SVG of the button. Clicking on the outside works. Related issue: https://github.com/payloadcms/payload/issues/4025
|
|
@@ -219,8 +266,14 @@ export function DropDown({
|
|
|
219
266
|
}), /*#__PURE__*/_jsx("i", {
|
|
220
267
|
className: "toolbar-popup__dropdown-caret"
|
|
221
268
|
})]
|
|
222
|
-
}), showDropDown && /*#__PURE__*/_jsx(
|
|
223
|
-
|
|
269
|
+
}), showDropDown && /*#__PURE__*/_jsx(DropDownItems, {
|
|
270
|
+
dropdownKey: dropdownKey,
|
|
271
|
+
dropDownRef: dropDownRef,
|
|
272
|
+
id: menuId,
|
|
273
|
+
itemsContainerClassNames: itemsContainerClassNames,
|
|
274
|
+
onClose: handleClose,
|
|
275
|
+
shouldAutoFocus: openedViaKeyboardRef.current,
|
|
276
|
+
children: children
|
|
224
277
|
})]
|
|
225
278
|
});
|
|
226
279
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropDown.js","names":["Button","$addUpdateTag","isDOMNode","React","useCallback","useEffect","useMemo","useRef","useState","createPortal","baseClass","DropDownContext","createContext","DropDownItem","active","children","editor","enabled","Icon","item","itemKey","tooltip","className","key","filter","Boolean","join","ref","dropDownContext","use","Error","registerItem","current","_jsx","buttonStyle","disabled","extraButtonProps","icon","iconPosition","onClick","focus","update","onSelect","isActive","onMouseDown","e","preventDefault","type","DropDownItems","dropdownKey","dropDownRef","itemsContainerClassNames","onClose","items","setItems","highlightedItem","setHighlightedItem","itemRef","prev","handleKeyDown","event","includes","index","indexOf","length","contextValue","value","onKeyDown","DropDown","buttonAriaLabel","buttonClassName","label","stopCloseOnClickSelf","buttonRef","showDropDown","setShowDropDown","handleClose","button","dropDown","left","top","getBoundingClientRect","scrollTopOffset","window","scrollY","document","documentElement","scrollTop","style","offsetHeight","Math","min","innerWidth","offsetWidth","handle","target","contains","addEventListener","removeEventListener","portal","body","_jsxs","Fragment"],"sources":["../../../../../src/features/toolbars/shared/ToolbarDropdown/DropDown.tsx"],"sourcesContent":["'use client'\nimport { Button } from '@payloadcms/ui'\nimport { $addUpdateTag, isDOMNode, type LexicalEditor } from 'lexical'\nimport React, { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { ToolbarGroupItem } from '../../types.js'\n\nconst baseClass = 'toolbar-popup__dropdown-item'\n\ninterface DropDownContextType {\n registerItem: (ref: React.RefObject<HTMLButtonElement | null>) => void\n}\n\nconst DropDownContext = React.createContext<DropDownContextType | null>(null)\n\nexport function DropDownItem({\n active,\n children,\n editor,\n enabled,\n Icon,\n item,\n itemKey,\n tooltip,\n}: {\n active?: boolean\n children: React.ReactNode\n editor: LexicalEditor\n enabled?: boolean\n Icon: React.ReactNode\n item: ToolbarGroupItem\n itemKey: string\n tooltip?: string\n}): React.ReactNode {\n const className = useMemo(() => {\n return [\n baseClass,\n enabled === false ? 'disabled' : '',\n active ? 'active' : '',\n item?.key ? `${baseClass}-${item.key}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n }, [enabled, active, item.key])\n\n const ref = useRef<HTMLButtonElement>(null)\n\n const dropDownContext = React.use(DropDownContext)\n\n if (dropDownContext === null) {\n throw new Error('DropDownItem must be used within a DropDown')\n }\n\n const { registerItem } = dropDownContext\n\n useEffect(() => {\n if (ref?.current != null) {\n registerItem(ref)\n }\n }, [ref, registerItem])\n\n return (\n <Button\n aria-label={tooltip}\n buttonStyle=\"ghost\"\n className={className}\n disabled={enabled === false}\n extraButtonProps={{\n 'data-item-key': itemKey,\n }}\n icon={Icon}\n iconPosition=\"left\"\n onClick={() => {\n if (enabled !== false) {\n editor.focus(() => {\n editor.update(() => {\n $addUpdateTag('toolbar')\n })\n // We need to wrap the onSelect in the callback, so the editor is properly focused before the onSelect is called.\n item.onSelect?.({\n editor,\n isActive: active!,\n })\n })\n }\n }}\n onMouseDown={(e) => {\n // This is required for Firefox compatibility. Without it, the dropdown will disappear without the onClick being called.\n // This only happens in Firefox. Must be something about how Firefox handles focus events differently.\n e.preventDefault()\n }}\n ref={ref}\n tooltip={tooltip}\n type=\"button\"\n >\n {children}\n </Button>\n )\n}\n\nfunction DropDownItems({\n children,\n dropdownKey,\n dropDownRef,\n itemsContainerClassNames,\n onClose,\n}: {\n children: React.ReactNode\n dropdownKey?: string\n dropDownRef: React.Ref<HTMLDivElement>\n itemsContainerClassNames?: string[]\n onClose: () => void\n}): React.ReactElement {\n const [items, setItems] = useState<Array<React.RefObject<HTMLButtonElement | null>>>()\n const [highlightedItem, setHighlightedItem] =\n useState<React.RefObject<HTMLButtonElement | null>>()\n\n const registerItem = useCallback(\n (itemRef: React.RefObject<HTMLButtonElement | null>) => {\n setItems((prev) => (prev != null ? [...prev, itemRef] : [itemRef]))\n },\n [setItems],\n )\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n if (items == null) {\n return\n }\n\n const { key } = event\n\n if (['ArrowDown', 'ArrowUp', 'Escape', 'Tab'].includes(key)) {\n event.preventDefault()\n }\n\n if (key === 'Escape' || key === 'Tab') {\n onClose()\n } else if (key === 'ArrowUp') {\n setHighlightedItem((prev) => {\n if (prev == null) {\n return items[0]\n }\n const index = items.indexOf(prev) - 1\n return items[index === -1 ? items.length - 1 : index]\n })\n } else if (key === 'ArrowDown') {\n setHighlightedItem((prev) => {\n if (prev == null) {\n return items[0]\n }\n return items[items.indexOf(prev) + 1]\n })\n }\n }\n\n const contextValue = useMemo(\n () => ({\n registerItem,\n }),\n [registerItem],\n )\n\n useEffect(() => {\n if (items != null && highlightedItem == null) {\n setHighlightedItem(items[0])\n }\n\n if (highlightedItem != null && highlightedItem?.current != null) {\n highlightedItem.current.focus()\n }\n }, [items, highlightedItem])\n\n return (\n <DropDownContext value={contextValue}>\n <div\n className={(itemsContainerClassNames ?? ['toolbar-popup__dropdown-items']).join(' ')}\n data-dropdown-key={dropdownKey}\n data-theme=\"dark\"\n onKeyDown={handleKeyDown}\n ref={dropDownRef}\n >\n {children}\n </div>\n </DropDownContext>\n )\n}\n\nexport function DropDown({\n buttonAriaLabel,\n buttonClassName,\n children,\n disabled = false,\n dropdownKey,\n Icon,\n itemsContainerClassNames,\n label,\n stopCloseOnClickSelf,\n}: {\n buttonAriaLabel?: string\n buttonClassName: string\n children: ReactNode\n disabled?: boolean\n dropdownKey: string\n Icon?: React.FC\n itemsContainerClassNames?: string[]\n label?: string\n stopCloseOnClickSelf?: boolean\n}): React.ReactNode {\n const dropDownRef = useRef<HTMLDivElement>(null)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const [showDropDown, setShowDropDown] = useState(false)\n\n const handleClose = (): void => {\n setShowDropDown(false)\n if (buttonRef?.current != null) {\n buttonRef.current.focus()\n }\n }\n\n useEffect(() => {\n const button = buttonRef.current\n const dropDown = dropDownRef.current\n\n if (showDropDown && button !== null && dropDown !== null) {\n const { left, top } = button.getBoundingClientRect()\n const scrollTopOffset = window.scrollY || document.documentElement.scrollTop\n dropDown.style.top = `${top + scrollTopOffset + button.offsetHeight + 5}px`\n dropDown.style.left = `${Math.min(left - 5, window.innerWidth - dropDown.offsetWidth - 20)}px`\n }\n }, [dropDownRef, buttonRef, showDropDown])\n\n useEffect(() => {\n const button = buttonRef.current\n\n if (button !== null && showDropDown) {\n const handle = (event: MouseEvent): void => {\n const target = event.target\n if (!isDOMNode(target)) {\n return\n }\n if (stopCloseOnClickSelf) {\n if (dropDownRef.current && dropDownRef.current.contains(target)) {\n return\n }\n }\n if (!button.contains(target)) {\n setShowDropDown(false)\n }\n }\n document.addEventListener('click', handle)\n\n return () => {\n document.removeEventListener('click', handle)\n }\n }\n }, [dropDownRef, buttonRef, showDropDown, stopCloseOnClickSelf])\n\n const portal = createPortal(\n <DropDownItems\n dropdownKey={dropdownKey}\n dropDownRef={dropDownRef}\n itemsContainerClassNames={itemsContainerClassNames}\n onClose={handleClose}\n >\n {children}\n </DropDownItems>,\n document.body,\n )\n\n return (\n <React.Fragment>\n <button\n aria-label={buttonAriaLabel}\n className={buttonClassName + (showDropDown ? ' active' : '')}\n data-dropdown-key={dropdownKey}\n disabled={disabled}\n onClick={(event) => {\n event.preventDefault()\n setShowDropDown(!showDropDown)\n }}\n onMouseDown={(e) => {\n // This fixes a bug where you are unable to click the button if you are in a NESTED editor (editor in blocks field in editor).\n // Thus only happens if you click on the SVG of the button. Clicking on the outside works. Related issue: https://github.com/payloadcms/payload/issues/4025\n // TODO: Find out why exactly it happens and why e.preventDefault() on the mouseDown fixes it. Write that down here, or potentially fix a root cause, if there is any.\n e.preventDefault()\n }}\n ref={buttonRef}\n type=\"button\"\n >\n {Icon && <Icon />}\n {label && <span className=\"toolbar-popup__dropdown-label\">{label}</span>}\n <i className=\"toolbar-popup__dropdown-caret\" />\n </button>\n\n {showDropDown && <React.Fragment>{portal}</React.Fragment>}\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"DropDown.js","names":["Button","$addUpdateTag","isDOMNode","React","useCallback","useEffect","useId","useMemo","useRef","useState","baseClass","DropDownContext","createContext","DropDownItem","active","children","editor","enabled","Icon","item","itemKey","tooltip","className","key","filter","Boolean","join","ref","dropDownContext","use","Error","registerItem","current","_jsx","buttonStyle","disabled","extraButtonProps","isActive","undefined","role","tabIndex","icon","iconPosition","onClick","focus","update","onSelect","onMouseDown","e","preventDefault","type","DropDownItems","id","dropdownKey","dropDownRef","itemsContainerClassNames","onClose","shouldAutoFocus","items","setItems","highlightedItem","setHighlightedItem","itemRef","prev","handleKeyDown","event","enabledItems","includes","setTimeout","restoreFocus","index","indexOf","length","contextValue","find","value","onKeyDown","popover","DropDown","buttonAriaLabel","buttonClassName","label","stopCloseOnClickSelf","buttonRef","openedViaKeyboardRef","generatedId","menuId","showDropDown","setShowDropDown","handleClose","button","dropDown","matches","showPopover","updatePosition","bottom","left","top","getBoundingClientRect","offset","gap","below","above","offsetHeight","maxTop","Math","max","window","innerHeight","preferredTop","style","position","min","innerWidth","offsetWidth","addEventListener","capture","passive","removeEventListener","handle","target","contains","document","_jsxs","Fragment"],"sources":["../../../../../src/features/toolbars/shared/ToolbarDropdown/DropDown.tsx"],"sourcesContent":["'use client'\nimport { Button } from '@payloadcms/ui'\nimport { $addUpdateTag, isDOMNode, type LexicalEditor } from 'lexical'\nimport React, {\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react'\n\nimport type { ToolbarGroupItem } from '../../types.js'\n\nconst baseClass = 'toolbar-popup__dropdown-item'\n\ninterface DropDownContextType {\n registerItem: (ref: React.RefObject<HTMLButtonElement | null>) => void\n}\n\nconst DropDownContext = React.createContext<DropDownContextType | null>(null)\n\nexport function DropDownItem({\n active,\n children,\n editor,\n enabled,\n Icon,\n item,\n itemKey,\n tooltip,\n}: {\n active?: boolean\n children: React.ReactNode\n editor: LexicalEditor\n enabled?: boolean\n Icon: React.ReactNode\n item: ToolbarGroupItem\n itemKey: string\n tooltip?: string\n}): React.ReactNode {\n const className = useMemo(() => {\n return [\n baseClass,\n enabled === false ? 'disabled' : '',\n active ? 'active' : '',\n item?.key ? `${baseClass}-${item.key}` : '',\n ]\n .filter(Boolean)\n .join(' ')\n }, [enabled, active, item.key])\n\n const ref = useRef<HTMLButtonElement>(null)\n\n const dropDownContext = React.use(DropDownContext)\n\n if (dropDownContext === null) {\n throw new Error('DropDownItem must be used within a DropDown')\n }\n\n const { registerItem } = dropDownContext\n\n useEffect(() => {\n if (ref?.current != null) {\n registerItem(ref)\n }\n }, [ref, registerItem])\n\n return (\n <Button\n aria-label={tooltip}\n buttonStyle=\"ghost\"\n className={className}\n disabled={enabled === false}\n extraButtonProps={{\n 'aria-checked': item.isActive ? Boolean(active) : undefined,\n 'data-item-key': itemKey,\n role: item.isActive ? 'menuitemcheckbox' : 'menuitem',\n tabIndex: -1,\n }}\n icon={Icon}\n iconPosition=\"left\"\n onClick={() => {\n if (enabled !== false) {\n editor.focus(() => {\n editor.update(() => {\n $addUpdateTag('toolbar')\n })\n // We need to wrap the onSelect in the callback, so the editor is properly focused before the onSelect is called.\n item.onSelect?.({\n editor,\n isActive: active!,\n })\n })\n }\n }}\n onMouseDown={(e: React.MouseEvent) => {\n // This is required for Firefox compatibility. Without it, the dropdown will disappear without the onClick being called.\n // This only happens in Firefox. Must be something about how Firefox handles focus events differently.\n e.preventDefault()\n }}\n ref={ref}\n tooltip={tooltip}\n type=\"button\"\n >\n {children}\n </Button>\n )\n}\n\nfunction DropDownItems({\n id,\n children,\n dropdownKey,\n dropDownRef,\n itemsContainerClassNames,\n onClose,\n shouldAutoFocus,\n}: {\n children: React.ReactNode\n dropdownKey?: string\n dropDownRef: React.Ref<HTMLDivElement>\n id: string\n itemsContainerClassNames?: string[]\n onClose: (options?: { restoreFocus?: boolean }) => void\n shouldAutoFocus: boolean\n}): React.ReactElement {\n const [items, setItems] = useState<Array<React.RefObject<HTMLButtonElement | null>>>()\n const [highlightedItem, setHighlightedItem] =\n useState<React.RefObject<HTMLButtonElement | null>>()\n\n const registerItem = useCallback(\n (itemRef: React.RefObject<HTMLButtonElement | null>) => {\n setItems((prev) => (prev != null ? [...prev, itemRef] : [itemRef]))\n },\n [setItems],\n )\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>): void => {\n if (items == null) {\n return\n }\n\n const { key } = event\n const enabledItems = items.filter((item) => !item.current?.disabled)\n\n if (['ArrowDown', 'ArrowUp', 'Escape'].includes(key)) {\n event.preventDefault()\n }\n\n if (key === 'Escape') {\n onClose()\n } else if (key === 'Tab') {\n setTimeout(() => onClose({ restoreFocus: false }))\n } else if (key === 'ArrowUp') {\n setHighlightedItem((prev) => {\n if (prev == null) {\n return enabledItems[0]\n }\n const index = enabledItems.indexOf(prev) - 1\n return enabledItems[index === -1 ? enabledItems.length - 1 : index]\n })\n } else if (key === 'ArrowDown') {\n setHighlightedItem((prev) => {\n if (prev == null) {\n return enabledItems[0]\n }\n const index = enabledItems.indexOf(prev)\n return enabledItems[index === enabledItems.length - 1 ? 0 : index + 1]\n })\n }\n }\n\n const contextValue = useMemo(\n () => ({\n registerItem,\n }),\n [registerItem],\n )\n\n useEffect(() => {\n if (shouldAutoFocus && items != null && highlightedItem == null) {\n setHighlightedItem(items.find((item) => !item.current?.disabled))\n }\n\n if (highlightedItem != null && highlightedItem?.current != null) {\n highlightedItem.current.focus()\n }\n }, [items, highlightedItem, shouldAutoFocus])\n\n return (\n <DropDownContext value={contextValue}>\n <div\n className={(itemsContainerClassNames ?? ['toolbar-popup__dropdown-items']).join(' ')}\n data-dropdown-key={dropdownKey}\n data-theme=\"dark\"\n id={id}\n onKeyDown={handleKeyDown}\n popover=\"manual\"\n ref={dropDownRef}\n role=\"menu\"\n tabIndex={-1}\n >\n {children}\n </div>\n </DropDownContext>\n )\n}\n\nexport function DropDown({\n buttonAriaLabel,\n buttonClassName,\n children,\n disabled = false,\n dropdownKey,\n Icon,\n itemsContainerClassNames,\n label,\n stopCloseOnClickSelf,\n}: {\n buttonAriaLabel?: string\n buttonClassName: string\n children: ReactNode\n disabled?: boolean\n dropdownKey: string\n Icon?: React.FC\n itemsContainerClassNames?: string[]\n label?: string\n stopCloseOnClickSelf?: boolean\n}): React.ReactNode {\n const dropDownRef = useRef<HTMLDivElement>(null)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const openedViaKeyboardRef = useRef(false)\n const generatedId = useId()\n const menuId = `toolbar-dropdown-${dropdownKey}-${generatedId}`\n const [showDropDown, setShowDropDown] = useState(false)\n\n const handleClose = ({ restoreFocus = true }: { restoreFocus?: boolean } = {}): void => {\n setShowDropDown(false)\n if (restoreFocus && buttonRef?.current != null) {\n buttonRef.current.focus()\n }\n }\n\n useEffect(() => {\n const button = buttonRef.current\n const dropDown = dropDownRef.current\n\n if (showDropDown && button !== null && dropDown !== null) {\n if (!dropDown.matches(':popover-open')) {\n dropDown.showPopover()\n }\n\n const updatePosition = (): void => {\n const { bottom, left, top } = button.getBoundingClientRect()\n const offset = 8\n const gap = 5\n const below = bottom + gap\n const above = top - dropDown.offsetHeight - gap\n const maxTop = Math.max(offset, window.innerHeight - dropDown.offsetHeight - offset)\n const preferredTop =\n below + dropDown.offsetHeight + offset <= window.innerHeight\n ? below\n : above >= offset\n ? above\n : below\n\n dropDown.style.position = 'fixed'\n dropDown.style.top = `${Math.max(offset, Math.min(preferredTop, maxTop))}px`\n dropDown.style.left = `${Math.max(8, Math.min(left - 5, window.innerWidth - dropDown.offsetWidth - 20))}px`\n }\n\n updatePosition()\n window.addEventListener('resize', updatePosition)\n window.addEventListener('scroll', updatePosition, { capture: true, passive: true })\n\n return () => {\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('scroll', updatePosition, { capture: true })\n }\n }\n }, [dropDownRef, buttonRef, showDropDown])\n\n useEffect(() => {\n const button = buttonRef.current\n\n if (button !== null && showDropDown) {\n const handle = (event: MouseEvent): void => {\n const target = event.target\n if (!isDOMNode(target)) {\n return\n }\n if (stopCloseOnClickSelf) {\n if (dropDownRef.current && dropDownRef.current.contains(target)) {\n return\n }\n }\n if (!button.contains(target)) {\n setShowDropDown(false)\n }\n }\n document.addEventListener('click', handle)\n\n return () => {\n document.removeEventListener('click', handle)\n }\n }\n }, [dropDownRef, buttonRef, showDropDown, stopCloseOnClickSelf])\n\n return (\n <React.Fragment>\n <button\n aria-controls={menuId}\n aria-expanded={showDropDown}\n aria-haspopup=\"menu\"\n aria-label={buttonAriaLabel}\n className={buttonClassName + (showDropDown ? ' active' : '')}\n data-dropdown-key={dropdownKey}\n disabled={disabled}\n onClick={(event) => {\n event.preventDefault()\n openedViaKeyboardRef.current = false\n setShowDropDown(!showDropDown)\n }}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n openedViaKeyboardRef.current = true\n setShowDropDown(!showDropDown)\n }\n }}\n onMouseDown={(e) => {\n // This fixes a bug where you are unable to click the button if you are in a NESTED editor (editor in blocks field in editor).\n // Thus only happens if you click on the SVG of the button. Clicking on the outside works. Related issue: https://github.com/payloadcms/payload/issues/4025\n // TODO: Find out why exactly it happens and why e.preventDefault() on the mouseDown fixes it. Write that down here, or potentially fix a root cause, if there is any.\n e.preventDefault()\n }}\n ref={buttonRef}\n type=\"button\"\n >\n {Icon && <Icon />}\n {label && <span className=\"toolbar-popup__dropdown-label\">{label}</span>}\n <i className=\"toolbar-popup__dropdown-caret\" />\n </button>\n\n {showDropDown && (\n <DropDownItems\n dropdownKey={dropdownKey}\n dropDownRef={dropDownRef}\n id={menuId}\n itemsContainerClassNames={itemsContainerClassNames}\n onClose={handleClose}\n shouldAutoFocus={openedViaKeyboardRef.current}\n >\n {children}\n </DropDownItems>\n )}\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -70,11 +70,15 @@
|
|
|
70
70
|
.toolbar-popup__dropdown-items {
|
|
71
71
|
--dropdown-min-width: 5rem;
|
|
72
72
|
position: absolute;
|
|
73
|
+
inset: auto;
|
|
74
|
+
margin: 0;
|
|
73
75
|
background: var(--color-bg-elevated);
|
|
74
76
|
color: var(--color-text);
|
|
75
77
|
border-radius: var(--radius-large);
|
|
76
78
|
padding: var(--spacer-2);
|
|
77
79
|
min-width: var(--dropdown-min-width);
|
|
80
|
+
max-height: calc(100vh - var(--spacer-3));
|
|
81
|
+
overflow-y: auto;
|
|
78
82
|
z-index: 100;
|
|
79
83
|
box-shadow: var(--elevation-300-tooltip);
|
|
80
84
|
|
|
@@ -185,20 +189,21 @@
|
|
|
185
189
|
}
|
|
186
190
|
|
|
187
191
|
[data-dropdown-key='text'] {
|
|
188
|
-
|
|
189
|
-
|
|
192
|
+
/* Reserved on every item, not just the active one, so the checkmark never overlaps the item icon. */
|
|
193
|
+
& .toolbar-popup__dropdown-item::before {
|
|
194
|
+
content: '';
|
|
195
|
+
flex-shrink: 0;
|
|
196
|
+
width: var(--spacer-3);
|
|
197
|
+
height: var(--spacer-3);
|
|
198
|
+
background-color: currentColor;
|
|
199
|
+
mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='M12.277 3.584a.5.5 0 0 1 .139.693l-5 7.5a.5.5 0 0 1-.77.077l-3-3a.5.5 0 0 1 .708-.708l2.568 2.57 4.662-6.993a.5.5 0 0 1 .693-.139' fill='black'/%3E%3C/svg%3E");
|
|
200
|
+
mask-size: contain;
|
|
201
|
+
mask-repeat: no-repeat;
|
|
202
|
+
visibility: hidden;
|
|
190
203
|
}
|
|
191
204
|
|
|
192
205
|
& .toolbar-popup__dropdown-item.active::before {
|
|
193
|
-
|
|
194
|
-
position: absolute;
|
|
195
|
-
inset-inline-start: var(--spacer-2-5);
|
|
196
|
-
top: 50%;
|
|
197
|
-
width: var(--spacer-1);
|
|
198
|
-
height: var(--spacer-2);
|
|
199
|
-
border: solid var(--color-text-onselected-strong);
|
|
200
|
-
border-width: 0 1px 1px 0;
|
|
201
|
-
transform: translateY(-60%) rotate(45deg);
|
|
206
|
+
visibility: visible;
|
|
202
207
|
}
|
|
203
208
|
|
|
204
209
|
.btn__icon {
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { CollectionSlug } from 'payload';
|
|
2
2
|
export type UploadFeaturePropsClient = {
|
|
3
3
|
collections: {
|
|
4
4
|
[collection: string]: {
|
|
5
5
|
hasExtraFields: boolean;
|
|
6
6
|
};
|
|
7
7
|
};
|
|
8
|
-
|
|
8
|
+
enabledCollectionSlugs: CollectionSlug[];
|
|
9
|
+
};
|
|
9
10
|
export declare const UploadFeatureClient: import("../../typesClient.js").FeatureProviderProviderClient<UploadFeaturePropsClient, UploadFeaturePropsClient>;
|
|
10
11
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/client/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/client/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAY7C,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE;QACX,CAAC,UAAU,EAAE,MAAM,GAAG;YACpB,cAAc,EAAE,OAAO,CAAA;SACxB,CAAA;KACF,CAAA;IACD,sBAAsB,EAAE,cAAc,EAAE,CAAA;CACzC,CAAA;AAED,eAAO,MAAM,mBAAmB,kHAqD9B,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["$isNodeSelection","UploadIcon","createClientFeature","slashMenuBasicGroupWithItems","toolbarAddDropdownGroupWithItems","INSERT_UPLOAD_WITH_DRAWER_COMMAND","$isUploadNode","UploadNode","UploadPlugin","UploadFeatureClient","nodes","plugins","Component","position","slashMenu","groups","Icon","key","keywords","label","i18n","t","onSelect","editor","dispatchCommand","replace","toolbarFixed","ChildComponent","isActive","selection","getNodes","length","firstNode"],"sources":["../../../../src/features/upload/client/index.tsx"],"sourcesContent":["'use client'\n\nimport {
|
|
1
|
+
{"version":3,"file":"index.js","names":["$isNodeSelection","UploadIcon","createClientFeature","slashMenuBasicGroupWithItems","toolbarAddDropdownGroupWithItems","INSERT_UPLOAD_WITH_DRAWER_COMMAND","$isUploadNode","UploadNode","UploadPlugin","UploadFeatureClient","nodes","plugins","Component","position","slashMenu","groups","Icon","key","keywords","label","i18n","t","onSelect","editor","dispatchCommand","replace","toolbarFixed","ChildComponent","isActive","selection","getNodes","length","firstNode"],"sources":["../../../../src/features/upload/client/index.tsx"],"sourcesContent":["'use client'\n\nimport type { CollectionSlug } from 'payload'\n\nimport { $isNodeSelection } from 'lexical'\n\nimport { UploadIcon } from '../../../lexical/ui/icons/Upload/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { slashMenuBasicGroupWithItems } from '../../shared/slashMenu/basicGroup.js'\nimport { toolbarAddDropdownGroupWithItems } from '../../shared/toolbar/addDropdownGroup.js'\nimport { INSERT_UPLOAD_WITH_DRAWER_COMMAND } from './drawer/commands.js'\nimport { $isUploadNode, UploadNode } from './nodes/UploadNode.js'\nimport { UploadPlugin } from './plugin/index.js'\n\nexport type UploadFeaturePropsClient = {\n collections: {\n [collection: string]: {\n hasExtraFields: boolean\n }\n }\n enabledCollectionSlugs: CollectionSlug[]\n}\n\nexport const UploadFeatureClient = createClientFeature<UploadFeaturePropsClient>({\n nodes: [UploadNode],\n plugins: [\n {\n Component: UploadPlugin,\n position: 'normal',\n },\n ],\n slashMenu: {\n groups: [\n slashMenuBasicGroupWithItems([\n {\n Icon: UploadIcon,\n key: 'upload',\n keywords: ['upload', 'image', 'file', 'img', 'picture', 'photo', 'media'],\n label: ({ i18n }) => {\n return i18n.t('lexical:upload:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_UPLOAD_WITH_DRAWER_COMMAND, {\n replace: false,\n })\n },\n },\n ]),\n ],\n },\n toolbarFixed: {\n groups: [\n toolbarAddDropdownGroupWithItems([\n {\n ChildComponent: UploadIcon,\n isActive: ({ selection }) => {\n if (!$isNodeSelection(selection) || !selection.getNodes().length) {\n return false\n }\n\n const firstNode = selection.getNodes()[0]\n return $isUploadNode(firstNode)\n },\n key: 'upload',\n label: ({ i18n }) => {\n return i18n.t('lexical:upload:label')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_UPLOAD_WITH_DRAWER_COMMAND, {\n replace: false,\n })\n },\n },\n ]),\n ],\n },\n})\n"],"mappings":"AAAA;;AAIA,SAASA,gBAAgB,QAAQ;AAEjC,SAASC,UAAU,QAAQ;AAC3B,SAASC,mBAAmB,QAAQ;AACpC,SAASC,4BAA4B,QAAQ;AAC7C,SAASC,gCAAgC,QAAQ;AACjD,SAASC,iCAAiC,QAAQ;AAClD,SAASC,aAAa,EAAEC,UAAU,QAAQ;AAC1C,SAASC,YAAY,QAAQ;AAW7B,OAAO,MAAMC,mBAAA,GAAsBP,mBAAA,CAA8C;EAC/EQ,KAAA,EAAO,CAACH,UAAA,CAAW;EACnBI,OAAA,EAAS,CACP;IACEC,SAAA,EAAWJ,YAAA;IACXK,QAAA,EAAU;EACZ,EACD;EACDC,SAAA,EAAW;IACTC,MAAA,EAAQ,CACNZ,4BAAA,CAA6B,CAC3B;MACEa,IAAA,EAAMf,UAAA;MACNgB,GAAA,EAAK;MACLC,QAAA,EAAU,CAAC,UAAU,SAAS,QAAQ,OAAO,WAAW,SAAS,QAAQ;MACzEC,KAAA,EAAOA,CAAC;QAAEC;MAAI,CAAE;QACd,OAAOA,IAAA,CAAKC,CAAC,CAAC;MAChB;MACAC,QAAA,EAAUA,CAAC;QAAEC;MAAM,CAAE;QACnBA,MAAA,CAAOC,eAAe,CAACnB,iCAAA,EAAmC;UACxDoB,OAAA,EAAS;QACX;MACF;IACF,EACD;EAEL;EACAC,YAAA,EAAc;IACZX,MAAA,EAAQ,CACNX,gCAAA,CAAiC,CAC/B;MACEuB,cAAA,EAAgB1B,UAAA;MAChB2B,QAAA,EAAUA,CAAC;QAAEC;MAAS,CAAE;QACtB,IAAI,CAAC7B,gBAAA,CAAiB6B,SAAA,KAAc,CAACA,SAAA,CAAUC,QAAQ,GAAGC,MAAM,EAAE;UAChE,OAAO;QACT;QAEA,MAAMC,SAAA,GAAYH,SAAA,CAAUC,QAAQ,EAAE,CAAC,EAAE;QACzC,OAAOxB,aAAA,CAAc0B,SAAA;MACvB;MACAf,GAAA,EAAK;MACLE,KAAA,EAAOA,CAAC;QAAEC;MAAI,CAAE;QACd,OAAOA,IAAA,CAAKC,CAAC,CAAC;MAChB;MACAC,QAAA,EAAUA,CAAC;QAAEC;MAAM,CAAE;QACnBA,MAAA,CAAOC,eAAe,CAACnB,iCAAA,EAAmC;UACxDoB,OAAA,EAAS;QACX;MACF;IACF,EACD;EAEL;AACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/upload/client/plugin/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAuB7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAuB,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAC7E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAM3D,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;AAEpG,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,SAAS;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,WAAW,CAAC,EAAE,IAAI,CAAA;KACnB;CACF;AA4BD,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,mBAAmB,CAC9B,CAAA;AAYxC,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/upload/client/plugin/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAuB7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAuB,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAC7E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAM3D,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;AAEpG,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,SAAS;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,WAAW,CAAC,EAAE,IAAI,CAAA;KACnB;CACF;AA4BD,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,mBAAmB,CAC9B,CAAA;AAYxC,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,wBAAwB,CA+TlE,CAAA"}
|
|
@@ -31,29 +31,24 @@ function getDragSelection(event) {
|
|
|
31
31
|
}
|
|
32
32
|
export const INSERT_UPLOAD_COMMAND = createCommand('INSERT_UPLOAD_COMMAND');
|
|
33
33
|
export const UploadPlugin = t0 => {
|
|
34
|
-
const $ = _c(
|
|
34
|
+
const $ = _c(20);
|
|
35
35
|
const {
|
|
36
36
|
clientProps
|
|
37
37
|
} = t0;
|
|
38
38
|
const [editor] = useLexicalComposerContext();
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
t3 = {
|
|
44
|
-
collectionSlugsBlacklist: t1,
|
|
45
|
-
collectionSlugsWhitelist: t2,
|
|
46
|
-
uploads: true
|
|
39
|
+
let t1;
|
|
40
|
+
if ($[0] !== clientProps.enabledCollectionSlugs) {
|
|
41
|
+
t1 = {
|
|
42
|
+
enabledCollectionSlugs: clientProps.enabledCollectionSlugs
|
|
47
43
|
};
|
|
48
|
-
$[0] =
|
|
49
|
-
$[1] =
|
|
50
|
-
$[2] = t3;
|
|
44
|
+
$[0] = clientProps.enabledCollectionSlugs;
|
|
45
|
+
$[1] = t1;
|
|
51
46
|
} else {
|
|
52
|
-
|
|
47
|
+
t1 = $[1];
|
|
53
48
|
}
|
|
54
49
|
const {
|
|
55
50
|
enabledCollectionSlugs
|
|
56
|
-
} = useEnabledRelationships(
|
|
51
|
+
} = useEnabledRelationships(t1);
|
|
57
52
|
const {
|
|
58
53
|
modalSlug: bulkUploadModalSlug,
|
|
59
54
|
setCollectionSlug,
|
|
@@ -66,12 +61,12 @@ export const UploadPlugin = t0 => {
|
|
|
66
61
|
isModalOpen,
|
|
67
62
|
openModal
|
|
68
63
|
} = useModal();
|
|
69
|
-
let
|
|
70
|
-
if ($[
|
|
71
|
-
|
|
64
|
+
let t2;
|
|
65
|
+
if ($[2] !== bulkUploadModalSlug || $[3] !== editor || $[4] !== enabledCollectionSlugs || $[5] !== isModalOpen || $[6] !== openModal || $[7] !== setCollectionSlug || $[8] !== setInitialForms || $[9] !== setOnCancel || $[10] !== setOnSuccess || $[11] !== setSelectableCollections) {
|
|
66
|
+
t2 = t3 => {
|
|
72
67
|
const {
|
|
73
68
|
files
|
|
74
|
-
} =
|
|
69
|
+
} = t3;
|
|
75
70
|
if (files?.length === 0) {
|
|
76
71
|
return;
|
|
77
72
|
}
|
|
@@ -112,24 +107,24 @@ export const UploadPlugin = t0 => {
|
|
|
112
107
|
openModal(bulkUploadModalSlug);
|
|
113
108
|
}
|
|
114
109
|
};
|
|
115
|
-
$[
|
|
116
|
-
$[
|
|
117
|
-
$[
|
|
118
|
-
$[
|
|
119
|
-
$[
|
|
120
|
-
$[
|
|
121
|
-
$[
|
|
122
|
-
$[
|
|
123
|
-
$[
|
|
124
|
-
$[
|
|
125
|
-
$[
|
|
110
|
+
$[2] = bulkUploadModalSlug;
|
|
111
|
+
$[3] = editor;
|
|
112
|
+
$[4] = enabledCollectionSlugs;
|
|
113
|
+
$[5] = isModalOpen;
|
|
114
|
+
$[6] = openModal;
|
|
115
|
+
$[7] = setCollectionSlug;
|
|
116
|
+
$[8] = setInitialForms;
|
|
117
|
+
$[9] = setOnCancel;
|
|
118
|
+
$[10] = setOnSuccess;
|
|
119
|
+
$[11] = setSelectableCollections;
|
|
120
|
+
$[12] = t2;
|
|
126
121
|
} else {
|
|
127
|
-
|
|
122
|
+
t2 = $[12];
|
|
128
123
|
}
|
|
129
|
-
const openBulkUpload = useEffectEvent(
|
|
130
|
-
let
|
|
131
|
-
if ($[
|
|
132
|
-
|
|
124
|
+
const openBulkUpload = useEffectEvent(t2);
|
|
125
|
+
let t3;
|
|
126
|
+
if ($[13] !== editor || $[14] !== openBulkUpload) {
|
|
127
|
+
t3 = () => {
|
|
133
128
|
if (!editor.hasNodes([UploadNode])) {
|
|
134
129
|
throw new Error("UploadPlugin: UploadNode not registered on editor");
|
|
135
130
|
}
|
|
@@ -311,32 +306,32 @@ export const UploadPlugin = t0 => {
|
|
|
311
306
|
return false;
|
|
312
307
|
}, COMMAND_PRIORITY_LOW));
|
|
313
308
|
};
|
|
314
|
-
$[
|
|
315
|
-
$[
|
|
316
|
-
$[
|
|
309
|
+
$[13] = editor;
|
|
310
|
+
$[14] = openBulkUpload;
|
|
311
|
+
$[15] = t3;
|
|
317
312
|
} else {
|
|
318
|
-
|
|
313
|
+
t3 = $[15];
|
|
319
314
|
}
|
|
320
|
-
let
|
|
321
|
-
if ($[
|
|
322
|
-
|
|
323
|
-
$[
|
|
324
|
-
$[
|
|
315
|
+
let t4;
|
|
316
|
+
if ($[16] !== editor) {
|
|
317
|
+
t4 = [editor];
|
|
318
|
+
$[16] = editor;
|
|
319
|
+
$[17] = t4;
|
|
325
320
|
} else {
|
|
326
|
-
|
|
321
|
+
t4 = $[17];
|
|
327
322
|
}
|
|
328
|
-
useEffect(
|
|
329
|
-
let
|
|
330
|
-
if ($[
|
|
331
|
-
|
|
323
|
+
useEffect(t3, t4);
|
|
324
|
+
let t5;
|
|
325
|
+
if ($[18] !== enabledCollectionSlugs) {
|
|
326
|
+
t5 = _jsx(UploadDrawer, {
|
|
332
327
|
enabledCollectionSlugs
|
|
333
328
|
});
|
|
334
|
-
$[
|
|
335
|
-
$[
|
|
329
|
+
$[18] = enabledCollectionSlugs;
|
|
330
|
+
$[19] = t5;
|
|
336
331
|
} else {
|
|
337
|
-
|
|
332
|
+
t5 = $[19];
|
|
338
333
|
}
|
|
339
|
-
return
|
|
334
|
+
return t5;
|
|
340
335
|
};
|
|
341
336
|
function _temp(file) {
|
|
342
337
|
return {
|