@payloadcms/richtext-lexical 3.68.0-internal-debug.35482da → 3.68.0-internal-debug.e9b66ee
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/rscEntry.js +2 -21
- package/dist/cell/rscEntry.js.map +1 -1
- package/dist/features/blocks/client/component/BlockContent.js +13 -48
- package/dist/features/blocks/client/component/BlockContent.js.map +1 -1
- package/dist/features/blocks/client/component/components/BlockCollapsible.js +1 -10
- package/dist/features/blocks/client/component/components/BlockCollapsible.js.map +1 -1
- package/dist/features/blocks/client/component/components/BlockEditButton.js +1 -7
- package/dist/features/blocks/client/component/components/BlockEditButton.js.map +1 -1
- package/dist/features/blocks/client/component/components/BlockRemoveButton.js +1 -7
- package/dist/features/blocks/client/component/components/BlockRemoveButton.js.map +1 -1
- package/dist/features/blocks/client/component/index.js +81 -247
- package/dist/features/blocks/client/component/index.js.map +1 -1
- package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js +1 -9
- package/dist/features/blocks/client/componentInline/components/InlineBlockContainer.js.map +1 -1
- package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js +1 -7
- package/dist/features/blocks/client/componentInline/components/InlineBlockEditButton.js.map +1 -1
- package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js +1 -7
- package/dist/features/blocks/client/componentInline/components/InlineBlockLabel.js.map +1 -1
- package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js +1 -7
- package/dist/features/blocks/client/componentInline/components/InlineBlockRemoveButton.js.map +1 -1
- package/dist/features/blocks/client/componentInline/index.js +68 -217
- package/dist/features/blocks/client/componentInline/index.js.map +1 -1
- package/dist/features/blocks/client/getBlockImageComponent.js +4 -15
- package/dist/features/blocks/client/getBlockImageComponent.js.map +1 -1
- package/dist/features/blocks/client/nodes/BlocksNode.js +1 -12
- package/dist/features/blocks/client/nodes/BlocksNode.js.map +1 -1
- package/dist/features/blocks/client/nodes/InlineBlocksNode.js +2 -12
- package/dist/features/blocks/client/nodes/InlineBlocksNode.js.map +1 -1
- package/dist/features/blocks/premade/CodeBlock/Component/Block.js +26 -127
- package/dist/features/blocks/premade/CodeBlock/Component/Block.js.map +1 -1
- package/dist/features/blocks/premade/CodeBlock/Component/Code.js +49 -65
- package/dist/features/blocks/premade/CodeBlock/Component/Code.js.map +1 -1
- package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js +3 -16
- package/dist/features/blocks/premade/CodeBlock/Component/Collapse/index.js.map +1 -1
- package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js +4 -25
- package/dist/features/blocks/premade/CodeBlock/Component/FloatingCollapse/index.js.map +1 -1
- package/dist/features/blocks/server/nodes/BlocksNode.js.map +1 -1
- package/dist/features/blocks/server/nodes/InlineBlocksNode.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/Component/index.js +2 -13
- package/dist/features/converters/lexicalToJSX/Component/index.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/blockquote.js +1 -8
- package/dist/features/converters/lexicalToJSX/converter/converters/blockquote.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/heading.js +1 -8
- package/dist/features/converters/lexicalToJSX/converter/converters/heading.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/horizontalRule.js +1 -6
- package/dist/features/converters/lexicalToJSX/converter/converters/horizontalRule.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/linebreak.js +1 -6
- package/dist/features/converters/lexicalToJSX/converter/converters/linebreak.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/link.js +10 -19
- package/dist/features/converters/lexicalToJSX/converter/converters/link.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/list.js +16 -63
- package/dist/features/converters/lexicalToJSX/converter/converters/list.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/paragraph.js +4 -19
- package/dist/features/converters/lexicalToJSX/converter/converters/paragraph.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/table.js +12 -45
- package/dist/features/converters/lexicalToJSX/converter/converters/table.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/text.js +11 -57
- package/dist/features/converters/lexicalToJSX/converter/converters/text.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/converters/upload.js +7 -46
- package/dist/features/converters/lexicalToJSX/converter/converters/upload.js.map +1 -1
- package/dist/features/converters/lexicalToJSX/converter/index.js +5 -12
- package/dist/features/converters/lexicalToJSX/converter/index.js.map +1 -1
- package/dist/features/debug/jsxConverter/client/plugin/index.js +3 -16
- package/dist/features/debug/jsxConverter/client/plugin/index.js.map +1 -1
- package/dist/features/debug/testRecorder/client/plugin/index.js +38 -113
- package/dist/features/debug/testRecorder/client/plugin/index.js.map +1 -1
- package/dist/features/debug/treeView/client/plugin/index.js +1 -15
- package/dist/features/debug/treeView/client/plugin/index.js.map +1 -1
- package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js +79 -357
- package/dist/features/experimental_table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
- package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js +7 -41
- package/dist/features/experimental_table/client/plugins/TableCellResizerPlugin/index.js.map +1 -1
- package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js +9 -39
- package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
- package/dist/features/experimental_table/client/plugins/TablePlugin/index.js +28 -59
- package/dist/features/experimental_table/client/plugins/TablePlugin/index.js.map +1 -1
- package/dist/features/horizontalRule/client/nodes/HorizontalRuleNode.js +0 -1
- package/dist/features/horizontalRule/client/nodes/HorizontalRuleNode.js.map +1 -1
- package/dist/features/indent/client/IndentPlugin.js +1 -6
- package/dist/features/indent/client/IndentPlugin.js.map +1 -1
- package/dist/features/link/client/plugins/clickableLink/index.js +1 -7
- package/dist/features/link/client/plugins/clickableLink/index.js.map +1 -1
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js +59 -151
- package/dist/features/link/client/plugins/floatingLinkEditor/LinkEditor/index.js.map +1 -1
- package/dist/features/link/client/plugins/floatingLinkEditor/index.js +1 -9
- package/dist/features/link/client/plugins/floatingLinkEditor/index.js.map +1 -1
- package/dist/features/link/nodes/LinkNode.js.map +1 -1
- package/dist/features/lists/checklist/client/plugin/index.js +1 -7
- package/dist/features/lists/checklist/client/plugin/index.js.map +1 -1
- package/dist/features/lists/plugin/index.js +1 -7
- package/dist/features/lists/plugin/index.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js +3 -18
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js +2 -9
- package/dist/features/migrations/lexicalPluginToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js +3 -18
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/Component.js.map +1 -1
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js +2 -9
- package/dist/features/migrations/slateToLexical/nodes/unknownConvertedNode/index.js.map +1 -1
- package/dist/features/relationship/client/components/RelationshipComponent.js +31 -100
- package/dist/features/relationship/client/components/RelationshipComponent.js.map +1 -1
- package/dist/features/relationship/client/drawer/index.js +4 -21
- package/dist/features/relationship/client/drawer/index.js.map +1 -1
- package/dist/features/relationship/client/nodes/RelationshipNode.js +2 -12
- package/dist/features/relationship/client/nodes/RelationshipNode.js.map +1 -1
- package/dist/features/relationship/client/plugins/index.js +1 -8
- package/dist/features/relationship/client/plugins/index.js.map +1 -1
- package/dist/features/relationship/server/nodes/RelationshipNode.js.map +1 -1
- package/dist/features/textState/feature.client.js +5 -22
- package/dist/features/textState/feature.client.js.map +1 -1
- package/dist/features/toolbars/fixed/client/Toolbar/index.js +27 -123
- package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
- package/dist/features/toolbars/inline/client/Toolbar/index.js +18 -111
- package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarButton/index.js +4 -14
- package/dist/features/toolbars/shared/ToolbarButton/index.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js +56 -135
- package/dist/features/toolbars/shared/ToolbarDropdown/DropDown.js.map +1 -1
- package/dist/features/toolbars/shared/ToolbarDropdown/index.js +16 -70
- package/dist/features/toolbars/shared/ToolbarDropdown/index.js.map +1 -1
- package/dist/features/upload/client/component/index.js +43 -167
- package/dist/features/upload/client/component/index.js.map +1 -1
- package/dist/features/upload/client/component/pending/index.js +3 -16
- package/dist/features/upload/client/component/pending/index.js.map +1 -1
- package/dist/features/upload/client/drawer/index.js +4 -21
- package/dist/features/upload/client/drawer/index.js.map +1 -1
- package/dist/features/upload/client/nodes/UploadNode.js +3 -17
- package/dist/features/upload/client/nodes/UploadNode.js.map +1 -1
- package/dist/features/upload/client/plugin/index.js +2 -9
- package/dist/features/upload/client/plugin/index.js.map +1 -1
- package/dist/features/upload/server/nodes/UploadNode.js.map +1 -1
- package/dist/field/Diff/converters/listitem/index.js +11 -54
- package/dist/field/Diff/converters/listitem/index.js.map +1 -1
- package/dist/field/Diff/converters/relationship/index.js +18 -60
- package/dist/field/Diff/converters/relationship/index.js.map +1 -1
- package/dist/field/Diff/converters/unknown/index.js +7 -42
- package/dist/field/Diff/converters/unknown/index.js.map +1 -1
- package/dist/field/Diff/converters/upload/index.js +21 -91
- package/dist/field/Diff/converters/upload/index.js.map +1 -1
- package/dist/field/Diff/index.js +4 -17
- package/dist/field/Diff/index.js.map +1 -1
- package/dist/field/Field.js +25 -124
- package/dist/field/Field.js.map +1 -1
- package/dist/field/RenderLexical/index.js +15 -47
- package/dist/field/RenderLexical/index.js.map +1 -1
- package/dist/field/index.js +5 -24
- package/dist/field/index.js.map +1 -1
- package/dist/field/rscEntry.js +1 -9
- package/dist/field/rscEntry.js.map +1 -1
- package/dist/lexical/EditorPlugin.js +2 -17
- package/dist/lexical/EditorPlugin.js.map +1 -1
- package/dist/lexical/LexicalEditor.js +69 -232
- package/dist/lexical/LexicalEditor.js.map +1 -1
- package/dist/lexical/LexicalProvider.js +13 -64
- package/dist/lexical/LexicalProvider.js.map +1 -1
- package/dist/lexical/config/client/EditorConfigProvider.js +2 -11
- package/dist/lexical/config/client/EditorConfigProvider.js.map +1 -1
- package/dist/lexical/plugins/InsertParagraphAtEnd/index.js +5 -28
- package/dist/lexical/plugins/InsertParagraphAtEnd/index.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js +1 -14
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/index.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/index.js +31 -98
- package/dist/lexical/plugins/SlashMenu/index.js.map +1 -1
- package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js +7 -27
- package/dist/lexical/plugins/handles/AddBlockHandlePlugin/index.js.map +1 -1
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js +7 -45
- package/dist/lexical/plugins/handles/DraggableBlockPlugin/index.js.map +1 -1
- package/dist/lexical/ui/ContentEditable.js +3 -18
- package/dist/lexical/ui/ContentEditable.js.map +1 -1
- package/dist/lexical/ui/icons/AI/index.js +10 -58
- package/dist/lexical/ui/icons/AI/index.js.map +1 -1
- package/dist/lexical/ui/icons/Add/index.js +4 -31
- package/dist/lexical/ui/icons/Add/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignCenter/index.js +5 -45
- package/dist/lexical/ui/icons/AlignCenter/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignJustify/index.js +5 -45
- package/dist/lexical/ui/icons/AlignJustify/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignLeft/index.js +5 -45
- package/dist/lexical/ui/icons/AlignLeft/index.js.map +1 -1
- package/dist/lexical/ui/icons/AlignRight/index.js +5 -45
- package/dist/lexical/ui/icons/AlignRight/index.js.map +1 -1
- package/dist/lexical/ui/icons/Block/index.js +5 -54
- package/dist/lexical/ui/icons/Block/index.js.map +1 -1
- package/dist/lexical/ui/icons/Blockquote/index.js +3 -24
- package/dist/lexical/ui/icons/Blockquote/index.js.map +1 -1
- package/dist/lexical/ui/icons/Bold/index.js +3 -24
- package/dist/lexical/ui/icons/Bold/index.js.map +1 -1
- package/dist/lexical/ui/icons/Checklist/index.js +4 -39
- package/dist/lexical/ui/icons/Checklist/index.js.map +1 -1
- package/dist/lexical/ui/icons/Code/index.js +4 -34
- package/dist/lexical/ui/icons/Code/index.js.map +1 -1
- package/dist/lexical/ui/icons/CodeBlock/index.js +3 -22
- package/dist/lexical/ui/icons/CodeBlock/index.js.map +1 -1
- package/dist/lexical/ui/icons/Collapse/index.js +3 -23
- package/dist/lexical/ui/icons/Collapse/index.js.map +1 -1
- package/dist/lexical/ui/icons/H1/index.js +3 -24
- package/dist/lexical/ui/icons/H1/index.js.map +1 -1
- package/dist/lexical/ui/icons/H2/index.js +3 -24
- package/dist/lexical/ui/icons/H2/index.js.map +1 -1
- package/dist/lexical/ui/icons/H3/index.js +3 -24
- package/dist/lexical/ui/icons/H3/index.js.map +1 -1
- package/dist/lexical/ui/icons/H4/index.js +3 -24
- package/dist/lexical/ui/icons/H4/index.js.map +1 -1
- package/dist/lexical/ui/icons/H5/index.js +3 -24
- package/dist/lexical/ui/icons/H5/index.js.map +1 -1
- package/dist/lexical/ui/icons/H6/index.js +3 -24
- package/dist/lexical/ui/icons/H6/index.js.map +1 -1
- package/dist/lexical/ui/icons/HorizontalRule/index.js +3 -27
- package/dist/lexical/ui/icons/HorizontalRule/index.js.map +1 -1
- package/dist/lexical/ui/icons/IndentDecrease/index.js +6 -53
- package/dist/lexical/ui/icons/IndentDecrease/index.js.map +1 -1
- package/dist/lexical/ui/icons/IndentIncrease/index.js +6 -53
- package/dist/lexical/ui/icons/IndentIncrease/index.js.map +1 -1
- package/dist/lexical/ui/icons/InlineBlocks/index.js +3 -26
- package/dist/lexical/ui/icons/InlineBlocks/index.js.map +1 -1
- package/dist/lexical/ui/icons/Italic/index.js +3 -24
- package/dist/lexical/ui/icons/Italic/index.js.map +1 -1
- package/dist/lexical/ui/icons/Link/index.js +3 -25
- package/dist/lexical/ui/icons/Link/index.js.map +1 -1
- package/dist/lexical/ui/icons/Meatballs/index.js +5 -39
- package/dist/lexical/ui/icons/Meatballs/index.js.map +1 -1
- package/dist/lexical/ui/icons/OrderedList/index.js +7 -61
- package/dist/lexical/ui/icons/OrderedList/index.js.map +1 -1
- package/dist/lexical/ui/icons/Relationship/index.js +10 -58
- package/dist/lexical/ui/icons/Relationship/index.js.map +1 -1
- package/dist/lexical/ui/icons/Strikethrough/index.js +4 -34
- package/dist/lexical/ui/icons/Strikethrough/index.js.map +1 -1
- package/dist/lexical/ui/icons/Subscript/index.js +3 -24
- package/dist/lexical/ui/icons/Subscript/index.js.map +1 -1
- package/dist/lexical/ui/icons/Superscript/index.js +3 -24
- package/dist/lexical/ui/icons/Superscript/index.js.map +1 -1
- package/dist/lexical/ui/icons/Table/index.js +3 -24
- package/dist/lexical/ui/icons/Table/index.js.map +1 -1
- package/dist/lexical/ui/icons/Text/index.js +3 -24
- package/dist/lexical/ui/icons/Text/index.js.map +1 -1
- package/dist/lexical/ui/icons/TextState/index.js +12 -18
- package/dist/lexical/ui/icons/TextState/index.js.map +1 -1
- package/dist/lexical/ui/icons/Underline/index.js +4 -34
- package/dist/lexical/ui/icons/Underline/index.js.map +1 -1
- package/dist/lexical/ui/icons/UnorderedList/index.js +8 -81
- package/dist/lexical/ui/icons/UnorderedList/index.js.map +1 -1
- package/dist/lexical/ui/icons/Upload/index.js +5 -48
- package/dist/lexical/ui/icons/Upload/index.js.map +1 -1
- package/dist/lexical/utils/point.js.map +1 -1
- package/dist/lexical/utils/rect.js.map +1 -1
- package/dist/utilities/fieldsDrawer/Drawer.js +16 -41
- package/dist/utilities/fieldsDrawer/Drawer.js.map +1 -1
- package/dist/utilities/fieldsDrawer/DrawerContent.js +10 -42
- package/dist/utilities/fieldsDrawer/DrawerContent.js.map +1 -1
- package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js +1 -9
- package/dist/utilities/fieldsDrawer/useLexicalDocumentDrawer.js.map +1 -1
- package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js +3 -11
- package/dist/utilities/fieldsDrawer/useLexicalListDrawer.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { TableObserver, TableSelection } 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 $computeTableMapSkipCellCheck,\n $deleteTableColumnAtSelection,\n $deleteTableRowAtSelection,\n $getNodeTriplet,\n $getTableCellNodeFromLexicalNode,\n $getTableColumnIndexFromTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $isTableCellNode,\n $isTableSelection,\n $mergeCells,\n $unmergeCell,\n getTableElement,\n getTableObserverFromTableElement,\n TableCellHeaderStates,\n TableCellNode,\n} from '@lexical/table'\nimport { mergeRegister } from '@lexical/utils'\nimport { useScrollInfo } from '@payloadcms/ui'\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n $isTextNode,\n $setSelection,\n COMMAND_PRIORITY_CRITICAL,\n getDOMSelection,\n isDOMNode,\n SELECTION_CHANGE_COMMAND,\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 './index.scss'\nimport { MeatballsIcon } from '../../../../../lexical/ui/icons/Meatballs/index.js'\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\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 $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\n setCanMergeCells(currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1)\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\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 isDOMNode(event.target) &&\n !dropDownRef.current.contains(event.target) &&\n !contextRef.current.contains(event.target)\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 = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('Expected to find tableElement in DOM')\n }\n\n const tableObserver = getTableObserverFromTableElement(tableElement)\n if (tableObserver !== null) {\n tableObserver.$clearHighlight()\n }\n\n tableNode.markDirty()\n updateTableCellNode(tableCellNode.getLatest())\n }\n\n $setSelection(null)\n })\n }, [editor, tableCellNode])\n\n const mergeTableCellsAtSelection = () => {\n editor.update(() => {\n const selection = $getSelection()\n if (!$isTableSelection(selection)) {\n return\n }\n const nodes = selection.getNodes()\n const tableCells = nodes.filter($isTableCellNode)\n const targetCell = $mergeCells(tableCells)\n\n if (targetCell) {\n $selectLastDescendant(targetCell)\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 for (let i = 0; i < selectionCounts.rows; i++) {\n $insertTableRowAtSelection(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.rows],\n )\n\n const insertTableColumnAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.columns; i++) {\n $insertTableColumnAtSelection(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.columns],\n )\n\n const deleteTableRowAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableRowAtSelection()\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 $deleteTableColumnAtSelection()\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 [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const rowCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW\n if (gridMap[tableRowIndex]) {\n for (let col = 0; col < gridMap[tableRowIndex].length; col++) {\n const mapCell = gridMap[tableRowIndex][col]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!rowCells.has(mapCell.cell)) {\n rowCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW)\n }\n }\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 [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const columnCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN\n if (gridMap) {\n for (let row = 0; row < gridMap.length; row++) {\n const mapCell = gridMap?.[row]?.[tableColumnIndex]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!columnCells.has(mapCell.cell)) {\n columnCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN)\n }\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleRowStriping = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setRowStriping(!tableNode.getRowStriping())\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleFirstColumnFreeze = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setFrozenColumns(tableNode.getFrozenColumns() === 0 ? 1 : 0)\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 <span className=\"text\">Merge cells</span>\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 <span className=\"text\">Unmerge cells</span>\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-row-striping\"\n onClick={() => toggleRowStriping()}\n type=\"button\"\n >\n <span className=\"text\">Toggle Row Striping</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-freeze-first-column\"\n onClick={() => toggleFirstColumnFreeze()}\n type=\"button\"\n >\n <span className=\"text\">Toggle First Column Freeze</span>\n </button>\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\n className=\"item\"\n data-test-id=\"table-row-header\"\n onClick={() => toggleTableRowIsHeader()}\n type=\"button\"\n >\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<HTMLDivElement | null>(null)\n const menuRootRef = useRef<HTMLButtonElement | null>(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 = getDOMSelection(editor._window)\n const activeElement = document.activeElement\n function disable() {\n if (menu) {\n menu.classList.remove('table-cell-action-button-container--active')\n menu.classList.add('table-cell-action-button-container--inactive')\n }\n setTableMenuCellNode(null)\n }\n\n if (selection == null || menu == null) {\n return disable()\n }\n\n const rootElement = editor.getRootElement()\n let tableObserver: null | TableObserver = null\n let tableCellParentNodeDOM: HTMLElement | null = null\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 return disable()\n }\n\n tableCellParentNodeDOM = editor.getElementByKey(tableCellNodeFromSelection.getKey())\n\n if (tableCellParentNodeDOM == null || !tableCellNodeFromSelection.isAttached()) {\n return disable()\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNodeFromSelection)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n setTableMenuCellNode(tableCellNodeFromSelection)\n } else if ($isTableSelection(selection)) {\n const anchorNode = $getTableCellNodeFromLexicalNode(selection.anchor.getNode())\n if (!$isTableCellNode(anchorNode)) {\n throw new Error('TableSelection anchorNode must be a TableCellNode')\n }\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(anchorNode)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n tableCellParentNodeDOM = editor.getElementByKey(anchorNode.getKey())\n } else if (!activeElement) {\n return disable()\n }\n if (tableObserver === null || tableCellParentNodeDOM === null) {\n return disable()\n }\n const enabled = !tableObserver || !tableObserver.isSelecting\n menu.classList.toggle('table-cell-action-button-container--active', enabled)\n menu.classList.toggle('table-cell-action-button-container--inactive', !enabled)\n if (enabled) {\n const tableCellRect = tableCellParentNodeDOM.getBoundingClientRect()\n const anchorRect = anchorElem.getBoundingClientRect()\n const top = tableCellRect.top - anchorRect.top\n const left = tableCellRect.right - anchorRect.left\n menu.style.transform = `translate(${left}px, ${top}px)`\n }\n }, [editor, anchorElem])\n\n useEffect(() => {\n // We call the $moveMenu callback every time the selection changes,\n // once up front, and once after each pointerup\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined\n const callback = () => {\n timeoutId = undefined\n editor.getEditorState().read($moveMenu)\n }\n const delayedCallback = () => {\n if (timeoutId === undefined) {\n timeoutId = setTimeout(callback, 0)\n }\n return false\n }\n return mergeRegister(\n editor.registerUpdateListener(delayedCallback),\n editor.registerCommand(SELECTION_CHANGE_COMMAND, delayedCallback, COMMAND_PRIORITY_CRITICAL),\n editor.registerRootListener((rootElement, prevRootElement) => {\n if (prevRootElement) {\n prevRootElement.removeEventListener('pointerup', delayedCallback)\n }\n if (rootElement) {\n rootElement.addEventListener('pointerup', delayedCallback)\n delayedCallback()\n }\n }),\n () => clearTimeout(timeoutId),\n )\n })\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"],"names":["useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$deleteTableColumnAtSelection","$deleteTableRowAtSelection","$getNodeTriplet","$getTableCellNodeFromLexicalNode","$getTableColumnIndexFromTableCellNode","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$insertTableColumnAtSelection","$insertTableRowAtSelection","$isTableCellNode","$isTableSelection","$mergeCells","$unmergeCell","getTableElement","getTableObserverFromTableElement","TableCellHeaderStates","TableCellNode","mergeRegister","useScrollInfo","$getSelection","$isElementNode","$isRangeSelection","$isTextNode","$setSelection","COMMAND_PRIORITY_CRITICAL","getDOMSelection","isDOMNode","SELECTION_CHANGE_COMMAND","React","useCallback","useEffect","useRef","useState","createPortal","MeatballsIcon","computeSelectionCount","selection","selectionShape","getShape","columns","toX","fromX","rows","toY","fromY","$canUnmerge","isCollapsed","anchor","is","focus","cell","__colSpan","__rowSpan","$selectLastDescendant","node","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","handleClickOutside","event","target","contains","addEventListener","removeEventListener","clearTableSelection","update","isAttached","tableNode","tableElement","getElementByKey","Error","tableObserver","$clearHighlight","markDirty","mergeTableCellsAtSelection","nodes","getNodes","tableCells","filter","targetCell","unmergeTableCellsAtSelection","insertTableRowAtSelection","shouldInsertAfter","i","insertTableColumnAtSelection","deleteTableRowAtSelection","deleteTableAtSelection","remove","deleteTableColumnAtSelection","toggleTableRowIsHeader","tableRowIndex","gridMap","rowCells","Set","newStyle","getHeaderStyles","ROW","col","length","mapCell","has","add","setHeaderStyles","toggleTableColumnIsHeader","tableColumnIndex","columnCells","COLUMN","row","toggleRowStriping","setRowStriping","getRowStriping","toggleFirstColumnFreeze","setFrozenColumns","getFrozenColumns","mergeCellButton","button","className","data-test-id","onClick","type","span","div","e","stopPropagation","ref","Fragment","hr","__headerState","document","body","TableCellActionMenuContainer","anchorElem","menuButtonRef","menuRootRef","isMenuOpen","setTableMenuCellNode","$moveMenu","menu","nativeSelection","_window","activeElement","disable","classList","tableCellParentNodeDOM","anchorNode","tableCellNodeFromSelection","getNode","enabled","isSelecting","toggle","tableCellRect","anchorRect","transform","timeoutId","undefined","callback","delayedCallback","setTimeout","registerUpdateListener","registerCommand","registerRootListener","prevRootElement","clearTimeout","prevTableCellDOM","TableActionMenuPlugin","isEditable"],"mappings":"AAAA;;AAMA,SAASA,yBAAyB,QAAQ,wCAAuC;AACjF,SAASC,kBAAkB,QAAQ,oCAAmC;AACtE,SACEC,6BAA6B,EAC7BC,6BAA6B,EAC7BC,0BAA0B,EAC1BC,eAAe,EACfC,gCAAgC,EAChCC,qCAAqC,EACrCC,mCAAmC,EACnCC,kCAAkC,EAClCC,6BAA6B,EAC7BC,0BAA0B,EAC1BC,gBAAgB,EAChBC,iBAAiB,EACjBC,WAAW,EACXC,YAAY,EACZC,eAAe,EACfC,gCAAgC,EAChCC,qBAAqB,EACrBC,aAAa,QACR,iBAAgB;AACvB,SAASC,aAAa,QAAQ,iBAAgB;AAC9C,SAASC,aAAa,QAAQ,iBAAgB;AAC9C,SACEC,aAAa,EACbC,cAAc,EACdC,iBAAiB,EACjBC,WAAW,EACXC,aAAa,EACbC,yBAAyB,EACzBC,eAAe,EACfC,SAAS,EACTC,wBAAwB,QACnB,UAAS;AAChB,YAAYC,WAAW,QAAO;AAC9B,SAASC,WAAW,EAAEC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAChE,SAASC,YAAY,QAAQ,YAAW;AAIxC,OAAO,eAAc;AACrB,SAASC,aAAa,QAAQ,qDAAoD;AAElF,SAASC,sBAAsBC,SAAyB;IAItD,MAAMC,iBAAiBD,UAAUE,QAAQ;IACzC,OAAO;QACLC,SAASF,eAAeG,GAAG,GAAGH,eAAeI,KAAK,GAAG;QACrDC,MAAML,eAAeM,GAAG,GAAGN,eAAeO,KAAK,GAAG;IACpD;AACF;AAEA,SAASC;IACP,MAAMT,YAAYjB;IAClB,IACE,AAACE,kBAAkBe,cAAc,CAACA,UAAUU,WAAW,MACtDpC,kBAAkB0B,cAAc,CAACA,UAAUW,MAAM,CAACC,EAAE,CAACZ,UAAUa,KAAK,KACpE,CAAC5B,kBAAkBe,cAAc,CAAC1B,kBAAkB0B,YACrD;QACA,OAAO;IACT;IACA,MAAM,CAACc,KAAK,GAAGhD,gBAAgBkC,UAAUW,MAAM;IAC/C,OAAOG,KAAKC,SAAS,GAAG,KAAKD,KAAKE,SAAS,GAAG;AAChD;AAEA,SAASC,sBAAsBC,IAAiB;IAC9C,MAAMC,iBAAiBD,KAAKE,iBAAiB;IAC7C,IAAIlC,YAAYiC,iBAAiB;QAC/BA,eAAeE,MAAM;IACvB,OAAO,IAAIrC,eAAemC,iBAAiB;QACzCA,eAAeG,SAAS;IAC1B,OAAO,IAAIH,mBAAmB,MAAM;QAClCA,eAAeI,UAAU;IAC3B;AACF;AAUA,SAASC,gBAAgB,EACvBC,SAAS,EACTC,UAAU,EACVC,OAAO,EACPC,aAAa,EACbC,eAAeC,cAAc,EACJ;IACzB,MAAM,CAACC,OAAO,GAAGtE;IACjB,MAAMuE,cAAcrC,OAA8B;IAClD,MAAM,CAACkC,eAAeI,oBAAoB,GAAGrC,SAASkC;IACtD,MAAM,CAACI,iBAAiBC,sBAAsB,GAAGvC,SAAS;QACxDO,SAAS;QACTG,MAAM;IACR;IACA,MAAM,CAAC8B,eAAeC,iBAAiB,GAAGzC,SAAS;IACnD,MAAM,CAAC0C,gBAAgBC,kBAAkB,GAAG3C,SAAS;IACrD,MAAM,EAAE4C,CAAC,EAAE,GAAG1D;IAEdY,UAAU;QACR,OAAOqC,OAAOU,wBAAwB,CACpC7D,eACA,CAAC8D;YACC,MAAMC,cAAcD,cAAcE,GAAG,CAACf,cAAcgB,MAAM,QAAQ;YAElE,IAAIF,aAAa;gBACfZ,OAAOe,cAAc,GAAGC,IAAI,CAAC;oBAC3Bd,oBAAoBJ,cAAcmB,SAAS;gBAC7C;YACF;QACF,GACA;YAAEC,oBAAoB;QAAK;IAE/B,GAAG;QAAClB;QAAQF;KAAc;IAE1BnC,UAAU;QACRqC,OAAOe,cAAc,GAAGC,IAAI,CAAC;YAC3B,MAAM/C,YAAYjB;YAClB,cAAc;YACd,IAAIT,kBAAkB0B,YAAY;gBAChC,MAAMkD,yBAAyBnD,sBAAsBC;gBACrDmC,sBAAsBpC,sBAAsBC;gBAE5CqC,iBAAiBa,uBAAuB/C,OAAO,GAAG,KAAK+C,uBAAuB5C,IAAI,GAAG;YACvF;YACA,eAAe;YACfiC,kBAAkB9B;QACpB;IACF,GAAG;QAACsB;KAAO;IAEXrC,UAAU;QACR,MAAMyD,oBAAoBzB,WAAW0B,OAAO;QAC5C,MAAMC,kBAAkBrB,YAAYoB,OAAO;QAC3C,MAAME,cAAcvB,OAAOwB,cAAc;QAEzC,IAAIJ,qBAAqB,QAAQE,mBAAmB,QAAQC,eAAe,MAAM;YAC/E,MAAME,cAAcF,YAAYG,qBAAqB;YACrD,MAAMC,iBAAiBP,kBAAkBM,qBAAqB;YAC9DJ,gBAAgBM,KAAK,CAACC,OAAO,GAAG;YAChC,MAAMC,sBAAsBR,gBAAgBI,qBAAqB;YACjE,MAAMK,SAAS;YACf,IAAIC,eAAeL,eAAeM,KAAK,GAAGF;YAC1C,IACEC,eAAeF,oBAAoBI,KAAK,GAAGC,OAAOC,UAAU,IAC5DJ,eAAeF,oBAAoBI,KAAK,GAAGT,YAAYQ,KAAK,EAC5D;gBACA,MAAMI,WAAWV,eAAeW,IAAI,GAAGR,oBAAoBI,KAAK,GAAGH;gBACnEC,eAAe,AAACK,CAAAA,WAAW,IAAIN,SAASM,QAAO,IAAKF,OAAOI,WAAW;YACxE;YACAjB,gBAAgBM,KAAK,CAACU,IAAI,GAAG,GAAGN,eAAeG,OAAOI,WAAW,CAAC,EAAE,CAAC;YAErE,IAAIC,cAAcb,eAAec,GAAG;YACpC,IAAID,cAAcV,oBAAoBY,MAAM,GAAGP,OAAOQ,WAAW,EAAE;gBACjE,MAAMN,WAAWV,eAAeiB,MAAM,GAAGd,oBAAoBY,MAAM;gBACnEF,cAAcH,WAAW,IAAIN,SAASM;YACxC;YACAf,gBAAgBM,KAAK,CAACa,GAAG,GAAG,GAAGD,YAAY,EAAE,CAAC;QAChD;IACF,GAAG;QAAC7C;QAAYM;QAAaD;QAAQS;KAAE;IAEvC9C,UAAU;QACR,SAASkF,mBAAmBC,KAAiB;YAC3C,IACE7C,YAAYoB,OAAO,IAAI,QACvB1B,WAAW0B,OAAO,IAAI,QACtB9D,UAAUuF,MAAMC,MAAM,KACtB,CAAC9C,YAAYoB,OAAO,CAAC2B,QAAQ,CAACF,MAAMC,MAAM,KAC1C,CAACpD,WAAW0B,OAAO,CAAC2B,QAAQ,CAACF,MAAMC,MAAM,GACzC;gBACAlD,cAAc;YAChB;QACF;QAEAsC,OAAOc,gBAAgB,CAAC,SAASJ;QAEjC,OAAO,IAAMV,OAAOe,mBAAmB,CAAC,SAASL;IACnD,GAAG;QAAChD;QAAeF;KAAW;IAE9B,MAAMwD,sBAAsBzF,YAAY;QACtCsC,OAAOoD,MAAM,CAAC;YACZ,IAAItD,cAAcuD,UAAU,IAAI;gBAC9B,MAAMC,YAAYpH,oCAAoC4D;gBACtD,MAAMyD,eAAe7G,gBAAgB4G,WAAWtD,OAAOwD,eAAe,CAACF,UAAUxC,MAAM;gBAEvF,IAAIyC,iBAAiB,MAAM;oBACzB,MAAM,IAAIE,MAAM;gBAClB;gBAEA,MAAMC,gBAAgB/G,iCAAiC4G;gBACvD,IAAIG,kBAAkB,MAAM;oBAC1BA,cAAcC,eAAe;gBAC/B;gBAEAL,UAAUM,SAAS;gBACnB1D,oBAAoBJ,cAAcmB,SAAS;YAC7C;YAEA7D,cAAc;QAChB;IACF,GAAG;QAAC4C;QAAQF;KAAc;IAE1B,MAAM+D,6BAA6B;QACjC7D,OAAOoD,MAAM,CAAC;YACZ,MAAMnF,YAAYjB;YAClB,IAAI,CAACT,kBAAkB0B,YAAY;gBACjC;YACF;YACA,MAAM6F,QAAQ7F,UAAU8F,QAAQ;YAChC,MAAMC,aAAaF,MAAMG,MAAM,CAAC3H;YAChC,MAAM4H,aAAa1H,YAAYwH;YAE/B,IAAIE,YAAY;gBACdhF,sBAAsBgF;gBACtBtE;YACF;QACF;IACF;IAEA,MAAMuE,+BAA+B;QACnCnE,OAAOoD,MAAM,CAAC;YACZ3G;QACF;IACF;IAEA,MAAM2H,4BAA4B1G,YAChC,CAAC2G;QACCrE,OAAOoD,MAAM,CAAC;YACZ,IAAK,IAAIkB,IAAI,GAAGA,IAAInE,gBAAgB5B,IAAI,EAAE+F,IAAK;gBAC7CjI,2BAA2BgI;YAC7B;YACAzE;QACF;IACF,GACA;QAACI;QAAQJ;QAASO,gBAAgB5B,IAAI;KAAC;IAGzC,MAAMgG,+BAA+B7G,YACnC,CAAC2G;QACCrE,OAAOoD,MAAM,CAAC;YACZ,IAAK,IAAIkB,IAAI,GAAGA,IAAInE,gBAAgB/B,OAAO,EAAEkG,IAAK;gBAChDlI,8BAA8BiI;YAChC;YACAzE;QACF;IACF,GACA;QAACI;QAAQJ;QAASO,gBAAgB/B,OAAO;KAAC;IAG5C,MAAMoG,4BAA4B9G,YAAY;QAC5CsC,OAAOoD,MAAM,CAAC;YACZtH;YACA8D;QACF;IACF,GAAG;QAACI;QAAQJ;KAAQ;IAEpB,MAAM6E,yBAAyB/G,YAAY;QACzCsC,OAAOoD,MAAM,CAAC;YACZ,MAAME,YAAYpH,oCAAoC4D;YACtDwD,UAAUoB,MAAM;YAEhBvB;YACAvD;QACF;IACF,GAAG;QAACI;QAAQF;QAAeqD;QAAqBvD;KAAQ;IAExD,MAAM+E,+BAA+BjH,YAAY;QAC/CsC,OAAOoD,MAAM,CAAC;YACZvH;YACA+D;QACF;IACF,GAAG;QAACI;QAAQJ;KAAQ;IAEpB,MAAMgF,yBAAyBlH,YAAY;QACzCsC,OAAOoD,MAAM,CAAC;YACZ,MAAME,YAAYpH,oCAAoC4D;YAEtD,MAAM+E,gBAAgB1I,mCAAmC2D;YAEzD,MAAM,CAACgF,QAAQ,GAAGlJ,8BAA8B0H,WAAW,MAAM;YAEjE,MAAMyB,WAAW,IAAIC;YAErB,MAAMC,WAAWnF,cAAcoF,eAAe,KAAKtI,sBAAsBuI,GAAG;YAC5E,IAAIL,OAAO,CAACD,cAAc,EAAE;gBAC1B,IAAK,IAAIO,MAAM,GAAGA,MAAMN,OAAO,CAACD,cAAc,CAACQ,MAAM,EAAED,MAAO;oBAC5D,MAAME,UAAUR,OAAO,CAACD,cAAc,CAACO,IAAI;oBAE3C,IAAI,CAACE,SAASvG,MAAM;wBAClB;oBACF;oBAEA,IAAI,CAACgG,SAASQ,GAAG,CAACD,QAAQvG,IAAI,GAAG;wBAC/BgG,SAASS,GAAG,CAACF,QAAQvG,IAAI;wBACzBuG,QAAQvG,IAAI,CAAC0G,eAAe,CAACR,UAAUrI,sBAAsBuI,GAAG;oBAClE;gBACF;YACF;YAEAhC;YACAvD;QACF;IACF,GAAG;QAACI;QAAQF;QAAeqD;QAAqBvD;KAAQ;IAExD,MAAM8F,4BAA4BhI,YAAY;QAC5CsC,OAAOoD,MAAM,CAAC;YACZ,MAAME,YAAYpH,oCAAoC4D;YAEtD,MAAM6F,mBAAmB1J,sCAAsC6D;YAE/D,MAAM,CAACgF,QAAQ,GAAGlJ,8BAA8B0H,WAAW,MAAM;YAEjE,MAAMsC,cAAc,IAAIZ;YAExB,MAAMC,WAAWnF,cAAcoF,eAAe,KAAKtI,sBAAsBiJ,MAAM;YAC/E,IAAIf,SAAS;gBACX,IAAK,IAAIgB,MAAM,GAAGA,MAAMhB,QAAQO,MAAM,EAAES,MAAO;oBAC7C,MAAMR,UAAUR,SAAS,CAACgB,IAAI,EAAE,CAACH,iBAAiB;oBAElD,IAAI,CAACL,SAASvG,MAAM;wBAClB;oBACF;oBAEA,IAAI,CAAC6G,YAAYL,GAAG,CAACD,QAAQvG,IAAI,GAAG;wBAClC6G,YAAYJ,GAAG,CAACF,QAAQvG,IAAI;wBAC5BuG,QAAQvG,IAAI,CAAC0G,eAAe,CAACR,UAAUrI,sBAAsBiJ,MAAM;oBACrE;gBACF;YACF;YAEA1C;YACAvD;QACF;IACF,GAAG;QAACI;QAAQF;QAAeqD;QAAqBvD;KAAQ;IAExD,MAAMmG,oBAAoBrI,YAAY;QACpCsC,OAAOoD,MAAM,CAAC;YACZ,IAAItD,cAAcuD,UAAU,IAAI;gBAC9B,MAAMC,YAAYpH,oCAAoC4D;gBACtD,IAAIwD,WAAW;oBACbA,UAAU0C,cAAc,CAAC,CAAC1C,UAAU2C,cAAc;gBACpD;YACF;YAEA9C;YACAvD;QACF;IACF,GAAG;QAACI;QAAQF;QAAeqD;QAAqBvD;KAAQ;IAExD,MAAMsG,0BAA0BxI,YAAY;QAC1CsC,OAAOoD,MAAM,CAAC;YACZ,IAAItD,cAAcuD,UAAU,IAAI;gBAC9B,MAAMC,YAAYpH,oCAAoC4D;gBACtD,IAAIwD,WAAW;oBACbA,UAAU6C,gBAAgB,CAAC7C,UAAU8C,gBAAgB,OAAO,IAAI,IAAI;gBACtE;YACF;YACAjD;YACAvD;QACF;IACF,GAAG;QAACI;QAAQF;QAAeqD;QAAqBvD;KAAQ;IAExD,IAAIyG,kBAAsC;IAC1C,IAAI3G,WAAW;QACb,IAAIW,eAAe;YACjBgG,gCACE,QAACC;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAM5C;gBACf6C,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;8BAAO;;;;;;;;;;;QAG7B,OAAO,IAAIhG,gBAAgB;YACzB8F,gCACE,QAACC;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAMtC;gBACfuC,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;8BAAO;;;;;;;;;;;QAG7B;IACF;IAEA,qBAAOzI,aACL,yGAAyG;kBACzG,QAAC8I;QACCL,WAAU;QACVE,SAAS,CAACI;YACRA,EAAEC,eAAe;QACnB;QACAC,KAAK9G;;YAEJoG,gCACC,QAAC5I,MAAMuJ,QAAQ;;oBACZX;kCACD,QAACY;;;;;;;;;;uBAED;0BAEJ,QAACX;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAMV;gBACfW,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;8BAAO;;;;;;;;;;;0BAEzB,QAACD;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAMP;gBACfQ,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;8BAAO;;;;;;;;;;;0BAEzB,QAACD;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAMrC,0BAA0B;gBACzCsC,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;;wBAAO;wBACbpG,gBAAgB5B,IAAI,KAAK,IAAI,QAAQ,GAAG4B,gBAAgB5B,IAAI,CAAC,KAAK,CAAC;wBAAC;;;;;;;;;;;;0BAGhF,QAAC+H;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAMrC,0BAA0B;gBACzCsC,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;;wBAAO;wBACbpG,gBAAgB5B,IAAI,KAAK,IAAI,QAAQ,GAAG4B,gBAAgB5B,IAAI,CAAC,KAAK,CAAC;wBAAC;;;;;;;;;;;;0BAGhF,QAAC0I;;;;;0BACD,QAACX;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAMlC,6BAA6B;gBAC5CmC,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;;wBAAO;wBACbpG,gBAAgB/B,OAAO,KAAK,IAAI,WAAW,GAAG+B,gBAAgB/B,OAAO,CAAC,QAAQ,CAAC;wBAAE;wBAAI;;;;;;;;;;;;0BAIjG,QAACkI;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAMlC,6BAA6B;gBAC5CmC,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;;wBAAO;wBACbpG,gBAAgB/B,OAAO,KAAK,IAAI,WAAW,GAAG+B,gBAAgB/B,OAAO,CAAC,QAAQ,CAAC;wBAAE;wBAAI;;;;;;;;;;;;0BAIjG,QAAC6I;;;;;0BACD,QAACX;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAM9B;gBACf+B,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;8BAAO;;;;;;;;;;;0BAEzB,QAACD;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAMjC;gBACfkC,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;8BAAO;;;;;;;;;;;0BAEzB,QAACD;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAMhC;gBACfiC,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;8BAAO;;;;;;;;;;;0BAEzB,QAACU;;;;;0BACD,QAACX;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAM7B;gBACf8B,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;;wBACZzG,CAAAA,cAAcoH,aAAa,GAAGtK,sBAAsBuI,GAAG,AAAD,MAAOvI,sBAAsBuI,GAAG,GACpF,WACA;wBAAO;wBAAI;;;;;;;;;;;;0BAInB,QAACmB;gBACCC,WAAU;gBACVC,gBAAa;gBACbC,SAAS,IAAMf;gBACfgB,MAAK;0BAEL,cAAA,QAACC;oBAAKJ,WAAU;;wBACZzG,CAAAA,cAAcoH,aAAa,GAAGtK,sBAAsBiJ,MAAM,AAAD,MAC3DjJ,sBAAsBiJ,MAAM,GACxB,WACA;wBAAO;wBAAI;;;;;;;;;;;;;;;;;cAKrBsB,SAASC,IAAI;AAEjB;AAEA,SAASC,6BAA6B,EACpCC,UAAU,EACV5H,SAAS,EAIV;IACC,MAAM,CAACM,OAAO,GAAGtE;IAEjB,MAAM6L,gBAAgB3J,OAA8B;IACpD,MAAM4J,cAAc5J,OAAiC;IACrD,MAAM,CAAC6J,YAAY5H,cAAc,GAAGhC,SAAS;IAE7C,MAAM,CAACiC,eAAe4H,qBAAqB,GAAG7J,SAA+B;IAE7E,MAAM8J,YAAYjK,YAAY;QAC5B,MAAMkK,OAAOL,cAAclG,OAAO;QAClC,MAAMpD,YAAYjB;QAClB,MAAM6K,kBAAkBvK,gBAAgB0C,OAAO8H,OAAO;QACtD,MAAMC,gBAAgBZ,SAASY,aAAa;QAC5C,SAASC;YACP,IAAIJ,MAAM;gBACRA,KAAKK,SAAS,CAACvD,MAAM,CAAC;gBACtBkD,KAAKK,SAAS,CAACzC,GAAG,CAAC;YACrB;YACAkC,qBAAqB;QACvB;QAEA,IAAIzJ,aAAa,QAAQ2J,QAAQ,MAAM;YACrC,OAAOI;QACT;QAEA,MAAMzG,cAAcvB,OAAOwB,cAAc;QACzC,IAAIkC,gBAAsC;QAC1C,IAAIwE,yBAA6C;QAEjD,IACEhL,kBAAkBe,cAClBsD,gBAAgB,QAChBsG,oBAAoB,QACpBtG,YAAYyB,QAAQ,CAAC6E,gBAAgBM,UAAU,GAC/C;YACA,MAAMC,6BAA6BpM,iCACjCiC,UAAUW,MAAM,CAACyJ,OAAO;YAG1B,IAAID,8BAA8B,MAAM;gBACtC,OAAOJ;YACT;YAEAE,yBAAyBlI,OAAOwD,eAAe,CAAC4E,2BAA2BtH,MAAM;YAEjF,IAAIoH,0BAA0B,QAAQ,CAACE,2BAA2B/E,UAAU,IAAI;gBAC9E,OAAO2E;YACT;YAEA,MAAM1E,YAAYpH,oCAAoCkM;YACtD,MAAM7E,eAAe7G,gBAAgB4G,WAAWtD,OAAOwD,eAAe,CAACF,UAAUxC,MAAM;YAEvF,IAAIyC,iBAAiB,MAAM;gBACzB,MAAM,IAAIE,MAAM;YAClB;YAEAC,gBAAgB/G,iCAAiC4G;YACjDmE,qBAAqBU;QACvB,OAAO,IAAI7L,kBAAkB0B,YAAY;YACvC,MAAMkK,aAAanM,iCAAiCiC,UAAUW,MAAM,CAACyJ,OAAO;YAC5E,IAAI,CAAC/L,iBAAiB6L,aAAa;gBACjC,MAAM,IAAI1E,MAAM;YAClB;YACA,MAAMH,YAAYpH,oCAAoCiM;YACtD,MAAM5E,eAAe7G,gBAAgB4G,WAAWtD,OAAOwD,eAAe,CAACF,UAAUxC,MAAM;YAEvF,IAAIyC,iBAAiB,MAAM;gBACzB,MAAM,IAAIE,MAAM;YAClB;YAEAC,gBAAgB/G,iCAAiC4G;YACjD2E,yBAAyBlI,OAAOwD,eAAe,CAAC2E,WAAWrH,MAAM;QACnE,OAAO,IAAI,CAACiH,eAAe;YACzB,OAAOC;QACT;QACA,IAAItE,kBAAkB,QAAQwE,2BAA2B,MAAM;YAC7D,OAAOF;QACT;QACA,MAAMM,UAAU,CAAC5E,iBAAiB,CAACA,cAAc6E,WAAW;QAC5DX,KAAKK,SAAS,CAACO,MAAM,CAAC,8CAA8CF;QACpEV,KAAKK,SAAS,CAACO,MAAM,CAAC,gDAAgD,CAACF;QACvE,IAAIA,SAAS;YACX,MAAMG,gBAAgBP,uBAAuBxG,qBAAqB;YAClE,MAAMgH,aAAapB,WAAW5F,qBAAqB;YACnD,MAAMe,MAAMgG,cAAchG,GAAG,GAAGiG,WAAWjG,GAAG;YAC9C,MAAMH,OAAOmG,cAAcxG,KAAK,GAAGyG,WAAWpG,IAAI;YAClDsF,KAAKhG,KAAK,CAAC+G,SAAS,GAAG,CAAC,UAAU,EAAErG,KAAK,IAAI,EAAEG,IAAI,GAAG,CAAC;QACzD;IACF,GAAG;QAACzC;QAAQsH;KAAW;IAEvB3J,UAAU;QACR,mEAAmE;QACnE,+CAA+C;QAC/C,IAAIiL,YAAuDC;QAC3D,MAAMC,WAAW;YACfF,YAAYC;YACZ7I,OAAOe,cAAc,GAAGC,IAAI,CAAC2G;QAC/B;QACA,MAAMoB,kBAAkB;YACtB,IAAIH,cAAcC,WAAW;gBAC3BD,YAAYI,WAAWF,UAAU;YACnC;YACA,OAAO;QACT;QACA,OAAOhM,cACLkD,OAAOiJ,sBAAsB,CAACF,kBAC9B/I,OAAOkJ,eAAe,CAAC1L,0BAA0BuL,iBAAiB1L,4BAClE2C,OAAOmJ,oBAAoB,CAAC,CAAC5H,aAAa6H;YACxC,IAAIA,iBAAiB;gBACnBA,gBAAgBlG,mBAAmB,CAAC,aAAa6F;YACnD;YACA,IAAIxH,aAAa;gBACfA,YAAY0B,gBAAgB,CAAC,aAAa8F;gBAC1CA;YACF;QACF,IACA,IAAMM,aAAaT;IAEvB;IAEA,MAAMU,mBAAmB1L,OAAOkC;IAEhCnC,UAAU;QACR,IAAI2L,iBAAiBjI,OAAO,KAAKvB,eAAe;YAC9CD,cAAc;QAChB;QAEAyJ,iBAAiBjI,OAAO,GAAGvB;IAC7B,GAAG;QAACwJ;QAAkBxJ;KAAc;IAEpC,qBACE,QAAC8G;QAAIL,WAAU;QAAqCQ,KAAKQ;kBACtDzH,iBAAiB,sBAChB,QAACrC,MAAMuJ,QAAQ;;8BACb,QAACV;oBACCC,WAAU;oBACVE,SAAS,CAACI;wBACRA,EAAEC,eAAe;wBACjBjH,cAAc,CAAC4H;oBACjB;oBACAV,KAAKS;oBACLd,MAAK;8BAEL,cAAA,QAAC3I;;;;;;;;;;gBAEF0J,4BACC,QAAChI;oBACCC,WAAWA;oBACXC,YAAY6H;oBACZ5H,SAAS,IAAMC,cAAc;oBAC7BA,eAAeA;oBACfC,eAAeA;;;;;;;;;;;;;;;;;AAO7B;AAEA,OAAO,MAAMyJ,wBAAmD,CAAC,EAAEjC,UAAU,EAAE;IAC7E,MAAMkC,aAAa7N;IACnB,qBAAOmC,aACL0L,2BACE,QAACnC;QAA6BC,YAAYA,cAAcH,SAASC,IAAI;QAAE1H,SAAS;;;;;eAC9E,MACJ4H,cAAcH,SAASC,IAAI;AAE/B,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/features/experimental_table/client/plugins/TableActionMenuPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { TableObserver, TableSelection } 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 $computeTableMapSkipCellCheck,\n $deleteTableColumnAtSelection,\n $deleteTableRowAtSelection,\n $getNodeTriplet,\n $getTableCellNodeFromLexicalNode,\n $getTableColumnIndexFromTableCellNode,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $isTableCellNode,\n $isTableSelection,\n $mergeCells,\n $unmergeCell,\n getTableElement,\n getTableObserverFromTableElement,\n TableCellHeaderStates,\n TableCellNode,\n} from '@lexical/table'\nimport { mergeRegister } from '@lexical/utils'\nimport { useScrollInfo } from '@payloadcms/ui'\nimport {\n $getSelection,\n $isElementNode,\n $isRangeSelection,\n $isTextNode,\n $setSelection,\n COMMAND_PRIORITY_CRITICAL,\n getDOMSelection,\n isDOMNode,\n SELECTION_CHANGE_COMMAND,\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 './index.scss'\nimport { MeatballsIcon } from '../../../../../lexical/ui/icons/Meatballs/index.js'\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\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 $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\n setCanMergeCells(currentSelectionCounts.columns > 1 || currentSelectionCounts.rows > 1)\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\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 isDOMNode(event.target) &&\n !dropDownRef.current.contains(event.target) &&\n !contextRef.current.contains(event.target)\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 = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('Expected to find tableElement in DOM')\n }\n\n const tableObserver = getTableObserverFromTableElement(tableElement)\n if (tableObserver !== null) {\n tableObserver.$clearHighlight()\n }\n\n tableNode.markDirty()\n updateTableCellNode(tableCellNode.getLatest())\n }\n\n $setSelection(null)\n })\n }, [editor, tableCellNode])\n\n const mergeTableCellsAtSelection = () => {\n editor.update(() => {\n const selection = $getSelection()\n if (!$isTableSelection(selection)) {\n return\n }\n const nodes = selection.getNodes()\n const tableCells = nodes.filter($isTableCellNode)\n const targetCell = $mergeCells(tableCells)\n\n if (targetCell) {\n $selectLastDescendant(targetCell)\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 for (let i = 0; i < selectionCounts.rows; i++) {\n $insertTableRowAtSelection(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.rows],\n )\n\n const insertTableColumnAtSelection = useCallback(\n (shouldInsertAfter: boolean) => {\n editor.update(() => {\n for (let i = 0; i < selectionCounts.columns; i++) {\n $insertTableColumnAtSelection(shouldInsertAfter)\n }\n onClose()\n })\n },\n [editor, onClose, selectionCounts.columns],\n )\n\n const deleteTableRowAtSelection = useCallback(() => {\n editor.update(() => {\n $deleteTableRowAtSelection()\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 $deleteTableColumnAtSelection()\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 [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const rowCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.ROW\n if (gridMap[tableRowIndex]) {\n for (let col = 0; col < gridMap[tableRowIndex].length; col++) {\n const mapCell = gridMap[tableRowIndex][col]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!rowCells.has(mapCell.cell)) {\n rowCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.ROW)\n }\n }\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 [gridMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n\n const columnCells = new Set<TableCellNode>()\n\n const newStyle = tableCellNode.getHeaderStyles() ^ TableCellHeaderStates.COLUMN\n if (gridMap) {\n for (let row = 0; row < gridMap.length; row++) {\n const mapCell = gridMap?.[row]?.[tableColumnIndex]\n\n if (!mapCell?.cell) {\n continue\n }\n\n if (!columnCells.has(mapCell.cell)) {\n columnCells.add(mapCell.cell)\n mapCell.cell.setHeaderStyles(newStyle, TableCellHeaderStates.COLUMN)\n }\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleRowStriping = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setRowStriping(!tableNode.getRowStriping())\n }\n }\n\n clearTableSelection()\n onClose()\n })\n }, [editor, tableCellNode, clearTableSelection, onClose])\n\n const toggleFirstColumnFreeze = useCallback(() => {\n editor.update(() => {\n if (tableCellNode.isAttached()) {\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n if (tableNode) {\n tableNode.setFrozenColumns(tableNode.getFrozenColumns() === 0 ? 1 : 0)\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 <span className=\"text\">Merge cells</span>\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 <span className=\"text\">Unmerge cells</span>\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-row-striping\"\n onClick={() => toggleRowStriping()}\n type=\"button\"\n >\n <span className=\"text\">Toggle Row Striping</span>\n </button>\n <button\n className=\"item\"\n data-test-id=\"table-freeze-first-column\"\n onClick={() => toggleFirstColumnFreeze()}\n type=\"button\"\n >\n <span className=\"text\">Toggle First Column Freeze</span>\n </button>\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\n className=\"item\"\n data-test-id=\"table-row-header\"\n onClick={() => toggleTableRowIsHeader()}\n type=\"button\"\n >\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<HTMLDivElement | null>(null)\n const menuRootRef = useRef<HTMLButtonElement | null>(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 = getDOMSelection(editor._window)\n const activeElement = document.activeElement\n function disable() {\n if (menu) {\n menu.classList.remove('table-cell-action-button-container--active')\n menu.classList.add('table-cell-action-button-container--inactive')\n }\n setTableMenuCellNode(null)\n }\n\n if (selection == null || menu == null) {\n return disable()\n }\n\n const rootElement = editor.getRootElement()\n let tableObserver: null | TableObserver = null\n let tableCellParentNodeDOM: HTMLElement | null = null\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 return disable()\n }\n\n tableCellParentNodeDOM = editor.getElementByKey(tableCellNodeFromSelection.getKey())\n\n if (tableCellParentNodeDOM == null || !tableCellNodeFromSelection.isAttached()) {\n return disable()\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNodeFromSelection)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n setTableMenuCellNode(tableCellNodeFromSelection)\n } else if ($isTableSelection(selection)) {\n const anchorNode = $getTableCellNodeFromLexicalNode(selection.anchor.getNode())\n if (!$isTableCellNode(anchorNode)) {\n throw new Error('TableSelection anchorNode must be a TableCellNode')\n }\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(anchorNode)\n const tableElement = getTableElement(tableNode, editor.getElementByKey(tableNode.getKey()))\n\n if (tableElement === null) {\n throw new Error('TableActionMenu: Expected to find tableElement in DOM')\n }\n\n tableObserver = getTableObserverFromTableElement(tableElement)\n tableCellParentNodeDOM = editor.getElementByKey(anchorNode.getKey())\n } else if (!activeElement) {\n return disable()\n }\n if (tableObserver === null || tableCellParentNodeDOM === null) {\n return disable()\n }\n const enabled = !tableObserver || !tableObserver.isSelecting\n menu.classList.toggle('table-cell-action-button-container--active', enabled)\n menu.classList.toggle('table-cell-action-button-container--inactive', !enabled)\n if (enabled) {\n const tableCellRect = tableCellParentNodeDOM.getBoundingClientRect()\n const anchorRect = anchorElem.getBoundingClientRect()\n const top = tableCellRect.top - anchorRect.top\n const left = tableCellRect.right - anchorRect.left\n menu.style.transform = `translate(${left}px, ${top}px)`\n }\n }, [editor, anchorElem])\n\n useEffect(() => {\n // We call the $moveMenu callback every time the selection changes,\n // once up front, and once after each pointerup\n let timeoutId: ReturnType<typeof setTimeout> | undefined = undefined\n const callback = () => {\n timeoutId = undefined\n editor.getEditorState().read($moveMenu)\n }\n const delayedCallback = () => {\n if (timeoutId === undefined) {\n timeoutId = setTimeout(callback, 0)\n }\n return false\n }\n return mergeRegister(\n editor.registerUpdateListener(delayedCallback),\n editor.registerCommand(SELECTION_CHANGE_COMMAND, delayedCallback, COMMAND_PRIORITY_CRITICAL),\n editor.registerRootListener((rootElement, prevRootElement) => {\n if (prevRootElement) {\n prevRootElement.removeEventListener('pointerup', delayedCallback)\n }\n if (rootElement) {\n rootElement.addEventListener('pointerup', delayedCallback)\n delayedCallback()\n }\n }),\n () => clearTimeout(timeoutId),\n )\n })\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"],"names":["useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$deleteTableColumnAtSelection","$deleteTableRowAtSelection","$getNodeTriplet","$getTableCellNodeFromLexicalNode","$getTableColumnIndexFromTableCellNode","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$insertTableColumnAtSelection","$insertTableRowAtSelection","$isTableCellNode","$isTableSelection","$mergeCells","$unmergeCell","getTableElement","getTableObserverFromTableElement","TableCellHeaderStates","TableCellNode","mergeRegister","useScrollInfo","$getSelection","$isElementNode","$isRangeSelection","$isTextNode","$setSelection","COMMAND_PRIORITY_CRITICAL","getDOMSelection","isDOMNode","SELECTION_CHANGE_COMMAND","React","useCallback","useEffect","useRef","useState","createPortal","MeatballsIcon","computeSelectionCount","selection","selectionShape","getShape","columns","toX","fromX","rows","toY","fromY","$canUnmerge","isCollapsed","anchor","is","focus","cell","__colSpan","__rowSpan","$selectLastDescendant","node","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","handleClickOutside","event","target","contains","addEventListener","removeEventListener","clearTableSelection","update","isAttached","tableNode","tableElement","getElementByKey","Error","tableObserver","$clearHighlight","markDirty","mergeTableCellsAtSelection","nodes","getNodes","tableCells","filter","targetCell","unmergeTableCellsAtSelection","insertTableRowAtSelection","shouldInsertAfter","i","insertTableColumnAtSelection","deleteTableRowAtSelection","deleteTableAtSelection","remove","deleteTableColumnAtSelection","toggleTableRowIsHeader","tableRowIndex","gridMap","rowCells","Set","newStyle","getHeaderStyles","ROW","col","length","mapCell","has","add","setHeaderStyles","toggleTableColumnIsHeader","tableColumnIndex","columnCells","COLUMN","row","toggleRowStriping","setRowStriping","getRowStriping","toggleFirstColumnFreeze","setFrozenColumns","getFrozenColumns","mergeCellButton","button","className","data-test-id","onClick","type","span","div","e","stopPropagation","ref","Fragment","hr","__headerState","document","body","TableCellActionMenuContainer","anchorElem","menuButtonRef","menuRootRef","isMenuOpen","setTableMenuCellNode","$moveMenu","menu","nativeSelection","_window","activeElement","disable","classList","tableCellParentNodeDOM","anchorNode","tableCellNodeFromSelection","getNode","enabled","isSelecting","toggle","tableCellRect","anchorRect","transform","timeoutId","undefined","callback","delayedCallback","setTimeout","registerUpdateListener","registerCommand","registerRootListener","prevRootElement","clearTimeout","prevTableCellDOM","TableActionMenuPlugin","isEditable"],"mappings":"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"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsxDEV as _jsxDEV } from "react/jsx-dev-runtime";
|
|
3
2
|
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
|
4
3
|
import { useLexicalEditable } from '@lexical/react/useLexicalEditable';
|
|
5
4
|
import { $computeTableMapSkipCellCheck, $getTableNodeFromLexicalNodeOrThrow, $getTableRowIndexFromTableCellNode, $isTableCellNode, $isTableRowNode, getDOMCellFromTarget, getTableElement, TableNode } from '@lexical/table';
|
|
@@ -326,50 +325,17 @@ function TableCellResizer({ editor }) {
|
|
|
326
325
|
draggingDirection,
|
|
327
326
|
mouseCurrentPos
|
|
328
327
|
]);
|
|
329
|
-
return
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
onMouseDown: toggleResize('right'),
|
|
336
|
-
style: resizerStyles.right || undefined
|
|
337
|
-
}, void 0, false, {
|
|
338
|
-
fileName: "src/features/experimental_table/client/plugins/TableCellResizerPlugin/index.tsx",
|
|
339
|
-
lineNumber: 416,
|
|
340
|
-
columnNumber: 11
|
|
341
|
-
}, this),
|
|
342
|
-
/*#__PURE__*/ _jsxDEV("div", {
|
|
343
|
-
className: `${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`,
|
|
344
|
-
onMouseDown: toggleResize('bottom'),
|
|
345
|
-
style: resizerStyles.bottom || undefined
|
|
346
|
-
}, void 0, false, {
|
|
347
|
-
fileName: "src/features/experimental_table/client/plugins/TableCellResizerPlugin/index.tsx",
|
|
348
|
-
lineNumber: 421,
|
|
349
|
-
columnNumber: 11
|
|
350
|
-
}, this)
|
|
351
|
-
]
|
|
352
|
-
}, void 0, true, {
|
|
353
|
-
fileName: "src/features/experimental_table/client/plugins/TableCellResizerPlugin/index.tsx",
|
|
354
|
-
lineNumber: 415,
|
|
355
|
-
columnNumber: 9
|
|
356
|
-
}, this)
|
|
357
|
-
}, void 0, false, {
|
|
358
|
-
fileName: "src/features/experimental_table/client/plugins/TableCellResizerPlugin/index.tsx",
|
|
359
|
-
lineNumber: 413,
|
|
360
|
-
columnNumber: 5
|
|
361
|
-
}, this);
|
|
328
|
+
return <div ref={resizerRef}>
|
|
329
|
+
{activeCell != null && !isMouseDown && <React.Fragment>
|
|
330
|
+
<div className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`} onMouseDown={toggleResize('right')} style={resizerStyles.right || undefined}/>
|
|
331
|
+
<div className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`} onMouseDown={toggleResize('bottom')} style={resizerStyles.bottom || undefined}/>
|
|
332
|
+
</React.Fragment>}
|
|
333
|
+
</div>;
|
|
362
334
|
}
|
|
363
335
|
export const TableCellResizerPlugin = ()=>{
|
|
364
336
|
const [editor] = useLexicalComposerContext();
|
|
365
337
|
const isEditable = useLexicalEditable();
|
|
366
|
-
return useMemo(()=>isEditable ?
|
|
367
|
-
editor: editor
|
|
368
|
-
}, void 0, false, {
|
|
369
|
-
fileName: "src/features/experimental_table/client/plugins/TableCellResizerPlugin/index.tsx",
|
|
370
|
-
lineNumber: 437,
|
|
371
|
-
columnNumber: 38
|
|
372
|
-
}, this), document.body) : null, [
|
|
338
|
+
return useMemo(()=>isEditable ? createPortal(<TableCellResizer editor={editor}/>, document.body) : null, [
|
|
373
339
|
editor,
|
|
374
340
|
isEditable
|
|
375
341
|
]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/features/experimental_table/client/plugins/TableCellResizerPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { TableCellNode, TableDOMCell, TableMapType } from '@lexical/table'\nimport type { LexicalEditor, NodeKey } from 'lexical'\nimport type { JSX, MouseEventHandler } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $computeTableMapSkipCellCheck,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $isTableCellNode,\n $isTableRowNode,\n getDOMCellFromTarget,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { calculateZoomLevel, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode, isHTMLElement, SKIP_SCROLL_INTO_VIEW_TAG } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport './index.scss'\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\n\ntype MousePosition = {\n x: number\n y: number\n}\n\ntype MouseDraggingDirection = 'bottom' | 'right'\n\nconst MIN_ROW_HEIGHT = 33\nconst MIN_COLUMN_WIDTH = 92\n\nfunction TableCellResizer({ editor }: { editor: LexicalEditor }): JSX.Element {\n const targetRef = useRef<HTMLElement | null>(null)\n const resizerRef = useRef<HTMLDivElement | null>(null)\n const tableRectRef = useRef<ClientRect | null>(null)\n const [hasTable, setHasTable] = useState(false)\n const editorConfig = useEditorConfigContext()\n\n const mouseStartPosRef = useRef<MousePosition | null>(null)\n const [mouseCurrentPos, updateMouseCurrentPos] = useState<MousePosition | null>(null)\n\n const [activeCell, updateActiveCell] = useState<null | TableDOMCell>(null)\n const [isMouseDown, updateIsMouseDown] = useState<boolean>(false)\n const [draggingDirection, updateDraggingDirection] = useState<MouseDraggingDirection | null>(null)\n\n const resetState = useCallback(() => {\n updateActiveCell(null)\n targetRef.current = null\n updateDraggingDirection(null)\n mouseStartPosRef.current = null\n tableRectRef.current = null\n }, [])\n\n const isMouseDownOnEvent = (event: MouseEvent) => {\n return (event.buttons & 1) === 1\n }\n\n useEffect(() => {\n const tableKeys = new Set<NodeKey>()\n return mergeRegister(\n editor.registerMutationListener(TableNode, (nodeMutations) => {\n for (const [nodeKey, mutation] of nodeMutations) {\n if (mutation === 'destroyed') {\n tableKeys.delete(nodeKey)\n } else {\n tableKeys.add(nodeKey)\n }\n }\n setHasTable(tableKeys.size > 0)\n }),\n editor.registerNodeTransform(TableNode, (tableNode) => {\n if (tableNode.getColWidths()) {\n return tableNode\n }\n\n const numColumns = tableNode.getColumnCount()\n const columnWidth = MIN_COLUMN_WIDTH\n\n tableNode.setColWidths(Array(numColumns).fill(columnWidth))\n return tableNode\n }),\n )\n }, [editor])\n\n useEffect(() => {\n if (!hasTable) {\n return\n }\n\n const onMouseMove = (event: MouseEvent) => {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n if (draggingDirection) {\n updateMouseCurrentPos({\n x: event.clientX,\n y: event.clientY,\n })\n return\n }\n updateIsMouseDown(isMouseDownOnEvent(event))\n if (resizerRef.current && resizerRef.current.contains(target)) {\n return\n }\n\n if (targetRef.current !== target) {\n targetRef.current = target\n const cell = getDOMCellFromTarget(target)\n\n if (cell && activeCell !== cell) {\n editor.getEditorState().read(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(cell.elem)\n\n if (!tableCellNode) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = getTableElement(\n tableNode,\n editor.getElementByKey(tableNode.getKey()),\n )\n if (!tableElement) {\n throw new Error('TableCellResizer: Table element not found.')\n }\n\n targetRef.current = target\n tableRectRef.current = tableElement.getBoundingClientRect()\n updateActiveCell(cell)\n },\n { editor },\n )\n } else if (cell == null) {\n resetState()\n }\n }\n }\n\n const onMouseDown = (event: MouseEvent) => {\n updateIsMouseDown(true)\n }\n\n const onMouseUp = (event: MouseEvent) => {\n updateIsMouseDown(false)\n }\n\n const removeRootListener = editor.registerRootListener((rootElement, prevRootElement) => {\n prevRootElement?.removeEventListener('mousemove', onMouseMove)\n prevRootElement?.removeEventListener('mousedown', onMouseDown)\n prevRootElement?.removeEventListener('mouseup', onMouseUp)\n rootElement?.addEventListener('mousemove', onMouseMove)\n rootElement?.addEventListener('mousedown', onMouseDown)\n rootElement?.addEventListener('mouseup', onMouseUp)\n })\n\n return () => {\n removeRootListener()\n }\n }, [activeCell, draggingDirection, editor, hasTable, resetState])\n\n const isHeightChanging = (direction: MouseDraggingDirection) => {\n if (direction === 'bottom') {\n return true\n }\n return false\n }\n\n const updateRowHeight = useCallback(\n (heightChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const baseRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n const tableRows = tableNode.getChildren()\n\n // Determine if this is a full row merge by checking colspan\n const isFullRowMerge = tableCellNode.getColSpan() === tableNode.getColumnCount()\n\n // For full row merges, apply to first row. For partial merges, apply to last row\n const tableRowIndex = isFullRowMerge\n ? baseRowIndex\n : baseRowIndex + tableCellNode.getRowSpan() - 1\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 let height = tableRow.getHeight()\n if (height === undefined) {\n const rowCells = tableRow.getChildren<TableCellNode>()\n height = Math.min(\n ...rowCells.map((cell) => getCellNodeHeight(cell, editor) ?? Infinity),\n )\n }\n\n const newHeight = Math.max(height + heightChange, MIN_ROW_HEIGHT)\n tableRow.setHeight(newHeight)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const getCellNodeHeight = (\n cell: TableCellNode,\n activeEditor: LexicalEditor,\n ): number | undefined => {\n const domCellNode = activeEditor.getElementByKey(cell.getKey())\n return domCellNode?.clientHeight\n }\n\n const getCellColumnIndex = (tableCellNode: TableCellNode, tableMap: TableMapType) => {\n let columnIndex: number | undefined\n tableMap.forEach((row) => {\n row.forEach((cell, columnIndexInner) => {\n if (cell.cell === tableCellNode) {\n columnIndex = columnIndexInner\n }\n })\n })\n return columnIndex\n }\n\n const updateColumnWidth = useCallback(\n (widthChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const [tableMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n const columnIndex = getCellColumnIndex(tableCellNode, tableMap)\n if (columnIndex === undefined) {\n throw new Error('TableCellResizer: Table column not found.')\n }\n\n const colWidths = tableNode.getColWidths()\n if (!colWidths) {\n return\n }\n const width = colWidths[columnIndex]\n if (width === undefined) {\n return\n }\n const newColWidths = [...colWidths]\n const newWidth = Math.max(width + widthChange, MIN_COLUMN_WIDTH)\n newColWidths[columnIndex] = newWidth\n tableNode.setColWidths(newColWidths)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const mouseUpHandler = useCallback(\n (direction: MouseDraggingDirection) => {\n const handler = (event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n if (mouseStartPosRef.current) {\n const { x, y } = mouseStartPosRef.current\n\n if (activeCell === null) {\n return\n }\n const zoom = calculateZoomLevel(event.target as Element)\n\n if (isHeightChanging(direction)) {\n const heightChange = (event.clientY - y) / zoom\n updateRowHeight(heightChange)\n } else {\n const widthChange = (event.clientX - x) / zoom\n updateColumnWidth(widthChange)\n }\n\n resetState()\n document.removeEventListener('mouseup', handler)\n }\n }\n return handler\n },\n [activeCell, resetState, updateColumnWidth, updateRowHeight],\n )\n\n const toggleResize = useCallback(\n (direction: MouseDraggingDirection): MouseEventHandler<HTMLDivElement> =>\n (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n mouseStartPosRef.current = {\n x: event.clientX,\n y: event.clientY,\n }\n updateMouseCurrentPos(mouseStartPosRef.current)\n updateDraggingDirection(direction)\n\n document.addEventListener('mouseup', mouseUpHandler(direction))\n },\n [activeCell, mouseUpHandler],\n )\n\n const [resizerStyles, setResizerStyles] = useState<{\n bottom?: null | React.CSSProperties\n left?: null | React.CSSProperties\n right?: null | React.CSSProperties\n top?: null | React.CSSProperties\n }>({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n\n useEffect(() => {\n if (activeCell) {\n const { height, left, top, width } = activeCell.elem.getBoundingClientRect()\n const zoom = calculateZoomLevel(activeCell.elem)\n const zoneWidth = 10 // Pixel width of the zone where you can drag the edge\n const styles = {\n bottom: {\n backgroundColor: 'none',\n cursor: 'row-resize',\n height: `${zoneWidth}px`,\n left: `${window.scrollX + left}px`,\n top: `${window.scrollY + top + height - zoneWidth / 2}px`,\n width: `${width}px`,\n },\n right: {\n backgroundColor: 'none',\n cursor: 'col-resize',\n height: `${height}px`,\n left: `${window.scrollX + left + width - zoneWidth / 2}px`,\n top: `${window.scrollY + top}px`,\n width: `${zoneWidth}px`,\n },\n }\n\n const tableRect = tableRectRef.current\n\n if (draggingDirection && mouseCurrentPos && tableRect) {\n if (isHeightChanging(draggingDirection)) {\n styles[draggingDirection].left = `${window.scrollX + tableRect.left}px`\n styles[draggingDirection].top = `${window.scrollY + mouseCurrentPos.y / zoom}px`\n styles[draggingDirection].height = '3px'\n styles[draggingDirection].width = `${tableRect.width}px`\n } else {\n styles[draggingDirection].top = `${window.scrollY + tableRect.top}px`\n styles[draggingDirection].left = `${window.scrollX + mouseCurrentPos.x / zoom}px`\n styles[draggingDirection].width = '3px'\n styles[draggingDirection].height = `${tableRect.height}px`\n }\n\n styles[draggingDirection].backgroundColor = '#adf'\n }\n\n setResizerStyles(styles)\n } else {\n setResizerStyles({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n }\n }, [activeCell, draggingDirection, mouseCurrentPos])\n\n return (\n <div ref={resizerRef}>\n {activeCell != null && !isMouseDown && (\n <React.Fragment>\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('right')}\n style={resizerStyles.right || undefined}\n />\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('bottom')}\n style={resizerStyles.bottom || undefined}\n />\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableCellResizerPlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n\n return useMemo(\n () => (isEditable ? createPortal(<TableCellResizer editor={editor} />, document.body) : null),\n [editor, isEditable],\n )\n}\n"],"names":["useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$isTableCellNode","$isTableRowNode","getDOMCellFromTarget","getTableElement","TableNode","calculateZoomLevel","mergeRegister","$getNearestNodeFromDOMNode","isHTMLElement","SKIP_SCROLL_INTO_VIEW_TAG","React","useCallback","useEffect","useMemo","useRef","useState","createPortal","useEditorConfigContext","MIN_ROW_HEIGHT","MIN_COLUMN_WIDTH","TableCellResizer","editor","targetRef","resizerRef","tableRectRef","hasTable","setHasTable","editorConfig","mouseStartPosRef","mouseCurrentPos","updateMouseCurrentPos","activeCell","updateActiveCell","isMouseDown","updateIsMouseDown","draggingDirection","updateDraggingDirection","resetState","current","isMouseDownOnEvent","event","buttons","tableKeys","Set","registerMutationListener","nodeMutations","nodeKey","mutation","delete","add","size","registerNodeTransform","tableNode","getColWidths","numColumns","getColumnCount","columnWidth","setColWidths","Array","fill","onMouseMove","target","x","clientX","y","clientY","contains","cell","getEditorState","read","tableCellNode","elem","Error","tableElement","getElementByKey","getKey","getBoundingClientRect","onMouseDown","onMouseUp","removeRootListener","registerRootListener","rootElement","prevRootElement","removeEventListener","addEventListener","isHeightChanging","direction","updateRowHeight","heightChange","update","baseRowIndex","tableRows","getChildren","isFullRowMerge","getColSpan","tableRowIndex","getRowSpan","length","tableRow","height","getHeight","undefined","rowCells","Math","min","map","getCellNodeHeight","Infinity","newHeight","max","setHeight","tag","activeEditor","domCellNode","clientHeight","getCellColumnIndex","tableMap","columnIndex","forEach","row","columnIndexInner","updateColumnWidth","widthChange","colWidths","width","newColWidths","newWidth","mouseUpHandler","handler","preventDefault","stopPropagation","zoom","document","toggleResize","resizerStyles","setResizerStyles","bottom","left","right","top","zoneWidth","styles","backgroundColor","cursor","window","scrollX","scrollY","tableRect","div","ref","Fragment","className","lexical","theme","tableCellResizer","style","TableCellResizerPlugin","isEditable","body"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/features/experimental_table/client/plugins/TableCellResizerPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { TableCellNode, TableDOMCell, TableMapType } from '@lexical/table'\nimport type { LexicalEditor, NodeKey } from 'lexical'\nimport type { JSX, MouseEventHandler } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $computeTableMapSkipCellCheck,\n $getTableNodeFromLexicalNodeOrThrow,\n $getTableRowIndexFromTableCellNode,\n $isTableCellNode,\n $isTableRowNode,\n getDOMCellFromTarget,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { calculateZoomLevel, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode, isHTMLElement, SKIP_SCROLL_INTO_VIEW_TAG } from 'lexical'\nimport * as React from 'react'\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\n\nimport './index.scss'\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\n\ntype MousePosition = {\n x: number\n y: number\n}\n\ntype MouseDraggingDirection = 'bottom' | 'right'\n\nconst MIN_ROW_HEIGHT = 33\nconst MIN_COLUMN_WIDTH = 92\n\nfunction TableCellResizer({ editor }: { editor: LexicalEditor }): JSX.Element {\n const targetRef = useRef<HTMLElement | null>(null)\n const resizerRef = useRef<HTMLDivElement | null>(null)\n const tableRectRef = useRef<ClientRect | null>(null)\n const [hasTable, setHasTable] = useState(false)\n const editorConfig = useEditorConfigContext()\n\n const mouseStartPosRef = useRef<MousePosition | null>(null)\n const [mouseCurrentPos, updateMouseCurrentPos] = useState<MousePosition | null>(null)\n\n const [activeCell, updateActiveCell] = useState<null | TableDOMCell>(null)\n const [isMouseDown, updateIsMouseDown] = useState<boolean>(false)\n const [draggingDirection, updateDraggingDirection] = useState<MouseDraggingDirection | null>(null)\n\n const resetState = useCallback(() => {\n updateActiveCell(null)\n targetRef.current = null\n updateDraggingDirection(null)\n mouseStartPosRef.current = null\n tableRectRef.current = null\n }, [])\n\n const isMouseDownOnEvent = (event: MouseEvent) => {\n return (event.buttons & 1) === 1\n }\n\n useEffect(() => {\n const tableKeys = new Set<NodeKey>()\n return mergeRegister(\n editor.registerMutationListener(TableNode, (nodeMutations) => {\n for (const [nodeKey, mutation] of nodeMutations) {\n if (mutation === 'destroyed') {\n tableKeys.delete(nodeKey)\n } else {\n tableKeys.add(nodeKey)\n }\n }\n setHasTable(tableKeys.size > 0)\n }),\n editor.registerNodeTransform(TableNode, (tableNode) => {\n if (tableNode.getColWidths()) {\n return tableNode\n }\n\n const numColumns = tableNode.getColumnCount()\n const columnWidth = MIN_COLUMN_WIDTH\n\n tableNode.setColWidths(Array(numColumns).fill(columnWidth))\n return tableNode\n }),\n )\n }, [editor])\n\n useEffect(() => {\n if (!hasTable) {\n return\n }\n\n const onMouseMove = (event: MouseEvent) => {\n const target = event.target\n if (!isHTMLElement(target)) {\n return\n }\n\n if (draggingDirection) {\n updateMouseCurrentPos({\n x: event.clientX,\n y: event.clientY,\n })\n return\n }\n updateIsMouseDown(isMouseDownOnEvent(event))\n if (resizerRef.current && resizerRef.current.contains(target)) {\n return\n }\n\n if (targetRef.current !== target) {\n targetRef.current = target\n const cell = getDOMCellFromTarget(target)\n\n if (cell && activeCell !== cell) {\n editor.getEditorState().read(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(cell.elem)\n\n if (!tableCellNode) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const tableElement = getTableElement(\n tableNode,\n editor.getElementByKey(tableNode.getKey()),\n )\n if (!tableElement) {\n throw new Error('TableCellResizer: Table element not found.')\n }\n\n targetRef.current = target\n tableRectRef.current = tableElement.getBoundingClientRect()\n updateActiveCell(cell)\n },\n { editor },\n )\n } else if (cell == null) {\n resetState()\n }\n }\n }\n\n const onMouseDown = (event: MouseEvent) => {\n updateIsMouseDown(true)\n }\n\n const onMouseUp = (event: MouseEvent) => {\n updateIsMouseDown(false)\n }\n\n const removeRootListener = editor.registerRootListener((rootElement, prevRootElement) => {\n prevRootElement?.removeEventListener('mousemove', onMouseMove)\n prevRootElement?.removeEventListener('mousedown', onMouseDown)\n prevRootElement?.removeEventListener('mouseup', onMouseUp)\n rootElement?.addEventListener('mousemove', onMouseMove)\n rootElement?.addEventListener('mousedown', onMouseDown)\n rootElement?.addEventListener('mouseup', onMouseUp)\n })\n\n return () => {\n removeRootListener()\n }\n }, [activeCell, draggingDirection, editor, hasTable, resetState])\n\n const isHeightChanging = (direction: MouseDraggingDirection) => {\n if (direction === 'bottom') {\n return true\n }\n return false\n }\n\n const updateRowHeight = useCallback(\n (heightChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n\n const baseRowIndex = $getTableRowIndexFromTableCellNode(tableCellNode)\n const tableRows = tableNode.getChildren()\n\n // Determine if this is a full row merge by checking colspan\n const isFullRowMerge = tableCellNode.getColSpan() === tableNode.getColumnCount()\n\n // For full row merges, apply to first row. For partial merges, apply to last row\n const tableRowIndex = isFullRowMerge\n ? baseRowIndex\n : baseRowIndex + tableCellNode.getRowSpan() - 1\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 let height = tableRow.getHeight()\n if (height === undefined) {\n const rowCells = tableRow.getChildren<TableCellNode>()\n height = Math.min(\n ...rowCells.map((cell) => getCellNodeHeight(cell, editor) ?? Infinity),\n )\n }\n\n const newHeight = Math.max(height + heightChange, MIN_ROW_HEIGHT)\n tableRow.setHeight(newHeight)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const getCellNodeHeight = (\n cell: TableCellNode,\n activeEditor: LexicalEditor,\n ): number | undefined => {\n const domCellNode = activeEditor.getElementByKey(cell.getKey())\n return domCellNode?.clientHeight\n }\n\n const getCellColumnIndex = (tableCellNode: TableCellNode, tableMap: TableMapType) => {\n let columnIndex: number | undefined\n tableMap.forEach((row) => {\n row.forEach((cell, columnIndexInner) => {\n if (cell.cell === tableCellNode) {\n columnIndex = columnIndexInner\n }\n })\n })\n return columnIndex\n }\n\n const updateColumnWidth = useCallback(\n (widthChange: number) => {\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n editor.update(\n () => {\n const tableCellNode = $getNearestNodeFromDOMNode(activeCell.elem)\n if (!$isTableCellNode(tableCellNode)) {\n throw new Error('TableCellResizer: Table cell node not found.')\n }\n\n const tableNode = $getTableNodeFromLexicalNodeOrThrow(tableCellNode)\n const [tableMap] = $computeTableMapSkipCellCheck(tableNode, null, null)\n const columnIndex = getCellColumnIndex(tableCellNode, tableMap)\n if (columnIndex === undefined) {\n throw new Error('TableCellResizer: Table column not found.')\n }\n\n const colWidths = tableNode.getColWidths()\n if (!colWidths) {\n return\n }\n const width = colWidths[columnIndex]\n if (width === undefined) {\n return\n }\n const newColWidths = [...colWidths]\n const newWidth = Math.max(width + widthChange, MIN_COLUMN_WIDTH)\n newColWidths[columnIndex] = newWidth\n tableNode.setColWidths(newColWidths)\n },\n { tag: SKIP_SCROLL_INTO_VIEW_TAG },\n )\n },\n [activeCell, editor],\n )\n\n const mouseUpHandler = useCallback(\n (direction: MouseDraggingDirection) => {\n const handler = (event: MouseEvent) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n if (mouseStartPosRef.current) {\n const { x, y } = mouseStartPosRef.current\n\n if (activeCell === null) {\n return\n }\n const zoom = calculateZoomLevel(event.target as Element)\n\n if (isHeightChanging(direction)) {\n const heightChange = (event.clientY - y) / zoom\n updateRowHeight(heightChange)\n } else {\n const widthChange = (event.clientX - x) / zoom\n updateColumnWidth(widthChange)\n }\n\n resetState()\n document.removeEventListener('mouseup', handler)\n }\n }\n return handler\n },\n [activeCell, resetState, updateColumnWidth, updateRowHeight],\n )\n\n const toggleResize = useCallback(\n (direction: MouseDraggingDirection): MouseEventHandler<HTMLDivElement> =>\n (event) => {\n event.preventDefault()\n event.stopPropagation()\n\n if (!activeCell) {\n throw new Error('TableCellResizer: Expected active cell.')\n }\n\n mouseStartPosRef.current = {\n x: event.clientX,\n y: event.clientY,\n }\n updateMouseCurrentPos(mouseStartPosRef.current)\n updateDraggingDirection(direction)\n\n document.addEventListener('mouseup', mouseUpHandler(direction))\n },\n [activeCell, mouseUpHandler],\n )\n\n const [resizerStyles, setResizerStyles] = useState<{\n bottom?: null | React.CSSProperties\n left?: null | React.CSSProperties\n right?: null | React.CSSProperties\n top?: null | React.CSSProperties\n }>({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n\n useEffect(() => {\n if (activeCell) {\n const { height, left, top, width } = activeCell.elem.getBoundingClientRect()\n const zoom = calculateZoomLevel(activeCell.elem)\n const zoneWidth = 10 // Pixel width of the zone where you can drag the edge\n const styles = {\n bottom: {\n backgroundColor: 'none',\n cursor: 'row-resize',\n height: `${zoneWidth}px`,\n left: `${window.scrollX + left}px`,\n top: `${window.scrollY + top + height - zoneWidth / 2}px`,\n width: `${width}px`,\n },\n right: {\n backgroundColor: 'none',\n cursor: 'col-resize',\n height: `${height}px`,\n left: `${window.scrollX + left + width - zoneWidth / 2}px`,\n top: `${window.scrollY + top}px`,\n width: `${zoneWidth}px`,\n },\n }\n\n const tableRect = tableRectRef.current\n\n if (draggingDirection && mouseCurrentPos && tableRect) {\n if (isHeightChanging(draggingDirection)) {\n styles[draggingDirection].left = `${window.scrollX + tableRect.left}px`\n styles[draggingDirection].top = `${window.scrollY + mouseCurrentPos.y / zoom}px`\n styles[draggingDirection].height = '3px'\n styles[draggingDirection].width = `${tableRect.width}px`\n } else {\n styles[draggingDirection].top = `${window.scrollY + tableRect.top}px`\n styles[draggingDirection].left = `${window.scrollX + mouseCurrentPos.x / zoom}px`\n styles[draggingDirection].width = '3px'\n styles[draggingDirection].height = `${tableRect.height}px`\n }\n\n styles[draggingDirection].backgroundColor = '#adf'\n }\n\n setResizerStyles(styles)\n } else {\n setResizerStyles({\n bottom: null,\n left: null,\n right: null,\n top: null,\n })\n }\n }, [activeCell, draggingDirection, mouseCurrentPos])\n\n return (\n <div ref={resizerRef}>\n {activeCell != null && !isMouseDown && (\n <React.Fragment>\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('right')}\n style={resizerStyles.right || undefined}\n />\n <div\n className={`${editorConfig.editorConfig.lexical.theme.tableCellResizer} TableCellResizer__ui`}\n onMouseDown={toggleResize('bottom')}\n style={resizerStyles.bottom || undefined}\n />\n </React.Fragment>\n )}\n </div>\n )\n}\n\nexport const TableCellResizerPlugin: PluginComponent = () => {\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n\n return useMemo(\n () => (isEditable ? createPortal(<TableCellResizer editor={editor} />, document.body) : null),\n [editor, isEditable],\n )\n}\n"],"names":["useLexicalComposerContext","useLexicalEditable","$computeTableMapSkipCellCheck","$getTableNodeFromLexicalNodeOrThrow","$getTableRowIndexFromTableCellNode","$isTableCellNode","$isTableRowNode","getDOMCellFromTarget","getTableElement","TableNode","calculateZoomLevel","mergeRegister","$getNearestNodeFromDOMNode","isHTMLElement","SKIP_SCROLL_INTO_VIEW_TAG","React","useCallback","useEffect","useMemo","useRef","useState","createPortal","useEditorConfigContext","MIN_ROW_HEIGHT","MIN_COLUMN_WIDTH","TableCellResizer","editor","targetRef","resizerRef","tableRectRef","hasTable","setHasTable","editorConfig","mouseStartPosRef","mouseCurrentPos","updateMouseCurrentPos","activeCell","updateActiveCell","isMouseDown","updateIsMouseDown","draggingDirection","updateDraggingDirection","resetState","current","isMouseDownOnEvent","event","buttons","tableKeys","Set","registerMutationListener","nodeMutations","nodeKey","mutation","delete","add","size","registerNodeTransform","tableNode","getColWidths","numColumns","getColumnCount","columnWidth","setColWidths","Array","fill","onMouseMove","target","x","clientX","y","clientY","contains","cell","getEditorState","read","tableCellNode","elem","Error","tableElement","getElementByKey","getKey","getBoundingClientRect","onMouseDown","onMouseUp","removeRootListener","registerRootListener","rootElement","prevRootElement","removeEventListener","addEventListener","isHeightChanging","direction","updateRowHeight","heightChange","update","baseRowIndex","tableRows","getChildren","isFullRowMerge","getColSpan","tableRowIndex","getRowSpan","length","tableRow","height","getHeight","undefined","rowCells","Math","min","map","getCellNodeHeight","Infinity","newHeight","max","setHeight","tag","activeEditor","domCellNode","clientHeight","getCellColumnIndex","tableMap","columnIndex","forEach","row","columnIndexInner","updateColumnWidth","widthChange","colWidths","width","newColWidths","newWidth","mouseUpHandler","handler","preventDefault","stopPropagation","zoom","document","toggleResize","resizerStyles","setResizerStyles","bottom","left","right","top","zoneWidth","styles","backgroundColor","cursor","window","scrollX","scrollY","tableRect","div","ref","Fragment","className","lexical","theme","tableCellResizer","style","TableCellResizerPlugin","isEditable","body"],"mappings":"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"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsxDEV as _jsxDEV, Fragment as _Fragment } from "react/jsx-dev-runtime";
|
|
3
2
|
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
|
4
3
|
import { useLexicalEditable } from '@lexical/react/useLexicalEditable';
|
|
5
4
|
import { $getTableAndElementByKey, $getTableColumnIndexFromTableCellNode, $getTableRowIndexFromTableCellNode, $insertTableColumnAtSelection, $insertTableRowAtSelection, $isTableCellNode, $isTableNode, getTableElement, TableNode } from '@lexical/table';
|
|
6
5
|
import { $findMatchingParent, mergeRegister } from '@lexical/utils';
|
|
7
6
|
import { $getNearestNodeFromDOMNode, isHTMLElement } from 'lexical';
|
|
8
7
|
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
9
|
-
import * as React from 'react';
|
|
10
8
|
import { createPortal } from 'react-dom';
|
|
11
9
|
import { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js';
|
|
12
10
|
import { useDebounce } from '../../utils/useDebounce.js';
|
|
@@ -173,36 +171,14 @@ function TableHoverActionsContainer({ anchorElem }) {
|
|
|
173
171
|
if (!isEditable) {
|
|
174
172
|
return null;
|
|
175
173
|
}
|
|
176
|
-
return
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
},
|
|
185
|
-
type: "button"
|
|
186
|
-
}, void 0, false, {
|
|
187
|
-
fileName: "src/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.tsx",
|
|
188
|
-
lineNumber: 246,
|
|
189
|
-
columnNumber: 9
|
|
190
|
-
}, this),
|
|
191
|
-
isShownColumn && /*#__PURE__*/ _jsxDEV("button", {
|
|
192
|
-
"aria-label": "Add Column",
|
|
193
|
-
className: editorConfig.editorConfig.lexical.theme.tableAddColumns,
|
|
194
|
-
onClick: ()=>insertAction(false),
|
|
195
|
-
style: {
|
|
196
|
-
...position
|
|
197
|
-
},
|
|
198
|
-
type: "button"
|
|
199
|
-
}, void 0, false, {
|
|
200
|
-
fileName: "src/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.tsx",
|
|
201
|
-
lineNumber: 255,
|
|
202
|
-
columnNumber: 9
|
|
203
|
-
}, this)
|
|
204
|
-
]
|
|
205
|
-
}, void 0, true);
|
|
174
|
+
return <>
|
|
175
|
+
{isShownRow && <button aria-label="Add Row" className={editorConfig.editorConfig.lexical.theme.tableAddRows} onClick={()=>insertAction(true)} style={{
|
|
176
|
+
...position
|
|
177
|
+
}} type="button"/>}
|
|
178
|
+
{isShownColumn && <button aria-label="Add Column" className={editorConfig.editorConfig.lexical.theme.tableAddColumns} onClick={()=>insertAction(false)} style={{
|
|
179
|
+
...position
|
|
180
|
+
}} type="button"/>}
|
|
181
|
+
</>;
|
|
206
182
|
}
|
|
207
183
|
function getMouseInfo(event, editorConfig) {
|
|
208
184
|
const target = event.target;
|
|
@@ -225,13 +201,7 @@ export function TableHoverActionsPlugin({ anchorElem = document.body }) {
|
|
|
225
201
|
if (!isEditable) {
|
|
226
202
|
return null;
|
|
227
203
|
}
|
|
228
|
-
return
|
|
229
|
-
anchorElem: anchorElem
|
|
230
|
-
}, void 0, false, {
|
|
231
|
-
fileName: "src/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.tsx",
|
|
232
|
-
lineNumber: 305,
|
|
233
|
-
columnNumber: 23
|
|
234
|
-
}, this), anchorElem);
|
|
204
|
+
return createPortal(<TableHoverActionsContainer anchorElem={anchorElem}/>, anchorElem);
|
|
235
205
|
}
|
|
236
206
|
|
|
237
207
|
//# sourceMappingURL=index.js.map
|
package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { TableCellNode, TableRowNode } from '@lexical/table'\nimport type { EditorConfig, NodeKey } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $getTableAndElementByKey,\n $getTableColumnIndexFromTableCellNode,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $isTableCellNode,\n $isTableNode,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode, isHTMLElement } from 'lexical'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { useDebounce } from '../../utils/useDebounce.js'\n\nconst BUTTON_WIDTH_PX = 20\n\nfunction TableHoverActionsContainer({\n anchorElem,\n}: {\n anchorElem: HTMLElement\n}): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n\n const editorConfig = useEditorConfigContext()\n const [isShownRow, setShownRow] = useState<boolean>(false)\n const [isShownColumn, setShownColumn] = useState<boolean>(false)\n const [shouldListenMouseMove, setShouldListenMouseMove] = useState<boolean>(false)\n const [position, setPosition] = useState({})\n const tableSetRef = useRef<Set<NodeKey>>(new Set())\n const tableCellDOMNodeRef = useRef<HTMLElement | null>(null)\n\n const debouncedOnMouseMove = useDebounce(\n (event: MouseEvent) => {\n const { isOutside, tableDOMNode } = getMouseInfo(event, editorConfig.editorConfig?.lexical)\n\n if (isOutside) {\n setShownRow(false)\n setShownColumn(false)\n return\n }\n\n if (!tableDOMNode) {\n return\n }\n\n tableCellDOMNodeRef.current = tableDOMNode\n\n let hoveredRowNode: null | TableCellNode = null\n let hoveredColumnNode: null | TableCellNode = null\n let tableDOMElement: HTMLElement | null = null\n\n editor.getEditorState().read(\n () => {\n const maybeTableCell = $getNearestNodeFromDOMNode(tableDOMNode)\n\n if ($isTableCellNode(maybeTableCell)) {\n const table = $findMatchingParent(maybeTableCell, (node) => $isTableNode(node))\n if (!$isTableNode(table)) {\n return\n }\n\n tableDOMElement = getTableElement(table, editor.getElementByKey(table.getKey()))\n\n if (tableDOMElement) {\n const rowCount = table.getChildrenSize()\n const colCount = (table.getChildAtIndex(0) as TableRowNode)?.getChildrenSize()\n\n const rowIndex = $getTableRowIndexFromTableCellNode(maybeTableCell)\n const colIndex = $getTableColumnIndexFromTableCellNode(maybeTableCell)\n\n if (rowIndex === rowCount - 1) {\n hoveredRowNode = maybeTableCell\n } else if (colIndex === colCount - 1) {\n hoveredColumnNode = maybeTableCell\n }\n }\n }\n },\n { editor },\n )\n\n if (!tableDOMElement) {\n return\n }\n\n // this is the scrollable div container of the table (in case of overflow)\n const tableContainerElement = (tableDOMElement as HTMLTableElement).parentElement\n\n if (!tableContainerElement) {\n return\n }\n\n const {\n bottom: tableElemBottom,\n height: tableElemHeight,\n left: tableElemLeft,\n right: tableElemRight,\n width: tableElemWidth,\n y: tableElemY,\n } = (tableDOMElement as HTMLTableElement).getBoundingClientRect()\n\n let tableHasScroll = false\n if (\n tableContainerElement &&\n tableContainerElement.classList.contains('LexicalEditorTheme__tableScrollableWrapper')\n ) {\n tableHasScroll = tableContainerElement.scrollWidth > tableContainerElement.clientWidth\n }\n\n const { left: editorElemLeft, y: editorElemY } = anchorElem.getBoundingClientRect()\n\n if (hoveredRowNode) {\n setShownColumn(false)\n setShownRow(true)\n setPosition({\n height: BUTTON_WIDTH_PX,\n left:\n tableHasScroll && tableContainerElement\n ? tableContainerElement.offsetLeft\n : tableElemLeft - editorElemLeft,\n top: tableElemBottom - editorElemY + 5,\n width:\n tableHasScroll && tableContainerElement\n ? tableContainerElement.offsetWidth\n : tableElemWidth,\n })\n } else if (hoveredColumnNode) {\n setShownColumn(true)\n setShownRow(false)\n setPosition({\n height: tableElemHeight,\n left: tableElemRight - editorElemLeft + 5,\n top: tableElemY - editorElemY,\n width: BUTTON_WIDTH_PX,\n })\n }\n },\n 50,\n 250,\n )\n\n // Hide the buttons on any table dimensions change to prevent last row cells\n // overlap behind the 'Add Row' button when text entry changes cell height\n const tableResizeObserver = useMemo(() => {\n return new ResizeObserver(() => {\n setShownRow(false)\n setShownColumn(false)\n })\n }, [])\n\n useEffect(() => {\n if (!shouldListenMouseMove) {\n return\n }\n\n document.addEventListener('mousemove', debouncedOnMouseMove)\n\n return () => {\n setShownRow(false)\n setShownColumn(false)\n\n document.removeEventListener('mousemove', debouncedOnMouseMove)\n }\n }, [shouldListenMouseMove, debouncedOnMouseMove])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerMutationListener(\n TableNode,\n (mutations) => {\n editor.getEditorState().read(\n () => {\n let resetObserver = false\n for (const [key, type] of mutations) {\n switch (type) {\n case 'created': {\n tableSetRef.current.add(key)\n resetObserver = true\n break\n }\n case 'destroyed': {\n tableSetRef.current.delete(key)\n resetObserver = true\n break\n }\n default:\n break\n }\n }\n if (resetObserver) {\n // Reset resize observers\n tableResizeObserver.disconnect()\n for (const tableKey of tableSetRef.current) {\n const { tableElement } = $getTableAndElementByKey(tableKey)\n tableResizeObserver.observe(tableElement)\n }\n setShouldListenMouseMove(tableSetRef.current.size > 0)\n }\n },\n { editor },\n )\n },\n { skipInitialization: false },\n ),\n )\n }, [editor, tableResizeObserver])\n\n const insertAction = (insertRow: boolean) => {\n editor.update(() => {\n if (tableCellDOMNodeRef.current) {\n const maybeTableNode = $getNearestNodeFromDOMNode(tableCellDOMNodeRef.current)\n maybeTableNode?.selectEnd()\n if (insertRow) {\n $insertTableRowAtSelection()\n setShownRow(false)\n } else {\n $insertTableColumnAtSelection()\n setShownColumn(false)\n }\n }\n })\n }\n\n if (!isEditable) {\n return null\n }\n\n return (\n <>\n {isShownRow && (\n <button\n aria-label=\"Add Row\"\n className={editorConfig.editorConfig.lexical.theme.tableAddRows}\n onClick={() => insertAction(true)}\n style={{ ...position }}\n type=\"button\"\n />\n )}\n {isShownColumn && (\n <button\n aria-label=\"Add Column\"\n className={editorConfig.editorConfig.lexical.theme.tableAddColumns}\n onClick={() => insertAction(false)}\n style={{ ...position }}\n type=\"button\"\n />\n )}\n </>\n )\n}\n\nfunction getMouseInfo(\n event: MouseEvent,\n editorConfig: EditorConfig,\n): {\n isOutside: boolean\n tableDOMNode: HTMLElement | null\n} {\n const target = event.target\n\n if (isHTMLElement(target)) {\n const tableDOMNode = target.closest<HTMLElement>(\n `td.${editorConfig.theme.tableCell}, th.${editorConfig.theme.tableCell}`,\n )\n\n const isOutside = !(\n tableDOMNode ||\n target.closest<HTMLElement>(`button.${editorConfig.theme.tableAddRows}`) ||\n target.closest<HTMLElement>(`button.${editorConfig.theme.tableAddColumns}`) ||\n target.closest<HTMLElement>(`div.${editorConfig.theme.tableCellResizer}`)\n )\n\n return { isOutside, tableDOMNode }\n } else {\n return { isOutside: true, tableDOMNode: null }\n }\n}\n\nexport function TableHoverActionsPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): null | React.ReactPortal {\n const isEditable = useLexicalEditable()\n\n if (!isEditable) {\n return null\n }\n\n return createPortal(<TableHoverActionsContainer anchorElem={anchorElem} />, anchorElem)\n}\n"],"names":["useLexicalComposerContext","useLexicalEditable","$getTableAndElementByKey","$getTableColumnIndexFromTableCellNode","$getTableRowIndexFromTableCellNode","$insertTableColumnAtSelection","$insertTableRowAtSelection","$isTableCellNode","$isTableNode","getTableElement","TableNode","$findMatchingParent","mergeRegister","$getNearestNodeFromDOMNode","isHTMLElement","useEffect","useMemo","useRef","useState","React","createPortal","useEditorConfigContext","useDebounce","BUTTON_WIDTH_PX","TableHoverActionsContainer","anchorElem","editor","isEditable","editorConfig","isShownRow","setShownRow","isShownColumn","setShownColumn","shouldListenMouseMove","setShouldListenMouseMove","position","setPosition","tableSetRef","Set","tableCellDOMNodeRef","debouncedOnMouseMove","event","isOutside","tableDOMNode","getMouseInfo","lexical","current","hoveredRowNode","hoveredColumnNode","tableDOMElement","getEditorState","read","maybeTableCell","table","node","getElementByKey","getKey","rowCount","getChildrenSize","colCount","getChildAtIndex","rowIndex","colIndex","tableContainerElement","parentElement","bottom","tableElemBottom","height","tableElemHeight","left","tableElemLeft","right","tableElemRight","width","tableElemWidth","y","tableElemY","getBoundingClientRect","tableHasScroll","classList","contains","scrollWidth","clientWidth","editorElemLeft","editorElemY","offsetLeft","top","offsetWidth","tableResizeObserver","ResizeObserver","document","addEventListener","removeEventListener","registerMutationListener","mutations","resetObserver","key","type","add","delete","disconnect","tableKey","tableElement","observe","size","skipInitialization","insertAction","insertRow","update","maybeTableNode","selectEnd","button","aria-label","className","theme","tableAddRows","onClick","style","tableAddColumns","target","closest","tableCell","tableCellResizer","TableHoverActionsPlugin","body"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.tsx"],"sourcesContent":["'use client'\n\nimport type { TableCellNode, TableRowNode } from '@lexical/table'\nimport type { EditorConfig, NodeKey } from 'lexical'\nimport type { JSX } from 'react'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { useLexicalEditable } from '@lexical/react/useLexicalEditable'\nimport {\n $getTableAndElementByKey,\n $getTableColumnIndexFromTableCellNode,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumnAtSelection,\n $insertTableRowAtSelection,\n $isTableCellNode,\n $isTableNode,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode, isHTMLElement } from 'lexical'\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport * as React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { useDebounce } from '../../utils/useDebounce.js'\n\nconst BUTTON_WIDTH_PX = 20\n\nfunction TableHoverActionsContainer({\n anchorElem,\n}: {\n anchorElem: HTMLElement\n}): JSX.Element | null {\n const [editor] = useLexicalComposerContext()\n const isEditable = useLexicalEditable()\n\n const editorConfig = useEditorConfigContext()\n const [isShownRow, setShownRow] = useState<boolean>(false)\n const [isShownColumn, setShownColumn] = useState<boolean>(false)\n const [shouldListenMouseMove, setShouldListenMouseMove] = useState<boolean>(false)\n const [position, setPosition] = useState({})\n const tableSetRef = useRef<Set<NodeKey>>(new Set())\n const tableCellDOMNodeRef = useRef<HTMLElement | null>(null)\n\n const debouncedOnMouseMove = useDebounce(\n (event: MouseEvent) => {\n const { isOutside, tableDOMNode } = getMouseInfo(event, editorConfig.editorConfig?.lexical)\n\n if (isOutside) {\n setShownRow(false)\n setShownColumn(false)\n return\n }\n\n if (!tableDOMNode) {\n return\n }\n\n tableCellDOMNodeRef.current = tableDOMNode\n\n let hoveredRowNode: null | TableCellNode = null\n let hoveredColumnNode: null | TableCellNode = null\n let tableDOMElement: HTMLElement | null = null\n\n editor.getEditorState().read(\n () => {\n const maybeTableCell = $getNearestNodeFromDOMNode(tableDOMNode)\n\n if ($isTableCellNode(maybeTableCell)) {\n const table = $findMatchingParent(maybeTableCell, (node) => $isTableNode(node))\n if (!$isTableNode(table)) {\n return\n }\n\n tableDOMElement = getTableElement(table, editor.getElementByKey(table.getKey()))\n\n if (tableDOMElement) {\n const rowCount = table.getChildrenSize()\n const colCount = (table.getChildAtIndex(0) as TableRowNode)?.getChildrenSize()\n\n const rowIndex = $getTableRowIndexFromTableCellNode(maybeTableCell)\n const colIndex = $getTableColumnIndexFromTableCellNode(maybeTableCell)\n\n if (rowIndex === rowCount - 1) {\n hoveredRowNode = maybeTableCell\n } else if (colIndex === colCount - 1) {\n hoveredColumnNode = maybeTableCell\n }\n }\n }\n },\n { editor },\n )\n\n if (!tableDOMElement) {\n return\n }\n\n // this is the scrollable div container of the table (in case of overflow)\n const tableContainerElement = (tableDOMElement as HTMLTableElement).parentElement\n\n if (!tableContainerElement) {\n return\n }\n\n const {\n bottom: tableElemBottom,\n height: tableElemHeight,\n left: tableElemLeft,\n right: tableElemRight,\n width: tableElemWidth,\n y: tableElemY,\n } = (tableDOMElement as HTMLTableElement).getBoundingClientRect()\n\n let tableHasScroll = false\n if (\n tableContainerElement &&\n tableContainerElement.classList.contains('LexicalEditorTheme__tableScrollableWrapper')\n ) {\n tableHasScroll = tableContainerElement.scrollWidth > tableContainerElement.clientWidth\n }\n\n const { left: editorElemLeft, y: editorElemY } = anchorElem.getBoundingClientRect()\n\n if (hoveredRowNode) {\n setShownColumn(false)\n setShownRow(true)\n setPosition({\n height: BUTTON_WIDTH_PX,\n left:\n tableHasScroll && tableContainerElement\n ? tableContainerElement.offsetLeft\n : tableElemLeft - editorElemLeft,\n top: tableElemBottom - editorElemY + 5,\n width:\n tableHasScroll && tableContainerElement\n ? tableContainerElement.offsetWidth\n : tableElemWidth,\n })\n } else if (hoveredColumnNode) {\n setShownColumn(true)\n setShownRow(false)\n setPosition({\n height: tableElemHeight,\n left: tableElemRight - editorElemLeft + 5,\n top: tableElemY - editorElemY,\n width: BUTTON_WIDTH_PX,\n })\n }\n },\n 50,\n 250,\n )\n\n // Hide the buttons on any table dimensions change to prevent last row cells\n // overlap behind the 'Add Row' button when text entry changes cell height\n const tableResizeObserver = useMemo(() => {\n return new ResizeObserver(() => {\n setShownRow(false)\n setShownColumn(false)\n })\n }, [])\n\n useEffect(() => {\n if (!shouldListenMouseMove) {\n return\n }\n\n document.addEventListener('mousemove', debouncedOnMouseMove)\n\n return () => {\n setShownRow(false)\n setShownColumn(false)\n\n document.removeEventListener('mousemove', debouncedOnMouseMove)\n }\n }, [shouldListenMouseMove, debouncedOnMouseMove])\n\n useEffect(() => {\n return mergeRegister(\n editor.registerMutationListener(\n TableNode,\n (mutations) => {\n editor.getEditorState().read(\n () => {\n let resetObserver = false\n for (const [key, type] of mutations) {\n switch (type) {\n case 'created': {\n tableSetRef.current.add(key)\n resetObserver = true\n break\n }\n case 'destroyed': {\n tableSetRef.current.delete(key)\n resetObserver = true\n break\n }\n default:\n break\n }\n }\n if (resetObserver) {\n // Reset resize observers\n tableResizeObserver.disconnect()\n for (const tableKey of tableSetRef.current) {\n const { tableElement } = $getTableAndElementByKey(tableKey)\n tableResizeObserver.observe(tableElement)\n }\n setShouldListenMouseMove(tableSetRef.current.size > 0)\n }\n },\n { editor },\n )\n },\n { skipInitialization: false },\n ),\n )\n }, [editor, tableResizeObserver])\n\n const insertAction = (insertRow: boolean) => {\n editor.update(() => {\n if (tableCellDOMNodeRef.current) {\n const maybeTableNode = $getNearestNodeFromDOMNode(tableCellDOMNodeRef.current)\n maybeTableNode?.selectEnd()\n if (insertRow) {\n $insertTableRowAtSelection()\n setShownRow(false)\n } else {\n $insertTableColumnAtSelection()\n setShownColumn(false)\n }\n }\n })\n }\n\n if (!isEditable) {\n return null\n }\n\n return (\n <>\n {isShownRow && (\n <button\n aria-label=\"Add Row\"\n className={editorConfig.editorConfig.lexical.theme.tableAddRows}\n onClick={() => insertAction(true)}\n style={{ ...position }}\n type=\"button\"\n />\n )}\n {isShownColumn && (\n <button\n aria-label=\"Add Column\"\n className={editorConfig.editorConfig.lexical.theme.tableAddColumns}\n onClick={() => insertAction(false)}\n style={{ ...position }}\n type=\"button\"\n />\n )}\n </>\n )\n}\n\nfunction getMouseInfo(\n event: MouseEvent,\n editorConfig: EditorConfig,\n): {\n isOutside: boolean\n tableDOMNode: HTMLElement | null\n} {\n const target = event.target\n\n if (isHTMLElement(target)) {\n const tableDOMNode = target.closest<HTMLElement>(\n `td.${editorConfig.theme.tableCell}, th.${editorConfig.theme.tableCell}`,\n )\n\n const isOutside = !(\n tableDOMNode ||\n target.closest<HTMLElement>(`button.${editorConfig.theme.tableAddRows}`) ||\n target.closest<HTMLElement>(`button.${editorConfig.theme.tableAddColumns}`) ||\n target.closest<HTMLElement>(`div.${editorConfig.theme.tableCellResizer}`)\n )\n\n return { isOutside, tableDOMNode }\n } else {\n return { isOutside: true, tableDOMNode: null }\n }\n}\n\nexport function TableHoverActionsPlugin({\n anchorElem = document.body,\n}: {\n anchorElem?: HTMLElement\n}): null | React.ReactPortal {\n const isEditable = useLexicalEditable()\n\n if (!isEditable) {\n return null\n }\n\n return createPortal(<TableHoverActionsContainer anchorElem={anchorElem} />, anchorElem)\n}\n"],"names":["useLexicalComposerContext","useLexicalEditable","$getTableAndElementByKey","$getTableColumnIndexFromTableCellNode","$getTableRowIndexFromTableCellNode","$insertTableColumnAtSelection","$insertTableRowAtSelection","$isTableCellNode","$isTableNode","getTableElement","TableNode","$findMatchingParent","mergeRegister","$getNearestNodeFromDOMNode","isHTMLElement","useEffect","useMemo","useRef","useState","createPortal","useEditorConfigContext","useDebounce","BUTTON_WIDTH_PX","TableHoverActionsContainer","anchorElem","editor","isEditable","editorConfig","isShownRow","setShownRow","isShownColumn","setShownColumn","shouldListenMouseMove","setShouldListenMouseMove","position","setPosition","tableSetRef","Set","tableCellDOMNodeRef","debouncedOnMouseMove","event","isOutside","tableDOMNode","getMouseInfo","lexical","current","hoveredRowNode","hoveredColumnNode","tableDOMElement","getEditorState","read","maybeTableCell","table","node","getElementByKey","getKey","rowCount","getChildrenSize","colCount","getChildAtIndex","rowIndex","colIndex","tableContainerElement","parentElement","bottom","tableElemBottom","height","tableElemHeight","left","tableElemLeft","right","tableElemRight","width","tableElemWidth","y","tableElemY","getBoundingClientRect","tableHasScroll","classList","contains","scrollWidth","clientWidth","editorElemLeft","editorElemY","offsetLeft","top","offsetWidth","tableResizeObserver","ResizeObserver","document","addEventListener","removeEventListener","registerMutationListener","mutations","resetObserver","key","type","add","delete","disconnect","tableKey","tableElement","observe","size","skipInitialization","insertAction","insertRow","update","maybeTableNode","selectEnd","button","aria-label","className","theme","tableAddRows","onClick","style","tableAddColumns","target","closest","tableCell","tableCellResizer","TableHoverActionsPlugin","body"],"mappings":"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"}
|