@payloadcms/richtext-lexical 3.22.0 → 3.23.0-canary.597254e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/exports/client/Field-ZQTPXWY3.js +2 -0
- package/dist/exports/client/Field-ZQTPXWY3.js.map +7 -0
- package/dist/exports/client/bundled.css +1 -1
- package/dist/exports/client/{chunk-JKFXKPNG.js → chunk-CIY6PKN6.js} +2 -2
- package/dist/exports/client/chunk-CIY6PKN6.js.map +7 -0
- package/dist/exports/client/chunk-KEEUF5NK.js +2 -0
- package/dist/exports/client/chunk-KEEUF5NK.js.map +7 -0
- package/dist/exports/client/componentInline-UG3ZWWJY.js +2 -0
- package/dist/exports/client/index.js +10 -10
- package/dist/exports/client/index.js.map +3 -3
- package/dist/features/blocks/client/component/index.d.ts.map +1 -1
- package/dist/features/blocks/client/component/index.js +43 -22
- package/dist/features/blocks/client/component/index.js.map +1 -1
- package/dist/features/blocks/client/componentInline/index.d.ts.map +1 -1
- package/dist/features/blocks/client/componentInline/index.js +28 -9
- package/dist/features/blocks/client/componentInline/index.js.map +1 -1
- package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.d.ts.map +1 -1
- package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js +39 -31
- package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map +1 -1
- package/dist/features/link/client/plugins/autoLink/index.d.ts.map +1 -1
- package/dist/features/link/client/plugins/autoLink/index.js +35 -35
- package/dist/features/link/client/plugins/autoLink/index.js.map +1 -1
- package/dist/features/link/server/baseFields.d.ts.map +1 -1
- package/dist/features/link/server/baseFields.js +5 -8
- package/dist/features/link/server/baseFields.js.map +1 -1
- package/dist/features/toolbars/fixed/client/Toolbar/index.js.map +1 -1
- package/dist/features/toolbars/inline/client/Toolbar/index.js +1 -1
- package/dist/features/toolbars/inline/client/Toolbar/index.js.map +1 -1
- package/dist/features/typesClient.d.ts +2 -1
- package/dist/features/typesClient.d.ts.map +1 -1
- package/dist/features/typesClient.js.map +1 -1
- package/dist/features/upload/server/feature.server.d.ts.map +1 -1
- package/dist/features/upload/server/feature.server.js +10 -8
- package/dist/features/upload/server/feature.server.js.map +1 -1
- package/dist/field/Field.d.ts +1 -1
- package/dist/field/Field.d.ts.map +1 -1
- package/dist/field/Field.js +17 -7
- package/dist/field/Field.js.map +1 -1
- package/dist/field/bundled.css +1 -1
- package/dist/field/index.d.ts.map +1 -1
- package/dist/field/index.js +23 -18
- package/dist/field/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lexical/config/client/loader.d.ts +3 -2
- package/dist/lexical/config/client/loader.d.ts.map +1 -1
- package/dist/lexical/config/client/loader.js +2 -0
- package/dist/lexical/config/client/loader.js.map +1 -1
- package/dist/lexical/plugins/DecoratorPlugin/index.d.ts +12 -0
- package/dist/lexical/plugins/DecoratorPlugin/index.d.ts.map +1 -1
- package/dist/lexical/plugins/DecoratorPlugin/index.js +198 -19
- package/dist/lexical/plugins/DecoratorPlugin/index.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.d.ts.map +1 -1
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js +10 -4
- package/dist/lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/LexicalMenu.js.map +1 -1
- package/dist/lexical/plugins/SlashMenu/useMenuTriggerMatch.js.map +1 -1
- package/dist/lexical/plugins/handles/utils/getNodeCloseToPoint.d.ts.map +1 -1
- package/dist/lexical/plugins/handles/utils/getNodeCloseToPoint.js +2 -1
- package/dist/lexical/plugins/handles/utils/getNodeCloseToPoint.js.map +1 -1
- package/dist/utilities/createClientFeature.d.ts +2 -1
- package/dist/utilities/createClientFeature.d.ts.map +1 -1
- package/dist/utilities/createClientFeature.js +2 -0
- package/dist/utilities/createClientFeature.js.map +1 -1
- package/package.json +7 -7
- package/dist/exports/client/Field-LOLYH42M.js +0 -2
- package/dist/exports/client/Field-LOLYH42M.js.map +0 -7
- package/dist/exports/client/chunk-JKFXKPNG.js.map +0 -7
- package/dist/exports/client/chunk-UJAPUXH4.js +0 -2
- package/dist/exports/client/chunk-UJAPUXH4.js.map +0 -7
- package/dist/exports/client/componentInline-KK5V376W.js +0 -2
- /package/dist/exports/client/{componentInline-KK5V376W.js.map → componentInline-UG3ZWWJY.js.map} +0 -0
package/dist/features/experimental_table/client/plugins/TableHoverActionsPlugin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","$getTableAndElementByKey","$getTableColumnIndexFromTableCellNode","$getTableRowIndexFromTableCellNode","$insertTableColumn__EXPERIMENTAL","$insertTableRow__EXPERIMENTAL","$isTableCellNode","$isTableNode","getTableElement","TableNode","$findMatchingParent","mergeRegister","$getNearestNodeFromDOMNode","useEffect","useMemo","useRef","useState","React","createPortal","useEditorConfigContext","useDebounce","BUTTON_WIDTH_PX","TableHoverActionsContainer","anchorElem","editor","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","bottom","tableElemBottom","height","tableElemHeight","left","tableElemLeft","right","tableElemRight","width","tableElemWidth","y","tableElemY","getBoundingClientRect","editorElemLeft","editorElemY","top","tableResizeObserver","ResizeObserver","document","addEventListener","removeEventListener","registerMutationListener","mutations","resetObserver","key","type","add","delete","disconnect","tableKey","tableElement","observe","size","skipInitialization","insertAction","insertRow","update","maybeTableNode","selectEnd","isEditable","_jsxs","_Fragment","_jsx","className","theme","tableAddRows","onClick","style","tableAddColumns","target","HTMLElement","closest","tableCell","tableCellResizer","TableHoverActionsPlugin","t0","$","t1","undefined","body","t2"],"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 {\n $getTableAndElementByKey,\n $getTableColumnIndexFromTableCellNode,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumn__EXPERIMENTAL,\n $insertTableRow__EXPERIMENTAL,\n $isTableCellNode,\n $isTableNode,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode } 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 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 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 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: tableElemLeft - editorElemLeft,\n top: tableElemBottom - editorElemY + 5,\n width: 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 },\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 $insertTableRow__EXPERIMENTAL()\n setShownRow(false)\n } else {\n $insertTableColumn__EXPERIMENTAL()\n setShownColumn(false)\n }\n }\n })\n }\n\n if (!editor?.isEditable()) {\n return null\n }\n\n return (\n <>\n {isShownRow && (\n <button\n className={editorConfig.editorConfig.lexical.theme.tableAddRows}\n onClick={() => insertAction(true)}\n style={{ ...position }}\n type=\"button\"\n />\n )}\n {isShownColumn && (\n <button\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 (target && target instanceof HTMLElement) {\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 [editor] = useLexicalComposerContext()\n if (!editor?.isEditable()) {\n return null\n }\n\n return createPortal(<TableHoverActionsContainer anchorElem={anchorElem} />, anchorElem)\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","$getTableAndElementByKey","$getTableColumnIndexFromTableCellNode","$getTableRowIndexFromTableCellNode","$insertTableColumn__EXPERIMENTAL","$insertTableRow__EXPERIMENTAL","$isTableCellNode","$isTableNode","getTableElement","TableNode","$findMatchingParent","mergeRegister","$getNearestNodeFromDOMNode","useEffect","useMemo","useRef","useState","React","createPortal","useEditorConfigContext","useDebounce","BUTTON_WIDTH_PX","TableHoverActionsContainer","anchorElem","editor","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","editorElemLeft","editorElemY","top","tableResizeObserver","ResizeObserver","document","addEventListener","removeEventListener","registerMutationListener","mutations","resetObserver","key","type","add","delete","disconnect","tableKey","tableElement","observe","size","skipInitialization","insertAction","insertRow","update","maybeTableNode","selectEnd","isEditable","_jsxs","_Fragment","_jsx","className","theme","tableAddRows","onClick","style","tableAddColumns","target","HTMLElement","closest","tableCell","tableCellResizer","TableHoverActionsPlugin","t0","$","t1","undefined","body","t2"],"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 {\n $getTableAndElementByKey,\n $getTableColumnIndexFromTableCellNode,\n $getTableRowIndexFromTableCellNode,\n $insertTableColumn__EXPERIMENTAL,\n $insertTableRow__EXPERIMENTAL,\n $isTableCellNode,\n $isTableNode,\n getTableElement,\n TableNode,\n} from '@lexical/table'\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils'\nimport { $getNearestNodeFromDOMNode } 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 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 } = tableContainerElement.getBoundingClientRect()\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: tableElemLeft - editorElemLeft,\n top: tableElemBottom - editorElemY + 5,\n width: 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 $insertTableRow__EXPERIMENTAL()\n setShownRow(false)\n } else {\n $insertTableColumn__EXPERIMENTAL()\n setShownColumn(false)\n }\n }\n })\n }\n\n if (!editor?.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 (target && target instanceof HTMLElement) {\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 [editor] = useLexicalComposerContext()\n if (!editor?.isEditable()) {\n return null\n }\n\n return createPortal(<TableHoverActionsContainer anchorElem={anchorElem} />, anchorElem)\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/link/client/plugins/autoLink/index.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAOjD,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAA;AAEpE,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAuB,UAE3C,MAAM;;;;;SAYrB;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/features/link/client/plugins/autoLink/index.tsx"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAOjD,UAAU,iBAAiB;IACzB,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,CAAA;AAEpE,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAuB,UAE3C,MAAM;;;;;SAYrB;AAsZD,eAAO,MAAM,cAAc,EAAE,eAAe,CAAC,WAAW,CAMvD,CAAA"}
|
|
@@ -22,8 +22,8 @@ export function createLinkMatcherWithRegExp(regExp, urlTransformer = text => tex
|
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
24
|
function findFirstMatch(text, matchers) {
|
|
25
|
-
for (
|
|
26
|
-
const match =
|
|
25
|
+
for (const matcher of matchers) {
|
|
26
|
+
const match = matcher(text);
|
|
27
27
|
if (match != null) {
|
|
28
28
|
return match;
|
|
29
29
|
}
|
|
@@ -32,7 +32,7 @@ function findFirstMatch(text, matchers) {
|
|
|
32
32
|
}
|
|
33
33
|
const PUNCTUATION_OR_SPACE = /[.,;\s]/;
|
|
34
34
|
function isSeparator(char) {
|
|
35
|
-
return PUNCTUATION_OR_SPACE.test(char);
|
|
35
|
+
return char !== undefined && PUNCTUATION_OR_SPACE.test(char);
|
|
36
36
|
}
|
|
37
37
|
function endsWithSeparator(textContent) {
|
|
38
38
|
return isSeparator(textContent[textContent.length - 1]);
|
|
@@ -112,19 +112,16 @@ function $createAutoLinkNode_(nodes, startIndex, endIndex, match) {
|
|
|
112
112
|
fields
|
|
113
113
|
});
|
|
114
114
|
if (nodes.length === 1) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
if (
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
115
|
+
const split = startIndex === 0 ? nodes[0]?.splitText(endIndex) : nodes[0]?.splitText(startIndex, endIndex);
|
|
116
|
+
const [linkTextNode, remainingTextNode] = split;
|
|
117
|
+
if (linkTextNode) {
|
|
118
|
+
const textNode = $createTextNode(match.text);
|
|
119
|
+
textNode.setFormat(linkTextNode.getFormat());
|
|
120
|
+
textNode.setDetail(linkTextNode.getDetail());
|
|
121
|
+
textNode.setStyle(linkTextNode.getStyle());
|
|
122
|
+
linkNode.append(textNode);
|
|
123
|
+
linkTextNode.replace(linkNode);
|
|
121
124
|
}
|
|
122
|
-
const textNode = $createTextNode(match.text);
|
|
123
|
-
textNode.setFormat(linkTextNode.getFormat());
|
|
124
|
-
textNode.setDetail(linkTextNode.getDetail());
|
|
125
|
-
textNode.setStyle(linkTextNode.getStyle());
|
|
126
|
-
linkNode.append(textNode);
|
|
127
|
-
linkTextNode.replace(linkNode);
|
|
128
125
|
return remainingTextNode;
|
|
129
126
|
} else if (nodes.length > 1) {
|
|
130
127
|
const firstTextNode = nodes[0];
|
|
@@ -137,8 +134,7 @@ function $createAutoLinkNode_(nodes, startIndex, endIndex, match) {
|
|
|
137
134
|
}
|
|
138
135
|
const linkNodes = [];
|
|
139
136
|
let remainingTextNode;
|
|
140
|
-
|
|
141
|
-
const currentNode = nodes[i];
|
|
137
|
+
nodes.forEach(currentNode => {
|
|
142
138
|
const currentNodeText = currentNode.getTextContent();
|
|
143
139
|
const currentNodeLength = currentNodeText.length;
|
|
144
140
|
const currentNodeStart = offset;
|
|
@@ -148,30 +144,34 @@ function $createAutoLinkNode_(nodes, startIndex, endIndex, match) {
|
|
|
148
144
|
linkNodes.push(currentNode);
|
|
149
145
|
} else {
|
|
150
146
|
const [linkTextNode, endNode] = currentNode.splitText(endIndex - currentNodeStart);
|
|
151
|
-
|
|
147
|
+
if (linkTextNode) {
|
|
148
|
+
linkNodes.push(linkTextNode);
|
|
149
|
+
}
|
|
152
150
|
remainingTextNode = endNode;
|
|
153
151
|
}
|
|
154
152
|
}
|
|
155
153
|
offset += currentNodeLength;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
if (
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
154
|
+
});
|
|
155
|
+
if (firstLinkTextNode) {
|
|
156
|
+
const selection = $getSelection();
|
|
157
|
+
const selectedTextNode = selection ? selection.getNodes().find($isTextNode) : undefined;
|
|
158
|
+
const textNode = $createTextNode(firstLinkTextNode.getTextContent());
|
|
159
|
+
textNode.setFormat(firstLinkTextNode.getFormat());
|
|
160
|
+
textNode.setDetail(firstLinkTextNode.getDetail());
|
|
161
|
+
textNode.setStyle(firstLinkTextNode.getStyle());
|
|
162
|
+
linkNode.append(textNode, ...linkNodes);
|
|
163
|
+
// it does not preserve caret position if caret was at the first text node
|
|
164
|
+
// so we need to restore caret position
|
|
165
|
+
if (selectedTextNode && selectedTextNode === firstLinkTextNode) {
|
|
166
|
+
if ($isRangeSelection(selection)) {
|
|
167
|
+
textNode.select(selection.anchor.offset, selection.focus.offset);
|
|
168
|
+
} else if ($isNodeSelection(selection)) {
|
|
169
|
+
textNode.select(0, textNode.getTextContent().length);
|
|
170
|
+
}
|
|
171
171
|
}
|
|
172
|
+
firstLinkTextNode.replace(linkNode);
|
|
173
|
+
return remainingTextNode;
|
|
172
174
|
}
|
|
173
|
-
firstLinkTextNode.replace(linkNode);
|
|
174
|
-
return remainingTextNode;
|
|
175
175
|
}
|
|
176
176
|
return undefined;
|
|
177
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","mergeRegister","$createTextNode","$getSelection","$isElementNode","$isLineBreakNode","$isNodeSelection","$isRangeSelection","$isTextNode","TextNode","TextNodeValue","useEffect","$createAutoLinkNode","$isAutoLinkNode","AutoLinkNode","$isLinkNode","createLinkMatcherWithRegExp","regExp","urlTransformer","text","match","exec","index","length","url","findFirstMatch","matchers","i","PUNCTUATION_OR_SPACE","isSeparator","char","test","endsWithSeparator","textContent","startsWithSeparator","startsWithTLD","isEmail","isPreviousNodeValid","node","previousNode","getPreviousSibling","getLastDescendant","getTextContent","isNextNodeValid","nextNode","getNextSibling","getFirstDescendant","isContentAroundIsValid","matchStart","matchEnd","nodes","contentBeforeIsValid","contentAfterIsValid","extractMatchingNodes","startIndex","endIndex","unmodifiedBeforeNodes","matchingNodes","unmodifiedAfterNodes","matchingOffset","currentOffset","currentNodes","currentNode","currentNodeText","currentNodeLength","currentNodeStart","currentNodeEnd","push","shift","$createAutoLinkNode_","fields","linkType","linkNode","remainingTextNode","linkTextNode","splitText","textNode","setFormat","getFormat","setDetail","getDetail","setStyle","getStyle","append","replace","firstTextNode","offset","firstLinkTextNode","linkNodes","endNode","selection","selectedTextNode","getNodes","find","undefined","select","anchor","focus","$handleLinkCreation","onChange","initialText","map","join","invalidMatchEnd","matchLength","isValid","actualMatchStart","actualMatchEnd","substring","handleLinkEdit","children","getChildren","childrenLength","child","isSimpleText","replaceWithChildren","getFields","flds","setFields","handleBadNeighbors","previousSibling","nextSibling","isEmailURI","startsWith","j","insertAfter","remove","getLatest","getTextNodesToMatch","textNodesToMatch","useAutoLink","editor","$","t0","t1","hasNodes","Error","onChangeWrapped","prevUrl","registerNodeTransform","parent","getParentOrThrow","previous","URL_REGEX","EMAIL_REGEX","MATCHERS","AutoLinkPlugin"],"sources":["../../../../../../src/features/link/client/plugins/autoLink/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalEditor, LexicalNode, TextNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n $isTextNode,\n TextNode as TextNodeValue,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { LinkFields } from '../../../nodes/types.js'\nimport type { ClientProps } from '../../index.js'\n\nimport { $createAutoLinkNode, $isAutoLinkNode, AutoLinkNode } from '../../../nodes/AutoLinkNode.js'\nimport { $isLinkNode } from '../../../nodes/LinkNode.js'\n\ntype ChangeHandler = (url: null | string, prevUrl: null | string) => void\n\ninterface LinkMatcherResult {\n fields?: LinkFields\n index: number\n length: number\n text: string\n url: string\n}\n\nexport type LinkMatcher = (text: string) => LinkMatcherResult | null\n\nexport function createLinkMatcherWithRegExp(\n regExp: RegExp,\n urlTransformer: (text: string) => string = (text) => text,\n) {\n return (text: string) => {\n const match = regExp.exec(text)\n if (match === null) {\n return null\n }\n return {\n index: match.index,\n length: match[0].length,\n text: match[0],\n url: urlTransformer(match[0]),\n }\n }\n}\n\nfunction findFirstMatch(text: string, matchers: LinkMatcher[]): LinkMatcherResult | null {\n for (let i = 0; i < matchers.length; i++) {\n const match = matchers[i](text)\n\n if (match != null) {\n return match\n }\n }\n\n return null\n}\n\nconst PUNCTUATION_OR_SPACE = /[.,;\\s]/\n\nfunction isSeparator(char: string): boolean {\n return PUNCTUATION_OR_SPACE.test(char)\n}\n\nfunction endsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[textContent.length - 1])\n}\n\nfunction startsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[0])\n}\n\n/**\n * Check if the text content starts with a fullstop followed by a top-level domain.\n * Meaning if the text content can be a beginning of a top level domain.\n * @param textContent\n * @param isEmail\n * @returns boolean\n */\nfunction startsWithTLD(textContent: string, isEmail: boolean): boolean {\n if (isEmail) {\n return /^\\.[a-z]{2,}/i.test(textContent)\n } else {\n return /^\\.[a-z0-9]+/i.test(textContent)\n }\n}\n\nfunction isPreviousNodeValid(node: LexicalNode): boolean {\n let previousNode = node.getPreviousSibling()\n if ($isElementNode(previousNode)) {\n previousNode = previousNode.getLastDescendant()\n }\n return (\n previousNode === null ||\n $isLineBreakNode(previousNode) ||\n ($isTextNode(previousNode) && endsWithSeparator(previousNode.getTextContent()))\n )\n}\n\nfunction isNextNodeValid(node: LexicalNode): boolean {\n let nextNode = node.getNextSibling()\n if ($isElementNode(nextNode)) {\n nextNode = nextNode.getFirstDescendant()\n }\n return (\n nextNode === null ||\n $isLineBreakNode(nextNode) ||\n ($isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent()))\n )\n}\n\nfunction isContentAroundIsValid(\n matchStart: number,\n matchEnd: number,\n text: string,\n nodes: TextNode[],\n): boolean {\n const contentBeforeIsValid =\n matchStart > 0 ? isSeparator(text[matchStart - 1]) : isPreviousNodeValid(nodes[0])\n if (!contentBeforeIsValid) {\n return false\n }\n\n const contentAfterIsValid =\n matchEnd < text.length ? isSeparator(text[matchEnd]) : isNextNodeValid(nodes[nodes.length - 1])\n return contentAfterIsValid\n}\n\nfunction extractMatchingNodes(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n): [\n matchingOffset: number,\n unmodifiedBeforeNodes: TextNode[],\n matchingNodes: TextNode[],\n unmodifiedAfterNodes: TextNode[],\n] {\n const unmodifiedBeforeNodes: TextNode[] = []\n const matchingNodes: TextNode[] = []\n const unmodifiedAfterNodes: TextNode[] = []\n let matchingOffset = 0\n\n let currentOffset = 0\n const currentNodes = [...nodes]\n\n while (currentNodes.length > 0) {\n const currentNode = currentNodes[0]\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = currentOffset\n const currentNodeEnd = currentOffset + currentNodeLength\n\n if (currentNodeEnd <= startIndex) {\n unmodifiedBeforeNodes.push(currentNode)\n matchingOffset += currentNodeLength\n } else if (currentNodeStart >= endIndex) {\n unmodifiedAfterNodes.push(currentNode)\n } else {\n matchingNodes.push(currentNode)\n }\n currentOffset += currentNodeLength\n currentNodes.shift()\n }\n return [matchingOffset, unmodifiedBeforeNodes, matchingNodes, unmodifiedAfterNodes]\n}\n\nfunction $createAutoLinkNode_(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n match: LinkMatcherResult,\n): TextNode | undefined {\n const fields = {\n linkType: 'custom',\n url: match.url,\n ...match.fields,\n } as LinkFields\n\n const linkNode = $createAutoLinkNode({ fields })\n if (nodes.length === 1) {\n let remainingTextNode = nodes[0]\n let linkTextNode\n if (startIndex === 0) {\n ;[linkTextNode, remainingTextNode] = remainingTextNode.splitText(endIndex)\n } else {\n ;[, linkTextNode, remainingTextNode] = remainingTextNode.splitText(startIndex, endIndex)\n }\n const textNode = $createTextNode(match.text)\n textNode.setFormat(linkTextNode.getFormat())\n textNode.setDetail(linkTextNode.getDetail())\n textNode.setStyle(linkTextNode.getStyle())\n linkNode.append(textNode)\n linkTextNode.replace(linkNode)\n return remainingTextNode\n } else if (nodes.length > 1) {\n const firstTextNode = nodes[0]\n let offset = firstTextNode.getTextContent().length\n let firstLinkTextNode\n if (startIndex === 0) {\n firstLinkTextNode = firstTextNode\n } else {\n ;[, firstLinkTextNode] = firstTextNode.splitText(startIndex)\n }\n const linkNodes: LexicalNode[] = []\n let remainingTextNode\n for (let i = 1; i < nodes.length; i++) {\n const currentNode = nodes[i]\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = offset\n const currentNodeEnd = offset + currentNodeLength\n if (currentNodeStart < endIndex) {\n if (currentNodeEnd <= endIndex) {\n linkNodes.push(currentNode)\n } else {\n const [linkTextNode, endNode] = currentNode.splitText(endIndex - currentNodeStart)\n linkNodes.push(linkTextNode)\n remainingTextNode = endNode\n }\n }\n offset += currentNodeLength\n }\n const selection = $getSelection()\n const selectedTextNode = selection ? selection.getNodes().find($isTextNode) : undefined\n const textNode = $createTextNode(firstLinkTextNode.getTextContent())\n textNode.setFormat(firstLinkTextNode.getFormat())\n textNode.setDetail(firstLinkTextNode.getDetail())\n textNode.setStyle(firstLinkTextNode.getStyle())\n linkNode.append(textNode, ...linkNodes)\n // it does not preserve caret position if caret was at the first text node\n // so we need to restore caret position\n if (selectedTextNode && selectedTextNode === firstLinkTextNode) {\n if ($isRangeSelection(selection)) {\n textNode.select(selection.anchor.offset, selection.focus.offset)\n } else if ($isNodeSelection(selection)) {\n textNode.select(0, textNode.getTextContent().length)\n }\n }\n firstLinkTextNode.replace(linkNode)\n return remainingTextNode\n }\n return undefined\n}\n\nfunction $handleLinkCreation(\n nodes: TextNode[],\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n let currentNodes = [...nodes]\n const initialText = currentNodes.map((node) => node.getTextContent()).join('')\n let text = initialText\n\n let match\n let invalidMatchEnd = 0\n\n while ((match = findFirstMatch(text, matchers)) != null && match !== null) {\n const matchStart: number = match.index\n const matchLength: number = match.length\n const matchEnd = matchStart + matchLength\n const isValid = isContentAroundIsValid(\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n initialText,\n currentNodes,\n )\n\n if (isValid) {\n const [matchingOffset, , matchingNodes, unmodifiedAfterNodes] = extractMatchingNodes(\n currentNodes,\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n )\n\n const actualMatchStart = invalidMatchEnd + matchStart - matchingOffset\n const actualMatchEnd = invalidMatchEnd + matchEnd - matchingOffset\n const remainingTextNode = $createAutoLinkNode_(\n matchingNodes,\n actualMatchStart,\n actualMatchEnd,\n match,\n )\n currentNodes = remainingTextNode\n ? [remainingTextNode, ...unmodifiedAfterNodes]\n : unmodifiedAfterNodes\n onChange(match.url, null)\n invalidMatchEnd = 0\n } else {\n invalidMatchEnd += matchEnd\n }\n\n text = text.substring(matchEnd)\n }\n}\n\nfunction handleLinkEdit(\n linkNode: AutoLinkNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n // Check children are simple text\n const children = linkNode.getChildren()\n const childrenLength = children.length\n for (let i = 0; i < childrenLength; i++) {\n const child = children[i]\n if (!$isTextNode(child) || !child.isSimpleText()) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n }\n\n // Check text content fully matches\n const text = linkNode.getTextContent()\n const match = findFirstMatch(text, matchers)\n if (match === null || match.text !== text) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n // Check neighbors\n if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n const url = linkNode.getFields()?.url\n if (url !== match?.url) {\n const flds = linkNode.getFields()\n flds.url = match?.url\n linkNode.setFields(flds)\n onChange(match.url, url ?? null)\n }\n}\n\n// Bad neighbors are edits in neighbor nodes that make AutoLinks incompatible.\n// Given the creation preconditions, these can only be simple text nodes.\nfunction handleBadNeighbors(\n textNode: TextNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n const previousSibling = textNode.getPreviousSibling()\n const nextSibling = textNode.getNextSibling()\n const text = textNode.getTextContent()\n\n if ($isAutoLinkNode(previousSibling)) {\n const isEmailURI = previousSibling.getFields()?.url\n ? (previousSibling.getFields()?.url?.startsWith('mailto:') ?? false)\n : false\n if (!startsWithSeparator(text) || startsWithTLD(text, isEmailURI)) {\n previousSibling.append(textNode)\n handleLinkEdit(previousSibling, matchers, onChange)\n onChange(null, previousSibling.getFields()?.url ?? null)\n }\n }\n\n if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {\n replaceWithChildren(nextSibling)\n handleLinkEdit(nextSibling, matchers, onChange)\n onChange(null, nextSibling.getFields()?.url ?? null)\n }\n}\n\nfunction replaceWithChildren(node: ElementNode): LexicalNode[] {\n const children = node.getChildren()\n const childrenLength = children.length\n\n for (let j = childrenLength - 1; j >= 0; j--) {\n node.insertAfter(children[j])\n }\n\n node.remove()\n return children.map((child) => child.getLatest())\n}\n\nfunction getTextNodesToMatch(textNode: TextNode): TextNode[] {\n // check if next siblings are simple text nodes till a node contains a space separator\n const textNodesToMatch = [textNode]\n let nextSibling = textNode.getNextSibling()\n while (nextSibling !== null && $isTextNode(nextSibling) && nextSibling.isSimpleText()) {\n textNodesToMatch.push(nextSibling)\n if (/\\s/.test(nextSibling.getTextContent())) {\n break\n }\n nextSibling = nextSibling.getNextSibling()\n }\n return textNodesToMatch\n}\n\nfunction useAutoLink(\n editor: LexicalEditor,\n matchers: LinkMatcher[],\n onChange?: ChangeHandler,\n): void {\n useEffect(() => {\n if (!editor.hasNodes([AutoLinkNode])) {\n throw new Error('LexicalAutoLinkPlugin: AutoLinkNode not registered on editor')\n }\n\n const onChangeWrapped = (url: null | string, prevUrl: null | string): void => {\n if (onChange != null) {\n onChange(url, prevUrl)\n }\n }\n\n return mergeRegister(\n editor.registerNodeTransform(TextNodeValue, (textNode: TextNode) => {\n const parent = textNode.getParentOrThrow()\n const previous = textNode.getPreviousSibling()\n if ($isAutoLinkNode(parent)) {\n handleLinkEdit(parent, matchers, onChangeWrapped)\n } else if (!$isLinkNode(parent)) {\n if (\n textNode.isSimpleText() &&\n (startsWithSeparator(textNode.getTextContent()) || !$isAutoLinkNode(previous))\n ) {\n const textNodesToMatch = getTextNodesToMatch(textNode)\n $handleLinkCreation(textNodesToMatch, matchers, onChangeWrapped)\n }\n\n handleBadNeighbors(textNode, matchers, onChangeWrapped)\n }\n }),\n )\n }, [editor, matchers, onChange])\n}\n\nconst URL_REGEX =\n /((https?:\\/\\/(www\\.)?)|(www\\.))[-\\w@:%.+~#=]{1,256}\\.[a-zA-Z\\d()]{1,6}\\b([-\\w()@:%+.~#?&/=]*)(?<![-.+():%])/\n\nconst EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\])|(([a-z\\-\\d]+\\.)+[a-z]{2,}))/i\n\nconst MATCHERS = [\n createLinkMatcherWithRegExp(URL_REGEX, (text) => {\n return text.startsWith('http') ? text : `https://${text}`\n }),\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => {\n return `mailto:${text}`\n }),\n]\n\nexport const AutoLinkPlugin: PluginComponent<ClientProps> = () => {\n const [editor] = useLexicalComposerContext()\n\n useAutoLink(editor, MATCHERS)\n\n return null\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","mergeRegister","$createTextNode","$getSelection","$isElementNode","$isLineBreakNode","$isNodeSelection","$isRangeSelection","$isTextNode","TextNode","TextNodeValue","useEffect","$createAutoLinkNode","$isAutoLinkNode","AutoLinkNode","$isLinkNode","createLinkMatcherWithRegExp","regExp","urlTransformer","text","match","exec","index","length","url","findFirstMatch","matchers","matcher","PUNCTUATION_OR_SPACE","isSeparator","char","undefined","test","endsWithSeparator","textContent","startsWithSeparator","startsWithTLD","isEmail","isPreviousNodeValid","node","previousNode","getPreviousSibling","getLastDescendant","getTextContent","isNextNodeValid","nextNode","getNextSibling","getFirstDescendant","isContentAroundIsValid","matchStart","matchEnd","nodes","contentBeforeIsValid","contentAfterIsValid","extractMatchingNodes","startIndex","endIndex","unmodifiedBeforeNodes","matchingNodes","unmodifiedAfterNodes","matchingOffset","currentOffset","currentNodes","currentNode","currentNodeText","currentNodeLength","currentNodeStart","currentNodeEnd","push","shift","$createAutoLinkNode_","fields","linkType","linkNode","split","splitText","linkTextNode","remainingTextNode","textNode","setFormat","getFormat","setDetail","getDetail","setStyle","getStyle","append","replace","firstTextNode","offset","firstLinkTextNode","linkNodes","forEach","endNode","selection","selectedTextNode","getNodes","find","select","anchor","focus","$handleLinkCreation","onChange","initialText","map","join","invalidMatchEnd","matchLength","isValid","actualMatchStart","actualMatchEnd","substring","handleLinkEdit","children","getChildren","childrenLength","i","child","isSimpleText","replaceWithChildren","getFields","flds","setFields","handleBadNeighbors","previousSibling","nextSibling","isEmailURI","startsWith","j","insertAfter","remove","getLatest","getTextNodesToMatch","textNodesToMatch","useAutoLink","editor","$","t0","t1","hasNodes","Error","onChangeWrapped","prevUrl","registerNodeTransform","parent","getParentOrThrow","previous","URL_REGEX","EMAIL_REGEX","MATCHERS","AutoLinkPlugin"],"sources":["../../../../../../src/features/link/client/plugins/autoLink/index.tsx"],"sourcesContent":["'use client'\nimport type { ElementNode, LexicalEditor, LexicalNode, TextNode } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { mergeRegister } from '@lexical/utils'\nimport {\n $createTextNode,\n $getSelection,\n $isElementNode,\n $isLineBreakNode,\n $isNodeSelection,\n $isRangeSelection,\n $isTextNode,\n TextNode as TextNodeValue,\n} from 'lexical'\nimport { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { LinkFields } from '../../../nodes/types.js'\nimport type { ClientProps } from '../../index.js'\n\nimport { $createAutoLinkNode, $isAutoLinkNode, AutoLinkNode } from '../../../nodes/AutoLinkNode.js'\nimport { $isLinkNode } from '../../../nodes/LinkNode.js'\n\ntype ChangeHandler = (url: null | string, prevUrl: null | string) => void\n\ninterface LinkMatcherResult {\n fields?: LinkFields\n index: number\n length: number\n text: string\n url: string\n}\n\nexport type LinkMatcher = (text: string) => LinkMatcherResult | null\n\nexport function createLinkMatcherWithRegExp(\n regExp: RegExp,\n urlTransformer: (text: string) => string = (text) => text,\n) {\n return (text: string) => {\n const match = regExp.exec(text)\n if (match === null) {\n return null\n }\n return {\n index: match.index,\n length: match[0].length,\n text: match[0],\n url: urlTransformer(match[0]),\n }\n }\n}\n\nfunction findFirstMatch(text: string, matchers: LinkMatcher[]): LinkMatcherResult | null {\n for (const matcher of matchers) {\n const match = matcher(text)\n\n if (match != null) {\n return match\n }\n }\n\n return null\n}\n\nconst PUNCTUATION_OR_SPACE = /[.,;\\s]/\n\nfunction isSeparator(char: string | undefined): boolean {\n return char !== undefined && PUNCTUATION_OR_SPACE.test(char)\n}\n\nfunction endsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[textContent.length - 1])\n}\n\nfunction startsWithSeparator(textContent: string): boolean {\n return isSeparator(textContent[0])\n}\n\n/**\n * Check if the text content starts with a fullstop followed by a top-level domain.\n * Meaning if the text content can be a beginning of a top level domain.\n * @param textContent\n * @param isEmail\n * @returns boolean\n */\nfunction startsWithTLD(textContent: string, isEmail: boolean): boolean {\n if (isEmail) {\n return /^\\.[a-z]{2,}/i.test(textContent)\n } else {\n return /^\\.[a-z0-9]+/i.test(textContent)\n }\n}\n\nfunction isPreviousNodeValid(node: LexicalNode): boolean {\n let previousNode = node.getPreviousSibling()\n if ($isElementNode(previousNode)) {\n previousNode = previousNode.getLastDescendant()\n }\n return (\n previousNode === null ||\n $isLineBreakNode(previousNode) ||\n ($isTextNode(previousNode) && endsWithSeparator(previousNode.getTextContent()))\n )\n}\n\nfunction isNextNodeValid(node: LexicalNode): boolean {\n let nextNode = node.getNextSibling()\n if ($isElementNode(nextNode)) {\n nextNode = nextNode.getFirstDescendant()\n }\n return (\n nextNode === null ||\n $isLineBreakNode(nextNode) ||\n ($isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent()))\n )\n}\n\nfunction isContentAroundIsValid(\n matchStart: number,\n matchEnd: number,\n text: string,\n nodes: TextNode[],\n): boolean {\n const contentBeforeIsValid =\n matchStart > 0 ? isSeparator(text[matchStart - 1]) : isPreviousNodeValid(nodes[0]!)\n if (!contentBeforeIsValid) {\n return false\n }\n\n const contentAfterIsValid =\n matchEnd < text.length ? isSeparator(text[matchEnd]) : isNextNodeValid(nodes[nodes.length - 1]!)\n return contentAfterIsValid\n}\n\nfunction extractMatchingNodes(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n): [\n matchingOffset: number,\n unmodifiedBeforeNodes: TextNode[],\n matchingNodes: TextNode[],\n unmodifiedAfterNodes: TextNode[],\n] {\n const unmodifiedBeforeNodes: TextNode[] = []\n const matchingNodes: TextNode[] = []\n const unmodifiedAfterNodes: TextNode[] = []\n let matchingOffset = 0\n\n let currentOffset = 0\n const currentNodes = [...nodes]\n\n while (currentNodes.length > 0) {\n const currentNode = currentNodes[0]!\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = currentOffset\n const currentNodeEnd = currentOffset + currentNodeLength\n\n if (currentNodeEnd <= startIndex) {\n unmodifiedBeforeNodes.push(currentNode)\n matchingOffset += currentNodeLength\n } else if (currentNodeStart >= endIndex) {\n unmodifiedAfterNodes.push(currentNode)\n } else {\n matchingNodes.push(currentNode)\n }\n currentOffset += currentNodeLength\n currentNodes.shift()\n }\n return [matchingOffset, unmodifiedBeforeNodes, matchingNodes, unmodifiedAfterNodes]\n}\n\nfunction $createAutoLinkNode_(\n nodes: TextNode[],\n startIndex: number,\n endIndex: number,\n match: LinkMatcherResult,\n): TextNode | undefined {\n const fields = {\n linkType: 'custom',\n url: match.url,\n ...match.fields,\n } as LinkFields\n\n const linkNode = $createAutoLinkNode({ fields })\n if (nodes.length === 1) {\n const split = (\n startIndex === 0 ? nodes[0]?.splitText(endIndex) : nodes[0]?.splitText(startIndex, endIndex)\n )!\n\n const [linkTextNode, remainingTextNode] = split\n if (linkTextNode) {\n const textNode = $createTextNode(match.text)\n textNode.setFormat(linkTextNode.getFormat())\n textNode.setDetail(linkTextNode.getDetail())\n textNode.setStyle(linkTextNode.getStyle())\n linkNode.append(textNode)\n linkTextNode.replace(linkNode)\n }\n return remainingTextNode\n } else if (nodes.length > 1) {\n const firstTextNode = nodes[0]!\n let offset = firstTextNode.getTextContent().length\n let firstLinkTextNode\n if (startIndex === 0) {\n firstLinkTextNode = firstTextNode\n } else {\n ;[, firstLinkTextNode] = firstTextNode.splitText(startIndex)\n }\n const linkNodes: LexicalNode[] = []\n let remainingTextNode\n nodes.forEach((currentNode) => {\n const currentNodeText = currentNode.getTextContent()\n const currentNodeLength = currentNodeText.length\n const currentNodeStart = offset\n const currentNodeEnd = offset + currentNodeLength\n if (currentNodeStart < endIndex) {\n if (currentNodeEnd <= endIndex) {\n linkNodes.push(currentNode)\n } else {\n const [linkTextNode, endNode] = currentNode.splitText(endIndex - currentNodeStart)\n if (linkTextNode) {\n linkNodes.push(linkTextNode)\n }\n remainingTextNode = endNode\n }\n }\n offset += currentNodeLength\n })\n\n if (firstLinkTextNode) {\n const selection = $getSelection()\n const selectedTextNode = selection ? selection.getNodes().find($isTextNode) : undefined\n const textNode = $createTextNode(firstLinkTextNode.getTextContent())\n textNode.setFormat(firstLinkTextNode.getFormat())\n textNode.setDetail(firstLinkTextNode.getDetail())\n textNode.setStyle(firstLinkTextNode.getStyle())\n linkNode.append(textNode, ...linkNodes)\n // it does not preserve caret position if caret was at the first text node\n // so we need to restore caret position\n if (selectedTextNode && selectedTextNode === firstLinkTextNode) {\n if ($isRangeSelection(selection)) {\n textNode.select(selection.anchor.offset, selection.focus.offset)\n } else if ($isNodeSelection(selection)) {\n textNode.select(0, textNode.getTextContent().length)\n }\n }\n firstLinkTextNode.replace(linkNode)\n return remainingTextNode\n }\n }\n return undefined\n}\n\nfunction $handleLinkCreation(\n nodes: TextNode[],\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n let currentNodes = [...nodes]\n const initialText = currentNodes.map((node) => node.getTextContent()).join('')\n let text = initialText\n\n let match\n let invalidMatchEnd = 0\n\n while ((match = findFirstMatch(text, matchers)) != null && match !== null) {\n const matchStart: number = match.index\n const matchLength: number = match.length\n const matchEnd = matchStart + matchLength\n const isValid = isContentAroundIsValid(\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n initialText,\n currentNodes,\n )\n\n if (isValid) {\n const [matchingOffset, , matchingNodes, unmodifiedAfterNodes] = extractMatchingNodes(\n currentNodes,\n invalidMatchEnd + matchStart,\n invalidMatchEnd + matchEnd,\n )\n\n const actualMatchStart = invalidMatchEnd + matchStart - matchingOffset\n const actualMatchEnd = invalidMatchEnd + matchEnd - matchingOffset\n const remainingTextNode = $createAutoLinkNode_(\n matchingNodes,\n actualMatchStart,\n actualMatchEnd,\n match,\n )\n currentNodes = remainingTextNode\n ? [remainingTextNode, ...unmodifiedAfterNodes]\n : unmodifiedAfterNodes\n onChange(match.url, null)\n invalidMatchEnd = 0\n } else {\n invalidMatchEnd += matchEnd\n }\n\n text = text.substring(matchEnd)\n }\n}\n\nfunction handleLinkEdit(\n linkNode: AutoLinkNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n // Check children are simple text\n const children = linkNode.getChildren()\n const childrenLength = children.length\n for (let i = 0; i < childrenLength; i++) {\n const child = children[i]\n if (!$isTextNode(child) || !child.isSimpleText()) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n }\n\n // Check text content fully matches\n const text = linkNode.getTextContent()\n const match = findFirstMatch(text, matchers)\n if (match === null || match.text !== text) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n // Check neighbors\n if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {\n replaceWithChildren(linkNode)\n onChange(null, linkNode.getFields()?.url ?? null)\n return\n }\n\n const url = linkNode.getFields()?.url\n if (url !== match?.url) {\n const flds = linkNode.getFields()\n flds.url = match?.url\n linkNode.setFields(flds)\n onChange(match.url, url ?? null)\n }\n}\n\n// Bad neighbors are edits in neighbor nodes that make AutoLinks incompatible.\n// Given the creation preconditions, these can only be simple text nodes.\nfunction handleBadNeighbors(\n textNode: TextNode,\n matchers: LinkMatcher[],\n onChange: ChangeHandler,\n): void {\n const previousSibling = textNode.getPreviousSibling()\n const nextSibling = textNode.getNextSibling()\n const text = textNode.getTextContent()\n\n if ($isAutoLinkNode(previousSibling)) {\n const isEmailURI = previousSibling.getFields()?.url\n ? (previousSibling.getFields()?.url?.startsWith('mailto:') ?? false)\n : false\n if (!startsWithSeparator(text) || startsWithTLD(text, isEmailURI)) {\n previousSibling.append(textNode)\n handleLinkEdit(previousSibling, matchers, onChange)\n onChange(null, previousSibling.getFields()?.url ?? null)\n }\n }\n\n if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {\n replaceWithChildren(nextSibling)\n handleLinkEdit(nextSibling, matchers, onChange)\n onChange(null, nextSibling.getFields()?.url ?? null)\n }\n}\n\nfunction replaceWithChildren(node: ElementNode): LexicalNode[] {\n const children = node.getChildren()\n const childrenLength = children.length\n\n for (let j = childrenLength - 1; j >= 0; j--) {\n node.insertAfter(children[j]!)\n }\n\n node.remove()\n return children.map((child) => child.getLatest())\n}\n\nfunction getTextNodesToMatch(textNode: TextNode): TextNode[] {\n // check if next siblings are simple text nodes till a node contains a space separator\n const textNodesToMatch = [textNode]\n let nextSibling = textNode.getNextSibling()\n while (nextSibling !== null && $isTextNode(nextSibling) && nextSibling.isSimpleText()) {\n textNodesToMatch.push(nextSibling)\n if (/\\s/.test(nextSibling.getTextContent())) {\n break\n }\n nextSibling = nextSibling.getNextSibling()\n }\n return textNodesToMatch\n}\n\nfunction useAutoLink(\n editor: LexicalEditor,\n matchers: LinkMatcher[],\n onChange?: ChangeHandler,\n): void {\n useEffect(() => {\n if (!editor.hasNodes([AutoLinkNode])) {\n throw new Error('LexicalAutoLinkPlugin: AutoLinkNode not registered on editor')\n }\n\n const onChangeWrapped = (url: null | string, prevUrl: null | string): void => {\n if (onChange != null) {\n onChange(url, prevUrl)\n }\n }\n\n return mergeRegister(\n editor.registerNodeTransform(TextNodeValue, (textNode: TextNode) => {\n const parent = textNode.getParentOrThrow()\n const previous = textNode.getPreviousSibling()\n if ($isAutoLinkNode(parent)) {\n handleLinkEdit(parent, matchers, onChangeWrapped)\n } else if (!$isLinkNode(parent)) {\n if (\n textNode.isSimpleText() &&\n (startsWithSeparator(textNode.getTextContent()) || !$isAutoLinkNode(previous))\n ) {\n const textNodesToMatch = getTextNodesToMatch(textNode)\n $handleLinkCreation(textNodesToMatch, matchers, onChangeWrapped)\n }\n\n handleBadNeighbors(textNode, matchers, onChangeWrapped)\n }\n }),\n )\n }, [editor, matchers, onChange])\n}\n\nconst URL_REGEX =\n /((https?:\\/\\/(www\\.)?)|(www\\.))[-\\w@:%.+~#=]{1,256}\\.[a-zA-Z\\d()]{1,6}\\b([-\\w()@:%+.~#?&/=]*)(?<![-.+():%])/\n\nconst EMAIL_REGEX =\n /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\])|(([a-z\\-\\d]+\\.)+[a-z]{2,}))/i\n\nconst MATCHERS = [\n createLinkMatcherWithRegExp(URL_REGEX, (text) => {\n return text.startsWith('http') ? text : `https://${text}`\n }),\n createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => {\n return `mailto:${text}`\n }),\n]\n\nexport const AutoLinkPlugin: PluginComponent<ClientProps> = () => {\n const [editor] = useLexicalComposerContext()\n\n useAutoLink(editor, MATCHERS)\n\n return null\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseFields.d.ts","sourceRoot":"","sources":["../../../../src/features/link/server/baseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAElB,eAAe,
|
|
1
|
+
{"version":3,"file":"baseFields.d.ts","sourceRoot":"","sources":["../../../../src/features/link/server/baseFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAElB,eAAe,EAIhB,MAAM,SAAS,CAAA;AAMhB,eAAO,MAAM,aAAa,WAChB,eAAe,uBACF,cAAc,EAAE,wBACf,cAAc,EAAE,aAC3B,MAAM,KAChB,kBAAkB,EA2HpB,CAAA"}
|
|
@@ -74,7 +74,6 @@ export const getBaseFields = (config, enabledCollections, disabledCollections, m
|
|
|
74
74
|
t
|
|
75
75
|
}) => t('fields:enterURL'),
|
|
76
76
|
required: true,
|
|
77
|
-
// @ts-expect-error - TODO: fix this
|
|
78
77
|
validate: (value, options) => {
|
|
79
78
|
if (options?.siblingData?.linkType === 'internal') {
|
|
80
79
|
return; // no validation needed, as no url should exist for internal links
|
|
@@ -93,17 +92,15 @@ export const getBaseFields = (config, enabledCollections, disabledCollections, m
|
|
|
93
92
|
value: 'internal'
|
|
94
93
|
});
|
|
95
94
|
baseFields[2].admin = {
|
|
96
|
-
condition: ({
|
|
97
|
-
linkType
|
|
98
|
-
}
|
|
95
|
+
condition: (_data, _siblingData) => {
|
|
96
|
+
return _siblingData.linkType !== 'internal';
|
|
97
|
+
}
|
|
99
98
|
};
|
|
100
99
|
baseFields.push({
|
|
101
100
|
name: 'doc',
|
|
102
101
|
admin: {
|
|
103
|
-
condition: ({
|
|
104
|
-
linkType
|
|
105
|
-
}) => {
|
|
106
|
-
return linkType === 'internal';
|
|
102
|
+
condition: (_data, _siblingData) => {
|
|
103
|
+
return _siblingData.linkType === 'internal';
|
|
107
104
|
}
|
|
108
105
|
},
|
|
109
106
|
// when admin.hidden is a function we need to dynamically call hidden with the user to know if the collection should be shown
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseFields.js","names":["validateUrl","validateUrlMinimal","getBaseFields","config","enabledCollections","disabledCollections","maxDepth","enabledRelations","collections","filter","slug","includes","map","admin","enableRichTextLink","hidden","baseFields","name","type","label","t","required","description","defaultValue","options","value","hooks","beforeChange","encodeURIComponent","validate","siblingData","linkType","length","push","condition","filterOptions","relationTo","user","find"],"sources":["../../../../src/features/link/server/baseFields.ts"],"sourcesContent":["import type {\n CollectionSlug,\n FieldAffectingData,\n RadioField,\n SanitizedConfig,\n TextField,\n User,\n} from 'payload'\n\nimport { validateUrl, validateUrlMinimal } from '../../../lexical/utils/url.js'\n\nexport const getBaseFields = (\n config: SanitizedConfig,\n enabledCollections?: CollectionSlug[],\n disabledCollections?: CollectionSlug[],\n maxDepth?: number,\n): FieldAffectingData[] => {\n let enabledRelations: CollectionSlug[]\n\n /**\n * Figure out which relations should be enabled (enabledRelations) based on a collection's admin.enableRichTextLink property,\n * or the Link Feature's enabledCollections and disabledCollections properties which override it.\n */\n if (enabledCollections) {\n enabledRelations = enabledCollections\n } else if (disabledCollections) {\n enabledRelations = config.collections\n .filter(({ slug }) => !disabledCollections.includes(slug))\n .map(({ slug }) => slug)\n } else {\n enabledRelations = config.collections\n .filter(({ admin: { enableRichTextLink, hidden } }) => {\n if (typeof hidden !== 'function' && hidden) {\n return false\n }\n return enableRichTextLink\n })\n .map(({ slug }) => slug)\n }\n\n const baseFields: FieldAffectingData[] = [\n {\n name: 'text',\n type: 'text',\n label: ({ t }) => t('fields:textToDisplay'),\n required: true,\n },\n {\n name: 'linkType',\n type: 'radio',\n admin: {\n description: ({ t }) => t('fields:chooseBetweenCustomTextOrDocument'),\n },\n defaultValue: 'custom',\n label: ({ t }) => t('fields:linkType'),\n options: [\n {\n label: ({ t }) => t('fields:customURL'),\n value: 'custom',\n },\n ],\n required: true,\n } as RadioField,\n {\n name: 'url',\n type: 'text',\n hooks: {\n beforeChange: [\n ({ value }) => {\n if (!value) {\n return\n }\n\n if (!validateUrl(value)) {\n return encodeURIComponent(value)\n }\n return value\n },\n ],\n },\n label: ({ t }) => t('fields:enterURL'),\n required: true,\n
|
|
1
|
+
{"version":3,"file":"baseFields.js","names":["validateUrl","validateUrlMinimal","getBaseFields","config","enabledCollections","disabledCollections","maxDepth","enabledRelations","collections","filter","slug","includes","map","admin","enableRichTextLink","hidden","baseFields","name","type","label","t","required","description","defaultValue","options","value","hooks","beforeChange","encodeURIComponent","validate","siblingData","linkType","length","push","condition","_data","_siblingData","filterOptions","relationTo","user","find"],"sources":["../../../../src/features/link/server/baseFields.ts"],"sourcesContent":["import type {\n CollectionSlug,\n FieldAffectingData,\n RadioField,\n SanitizedConfig,\n TextField,\n TextFieldSingleValidation,\n User,\n} from 'payload'\n\nimport type { LinkFields } from '../nodes/types.js'\n\nimport { validateUrl, validateUrlMinimal } from '../../../lexical/utils/url.js'\n\nexport const getBaseFields = (\n config: SanitizedConfig,\n enabledCollections?: CollectionSlug[],\n disabledCollections?: CollectionSlug[],\n maxDepth?: number,\n): FieldAffectingData[] => {\n let enabledRelations: CollectionSlug[]\n\n /**\n * Figure out which relations should be enabled (enabledRelations) based on a collection's admin.enableRichTextLink property,\n * or the Link Feature's enabledCollections and disabledCollections properties which override it.\n */\n if (enabledCollections) {\n enabledRelations = enabledCollections\n } else if (disabledCollections) {\n enabledRelations = config.collections\n .filter(({ slug }) => !disabledCollections.includes(slug))\n .map(({ slug }) => slug)\n } else {\n enabledRelations = config.collections\n .filter(({ admin: { enableRichTextLink, hidden } }) => {\n if (typeof hidden !== 'function' && hidden) {\n return false\n }\n return enableRichTextLink\n })\n .map(({ slug }) => slug)\n }\n\n const baseFields: FieldAffectingData[] = [\n {\n name: 'text',\n type: 'text',\n label: ({ t }) => t('fields:textToDisplay'),\n required: true,\n },\n {\n name: 'linkType',\n type: 'radio',\n admin: {\n description: ({ t }) => t('fields:chooseBetweenCustomTextOrDocument'),\n },\n defaultValue: 'custom',\n label: ({ t }) => t('fields:linkType'),\n options: [\n {\n label: ({ t }) => t('fields:customURL'),\n value: 'custom',\n },\n ],\n required: true,\n } as RadioField,\n {\n name: 'url',\n type: 'text',\n hooks: {\n beforeChange: [\n ({ value }) => {\n if (!value) {\n return\n }\n\n if (!validateUrl(value)) {\n return encodeURIComponent(value)\n }\n return value\n },\n ],\n },\n label: ({ t }) => t('fields:enterURL'),\n required: true,\n validate: ((value: string, options) => {\n if ((options?.siblingData as LinkFields)?.linkType === 'internal') {\n return // no validation needed, as no url should exist for internal links\n }\n if (!validateUrlMinimal(value)) {\n return 'Invalid URL'\n }\n }) as TextFieldSingleValidation,\n },\n ]\n\n // Only display internal link-specific fields / options / conditions if there are enabled relations\n if (enabledRelations?.length) {\n ;(baseFields[1] as RadioField).options.push({\n label: ({ t }) => t('fields:internalLink'),\n value: 'internal',\n })\n ;(baseFields[2] as TextField).admin = {\n condition: (_data, _siblingData) => {\n return _siblingData.linkType !== 'internal'\n },\n }\n\n baseFields.push({\n name: 'doc',\n admin: {\n condition: (_data, _siblingData) => {\n return _siblingData.linkType === 'internal'\n },\n },\n // when admin.hidden is a function we need to dynamically call hidden with the user to know if the collection should be shown\n type: 'relationship',\n filterOptions:\n !enabledCollections && !disabledCollections\n ? ({ relationTo, user }) => {\n const hidden = config.collections.find(({ slug }) => slug === relationTo)?.admin\n .hidden\n if (typeof hidden === 'function' && hidden({ user } as { user: User })) {\n return false\n }\n return true\n }\n : null,\n label: ({ t }) => t('fields:chooseDocumentToLink'),\n maxDepth,\n relationTo: enabledRelations,\n required: true,\n })\n }\n\n baseFields.push({\n name: 'newTab',\n type: 'checkbox',\n label: ({ t }) => t('fields:openInNewTab'),\n })\n\n return baseFields\n}\n"],"mappings":"AAYA,SAASA,WAAW,EAAEC,kBAAkB,QAAQ;AAEhD,OAAO,MAAMC,aAAA,GAAgBA,CAC3BC,MAAA,EACAC,kBAAA,EACAC,mBAAA,EACAC,QAAA;EAEA,IAAIC,gBAAA;EAEJ;;;;EAIA,IAAIH,kBAAA,EAAoB;IACtBG,gBAAA,GAAmBH,kBAAA;EACrB,OAAO,IAAIC,mBAAA,EAAqB;IAC9BE,gBAAA,GAAmBJ,MAAA,CAAOK,WAAW,CAClCC,MAAM,CAAC,CAAC;MAAEC;IAAI,CAAE,KAAK,CAACL,mBAAA,CAAoBM,QAAQ,CAACD,IAAA,GACnDE,GAAG,CAAC,CAAC;MAAEF;IAAI,CAAE,KAAKA,IAAA;EACvB,OAAO;IACLH,gBAAA,GAAmBJ,MAAA,CAAOK,WAAW,CAClCC,MAAM,CAAC,CAAC;MAAEI,KAAA,EAAO;QAAEC,kBAAkB;QAAEC;MAAM;IAAE,CAAE;MAChD,IAAI,OAAOA,MAAA,KAAW,cAAcA,MAAA,EAAQ;QAC1C,OAAO;MACT;MACA,OAAOD,kBAAA;IACT,GACCF,GAAG,CAAC,CAAC;MAAEF;IAAI,CAAE,KAAKA,IAAA;EACvB;EAEA,MAAMM,UAAA,GAAmC,CACvC;IACEC,IAAA,EAAM;IACNC,IAAA,EAAM;IACNC,KAAA,EAAOA,CAAC;MAAEC;IAAC,CAAE,KAAKA,CAAA,CAAE;IACpBC,QAAA,EAAU;EACZ,GACA;IACEJ,IAAA,EAAM;IACNC,IAAA,EAAM;IACNL,KAAA,EAAO;MACLS,WAAA,EAAaA,CAAC;QAAEF;MAAC,CAAE,KAAKA,CAAA,CAAE;IAC5B;IACAG,YAAA,EAAc;IACdJ,KAAA,EAAOA,CAAC;MAAEC;IAAC,CAAE,KAAKA,CAAA,CAAE;IACpBI,OAAA,EAAS,CACP;MACEL,KAAA,EAAOA,CAAC;QAAEC;MAAC,CAAE,KAAKA,CAAA,CAAE;MACpBK,KAAA,EAAO;IACT,EACD;IACDJ,QAAA,EAAU;EACZ,GACA;IACEJ,IAAA,EAAM;IACNC,IAAA,EAAM;IACNQ,KAAA,EAAO;MACLC,YAAA,EAAc,CACZ,CAAC;QAAEF;MAAK,CAAE;QACR,IAAI,CAACA,KAAA,EAAO;UACV;QACF;QAEA,IAAI,CAACzB,WAAA,CAAYyB,KAAA,GAAQ;UACvB,OAAOG,kBAAA,CAAmBH,KAAA;QAC5B;QACA,OAAOA,KAAA;MACT;IAEJ;IACAN,KAAA,EAAOA,CAAC;MAAEC;IAAC,CAAE,KAAKA,CAAA,CAAE;IACpBC,QAAA,EAAU;IACVQ,QAAA,EAAWA,CAACJ,KAAA,EAAeD,OAAA;MACzB,IAAIA,OAAC,EAASM,WAAA,EAA4BC,QAAA,KAAa,YAAY;QACjE,QAAO;MACT;MACA,IAAI,CAAC9B,kBAAA,CAAmBwB,KAAA,GAAQ;QAC9B,OAAO;MACT;IACF;EACF,EACD;EAED;EACA,IAAIlB,gBAAA,EAAkByB,MAAA,EAAQ;IAC1BhB,UAAU,CAAC,EAAE,CAAgBQ,OAAO,CAACS,IAAI,CAAC;MAC1Cd,KAAA,EAAOA,CAAC;QAAEC;MAAC,CAAE,KAAKA,CAAA,CAAE;MACpBK,KAAA,EAAO;IACT;IACET,UAAU,CAAC,EAAE,CAAeH,KAAK,GAAG;MACpCqB,SAAA,EAAWA,CAACC,KAAA,EAAOC,YAAA;QACjB,OAAOA,YAAA,CAAaL,QAAQ,KAAK;MACnC;IACF;IAEAf,UAAA,CAAWiB,IAAI,CAAC;MACdhB,IAAA,EAAM;MACNJ,KAAA,EAAO;QACLqB,SAAA,EAAWA,CAACC,KAAA,EAAOC,YAAA;UACjB,OAAOA,YAAA,CAAaL,QAAQ,KAAK;QACnC;MACF;MACA;MACAb,IAAA,EAAM;MACNmB,aAAA,EACE,CAACjC,kBAAA,IAAsB,CAACC,mBAAA,GACpB,CAAC;QAAEiC,UAAU;QAAEC;MAAI,CAAE;QACnB,MAAMxB,MAAA,GAASZ,MAAA,CAAOK,WAAW,CAACgC,IAAI,CAAC,CAAC;UAAE9B;QAAI,CAAE,KAAKA,IAAA,KAAS4B,UAAA,GAAazB,KAAA,CACxEE,MAAA;QACH,IAAI,OAAOA,MAAA,KAAW,cAAcA,MAAA,CAAO;UAAEwB;QAAK,IAAsB;UACtE,OAAO;QACT;QACA,OAAO;MACT,IACA;MACNpB,KAAA,EAAOA,CAAC;QAAEC;MAAC,CAAE,KAAKA,CAAA,CAAE;MACpBd,QAAA;MACAgC,UAAA,EAAY/B,gBAAA;MACZc,QAAA,EAAU;IACZ;EACF;EAEAL,UAAA,CAAWiB,IAAI,CAAC;IACdhB,IAAA,EAAM;IACNC,IAAA,EAAM;IACNC,KAAA,EAAOA,CAAC;MAAEC;IAAC,CAAE,KAAKA,CAAA,CAAE;EACtB;EAEA,OAAOJ,UAAA;AACT","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useScrollInfo","useThrottledEffect","useTranslation","React","useMemo","useEditorConfigContext","ToolbarButton","ToolbarDropdown","ButtonGroupItem","anchorElem","editor","item","Component","_jsx","key","ChildComponent","ToolbarGroupComponent","t0","$","editorConfig","group","index","i18n","fieldProps","t1","featureClientSchemaMap","schemaPath","dropdownLabel","setDropdownLabel","useState","undefined","DropdownIcon","setDropdownIcon","t2","items","type","length","t3","useEffect","t4","t5","activeItems","label","substring","t","count","onActiveChange","t6","features","toolbarFixed","groups","_jsxs","className","children","Icon","itemsContainerClassNames","maxActiveItems","map","item_0","FixedToolbar","clientProps","parentWithFixedToolbar","currentToolbarRef","useRef","y","parentToolbarElem","disableIfParentHasFixedToolbar","parentEditorElem","editorContainerRef","current","sibling","previousElementSibling","classList","contains","currentToolbarElem","currentRect","getBoundingClientRect","parentRect","overlapping","bottom","top","remove","add","onFocus","event","stopPropagation","ref","isEditable","Fragment","i","getParentEditorWithFixedToolbar","editorConfigContext","parentEditor","resolvedFeatureMap","has","FixedToolbarPlugin","currentEditor","currentEditorConfig","applyToFocusedEditor","focusedEditor","Symbol","for","bb0","document","body"],"sources":["../../../../../../src/features/toolbars/fixed/client/Toolbar/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useScrollInfo, useThrottledEffect, useTranslation } from '@payloadcms/ui'\nimport * as React from 'react'\nimport { useMemo } from 'react'\n\nimport type { EditorConfigContextType } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport type { SanitizedClientEditorConfig } from '../../../../../lexical/config/types.js'\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../../types.js'\nimport type { FixedToolbarFeatureProps } from '../../server/index.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { ToolbarButton } from '../../../shared/ToolbarButton/index.js'\nimport { ToolbarDropdown } from '../../../shared/ToolbarDropdown/index.js'\nimport './index.scss'\n\nfunction ButtonGroupItem({\n anchorElem,\n editor,\n item,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n item: ToolbarGroupItem\n}): React.ReactNode {\n if (item.Component) {\n return (\n item?.Component && (\n <item.Component anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n )\n }\n\n if (!item.ChildComponent) {\n return null\n }\n\n return (\n <ToolbarButton editor={editor} item={item} key={item.key}>\n <item.ChildComponent />\n </ToolbarButton>\n )\n}\n\nfunction ToolbarGroupComponent({\n anchorElem,\n editor,\n editorConfig,\n group,\n index,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n editorConfig: SanitizedClientEditorConfig\n group: ToolbarGroup\n index: number\n}): React.ReactNode {\n const { i18n } = useTranslation<{}, string>()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n const [dropdownLabel, setDropdownLabel] = React.useState<string | undefined>(undefined)\n const [DropdownIcon, setDropdownIcon] = React.useState<React.FC | undefined>(undefined)\n\n React.useEffect(() => {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n } else {\n setDropdownIcon(undefined)\n }\n }, [group])\n\n const onActiveChange = React.useCallback(\n ({ activeItems }: { activeItems: ToolbarGroupItem[] }) => {\n if (!activeItems.length) {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n setDropdownLabel(undefined)\n } else {\n setDropdownIcon(undefined)\n setDropdownLabel(undefined)\n }\n return\n }\n const item = activeItems[0]\n\n let label = item.key\n if (item.label) {\n label =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Crop title to max. 25 characters\n if (label.length > 25) {\n label = label.substring(0, 25) + '...'\n }\n if (activeItems.length === 1) {\n setDropdownLabel(label)\n setDropdownIcon(() => item.ChildComponent)\n } else {\n setDropdownLabel(\n i18n.t('lexical:general:toolbarItemsActive', { count: activeItems.length }),\n )\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n } else {\n setDropdownIcon(undefined)\n }\n }\n },\n [group, i18n, featureClientSchemaMap, schemaPath],\n )\n\n return (\n <div className={`fixed-toolbar__group fixed-toolbar__group-${group.key}`} key={group.key}>\n {group.type === 'dropdown' && group.items.length ? (\n DropdownIcon ? (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n Icon={DropdownIcon}\n itemsContainerClassNames={['fixed-toolbar__dropdown-items']}\n label={dropdownLabel}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n ) : (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n itemsContainerClassNames={['fixed-toolbar__dropdown-items']}\n label={dropdownLabel}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n )\n ) : null}\n {group.type === 'buttons' && group.items.length\n ? group.items.map((item) => {\n return (\n <ButtonGroupItem anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n })\n : null}\n {index < editorConfig.features.toolbarFixed?.groups.length - 1 && <div className=\"divider\" />}\n </div>\n )\n}\n\nfunction FixedToolbar({\n anchorElem,\n clientProps,\n editor,\n editorConfig,\n parentWithFixedToolbar,\n}: {\n anchorElem: HTMLElement\n clientProps?: FixedToolbarFeatureProps\n editor: LexicalEditor\n editorConfig: SanitizedClientEditorConfig\n parentWithFixedToolbar: EditorConfigContextType | false\n}): React.ReactNode {\n const currentToolbarRef = React.useRef<HTMLDivElement>(null)\n\n const { y } = useScrollInfo()\n\n // Memoize the parent toolbar element\n const parentToolbarElem = useMemo(() => {\n if (!parentWithFixedToolbar || clientProps?.disableIfParentHasFixedToolbar) {\n return null\n }\n\n const parentEditorElem = parentWithFixedToolbar.editorContainerRef.current\n let sibling = parentEditorElem.previousElementSibling\n while (sibling) {\n if (sibling.classList.contains('fixed-toolbar')) {\n return sibling\n }\n sibling = sibling.previousElementSibling\n }\n return null\n }, [clientProps?.disableIfParentHasFixedToolbar, parentWithFixedToolbar])\n\n useThrottledEffect(\n () => {\n if (!parentToolbarElem) {\n // this also checks for clientProps?.disableIfParentHasFixedToolbar indirectly, see the parentToolbarElem useMemo\n return\n }\n const currentToolbarElem = currentToolbarRef.current\n if (!currentToolbarElem) {\n return\n }\n\n const currentRect = currentToolbarElem.getBoundingClientRect()\n const parentRect = parentToolbarElem.getBoundingClientRect()\n\n // we only need to check for vertical overlap\n const overlapping = !(\n currentRect.bottom < parentRect.top || currentRect.top > parentRect.bottom\n )\n\n if (overlapping) {\n currentToolbarElem.classList.remove('fixed-toolbar')\n currentToolbarElem.classList.add('fixed-toolbar', 'fixed-toolbar--overlapping')\n parentToolbarElem.classList.remove('fixed-toolbar')\n parentToolbarElem.classList.add('fixed-toolbar', 'fixed-toolbar--hide')\n } else {\n if (!currentToolbarElem.classList.contains('fixed-toolbar--overlapping')) {\n return\n }\n currentToolbarElem.classList.remove('fixed-toolbar--overlapping')\n currentToolbarElem.classList.add('fixed-toolbar')\n parentToolbarElem.classList.remove('fixed-toolbar--hide')\n parentToolbarElem.classList.add('fixed-toolbar')\n }\n },\n 50,\n [currentToolbarRef, parentToolbarElem, y],\n )\n\n return (\n <div\n className=\"fixed-toolbar\"\n onFocus={(event) => {\n // Prevent other focus events being triggered. Otherwise, if this was to be clicked while in a child editor,\n // the parent editor will be focused, and the child editor will lose focus.\n event.stopPropagation()\n }}\n ref={currentToolbarRef}\n >\n {editor.isEditable() && (\n <React.Fragment>\n {editorConfig?.features &&\n editorConfig.features?.toolbarFixed?.groups.map((group, i) => {\n return (\n <ToolbarGroupComponent\n anchorElem={anchorElem}\n editor={editor}\n editorConfig={editorConfig}\n group={group}\n index={i}\n key={group.key}\n />\n )\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n\nconst getParentEditorWithFixedToolbar = (\n editorConfigContext: EditorConfigContextType,\n): EditorConfigContextType | false => {\n if (editorConfigContext.parentEditor?.editorConfig) {\n if (editorConfigContext.parentEditor?.editorConfig.resolvedFeatureMap.has('toolbarFixed')) {\n return editorConfigContext.parentEditor\n } else {\n if (editorConfigContext.parentEditor) {\n return getParentEditorWithFixedToolbar(editorConfigContext.parentEditor)\n }\n }\n }\n return false\n}\n\nexport const FixedToolbarPlugin: PluginComponent<FixedToolbarFeatureProps> = ({ clientProps }) => {\n const [currentEditor] = useLexicalComposerContext()\n const editorConfigContext = useEditorConfigContext()\n\n const { editorConfig: currentEditorConfig } = editorConfigContext\n\n const editor = clientProps.applyToFocusedEditor\n ? editorConfigContext.focusedEditor?.editor || currentEditor\n : currentEditor\n\n const editorConfig = clientProps.applyToFocusedEditor\n ? editorConfigContext.focusedEditor?.editorConfig || currentEditorConfig\n : currentEditorConfig\n\n const parentWithFixedToolbar = getParentEditorWithFixedToolbar(editorConfigContext)\n\n if (clientProps?.disableIfParentHasFixedToolbar) {\n if (parentWithFixedToolbar) {\n return null\n }\n }\n\n if (!editorConfig?.features?.toolbarFixed?.groups?.length) {\n return null\n }\n\n return (\n <FixedToolbar\n anchorElem={document.body}\n editor={editor}\n editorConfig={editorConfig}\n parentWithFixedToolbar={parentWithFixedToolbar}\n />\n )\n}\n"],"mappings":"AAAA;;AAAA,SAAAA,CAAA,IAAAC,EAAA;;AAGA,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,aAAa,EAAEC,kBAAkB,EAAEC,cAAc,QAAQ;AAClE,YAAYC,KAAA,MAAW;AACvB,SAASC,OAAO,QAAQ;AAQxB,SAASC,sBAAsB,QAAQ;AACvC,SAASC,aAAa,QAAQ;AAC9B,SAASC,eAAe,QAAQ;AAGhC,SAASC,gBAAgB;EACvBC,UAAU;EACVC,MAAM;EACNC;AAAI,CAKL;EACC,IAAIA,IAAA,CAAKC,SAAS,EAAE;IAClB,OACED,IAAA,EAAMC,SAAA,iBACJC,IAAA,CAACF,IAAA,CAAKC,SAAS;MAACH,UAAA,EAAYA,UAAA;MAAYC,MAAA,EAAQA,MAAA;MAAQC,IAAA,EAAMA;OAAWA,IAAA,CAAKG,GAAG;EAGvF;EAEA,IAAI,CAACH,IAAA,CAAKI,cAAc,EAAE;IACxB,OAAO;EACT;EAEA,oBACEF,IAAA,CAACP,aAAA;IAAcI,MAAA,EAAQA,MAAA;IAAQC,IAAA,EAAMA,IAAA;cACnC,aAAAE,IAAA,CAACF,IAAA,CAAKI,cAAc;KAD0BJ,IAAA,CAAKG,GAAG;AAI5D;AAEA,SAAAE,sBAAAC,EAAA;EAAA,MAAAC,CAAA,GAAApB,EAAA;EAA+B;IAAAW,UAAA;IAAAC,MAAA;IAAAS,YAAA;IAAAC,KAAA;IAAAC;EAAA,IAAAJ,EAY9B;EACC;IAAAK;EAAA,IAAiBpB,cAAA;EACjB;IAAAqB,UAAA,EAAAC;EAAA,IAEInB,sBAAA;EADU;IAAAoB,sBAAA;IAAAC;EAAA,IAAAF,EAAsC;EAEpD,OAAAG,aAAA,EAAAC,gBAAA,IAA0CzB,KAAA,CAAA0B,QAAA,CAAAC,SAAmC;EAC7E,OAAAC,YAAA,EAAAC,eAAA,IAAwC7B,KAAA,CAAA0B,QAAA,CAAAC,SAAqC;EAAA,IAAAG,EAAA;EAAA,IAAAf,CAAA,QAAAE,KAAA,CAAAL,cAAA,IAAAG,CAAA,QAAAE,KAAA,CAAAc,KAAA,IAAAhB,CAAA,QAAAE,KAAA,CAAAe,IAAA;IAE7DF,EAAA,GAAAA,CAAA;MAAA,IACVb,KAAA,EAAAe,IAAA,KAAgB,cAAcf,KAAA,CAAAc,KAAA,CAAAE,MAAkB,IAAIhB,KAAA,CAAAL,cAAoB;QAC1EiB,eAAA,OAAsBZ,KAAA,CAAAL,cAAoB;MAAA;QAE1CiB,eAAA,CAAAF,SAAgB;MAAA;IAAA;IAEpBZ,CAAA,MAAAE,KAAA,CAAAL,cAAA;IAAAG,CAAA,MAAAE,KAAA,CAAAc,KAAA;IAAAhB,CAAA,MAAAE,KAAA,CAAAe,IAAA;IAAAjB,CAAA,MAAAe,EAAA;EAAA;IAAAA,EAAA,GAAAf,CAAA;EAAA;EAAA,IAAAmB,EAAA;EAAA,IAAAnB,CAAA,QAAAE,KAAA;IAAGiB,EAAA,IAACjB,KAAA;IAAMF,CAAA,MAAAE,KAAA;IAAAF,CAAA,MAAAmB,EAAA;EAAA;IAAAA,EAAA,GAAAnB,CAAA;EAAA;EANVf,KAAA,CAAAmC,SAAA,CAAgBL,EAMhB,EAAGI,EAAO;EAAA,IAAAE,EAAA;EAAA,IAAArB,CAAA,QAAAO,sBAAA,IAAAP,CAAA,QAAAE,KAAA,CAAAL,cAAA,IAAAG,CAAA,QAAAE,KAAA,CAAAc,KAAA,IAAAhB,CAAA,QAAAE,KAAA,CAAAe,IAAA,IAAAjB,CAAA,SAAAI,IAAA,IAAAJ,CAAA,SAAAQ,UAAA;IAGRa,EAAA,GAAAC,EAAA;MAAC;QAAAC;MAAA,IAAAD,EAAoD;MAAA,KAC9CC,WAAA,CAAAL,MAAA;QAAA,IACChB,KAAA,EAAAe,IAAA,KAAgB,cAAcf,KAAA,CAAAc,KAAA,CAAAE,MAAkB,IAAIhB,KAAA,CAAAL,cAAoB;UAC1EiB,eAAA,OAAsBZ,KAAA,CAAAL,cAAoB;UAC1Ca,gBAAA,CAAAE,SAAiB;QAAA;UAEjBE,eAAA,CAAAF,SAAgB;UAChBF,gBAAA,CAAAE,SAAiB;QAAA;QAAA;MAAA;MAIrB,MAAAnB,IAAA,GAAa8B,WAAW;MAExB,IAAAC,KAAA,GAAY/B,IAAA,CAAAG,GAAA;MAAQ,IAChBH,IAAA,CAAA+B,KAAA;QACFA,KAAA,CAAAA,CAAA,CACEA,MAAA,CAAO/B,IAAA,CAAA+B,KAAA,KAAe,aAClB/B,IAAA,CAAA+B,KAAA;UAAAjB,sBAAA;UAAAH,IAAA;UAAAI;QAAA,CAAsD,IACtDf,IAAA,CAAA+B,KAAU;MAHhB;MAAA,IAMEA,KAAA,CAAAN,MAAA,KAAe;QACjBM,KAAA,CAAAA,CAAA,CAAQA,KAAA,CAAAC,SAAA,MAAmB,IAAM;MAAjC;MAAA,IAEEF,WAAA,CAAAL,MAAA,MAAuB;QACzBR,gBAAA,CAAiBc,KAAA;QACjBV,eAAA,OAAsBrB,IAAA,CAAAI,cAAmB;MAAA;QAEzCa,gBAAA,CACEN,IAAA,CAAAsB,CAAA,CAAO;UAAAC,KAAA,EAA+CJ,WAAA,CAAAL;QAAA,CAAmB;QAAA,IAEvEhB,KAAA,EAAAe,IAAA,KAAgB,cAAcf,KAAA,CAAAc,KAAA,CAAAE,MAAkB,IAAIhB,KAAA,CAAAL,cAAoB;UAC1EiB,eAAA,OAAsBZ,KAAA,CAAAL,cAAoB;QAAA;UAE1CiB,eAAA,CAAAF,SAAgB;QAAA;MAAA;IAAA;IAGtBZ,CAAA,MAAAO,sBAAA;IAAAP,CAAA,MAAAE,KAAA,CAAAL,cAAA;IAAAG,CAAA,MAAAE,KAAA,CAAAc,KAAA;IAAAhB,CAAA,MAAAE,KAAA,CAAAe,IAAA;IAAAjB,CAAA,OAAAI,IAAA;IAAAJ,CAAA,OAAAQ,UAAA;IAAAR,CAAA,OAAAqB,EAAA;EAAA;IAAAA,EAAA,GAAArB,CAAA;EAAA;EAtCF,MAAA4B,cAAA,GAAuBP,EAuC4B;EAIjC,MAAAC,EAAA,gDAA6CpB,KAAA,CAAAN,GAAA,EAAW;EAAA,IAAAiC,EAAA;EAAA,IAAA7B,CAAA,SAAAa,YAAA,IAAAb,CAAA,SAAAT,UAAA,IAAAS,CAAA,SAAAS,aAAA,IAAAT,CAAA,SAAAR,MAAA,IAAAQ,CAAA,SAAAC,YAAA,CAAA6B,QAAA,CAAAC,YAAA,EAAAC,MAAA,CAAAd,MAAA,IAAAlB,CAAA,SAAAE,KAAA,IAAAF,CAAA,SAAAG,KAAA,IAAAH,CAAA,SAAA4B,cAAA,IAAA5B,CAAA,SAAAsB,EAAA;IAAxEO,EAAA,GAAAI,KAAA,CAAC;MAAAC,SAAA,EAAeZ,EAAwD;MAAAa,QAAA,GACrEjC,KAAA,CAAAe,IAAA,KAAe,cAAcf,KAAA,CAAAc,KAAA,CAAAE,MAAkB,GAC9CL,YAAA,GACElB,IAAA,CAAAN,eAAA;QAAAE,UAAA;QAAAC,MAAA;QAAAU,KAAA;QAAAkC,IAAA,EAIQvB,YAAA;QAAAwB,wBAAA,GACqB;QAAAb,KAAA,EACpBf,aAAA;QAAA6B,cAAA,EACSpC,KAAA,CAAAoC,cAAA,KAAwB;QAAAV;MAAA,C,IAI1CjC,IAAA,CAAAN,eAAA;QAAAE,UAAA;QAAAC,MAAA;QAAAU,KAAA;QAAAmC,wBAAA,GAI6B;QAAAb,KAAA,EACpBf,aAAA;QAAA6B,cAAA,EACSpC,KAAA,CAAAoC,cAAA,KAAwB;QAAAV;MAAA,C,QAI1C,EACH1B,KAAA,CAAAe,IAAA,KAAe,aAAaf,KAAA,CAAAc,KAAA,CAAAE,MAAkB,GAC3ChB,KAAA,CAAAc,KAAA,CAAAuB,GAAA,CAAAC,MAAA,IAEI7C,IAAA,CAAAL,eAAA;QAAAC,UAAA;QAAAC,MAAA;QAAAC,IAAA,EAA+DA;MAAA,GAAWA,MAAA,CAAAG,GAAQ,CAEtF,QACA,EACHO,KAAA,GAAQF,YAAA,CAAA6B,QAAA,CAAAC,YAAA,EAAAC,MAAA,CAAAd,MAAA,IAAoD,IAAKvB,IAAA,CAAC;QAAAuC,SAAA,EAAc;MAAA,C;OAhCJhC,KAAA,CAAAN,GAAS;IAAAI,CAAA,OAAAa,YAAA;IAAAb,CAAA,OAAAT,UAAA;IAAAS,CAAA,OAAAS,aAAA;IAAAT,CAAA,OAAAR,MAAA;IAAAQ,CAAA,OAAAC,YAAA,CAAA6B,QAAA,CAAAC,YAAA,EAAAC,MAAA,CAAAd,MAAA;IAAAlB,CAAA,OAAAE,KAAA;IAAAF,CAAA,OAAAG,KAAA;IAAAH,CAAA,OAAA4B,cAAA;IAAA5B,CAAA,OAAAsB,EAAA;IAAAtB,CAAA,OAAA6B,EAAA;EAAA;IAAAA,EAAA,GAAA7B,CAAA;EAAA;EAAA,OAAxF6B,EAAwF;AAAA;AAqC5F,SAASY,aAAa;EACpBlD,UAAU;EACVmD,WAAW;EACXlD,MAAM;EACNS,YAAY;EACZ0C;AAAsB,CAOvB;EACC,MAAMC,iBAAA,GAAoB3D,KAAA,CAAM4D,MAAM,CAAiB;EAEvD,MAAM;IAAEC;EAAC,CAAE,GAAGhE,aAAA;EAEd;EACA,MAAMiE,iBAAA,GAAoB7D,OAAA,CAAQ;IAChC,IAAI,CAACyD,sBAAA,IAA0BD,WAAA,EAAaM,8BAAA,EAAgC;MAC1E,OAAO;IACT;IAEA,MAAMC,gBAAA,GAAmBN,sBAAA,CAAuBO,kBAAkB,CAACC,OAAO;IAC1E,IAAIC,OAAA,GAAUH,gBAAA,CAAiBI,sBAAsB;IACrD,OAAOD,OAAA,EAAS;MACd,IAAIA,OAAA,CAAQE,SAAS,CAACC,QAAQ,CAAC,kBAAkB;QAC/C,OAAOH,OAAA;MACT;MACAA,OAAA,GAAUA,OAAA,CAAQC,sBAAsB;IAC1C;IACA,OAAO;EACT,GAAG,CAACX,WAAA,EAAaM,8BAAA,EAAgCL,sBAAA,CAAuB;EAExE5D,kBAAA,CACE;IACE,IAAI,CAACgE,iBAAA,EAAmB;MACtB;MACA;IACF;IACA,MAAMS,kBAAA,GAAqBZ,iBAAA,CAAkBO,OAAO;IACpD,IAAI,CAACK,kBAAA,EAAoB;MACvB;IACF;IAEA,MAAMC,WAAA,GAAcD,kBAAA,CAAmBE,qBAAqB;IAC5D,MAAMC,UAAA,GAAaZ,iBAAA,CAAkBW,qBAAqB;IAE1D;IACA,MAAME,WAAA,GAAc,EAClBH,WAAA,CAAYI,MAAM,GAAGF,UAAA,CAAWG,GAAG,IAAIL,WAAA,CAAYK,GAAG,GAAGH,UAAA,CAAWE,MAAM,CAAD;IAG3E,IAAID,WAAA,EAAa;MACfJ,kBAAA,CAAmBF,SAAS,CAACS,MAAM,CAAC;MACpCP,kBAAA,CAAmBF,SAAS,CAACU,GAAG,CAAC,iBAAiB;MAClDjB,iBAAA,CAAkBO,SAAS,CAACS,MAAM,CAAC;MACnChB,iBAAA,CAAkBO,SAAS,CAACU,GAAG,CAAC,iBAAiB;IACnD,OAAO;MACL,IAAI,CAACR,kBAAA,CAAmBF,SAAS,CAACC,QAAQ,CAAC,+BAA+B;QACxE;MACF;MACAC,kBAAA,CAAmBF,SAAS,CAACS,MAAM,CAAC;MACpCP,kBAAA,CAAmBF,SAAS,CAACU,GAAG,CAAC;MACjCjB,iBAAA,CAAkBO,SAAS,CAACS,MAAM,CAAC;MACnChB,iBAAA,CAAkBO,SAAS,CAACU,GAAG,CAAC;IAClC;EACF,GACA,IACA,CAACpB,iBAAA,EAAmBG,iBAAA,EAAmBD,CAAA,CAAE;EAG3C,oBACEnD,IAAA,CAAC;IACCuC,SAAA,EAAU;IACV+B,OAAA,EAAUC,KAAA;MACR;MACA;MACAA,KAAA,CAAMC,eAAe;IACvB;IACAC,GAAA,EAAKxB,iBAAA;cAEJpD,MAAA,CAAO6E,UAAU,mBAChB1E,IAAA,CAACV,KAAA,CAAMqF,QAAQ;gBACZrE,YAAA,EAAc6B,QAAA,IACb7B,YAAA,CAAa6B,QAAQ,EAAEC,YAAA,EAAcC,MAAA,CAAOO,GAAA,CAAI,CAACrC,KAAA,EAAOqE,CAAA;QACtD,oBACE5E,IAAA,CAACG,qBAAA;UACCP,UAAA,EAAYA,UAAA;UACZC,MAAA,EAAQA,MAAA;UACRS,YAAA,EAAcA,YAAA;UACdC,KAAA,EAAOA,KAAA;UACPC,KAAA,EAAOoE;WACFrE,KAAA,CAAMN,GAAG;MAGpB;;;AAKZ;AAEA,MAAM4E,+BAAA,GACJC,mBAAA;EAEA,IAAIA,mBAAA,CAAoBC,YAAY,EAAEzE,YAAA,EAAc;IAClD,IAAIwE,mBAAA,CAAoBC,YAAY,EAAEzE,YAAA,CAAa0E,kBAAA,CAAmBC,GAAA,CAAI,iBAAiB;MACzF,OAAOH,mBAAA,CAAoBC,YAAY;IACzC,OAAO;MACL,IAAID,mBAAA,CAAoBC,YAAY,EAAE;QACpC,OAAOF,+BAAA,CAAgCC,mBAAA,CAAoBC,YAAY;MACzE;IACF;EACF;EACA,OAAO;AACT;AAEA,OAAO,MAAMG,kBAAA,GAAgE9E,EAAA;EAAA,MAAAC,CAAA,GAAApB,EAAA;EAAC;IAAA8D;EAAA,IAAA3C,EAAe;EAC3F,OAAA+E,aAAA,IAAwBjG,yBAAA;EACxB,MAAA4F,mBAAA,GAA4BtF,sBAAA;EAE5B;IAAAc,YAAA,EAAA8E;EAAA,IAA8CN,mBAAA;EAE9C,MAAAjF,MAAA,GAAekD,WAAA,CAAAsC,oBAAA,GACXP,mBAAA,CAAAQ,aAAA,EAAAzF,MAAA,IAA6CsF,aAAA,GAC7CA,aAAA;EAEJ,MAAA7E,YAAA,GAAqByC,WAAA,CAAAsC,oBAAA,GACjBP,mBAAA,CAAAQ,aAAA,EAAAhF,YAAA,IAAmD8E,mBAAA,GACnDA,mBAAA;EAAA,IAAAzE,EAAA;EAAA,IAAAS,EAAA;EAAA,IAAAf,CAAA,QAAA0C,WAAA,CAAAM,8BAAA,IAAAhD,CAAA,QAAAR,MAAA,IAAAQ,CAAA,QAAAC,YAAA,IAAAD,CAAA,QAAAyE,mBAAA;IAMO1D,EAAA,GAAAmE,MAAA,CAAAC,GAAA;IAAAC,GAAA;MAJX,MAAAzC,sBAAA,GAA+B6B,+BAAA,CAAgCC,mBAAA;MAAA,IAE3D/B,WAAA,EAAAM,8BAAA;QAAA,IACEL,sBAAA;UACK5B,EAAA;UAAA,MAAAqE,GAAA;QAAA;MAAA;MAAA,KAINnF,YAAA,EAAA6B,QAAA,EAAAC,YAAA,EAAAC,MAAA,EAAAd,MAAA;QACIH,EAAA;QAAA,MAAAqE,GAAA;MAAA;MAIP9E,EAAA,GAAAX,IAAA,CAAA8C,YAAA;QAAAlD,UAAA,EAAA8F,QAAA,CAAAC,IAAA;QAAA9F,MAAA;QAAAS,YAAA;QAAA0C;MAAA,C;;;;;;;;;;;;;;;SAAArC,E;CAOJ","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","useScrollInfo","useThrottledEffect","useTranslation","React","useMemo","useEditorConfigContext","ToolbarButton","ToolbarDropdown","ButtonGroupItem","anchorElem","editor","item","Component","_jsx","key","ChildComponent","ToolbarGroupComponent","t0","$","editorConfig","group","index","i18n","fieldProps","t1","featureClientSchemaMap","schemaPath","dropdownLabel","setDropdownLabel","useState","undefined","DropdownIcon","setDropdownIcon","t2","items","type","length","t3","useEffect","t4","t5","activeItems","label","substring","t","count","onActiveChange","t6","features","toolbarFixed","groups","_jsxs","className","children","Icon","itemsContainerClassNames","maxActiveItems","map","item_0","FixedToolbar","clientProps","parentWithFixedToolbar","currentToolbarRef","useRef","y","parentToolbarElem","disableIfParentHasFixedToolbar","parentEditorElem","editorContainerRef","current","sibling","previousElementSibling","classList","contains","currentToolbarElem","currentRect","getBoundingClientRect","parentRect","overlapping","bottom","top","remove","add","onFocus","event","stopPropagation","ref","isEditable","Fragment","i","getParentEditorWithFixedToolbar","editorConfigContext","parentEditor","resolvedFeatureMap","has","FixedToolbarPlugin","currentEditor","currentEditorConfig","applyToFocusedEditor","focusedEditor","Symbol","for","bb0","document","body"],"sources":["../../../../../../src/features/toolbars/fixed/client/Toolbar/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalEditor } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { useScrollInfo, useThrottledEffect, useTranslation } from '@payloadcms/ui'\nimport * as React from 'react'\nimport { useMemo } from 'react'\n\nimport type { EditorConfigContextType } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport type { SanitizedClientEditorConfig } from '../../../../../lexical/config/types.js'\nimport type { PluginComponent } from '../../../../typesClient.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../../types.js'\nimport type { FixedToolbarFeatureProps } from '../../server/index.js'\n\nimport { useEditorConfigContext } from '../../../../../lexical/config/client/EditorConfigProvider.js'\nimport { ToolbarButton } from '../../../shared/ToolbarButton/index.js'\nimport { ToolbarDropdown } from '../../../shared/ToolbarDropdown/index.js'\nimport './index.scss'\n\nfunction ButtonGroupItem({\n anchorElem,\n editor,\n item,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n item: ToolbarGroupItem\n}): React.ReactNode {\n if (item.Component) {\n return (\n item?.Component && (\n <item.Component anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n )\n }\n\n if (!item.ChildComponent) {\n return null\n }\n\n return (\n <ToolbarButton editor={editor} item={item} key={item.key}>\n <item.ChildComponent />\n </ToolbarButton>\n )\n}\n\nfunction ToolbarGroupComponent({\n anchorElem,\n editor,\n editorConfig,\n group,\n index,\n}: {\n anchorElem: HTMLElement\n editor: LexicalEditor\n editorConfig: SanitizedClientEditorConfig\n group: ToolbarGroup\n index: number\n}): React.ReactNode {\n const { i18n } = useTranslation<{}, string>()\n const {\n fieldProps: { featureClientSchemaMap, schemaPath },\n } = useEditorConfigContext()\n const [dropdownLabel, setDropdownLabel] = React.useState<string | undefined>(undefined)\n const [DropdownIcon, setDropdownIcon] = React.useState<React.FC | undefined>(undefined)\n\n React.useEffect(() => {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n } else {\n setDropdownIcon(undefined)\n }\n }, [group])\n\n const onActiveChange = React.useCallback(\n ({ activeItems }: { activeItems: ToolbarGroupItem[] }) => {\n if (!activeItems.length) {\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n setDropdownLabel(undefined)\n } else {\n setDropdownIcon(undefined)\n setDropdownLabel(undefined)\n }\n return\n }\n const item = activeItems[0]!\n\n let label = item.key\n if (item.label) {\n label =\n typeof item.label === 'function'\n ? item.label({ featureClientSchemaMap, i18n, schemaPath })\n : item.label\n }\n // Crop title to max. 25 characters\n if (label.length > 25) {\n label = label.substring(0, 25) + '...'\n }\n if (activeItems.length === 1) {\n setDropdownLabel(label)\n setDropdownIcon(() => item.ChildComponent)\n } else {\n setDropdownLabel(\n i18n.t('lexical:general:toolbarItemsActive', { count: activeItems.length }),\n )\n if (group?.type === 'dropdown' && group.items.length && group.ChildComponent) {\n setDropdownIcon(() => group.ChildComponent!)\n } else {\n setDropdownIcon(undefined)\n }\n }\n },\n [group, i18n, featureClientSchemaMap, schemaPath],\n )\n\n return (\n <div className={`fixed-toolbar__group fixed-toolbar__group-${group.key}`} key={group.key}>\n {group.type === 'dropdown' && group.items.length ? (\n DropdownIcon ? (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n Icon={DropdownIcon}\n itemsContainerClassNames={['fixed-toolbar__dropdown-items']}\n label={dropdownLabel}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n ) : (\n <ToolbarDropdown\n anchorElem={anchorElem}\n editor={editor}\n group={group}\n itemsContainerClassNames={['fixed-toolbar__dropdown-items']}\n label={dropdownLabel}\n maxActiveItems={group.maxActiveItems ?? 1}\n onActiveChange={onActiveChange}\n />\n )\n ) : null}\n {group.type === 'buttons' && group.items.length\n ? group.items.map((item) => {\n return (\n <ButtonGroupItem anchorElem={anchorElem} editor={editor} item={item} key={item.key} />\n )\n })\n : null}\n {index < editorConfig.features.toolbarFixed?.groups.length - 1 && <div className=\"divider\" />}\n </div>\n )\n}\n\nfunction FixedToolbar({\n anchorElem,\n clientProps,\n editor,\n editorConfig,\n parentWithFixedToolbar,\n}: {\n anchorElem: HTMLElement\n clientProps?: FixedToolbarFeatureProps\n editor: LexicalEditor\n editorConfig: SanitizedClientEditorConfig\n parentWithFixedToolbar: EditorConfigContextType | false\n}): React.ReactNode {\n const currentToolbarRef = React.useRef<HTMLDivElement>(null)\n\n const { y } = useScrollInfo()\n\n // Memoize the parent toolbar element\n const parentToolbarElem = useMemo(() => {\n if (!parentWithFixedToolbar || clientProps?.disableIfParentHasFixedToolbar) {\n return null\n }\n\n const parentEditorElem = parentWithFixedToolbar.editorContainerRef.current\n let sibling = parentEditorElem.previousElementSibling\n while (sibling) {\n if (sibling.classList.contains('fixed-toolbar')) {\n return sibling\n }\n sibling = sibling.previousElementSibling\n }\n return null\n }, [clientProps?.disableIfParentHasFixedToolbar, parentWithFixedToolbar])\n\n useThrottledEffect(\n () => {\n if (!parentToolbarElem) {\n // this also checks for clientProps?.disableIfParentHasFixedToolbar indirectly, see the parentToolbarElem useMemo\n return\n }\n const currentToolbarElem = currentToolbarRef.current\n if (!currentToolbarElem) {\n return\n }\n\n const currentRect = currentToolbarElem.getBoundingClientRect()\n const parentRect = parentToolbarElem.getBoundingClientRect()\n\n // we only need to check for vertical overlap\n const overlapping = !(\n currentRect.bottom < parentRect.top || currentRect.top > parentRect.bottom\n )\n\n if (overlapping) {\n currentToolbarElem.classList.remove('fixed-toolbar')\n currentToolbarElem.classList.add('fixed-toolbar', 'fixed-toolbar--overlapping')\n parentToolbarElem.classList.remove('fixed-toolbar')\n parentToolbarElem.classList.add('fixed-toolbar', 'fixed-toolbar--hide')\n } else {\n if (!currentToolbarElem.classList.contains('fixed-toolbar--overlapping')) {\n return\n }\n currentToolbarElem.classList.remove('fixed-toolbar--overlapping')\n currentToolbarElem.classList.add('fixed-toolbar')\n parentToolbarElem.classList.remove('fixed-toolbar--hide')\n parentToolbarElem.classList.add('fixed-toolbar')\n }\n },\n 50,\n [currentToolbarRef, parentToolbarElem, y],\n )\n\n return (\n <div\n className=\"fixed-toolbar\"\n onFocus={(event) => {\n // Prevent other focus events being triggered. Otherwise, if this was to be clicked while in a child editor,\n // the parent editor will be focused, and the child editor will lose focus.\n event.stopPropagation()\n }}\n ref={currentToolbarRef}\n >\n {editor.isEditable() && (\n <React.Fragment>\n {editorConfig?.features &&\n editorConfig.features?.toolbarFixed?.groups.map((group, i) => {\n return (\n <ToolbarGroupComponent\n anchorElem={anchorElem}\n editor={editor}\n editorConfig={editorConfig}\n group={group}\n index={i}\n key={group.key}\n />\n )\n })}\n </React.Fragment>\n )}\n </div>\n )\n}\n\nconst getParentEditorWithFixedToolbar = (\n editorConfigContext: EditorConfigContextType,\n): EditorConfigContextType | false => {\n if (editorConfigContext.parentEditor?.editorConfig) {\n if (editorConfigContext.parentEditor?.editorConfig.resolvedFeatureMap.has('toolbarFixed')) {\n return editorConfigContext.parentEditor\n } else {\n if (editorConfigContext.parentEditor) {\n return getParentEditorWithFixedToolbar(editorConfigContext.parentEditor)\n }\n }\n }\n return false\n}\n\nexport const FixedToolbarPlugin: PluginComponent<FixedToolbarFeatureProps> = ({ clientProps }) => {\n const [currentEditor] = useLexicalComposerContext()\n const editorConfigContext = useEditorConfigContext()\n\n const { editorConfig: currentEditorConfig } = editorConfigContext\n\n const editor = clientProps.applyToFocusedEditor\n ? editorConfigContext.focusedEditor?.editor || currentEditor\n : currentEditor\n\n const editorConfig = clientProps.applyToFocusedEditor\n ? editorConfigContext.focusedEditor?.editorConfig || currentEditorConfig\n : currentEditorConfig\n\n const parentWithFixedToolbar = getParentEditorWithFixedToolbar(editorConfigContext)\n\n if (clientProps?.disableIfParentHasFixedToolbar) {\n if (parentWithFixedToolbar) {\n return null\n }\n }\n\n if (!editorConfig?.features?.toolbarFixed?.groups?.length) {\n return null\n }\n\n return (\n <FixedToolbar\n anchorElem={document.body}\n editor={editor}\n editorConfig={editorConfig}\n parentWithFixedToolbar={parentWithFixedToolbar}\n />\n )\n}\n"],"mappings":"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","ignoreList":[]}
|