@payloadcms/richtext-lexical 3.0.0-beta.106 → 3.0.0-beta.108
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/cell/index.js +1 -1
- package/dist/cell/index.js.map +1 -1
- package/dist/exports/client/Field-ETCEVZLL.js +2 -0
- package/dist/exports/client/Field-ETCEVZLL.js.map +7 -0
- package/dist/exports/client/RelationshipComponent-F6JI75HS.js +2 -0
- package/dist/exports/client/{RelationshipComponent-Z5SZ5FFT.js.map → RelationshipComponent-F6JI75HS.js.map} +2 -2
- package/dist/exports/client/bundled.css +1 -1
- package/dist/exports/client/chunk-76MVRKRT.js +2 -0
- package/dist/exports/client/chunk-76MVRKRT.js.map +7 -0
- package/dist/exports/client/{chunk-TXEIKM77.js → chunk-GD6LBQBJ.js} +2 -2
- package/dist/exports/client/chunk-GD6LBQBJ.js.map +7 -0
- package/dist/exports/client/chunk-HIGLONP6.js +2 -0
- package/dist/exports/client/chunk-HIGLONP6.js.map +7 -0
- package/dist/exports/client/{chunk-GK7ZKYHL.js → chunk-IIWHHN4J.js} +2 -2
- package/dist/exports/client/chunk-IIWHHN4J.js.map +7 -0
- package/dist/exports/client/{chunk-PY6JO5OH.js → chunk-JYCJEIVA.js} +2 -2
- package/dist/exports/client/{chunk-PY6JO5OH.js.map → chunk-JYCJEIVA.js.map} +2 -2
- package/dist/exports/client/{chunk-GTKNWSQW.js → chunk-N2PXHNGO.js} +2 -2
- package/dist/exports/client/{chunk-GTKNWSQW.js.map → chunk-N2PXHNGO.js.map} +2 -2
- package/dist/exports/client/{chunk-PECDZEZY.js → chunk-YREZUOA6.js} +2 -2
- package/dist/exports/client/{chunk-PECDZEZY.js.map → chunk-YREZUOA6.js.map} +2 -2
- package/dist/exports/client/component-4IBTSHL5.js +2 -0
- package/dist/exports/client/component-4IBTSHL5.js.map +7 -0
- package/dist/exports/client/{component-GAX6BHKZ.js → component-GQ5M6NF6.js} +2 -2
- package/dist/exports/client/component-P34B4EPY.js +2 -0
- package/dist/exports/client/component-P34B4EPY.js.map +7 -0
- package/dist/exports/client/componentInline-XX7FVAIV.js +2 -0
- package/dist/exports/client/{componentInline-HAGGWKA7.js.map → componentInline-XX7FVAIV.js.map} +2 -2
- package/dist/exports/client/index.js +7 -7
- package/dist/exports/client/index.js.map +4 -4
- package/dist/features/blockquote/markdownTransformer.js.map +1 -1
- package/dist/features/blockquote/server/index.d.ts +1 -1
- package/dist/features/blockquote/server/index.d.ts.map +1 -1
- package/dist/features/blocks/client/component/BlockContent.js +5 -4
- package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
- package/dist/features/blocks/client/component/index.d.ts +1 -1
- package/dist/features/blocks/client/component/index.d.ts.map +1 -1
- package/dist/features/blocks/client/component/index.js +15 -5
- package/dist/features/blocks/client/component/index.js.map +1 -1
- package/dist/features/blocks/client/componentInline/index.d.ts +1 -1
- package/dist/features/blocks/client/componentInline/index.d.ts.map +1 -1
- package/dist/features/blocks/client/componentInline/index.js +4 -4
- package/dist/features/blocks/client/componentInline/index.js.map +1 -1
- package/dist/features/blocks/client/index.d.ts +1 -1
- package/dist/features/blocks/client/index.d.ts.map +1 -1
- package/dist/features/blocks/client/index.js +21 -11
- package/dist/features/blocks/client/index.js.map +1 -1
- package/dist/features/blocks/client/nodes/BlocksNode.d.ts +2 -2
- package/dist/features/blocks/client/nodes/BlocksNode.d.ts.map +1 -1
- package/dist/features/blocks/client/nodes/BlocksNode.js.map +1 -1
- package/dist/features/blocks/client/plugin/index.d.ts +2 -2
- package/dist/features/blocks/client/plugin/index.d.ts.map +1 -1
- package/dist/features/blocks/client/plugin/index.js +4 -4
- package/dist/features/blocks/client/plugin/index.js.map +1 -1
- package/dist/features/blocks/server/index.d.ts.map +1 -1
- package/dist/features/blocks/server/index.js +4 -2
- package/dist/features/blocks/server/index.js.map +1 -1
- package/dist/features/blocks/server/nodes/BlocksNode.d.ts +10 -4
- package/dist/features/blocks/server/nodes/BlocksNode.d.ts.map +1 -1
- package/dist/features/blocks/server/nodes/BlocksNode.js.map +1 -1
- package/dist/features/blocks/server/nodes/InlineBlocksNode.d.ts +2 -2
- package/dist/features/blocks/server/nodes/InlineBlocksNode.d.ts.map +1 -1
- package/dist/features/blocks/server/nodes/InlineBlocksNode.js.map +1 -1
- package/dist/features/blocks/server/validate.js.map +1 -1
- package/dist/features/converters/html/converter/index.js +2 -2
- package/dist/features/converters/html/converter/index.js.map +1 -1
- package/dist/features/converters/html/field/index.js.map +1 -1
- package/dist/features/debug/testRecorder/client/plugin/index.js.map +1 -1
- package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
- package/dist/features/experimental_table/server/index.js +2 -2
- package/dist/features/experimental_table/server/index.js.map +1 -1
- package/dist/features/horizontalRule/client/component/index.d.ts +1 -1
- package/dist/features/horizontalRule/client/component/index.d.ts.map +1 -1
- package/dist/features/horizontalRule/server/nodes/HorizontalRuleNode.d.ts +2 -2
- package/dist/features/horizontalRule/server/nodes/HorizontalRuleNode.d.ts.map +1 -1
- package/dist/features/horizontalRule/server/nodes/HorizontalRuleNode.js.map +1 -1
- package/dist/features/indent/client/index.d.ts.map +1 -1
- package/dist/features/indent/client/index.js +2 -1
- package/dist/features/indent/client/index.js.map +1 -1
- package/dist/features/link/client/index.js +1 -1
- package/dist/features/link/client/index.js.map +1 -1
- package/dist/features/link/client/plugins/autoLink/index.d.ts +1 -1
- package/dist/features/link/client/plugins/autoLink/index.d.ts.map +1 -1
- package/dist/features/link/client/plugins/autoLink/index.js.map +1 -1
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.d.ts.map +1 -1
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +3 -7
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
- package/dist/features/link/nodes/AutoLinkNode.js +2 -2
- package/dist/features/link/nodes/AutoLinkNode.js.map +1 -1
- package/dist/features/link/nodes/LinkNode.js +11 -6
- package/dist/features/link/nodes/LinkNode.js.map +1 -1
- package/dist/features/link/nodes/types.d.ts +3 -3
- package/dist/features/link/nodes/types.d.ts.map +1 -1
- package/dist/features/link/nodes/types.js.map +1 -1
- package/dist/features/link/server/baseFields.d.ts +1 -1
- package/dist/features/link/server/baseFields.d.ts.map +1 -1
- package/dist/features/link/server/baseFields.js +3 -1
- package/dist/features/link/server/baseFields.js.map +1 -1
- package/dist/features/link/server/index.d.ts.map +1 -1
- package/dist/features/link/server/index.js +2 -2
- package/dist/features/link/server/index.js.map +1 -1
- package/dist/features/link/server/transformExtraFields.d.ts +1 -1
- package/dist/features/link/server/transformExtraFields.d.ts.map +1 -1
- package/dist/features/link/server/transformExtraFields.js.map +1 -1
- package/dist/features/link/server/validate.js.map +1 -1
- package/dist/features/lists/shared/markdown.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/index.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/converter/index.js +1 -0
- package/dist/features/migrations/lexicalPluginToLexical/converter/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.d.ts +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.d.ts.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/blockquote/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/heading/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/link/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/listItem/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/orderedList/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unknown/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/converters/unorderedList/converter.js.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/index.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/converter/index.js +1 -0
- package/dist/features/migrations/slateToLexical/converter/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.d.ts +1 -1
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.d.ts.map +1 -1
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/paragraph/server/index.d.ts +1 -1
- package/dist/features/paragraph/server/index.d.ts.map +1 -1
- package/dist/features/relationship/client/components/RelationshipComponent.d.ts.map +1 -1
- package/dist/features/relationship/client/components/RelationshipComponent.js +8 -6
- package/dist/features/relationship/client/components/RelationshipComponent.js.map +1 -1
- package/dist/features/relationship/client/drawer/index.js +3 -3
- package/dist/features/relationship/client/drawer/index.js.map +1 -1
- package/dist/features/relationship/client/plugins/index.js +1 -1
- package/dist/features/relationship/client/plugins/index.js.map +1 -1
- package/dist/features/relationship/client/utils/EnabledRelationshipsCondition.js +1 -1
- package/dist/features/relationship/client/utils/EnabledRelationshipsCondition.js.map +1 -1
- package/dist/features/relationship/server/nodes/RelationshipNode.d.ts +1 -1
- package/dist/features/relationship/server/nodes/RelationshipNode.d.ts.map +1 -1
- package/dist/features/relationship/server/nodes/RelationshipNode.js.map +1 -1
- package/dist/features/toolbars/fixed/client/Toolbar/index.d.ts.map +1 -1
- package/dist/features/toolbars/fixed/client/Toolbar/index.js +40 -41
- package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
- package/dist/features/toolbars/inline/client/Toolbar/index.d.ts.map +1 -1
- package/dist/features/toolbars/inline/client/Toolbar/index.js +33 -34
- package/dist/features/toolbars/inline/client/Toolbar/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 +4 -1
- package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/index.d.ts +3 -4
- package/dist/features/toolbars/shared/ToolbarDropdown/index.d.ts.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/index.js +82 -64
- package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
- package/dist/features/toolbars/types.d.ts +21 -11
- package/dist/features/toolbars/types.d.ts.map +1 -1
- package/dist/features/toolbars/types.js.map +1 -1
- package/dist/features/typesServer.d.ts.map +1 -1
- package/dist/features/typesServer.js.map +1 -1
- package/dist/features/upload/client/component/index.js +1 -1
- package/dist/features/upload/client/component/index.js.map +1 -1
- package/dist/features/upload/client/drawer/index.d.ts.map +1 -1
- package/dist/features/upload/client/drawer/index.js +2 -0
- package/dist/features/upload/client/drawer/index.js.map +1 -1
- package/dist/features/upload/client/plugin/index.js +1 -1
- package/dist/features/upload/client/plugin/index.js.map +1 -1
- package/dist/features/upload/server/feature.server.js +3 -4
- package/dist/features/upload/server/feature.server.js.map +1 -1
- package/dist/features/upload/server/validate.js.map +1 -1
- package/dist/field/Field.d.ts.map +1 -1
- package/dist/field/Field.js +11 -11
- package/dist/field/Field.js.map +1 -1
- package/dist/field/bundled.css +1 -1
- package/dist/field/index.js +1 -1
- package/dist/field/index.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +69 -63
- package/dist/index.js.map +1 -1
- package/dist/lexical/EditorPlugin.d.ts.map +1 -1
- package/dist/lexical/EditorPlugin.js +2 -1
- package/dist/lexical/EditorPlugin.js.map +1 -1
- package/dist/lexical/LexicalEditor.d.ts +1 -1
- package/dist/lexical/LexicalEditor.d.ts.map +1 -1
- package/dist/lexical/LexicalEditor.js +5 -5
- package/dist/lexical/LexicalEditor.js.map +1 -1
- package/dist/lexical/config/client/EditorConfigProvider.d.ts +1 -1
- package/dist/lexical/config/client/EditorConfigProvider.d.ts.map +1 -1
- package/dist/lexical/config/client/EditorConfigProvider.js +8 -7
- package/dist/lexical/config/client/EditorConfigProvider.js.map +1 -1
- package/dist/lexical/config/client/sanitize.js +2 -2
- package/dist/lexical/config/client/sanitize.js.map +1 -1
- package/dist/lexical/config/server/loader.js.map +1 -1
- package/dist/lexical/config/server/sanitize.d.ts.map +1 -1
- package/dist/lexical/config/server/sanitize.js +11 -11
- package/dist/lexical/config/server/sanitize.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +2 -2
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.d.ts +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.d.ts.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/index.d.ts.map +1 -1
- package/dist/lexical/plugins/SlashMenu/index.js +9 -6
- package/dist/lexical/plugins/SlashMenu/index.js.map +1 -1
- package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.d.ts.map +1 -1
- package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js +5 -5
- package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/debounce.d.ts +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/debounce.d.ts.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/debounce.js +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/debounce.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/getBoundingRectWithoutTransform.js +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/getBoundingRectWithoutTransform.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.d.ts.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +9 -4
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
- package/dist/lexical/plugins/handles/utils/getNodeCloseToPoint.d.ts.map +1 -1
- package/dist/lexical/plugins/handles/utils/getNodeCloseToPoint.js +3 -4
- package/dist/lexical/plugins/handles/utils/getNodeCloseToPoint.js.map +1 -1
- package/dist/lexical/utils/rect.d.ts +4 -4
- package/dist/lexical/utils/setFloatingElemPosition.d.ts +1 -1
- package/dist/lexical/utils/setFloatingElemPosition.d.ts.map +1 -1
- package/dist/lexical/utils/setFloatingElemPosition.js.map +1 -1
- package/dist/populateGraphQL/populate.js +1 -1
- package/dist/populateGraphQL/populate.js.map +1 -1
- package/dist/populateGraphQL/populateLexicalPopulationPromises.d.ts +1 -1
- package/dist/populateGraphQL/populateLexicalPopulationPromises.d.ts.map +1 -1
- package/dist/populateGraphQL/populateLexicalPopulationPromises.js +5 -4
- package/dist/populateGraphQL/populateLexicalPopulationPromises.js.map +1 -1
- package/dist/populateGraphQL/recursivelyPopulateFieldsForGraphQL.js.map +1 -1
- package/dist/utilities/fieldsDrawer/DrawerContent.d.ts.map +1 -1
- package/dist/utilities/fieldsDrawer/DrawerContent.js +8 -3
- package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
- package/dist/utilities/generateComponentMap.d.ts.map +1 -1
- package/dist/utilities/generateComponentMap.js +1 -0
- package/dist/utilities/generateComponentMap.js.map +1 -1
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.d.ts +1 -1
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.d.ts.map +1 -1
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.js +1 -1
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.js.map +1 -1
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.d.ts +1 -1
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.d.ts.map +1 -1
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.js.map +1 -1
- package/dist/validate/validateNodes.d.ts.map +1 -1
- package/dist/validate/validateNodes.js +2 -2
- package/dist/validate/validateNodes.js.map +1 -1
- package/package.json +13 -13
- package/dist/exports/client/Field-EL5TNVZW.js +0 -2
- package/dist/exports/client/Field-EL5TNVZW.js.map +0 -7
- package/dist/exports/client/RelationshipComponent-Z5SZ5FFT.js +0 -2
- package/dist/exports/client/chunk-366OGJYE.js +0 -2
- package/dist/exports/client/chunk-366OGJYE.js.map +0 -7
- package/dist/exports/client/chunk-GK7ZKYHL.js.map +0 -7
- package/dist/exports/client/chunk-TXEIKM77.js.map +0 -7
- package/dist/exports/client/component-OVIYSCND.js +0 -2
- package/dist/exports/client/component-OVIYSCND.js.map +0 -7
- package/dist/exports/client/component-UJILB3MH.js +0 -2
- package/dist/exports/client/component-UJILB3MH.js.map +0 -7
- package/dist/exports/client/componentInline-HAGGWKA7.js +0 -2
- /package/dist/exports/client/{component-GAX6BHKZ.js.map → component-GQ5M6NF6.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["useLexicalComposerContext","$createParagraphNode","$createTextNode","$getRoot","React","useCallback","useEffect","useLayoutEffect","useRef","useState","IS_APPLE","copy","text","textArea","document","createElement","value","style","position","opacity","body","appendChild","focus","select","result","execCommand","console","log","error","removeChild","download","filename","a","setAttribute","encodeURIComponent","display","click","formatStep","step","formatOneStep","name","x","y","anchorPath","toString","anchorOffset","focusPath","focusOffset","formattedStep","count","join","isSelectAll","event","key","toLowerCase","metaKey","ctrlKey","sanitizeSelection","selection","anchorNode","focusNode","getPathFromNodeToEditor","node","rootElement","currentNode","path","undefined","unshift","Array","from","parentNode","childNodes","indexOf","keyPresses","Set","useTestRecorder","editor","steps","setSteps","isRecording","setIsRecording","setCurrentInnerHTML","templatedTest","setTemplatedTest","previousSelectionRef","skipNextSelectionChangeRef","preRef","getCurrentEditor","generateTestContent","getRootElement","browserSelection","window","getSelection","contains","map","pushStep","currentSteps","currentIndex","length","lastStep","slice","onKeyDown","has","onKeyUp","registerRootListener","prevRootElement","removeEventListener","addEventListener","current","scrollTo","scrollHeight","testContent","removeUpdateListener","registerUpdateListener","dirtyElements","dirtyLeaves","editorState","currentSelection","_selection","previousSelection","skipNextSelectionChange","size","innerHTML","toggleEditorSelection","currentEditor","update","root","clear","append","currentIsRecording","onSnapshotClick","onCopyClick","onDownloadClick","button","_jsx","className","id","onClick","e","preventDefault","title","type","output","_jsxs","ref","TestRecorderPlugin","testRecorderButton","testRecorderOutput","Fragment"],"sources":["../../../../../../src/features/debug/testRecorder/client/plugin/index.tsx"],"sourcesContent":["'use client'\nimport type { BaseSelection, LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode, $createTextNode, $getRoot } from 'lexical'\nimport * as React from 'react'\nimport { type JSX, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport { IS_APPLE } from '../../../../../lexical/utils/environment.js'\nimport './index.scss'\n\nconst copy = (text: null | string) => {\n const textArea = document.createElement('textarea')\n textArea.value = text || ''\n textArea.style.position = 'absolute'\n textArea.style.opacity = '0'\n document.body?.appendChild(textArea)\n textArea.focus()\n textArea.select()\n try {\n const result = document.execCommand('copy')\n // eslint-disable-next-line no-console\n console.log(result)\n } catch (error) {\n console.error(error)\n }\n document.body?.removeChild(textArea)\n}\n\nconst download = (filename: string, text: null | string) => {\n const a = document.createElement('a')\n a.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text || ''))\n a.setAttribute('download', filename)\n a.style.display = 'none'\n document.body?.appendChild(a)\n a.click()\n document.body?.removeChild(a)\n}\n\nconst formatStep = (step: Step) => {\n const formatOneStep = (name: string, value: Step['value']) => {\n switch (name) {\n case 'click': {\n return ` await page.mouse.click(${value.x}, ${value.y});`\n }\n case 'press': {\n return ` await page.keyboard.press('${value}');`\n }\n case 'keydown': {\n return ` await page.keyboard.keydown('${value}');`\n }\n case 'keyup': {\n return ` await page.keyboard.keyup('${value}');`\n }\n case 'type': {\n return ` await page.keyboard.type('${value}');`\n }\n case 'selectAll': {\n return ` await selectAll(page);`\n }\n case 'snapshot': {\n return ` await assertHTMLSnapshot(page);\n await assertSelection(page, {\n anchorPath: [${value.anchorPath.toString()}],\n anchorOffset: ${value.anchorOffset},\n focusPath: [${value.focusPath.toString()}],\n focusOffset: ${value.focusOffset},\n });\n`\n }\n default:\n return ``\n }\n }\n const formattedStep = formatOneStep(step.name, step.value)\n switch (step.count) {\n case 1:\n return formattedStep\n case 2:\n return [formattedStep, formattedStep].join(`\\n`)\n default:\n return ` await repeat(${step.count}, async () => {\n ${formattedStep}\n );`\n }\n}\n\nexport function isSelectAll(event: KeyboardEvent): boolean {\n return event.key.toLowerCase() === 'a' && (IS_APPLE ? event.metaKey : event.ctrlKey)\n}\n\n// stolen from LexicalSelection-test\nfunction sanitizeSelection(selection: Selection) {\n const { anchorNode, focusNode } = selection\n let { anchorOffset, focusOffset } = selection\n if (anchorOffset !== 0) {\n anchorOffset--\n }\n if (focusOffset !== 0) {\n focusOffset--\n }\n return { anchorNode, anchorOffset, focusNode, focusOffset }\n}\n\nfunction getPathFromNodeToEditor(node: Node, rootElement: HTMLElement | null) {\n let currentNode: Node | null | undefined = node\n const path = []\n while (currentNode !== rootElement) {\n if (currentNode !== null && currentNode !== undefined) {\n path.unshift(\n Array.from(currentNode?.parentNode?.childNodes ?? []).indexOf(currentNode as ChildNode),\n )\n }\n currentNode = currentNode?.parentNode\n }\n return path\n}\n\nconst keyPresses = new Set([\n 'Enter',\n 'Backspace',\n 'Delete',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n])\n\ntype Step = {\n count: number\n name: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any\n}\n\ntype Steps = Step[]\n\nfunction useTestRecorder(editor: LexicalEditor): [JSX.Element, JSX.Element | null] {\n const [steps, setSteps] = useState<Steps>([])\n const [isRecording, setIsRecording] = useState(false)\n const [, setCurrentInnerHTML] = useState('')\n const [templatedTest, setTemplatedTest] = useState('')\n const previousSelectionRef = useRef<BaseSelection | null>(null)\n const skipNextSelectionChangeRef = useRef(false)\n const preRef = useRef<HTMLPreElement>(null)\n\n const getCurrentEditor = useCallback(() => {\n return editor\n }, [editor])\n\n const generateTestContent = useCallback(() => {\n const rootElement = editor.getRootElement()\n const browserSelection = window.getSelection()\n\n if (\n rootElement == null ||\n browserSelection == null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null ||\n !rootElement.contains(browserSelection.anchorNode) ||\n !rootElement.contains(browserSelection.focusNode)\n ) {\n return null\n }\n\n return `\nimport {\n initializeE2E,\n assertHTMLSnapshot,\n assertSelection,\n repeat,\n} from '../utils';\nimport {selectAll} from '../keyboardShortcuts';\nimport { RangeSelection } from 'lexical';\nimport { NodeSelection } from 'lexical';\n\ndescribe('Test case', () => {\n initializeE2E((e2e) => {\n it('Should pass this test', async () => {\n const {page} = e2e;\n\n await page.focus('div[contenteditable=\"true\"]');\n${steps.map(formatStep).join(`\\n`)}\n });\n});\n `\n }, [editor, steps])\n\n // just a wrapper around inserting new actions so that we can\n // coalesce some actions like insertText/moveNativeSelection\n const pushStep = useCallback(\n (name: string, value: Step['value']) => {\n setSteps((currentSteps) => {\n // trying to group steps\n const currentIndex = steps.length - 1\n const lastStep = steps[currentIndex]\n if (lastStep) {\n if (lastStep.name === name) {\n if (name === 'type') {\n // for typing events we just append the text\n return [\n ...steps.slice(0, currentIndex),\n { ...lastStep, value: lastStep.value + value },\n ]\n } else {\n // for other events we bump the counter if their values are the same\n if (lastStep.value === value) {\n return [...steps.slice(0, currentIndex), { ...lastStep, count: lastStep.count + 1 }]\n }\n }\n }\n }\n // could not group, just append a new one\n return [...currentSteps, { name, count: 1, value }]\n })\n },\n [steps, setSteps],\n )\n\n useLayoutEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (isSelectAll(event)) {\n pushStep('selectAll', '')\n } else if (keyPresses.has(key)) {\n pushStep('press', event.key)\n } else if ([...key].length > 1) {\n pushStep('keydown', event.key)\n } else {\n pushStep('type', event.key)\n }\n }\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (!keyPresses.has(key) && [...key].length > 1) {\n pushStep('keyup', event.key)\n }\n }\n\n return editor.registerRootListener(\n (rootElement: HTMLElement | null, prevRootElement: HTMLElement | null) => {\n if (prevRootElement !== null) {\n prevRootElement.removeEventListener('keydown', onKeyDown)\n prevRootElement.removeEventListener('keyup', onKeyUp)\n }\n if (rootElement !== null) {\n rootElement.addEventListener('keydown', onKeyDown)\n rootElement.addEventListener('keyup', onKeyUp)\n }\n },\n )\n }, [editor, isRecording, pushStep])\n\n useLayoutEffect(() => {\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }, [generateTestContent])\n\n useEffect(() => {\n if (steps) {\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }\n }, [generateTestContent, steps])\n\n useEffect(() => {\n const removeUpdateListener = editor.registerUpdateListener(\n ({ dirtyElements, dirtyLeaves, editorState }) => {\n if (!isRecording) {\n return\n }\n const currentSelection = editorState._selection\n const previousSelection = previousSelectionRef.current\n const skipNextSelectionChange = skipNextSelectionChangeRef.current\n if (previousSelection !== currentSelection) {\n if (dirtyLeaves.size === 0 && dirtyElements.size === 0 && !skipNextSelectionChange) {\n const browserSelection = window.getSelection()\n if (\n browserSelection &&\n (browserSelection.anchorNode == null || browserSelection.focusNode == null)\n ) {\n return\n }\n }\n previousSelectionRef.current = currentSelection\n }\n skipNextSelectionChangeRef.current = false\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n },\n )\n return removeUpdateListener\n }, [editor, generateTestContent, isRecording, pushStep])\n\n // save innerHTML\n useEffect(() => {\n if (!isRecording) {\n return\n }\n const removeUpdateListener = editor.registerUpdateListener(() => {\n const rootElement = editor.getRootElement()\n if (rootElement !== null) {\n setCurrentInnerHTML(rootElement?.innerHTML)\n }\n })\n return removeUpdateListener\n }, [editor, isRecording])\n\n // clear editor and start recording\n const toggleEditorSelection = useCallback(\n (currentEditor: LexicalEditor) => {\n if (!isRecording) {\n currentEditor.update(() => {\n const root = $getRoot()\n root.clear()\n const text = $createTextNode()\n root.append($createParagraphNode().append(text))\n text.select()\n })\n setSteps([])\n }\n setIsRecording((currentIsRecording) => !currentIsRecording)\n },\n [isRecording],\n )\n\n const onSnapshotClick = useCallback(() => {\n if (!isRecording) {\n return\n }\n const browserSelection = window.getSelection()\n if (\n browserSelection === null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null\n ) {\n return\n }\n const { anchorNode, anchorOffset, focusNode, focusOffset } = sanitizeSelection(browserSelection)\n const rootElement = getCurrentEditor().getRootElement()\n let anchorPath\n if (anchorNode !== null) {\n anchorPath = getPathFromNodeToEditor(anchorNode, rootElement)\n }\n let focusPath\n if (focusNode !== null) {\n focusPath = getPathFromNodeToEditor(focusNode, rootElement)\n }\n pushStep('snapshot', {\n anchorNode,\n anchorOffset,\n anchorPath,\n focusNode,\n focusOffset,\n focusPath,\n })\n }, [pushStep, isRecording, getCurrentEditor])\n\n const onCopyClick = useCallback(() => {\n copy(generateTestContent())\n }, [generateTestContent])\n\n const onDownloadClick = useCallback(() => {\n download('test.js', generateTestContent())\n }, [generateTestContent])\n\n const button = (\n <button\n className={`editor-dev-button ${isRecording ? 'active' : ''}`}\n id=\"test-recorder-button\"\n onClick={(e) => {\n toggleEditorSelection(getCurrentEditor())\n e.preventDefault()\n }}\n title={isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n type=\"button\"\n >\n {isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n </button>\n )\n const output = isRecording ? (\n <div className=\"test-recorder-output\">\n <div className=\"test-recorder-toolbar\">\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-snapshot\"\n onClick={(e) => {\n onSnapshotClick()\n e.preventDefault()\n }}\n title=\"Insert snapshot\"\n type=\"button\"\n >\n Insert Snapshot\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-copy\"\n onClick={(e) => {\n onCopyClick()\n e.preventDefault()\n }}\n title=\"Copy to clipboard\"\n type=\"button\"\n >\n Copy\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-download\"\n onClick={(e) => {\n onDownloadClick()\n e.preventDefault()\n }}\n title=\"Download as a file\"\n type=\"button\"\n >\n Download\n </button>\n </div>\n <pre id=\"test-recorder\" ref={preRef}>\n {templatedTest}\n </pre>\n </div>\n ) : null\n\n return [button, output]\n}\nexport const TestRecorderPlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n const [testRecorderButton, testRecorderOutput] = useTestRecorder(editor)\n\n return (\n <React.Fragment>\n <p>HI</p>\n {testRecorderButton}\n {testRecorderOutput}\n <p>DONE</p>\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["useLexicalComposerContext","$createParagraphNode","$createTextNode","$getRoot","React","useCallback","useEffect","useLayoutEffect","useRef","useState","IS_APPLE","copy","text","textArea","document","createElement","value","style","position","opacity","body","appendChild","focus","select","result","execCommand","console","log","error","removeChild","download","filename","a","setAttribute","encodeURIComponent","display","click","formatStep","step","formatOneStep","name","x","y","anchorPath","toString","anchorOffset","focusPath","focusOffset","formattedStep","count","join","isSelectAll","event","key","toLowerCase","metaKey","ctrlKey","sanitizeSelection","selection","anchorNode","focusNode","getPathFromNodeToEditor","node","rootElement","currentNode","path","undefined","unshift","Array","from","parentNode","childNodes","indexOf","keyPresses","Set","useTestRecorder","editor","steps","setSteps","isRecording","setIsRecording","setCurrentInnerHTML","templatedTest","setTemplatedTest","previousSelectionRef","skipNextSelectionChangeRef","preRef","getCurrentEditor","generateTestContent","getRootElement","browserSelection","window","getSelection","contains","map","pushStep","currentSteps","currentIndex","length","lastStep","slice","onKeyDown","has","onKeyUp","registerRootListener","prevRootElement","removeEventListener","addEventListener","current","scrollTo","scrollHeight","testContent","removeUpdateListener","registerUpdateListener","dirtyElements","dirtyLeaves","editorState","currentSelection","_selection","previousSelection","skipNextSelectionChange","size","innerHTML","toggleEditorSelection","currentEditor","update","root","clear","append","currentIsRecording","onSnapshotClick","onCopyClick","onDownloadClick","button","_jsx","className","id","onClick","e","preventDefault","title","type","output","_jsxs","ref","TestRecorderPlugin","testRecorderButton","testRecorderOutput","Fragment"],"sources":["../../../../../../src/features/debug/testRecorder/client/plugin/index.tsx"],"sourcesContent":["'use client'\nimport type { BaseSelection, LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $createParagraphNode, $createTextNode, $getRoot } from 'lexical'\nimport * as React from 'react'\nimport { type JSX, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport { IS_APPLE } from '../../../../../lexical/utils/environment.js'\nimport './index.scss'\n\nconst copy = (text: null | string) => {\n const textArea = document.createElement('textarea')\n textArea.value = text || ''\n textArea.style.position = 'absolute'\n textArea.style.opacity = '0'\n document.body?.appendChild(textArea)\n textArea.focus()\n textArea.select()\n try {\n const result = document.execCommand('copy')\n // eslint-disable-next-line no-console\n console.log(result)\n } catch (error) {\n console.error(error)\n }\n document.body?.removeChild(textArea)\n}\n\nconst download = (filename: string, text: null | string) => {\n const a = document.createElement('a')\n a.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text || ''))\n a.setAttribute('download', filename)\n a.style.display = 'none'\n document.body?.appendChild(a)\n a.click()\n document.body?.removeChild(a)\n}\n\nconst formatStep = (step: Step) => {\n const formatOneStep = (name: string, value: Step['value']) => {\n switch (name) {\n case 'click': {\n return ` await page.mouse.click(${value.x}, ${value.y});`\n }\n case 'press': {\n return ` await page.keyboard.press('${value}');`\n }\n case 'keydown': {\n return ` await page.keyboard.keydown('${value}');`\n }\n case 'keyup': {\n return ` await page.keyboard.keyup('${value}');`\n }\n case 'type': {\n return ` await page.keyboard.type('${value}');`\n }\n case 'selectAll': {\n return ` await selectAll(page);`\n }\n case 'snapshot': {\n return ` await assertHTMLSnapshot(page);\n await assertSelection(page, {\n anchorPath: [${value.anchorPath.toString()}],\n anchorOffset: ${value.anchorOffset},\n focusPath: [${value.focusPath.toString()}],\n focusOffset: ${value.focusOffset},\n });\n`\n }\n default:\n return ``\n }\n }\n const formattedStep = formatOneStep(step.name, step.value)\n switch (step.count) {\n case 1:\n return formattedStep\n case 2:\n return [formattedStep, formattedStep].join(`\\n`)\n default:\n return ` await repeat(${step.count}, async () => {\n ${formattedStep}\n );`\n }\n}\n\nexport function isSelectAll(event: KeyboardEvent): boolean {\n return event.key.toLowerCase() === 'a' && (IS_APPLE ? event.metaKey : event.ctrlKey)\n}\n\n// stolen from LexicalSelection-test\nfunction sanitizeSelection(selection: Selection) {\n const { anchorNode, focusNode } = selection\n let { anchorOffset, focusOffset } = selection\n if (anchorOffset !== 0) {\n anchorOffset--\n }\n if (focusOffset !== 0) {\n focusOffset--\n }\n return { anchorNode, anchorOffset, focusNode, focusOffset }\n}\n\nfunction getPathFromNodeToEditor(node: Node, rootElement: HTMLElement | null) {\n let currentNode: Node | null | undefined = node\n const path: number[] = []\n while (currentNode !== rootElement) {\n if (currentNode !== null && currentNode !== undefined) {\n path.unshift(\n Array.from(currentNode?.parentNode?.childNodes ?? []).indexOf(currentNode as ChildNode),\n )\n }\n currentNode = currentNode?.parentNode\n }\n return path\n}\n\nconst keyPresses = new Set([\n 'Enter',\n 'Backspace',\n 'Delete',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'ArrowUp',\n 'ArrowDown',\n])\n\ntype Step = {\n count: number\n name: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any\n}\n\ntype Steps = Step[]\n\nfunction useTestRecorder(editor: LexicalEditor): [JSX.Element, JSX.Element | null] {\n const [steps, setSteps] = useState<Steps>([])\n const [isRecording, setIsRecording] = useState(false)\n const [, setCurrentInnerHTML] = useState('')\n const [templatedTest, setTemplatedTest] = useState('')\n const previousSelectionRef = useRef<BaseSelection | null>(null)\n const skipNextSelectionChangeRef = useRef(false)\n const preRef = useRef<HTMLPreElement>(null)\n\n const getCurrentEditor = useCallback(() => {\n return editor\n }, [editor])\n\n const generateTestContent = useCallback(() => {\n const rootElement = editor.getRootElement()\n const browserSelection = window.getSelection()\n\n if (\n rootElement == null ||\n browserSelection == null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null ||\n !rootElement.contains(browserSelection.anchorNode) ||\n !rootElement.contains(browserSelection.focusNode)\n ) {\n return null\n }\n\n return `\nimport {\n initializeE2E,\n assertHTMLSnapshot,\n assertSelection,\n repeat,\n} from '../utils';\nimport {selectAll} from '../keyboardShortcuts';\nimport { RangeSelection } from 'lexical';\nimport { NodeSelection } from 'lexical';\n\ndescribe('Test case', () => {\n initializeE2E((e2e) => {\n it('Should pass this test', async () => {\n const {page} = e2e;\n\n await page.focus('div[contenteditable=\"true\"]');\n${steps.map(formatStep).join(`\\n`)}\n });\n});\n `\n }, [editor, steps])\n\n // just a wrapper around inserting new actions so that we can\n // coalesce some actions like insertText/moveNativeSelection\n const pushStep = useCallback(\n (name: string, value: Step['value']) => {\n setSteps((currentSteps) => {\n // trying to group steps\n const currentIndex = steps.length - 1\n const lastStep = steps[currentIndex]\n if (lastStep) {\n if (lastStep.name === name) {\n if (name === 'type') {\n // for typing events we just append the text\n return [\n ...steps.slice(0, currentIndex),\n { ...lastStep, value: lastStep.value + value },\n ]\n } else {\n // for other events we bump the counter if their values are the same\n if (lastStep.value === value) {\n return [...steps.slice(0, currentIndex), { ...lastStep, count: lastStep.count + 1 }]\n }\n }\n }\n }\n // could not group, just append a new one\n return [...currentSteps, { name, count: 1, value }]\n })\n },\n [steps, setSteps],\n )\n\n useLayoutEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (isSelectAll(event)) {\n pushStep('selectAll', '')\n } else if (keyPresses.has(key)) {\n pushStep('press', event.key)\n } else if ([...key].length > 1) {\n pushStep('keydown', event.key)\n } else {\n pushStep('type', event.key)\n }\n }\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (!isRecording) {\n return\n }\n const key = event.key\n if (!keyPresses.has(key) && [...key].length > 1) {\n pushStep('keyup', event.key)\n }\n }\n\n return editor.registerRootListener(\n (rootElement: HTMLElement | null, prevRootElement: HTMLElement | null) => {\n if (prevRootElement !== null) {\n prevRootElement.removeEventListener('keydown', onKeyDown)\n prevRootElement.removeEventListener('keyup', onKeyUp)\n }\n if (rootElement !== null) {\n rootElement.addEventListener('keydown', onKeyDown)\n rootElement.addEventListener('keyup', onKeyUp)\n }\n },\n )\n }, [editor, isRecording, pushStep])\n\n useLayoutEffect(() => {\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }, [generateTestContent])\n\n useEffect(() => {\n if (steps) {\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n if (preRef.current) {\n preRef.current.scrollTo(0, preRef.current.scrollHeight)\n }\n }\n }, [generateTestContent, steps])\n\n useEffect(() => {\n const removeUpdateListener = editor.registerUpdateListener(\n ({ dirtyElements, dirtyLeaves, editorState }) => {\n if (!isRecording) {\n return\n }\n const currentSelection = editorState._selection\n const previousSelection = previousSelectionRef.current\n const skipNextSelectionChange = skipNextSelectionChangeRef.current\n if (previousSelection !== currentSelection) {\n if (dirtyLeaves.size === 0 && dirtyElements.size === 0 && !skipNextSelectionChange) {\n const browserSelection = window.getSelection()\n if (\n browserSelection &&\n (browserSelection.anchorNode == null || browserSelection.focusNode == null)\n ) {\n return\n }\n }\n previousSelectionRef.current = currentSelection\n }\n skipNextSelectionChangeRef.current = false\n const testContent = generateTestContent()\n if (testContent !== null) {\n setTemplatedTest(testContent)\n }\n },\n )\n return removeUpdateListener\n }, [editor, generateTestContent, isRecording, pushStep])\n\n // save innerHTML\n useEffect(() => {\n if (!isRecording) {\n return\n }\n const removeUpdateListener = editor.registerUpdateListener(() => {\n const rootElement = editor.getRootElement()\n if (rootElement !== null) {\n setCurrentInnerHTML(rootElement?.innerHTML)\n }\n })\n return removeUpdateListener\n }, [editor, isRecording])\n\n // clear editor and start recording\n const toggleEditorSelection = useCallback(\n (currentEditor: LexicalEditor) => {\n if (!isRecording) {\n currentEditor.update(() => {\n const root = $getRoot()\n root.clear()\n const text = $createTextNode()\n root.append($createParagraphNode().append(text))\n text.select()\n })\n setSteps([])\n }\n setIsRecording((currentIsRecording) => !currentIsRecording)\n },\n [isRecording],\n )\n\n const onSnapshotClick = useCallback(() => {\n if (!isRecording) {\n return\n }\n const browserSelection = window.getSelection()\n if (\n browserSelection === null ||\n browserSelection.anchorNode == null ||\n browserSelection.focusNode == null\n ) {\n return\n }\n const { anchorNode, anchorOffset, focusNode, focusOffset } = sanitizeSelection(browserSelection)\n const rootElement = getCurrentEditor().getRootElement()\n let anchorPath\n if (anchorNode !== null) {\n anchorPath = getPathFromNodeToEditor(anchorNode, rootElement)\n }\n let focusPath\n if (focusNode !== null) {\n focusPath = getPathFromNodeToEditor(focusNode, rootElement)\n }\n pushStep('snapshot', {\n anchorNode,\n anchorOffset,\n anchorPath,\n focusNode,\n focusOffset,\n focusPath,\n })\n }, [pushStep, isRecording, getCurrentEditor])\n\n const onCopyClick = useCallback(() => {\n copy(generateTestContent())\n }, [generateTestContent])\n\n const onDownloadClick = useCallback(() => {\n download('test.js', generateTestContent())\n }, [generateTestContent])\n\n const button = (\n <button\n className={`editor-dev-button ${isRecording ? 'active' : ''}`}\n id=\"test-recorder-button\"\n onClick={(e) => {\n toggleEditorSelection(getCurrentEditor())\n e.preventDefault()\n }}\n title={isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n type=\"button\"\n >\n {isRecording ? 'Disable test recorder' : 'Enable test recorder'}\n </button>\n )\n const output = isRecording ? (\n <div className=\"test-recorder-output\">\n <div className=\"test-recorder-toolbar\">\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-snapshot\"\n onClick={(e) => {\n onSnapshotClick()\n e.preventDefault()\n }}\n title=\"Insert snapshot\"\n type=\"button\"\n >\n Insert Snapshot\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-copy\"\n onClick={(e) => {\n onCopyClick()\n e.preventDefault()\n }}\n title=\"Copy to clipboard\"\n type=\"button\"\n >\n Copy\n </button>\n <button\n className=\"test-recorder-button\"\n id=\"test-recorder-button-download\"\n onClick={(e) => {\n onDownloadClick()\n e.preventDefault()\n }}\n title=\"Download as a file\"\n type=\"button\"\n >\n Download\n </button>\n </div>\n <pre id=\"test-recorder\" ref={preRef}>\n {templatedTest}\n </pre>\n </div>\n ) : null\n\n return [button, output]\n}\nexport const TestRecorderPlugin: PluginComponent<undefined> = () => {\n const [editor] = useLexicalComposerContext()\n const [testRecorderButton, testRecorderOutput] = useTestRecorder(editor)\n\n return (\n <React.Fragment>\n <p>HI</p>\n {testRecorderButton}\n {testRecorderOutput}\n <p>DONE</p>\n </React.Fragment>\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["useLexicalComposerContext","useLexicalEditable","$deleteTableColumn__EXPERIMENTAL","$deleteTableRow__EXPERIMENTAL","$getNodeTriplet","$getTableCellNodeFromLexicalNode","$getTableColumnIndexFromTableCellNode","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$insertTableColumn__EXPERIMENTAL","$insertTableRow__EXPERIMENTAL","$isTableCellNode","$isTableRowNode","$isTableSelection","$unmergeCell","getTableObserverFromTableElement","TableCellHeaderStates","TableCellNode","useScrollInfo","$createParagraphNode","$getRoot","$getSelection","$isElementNode","$isParagraphNode","$isRangeSelection","$isTextNode","React","useCallback","useEffect","useRef","useState","createPortal","MeatballsIcon","computeSelectionCount","selection","selectionShape","getShape","columns","toX","fromX","rows","toY","fromY","isTableSelectionRectangular","nodes","getNodes","currentRows","currentRow","expectedColumns","currentColumns","i","length","node","row","getParentOrThrow","Error","colSpan","__colSpan","j","undefined","__rowSpan","every","v","$canUnmerge","isCollapsed","anchor","is","focus","cell","$cellContainsEmptyParagraph","getChildrenSize","firstChild","getFirstChildOrThrow","isEmpty","$selectLastDescendant","lastDescendant","getLastDescendant","select","selectEnd","selectNext","TableActionMenu","cellMerge","contextRef","onClose","setIsMenuOpen","tableCellNode","_tableCellNode","editor","dropDownRef","updateTableCellNode","selectionCounts","updateSelectionCounts","canMergeCells","setCanMergeCells","canUnmergeCell","setCanUnmergeCell","y","registerMutationListener","nodeMutations","nodeUpdated","get","getKey","getEditorState","read","getLatest","skipInitialization","currentSelectionCounts","menuButtonElement","current","dropDownElement","rootElement","getRootElement","rootEleRect","getBoundingClientRect","menuButtonRect","style","opacity","dropDownElementRect","margin","leftPosition","right","width","window","innerWidth","position","left","pageXOffset","topPosition","top","height","innerHeight","bottom","pageYOffset","handleClickOutside","event","contains","target","addEventListener","removeEventListener","clearTableSelection","update","isAttached","tableNode","tableElement","getElementByKey","tableSelection","clearHighlight","markDirty","rootNode","selectStart","mergeTableCellsAtSelection","firstCell","setColSpan","setRowSpan","getFirstChild","remove","append","getChildren","unmergeTableCellsAtSelection","insertTableRowAtSelection","shouldInsertAfter","insertTableColumnAtSelection","deleteTableRowAtSelection","deleteTableAtSelection","deleteTableColumnAtSelection","toggleTableRowIsHeader","tableRowIndex","tableRows","tableRow","forEach","tableCell","toggleHeaderStyle","ROW","toggleTableColumnIsHeader","tableColumnIndex","maxRowsLength","Math","max","map","r","tableCells","COLUMN","mergeCellButton","_jsx","className","onClick","type","_jsxs","e","stopPropagation","ref","Fragment","__headerState","document","body","TableCellActionMenuContainer","anchorElem","menuButtonRef","menuRootRef","isMenuOpen","setTableMenuCellNode","$moveMenu","menu","nativeSelection","getSelection","activeElement","anchorNode","tableCellNodeFromSelection","getNode","tableCellParentNodeDOM","registerUpdateListener","menuButtonDOM","tableCellNodeDOM","tableCellRect","menuRect","anchorRect","transform","prevTableCellDOM","TableActionMenuPlugin","isEditable"],"sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type {\n HTMLTableElementWithWithTableSelectionState,\n TableRowNode,\n TableSelection,\n} from '@lexical/table'\nimport type { ElementNode } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $deleteTableColumn__EXPERIMENTAL,\n $deleteTableRow__EXPERIMENTAL,\n $getNodeTriplet,\n $getTableCellNodeFromLexicalNode,\n $getTableColumnIndexFromTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumn__EXPERIMENTAL,\n $insertTableRow__EXPERIMENTAL,\n $isTableCellNode,\n $isTableRowNode,\n $isTableSelection,\n $unmergeCell,\n getTableObserverFromTableElement,\n TableCellHeaderStates,\n TableCellNode,\n} from '@lexical/table'\nimport { useScrollInfo } from '@payloadcms/ui'\nimport {\n $createParagraphNode,\n $getRoot,\n $getSelection,\n $isElementNode,\n $isParagraphNode,\n $isRangeSelection,\n $isTextNode,\n} from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\n\nimport { MeatballsIcon } from '../../../../../lexical/ui/icons/Meatballs/index.js'\nimport './index.scss'\n\nfunction computeSelectionCount(selection: TableSelection): {\n columns: number\n rows: number\n} {\n const selectionShape = selection.getShape()\n return {\n columns: selectionShape.toX - selectionShape.fromX + 1,\n rows: selectionShape.toY - selectionShape.fromY + 1,\n }\n}\n\n// This is important when merging cells as there is no good way to re-merge weird shapes (a result\n// of selecting merged cells and non-merged)\nfunction isTableSelectionRectangular(selection: TableSelection): boolean {\n const nodes = selection.getNodes()\n const currentRows: Array<number> = []\n let currentRow = null\n let expectedColumns = null\n let currentColumns = 0\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n if ($isTableCellNode(node)) {\n const row = node.getParentOrThrow()\n if (!$isTableRowNode(row)) {\n throw new Error('Expected CellNode to have a RowNode parent')\n }\n if (currentRow !== row) {\n if (expectedColumns !== null && currentColumns !== expectedColumns) {\n return false\n }\n if (currentRow !== null) {\n expectedColumns = currentColumns\n }\n currentRow = row\n currentColumns = 0\n }\n const colSpan = node.__colSpan\n for (let j = 0; j < colSpan; j++) {\n if (currentRows[currentColumns + j] === undefined) {\n currentRows[currentColumns + j] = 0\n }\n currentRows[currentColumns + j] += node.__rowSpan\n }\n currentColumns += colSpan\n }\n }\n return (\n (expectedColumns === null || currentColumns === expectedColumns) &&\n currentRows.every((v) => v === currentRows[0])\n )\n}\n\nfunction $canUnmerge(): boolean {\n const selection = $getSelection()\n if (\n ($isRangeSelection(selection) && !selection.isCollapsed()) ||\n ($isTableSelection(selection) && !selection.anchor.is(selection.focus)) ||\n (!$isRangeSelection(selection) && !$isTableSelection(selection))\n ) {\n return false\n }\n const [cell] = $getNodeTriplet(selection.anchor)\n return cell.__colSpan > 1 || cell.__rowSpan > 1\n}\n\nfunction $cellContainsEmptyParagraph(cell: TableCellNode): boolean {\n if (cell.getChildrenSize() !== 1) {\n return false\n }\n const firstChild = cell.getFirstChildOrThrow()\n if (!$isParagraphNode(firstChild) || !firstChild.isEmpty()) {\n return false\n }\n return true\n}\n\nfunction $selectLastDescendant(node: ElementNode): void {\n const lastDescendant = node.getLastDescendant()\n if ($isTextNode(lastDescendant)) {\n lastDescendant.select()\n } else if ($isElementNode(lastDescendant)) {\n lastDescendant.selectEnd()\n } else if (lastDescendant !== null) {\n lastDescendant.selectNext()\n }\n}\n\ntype TableCellActionMenuProps = Readonly<{\n cellMerge: boolean\n contextRef: { current: HTMLElement | null }\n onClose: () => void\n setIsMenuOpen: (isOpen: boolean) => void\n tableCellNode: TableCellNode\n}>\n\nfunction TableActionMenu({\n cellMerge,\n contextRef,\n onClose,\n setIsMenuOpen,\n tableCellNode: _tableCellNode,\n}: TableCellActionMenuProps) {\n const [editor] = useLexicalComposerContext()\n const dropDownRef = useRef<HTMLDivElement | null>(null)\n const [tableCellNode, updateTableCellNode] = useState(_tableCellNode)\n const [selectionCounts, updateSelectionCounts] = useState({\n columns: 1,\n rows: 1,\n })\n const [canMergeCells, setCanMergeCells] = useState(false)\n const [canUnmergeCell, setCanUnmergeCell] = useState(false)\n const { y } = useScrollInfo()\n\n useEffect(() => {\n return editor.registerMutationListener(\n TableCellNode,\n (nodeMutations) => {\n const nodeUpdated = nodeMutations.get(tableCellNode.getKey()) === 'updated'\n\n if (nodeUpdated) {\n editor.getEditorState().read(() => {\n updateTableCellNode(tableCellNode.getLatest())\n })\n }\n },\n { skipInitialization: true },\n )\n }, [editor, tableCellNode])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n // Merge cells\n if ($isTableSelection(selection)) {\n const currentSelectionCounts = computeSelectionCount(selection)\n updateSelectionCounts(computeSelectionCount(selection))\n setCanMergeCells(\n isTableSelectionRectangular(selection) &&\n (currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1),\n )\n }\n // Unmerge cell\n setCanUnmergeCell($canUnmerge())\n })\n }, [editor])\n\n useEffect(() => {\n const menuButtonElement = contextRef.current\n const dropDownElement = dropDownRef.current\n const rootElement = editor.getRootElement()\n\n if (menuButtonElement != null && dropDownElement != null && rootElement != null) {\n const rootEleRect = rootElement.getBoundingClientRect()\n const menuButtonRect = menuButtonElement.getBoundingClientRect()\n dropDownElement.style.opacity = '1'\n const dropDownElementRect = dropDownElement.getBoundingClientRect()\n const margin = 5\n let leftPosition = menuButtonRect.right + margin\n if (\n leftPosition + dropDownElementRect.width > window.innerWidth ||\n leftPosition + dropDownElementRect.width > rootEleRect.right\n ) {\n const position = menuButtonRect.left - dropDownElementRect.width - margin\n leftPosition = (position < 0 ? margin : position) + window.pageXOffset\n }\n dropDownElement.style.left = `${leftPosition + window.pageXOffset}px`\n\n let topPosition = menuButtonRect.top\n if (topPosition + dropDownElementRect.height > window.innerHeight) {\n const position = menuButtonRect.bottom - dropDownElementRect.height\n topPosition = (position < 0 ? margin : position) + window.pageYOffset\n }\n dropDownElement.style.top = `${topPosition}px`\n }\n }, [contextRef, dropDownRef, editor, y])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n dropDownRef.current != null &&\n contextRef.current != null &&\n !dropDownRef.current.contains(event.target as Node) &&\n !contextRef.current.contains(event.target as Node)\n ) {\n setIsMenuOpen(false)\n }\n }\n\n window.addEventListener('click', handleClickOutside)\n\n return () => window.removeEventListener('click', handleClickOutside)\n }, [setIsMenuOpen, contextRef])\n\n const clearTableSelection = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = editor.getElementByKey(\n tableNode.getKey(),\n ) as HTMLTableElementWithWithTableSelectionState\n\n if (!tableElement) {\n throw new Error('Expected to find tableElement in DOM')\n }\n\n const tableSelection = getTableObserverFromTableElement(tableElement)\n if (tableSelection !== null) {\n tableSelection.clearHighlight()\n }\n\n tableNode.markDirty()\n updateTableCellNode(tableCellNode.getLatest())\n }\n\n const rootNode = $getRoot()\n rootNode.selectStart()\n })\n }, [editor, tableCellNode])\n\n const mergeTableCellsAtSelection = () => {\n editor.update(() => {\n const selection = $getSelection()\n if ($isTableSelection(selection)) {\n const { columns, rows } = computeSelectionCount(selection)\n const nodes = selection.getNodes()\n let firstCell: null | TableCellNode = null\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n if ($isTableCellNode(node)) {\n if (firstCell === null) {\n node.setColSpan(columns).setRowSpan(rows)\n firstCell = node\n const isEmpty = $cellContainsEmptyParagraph(node)\n let firstChild\n if (isEmpty && $isParagraphNode((firstChild = node.getFirstChild()))) {\n firstChild.remove()\n }\n } else if ($isTableCellNode(firstCell)) {\n const isEmpty = $cellContainsEmptyParagraph(node)\n if (!isEmpty) {\n firstCell.append(...node.getChildren())\n }\n node.remove()\n }\n }\n }\n if (firstCell !== null) {\n if (firstCell.getChildrenSize() === 0) {\n firstCell.append($createParagraphNode())\n }\n $selectLastDescendant(firstCell)\n }\n onClose()\n }\n })\n }\n\n const unmergeTableCellsAtSelection = () => {\n editor.update(() => {\n $unmergeCell()\n })\n }\n\n const insertTableRowAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n $insertTableRow__EXPERIMENTAL(shouldInsertAfter)\n onClose()\n })\n },\n [editor, onClose],\n )\n\n const insertTableColumnAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.columns; i++) {\n $insertTableColumn__EXPERIMENTAL(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.columns],\n )\n\n const deleteTableRowAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableRow__EXPERIMENTAL()\n onClose()\n })\n }, [editor, onClose])\n\n const deleteTableAtSelection = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n tableNode.remove()\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const deleteTableColumnAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableColumn__EXPERIMENTAL()\n onClose()\n })\n }, [editor, onClose])\n\n const toggleTableRowIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n\n const tableRows = tableNode.getChildren()\n\n if (tableRowIndex >= tableRows.length || tableRowIndex < 0) {\n throw new Error('Expected table cell to be inside of table row.')\n }\n\n const tableRow = tableRows[tableRowIndex]\n\n if (!$isTableRowNode(tableRow)) {\n throw new Error('Expected table row')\n }\n\n tableRow.getChildren().forEach((tableCell) => {\n if (!$isTableCellNode(tableCell)) {\n throw new Error('Expected table cell')\n }\n\n tableCell.toggleHeaderStyle(TableCellHeaderStates.ROW)\n })\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleTableColumnIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode)\n\n const tableRows = tableNode.getChildren<TableRowNode>()\n const maxRowsLength = Math.max(...tableRows.map((row) => row.getChildren().length))\n\n if (tableColumnIndex >= maxRowsLength || tableColumnIndex < 0) {\n throw new Error('Expected table cell to be inside of table row.')\n }\n\n for (let r = 0; r < tableRows.length; r++) {\n const tableRow = tableRows[r]\n\n if (!$isTableRowNode(tableRow)) {\n throw new Error('Expected table row')\n }\n\n const tableCells = tableRow.getChildren()\n if (tableColumnIndex >= tableCells.length) {\n // if cell is outside of bounds for the current row (for example various merge cell cases) we shouldn't highlight it\n continue\n }\n\n const tableCell = tableCells[tableColumnIndex]\n\n if (!$isTableCellNode(tableCell)) {\n throw new Error('Expected table cell')\n }\n\n tableCell.toggleHeaderStyle(TableCellHeaderStates.COLUMN)\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n let mergeCellButton: JSX.Element | null = null\n if (cellMerge) {\n if (canMergeCells) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-merge-cells\"\n onClick={() => mergeTableCellsAtSelection()}\n type=\"button\"\n >\n Merge cells\n </button>\n )\n } else if (canUnmergeCell) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-unmerge-cells\"\n onClick={() => unmergeTableCellsAtSelection()}\n type=\"button\"\n >\n Unmerge cells\n </button>\n )\n }\n }\n\n return createPortal(\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events\n <div\n className=\"table-action-menu-dropdown\"\n onClick={(e) => {\n e.stopPropagation()\n }}\n ref={dropDownRef}\n >\n {mergeCellButton ? (\n <React.Fragment>\n {mergeCellButton}\n <hr />\n </React.Fragment>\n ) : null}\n\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-above\"\n onClick={() => insertTableRowAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} above\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-below\"\n onClick={() => insertTableRowAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} below\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-before\"\n onClick={() => insertTableColumnAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n left\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-after\"\n onClick={() => insertTableColumnAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n right\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-delete-columns\"\n onClick={() => deleteTableColumnAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete column</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete-rows\"\n onClick={() => deleteTableRowAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete row</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete\"\n onClick={() => deleteTableAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete table</span>\n </button>\n <hr />\n <button className=\"item\" onClick={() => toggleTableRowIsHeader()} type=\"button\">\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.ROW) === TableCellHeaderStates.ROW\n ? 'Remove'\n : 'Add'}{' '}\n row header\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-column-header\"\n onClick={() => toggleTableColumnIsHeader()}\n type=\"button\"\n >\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.COLUMN) ===\n TableCellHeaderStates.COLUMN\n ? 'Remove'\n : 'Add'}{' '}\n column header\n </span>\n </button>\n </div>,\n document.body,\n )\n}\n\nfunction TableCellActionMenuContainer({\n anchorElem,\n cellMerge,\n}: {\n anchorElem: HTMLElement\n cellMerge: boolean\n}): JSX.Element {\n const [editor] = useLexicalComposerContext()\n\n const menuButtonRef = useRef(null)\n const menuRootRef = useRef(null)\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n\n const [tableCellNode, setTableMenuCellNode] = useState<null | TableCellNode>(null)\n\n const $moveMenu = useCallback(() => {\n const menu = menuButtonRef.current\n const selection = $getSelection()\n const nativeSelection = window.getSelection()\n const activeElement = document.activeElement\n\n if (selection == null || menu == null) {\n setTableMenuCellNode(null)\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n $isRangeSelection(selection) &&\n rootElement !== null &&\n nativeSelection !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const tableCellNodeFromSelection = $getTableCellNodeFromLexicalNode(\n selection.anchor.getNode(),\n )\n\n if (tableCellNodeFromSelection == null) {\n setTableMenuCellNode(null)\n return\n }\n\n const tableCellParentNodeDOM = editor.getElementByKey(tableCellNodeFromSelection.getKey())\n\n if (tableCellParentNodeDOM == null) {\n setTableMenuCellNode(null)\n return\n }\n\n setTableMenuCellNode(tableCellNodeFromSelection)\n } else if (!activeElement) {\n setTableMenuCellNode(null)\n }\n }, [editor])\n\n useEffect(() => {\n return editor.registerUpdateListener(() => {\n editor.getEditorState().read(() => {\n $moveMenu()\n })\n })\n })\n\n useEffect(() => {\n const menuButtonDOM = menuButtonRef.current as HTMLButtonElement | null\n\n if (menuButtonDOM != null && tableCellNode != null) {\n const tableCellNodeDOM = editor.getElementByKey(tableCellNode.getKey())\n\n if (tableCellNodeDOM != null) {\n const tableCellRect = tableCellNodeDOM.getBoundingClientRect()\n const menuRect = menuButtonDOM.getBoundingClientRect()\n const anchorRect = anchorElem.getBoundingClientRect()\n\n const top = tableCellRect.top - anchorRect.top + 4\n const left = tableCellRect.right - menuRect.width - 10 - anchorRect.left\n\n menuButtonDOM.style.opacity = '1'\n menuButtonDOM.style.transform = `translate(${left}px, ${top}px)`\n } else {\n menuButtonDOM.style.opacity = '0'\n menuButtonDOM.style.transform = 'translate(-10000px, -10000px)'\n }\n }\n }, [menuButtonRef, tableCellNode, editor, anchorElem])\n\n const prevTableCellDOM = useRef(tableCellNode)\n\n useEffect(() => {\n if (prevTableCellDOM.current !== tableCellNode) {\n setIsMenuOpen(false)\n }\n\n prevTableCellDOM.current = tableCellNode\n }, [prevTableCellDOM, tableCellNode])\n\n return (\n <div className=\"table-cell-action-button-container\" ref={menuButtonRef}>\n {tableCellNode != null && (\n <React.Fragment>\n <button\n className=\"table-cell-action-button\"\n onClick={(e) => {\n e.stopPropagation()\n setIsMenuOpen(!isMenuOpen)\n }}\n ref={menuRootRef}\n type=\"button\"\n >\n <MeatballsIcon />\n </button>\n {isMenuOpen && (\n <TableActionMenu\n cellMerge={cellMerge}\n contextRef={menuRootRef}\n onClose={() => setIsMenuOpen(false)}\n setIsMenuOpen={setIsMenuOpen}\n tableCellNode={tableCellNode}\n />\n )}\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableActionMenuPlugin: PluginComponentWithAnchor = ({ anchorElem }) => {\n const isEditable = useLexicalEditable()\n return createPortal(\n isEditable ? (\n <TableCellActionMenuContainer anchorElem={anchorElem ?? document.body} cellMerge />\n ) : null,\n anchorElem ?? document.body,\n )\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["useLexicalComposerContext","useLexicalEditable","$deleteTableColumn__EXPERIMENTAL","$deleteTableRow__EXPERIMENTAL","$getNodeTriplet","$getTableCellNodeFromLexicalNode","$getTableColumnIndexFromTableCellNode","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$insertTableColumn__EXPERIMENTAL","$insertTableRow__EXPERIMENTAL","$isTableCellNode","$isTableRowNode","$isTableSelection","$unmergeCell","getTableObserverFromTableElement","TableCellHeaderStates","TableCellNode","useScrollInfo","$createParagraphNode","$getRoot","$getSelection","$isElementNode","$isParagraphNode","$isRangeSelection","$isTextNode","React","useCallback","useEffect","useRef","useState","createPortal","MeatballsIcon","computeSelectionCount","selection","selectionShape","getShape","columns","toX","fromX","rows","toY","fromY","isTableSelectionRectangular","nodes","getNodes","currentRows","currentRow","expectedColumns","currentColumns","i","length","node","row","getParentOrThrow","Error","colSpan","__colSpan","j","undefined","__rowSpan","every","v","$canUnmerge","isCollapsed","anchor","is","focus","cell","$cellContainsEmptyParagraph","getChildrenSize","firstChild","getFirstChildOrThrow","isEmpty","$selectLastDescendant","lastDescendant","getLastDescendant","select","selectEnd","selectNext","TableActionMenu","cellMerge","contextRef","onClose","setIsMenuOpen","tableCellNode","_tableCellNode","editor","dropDownRef","updateTableCellNode","selectionCounts","updateSelectionCounts","canMergeCells","setCanMergeCells","canUnmergeCell","setCanUnmergeCell","y","registerMutationListener","nodeMutations","nodeUpdated","get","getKey","getEditorState","read","getLatest","skipInitialization","currentSelectionCounts","menuButtonElement","current","dropDownElement","rootElement","getRootElement","rootEleRect","getBoundingClientRect","menuButtonRect","style","opacity","dropDownElementRect","margin","leftPosition","right","width","window","innerWidth","position","left","pageXOffset","topPosition","top","height","innerHeight","bottom","pageYOffset","handleClickOutside","event","contains","target","addEventListener","removeEventListener","clearTableSelection","update","isAttached","tableNode","tableElement","getElementByKey","tableSelection","clearHighlight","markDirty","rootNode","selectStart","mergeTableCellsAtSelection","firstCell","setColSpan","setRowSpan","getFirstChild","remove","append","getChildren","unmergeTableCellsAtSelection","insertTableRowAtSelection","shouldInsertAfter","insertTableColumnAtSelection","deleteTableRowAtSelection","deleteTableAtSelection","deleteTableColumnAtSelection","toggleTableRowIsHeader","tableRowIndex","tableRows","tableRow","forEach","tableCell","toggleHeaderStyle","ROW","toggleTableColumnIsHeader","tableColumnIndex","maxRowsLength","Math","max","map","r","tableCells","COLUMN","mergeCellButton","_jsx","className","onClick","type","_jsxs","e","stopPropagation","ref","Fragment","__headerState","document","body","TableCellActionMenuContainer","anchorElem","menuButtonRef","menuRootRef","isMenuOpen","setTableMenuCellNode","$moveMenu","menu","nativeSelection","getSelection","activeElement","anchorNode","tableCellNodeFromSelection","getNode","tableCellParentNodeDOM","registerUpdateListener","menuButtonDOM","tableCellNodeDOM","tableCellRect","menuRect","anchorRect","transform","prevTableCellDOM","TableActionMenuPlugin","isEditable"],"sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type {\n HTMLTableElementWithWithTableSelectionState,\n TableRowNode,\n TableSelection,\n} from '@lexical/table'\nimport type { ElementNode } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $deleteTableColumn__EXPERIMENTAL,\n $deleteTableRow__EXPERIMENTAL,\n $getNodeTriplet,\n $getTableCellNodeFromLexicalNode,\n $getTableColumnIndexFromTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumn__EXPERIMENTAL,\n $insertTableRow__EXPERIMENTAL,\n $isTableCellNode,\n $isTableRowNode,\n $isTableSelection,\n $unmergeCell,\n getTableObserverFromTableElement,\n TableCellHeaderStates,\n TableCellNode,\n} from '@lexical/table'\nimport { useScrollInfo } from '@payloadcms/ui'\nimport {\n $createParagraphNode,\n $getRoot,\n $getSelection,\n $isElementNode,\n $isParagraphNode,\n $isRangeSelection,\n $isTextNode,\n} from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponentWithAnchor } from '../../../../typesClient.js'\n\nimport { MeatballsIcon } from '../../../../../lexical/ui/icons/Meatballs/index.js'\nimport './index.scss'\n\nfunction computeSelectionCount(selection: TableSelection): {\n columns: number\n rows: number\n} {\n const selectionShape = selection.getShape()\n return {\n columns: selectionShape.toX - selectionShape.fromX + 1,\n rows: selectionShape.toY - selectionShape.fromY + 1,\n }\n}\n\n// This is important when merging cells as there is no good way to re-merge weird shapes (a result\n// of selecting merged cells and non-merged)\nfunction isTableSelectionRectangular(selection: TableSelection): boolean {\n const nodes = selection.getNodes()\n const currentRows: Array<number> = []\n let currentRow: null | TableRowNode = null\n let expectedColumns: null | number = null\n let currentColumns = 0\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n if ($isTableCellNode(node)) {\n const row = node.getParentOrThrow()\n if (!$isTableRowNode(row)) {\n throw new Error('Expected CellNode to have a RowNode parent')\n }\n if (currentRow !== row) {\n if (expectedColumns !== null && currentColumns !== expectedColumns) {\n return false\n }\n if (currentRow !== null) {\n expectedColumns = currentColumns\n }\n currentRow = row\n currentColumns = 0\n }\n const colSpan = node.__colSpan\n for (let j = 0; j < colSpan; j++) {\n if (currentRows[currentColumns + j] === undefined) {\n currentRows[currentColumns + j] = 0\n }\n currentRows[currentColumns + j] += node.__rowSpan\n }\n currentColumns += colSpan\n }\n }\n return (\n (expectedColumns === null || currentColumns === expectedColumns) &&\n currentRows.every((v) => v === currentRows[0])\n )\n}\n\nfunction $canUnmerge(): boolean {\n const selection = $getSelection()\n if (\n ($isRangeSelection(selection) && !selection.isCollapsed()) ||\n ($isTableSelection(selection) && !selection.anchor.is(selection.focus)) ||\n (!$isRangeSelection(selection) && !$isTableSelection(selection))\n ) {\n return false\n }\n const [cell] = $getNodeTriplet(selection.anchor)\n return cell.__colSpan > 1 || cell.__rowSpan > 1\n}\n\nfunction $cellContainsEmptyParagraph(cell: TableCellNode): boolean {\n if (cell.getChildrenSize() !== 1) {\n return false\n }\n const firstChild = cell.getFirstChildOrThrow()\n if (!$isParagraphNode(firstChild) || !firstChild.isEmpty()) {\n return false\n }\n return true\n}\n\nfunction $selectLastDescendant(node: ElementNode): void {\n const lastDescendant = node.getLastDescendant()\n if ($isTextNode(lastDescendant)) {\n lastDescendant.select()\n } else if ($isElementNode(lastDescendant)) {\n lastDescendant.selectEnd()\n } else if (lastDescendant !== null) {\n lastDescendant.selectNext()\n }\n}\n\ntype TableCellActionMenuProps = Readonly<{\n cellMerge: boolean\n contextRef: { current: HTMLElement | null }\n onClose: () => void\n setIsMenuOpen: (isOpen: boolean) => void\n tableCellNode: TableCellNode\n}>\n\nfunction TableActionMenu({\n cellMerge,\n contextRef,\n onClose,\n setIsMenuOpen,\n tableCellNode: _tableCellNode,\n}: TableCellActionMenuProps) {\n const [editor] = useLexicalComposerContext()\n const dropDownRef = useRef<HTMLDivElement | null>(null)\n const [tableCellNode, updateTableCellNode] = useState(_tableCellNode)\n const [selectionCounts, updateSelectionCounts] = useState({\n columns: 1,\n rows: 1,\n })\n const [canMergeCells, setCanMergeCells] = useState(false)\n const [canUnmergeCell, setCanUnmergeCell] = useState(false)\n const { y } = useScrollInfo()\n\n useEffect(() => {\n return editor.registerMutationListener(\n TableCellNode,\n (nodeMutations) => {\n const nodeUpdated = nodeMutations.get(tableCellNode.getKey()) === 'updated'\n\n if (nodeUpdated) {\n editor.getEditorState().read(() => {\n updateTableCellNode(tableCellNode.getLatest())\n })\n }\n },\n { skipInitialization: true },\n )\n }, [editor, tableCellNode])\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n const selection = $getSelection()\n // Merge cells\n if ($isTableSelection(selection)) {\n const currentSelectionCounts = computeSelectionCount(selection)\n updateSelectionCounts(computeSelectionCount(selection))\n setCanMergeCells(\n isTableSelectionRectangular(selection) &&\n (currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1),\n )\n }\n // Unmerge cell\n setCanUnmergeCell($canUnmerge())\n })\n }, [editor])\n\n useEffect(() => {\n const menuButtonElement = contextRef.current\n const dropDownElement = dropDownRef.current\n const rootElement = editor.getRootElement()\n\n if (menuButtonElement != null && dropDownElement != null && rootElement != null) {\n const rootEleRect = rootElement.getBoundingClientRect()\n const menuButtonRect = menuButtonElement.getBoundingClientRect()\n dropDownElement.style.opacity = '1'\n const dropDownElementRect = dropDownElement.getBoundingClientRect()\n const margin = 5\n let leftPosition = menuButtonRect.right + margin\n if (\n leftPosition + dropDownElementRect.width > window.innerWidth ||\n leftPosition + dropDownElementRect.width > rootEleRect.right\n ) {\n const position = menuButtonRect.left - dropDownElementRect.width - margin\n leftPosition = (position < 0 ? margin : position) + window.pageXOffset\n }\n dropDownElement.style.left = `${leftPosition + window.pageXOffset}px`\n\n let topPosition = menuButtonRect.top\n if (topPosition + dropDownElementRect.height > window.innerHeight) {\n const position = menuButtonRect.bottom - dropDownElementRect.height\n topPosition = (position < 0 ? margin : position) + window.pageYOffset\n }\n dropDownElement.style.top = `${topPosition}px`\n }\n }, [contextRef, dropDownRef, editor, y])\n\n useEffect(() => {\n function handleClickOutside(event: MouseEvent) {\n if (\n dropDownRef.current != null &&\n contextRef.current != null &&\n !dropDownRef.current.contains(event.target as Node) &&\n !contextRef.current.contains(event.target as Node)\n ) {\n setIsMenuOpen(false)\n }\n }\n\n window.addEventListener('click', handleClickOutside)\n\n return () => window.removeEventListener('click', handleClickOutside)\n }, [setIsMenuOpen, contextRef])\n\n const clearTableSelection = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = editor.getElementByKey(\n tableNode.getKey(),\n ) as HTMLTableElementWithWithTableSelectionState\n\n if (!tableElement) {\n throw new Error('Expected to find tableElement in DOM')\n }\n\n const tableSelection = getTableObserverFromTableElement(tableElement)\n if (tableSelection !== null) {\n tableSelection.clearHighlight()\n }\n\n tableNode.markDirty()\n updateTableCellNode(tableCellNode.getLatest())\n }\n\n const rootNode = $getRoot()\n rootNode.selectStart()\n })\n }, [editor, tableCellNode])\n\n const mergeTableCellsAtSelection = () => {\n editor.update(() => {\n const selection = $getSelection()\n if ($isTableSelection(selection)) {\n const { columns, rows } = computeSelectionCount(selection)\n const nodes = selection.getNodes()\n let firstCell: null | TableCellNode = null\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]\n if ($isTableCellNode(node)) {\n if (firstCell === null) {\n node.setColSpan(columns).setRowSpan(rows)\n firstCell = node\n const isEmpty = $cellContainsEmptyParagraph(node)\n let firstChild\n if (isEmpty && $isParagraphNode((firstChild = node.getFirstChild()))) {\n firstChild.remove()\n }\n } else if ($isTableCellNode(firstCell)) {\n const isEmpty = $cellContainsEmptyParagraph(node)\n if (!isEmpty) {\n firstCell.append(...node.getChildren())\n }\n node.remove()\n }\n }\n }\n if (firstCell !== null) {\n if (firstCell.getChildrenSize() === 0) {\n firstCell.append($createParagraphNode())\n }\n $selectLastDescendant(firstCell)\n }\n onClose()\n }\n })\n }\n\n const unmergeTableCellsAtSelection = () => {\n editor.update(() => {\n $unmergeCell()\n })\n }\n\n const insertTableRowAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n $insertTableRow__EXPERIMENTAL(shouldInsertAfter)\n onClose()\n })\n },\n [editor, onClose],\n )\n\n const insertTableColumnAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.columns; i++) {\n $insertTableColumn__EXPERIMENTAL(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.columns],\n )\n\n const deleteTableRowAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableRow__EXPERIMENTAL()\n onClose()\n })\n }, [editor, onClose])\n\n const deleteTableAtSelection = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n tableNode.remove()\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const deleteTableColumnAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableColumn__EXPERIMENTAL()\n onClose()\n })\n }, [editor, onClose])\n\n const toggleTableRowIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n\n const tableRows = tableNode.getChildren()\n\n if (tableRowIndex >= tableRows.length || tableRowIndex < 0) {\n throw new Error('Expected table cell to be inside of table row.')\n }\n\n const tableRow = tableRows[tableRowIndex]\n\n if (!$isTableRowNode(tableRow)) {\n throw new Error('Expected table row')\n }\n\n tableRow.getChildren().forEach((tableCell) => {\n if (!$isTableCellNode(tableCell)) {\n throw new Error('Expected table cell')\n }\n\n tableCell.toggleHeaderStyle(TableCellHeaderStates.ROW)\n })\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleTableColumnIsHeader = useCallback(() => {\n editor.update(() => {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const tableColumnIndex = $getTableColumnIndexFromTableCellNode(tableCellNode)\n\n const tableRows = tableNode.getChildren<TableRowNode>()\n const maxRowsLength = Math.max(...tableRows.map((row) => row.getChildren().length))\n\n if (tableColumnIndex >= maxRowsLength || tableColumnIndex < 0) {\n throw new Error('Expected table cell to be inside of table row.')\n }\n\n for (let r = 0; r < tableRows.length; r++) {\n const tableRow = tableRows[r]\n\n if (!$isTableRowNode(tableRow)) {\n throw new Error('Expected table row')\n }\n\n const tableCells = tableRow.getChildren()\n if (tableColumnIndex >= tableCells.length) {\n // if cell is outside of bounds for the current row (for example various merge cell cases) we shouldn't highlight it\n continue\n }\n\n const tableCell = tableCells[tableColumnIndex]\n\n if (!$isTableCellNode(tableCell)) {\n throw new Error('Expected table cell')\n }\n\n tableCell.toggleHeaderStyle(TableCellHeaderStates.COLUMN)\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n let mergeCellButton: JSX.Element | null = null\n if (cellMerge) {\n if (canMergeCells) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-merge-cells\"\n onClick={() => mergeTableCellsAtSelection()}\n type=\"button\"\n >\n Merge cells\n </button>\n )\n } else if (canUnmergeCell) {\n mergeCellButton = (\n <button\n className=\"item\"\n data-test-id=\"table-unmerge-cells\"\n onClick={() => unmergeTableCellsAtSelection()}\n type=\"button\"\n >\n Unmerge cells\n </button>\n )\n }\n }\n\n return createPortal(\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events\n <div\n className=\"table-action-menu-dropdown\"\n onClick={(e) => {\n e.stopPropagation()\n }}\n ref={dropDownRef}\n >\n {mergeCellButton ? (\n <React.Fragment>\n {mergeCellButton}\n <hr />\n </React.Fragment>\n ) : null}\n\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-above\"\n onClick={() => insertTableRowAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} above\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-row-below\"\n onClick={() => insertTableRowAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.rows === 1 ? 'row' : `${selectionCounts.rows} rows`} below\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-before\"\n onClick={() => insertTableColumnAtSelection(false)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n left\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-insert-column-after\"\n onClick={() => insertTableColumnAtSelection(true)}\n type=\"button\"\n >\n <span className=\"text\">\n Insert {selectionCounts.columns === 1 ? 'column' : `${selectionCounts.columns} columns`}{' '}\n right\n </span>\n </button>\n <hr />\n <button\n className=\"item\"\n data-test-id=\"table-delete-columns\"\n onClick={() => deleteTableColumnAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete column</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete-rows\"\n onClick={() => deleteTableRowAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete row</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-delete\"\n onClick={() => deleteTableAtSelection()}\n type=\"button\"\n >\n <span className=\"text\">Delete table</span>\n </button>\n <hr />\n <button className=\"item\" onClick={() => toggleTableRowIsHeader()} type=\"button\">\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.ROW) === TableCellHeaderStates.ROW\n ? 'Remove'\n : 'Add'}{' '}\n row header\n </span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-column-header\"\n onClick={() => toggleTableColumnIsHeader()}\n type=\"button\"\n >\n <span className=\"text\">\n {(tableCellNode.__headerState & TableCellHeaderStates.COLUMN) ===\n TableCellHeaderStates.COLUMN\n ? 'Remove'\n : 'Add'}{' '}\n column header\n </span>\n </button>\n </div>,\n document.body,\n )\n}\n\nfunction TableCellActionMenuContainer({\n anchorElem,\n cellMerge,\n}: {\n anchorElem: HTMLElement\n cellMerge: boolean\n}): JSX.Element {\n const [editor] = useLexicalComposerContext()\n\n const menuButtonRef = useRef(null)\n const menuRootRef = useRef(null)\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n\n const [tableCellNode, setTableMenuCellNode] = useState<null | TableCellNode>(null)\n\n const $moveMenu = useCallback(() => {\n const menu = menuButtonRef.current\n const selection = $getSelection()\n const nativeSelection = window.getSelection()\n const activeElement = document.activeElement\n\n if (selection == null || menu == null) {\n setTableMenuCellNode(null)\n return\n }\n\n const rootElement = editor.getRootElement()\n\n if (\n $isRangeSelection(selection) &&\n rootElement !== null &&\n nativeSelection !== null &&\n rootElement.contains(nativeSelection.anchorNode)\n ) {\n const tableCellNodeFromSelection = $getTableCellNodeFromLexicalNode(\n selection.anchor.getNode(),\n )\n\n if (tableCellNodeFromSelection == null) {\n setTableMenuCellNode(null)\n return\n }\n\n const tableCellParentNodeDOM = editor.getElementByKey(tableCellNodeFromSelection.getKey())\n\n if (tableCellParentNodeDOM == null) {\n setTableMenuCellNode(null)\n return\n }\n\n setTableMenuCellNode(tableCellNodeFromSelection)\n } else if (!activeElement) {\n setTableMenuCellNode(null)\n }\n }, [editor])\n\n useEffect(() => {\n return editor.registerUpdateListener(() => {\n editor.getEditorState().read(() => {\n $moveMenu()\n })\n })\n })\n\n useEffect(() => {\n const menuButtonDOM = menuButtonRef.current as HTMLButtonElement | null\n\n if (menuButtonDOM != null && tableCellNode != null) {\n const tableCellNodeDOM = editor.getElementByKey(tableCellNode.getKey())\n\n if (tableCellNodeDOM != null) {\n const tableCellRect = tableCellNodeDOM.getBoundingClientRect()\n const menuRect = menuButtonDOM.getBoundingClientRect()\n const anchorRect = anchorElem.getBoundingClientRect()\n\n const top = tableCellRect.top - anchorRect.top + 4\n const left = tableCellRect.right - menuRect.width - 10 - anchorRect.left\n\n menuButtonDOM.style.opacity = '1'\n menuButtonDOM.style.transform = `translate(${left}px, ${top}px)`\n } else {\n menuButtonDOM.style.opacity = '0'\n menuButtonDOM.style.transform = 'translate(-10000px, -10000px)'\n }\n }\n }, [menuButtonRef, tableCellNode, editor, anchorElem])\n\n const prevTableCellDOM = useRef(tableCellNode)\n\n useEffect(() => {\n if (prevTableCellDOM.current !== tableCellNode) {\n setIsMenuOpen(false)\n }\n\n prevTableCellDOM.current = tableCellNode\n }, [prevTableCellDOM, tableCellNode])\n\n return (\n <div className=\"table-cell-action-button-container\" ref={menuButtonRef}>\n {tableCellNode != null && (\n <React.Fragment>\n <button\n className=\"table-cell-action-button\"\n onClick={(e) => {\n e.stopPropagation()\n setIsMenuOpen(!isMenuOpen)\n }}\n ref={menuRootRef}\n type=\"button\"\n >\n <MeatballsIcon />\n </button>\n {isMenuOpen && (\n <TableActionMenu\n cellMerge={cellMerge}\n contextRef={menuRootRef}\n onClose={() => setIsMenuOpen(false)}\n setIsMenuOpen={setIsMenuOpen}\n tableCellNode={tableCellNode}\n />\n )}\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableActionMenuPlugin: PluginComponentWithAnchor = ({ anchorElem }) => {\n const isEditable = useLexicalEditable()\n return createPortal(\n isEditable ? (\n <TableCellActionMenuContainer anchorElem={anchorElem ?? document.body} cellMerge />\n ) : null,\n anchorElem ?? document.body,\n )\n}\n"],"mappings":"AAAA;;;AAUA,SAASA,yBAAyB,QAAQ;AAC1C,SAASC,kBAAkB,QAAQ;AACnC,SACEC,gCAAgC,EAChCC,6BAA6B,EAC7BC,eAAe,EACfC,gCAAgC,EAChCC,qCAAqC,EACrCC,mCAAmC,EACnCC,kCAAkC,EAClCC,gCAAgC,EAChCC,6BAA6B,EAC7BC,gBAAgB,EAChBC,eAAe,EACfC,iBAAiB,EACjBC,YAAY,EACZC,gCAAgC,EAChCC,qBAAqB,EACrBC,aAAa,QACR;AACP,SAASC,aAAa,QAAQ;AAC9B,SACEC,oBAAoB,EACpBC,QAAQ,EACRC,aAAa,EACbC,cAAc,EACdC,gBAAgB,EAChBC,iBAAiB,EACjBC,WAAW,QACN;AACP,YAAYC,KAAA,MAAW;AACvB,SAASC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ;AACzD,SAASC,YAAY,QAAQ;AAI7B,SAASC,aAAa,QAAQ;AAG9B,SAASC,sBAAsBC,SAAyB;EAItD,MAAMC,cAAA,GAAiBD,SAAA,CAAUE,QAAQ;EACzC,OAAO;IACLC,OAAA,EAASF,cAAA,CAAeG,GAAG,GAAGH,cAAA,CAAeI,KAAK,GAAG;IACrDC,IAAA,EAAML,cAAA,CAAeM,GAAG,GAAGN,cAAA,CAAeO,KAAK,GAAG;EACpD;AACF;AAEA;AACA;AACA,SAASC,4BAA4BT,SAAyB;EAC5D,MAAMU,KAAA,GAAQV,SAAA,CAAUW,QAAQ;EAChC,MAAMC,WAAA,GAA6B,EAAE;EACrC,IAAIC,UAAA,GAAkC;EACtC,IAAIC,eAAA,GAAiC;EACrC,IAAIC,cAAA,GAAiB;EACrB,KAAK,IAAIC,CAAA,GAAI,GAAGA,CAAA,GAAIN,KAAA,CAAMO,MAAM,EAAED,CAAA,IAAK;IACrC,MAAME,IAAA,GAAOR,KAAK,CAACM,CAAA,CAAE;IACrB,IAAIvC,gBAAA,CAAiByC,IAAA,GAAO;MAC1B,MAAMC,GAAA,GAAMD,IAAA,CAAKE,gBAAgB;MACjC,IAAI,CAAC1C,eAAA,CAAgByC,GAAA,GAAM;QACzB,MAAM,IAAIE,KAAA,CAAM;MAClB;MACA,IAAIR,UAAA,KAAeM,GAAA,EAAK;QACtB,IAAIL,eAAA,KAAoB,QAAQC,cAAA,KAAmBD,eAAA,EAAiB;UAClE,OAAO;QACT;QACA,IAAID,UAAA,KAAe,MAAM;UACvBC,eAAA,GAAkBC,cAAA;QACpB;QACAF,UAAA,GAAaM,GAAA;QACbJ,cAAA,GAAiB;MACnB;MACA,MAAMO,OAAA,GAAUJ,IAAA,CAAKK,SAAS;MAC9B,KAAK,IAAIC,CAAA,GAAI,GAAGA,CAAA,GAAIF,OAAA,EAASE,CAAA,IAAK;QAChC,IAAIZ,WAAW,CAACG,cAAA,GAAiBS,CAAA,CAAE,KAAKC,SAAA,EAAW;UACjDb,WAAW,CAACG,cAAA,GAAiBS,CAAA,CAAE,GAAG;QACpC;QACAZ,WAAW,CAACG,cAAA,GAAiBS,CAAA,CAAE,IAAIN,IAAA,CAAKQ,SAAS;MACnD;MACAX,cAAA,IAAkBO,OAAA;IACpB;EACF;EACA,OACE,CAACR,eAAA,KAAoB,QAAQC,cAAA,KAAmBD,eAAc,KAC9DF,WAAA,CAAYe,KAAK,CAAEC,CAAA,IAAMA,CAAA,KAAMhB,WAAW,CAAC,EAAE;AAEjD;AAEA,SAASiB,YAAA;EACP,MAAM7B,SAAA,GAAYb,aAAA;EAClB,IACEG,iBAAC,CAAkBU,SAAA,KAAc,CAACA,SAAA,CAAU8B,WAAW,MACtDnD,iBAAA,CAAkBqB,SAAA,KAAc,CAACA,SAAA,CAAU+B,MAAM,CAACC,EAAE,CAAChC,SAAA,CAAUiC,KAAK,KACpE,CAAC3C,iBAAA,CAAkBU,SAAA,KAAc,CAACrB,iBAAA,CAAkBqB,SAAA,GACrD;IACA,OAAO;EACT;EACA,MAAM,CAACkC,IAAA,CAAK,GAAGhE,eAAA,CAAgB8B,SAAA,CAAU+B,MAAM;EAC/C,OAAOG,IAAA,CAAKX,SAAS,GAAG,KAAKW,IAAA,CAAKR,SAAS,GAAG;AAChD;AAEA,SAASS,4BAA4BD,IAAmB;EACtD,IAAIA,IAAA,CAAKE,eAAe,OAAO,GAAG;IAChC,OAAO;EACT;EACA,MAAMC,UAAA,GAAaH,IAAA,CAAKI,oBAAoB;EAC5C,IAAI,CAACjD,gBAAA,CAAiBgD,UAAA,KAAe,CAACA,UAAA,CAAWE,OAAO,IAAI;IAC1D,OAAO;EACT;EACA,OAAO;AACT;AAEA,SAASC,sBAAsBtB,IAAiB;EAC9C,MAAMuB,cAAA,GAAiBvB,IAAA,CAAKwB,iBAAiB;EAC7C,IAAInD,WAAA,CAAYkD,cAAA,GAAiB;IAC/BA,cAAA,CAAeE,MAAM;EACvB,OAAO,IAAIvD,cAAA,CAAeqD,cAAA,GAAiB;IACzCA,cAAA,CAAeG,SAAS;EAC1B,OAAO,IAAIH,cAAA,KAAmB,MAAM;IAClCA,cAAA,CAAeI,UAAU;EAC3B;AACF;AAUA,SAASC,gBAAgB;EACvBC,SAAS;EACTC,UAAU;EACVC,OAAO;EACPC,aAAa;EACbC,aAAA,EAAeC;AAAc,CACJ;EACzB,MAAM,CAACC,MAAA,CAAO,GAAGvF,yBAAA;EACjB,MAAMwF,WAAA,GAAc3D,MAAA,CAA8B;EAClD,MAAM,CAACwD,aAAA,EAAeI,mBAAA,CAAoB,GAAG3D,QAAA,CAASwD,cAAA;EACtD,MAAM,CAACI,eAAA,EAAiBC,qBAAA,CAAsB,GAAG7D,QAAA,CAAS;IACxDO,OAAA,EAAS;IACTG,IAAA,EAAM;EACR;EACA,MAAM,CAACoD,aAAA,EAAeC,gBAAA,CAAiB,GAAG/D,QAAA,CAAS;EACnD,MAAM,CAACgE,cAAA,EAAgBC,iBAAA,CAAkB,GAAGjE,QAAA,CAAS;EACrD,MAAM;IAAEkE;EAAC,CAAE,GAAG9E,aAAA;EAEdU,SAAA,CAAU;IACR,OAAO2D,MAAA,CAAOU,wBAAwB,CACpChF,aAAA,EACCiF,aAAA;MACC,MAAMC,WAAA,GAAcD,aAAA,CAAcE,GAAG,CAACf,aAAA,CAAcgB,MAAM,QAAQ;MAElE,IAAIF,WAAA,EAAa;QACfZ,MAAA,CAAOe,cAAc,GAAGC,IAAI,CAAC;UAC3Bd,mBAAA,CAAoBJ,aAAA,CAAcmB,SAAS;QAC7C;MACF;IACF,GACA;MAAEC,kBAAA,EAAoB;IAAK;EAE/B,GAAG,CAAClB,MAAA,EAAQF,aAAA,CAAc;EAE1BzD,SAAA,CAAU;IACR2D,MAAA,CAAOe,cAAc,GAAGC,IAAI,CAAC;MAC3B,MAAMrE,SAAA,GAAYb,aAAA;MAClB;MACA,IAAIR,iBAAA,CAAkBqB,SAAA,GAAY;QAChC,MAAMwE,sBAAA,GAAyBzE,qBAAA,CAAsBC,SAAA;QACrDyD,qBAAA,CAAsB1D,qBAAA,CAAsBC,SAAA;QAC5C2D,gBAAA,CACElD,2BAAA,CAA4BT,SAAA,MACzBwE,sBAAA,CAAuBrE,OAAO,GAAG,KAAKqE,sBAAA,CAAuBlE,IAAI,GAAG;MAE3E;MACA;MACAuD,iBAAA,CAAkBhC,WAAA;IACpB;EACF,GAAG,CAACwB,MAAA,CAAO;EAEX3D,SAAA,CAAU;IACR,MAAM+E,iBAAA,GAAoBzB,UAAA,CAAW0B,OAAO;IAC5C,MAAMC,eAAA,GAAkBrB,WAAA,CAAYoB,OAAO;IAC3C,MAAME,WAAA,GAAcvB,MAAA,CAAOwB,cAAc;IAEzC,IAAIJ,iBAAA,IAAqB,QAAQE,eAAA,IAAmB,QAAQC,WAAA,IAAe,MAAM;MAC/E,MAAME,WAAA,GAAcF,WAAA,CAAYG,qBAAqB;MACrD,MAAMC,cAAA,GAAiBP,iBAAA,CAAkBM,qBAAqB;MAC9DJ,eAAA,CAAgBM,KAAK,CAACC,OAAO,GAAG;MAChC,MAAMC,mBAAA,GAAsBR,eAAA,CAAgBI,qBAAqB;MACjE,MAAMK,MAAA,GAAS;MACf,IAAIC,YAAA,GAAeL,cAAA,CAAeM,KAAK,GAAGF,MAAA;MAC1C,IACEC,YAAA,GAAeF,mBAAA,CAAoBI,KAAK,GAAGC,MAAA,CAAOC,UAAU,IAC5DJ,YAAA,GAAeF,mBAAA,CAAoBI,KAAK,GAAGT,WAAA,CAAYQ,KAAK,EAC5D;QACA,MAAMI,QAAA,GAAWV,cAAA,CAAeW,IAAI,GAAGR,mBAAA,CAAoBI,KAAK,GAAGH,MAAA;QACnEC,YAAA,GAAe,CAACK,QAAA,GAAW,IAAIN,MAAA,GAASM,QAAO,IAAKF,MAAA,CAAOI,WAAW;MACxE;MACAjB,eAAA,CAAgBM,KAAK,CAACU,IAAI,GAAG,GAAGN,YAAA,GAAeG,MAAA,CAAOI,WAAW,IAAI;MAErE,IAAIC,WAAA,GAAcb,cAAA,CAAec,GAAG;MACpC,IAAID,WAAA,GAAcV,mBAAA,CAAoBY,MAAM,GAAGP,MAAA,CAAOQ,WAAW,EAAE;QACjE,MAAMN,UAAA,GAAWV,cAAA,CAAeiB,MAAM,GAAGd,mBAAA,CAAoBY,MAAM;QACnEF,WAAA,GAAc,CAACH,UAAA,GAAW,IAAIN,MAAA,GAASM,UAAO,IAAKF,MAAA,CAAOU,WAAW;MACvE;MACAvB,eAAA,CAAgBM,KAAK,CAACa,GAAG,GAAG,GAAGD,WAAA,IAAe;IAChD;EACF,GAAG,CAAC7C,UAAA,EAAYM,WAAA,EAAaD,MAAA,EAAQS,CAAA,CAAE;EAEvCpE,SAAA,CAAU;IACR,SAASyG,mBAAmBC,KAAiB;MAC3C,IACE9C,WAAA,CAAYoB,OAAO,IAAI,QACvB1B,UAAA,CAAW0B,OAAO,IAAI,QACtB,CAACpB,WAAA,CAAYoB,OAAO,CAAC2B,QAAQ,CAACD,KAAA,CAAME,MAAM,KAC1C,CAACtD,UAAA,CAAW0B,OAAO,CAAC2B,QAAQ,CAACD,KAAA,CAAME,MAAM,GACzC;QACApD,aAAA,CAAc;MAChB;IACF;IAEAsC,MAAA,CAAOe,gBAAgB,CAAC,SAASJ,kBAAA;IAEjC,OAAO,MAAMX,MAAA,CAAOgB,mBAAmB,CAAC,SAASL,kBAAA;EACnD,GAAG,CAACjD,aAAA,EAAeF,UAAA,CAAW;EAE9B,MAAMyD,mBAAA,GAAsBhH,WAAA,CAAY;IACtC4D,MAAA,CAAOqD,MAAM,CAAC;MACZ,IAAIvD,aAAA,CAAcwD,UAAU,IAAI;QAC9B,MAAMC,SAAA,GAAYvI,mCAAA,CAAoC8E,aAAA;QACtD,MAAM0D,YAAA,GAAexD,MAAA,CAAOyD,eAAe,CACzCF,SAAA,CAAUzC,MAAM;QAGlB,IAAI,CAAC0C,YAAA,EAAc;UACjB,MAAM,IAAIxF,KAAA,CAAM;QAClB;QAEA,MAAM0F,cAAA,GAAiBlI,gCAAA,CAAiCgI,YAAA;QACxD,IAAIE,cAAA,KAAmB,MAAM;UAC3BA,cAAA,CAAeC,cAAc;QAC/B;QAEAJ,SAAA,CAAUK,SAAS;QACnB1D,mBAAA,CAAoBJ,aAAA,CAAcmB,SAAS;MAC7C;MAEA,MAAM4C,QAAA,GAAWhI,QAAA;MACjBgI,QAAA,CAASC,WAAW;IACtB;EACF,GAAG,CAAC9D,MAAA,EAAQF,aAAA,CAAc;EAE1B,MAAMiE,0BAAA,GAA6BA,CAAA;IACjC/D,MAAA,CAAOqD,MAAM,CAAC;MACZ,MAAM1G,WAAA,GAAYb,aAAA;MAClB,IAAIR,iBAAA,CAAkBqB,WAAA,GAAY;QAChC,MAAM;UAAEG,OAAO;UAAEG;QAAI,CAAE,GAAGP,qBAAA,CAAsBC,WAAA;QAChD,MAAMU,KAAA,GAAQV,WAAA,CAAUW,QAAQ;QAChC,IAAI0G,SAAA,GAAkC;QACtC,KAAK,IAAIrG,CAAA,GAAI,GAAGA,CAAA,GAAIN,KAAA,CAAMO,MAAM,EAAED,CAAA,IAAK;UACrC,MAAME,IAAA,GAAOR,KAAK,CAACM,CAAA,CAAE;UACrB,IAAIvC,gBAAA,CAAiByC,IAAA,GAAO;YAC1B,IAAImG,SAAA,KAAc,MAAM;cACtBnG,IAAA,CAAKoG,UAAU,CAACnH,OAAA,EAASoH,UAAU,CAACjH,IAAA;cACpC+G,SAAA,GAAYnG,IAAA;cACZ,MAAMqB,OAAA,GAAUJ,2BAAA,CAA4BjB,IAAA;cAC5C,IAAImB,UAAA;cACJ,IAAIE,OAAA,IAAWlD,gBAAA,CAAkBgD,UAAA,GAAanB,IAAA,CAAKsG,aAAa,KAAM;gBACpEnF,UAAA,CAAWoF,MAAM;cACnB;YACF,OAAO,IAAIhJ,gBAAA,CAAiB4I,SAAA,GAAY;cACtC,MAAM9E,SAAA,GAAUJ,2BAAA,CAA4BjB,IAAA;cAC5C,IAAI,CAACqB,SAAA,EAAS;gBACZ8E,SAAA,CAAUK,MAAM,IAAIxG,IAAA,CAAKyG,WAAW;cACtC;cACAzG,IAAA,CAAKuG,MAAM;YACb;UACF;QACF;QACA,IAAIJ,SAAA,KAAc,MAAM;UACtB,IAAIA,SAAA,CAAUjF,eAAe,OAAO,GAAG;YACrCiF,SAAA,CAAUK,MAAM,CAACzI,oBAAA;UACnB;UACAuD,qBAAA,CAAsB6E,SAAA;QACxB;QACApE,OAAA;MACF;IACF;EACF;EAEA,MAAM2E,4BAAA,GAA+BA,CAAA;IACnCvE,MAAA,CAAOqD,MAAM,CAAC;MACZ9H,YAAA;IACF;EACF;EAEA,MAAMiJ,yBAAA,GAA4BpI,WAAA,CAC/BqI,iBAAA;IACCzE,MAAA,CAAOqD,MAAM,CAAC;MACZlI,6BAAA,CAA8BsJ,iBAAA;MAC9B7E,OAAA;IACF;EACF,GACA,CAACI,MAAA,EAAQJ,OAAA,CAAQ;EAGnB,MAAM8E,4BAAA,GAA+BtI,WAAA,CAClCqI,mBAAA;IACCzE,MAAA,CAAOqD,MAAM,CAAC;MACZ,KAAK,IAAI1F,GAAA,GAAI,GAAGA,GAAA,GAAIwC,eAAA,CAAgBrD,OAAO,EAAEa,GAAA,IAAK;QAChDzC,gCAAA,CAAiCuJ,mBAAA;MACnC;MACA7E,OAAA;IACF;EACF,GACA,CAACI,MAAA,EAAQJ,OAAA,EAASO,eAAA,CAAgBrD,OAAO,CAAC;EAG5C,MAAM6H,yBAAA,GAA4BvI,WAAA,CAAY;IAC5C4D,MAAA,CAAOqD,MAAM,CAAC;MACZzI,6BAAA;MACAgF,OAAA;IACF;EACF,GAAG,CAACI,MAAA,EAAQJ,OAAA,CAAQ;EAEpB,MAAMgF,sBAAA,GAAyBxI,WAAA,CAAY;IACzC4D,MAAA,CAAOqD,MAAM,CAAC;MACZ,MAAME,WAAA,GAAYvI,mCAAA,CAAoC8E,aAAA;MACtDyD,WAAA,CAAUa,MAAM;MAEhBhB,mBAAA;MACAxD,OAAA;IACF;EACF,GAAG,CAACI,MAAA,EAAQF,aAAA,EAAesD,mBAAA,EAAqBxD,OAAA,CAAQ;EAExD,MAAMiF,4BAAA,GAA+BzI,WAAA,CAAY;IAC/C4D,MAAA,CAAOqD,MAAM,CAAC;MACZ1I,gCAAA;MACAiF,OAAA;IACF;EACF,GAAG,CAACI,MAAA,EAAQJ,OAAA,CAAQ;EAEpB,MAAMkF,sBAAA,GAAyB1I,WAAA,CAAY;IACzC4D,MAAA,CAAOqD,MAAM,CAAC;MACZ,MAAME,WAAA,GAAYvI,mCAAA,CAAoC8E,aAAA;MAEtD,MAAMiF,aAAA,GAAgB9J,kCAAA,CAAmC6E,aAAA;MAEzD,MAAMkF,SAAA,GAAYzB,WAAA,CAAUe,WAAW;MAEvC,IAAIS,aAAA,IAAiBC,SAAA,CAAUpH,MAAM,IAAImH,aAAA,GAAgB,GAAG;QAC1D,MAAM,IAAI/G,KAAA,CAAM;MAClB;MAEA,MAAMiH,QAAA,GAAWD,SAAS,CAACD,aAAA,CAAc;MAEzC,IAAI,CAAC1J,eAAA,CAAgB4J,QAAA,GAAW;QAC9B,MAAM,IAAIjH,KAAA,CAAM;MAClB;MAEAiH,QAAA,CAASX,WAAW,GAAGY,OAAO,CAAEC,SAAA;QAC9B,IAAI,CAAC/J,gBAAA,CAAiB+J,SAAA,GAAY;UAChC,MAAM,IAAInH,KAAA,CAAM;QAClB;QAEAmH,SAAA,CAAUC,iBAAiB,CAAC3J,qBAAA,CAAsB4J,GAAG;MACvD;MAEAjC,mBAAA;MACAxD,OAAA;IACF;EACF,GAAG,CAACI,MAAA,EAAQF,aAAA,EAAesD,mBAAA,EAAqBxD,OAAA,CAAQ;EAExD,MAAM0F,yBAAA,GAA4BlJ,WAAA,CAAY;IAC5C4D,MAAA,CAAOqD,MAAM,CAAC;MACZ,MAAME,WAAA,GAAYvI,mCAAA,CAAoC8E,aAAA;MAEtD,MAAMyF,gBAAA,GAAmBxK,qCAAA,CAAsC+E,aAAA;MAE/D,MAAMkF,WAAA,GAAYzB,WAAA,CAAUe,WAAW;MACvC,MAAMkB,aAAA,GAAgBC,IAAA,CAAKC,GAAG,IAAIV,WAAA,CAAUW,GAAG,CAAE7H,GAAA,IAAQA,GAAA,CAAIwG,WAAW,GAAG1G,MAAM;MAEjF,IAAI2H,gBAAA,IAAoBC,aAAA,IAAiBD,gBAAA,GAAmB,GAAG;QAC7D,MAAM,IAAIvH,KAAA,CAAM;MAClB;MAEA,KAAK,IAAI4H,CAAA,GAAI,GAAGA,CAAA,GAAIZ,WAAA,CAAUpH,MAAM,EAAEgI,CAAA,IAAK;QACzC,MAAMX,UAAA,GAAWD,WAAS,CAACY,CAAA,CAAE;QAE7B,IAAI,CAACvK,eAAA,CAAgB4J,UAAA,GAAW;UAC9B,MAAM,IAAIjH,KAAA,CAAM;QAClB;QAEA,MAAM6H,UAAA,GAAaZ,UAAA,CAASX,WAAW;QACvC,IAAIiB,gBAAA,IAAoBM,UAAA,CAAWjI,MAAM,EAAE;UAEzC;QACF;QAEA,MAAMuH,WAAA,GAAYU,UAAU,CAACN,gBAAA,CAAiB;QAE9C,IAAI,CAACnK,gBAAA,CAAiB+J,WAAA,GAAY;UAChC,MAAM,IAAInH,KAAA,CAAM;QAClB;QAEAmH,WAAA,CAAUC,iBAAiB,CAAC3J,qBAAA,CAAsBqK,MAAM;MAC1D;MAEA1C,mBAAA;MACAxD,OAAA;IACF;EACF,GAAG,CAACI,MAAA,EAAQF,aAAA,EAAesD,mBAAA,EAAqBxD,OAAA,CAAQ;EAExD,IAAImG,eAAA,GAAsC;EAC1C,IAAIrG,SAAA,EAAW;IACb,IAAIW,aAAA,EAAe;MACjB0F,eAAA,gBACEC,IAAA,CAAC;QACCC,SAAA,EAAU;QACV,gBAAa;QACbC,OAAA,EAASA,CAAA,KAAMnC,0BAAA;QACfoC,IAAA,EAAK;kBACN;;IAIL,OAAO,IAAI5F,cAAA,EAAgB;MACzBwF,eAAA,gBACEC,IAAA,CAAC;QACCC,SAAA,EAAU;QACV,gBAAa;QACbC,OAAA,EAASA,CAAA,KAAM3B,4BAAA;QACf4B,IAAA,EAAK;kBACN;;IAIL;EACF;EAEA,oBAAO3J,YAAA;EACL;;EACA4J,KAAA,CAAC;IACCH,SAAA,EAAU;IACVC,OAAA,EAAUG,CAAA;MACRA,CAAA,CAAEC,eAAe;IACnB;IACAC,GAAA,EAAKtG,WAAA;eAEJ8F,eAAA,gBACCK,KAAA,CAACjK,KAAA,CAAMqK,QAAQ;iBACZT,eAAA,E,aACDC,IAAA,CAAC;SAED,M,aAEJA,IAAA,CAAC;MACCC,SAAA,EAAU;MACV,gBAAa;MACbC,OAAA,EAASA,CAAA,KAAM1B,yBAAA,CAA0B;MACzC2B,IAAA,EAAK;gBAEL,aAAAC,KAAA,CAAC;QAAKH,SAAA,EAAU;mBAAO,WACb9F,eAAA,CAAgBlD,IAAI,KAAK,IAAI,QAAQ,GAAGkD,eAAA,CAAgBlD,IAAI,OAAO,EAAC;;qBAGhF+I,IAAA,CAAC;MACCC,SAAA,EAAU;MACV,gBAAa;MACbC,OAAA,EAASA,CAAA,KAAM1B,yBAAA,CAA0B;MACzC2B,IAAA,EAAK;gBAEL,aAAAC,KAAA,CAAC;QAAKH,SAAA,EAAU;mBAAO,WACb9F,eAAA,CAAgBlD,IAAI,KAAK,IAAI,QAAQ,GAAGkD,eAAA,CAAgBlD,IAAI,OAAO,EAAC;;qBAGhF+I,IAAA,CAAC,W,aACDA,IAAA,CAAC;MACCC,SAAA,EAAU;MACV,gBAAa;MACbC,OAAA,EAASA,CAAA,KAAMxB,4BAAA,CAA6B;MAC5CyB,IAAA,EAAK;gBAEL,aAAAC,KAAA,CAAC;QAAKH,SAAA,EAAU;mBAAO,WACb9F,eAAA,CAAgBrD,OAAO,KAAK,IAAI,WAAW,GAAGqD,eAAA,CAAgBrD,OAAO,UAAU,EAAE,KAAI;;qBAIjGkJ,IAAA,CAAC;MACCC,SAAA,EAAU;MACV,gBAAa;MACbC,OAAA,EAASA,CAAA,KAAMxB,4BAAA,CAA6B;MAC5CyB,IAAA,EAAK;gBAEL,aAAAC,KAAA,CAAC;QAAKH,SAAA,EAAU;mBAAO,WACb9F,eAAA,CAAgBrD,OAAO,KAAK,IAAI,WAAW,GAAGqD,eAAA,CAAgBrD,OAAO,UAAU,EAAE,KAAI;;qBAIjGkJ,IAAA,CAAC,W,aACDA,IAAA,CAAC;MACCC,SAAA,EAAU;MACV,gBAAa;MACbC,OAAA,EAASA,CAAA,KAAMrB,4BAAA;MACfsB,IAAA,EAAK;gBAEL,aAAAH,IAAA,CAAC;QAAKC,SAAA,EAAU;kBAAO;;qBAEzBD,IAAA,CAAC;MACCC,SAAA,EAAU;MACV,gBAAa;MACbC,OAAA,EAASA,CAAA,KAAMvB,yBAAA;MACfwB,IAAA,EAAK;gBAEL,aAAAH,IAAA,CAAC;QAAKC,SAAA,EAAU;kBAAO;;qBAEzBD,IAAA,CAAC;MACCC,SAAA,EAAU;MACV,gBAAa;MACbC,OAAA,EAASA,CAAA,KAAMtB,sBAAA;MACfuB,IAAA,EAAK;gBAEL,aAAAH,IAAA,CAAC;QAAKC,SAAA,EAAU;kBAAO;;qBAEzBD,IAAA,CAAC,W,aACDA,IAAA,CAAC;MAAOC,SAAA,EAAU;MAAOC,OAAA,EAASA,CAAA,KAAMpB,sBAAA;MAA0BqB,IAAA,EAAK;gBACrE,aAAAC,KAAA,CAAC;QAAKH,SAAA,EAAU;mBACZ,CAAAnG,aAAA,CAAc2G,aAAa,GAAGhL,qBAAA,CAAsB4J,GAAG,MAAM5J,qBAAA,CAAsB4J,GAAG,GACpF,WACA,OAAO,KAAI;;qBAInBW,IAAA,CAAC;MACCC,SAAA,EAAU;MACV,gBAAa;MACbC,OAAA,EAASA,CAAA,KAAMZ,yBAAA;MACfa,IAAA,EAAK;gBAEL,aAAAC,KAAA,CAAC;QAAKH,SAAA,EAAU;mBACZ,CAAAnG,aAAA,CAAc2G,aAAa,GAAGhL,qBAAA,CAAsBqK,MAAM,MAC5DrK,qBAAA,CAAsBqK,MAAM,GACxB,WACA,OAAO,KAAI;;;MAKrBY,QAAA,CAASC,IAAI;AAEjB;AAEA,SAASC,6BAA6B;EACpCC,UAAU;EACVnH;AAAS,CAIV;EACC,MAAM,CAACM,MAAA,CAAO,GAAGvF,yBAAA;EAEjB,MAAMqM,aAAA,GAAgBxK,MAAA,CAAO;EAC7B,MAAMyK,WAAA,GAAczK,MAAA,CAAO;EAC3B,MAAM,CAAC0K,UAAA,EAAYnH,aAAA,CAAc,GAAGtD,QAAA,CAAS;EAE7C,MAAM,CAACuD,aAAA,EAAemH,oBAAA,CAAqB,GAAG1K,QAAA,CAA+B;EAE7E,MAAM2K,SAAA,GAAY9K,WAAA,CAAY;IAC5B,MAAM+K,IAAA,GAAOL,aAAA,CAAczF,OAAO;IAClC,MAAM1E,SAAA,GAAYb,aAAA;IAClB,MAAMsL,eAAA,GAAkBjF,MAAA,CAAOkF,YAAY;IAC3C,MAAMC,aAAA,GAAgBZ,QAAA,CAASY,aAAa;IAE5C,IAAI3K,SAAA,IAAa,QAAQwK,IAAA,IAAQ,MAAM;MACrCF,oBAAA,CAAqB;MACrB;IACF;IAEA,MAAM1F,WAAA,GAAcvB,MAAA,CAAOwB,cAAc;IAEzC,IACEvF,iBAAA,CAAkBU,SAAA,KAClB4E,WAAA,KAAgB,QAChB6F,eAAA,KAAoB,QACpB7F,WAAA,CAAYyB,QAAQ,CAACoE,eAAA,CAAgBG,UAAU,GAC/C;MACA,MAAMC,0BAAA,GAA6B1M,gCAAA,CACjC6B,SAAA,CAAU+B,MAAM,CAAC+I,OAAO;MAG1B,IAAID,0BAAA,IAA8B,MAAM;QACtCP,oBAAA,CAAqB;QACrB;MACF;MAEA,MAAMS,sBAAA,GAAyB1H,MAAA,CAAOyD,eAAe,CAAC+D,0BAAA,CAA2B1G,MAAM;MAEvF,IAAI4G,sBAAA,IAA0B,MAAM;QAClCT,oBAAA,CAAqB;QACrB;MACF;MAEAA,oBAAA,CAAqBO,0BAAA;IACvB,OAAO,IAAI,CAACF,aAAA,EAAe;MACzBL,oBAAA,CAAqB;IACvB;EACF,GAAG,CAACjH,MAAA,CAAO;EAEX3D,SAAA,CAAU;IACR,OAAO2D,MAAA,CAAO2H,sBAAsB,CAAC;MACnC3H,MAAA,CAAOe,cAAc,GAAGC,IAAI,CAAC;QAC3BkG,SAAA;MACF;IACF;EACF;EAEA7K,SAAA,CAAU;IACR,MAAMuL,aAAA,GAAgBd,aAAA,CAAczF,OAAO;IAE3C,IAAIuG,aAAA,IAAiB,QAAQ9H,aAAA,IAAiB,MAAM;MAClD,MAAM+H,gBAAA,GAAmB7H,MAAA,CAAOyD,eAAe,CAAC3D,aAAA,CAAcgB,MAAM;MAEpE,IAAI+G,gBAAA,IAAoB,MAAM;QAC5B,MAAMC,aAAA,GAAgBD,gBAAA,CAAiBnG,qBAAqB;QAC5D,MAAMqG,QAAA,GAAWH,aAAA,CAAclG,qBAAqB;QACpD,MAAMsG,UAAA,GAAanB,UAAA,CAAWnF,qBAAqB;QAEnD,MAAMe,GAAA,GAAMqF,aAAA,CAAcrF,GAAG,GAAGuF,UAAA,CAAWvF,GAAG,GAAG;QACjD,MAAMH,IAAA,GAAOwF,aAAA,CAAc7F,KAAK,GAAG8F,QAAA,CAAS7F,KAAK,GAAG,KAAK8F,UAAA,CAAW1F,IAAI;QAExEsF,aAAA,CAAchG,KAAK,CAACC,OAAO,GAAG;QAC9B+F,aAAA,CAAchG,KAAK,CAACqG,SAAS,GAAG,aAAa3F,IAAA,OAAWG,GAAA,KAAQ;MAClE,OAAO;QACLmF,aAAA,CAAchG,KAAK,CAACC,OAAO,GAAG;QAC9B+F,aAAA,CAAchG,KAAK,CAACqG,SAAS,GAAG;MAClC;IACF;EACF,GAAG,CAACnB,aAAA,EAAehH,aAAA,EAAeE,MAAA,EAAQ6G,UAAA,CAAW;EAErD,MAAMqB,gBAAA,GAAmB5L,MAAA,CAAOwD,aAAA;EAEhCzD,SAAA,CAAU;IACR,IAAI6L,gBAAA,CAAiB7G,OAAO,KAAKvB,aAAA,EAAe;MAC9CD,aAAA,CAAc;IAChB;IAEAqI,gBAAA,CAAiB7G,OAAO,GAAGvB,aAAA;EAC7B,GAAG,CAACoI,gBAAA,EAAkBpI,aAAA,CAAc;EAEpC,oBACEkG,IAAA,CAAC;IAAIC,SAAA,EAAU;IAAqCM,GAAA,EAAKO,aAAA;cACtDhH,aAAA,IAAiB,qBAChBsG,KAAA,CAACjK,KAAA,CAAMqK,QAAQ;8BACbR,IAAA,CAAC;QACCC,SAAA,EAAU;QACVC,OAAA,EAAUG,CAAA;UACRA,CAAA,CAAEC,eAAe;UACjBzG,aAAA,CAAc,CAACmH,UAAA;QACjB;QACAT,GAAA,EAAKQ,WAAA;QACLZ,IAAA,EAAK;kBAEL,aAAAH,IAAA,CAACvJ,aAAA;UAEFuK,UAAA,iBACChB,IAAA,CAACvG,eAAA;QACCC,SAAA,EAAWA,SAAA;QACXC,UAAA,EAAYoH,WAAA;QACZnH,OAAA,EAASA,CAAA,KAAMC,aAAA,CAAc;QAC7BA,aAAA,EAAeA,aAAA;QACfC,aAAA,EAAeA;;;;AAO7B;AAEA,OAAO,MAAMqI,qBAAA,GAAmDA,CAAC;EAAEtB;AAAU,CAAE;EAC7E,MAAMuB,UAAA,GAAa1N,kBAAA;EACnB,oBAAO8B,YAAA,CACL4L,UAAA,gBACEpC,IAAA,CAACY,4BAAA;IAA6BC,UAAA,EAAYA,UAAA,IAAcH,QAAA,CAASC,IAAI;IAAEjH,SAAS;OAC9E,MACJmH,UAAA,IAAcH,QAAA,CAASC,IAAI;AAE/B","ignoreList":[]}
|
|
@@ -100,8 +100,8 @@ export const EXPERIMENTAL_TableFeature = createServerFeature({
|
|
|
100
100
|
const tagName = node.headerState > 0 ? 'th' : 'td';
|
|
101
101
|
const headerStateClass = `lexical-table-cell-header-${node.headerState}`;
|
|
102
102
|
const backgroundColor = node.backgroundColor ? `background-color: ${node.backgroundColor};` : '';
|
|
103
|
-
const colSpan = node.colSpan > 1 ? `colspan="${node.colSpan}"` : '';
|
|
104
|
-
const rowSpan = node.rowSpan > 1 ? `rowspan="${node.rowSpan}"` : '';
|
|
103
|
+
const colSpan = node.colSpan && node.colSpan > 1 ? `colspan="${node.colSpan}"` : '';
|
|
104
|
+
const rowSpan = node.rowSpan && node.rowSpan > 1 ? `rowspan="${node.rowSpan}"` : '';
|
|
105
105
|
return `<${tagName} class="lexical-table-cell ${headerStateClass}" style="border: 1px solid #ccc; padding: 8px; ${backgroundColor}" ${colSpan} ${rowSpan}>${childrenText}</${tagName}>`;
|
|
106
106
|
},
|
|
107
107
|
nodeTypes: [TableCellNode.getType()]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["TableCellNode","TableNode","TableRowNode","sanitizeFields","createServerFeature","convertLexicalNodesToHTML","createNode","fields","name","type","defaultValue","required","EXPERIMENTAL_TableFeature","feature","config","isRoot","parentIsLocalized","validRelationships","collections","map","c","slug","sanitizedFields","requireFieldLevelRichTextEditor","ClientFeature","generateSchemaMap","schemaMap","Map","set","nodes","converters","html","converter","currentDepth","depth","draft","node","overrideAccess","parent","req","showHiddenFields","childrenText","lexicalNodes","children","nodeTypes","getType","tagName","headerState","headerStateClass","backgroundColor","colSpan","rowSpan","key"],"sources":["../../../../src/features/experimental_table/server/index.ts"],"sourcesContent":["import type {\n SerializedTableCellNode as _SerializedTableCellNode,\n SerializedTableNode as _SerializedTableNode,\n SerializedTableRowNode as _SerializedTableRowNode,\n} from '@lexical/table'\nimport type { Spread } from 'lexical'\nimport type { Config, Field } from 'payload'\n\nimport { TableCellNode, TableNode, TableRowNode } from '@lexical/table'\nimport { sanitizeFields } from 'payload'\n\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { convertLexicalNodesToHTML } from '../../converters/html/converter/index.js'\nimport { createNode } from '../../typeUtilities.js'\n\nconst fields: Field[] = [\n {\n name: 'rows',\n type: 'number',\n defaultValue: 5,\n required: true,\n },\n {\n name: 'columns',\n type: 'number',\n defaultValue: 5,\n required: true,\n },\n]\n\nexport type SerializedTableCellNode = Spread<\n {\n type: 'tablecell'\n },\n _SerializedTableCellNode\n>\n\nexport type SerializedTableNode = Spread<\n {\n type: 'table'\n },\n _SerializedTableNode\n>\n\nexport type SerializedTableRowNode = Spread<\n {\n type: 'tablerow'\n },\n _SerializedTableRowNode\n>\nexport const EXPERIMENTAL_TableFeature = createServerFeature({\n feature: async ({ config, isRoot, parentIsLocalized }) => {\n const validRelationships = config.collections.map((c) => c.slug) || []\n\n const sanitizedFields = await sanitizeFields({\n config: config as unknown as Config,\n fields,\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#TableFeatureClient',\n generateSchemaMap: () => {\n const schemaMap = new Map<string, Field[]>()\n\n schemaMap.set('fields', sanitizedFields)\n\n return schemaMap\n },\n nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n return `<table class=\"lexical-table\" style=\"border-collapse: collapse;\">${childrenText}</table>`\n },\n nodeTypes: [TableNode.getType()],\n },\n },\n node: TableNode,\n }),\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n\n const tagName = node.headerState > 0 ? 'th' : 'td'\n const headerStateClass = `lexical-table-cell-header-${node.headerState}`\n const backgroundColor = node.backgroundColor\n ? `background-color: ${node.backgroundColor};`\n : ''\n const colSpan = node.colSpan > 1 ? `colspan=\"${node.colSpan}\"` : ''\n const rowSpan = node.rowSpan > 1 ? `rowspan=\"${node.rowSpan}\"` : ''\n\n return `<${tagName} class=\"lexical-table-cell ${headerStateClass}\" style=\"border: 1px solid #ccc; padding: 8px; ${backgroundColor}\" ${colSpan} ${rowSpan}>${childrenText}</${tagName}>`\n },\n nodeTypes: [TableCellNode.getType()],\n },\n },\n node: TableCellNode,\n }),\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n return `<tr class=\"lexical-table-row\">${childrenText}</tr>`\n },\n nodeTypes: [TableRowNode.getType()],\n },\n },\n node: TableRowNode,\n }),\n ],\n }\n },\n key: 'experimental_table',\n})\n"],"mappings":"AAQA,SAASA,aAAa,EAAEC,SAAS,EAAEC,YAAY,QAAQ;AACvD,SAASC,cAAc,QAAQ;AAE/B,SAASC,mBAAmB,QAAQ;AACpC,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,UAAU,QAAQ;AAE3B,MAAMC,MAAA,GAAkB,CACtB;EACEC,IAAA,EAAM;EACNC,IAAA,EAAM;EACNC,YAAA,EAAc;EACdC,QAAA,EAAU;AACZ,GACA;EACEH,IAAA,EAAM;EACNC,IAAA,EAAM;EACNC,YAAA,EAAc;EACdC,QAAA,EAAU;AACZ,EACD;AAsBD,OAAO,MAAMC,yBAAA,GAA4BR,mBAAA,CAAoB;EAC3DS,OAAA,EAAS,MAAAA,CAAO;IAAEC,MAAM;IAAEC,MAAM;IAAEC;EAAiB,CAAE;IACnD,MAAMC,kBAAA,GAAqBH,MAAA,CAAOI,WAAW,CAACC,GAAG,CAAEC,CAAA,IAAMA,CAAA,CAAEC,IAAI,KAAK,EAAE;IAEtE,MAAMC,eAAA,GAAkB,MAAMnB,cAAA,CAAe;MAC3CW,MAAA,EAAQA,MAAA;MACRP,MAAA;MACAS,iBAAA;MACAO,+BAAA,EAAiCR,MAAA;MACjCE;IACF;IACA,OAAO;MACLO,aAAA,EAAe;MACfC,iBAAA,EAAmBA,CAAA;QACjB,MAAMC,SAAA,GAAY,IAAIC,GAAA;QAEtBD,SAAA,CAAUE,GAAG,CAAC,UAAUN,eAAA;QAExB,OAAOI,SAAA;MACT;MACAG,KAAA,EAAO,CACLvB,UAAA,CAAW;QACTwB,UAAA,EAAY;UACVC,IAAA,EAAM;YACJC,SAAA,EAAW,MAAAA,CAAO;cAChBF,UAAU;cACVG,YAAY;cACZC,KAAK;cACLC,KAAK;cACLC,IAAI;cACJC,cAAc;cACdC,MAAM;cACNC,GAAG;cACHC;YAAgB,CACjB;cACC,MAAMC,YAAA,GAAe,MAAMpC,yBAAA,CAA0B;gBACnDyB,UAAA;gBACAG,YAAA;gBACAC,KAAA;gBACAC,KAAA;gBACAO,YAAA,EAAcN,IAAA,CAAKO,QAAQ;gBAC3BN,cAAA;gBACAC,MAAA,EAAQ;kBACN,GAAGF,IAAI;kBACPE;gBACF;gBACAC,GAAA;gBACAC;cACF;cACA,OAAO,mEAAmEC,YAAA,UAAsB;YAClG;YACAG,SAAA,EAAW,CAAC3C,SAAA,CAAU4C,OAAO;UAC/B;QACF;QACAT,IAAA,EAAMnC;MACR,IACAK,UAAA,CAAW;QACTwB,UAAA,EAAY;UACVC,IAAA,EAAM;YACJC,SAAA,EAAW,MAAAA,CAAO;cAChBF,UAAU;cACVG,YAAY;cACZC,KAAK;cACLC,KAAK;cACLC,IAAI;cACJC,cAAc;cACdC,MAAM;cACNC,GAAG;cACHC;YAAgB,CACjB;cACC,MAAMC,YAAA,GAAe,MAAMpC,yBAAA,CAA0B;gBACnDyB,UAAA;gBACAG,YAAA;gBACAC,KAAA;gBACAC,KAAA;gBACAO,YAAA,EAAcN,IAAA,CAAKO,QAAQ;gBAC3BN,cAAA;gBACAC,MAAA,EAAQ;kBACN,GAAGF,IAAI;kBACPE;gBACF;gBACAC,GAAA;gBACAC;cACF;cAEA,MAAMM,OAAA,GAAUV,IAAA,CAAKW,WAAW,GAAG,IAAI,OAAO;cAC9C,MAAMC,gBAAA,GAAmB,6BAA6BZ,IAAA,CAAKW,WAAW,EAAE;cACxE,MAAME,eAAA,GAAkBb,IAAA,CAAKa,eAAe,GACxC,qBAAqBb,IAAA,CAAKa,eAAe,GAAG,GAC5C;cACJ,MAAMC,OAAA,GAAUd,IAAA,CAAKc,OAAO,GAAG,IAAI,YAAYd,IAAA,CAAKc,OAAO,GAAG,GAAG;
|
|
1
|
+
{"version":3,"file":"index.js","names":["TableCellNode","TableNode","TableRowNode","sanitizeFields","createServerFeature","convertLexicalNodesToHTML","createNode","fields","name","type","defaultValue","required","EXPERIMENTAL_TableFeature","feature","config","isRoot","parentIsLocalized","validRelationships","collections","map","c","slug","sanitizedFields","requireFieldLevelRichTextEditor","ClientFeature","generateSchemaMap","schemaMap","Map","set","nodes","converters","html","converter","currentDepth","depth","draft","node","overrideAccess","parent","req","showHiddenFields","childrenText","lexicalNodes","children","nodeTypes","getType","tagName","headerState","headerStateClass","backgroundColor","colSpan","rowSpan","key"],"sources":["../../../../src/features/experimental_table/server/index.ts"],"sourcesContent":["import type {\n SerializedTableCellNode as _SerializedTableCellNode,\n SerializedTableNode as _SerializedTableNode,\n SerializedTableRowNode as _SerializedTableRowNode,\n} from '@lexical/table'\nimport type { Spread } from 'lexical'\nimport type { Config, Field } from 'payload'\n\nimport { TableCellNode, TableNode, TableRowNode } from '@lexical/table'\nimport { sanitizeFields } from 'payload'\n\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { convertLexicalNodesToHTML } from '../../converters/html/converter/index.js'\nimport { createNode } from '../../typeUtilities.js'\n\nconst fields: Field[] = [\n {\n name: 'rows',\n type: 'number',\n defaultValue: 5,\n required: true,\n },\n {\n name: 'columns',\n type: 'number',\n defaultValue: 5,\n required: true,\n },\n]\n\nexport type SerializedTableCellNode = Spread<\n {\n type: 'tablecell'\n },\n _SerializedTableCellNode\n>\n\nexport type SerializedTableNode = Spread<\n {\n type: 'table'\n },\n _SerializedTableNode\n>\n\nexport type SerializedTableRowNode = Spread<\n {\n type: 'tablerow'\n },\n _SerializedTableRowNode\n>\nexport const EXPERIMENTAL_TableFeature = createServerFeature({\n feature: async ({ config, isRoot, parentIsLocalized }) => {\n const validRelationships = config.collections.map((c) => c.slug) || []\n\n const sanitizedFields = await sanitizeFields({\n config: config as unknown as Config,\n fields,\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#TableFeatureClient',\n generateSchemaMap: () => {\n const schemaMap = new Map<string, Field[]>()\n\n schemaMap.set('fields', sanitizedFields)\n\n return schemaMap\n },\n nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n return `<table class=\"lexical-table\" style=\"border-collapse: collapse;\">${childrenText}</table>`\n },\n nodeTypes: [TableNode.getType()],\n },\n },\n node: TableNode,\n }),\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n\n const tagName = node.headerState > 0 ? 'th' : 'td'\n const headerStateClass = `lexical-table-cell-header-${node.headerState}`\n const backgroundColor = node.backgroundColor\n ? `background-color: ${node.backgroundColor};`\n : ''\n const colSpan = node.colSpan && node.colSpan > 1 ? `colspan=\"${node.colSpan}\"` : ''\n const rowSpan = node.rowSpan && node.rowSpan > 1 ? `rowspan=\"${node.rowSpan}\"` : ''\n\n return `<${tagName} class=\"lexical-table-cell ${headerStateClass}\" style=\"border: 1px solid #ccc; padding: 8px; ${backgroundColor}\" ${colSpan} ${rowSpan}>${childrenText}</${tagName}>`\n },\n nodeTypes: [TableCellNode.getType()],\n },\n },\n node: TableCellNode,\n }),\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n return `<tr class=\"lexical-table-row\">${childrenText}</tr>`\n },\n nodeTypes: [TableRowNode.getType()],\n },\n },\n node: TableRowNode,\n }),\n ],\n }\n },\n key: 'experimental_table',\n})\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/horizontalRule/client/component/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAoBtC;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/horizontalRule/client/component/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAoBtC;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,QAuDxE"}
|
|
@@ -16,7 +16,7 @@ export declare const INSERT_HORIZONTAL_RULE_COMMAND: LexicalCommand<void>;
|
|
|
16
16
|
*
|
|
17
17
|
* If we used DecoratorBlockNode instead, we would only need a decorate method
|
|
18
18
|
*/
|
|
19
|
-
export declare class HorizontalRuleServerNode extends DecoratorNode<React.ReactElement> {
|
|
19
|
+
export declare class HorizontalRuleServerNode extends DecoratorNode<null | React.ReactElement> {
|
|
20
20
|
static clone(node: HorizontalRuleServerNode): HorizontalRuleServerNode;
|
|
21
21
|
static getType(): string;
|
|
22
22
|
/**
|
|
@@ -33,7 +33,7 @@ export declare class HorizontalRuleServerNode extends DecoratorNode<React.ReactE
|
|
|
33
33
|
* Determines how the hr element is rendered in the lexical editor. This is only the "initial" / "outer" HTML element.
|
|
34
34
|
*/
|
|
35
35
|
createDOM(config: EditorConfig): HTMLElement;
|
|
36
|
-
decorate():
|
|
36
|
+
decorate(): null | React.ReactElement;
|
|
37
37
|
/**
|
|
38
38
|
* Opposite of importDOM, this function defines what happens when you copy an hr element from the lexical editor and paste it into another page.
|
|
39
39
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HorizontalRuleNode.d.ts","sourceRoot":"","sources":["../../../../../src/features/horizontalRule/server/nodes/HorizontalRuleNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAEhB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,MAAM,EACP,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAGnC,OAAO,EAAwC,aAAa,EAAE,MAAM,SAAS,CAAA;AAE7E;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAC/C;IACE,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,IAAI,EAAE,gBAAgB,CAAA;CACvB,EACD,qBAAqB,CACtB,CAAA;AAED,eAAO,MAAM,8BAA8B,EAAE,cAAc,CAAC,IAAI,CAE/D,CAAA;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"HorizontalRuleNode.d.ts","sourceRoot":"","sources":["../../../../../src/features/horizontalRule/server/nodes/HorizontalRuleNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAEhB,eAAe,EACf,YAAY,EACZ,cAAc,EACd,WAAW,EACX,qBAAqB,EACrB,MAAM,EACP,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAA;AAGnC,OAAO,EAAwC,aAAa,EAAE,MAAM,SAAS,CAAA;AAE7E;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAC/C;IACE,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,IAAI,EAAE,gBAAgB,CAAA;CACvB,EACD,qBAAqB,CACtB,CAAA;AAED,eAAO,MAAM,8BAA8B,EAAE,cAAc,CAAC,IAAI,CAE/D,CAAA;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,aAAa,CAAC,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC;IACpF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,wBAAwB,GAAG,wBAAwB;IAItE,MAAM,CAAC,OAAO,IAAI,MAAM;IAIxB;;;;OAIG;IACH,MAAM,CAAC,SAAS,IAAI,gBAAgB,GAAG,IAAI;IAS3C;;OAEG;IACH,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,4BAA4B,GAAG,wBAAwB;IAIzF;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW;IAM5C,QAAQ,IAAI,IAAI,GAAG,KAAK,CAAC,YAAY;IAIrC;;;;OAIG;IACH,SAAS,IAAI,eAAe;IAG5B;;OAEG;IACH,UAAU,IAAI,qBAAqB;IAOnC,cAAc,IAAI,MAAM;IAIxB,QAAQ,IAAI,KAAK;IAIjB,SAAS,IAAI,OAAO;CAGrB;AAMD,wBAAgB,+BAA+B,IAAI,wBAAwB,CAE1E;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GACnC,IAAI,IAAI,wBAAwB,CAElC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HorizontalRuleNode.js","names":["addClassNamesToElement","$applyNodeReplacement","createCommand","DecoratorNode","INSERT_HORIZONTAL_RULE_COMMAND","HorizontalRuleServerNode","clone","node","__key","getType","importDOM","hr","conversion","$convertHorizontalRuleElement","priority","importJSON","serializedNode","$createHorizontalRuleServerNode","createDOM","config","element","document","createElement","theme","decorate","exportDOM","exportJSON","type","version","getTextContent","isInline","updateDOM","$isHorizontalRuleServerNode"],"sources":["../../../../../src/features/horizontalRule/server/nodes/HorizontalRuleNode.tsx"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n EditorConfig,\n LexicalCommand,\n LexicalNode,\n SerializedLexicalNode,\n Spread,\n} from 'lexical'\nimport type * as React from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, createCommand, DecoratorNode } from 'lexical'\n\n/**\n * Serialized representation of a horizontal rule node. Serialized = converted to JSON. This is what is stored in the database / in the lexical editor state.\n */\nexport type SerializedHorizontalRuleNode = Spread<\n {\n children?: never // required so that our typed editor state doesn't automatically add children\n type: 'horizontalrule'\n },\n SerializedLexicalNode\n>\n\nexport const INSERT_HORIZONTAL_RULE_COMMAND: LexicalCommand<void> = createCommand(\n 'INSERT_HORIZONTAL_RULE_COMMAND',\n)\n\n/**\n * This node is a DecoratorNode. DecoratorNodes allow you to render React components in the editor.\n *\n * They need both createDom and decorate functions. createDom => outside of the html. decorate => React Component inside of the html.\n *\n * If we used DecoratorBlockNode instead, we would only need a decorate method\n */\nexport class HorizontalRuleServerNode extends DecoratorNode<React.ReactElement> {\n static clone(node: HorizontalRuleServerNode): HorizontalRuleServerNode {\n return new this(node.__key)\n }\n\n static getType(): string {\n return 'horizontalrule'\n }\n\n /**\n * Defines what happens if you copy an hr element from another page and paste it into the lexical editor\n *\n * This also determines the behavior of lexical's internal HTML -> Lexical converter\n */\n static importDOM(): DOMConversionMap | null {\n return {\n hr: () => ({\n conversion: $convertHorizontalRuleElement,\n priority: 0,\n }),\n }\n }\n\n /**\n * The data for this node is stored serialized as JSON. This is the \"load function\" of that node: it takes the saved data and converts it into a node.\n */\n static importJSON(serializedNode: SerializedHorizontalRuleNode): HorizontalRuleServerNode {\n return $createHorizontalRuleServerNode()\n }\n\n /**\n * Determines how the hr element is rendered in the lexical editor. This is only the \"initial\" / \"outer\" HTML element.\n */\n createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('hr')\n addClassNamesToElement(element, config.theme.hr)\n return element\n }\n\n decorate() {\n return null\n }\n\n /**\n * Opposite of importDOM, this function defines what happens when you copy an hr element from the lexical editor and paste it into another page.\n *\n * This also determines the behavior of lexical's internal Lexical -> HTML converter\n */\n exportDOM(): DOMExportOutput {\n return { element: document.createElement('hr') }\n }\n /**\n * Opposite of importJSON. This determines what data is saved in the database / in the lexical editor state.\n */\n exportJSON(): SerializedLexicalNode {\n return {\n type: 'horizontalrule',\n version: 1,\n }\n }\n\n getTextContent(): string {\n return '\\n'\n }\n\n isInline(): false {\n return false\n }\n\n updateDOM(): boolean {\n return false\n }\n}\n\nfunction $convertHorizontalRuleElement(): DOMConversionOutput {\n return { node: $createHorizontalRuleServerNode() }\n}\n\nexport function $createHorizontalRuleServerNode(): HorizontalRuleServerNode {\n return $applyNodeReplacement(new HorizontalRuleServerNode())\n}\n\nexport function $isHorizontalRuleServerNode(\n node: LexicalNode | null | undefined,\n): node is HorizontalRuleServerNode {\n return node instanceof HorizontalRuleServerNode\n}\n"],"mappings":"AAYA,SAASA,sBAAsB,QAAQ;AACvC,SAASC,qBAAqB,EAAEC,aAAa,EAAEC,aAAa,QAAQ;AAapE,OAAO,MAAMC,8BAAA,GAAuDF,aAAA,CAClE;AAGF;;;;;;;AAOA,OAAO,MAAMG,wBAAA,SAAiCF,aAAA;EAC5C,OAAOG,MAAMC,IAA8B,EAA4B;IACrE,OAAO,IAAI,IAAI,CAACA,IAAA,CAAKC,KAAK;EAC5B;EAEA,OAAOC,QAAA,EAAkB;IACvB,OAAO;EACT;EAEA;;;;;EAKA,OAAOC,UAAA,EAAqC;IAC1C,OAAO;MACLC,EAAA,EAAIA,CAAA,MAAO;QACTC,UAAA,EAAYC,6BAAA;QACZC,QAAA,EAAU;MACZ;IACF;EACF;EAEA;;;EAGA,OAAOC,WAAWC,cAA4C,EAA4B;IACxF,OAAOC,+BAAA;EACT;EAEA;;;EAGAC,UAAUC,MAAoB,EAAe;IAC3C,MAAMC,OAAA,GAAUC,QAAA,CAASC,aAAa,CAAC;IACvCtB,sBAAA,CAAuBoB,OAAA,EAASD,MAAA,CAAOI,KAAK,CAACZ,EAAE;IAC/C,OAAOS,OAAA;EACT;EAEAI,SAAA,
|
|
1
|
+
{"version":3,"file":"HorizontalRuleNode.js","names":["addClassNamesToElement","$applyNodeReplacement","createCommand","DecoratorNode","INSERT_HORIZONTAL_RULE_COMMAND","HorizontalRuleServerNode","clone","node","__key","getType","importDOM","hr","conversion","$convertHorizontalRuleElement","priority","importJSON","serializedNode","$createHorizontalRuleServerNode","createDOM","config","element","document","createElement","theme","decorate","exportDOM","exportJSON","type","version","getTextContent","isInline","updateDOM","$isHorizontalRuleServerNode"],"sources":["../../../../../src/features/horizontalRule/server/nodes/HorizontalRuleNode.tsx"],"sourcesContent":["import type {\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n EditorConfig,\n LexicalCommand,\n LexicalNode,\n SerializedLexicalNode,\n Spread,\n} from 'lexical'\nimport type * as React from 'react'\n\nimport { addClassNamesToElement } from '@lexical/utils'\nimport { $applyNodeReplacement, createCommand, DecoratorNode } from 'lexical'\n\n/**\n * Serialized representation of a horizontal rule node. Serialized = converted to JSON. This is what is stored in the database / in the lexical editor state.\n */\nexport type SerializedHorizontalRuleNode = Spread<\n {\n children?: never // required so that our typed editor state doesn't automatically add children\n type: 'horizontalrule'\n },\n SerializedLexicalNode\n>\n\nexport const INSERT_HORIZONTAL_RULE_COMMAND: LexicalCommand<void> = createCommand(\n 'INSERT_HORIZONTAL_RULE_COMMAND',\n)\n\n/**\n * This node is a DecoratorNode. DecoratorNodes allow you to render React components in the editor.\n *\n * They need both createDom and decorate functions. createDom => outside of the html. decorate => React Component inside of the html.\n *\n * If we used DecoratorBlockNode instead, we would only need a decorate method\n */\nexport class HorizontalRuleServerNode extends DecoratorNode<null | React.ReactElement> {\n static clone(node: HorizontalRuleServerNode): HorizontalRuleServerNode {\n return new this(node.__key)\n }\n\n static getType(): string {\n return 'horizontalrule'\n }\n\n /**\n * Defines what happens if you copy an hr element from another page and paste it into the lexical editor\n *\n * This also determines the behavior of lexical's internal HTML -> Lexical converter\n */\n static importDOM(): DOMConversionMap | null {\n return {\n hr: () => ({\n conversion: $convertHorizontalRuleElement,\n priority: 0,\n }),\n }\n }\n\n /**\n * The data for this node is stored serialized as JSON. This is the \"load function\" of that node: it takes the saved data and converts it into a node.\n */\n static importJSON(serializedNode: SerializedHorizontalRuleNode): HorizontalRuleServerNode {\n return $createHorizontalRuleServerNode()\n }\n\n /**\n * Determines how the hr element is rendered in the lexical editor. This is only the \"initial\" / \"outer\" HTML element.\n */\n createDOM(config: EditorConfig): HTMLElement {\n const element = document.createElement('hr')\n addClassNamesToElement(element, config.theme.hr)\n return element\n }\n\n decorate(): null | React.ReactElement {\n return null\n }\n\n /**\n * Opposite of importDOM, this function defines what happens when you copy an hr element from the lexical editor and paste it into another page.\n *\n * This also determines the behavior of lexical's internal Lexical -> HTML converter\n */\n exportDOM(): DOMExportOutput {\n return { element: document.createElement('hr') }\n }\n /**\n * Opposite of importJSON. This determines what data is saved in the database / in the lexical editor state.\n */\n exportJSON(): SerializedLexicalNode {\n return {\n type: 'horizontalrule',\n version: 1,\n }\n }\n\n getTextContent(): string {\n return '\\n'\n }\n\n isInline(): false {\n return false\n }\n\n updateDOM(): boolean {\n return false\n }\n}\n\nfunction $convertHorizontalRuleElement(): DOMConversionOutput {\n return { node: $createHorizontalRuleServerNode() }\n}\n\nexport function $createHorizontalRuleServerNode(): HorizontalRuleServerNode {\n return $applyNodeReplacement(new HorizontalRuleServerNode())\n}\n\nexport function $isHorizontalRuleServerNode(\n node: LexicalNode | null | undefined,\n): node is HorizontalRuleServerNode {\n return node instanceof HorizontalRuleServerNode\n}\n"],"mappings":"AAYA,SAASA,sBAAsB,QAAQ;AACvC,SAASC,qBAAqB,EAAEC,aAAa,EAAEC,aAAa,QAAQ;AAapE,OAAO,MAAMC,8BAAA,GAAuDF,aAAA,CAClE;AAGF;;;;;;;AAOA,OAAO,MAAMG,wBAAA,SAAiCF,aAAA;EAC5C,OAAOG,MAAMC,IAA8B,EAA4B;IACrE,OAAO,IAAI,IAAI,CAACA,IAAA,CAAKC,KAAK;EAC5B;EAEA,OAAOC,QAAA,EAAkB;IACvB,OAAO;EACT;EAEA;;;;;EAKA,OAAOC,UAAA,EAAqC;IAC1C,OAAO;MACLC,EAAA,EAAIA,CAAA,MAAO;QACTC,UAAA,EAAYC,6BAAA;QACZC,QAAA,EAAU;MACZ;IACF;EACF;EAEA;;;EAGA,OAAOC,WAAWC,cAA4C,EAA4B;IACxF,OAAOC,+BAAA;EACT;EAEA;;;EAGAC,UAAUC,MAAoB,EAAe;IAC3C,MAAMC,OAAA,GAAUC,QAAA,CAASC,aAAa,CAAC;IACvCtB,sBAAA,CAAuBoB,OAAA,EAASD,MAAA,CAAOI,KAAK,CAACZ,EAAE;IAC/C,OAAOS,OAAA;EACT;EAEAI,SAAA,EAAsC;IACpC,OAAO;EACT;EAEA;;;;;EAKAC,UAAA,EAA6B;IAC3B,OAAO;MAAEL,OAAA,EAASC,QAAA,CAASC,aAAa,CAAC;IAAM;EACjD;EACA;;;EAGAI,WAAA,EAAoC;IAClC,OAAO;MACLC,IAAA,EAAM;MACNC,OAAA,EAAS;IACX;EACF;EAEAC,eAAA,EAAyB;IACvB,OAAO;EACT;EAEAC,SAAA,EAAkB;IAChB,OAAO;EACT;EAEAC,UAAA,EAAqB;IACnB,OAAO;EACT;AACF;AAEA,SAASlB,8BAAA;EACP,OAAO;IAAEN,IAAA,EAAMU,+BAAA;EAAkC;AACnD;AAEA,OAAO,SAASA,gCAAA;EACd,OAAOhB,qBAAA,CAAsB,IAAII,wBAAA;AACnC;AAEA,OAAO,SAAS2B,4BACdzB,IAAoC;EAEpC,OAAOA,IAAA,YAAgBF,wBAAA;AACzB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/indent/client/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/indent/client/index.tsx"],"names":[],"mappings":"AAwDA,eAAO,MAAM,mBAAmB,oFAO9B,CAAA"}
|
|
@@ -15,8 +15,9 @@ const toolbarGroups = [toolbarIndentGroupWithItems([{
|
|
|
15
15
|
return false;
|
|
16
16
|
}
|
|
17
17
|
for (const node of selection.getNodes()) {
|
|
18
|
+
const parent = node.getParentOrThrow();
|
|
18
19
|
// If at least one node is indented, this should be active
|
|
19
|
-
if ('__indent' in node && node.__indent > 0 ||
|
|
20
|
+
if ('__indent' in node && node.__indent > 0 || '__indent' in parent && parent.__indent > 0) {
|
|
20
21
|
return true;
|
|
21
22
|
}
|
|
22
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["INDENT_CONTENT_COMMAND","OUTDENT_CONTENT_COMMAND","IndentDecreaseIcon","IndentIncreaseIcon","createClientFeature","toolbarIndentGroupWithItems","toolbarGroups","ChildComponent","isActive","isEnabled","selection","getNodes","length","node","
|
|
1
|
+
{"version":3,"file":"index.js","names":["INDENT_CONTENT_COMMAND","OUTDENT_CONTENT_COMMAND","IndentDecreaseIcon","IndentIncreaseIcon","createClientFeature","toolbarIndentGroupWithItems","toolbarGroups","ChildComponent","isActive","isEnabled","selection","getNodes","length","node","parent","getParentOrThrow","__indent","key","label","i18n","t","onSelect","editor","dispatchCommand","undefined","order","IndentFeatureClient","toolbarFixed","groups","toolbarInline"],"sources":["../../../../src/features/indent/client/index.tsx"],"sourcesContent":["'use client'\n\nimport { INDENT_CONTENT_COMMAND, OUTDENT_CONTENT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { IndentDecreaseIcon } from '../../../lexical/ui/icons/IndentDecrease/index.js'\nimport { IndentIncreaseIcon } from '../../../lexical/ui/icons/IndentIncrease/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarIndentGroupWithItems } from './toolbarIndentGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarIndentGroupWithItems([\n {\n ChildComponent: IndentDecreaseIcon,\n isActive: () => false,\n isEnabled: ({ selection }) => {\n if (!selection || !selection?.getNodes()?.length) {\n return false\n }\n for (const node of selection.getNodes()) {\n const parent = node.getParentOrThrow()\n // If at least one node is indented, this should be active\n if (\n ('__indent' in node && (node.__indent as number) > 0) ||\n ('__indent' in parent && parent.__indent > 0)\n ) {\n return true\n }\n }\n return false\n },\n key: 'indentDecrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:decreaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined)\n },\n order: 1,\n },\n {\n ChildComponent: IndentIncreaseIcon,\n isActive: () => false,\n key: 'indentIncrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:increaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined)\n },\n order: 2,\n },\n ]),\n]\n\nexport const IndentFeatureClient = createClientFeature({\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n"],"mappings":"AAAA;;AAEA,SAASA,sBAAsB,EAAEC,uBAAuB,QAAQ;AAIhE,SAASC,kBAAkB,QAAQ;AACnC,SAASC,kBAAkB,QAAQ;AACnC,SAASC,mBAAmB,QAAQ;AACpC,SAASC,2BAA2B,QAAQ;AAE5C,MAAMC,aAAA,GAAgC,CACpCD,2BAAA,CAA4B,CAC1B;EACEE,cAAA,EAAgBL,kBAAA;EAChBM,QAAA,EAAUA,CAAA,KAAM;EAChBC,SAAA,EAAWA,CAAC;IAAEC;EAAS,CAAE;IACvB,IAAI,CAACA,SAAA,IAAa,CAACA,SAAA,EAAWC,QAAA,IAAYC,MAAA,EAAQ;MAChD,OAAO;IACT;IACA,KAAK,MAAMC,IAAA,IAAQH,SAAA,CAAUC,QAAQ,IAAI;MACvC,MAAMG,MAAA,GAASD,IAAA,CAAKE,gBAAgB;MACpC;MACA,IACE,UAAC,IAAcF,IAAA,IAAQA,IAAC,CAAKG,QAAQ,GAAc,KAClD,cAAcF,MAAA,IAAUA,MAAA,CAAOE,QAAQ,GAAG,GAC3C;QACA,OAAO;MACT;IACF;IACA,OAAO;EACT;EACAC,GAAA,EAAK;EACLC,KAAA,EAAOA,CAAC;IAAEC;EAAI,CAAE;IACd,OAAOA,IAAA,CAAKC,CAAC,CAAC;EAChB;EACAC,QAAA,EAAUA,CAAC;IAAEC;EAAM,CAAE;IACnBA,MAAA,CAAOC,eAAe,CAACtB,uBAAA,EAAyBuB,SAAA;EAClD;EACAC,KAAA,EAAO;AACT,GACA;EACElB,cAAA,EAAgBJ,kBAAA;EAChBK,QAAA,EAAUA,CAAA,KAAM;EAChBS,GAAA,EAAK;EACLC,KAAA,EAAOA,CAAC;IAAEC;EAAI,CAAE;IACd,OAAOA,IAAA,CAAKC,CAAC,CAAC;EAChB;EACAC,QAAA,EAAUA,CAAC;IAAEC;EAAM,CAAE;IACnBA,MAAA,CAAOC,eAAe,CAACvB,sBAAA,EAAwBwB,SAAA;EACjD;EACAC,KAAA,EAAO;AACT,EACD,EACF;AAED,OAAO,MAAMC,mBAAA,GAAsBtB,mBAAA,CAAoB;EACrDuB,YAAA,EAAc;IACZC,MAAA,EAAQtB;EACV;EACAuB,aAAA,EAAe;IACbD,MAAA,EAAQtB;EACV;AACF","ignoreList":[]}
|
|
@@ -42,7 +42,7 @@ const toolbarGroups = [toolbarFeatureButtonsGroupWithItems([{
|
|
|
42
42
|
isActive
|
|
43
43
|
}) => {
|
|
44
44
|
if (!isActive) {
|
|
45
|
-
let selectedText
|
|
45
|
+
let selectedText;
|
|
46
46
|
let selectedNodes = [];
|
|
47
47
|
editor.getEditorState().read(() => {
|
|
48
48
|
selectedText = $getSelection()?.getTextContent();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["$findMatchingParent","$getSelection","$isRangeSelection","LinkIcon","getSelectedNode","createClientFeature","toolbarFeatureButtonsGroupWithItems","LinkMarkdownTransformer","AutoLinkNode","$isLinkNode","LinkNode","TOGGLE_LINK_COMMAND","AutoLinkPlugin","ClickableLinkPlugin","FloatingLinkEditorPlugin","TOGGLE_LINK_WITH_MODAL_COMMAND","LinkPlugin","toolbarGroups","ChildComponent","isActive","selection","selectedNode","linkParent","isEnabled","getTextContent","length","key","label","i18n","t","onSelect","editor","selectedText","selectedNodes","getEditorState","read","getNodes","linkFields","doc","linkType","newTab","url","dispatchCommand","fields","text","order","LinkFeatureClient","markdownTransformers","nodes","plugins","Component","position","toolbarFixed","groups","toolbarInline"],"sources":["../../../../src/features/link/client/index.tsx"],"sourcesContent":["'use client'\n\nimport type { LexicalNode } from 'lexical'\n\nimport { $findMatchingParent } from '@lexical/utils'\nimport { $getSelection, $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\nimport type { LinkFields } from '../nodes/types.js'\nimport type { ExclusiveLinkCollectionsProps } from '../server/index.js'\n\nimport { LinkIcon } from '../../../lexical/ui/icons/Link/index.js'\nimport { getSelectedNode } from '../../../lexical/utils/getSelectedNode.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFeatureButtonsGroupWithItems } from '../../shared/toolbar/featureButtonsGroup.js'\nimport { LinkMarkdownTransformer } from '../markdownTransformer.js'\nimport { AutoLinkNode } from '../nodes/AutoLinkNode.js'\nimport { $isLinkNode, LinkNode, TOGGLE_LINK_COMMAND } from '../nodes/LinkNode.js'\nimport { AutoLinkPlugin } from './plugins/autoLink/index.js'\nimport { ClickableLinkPlugin } from './plugins/clickableLink/index.js'\nimport { FloatingLinkEditorPlugin } from './plugins/floatingLinkEditor/index.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './plugins/floatingLinkEditor/LinkEditor/commands.js'\nimport { LinkPlugin } from './plugins/link/index.js'\n\nexport type ClientProps = ExclusiveLinkCollectionsProps\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFeatureButtonsGroupWithItems([\n {\n ChildComponent: LinkIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection)) {\n const selectedNode = getSelectedNode(selection)\n const linkParent = $findMatchingParent(selectedNode, $isLinkNode)\n return linkParent != null\n }\n return false\n },\n isEnabled: ({ selection }) => {\n return !!($isRangeSelection(selection) && $getSelection()?.getTextContent()?.length)\n },\n key: 'link',\n label: ({ i18n }) => {\n return i18n.t('lexical:link:label')\n },\n onSelect: ({ editor, isActive }) => {\n if (!isActive) {\n let selectedText: string
|
|
1
|
+
{"version":3,"file":"index.js","names":["$findMatchingParent","$getSelection","$isRangeSelection","LinkIcon","getSelectedNode","createClientFeature","toolbarFeatureButtonsGroupWithItems","LinkMarkdownTransformer","AutoLinkNode","$isLinkNode","LinkNode","TOGGLE_LINK_COMMAND","AutoLinkPlugin","ClickableLinkPlugin","FloatingLinkEditorPlugin","TOGGLE_LINK_WITH_MODAL_COMMAND","LinkPlugin","toolbarGroups","ChildComponent","isActive","selection","selectedNode","linkParent","isEnabled","getTextContent","length","key","label","i18n","t","onSelect","editor","selectedText","selectedNodes","getEditorState","read","getNodes","linkFields","doc","linkType","newTab","url","dispatchCommand","fields","text","order","LinkFeatureClient","markdownTransformers","nodes","plugins","Component","position","toolbarFixed","groups","toolbarInline"],"sources":["../../../../src/features/link/client/index.tsx"],"sourcesContent":["'use client'\n\nimport type { LexicalNode } from 'lexical'\n\nimport { $findMatchingParent } from '@lexical/utils'\nimport { $getSelection, $isRangeSelection } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\nimport type { LinkFields } from '../nodes/types.js'\nimport type { ExclusiveLinkCollectionsProps } from '../server/index.js'\n\nimport { LinkIcon } from '../../../lexical/ui/icons/Link/index.js'\nimport { getSelectedNode } from '../../../lexical/utils/getSelectedNode.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarFeatureButtonsGroupWithItems } from '../../shared/toolbar/featureButtonsGroup.js'\nimport { LinkMarkdownTransformer } from '../markdownTransformer.js'\nimport { AutoLinkNode } from '../nodes/AutoLinkNode.js'\nimport { $isLinkNode, LinkNode, TOGGLE_LINK_COMMAND } from '../nodes/LinkNode.js'\nimport { AutoLinkPlugin } from './plugins/autoLink/index.js'\nimport { ClickableLinkPlugin } from './plugins/clickableLink/index.js'\nimport { FloatingLinkEditorPlugin } from './plugins/floatingLinkEditor/index.js'\nimport { TOGGLE_LINK_WITH_MODAL_COMMAND } from './plugins/floatingLinkEditor/LinkEditor/commands.js'\nimport { LinkPlugin } from './plugins/link/index.js'\n\nexport type ClientProps = ExclusiveLinkCollectionsProps\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarFeatureButtonsGroupWithItems([\n {\n ChildComponent: LinkIcon,\n isActive: ({ selection }) => {\n if ($isRangeSelection(selection)) {\n const selectedNode = getSelectedNode(selection)\n const linkParent = $findMatchingParent(selectedNode, $isLinkNode)\n return linkParent != null\n }\n return false\n },\n isEnabled: ({ selection }) => {\n return !!($isRangeSelection(selection) && $getSelection()?.getTextContent()?.length)\n },\n key: 'link',\n label: ({ i18n }) => {\n return i18n.t('lexical:link:label')\n },\n onSelect: ({ editor, isActive }) => {\n if (!isActive) {\n let selectedText: string | undefined\n let selectedNodes: LexicalNode[] = []\n editor.getEditorState().read(() => {\n selectedText = $getSelection()?.getTextContent()\n // We need to selected nodes here before the drawer opens, as clicking around in the drawer may change the original selection\n selectedNodes = $getSelection()?.getNodes() ?? []\n })\n\n if (!selectedText?.length) {\n return\n }\n\n const linkFields: LinkFields = {\n doc: null,\n linkType: 'custom',\n newTab: false,\n url: 'https://',\n }\n\n editor.dispatchCommand(TOGGLE_LINK_WITH_MODAL_COMMAND, {\n fields: linkFields,\n selectedNodes,\n text: selectedText,\n })\n } else {\n // remove link\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\n }\n },\n order: 1,\n },\n ]),\n]\n\nexport const LinkFeatureClient = createClientFeature({\n markdownTransformers: [LinkMarkdownTransformer],\n nodes: [LinkNode, AutoLinkNode],\n plugins: [\n {\n Component: LinkPlugin,\n position: 'normal',\n },\n {\n Component: AutoLinkPlugin,\n position: 'normal',\n },\n {\n Component: ClickableLinkPlugin,\n position: 'normal',\n },\n {\n Component: FloatingLinkEditorPlugin,\n position: 'floatingAnchorElem',\n },\n ],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n"],"mappings":"AAAA;;AAIA,SAASA,mBAAmB,QAAQ;AACpC,SAASC,aAAa,EAAEC,iBAAiB,QAAQ;AAMjD,SAASC,QAAQ,QAAQ;AACzB,SAASC,eAAe,QAAQ;AAChC,SAASC,mBAAmB,QAAQ;AACpC,SAASC,mCAAmC,QAAQ;AACpD,SAASC,uBAAuB,QAAQ;AACxC,SAASC,YAAY,QAAQ;AAC7B,SAASC,WAAW,EAAEC,QAAQ,EAAEC,mBAAmB,QAAQ;AAC3D,SAASC,cAAc,QAAQ;AAC/B,SAASC,mBAAmB,QAAQ;AACpC,SAASC,wBAAwB,QAAQ;AACzC,SAASC,8BAA8B,QAAQ;AAC/C,SAASC,UAAU,QAAQ;AAI3B,MAAMC,aAAA,GAAgC,CACpCX,mCAAA,CAAoC,CAClC;EACEY,cAAA,EAAgBf,QAAA;EAChBgB,QAAA,EAAUA,CAAC;IAAEC;EAAS,CAAE;IACtB,IAAIlB,iBAAA,CAAkBkB,SAAA,GAAY;MAChC,MAAMC,YAAA,GAAejB,eAAA,CAAgBgB,SAAA;MACrC,MAAME,UAAA,GAAatB,mBAAA,CAAoBqB,YAAA,EAAcZ,WAAA;MACrD,OAAOa,UAAA,IAAc;IACvB;IACA,OAAO;EACT;EACAC,SAAA,EAAWA,CAAC;IAAEH;EAAS,CAAE;IACvB,OAAO,CAAC,EAAElB,iBAAA,CAAkBkB,SAAA,KAAcnB,aAAA,IAAiBuB,cAAA,IAAkBC,MAAK;EACpF;EACAC,GAAA,EAAK;EACLC,KAAA,EAAOA,CAAC;IAAEC;EAAI,CAAE;IACd,OAAOA,IAAA,CAAKC,CAAC,CAAC;EAChB;EACAC,QAAA,EAAUA,CAAC;IAAEC,MAAM;IAAEZ;EAAQ,CAAE;IAC7B,IAAI,CAACA,QAAA,EAAU;MACb,IAAIa,YAAA;MACJ,IAAIC,aAAA,GAA+B,EAAE;MACrCF,MAAA,CAAOG,cAAc,GAAGC,IAAI,CAAC;QAC3BH,YAAA,GAAe/B,aAAA,IAAiBuB,cAAA;QAChC;QACAS,aAAA,GAAgBhC,aAAA,IAAiBmC,QAAA,MAAc,EAAE;MACnD;MAEA,IAAI,CAACJ,YAAA,EAAcP,MAAA,EAAQ;QACzB;MACF;MAEA,MAAMY,UAAA,GAAyB;QAC7BC,GAAA,EAAK;QACLC,QAAA,EAAU;QACVC,MAAA,EAAQ;QACRC,GAAA,EAAK;MACP;MAEAV,MAAA,CAAOW,eAAe,CAAC3B,8BAAA,EAAgC;QACrD4B,MAAA,EAAQN,UAAA;QACRJ,aAAA;QACAW,IAAA,EAAMZ;MACR;IACF,OAAO;MACL;MACAD,MAAA,CAAOW,eAAe,CAAC/B,mBAAA,EAAqB;IAC9C;EACF;EACAkC,KAAA,EAAO;AACT,EACD,EACF;AAED,OAAO,MAAMC,iBAAA,GAAoBzC,mBAAA,CAAoB;EACnD0C,oBAAA,EAAsB,CAACxC,uBAAA,CAAwB;EAC/CyC,KAAA,EAAO,CAACtC,QAAA,EAAUF,YAAA,CAAa;EAC/ByC,OAAA,EAAS,CACP;IACEC,SAAA,EAAWlC,UAAA;IACXmC,QAAA,EAAU;EACZ,GACA;IACED,SAAA,EAAWtC,cAAA;IACXuC,QAAA,EAAU;EACZ,GACA;IACED,SAAA,EAAWrC,mBAAA;IACXsC,QAAA,EAAU;EACZ,GACA;IACED,SAAA,EAAWpC,wBAAA;IACXqC,QAAA,EAAU;EACZ,EACD;EACDC,YAAA,EAAc;IACZC,MAAA,EAAQpC;EACV;EACAqC,aAAA,EAAe;IACbD,MAAA,EAAQpC;EACV;AACF","ignoreList":[]}
|
|
@@ -14,7 +14,7 @@ export declare function createLinkMatcherWithRegExp(regExp: RegExp, urlTransform
|
|
|
14
14
|
length: number;
|
|
15
15
|
text: string;
|
|
16
16
|
url: string;
|
|
17
|
-
};
|
|
17
|
+
} | null;
|
|
18
18
|
export declare const AutoLinkPlugin: PluginComponent<ClientProps>;
|
|
19
19
|
export {};
|
|
20
20
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/link/client/plugins/autoLink/index.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAOjD,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAA;AAEpE,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAuB,UAE3C,MAAM;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/link/client/plugins/autoLink/index.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAOjD,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAA;AAEpE,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAuB,UAE3C,MAAM;;;;;SAYrB;AAkZD,eAAO,MAAM,cAAc,EAAE,eAAe,CAAC,WAAW,CAMvD,CAAA"}
|