@sparrowengg/twigs-editor-react 0.0.2 → 0.0.4
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/cjs/components/dialog-link-editor/index.js +4 -3
- package/dist/cjs/components/dialog-link-editor/index.js.map +1 -1
- package/dist/cjs/editor.js +3 -2
- package/dist/cjs/editor.js.map +1 -1
- package/dist/es/components/dialog-link-editor/index.js +5 -4
- package/dist/es/components/dialog-link-editor/index.js.map +1 -1
- package/dist/es/editor.js +3 -2
- package/dist/es/editor.js.map +1 -1
- package/dist/index.d.ts +9 -4
- package/package.json +1 -1
@@ -80,6 +80,7 @@ function useDialogLinkEditorToolbar(editor, anchorElem, options) {
|
|
80
80
|
);
|
81
81
|
}, [editor]);
|
82
82
|
const updateLinkEditor = react.useCallback(() => {
|
83
|
+
var _a2;
|
83
84
|
const selection = lexical.$getSelection();
|
84
85
|
if (lexical.$isRangeSelection(selection)) {
|
85
86
|
const node = getSelectedNode.getSelectedNode(selection);
|
@@ -95,13 +96,13 @@ function useDialogLinkEditorToolbar(editor, anchorElem, options) {
|
|
95
96
|
setLinkUrl("");
|
96
97
|
}
|
97
98
|
}
|
98
|
-
const nativeSelection =
|
99
|
+
const nativeSelection = lexical.getDOMSelection((_a2 = editor._window) != null ? _a2 : window);
|
99
100
|
const { activeElement } = document;
|
100
101
|
const rootElement = editor.getRootElement();
|
101
102
|
if (selection !== null && nativeSelection !== null && rootElement !== null && rootElement.contains(nativeSelection.anchorNode) && editor.isEditable()) {
|
102
103
|
setTimeout(() => {
|
103
|
-
var
|
104
|
-
const domRect = (_b2 = (
|
104
|
+
var _a3, _b2;
|
105
|
+
const domRect = (_b2 = (_a3 = nativeSelection.focusNode) == null ? void 0 : _a3.parentElement) == null ? void 0 : _b2.getBoundingClientRect();
|
105
106
|
if (domRect && anchorElem && containerRef.current) {
|
106
107
|
setFloatingElemPositionForLinkEditor.setFloatingElemPositionForLinkEditor(
|
107
108
|
domRect,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/dialog-link-editor/index.tsx"],"sourcesContent":["import {\n $isAutoLinkNode,\n $isLinkNode,\n TOGGLE_LINK_COMMAND\n} from '@lexical/link';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils';\nimport { ADD_BLANK_LINK } from '@src/utils/commands';\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n BaseSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n LexicalEditor,\n NodeSelection,\n RangeSelection,\n SELECTION_CHANGE_COMMAND\n} from 'lexical';\nimport {\n useCallback, useEffect, useRef, useState\n} from 'react';\nimport isURL from 'validator/es/lib/isURL';\nimport { getSelectedNode } from '@src/utils/get-selected-node';\nimport { setFloatingElemPositionForLinkEditor } from '@src/utils/set-floating-elem-position-for-link-editor';\nimport { LinkEditorDialog } from './link-editor-dialog';\nimport { LinkTooltip } from './link-tooltip';\n\nfunction useDialogLinkEditorToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement | null,\n options?: DialogLinkEditorOptions\n) {\n const [linkUrl, setLinkUrl] = useState('');\n const [linkText, setLinkText] = useState('');\n const [isLink, setIsLink] = useState(false);\n const [lastSelection, setLastSelection] = useState<\n RangeSelection | NodeSelection | BaseSelection | null\n >(null);\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\n const [isUpdate, setIsUpdate] = useState(false);\n const [errors, setErrors] = useState({\n text: false,\n url: false\n });\n\n const isNewLink = useRef(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const containerElem = containerRef.current;\n\n useEffect(() => {\n function updateToolbar() {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n if (linkParent !== null && autoLinkParent === null) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkNode = $findMatchingParent(node, $isLinkNode);\n if ($isLinkNode(linkNode)) {\n const url = linkNode.getURL();\n setLinkUrl(url);\n setLinkText(linkNode.getTextContent());\n }\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), '_blank');\n return true;\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor]);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkText(parent.getTextContent().trim());\n setLinkUrl(parent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkText(node.getTextContent().trim());\n setLinkUrl(node.getURL());\n } else {\n setLinkText('');\n setLinkUrl('');\n }\n }\n\n const nativeSelection = window.getSelection();\n const { activeElement } = document;\n\n const rootElement = editor.getRootElement();\n\n if (\n selection !== null\n && nativeSelection !== null\n && rootElement !== null\n && rootElement.contains(nativeSelection.anchorNode)\n && editor.isEditable()\n ) {\n setTimeout(() => {\n const domRect: DOMRect | undefined = nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\n if (domRect && anchorElem && containerRef.current) {\n setFloatingElemPositionForLinkEditor(\n domRect,\n containerRef.current,\n anchorElem,\n 10\n );\n }\n }, 10);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== 'link-input') {\n setTimeout(() => {\n if (rootElement !== null && anchorElem && containerElem) {\n setFloatingElemPositionForLinkEditor(null, containerElem, anchorElem);\n }\n }, 10);\n setLastSelection(null);\n setLinkUrl('');\n }\n\n // eslint-disable-next-line consistent-return\n return true;\n }, [anchorElem, editor, setIsLinkEditMode]);\n\n useEffect(() => {\n if (!isLinkEditMode) {\n isNewLink.current = false;\n }\n }, [isLinkEditMode]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n ADD_BLANK_LINK,\n () => {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: string | { url: string } | null) => {\n if (typeof payload === 'string' || payload?.url) {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n } else {\n setIsLinkEditMode(false);\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n )\n );\n }, [editor, updateLinkEditor, setIsLink, isLink]);\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n const handleLinkSubmission = ({\n text,\n url\n }: {\n text: string;\n url: string;\n }) => {\n if (lastSelection !== null) {\n const isValidUrl = isURL(url);\n const isValidText = text.trim().length > 0;\n\n if (isValidUrl && isValidText) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n url,\n rel: options?.anchorOptions?.rel,\n target: options?.anchorOptions?.target,\n title: options?.anchorOptions?.title\n });\n editor.update(() => {\n if ($isRangeSelection(lastSelection)) {\n const textNode = getSelectedNode(lastSelection);\n if ($isTextNode(textNode)) {\n textNode.setTextContent(text);\n }\n }\n });\n setErrors({\n text: false,\n url: false\n });\n setTimeout(() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n }, 50);\n } else {\n setErrors({\n text: !isValidText,\n url: !isValidUrl\n });\n }\n }\n };\n\n if (!anchorElem) return null;\n\n return (\n <>\n {isLink && !isLinkEditMode && (\n <LinkTooltip\n anchorElem={anchorElem}\n containerRef={containerRef}\n handleDelete={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n handleEdit={() => {\n setIsLinkEditMode(true);\n setIsUpdate(true);\n }}\n linkUrl={linkUrl}\n https={options?.anchorOptions?.https || false}\n />\n )}\n {isLinkEditMode && (\n <LinkEditorDialog\n handleLinkSubmission={handleLinkSubmission}\n linkText={linkText}\n linkUrl={linkUrl}\n open={isLink && isLinkEditMode}\n closeModal={() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n if (isNewLink.current) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n isUpdate={isUpdate}\n setIsLinkEditMode={setIsLinkEditMode}\n textLabel={options?.dialogProps?.textLabel || 'Link text'}\n urlLabel={options?.dialogProps?.urlLabel || 'Link URL'}\n removeLink={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n errors={errors}\n saveLabel={options?.dialogProps?.saveLabel || 'Save'}\n cancelLabel={options?.dialogProps?.cancelLabel || 'Cancel'}\n updateLabel={options?.dialogProps?.updateLabel || 'Update'}\n title={options?.dialogProps?.title || 'Add Link'}\n errorLabels={options?.dialogProps?.errorLabels}\n />\n )}\n </>\n );\n}\n\nexport type DialogLinkEditorOptions = {\n dialogProps?: {\n textLabel?: string;\n urlLabel?: string;\n saveLabel?: string;\n cancelLabel?: string;\n updateLabel?: string;\n title?: string;\n errorLabels?: {\n text?: string;\n url?: string;\n };\n };\n anchorOptions?: {\n rel?: string;\n target?: string;\n title?: string;\n https?: boolean;\n };\n};\n\nexport function DialogLinkEditor({\n anchorElem = document.body,\n options\n}: {\n anchorElem?: HTMLElement | null;\n options?: DialogLinkEditorOptions;\n}) {\n const [editor] = useLexicalComposerContext();\n return useDialogLinkEditorToolbar(editor, anchorElem, options);\n}\n"],"names":["useState","useRef","useEffect","$getSelection","$isRangeSelection","getSelectedNode","$findMatchingParent","$isLinkNode","$isAutoLinkNode","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_CRITICAL","CLICK_COMMAND","COMMAND_PRIORITY_LOW","useCallback","_a","_b","setFloatingElemPositionForLinkEditor","ADD_BLANK_LINK","COMMAND_PRIORITY_HIGH","TOGGLE_LINK_COMMAND","KEY_ESCAPE_COMMAND","_c","isURL","$isTextNode","jsxs","Fragment","jsx","LinkTooltip","LinkEditorDialog","useLexicalComposerContext"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/dialog-link-editor/index.tsx"],"sourcesContent":["import {\n $isAutoLinkNode,\n $isLinkNode,\n TOGGLE_LINK_COMMAND\n} from '@lexical/link';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils';\nimport { ADD_BLANK_LINK } from '@src/utils/commands';\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n BaseSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n LexicalEditor,\n NodeSelection,\n RangeSelection,\n SELECTION_CHANGE_COMMAND,\n getDOMSelection\n} from 'lexical';\nimport {\n useCallback, useEffect, useRef, useState\n} from 'react';\nimport isURL from 'validator/es/lib/isURL';\nimport { getSelectedNode } from '@src/utils/get-selected-node';\nimport { setFloatingElemPositionForLinkEditor } from '@src/utils/set-floating-elem-position-for-link-editor';\nimport { LinkEditorDialog } from './link-editor-dialog';\nimport { LinkTooltip } from './link-tooltip';\n\nfunction useDialogLinkEditorToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement | null,\n options?: DialogLinkEditorOptions\n) {\n const [linkUrl, setLinkUrl] = useState('');\n const [linkText, setLinkText] = useState('');\n const [isLink, setIsLink] = useState(false);\n const [lastSelection, setLastSelection] = useState<\n RangeSelection | NodeSelection | BaseSelection | null\n >(null);\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\n const [isUpdate, setIsUpdate] = useState(false);\n const [errors, setErrors] = useState({\n text: false,\n url: false\n });\n\n const isNewLink = useRef(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const containerElem = containerRef.current;\n\n useEffect(() => {\n function updateToolbar() {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n if (linkParent !== null && autoLinkParent === null) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkNode = $findMatchingParent(node, $isLinkNode);\n if ($isLinkNode(linkNode)) {\n const url = linkNode.getURL();\n setLinkUrl(url);\n setLinkText(linkNode.getTextContent());\n }\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), '_blank');\n return true;\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor]);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkText(parent.getTextContent().trim());\n setLinkUrl(parent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkText(node.getTextContent().trim());\n setLinkUrl(node.getURL());\n } else {\n setLinkText('');\n setLinkUrl('');\n }\n }\n\n const nativeSelection = getDOMSelection(editor._window ?? window);\n const { activeElement } = document;\n\n const rootElement = editor.getRootElement();\n\n if (\n selection !== null\n && nativeSelection !== null\n && rootElement !== null\n && rootElement.contains(nativeSelection.anchorNode)\n && editor.isEditable()\n ) {\n setTimeout(() => {\n const domRect: DOMRect | undefined = nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\n if (domRect && anchorElem && containerRef.current) {\n setFloatingElemPositionForLinkEditor(\n domRect,\n containerRef.current,\n anchorElem,\n 10\n );\n }\n }, 10);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== 'link-input') {\n setTimeout(() => {\n if (rootElement !== null && anchorElem && containerElem) {\n setFloatingElemPositionForLinkEditor(null, containerElem, anchorElem);\n }\n }, 10);\n setLastSelection(null);\n setLinkUrl('');\n }\n\n // eslint-disable-next-line consistent-return\n return true;\n }, [anchorElem, editor, setIsLinkEditMode]);\n\n useEffect(() => {\n if (!isLinkEditMode) {\n isNewLink.current = false;\n }\n }, [isLinkEditMode]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n ADD_BLANK_LINK,\n () => {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: string | { url: string } | null) => {\n if (typeof payload === 'string' || payload?.url) {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n } else {\n setIsLinkEditMode(false);\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n )\n );\n }, [editor, updateLinkEditor, setIsLink, isLink]);\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n const handleLinkSubmission = ({\n text,\n url\n }: {\n text: string;\n url: string;\n }) => {\n if (lastSelection !== null) {\n const isValidUrl = isURL(url);\n const isValidText = text.trim().length > 0;\n\n if (isValidUrl && isValidText) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n url,\n rel: options?.anchorOptions?.rel,\n target: options?.anchorOptions?.target,\n title: options?.anchorOptions?.title\n });\n editor.update(() => {\n if ($isRangeSelection(lastSelection)) {\n const textNode = getSelectedNode(lastSelection);\n if ($isTextNode(textNode)) {\n textNode.setTextContent(text);\n }\n }\n });\n setErrors({\n text: false,\n url: false\n });\n setTimeout(() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n }, 50);\n } else {\n setErrors({\n text: !isValidText,\n url: !isValidUrl\n });\n }\n }\n };\n\n if (!anchorElem) return null;\n\n return (\n <>\n {isLink && !isLinkEditMode && (\n <LinkTooltip\n anchorElem={anchorElem}\n containerRef={containerRef}\n handleDelete={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n handleEdit={() => {\n setIsLinkEditMode(true);\n setIsUpdate(true);\n }}\n linkUrl={linkUrl}\n https={options?.anchorOptions?.https || false}\n />\n )}\n {isLinkEditMode && (\n <LinkEditorDialog\n handleLinkSubmission={handleLinkSubmission}\n linkText={linkText}\n linkUrl={linkUrl}\n open={isLink && isLinkEditMode}\n closeModal={() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n if (isNewLink.current) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n isUpdate={isUpdate}\n setIsLinkEditMode={setIsLinkEditMode}\n textLabel={options?.dialogProps?.textLabel || 'Link text'}\n urlLabel={options?.dialogProps?.urlLabel || 'Link URL'}\n removeLink={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n errors={errors}\n saveLabel={options?.dialogProps?.saveLabel || 'Save'}\n cancelLabel={options?.dialogProps?.cancelLabel || 'Cancel'}\n updateLabel={options?.dialogProps?.updateLabel || 'Update'}\n title={options?.dialogProps?.title || 'Add Link'}\n errorLabels={options?.dialogProps?.errorLabels}\n />\n )}\n </>\n );\n}\n\nexport type DialogLinkEditorOptions = {\n dialogProps?: {\n textLabel?: string;\n urlLabel?: string;\n saveLabel?: string;\n cancelLabel?: string;\n updateLabel?: string;\n title?: string;\n errorLabels?: {\n text?: string;\n url?: string;\n };\n };\n anchorOptions?: {\n rel?: string;\n target?: string;\n title?: string;\n https?: boolean;\n };\n};\n\nexport function DialogLinkEditor({\n anchorElem = document.body,\n options\n}: {\n anchorElem?: HTMLElement | null;\n options?: DialogLinkEditorOptions;\n}) {\n const [editor] = useLexicalComposerContext();\n return useDialogLinkEditorToolbar(editor, anchorElem, options);\n}\n"],"names":["useState","useRef","useEffect","$getSelection","$isRangeSelection","getSelectedNode","$findMatchingParent","$isLinkNode","$isAutoLinkNode","mergeRegister","SELECTION_CHANGE_COMMAND","COMMAND_PRIORITY_CRITICAL","CLICK_COMMAND","COMMAND_PRIORITY_LOW","useCallback","_a","getDOMSelection","_b","setFloatingElemPositionForLinkEditor","ADD_BLANK_LINK","COMMAND_PRIORITY_HIGH","TOGGLE_LINK_COMMAND","KEY_ESCAPE_COMMAND","_c","isURL","$isTextNode","jsxs","Fragment","jsx","LinkTooltip","LinkEditorDialog","useLexicalComposerContext"],"mappings":"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"}
|
package/dist/cjs/editor.js
CHANGED
@@ -111,7 +111,8 @@ const Editor = ({
|
|
111
111
|
features,
|
112
112
|
children,
|
113
113
|
initialEditorState,
|
114
|
-
dataManagementRef
|
114
|
+
dataManagementRef,
|
115
|
+
onChangePluginProps
|
115
116
|
}) => {
|
116
117
|
const supportedFeatures = react.useMemo(() => {
|
117
118
|
if (features) {
|
@@ -138,7 +139,7 @@ const Editor = ({
|
|
138
139
|
/* @__PURE__ */ jsxRuntime.jsx(LexicalClearEditorPlugin.ClearEditorPlugin, {}),
|
139
140
|
/* @__PURE__ */ jsxRuntime.jsx(index.DataManagementPlugin, { ref: dataManagementRef }),
|
140
141
|
/* @__PURE__ */ jsxRuntime.jsx(index$1.TabFocusPlugin, {}),
|
141
|
-
/* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: onChange && /* @__PURE__ */ jsxRuntime.jsx(LexicalOnChangePlugin.OnChangePlugin, { onChange }) }),
|
142
|
+
/* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: onChange && /* @__PURE__ */ jsxRuntime.jsx(LexicalOnChangePlugin.OnChangePlugin, __spreadValues({ onChange }, onChangePluginProps)) }),
|
142
143
|
/* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: supportedFeatures.components.map((comp) => {
|
143
144
|
const ToolComponent = comp.component;
|
144
145
|
if (ToolComponent) {
|
package/dist/cjs/editor.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"editor.js","sources":["../../src/editor.tsx"],"sourcesContent":["import { AutoLinkNode, LinkNode } from '@lexical/link';\nimport { ListItemNode, ListNode } from '@lexical/list';\nimport { ClearEditorPlugin } from '@lexical/react/LexicalClearEditorPlugin';\nimport {\n InitialConfigType,\n InitialEditorStateType,\n LexicalComposer\n} from '@lexical/react/LexicalComposer';\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin';\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';\nimport { HeadingNode } from '@lexical/rich-text';\n\nimport { CodeNode } from '@lexical/code';\nimport { EditorState, LexicalEditor } from 'lexical';\nimport {\n Fragment, ReactNode, RefObject, useMemo\n} from 'react';\nimport {\n AutoLinkPlugin,\n DataManagementPlugin,\n DataManagementPluginHandle,\n LinkPlugin,\n TabFocusPlugin\n} from './plugins';\n\nimport { ToolbarContextPlugin } from './components';\n\nconst initialConfig: InitialConfigType = {\n namespace: 'TwigsEditor',\n theme: {\n text: {\n bold: 'text-bold',\n italic: 'text-italic',\n underline: 'text-underline',\n code: 'text-code',\n base: 'text-base',\n highlight: 'text-highlight',\n strikethrough: 'text-strikethrough',\n subscript: 'text-subscript',\n superscript: 'text-superscript',\n underlineStrikethrough: 'text-underline-strikethrough'\n },\n code: 'block-code',\n quote: 'block-quote',\n heading: {\n h1: 'block-h1',\n h2: 'block-h2',\n h3: 'block-h3',\n h4: 'block-h4',\n h5: 'block-h5',\n h6: 'block-h6'\n },\n list: {\n ol: 'block-ol',\n ul: 'block-ul',\n listitem: 'block-listitem'\n }\n },\n onError: (err) => {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n};\n\nlet featureId = 0;\n\nconst featuresToNodeMapping = {\n heading: {\n node: HeadingNode,\n component: null\n },\n list: {\n node: [ListNode, ListItemNode],\n component: ListPlugin\n },\n link: {\n node: [LinkNode, AutoLinkNode],\n component: [AutoLinkPlugin, LinkPlugin]\n },\n code: {\n node: [CodeNode],\n component: null\n }\n};\n\nexport
|
1
|
+
{"version":3,"file":"editor.js","sources":["../../src/editor.tsx"],"sourcesContent":["import { AutoLinkNode, LinkNode } from '@lexical/link';\nimport { ListItemNode, ListNode } from '@lexical/list';\nimport { ClearEditorPlugin } from '@lexical/react/LexicalClearEditorPlugin';\nimport {\n InitialConfigType,\n InitialEditorStateType,\n LexicalComposer\n} from '@lexical/react/LexicalComposer';\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin';\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';\nimport { HeadingNode } from '@lexical/rich-text';\n\nimport { CodeNode } from '@lexical/code';\nimport { EditorState, LexicalEditor } from 'lexical';\nimport {\n Fragment, ReactNode, RefObject, useMemo\n} from 'react';\nimport {\n AutoLinkPlugin,\n DataManagementPlugin,\n DataManagementPluginHandle,\n LinkPlugin,\n TabFocusPlugin\n} from './plugins';\n\nimport { ToolbarContextPlugin } from './components';\n\nconst initialConfig: InitialConfigType = {\n namespace: 'TwigsEditor',\n theme: {\n text: {\n bold: 'text-bold',\n italic: 'text-italic',\n underline: 'text-underline',\n code: 'text-code',\n base: 'text-base',\n highlight: 'text-highlight',\n strikethrough: 'text-strikethrough',\n subscript: 'text-subscript',\n superscript: 'text-superscript',\n underlineStrikethrough: 'text-underline-strikethrough'\n },\n code: 'block-code',\n quote: 'block-quote',\n heading: {\n h1: 'block-h1',\n h2: 'block-h2',\n h3: 'block-h3',\n h4: 'block-h4',\n h5: 'block-h5',\n h6: 'block-h6'\n },\n list: {\n ol: 'block-ol',\n ul: 'block-ul',\n listitem: 'block-listitem'\n }\n },\n onError: (err) => {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n};\n\nlet featureId = 0;\n\nconst featuresToNodeMapping = {\n heading: {\n node: HeadingNode,\n component: null\n },\n list: {\n node: [ListNode, ListItemNode],\n component: ListPlugin\n },\n link: {\n node: [LinkNode, AutoLinkNode],\n component: [AutoLinkPlugin, LinkPlugin]\n },\n code: {\n node: [CodeNode],\n component: null\n }\n};\n\nexport interface EditorProps {\n initialEditorState?: InitialEditorStateType;\n onChange?: (\n newEditorState: EditorState,\n editor: LexicalEditor,\n tags: Set<string>\n ) => void;\n editable?: boolean;\n children?: ReactNode;\n nodes?: InitialConfigType['nodes'];\n features?: (keyof typeof featuresToNodeMapping)[];\n dataManagementRef?: RefObject<DataManagementPluginHandle>;\n onChangePluginProps?: {\n ignoreHistoryMergeTagChange?: boolean;\n ignoreSelectionChange?: boolean;\n };\n}\n\nexport const Editor = ({\n nodes,\n onChange,\n editable,\n features,\n children,\n initialEditorState,\n dataManagementRef,\n onChangePluginProps\n}: EditorProps) => {\n const supportedFeatures = useMemo(() => {\n if (features) {\n const selectedNodes = features\n .map((item) => featuresToNodeMapping[item].node)\n .flat();\n\n const selectedPlugins = features\n .map((item) => featuresToNodeMapping[item].component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }));\n\n return { nodes: selectedNodes, components: selectedPlugins };\n }\n\n const defaultFeatures = {\n nodes: Object.values(featuresToNodeMapping)\n .map((item) => item.node)\n .flat(),\n components: Object.values(featuresToNodeMapping)\n .map((item) => item.component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }))\n };\n\n return defaultFeatures;\n }, [features]);\n\n return (\n <LexicalComposer\n initialConfig={{\n ...initialConfig,\n editorState: initialEditorState,\n editable,\n nodes: [...supportedFeatures.nodes, ...(nodes ?? [])]\n }}\n >\n <ToolbarContextPlugin>\n <HistoryPlugin />\n <ClearEditorPlugin />\n <DataManagementPlugin ref={dataManagementRef} />\n <TabFocusPlugin />\n <>\n {onChange && (\n <OnChangePlugin onChange={onChange} {...onChangePluginProps} />\n )}\n </>\n <>\n {supportedFeatures.components.map((comp) => {\n const ToolComponent = comp.component;\n if (ToolComponent) {\n return <ToolComponent key={comp.id} />;\n }\n\n return <Fragment key={comp.id} />;\n })}\n </>\n <>{children}</>\n </ToolbarContextPlugin>\n </LexicalComposer>\n );\n};\n"],"names":["HeadingNode","ListNode","ListItemNode","ListPlugin","LinkNode","AutoLinkNode","AutoLinkPlugin","LinkPlugin","CodeNode","useMemo","jsx","LexicalComposer","ToolbarContextPlugin","HistoryPlugin","ClearEditorPlugin","DataManagementPlugin","TabFocusPlugin","OnChangePlugin","Fragment"],"mappings":"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"}
|
@@ -3,7 +3,7 @@ import { $isLinkNode, TOGGLE_LINK_COMMAND, $isAutoLinkNode } from '@lexical/link
|
|
3
3
|
import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
|
4
4
|
import { mergeRegister, $findMatchingParent } from '@lexical/utils';
|
5
5
|
import { ADD_BLANK_LINK } from '../../utils/commands.js';
|
6
|
-
import { SELECTION_CHANGE_COMMAND, COMMAND_PRIORITY_CRITICAL, CLICK_COMMAND, $getSelection, $isRangeSelection, COMMAND_PRIORITY_LOW, COMMAND_PRIORITY_HIGH, KEY_ESCAPE_COMMAND, $isTextNode } from 'lexical';
|
6
|
+
import { SELECTION_CHANGE_COMMAND, COMMAND_PRIORITY_CRITICAL, CLICK_COMMAND, $getSelection, $isRangeSelection, COMMAND_PRIORITY_LOW, getDOMSelection, COMMAND_PRIORITY_HIGH, KEY_ESCAPE_COMMAND, $isTextNode } from 'lexical';
|
7
7
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
8
8
|
import isURL from '../../node_modules/validator/es/lib/isURL.js';
|
9
9
|
import { getSelectedNode } from '../../utils/get-selected-node.js';
|
@@ -78,6 +78,7 @@ function useDialogLinkEditorToolbar(editor, anchorElem, options) {
|
|
78
78
|
);
|
79
79
|
}, [editor]);
|
80
80
|
const updateLinkEditor = useCallback(() => {
|
81
|
+
var _a2;
|
81
82
|
const selection = $getSelection();
|
82
83
|
if ($isRangeSelection(selection)) {
|
83
84
|
const node = getSelectedNode(selection);
|
@@ -93,13 +94,13 @@ function useDialogLinkEditorToolbar(editor, anchorElem, options) {
|
|
93
94
|
setLinkUrl("");
|
94
95
|
}
|
95
96
|
}
|
96
|
-
const nativeSelection =
|
97
|
+
const nativeSelection = getDOMSelection((_a2 = editor._window) != null ? _a2 : window);
|
97
98
|
const { activeElement } = document;
|
98
99
|
const rootElement = editor.getRootElement();
|
99
100
|
if (selection !== null && nativeSelection !== null && rootElement !== null && rootElement.contains(nativeSelection.anchorNode) && editor.isEditable()) {
|
100
101
|
setTimeout(() => {
|
101
|
-
var
|
102
|
-
const domRect = (_b2 = (
|
102
|
+
var _a3, _b2;
|
103
|
+
const domRect = (_b2 = (_a3 = nativeSelection.focusNode) == null ? void 0 : _a3.parentElement) == null ? void 0 : _b2.getBoundingClientRect();
|
103
104
|
if (domRect && anchorElem && containerRef.current) {
|
104
105
|
setFloatingElemPositionForLinkEditor(
|
105
106
|
domRect,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/dialog-link-editor/index.tsx"],"sourcesContent":["import {\n $isAutoLinkNode,\n $isLinkNode,\n TOGGLE_LINK_COMMAND\n} from '@lexical/link';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils';\nimport { ADD_BLANK_LINK } from '@src/utils/commands';\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n BaseSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n LexicalEditor,\n NodeSelection,\n RangeSelection,\n SELECTION_CHANGE_COMMAND\n} from 'lexical';\nimport {\n useCallback, useEffect, useRef, useState\n} from 'react';\nimport isURL from 'validator/es/lib/isURL';\nimport { getSelectedNode } from '@src/utils/get-selected-node';\nimport { setFloatingElemPositionForLinkEditor } from '@src/utils/set-floating-elem-position-for-link-editor';\nimport { LinkEditorDialog } from './link-editor-dialog';\nimport { LinkTooltip } from './link-tooltip';\n\nfunction useDialogLinkEditorToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement | null,\n options?: DialogLinkEditorOptions\n) {\n const [linkUrl, setLinkUrl] = useState('');\n const [linkText, setLinkText] = useState('');\n const [isLink, setIsLink] = useState(false);\n const [lastSelection, setLastSelection] = useState<\n RangeSelection | NodeSelection | BaseSelection | null\n >(null);\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\n const [isUpdate, setIsUpdate] = useState(false);\n const [errors, setErrors] = useState({\n text: false,\n url: false\n });\n\n const isNewLink = useRef(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const containerElem = containerRef.current;\n\n useEffect(() => {\n function updateToolbar() {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n if (linkParent !== null && autoLinkParent === null) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkNode = $findMatchingParent(node, $isLinkNode);\n if ($isLinkNode(linkNode)) {\n const url = linkNode.getURL();\n setLinkUrl(url);\n setLinkText(linkNode.getTextContent());\n }\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), '_blank');\n return true;\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor]);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkText(parent.getTextContent().trim());\n setLinkUrl(parent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkText(node.getTextContent().trim());\n setLinkUrl(node.getURL());\n } else {\n setLinkText('');\n setLinkUrl('');\n }\n }\n\n const nativeSelection = window.getSelection();\n const { activeElement } = document;\n\n const rootElement = editor.getRootElement();\n\n if (\n selection !== null\n && nativeSelection !== null\n && rootElement !== null\n && rootElement.contains(nativeSelection.anchorNode)\n && editor.isEditable()\n ) {\n setTimeout(() => {\n const domRect: DOMRect | undefined = nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\n if (domRect && anchorElem && containerRef.current) {\n setFloatingElemPositionForLinkEditor(\n domRect,\n containerRef.current,\n anchorElem,\n 10\n );\n }\n }, 10);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== 'link-input') {\n setTimeout(() => {\n if (rootElement !== null && anchorElem && containerElem) {\n setFloatingElemPositionForLinkEditor(null, containerElem, anchorElem);\n }\n }, 10);\n setLastSelection(null);\n setLinkUrl('');\n }\n\n // eslint-disable-next-line consistent-return\n return true;\n }, [anchorElem, editor, setIsLinkEditMode]);\n\n useEffect(() => {\n if (!isLinkEditMode) {\n isNewLink.current = false;\n }\n }, [isLinkEditMode]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n ADD_BLANK_LINK,\n () => {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: string | { url: string } | null) => {\n if (typeof payload === 'string' || payload?.url) {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n } else {\n setIsLinkEditMode(false);\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n )\n );\n }, [editor, updateLinkEditor, setIsLink, isLink]);\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n const handleLinkSubmission = ({\n text,\n url\n }: {\n text: string;\n url: string;\n }) => {\n if (lastSelection !== null) {\n const isValidUrl = isURL(url);\n const isValidText = text.trim().length > 0;\n\n if (isValidUrl && isValidText) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n url,\n rel: options?.anchorOptions?.rel,\n target: options?.anchorOptions?.target,\n title: options?.anchorOptions?.title\n });\n editor.update(() => {\n if ($isRangeSelection(lastSelection)) {\n const textNode = getSelectedNode(lastSelection);\n if ($isTextNode(textNode)) {\n textNode.setTextContent(text);\n }\n }\n });\n setErrors({\n text: false,\n url: false\n });\n setTimeout(() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n }, 50);\n } else {\n setErrors({\n text: !isValidText,\n url: !isValidUrl\n });\n }\n }\n };\n\n if (!anchorElem) return null;\n\n return (\n <>\n {isLink && !isLinkEditMode && (\n <LinkTooltip\n anchorElem={anchorElem}\n containerRef={containerRef}\n handleDelete={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n handleEdit={() => {\n setIsLinkEditMode(true);\n setIsUpdate(true);\n }}\n linkUrl={linkUrl}\n https={options?.anchorOptions?.https || false}\n />\n )}\n {isLinkEditMode && (\n <LinkEditorDialog\n handleLinkSubmission={handleLinkSubmission}\n linkText={linkText}\n linkUrl={linkUrl}\n open={isLink && isLinkEditMode}\n closeModal={() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n if (isNewLink.current) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n isUpdate={isUpdate}\n setIsLinkEditMode={setIsLinkEditMode}\n textLabel={options?.dialogProps?.textLabel || 'Link text'}\n urlLabel={options?.dialogProps?.urlLabel || 'Link URL'}\n removeLink={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n errors={errors}\n saveLabel={options?.dialogProps?.saveLabel || 'Save'}\n cancelLabel={options?.dialogProps?.cancelLabel || 'Cancel'}\n updateLabel={options?.dialogProps?.updateLabel || 'Update'}\n title={options?.dialogProps?.title || 'Add Link'}\n errorLabels={options?.dialogProps?.errorLabels}\n />\n )}\n </>\n );\n}\n\nexport type DialogLinkEditorOptions = {\n dialogProps?: {\n textLabel?: string;\n urlLabel?: string;\n saveLabel?: string;\n cancelLabel?: string;\n updateLabel?: string;\n title?: string;\n errorLabels?: {\n text?: string;\n url?: string;\n };\n };\n anchorOptions?: {\n rel?: string;\n target?: string;\n title?: string;\n https?: boolean;\n };\n};\n\nexport function DialogLinkEditor({\n anchorElem = document.body,\n options\n}: {\n anchorElem?: HTMLElement | null;\n options?: DialogLinkEditorOptions;\n}) {\n const [editor] = useLexicalComposerContext();\n return useDialogLinkEditorToolbar(editor, anchorElem, options);\n}\n"],"names":["_a","_b","_c"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/dialog-link-editor/index.tsx"],"sourcesContent":["import {\n $isAutoLinkNode,\n $isLinkNode,\n TOGGLE_LINK_COMMAND\n} from '@lexical/link';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $findMatchingParent, mergeRegister } from '@lexical/utils';\nimport { ADD_BLANK_LINK } from '@src/utils/commands';\nimport {\n $getSelection,\n $isRangeSelection,\n $isTextNode,\n BaseSelection,\n CLICK_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n COMMAND_PRIORITY_HIGH,\n COMMAND_PRIORITY_LOW,\n KEY_ESCAPE_COMMAND,\n LexicalEditor,\n NodeSelection,\n RangeSelection,\n SELECTION_CHANGE_COMMAND,\n getDOMSelection\n} from 'lexical';\nimport {\n useCallback, useEffect, useRef, useState\n} from 'react';\nimport isURL from 'validator/es/lib/isURL';\nimport { getSelectedNode } from '@src/utils/get-selected-node';\nimport { setFloatingElemPositionForLinkEditor } from '@src/utils/set-floating-elem-position-for-link-editor';\nimport { LinkEditorDialog } from './link-editor-dialog';\nimport { LinkTooltip } from './link-tooltip';\n\nfunction useDialogLinkEditorToolbar(\n editor: LexicalEditor,\n anchorElem: HTMLElement | null,\n options?: DialogLinkEditorOptions\n) {\n const [linkUrl, setLinkUrl] = useState('');\n const [linkText, setLinkText] = useState('');\n const [isLink, setIsLink] = useState(false);\n const [lastSelection, setLastSelection] = useState<\n RangeSelection | NodeSelection | BaseSelection | null\n >(null);\n const [isLinkEditMode, setIsLinkEditMode] = useState(false);\n const [isUpdate, setIsUpdate] = useState(false);\n const [errors, setErrors] = useState({\n text: false,\n url: false\n });\n\n const isNewLink = useRef(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const containerElem = containerRef.current;\n\n useEffect(() => {\n function updateToolbar() {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkParent = $findMatchingParent(node, $isLinkNode);\n const autoLinkParent = $findMatchingParent(node, $isAutoLinkNode);\n if (linkParent !== null && autoLinkParent === null) {\n setIsLink(true);\n } else {\n setIsLink(false);\n }\n }\n }\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateToolbar();\n });\n }),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL\n ),\n editor.registerCommand(\n CLICK_COMMAND,\n (payload) => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const linkNode = $findMatchingParent(node, $isLinkNode);\n if ($isLinkNode(linkNode)) {\n const url = linkNode.getURL();\n setLinkUrl(url);\n setLinkText(linkNode.getTextContent());\n }\n if ($isLinkNode(linkNode) && (payload.metaKey || payload.ctrlKey)) {\n window.open(linkNode.getURL(), '_blank');\n return true;\n }\n }\n return false;\n },\n COMMAND_PRIORITY_LOW\n )\n );\n }, [editor]);\n\n const updateLinkEditor = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const node = getSelectedNode(selection);\n const parent = node.getParent();\n if ($isLinkNode(parent)) {\n setLinkText(parent.getTextContent().trim());\n setLinkUrl(parent.getURL());\n } else if ($isLinkNode(node)) {\n setLinkText(node.getTextContent().trim());\n setLinkUrl(node.getURL());\n } else {\n setLinkText('');\n setLinkUrl('');\n }\n }\n\n const nativeSelection = getDOMSelection(editor._window ?? window);\n const { activeElement } = document;\n\n const rootElement = editor.getRootElement();\n\n if (\n selection !== null\n && nativeSelection !== null\n && rootElement !== null\n && rootElement.contains(nativeSelection.anchorNode)\n && editor.isEditable()\n ) {\n setTimeout(() => {\n const domRect: DOMRect | undefined = nativeSelection.focusNode?.parentElement?.getBoundingClientRect();\n if (domRect && anchorElem && containerRef.current) {\n setFloatingElemPositionForLinkEditor(\n domRect,\n containerRef.current,\n anchorElem,\n 10\n );\n }\n }, 10);\n setLastSelection(selection);\n } else if (!activeElement || activeElement.className !== 'link-input') {\n setTimeout(() => {\n if (rootElement !== null && anchorElem && containerElem) {\n setFloatingElemPositionForLinkEditor(null, containerElem, anchorElem);\n }\n }, 10);\n setLastSelection(null);\n setLinkUrl('');\n }\n\n // eslint-disable-next-line consistent-return\n return true;\n }, [anchorElem, editor, setIsLinkEditMode]);\n\n useEffect(() => {\n if (!isLinkEditMode) {\n isNewLink.current = false;\n }\n }, [isLinkEditMode]);\n\n useEffect(() => {\n return mergeRegister(\n editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n updateLinkEditor();\n });\n }),\n\n editor.registerCommand(\n ADD_BLANK_LINK,\n () => {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n\n editor.registerCommand(\n TOGGLE_LINK_COMMAND,\n (payload: string | { url: string } | null) => {\n if (typeof payload === 'string' || payload?.url) {\n setTimeout(() => {\n setIsLinkEditMode(true);\n }, 40);\n isNewLink.current = true;\n } else {\n setIsLinkEditMode(false);\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n ),\n editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n updateLinkEditor();\n return true;\n },\n COMMAND_PRIORITY_LOW\n ),\n editor.registerCommand(\n KEY_ESCAPE_COMMAND,\n () => {\n if (isLink) {\n setIsLink(false);\n return true;\n }\n return false;\n },\n COMMAND_PRIORITY_HIGH\n )\n );\n }, [editor, updateLinkEditor, setIsLink, isLink]);\n\n useEffect(() => {\n editor.getEditorState().read(() => {\n updateLinkEditor();\n });\n }, [editor, updateLinkEditor]);\n\n const handleLinkSubmission = ({\n text,\n url\n }: {\n text: string;\n url: string;\n }) => {\n if (lastSelection !== null) {\n const isValidUrl = isURL(url);\n const isValidText = text.trim().length > 0;\n\n if (isValidUrl && isValidText) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, {\n url,\n rel: options?.anchorOptions?.rel,\n target: options?.anchorOptions?.target,\n title: options?.anchorOptions?.title\n });\n editor.update(() => {\n if ($isRangeSelection(lastSelection)) {\n const textNode = getSelectedNode(lastSelection);\n if ($isTextNode(textNode)) {\n textNode.setTextContent(text);\n }\n }\n });\n setErrors({\n text: false,\n url: false\n });\n setTimeout(() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n }, 50);\n } else {\n setErrors({\n text: !isValidText,\n url: !isValidUrl\n });\n }\n }\n };\n\n if (!anchorElem) return null;\n\n return (\n <>\n {isLink && !isLinkEditMode && (\n <LinkTooltip\n anchorElem={anchorElem}\n containerRef={containerRef}\n handleDelete={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n handleEdit={() => {\n setIsLinkEditMode(true);\n setIsUpdate(true);\n }}\n linkUrl={linkUrl}\n https={options?.anchorOptions?.https || false}\n />\n )}\n {isLinkEditMode && (\n <LinkEditorDialog\n handleLinkSubmission={handleLinkSubmission}\n linkText={linkText}\n linkUrl={linkUrl}\n open={isLink && isLinkEditMode}\n closeModal={() => {\n setIsLink(false);\n setIsLinkEditMode(false);\n if (isNewLink.current) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n isUpdate={isUpdate}\n setIsLinkEditMode={setIsLinkEditMode}\n textLabel={options?.dialogProps?.textLabel || 'Link text'}\n urlLabel={options?.dialogProps?.urlLabel || 'Link URL'}\n removeLink={() => {\n if (lastSelection !== null) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n }\n }}\n errors={errors}\n saveLabel={options?.dialogProps?.saveLabel || 'Save'}\n cancelLabel={options?.dialogProps?.cancelLabel || 'Cancel'}\n updateLabel={options?.dialogProps?.updateLabel || 'Update'}\n title={options?.dialogProps?.title || 'Add Link'}\n errorLabels={options?.dialogProps?.errorLabels}\n />\n )}\n </>\n );\n}\n\nexport type DialogLinkEditorOptions = {\n dialogProps?: {\n textLabel?: string;\n urlLabel?: string;\n saveLabel?: string;\n cancelLabel?: string;\n updateLabel?: string;\n title?: string;\n errorLabels?: {\n text?: string;\n url?: string;\n };\n };\n anchorOptions?: {\n rel?: string;\n target?: string;\n title?: string;\n https?: boolean;\n };\n};\n\nexport function DialogLinkEditor({\n anchorElem = document.body,\n options\n}: {\n anchorElem?: HTMLElement | null;\n options?: DialogLinkEditorOptions;\n}) {\n const [editor] = useLexicalComposerContext();\n return useDialogLinkEditorToolbar(editor, anchorElem, options);\n}\n"],"names":["_a","_b","_c"],"mappings":"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"}
|
package/dist/es/editor.js
CHANGED
@@ -109,7 +109,8 @@ const Editor = ({
|
|
109
109
|
features,
|
110
110
|
children,
|
111
111
|
initialEditorState,
|
112
|
-
dataManagementRef
|
112
|
+
dataManagementRef,
|
113
|
+
onChangePluginProps
|
113
114
|
}) => {
|
114
115
|
const supportedFeatures = useMemo(() => {
|
115
116
|
if (features) {
|
@@ -136,7 +137,7 @@ const Editor = ({
|
|
136
137
|
/* @__PURE__ */ jsx(ClearEditorPlugin, {}),
|
137
138
|
/* @__PURE__ */ jsx(DataManagementPlugin, { ref: dataManagementRef }),
|
138
139
|
/* @__PURE__ */ jsx(TabFocusPlugin, {}),
|
139
|
-
/* @__PURE__ */ jsx(Fragment, { children: onChange && /* @__PURE__ */ jsx(OnChangePlugin, { onChange }) }),
|
140
|
+
/* @__PURE__ */ jsx(Fragment, { children: onChange && /* @__PURE__ */ jsx(OnChangePlugin, __spreadValues({ onChange }, onChangePluginProps)) }),
|
140
141
|
/* @__PURE__ */ jsx(Fragment, { children: supportedFeatures.components.map((comp) => {
|
141
142
|
const ToolComponent = comp.component;
|
142
143
|
if (ToolComponent) {
|
package/dist/es/editor.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"editor.js","sources":["../../src/editor.tsx"],"sourcesContent":["import { AutoLinkNode, LinkNode } from '@lexical/link';\nimport { ListItemNode, ListNode } from '@lexical/list';\nimport { ClearEditorPlugin } from '@lexical/react/LexicalClearEditorPlugin';\nimport {\n InitialConfigType,\n InitialEditorStateType,\n LexicalComposer\n} from '@lexical/react/LexicalComposer';\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin';\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';\nimport { HeadingNode } from '@lexical/rich-text';\n\nimport { CodeNode } from '@lexical/code';\nimport { EditorState, LexicalEditor } from 'lexical';\nimport {\n Fragment, ReactNode, RefObject, useMemo\n} from 'react';\nimport {\n AutoLinkPlugin,\n DataManagementPlugin,\n DataManagementPluginHandle,\n LinkPlugin,\n TabFocusPlugin\n} from './plugins';\n\nimport { ToolbarContextPlugin } from './components';\n\nconst initialConfig: InitialConfigType = {\n namespace: 'TwigsEditor',\n theme: {\n text: {\n bold: 'text-bold',\n italic: 'text-italic',\n underline: 'text-underline',\n code: 'text-code',\n base: 'text-base',\n highlight: 'text-highlight',\n strikethrough: 'text-strikethrough',\n subscript: 'text-subscript',\n superscript: 'text-superscript',\n underlineStrikethrough: 'text-underline-strikethrough'\n },\n code: 'block-code',\n quote: 'block-quote',\n heading: {\n h1: 'block-h1',\n h2: 'block-h2',\n h3: 'block-h3',\n h4: 'block-h4',\n h5: 'block-h5',\n h6: 'block-h6'\n },\n list: {\n ol: 'block-ol',\n ul: 'block-ul',\n listitem: 'block-listitem'\n }\n },\n onError: (err) => {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n};\n\nlet featureId = 0;\n\nconst featuresToNodeMapping = {\n heading: {\n node: HeadingNode,\n component: null\n },\n list: {\n node: [ListNode, ListItemNode],\n component: ListPlugin\n },\n link: {\n node: [LinkNode, AutoLinkNode],\n component: [AutoLinkPlugin, LinkPlugin]\n },\n code: {\n node: [CodeNode],\n component: null\n }\n};\n\nexport
|
1
|
+
{"version":3,"file":"editor.js","sources":["../../src/editor.tsx"],"sourcesContent":["import { AutoLinkNode, LinkNode } from '@lexical/link';\nimport { ListItemNode, ListNode } from '@lexical/list';\nimport { ClearEditorPlugin } from '@lexical/react/LexicalClearEditorPlugin';\nimport {\n InitialConfigType,\n InitialEditorStateType,\n LexicalComposer\n} from '@lexical/react/LexicalComposer';\nimport { HistoryPlugin } from '@lexical/react/LexicalHistoryPlugin';\nimport { ListPlugin } from '@lexical/react/LexicalListPlugin';\nimport { OnChangePlugin } from '@lexical/react/LexicalOnChangePlugin';\nimport { HeadingNode } from '@lexical/rich-text';\n\nimport { CodeNode } from '@lexical/code';\nimport { EditorState, LexicalEditor } from 'lexical';\nimport {\n Fragment, ReactNode, RefObject, useMemo\n} from 'react';\nimport {\n AutoLinkPlugin,\n DataManagementPlugin,\n DataManagementPluginHandle,\n LinkPlugin,\n TabFocusPlugin\n} from './plugins';\n\nimport { ToolbarContextPlugin } from './components';\n\nconst initialConfig: InitialConfigType = {\n namespace: 'TwigsEditor',\n theme: {\n text: {\n bold: 'text-bold',\n italic: 'text-italic',\n underline: 'text-underline',\n code: 'text-code',\n base: 'text-base',\n highlight: 'text-highlight',\n strikethrough: 'text-strikethrough',\n subscript: 'text-subscript',\n superscript: 'text-superscript',\n underlineStrikethrough: 'text-underline-strikethrough'\n },\n code: 'block-code',\n quote: 'block-quote',\n heading: {\n h1: 'block-h1',\n h2: 'block-h2',\n h3: 'block-h3',\n h4: 'block-h4',\n h5: 'block-h5',\n h6: 'block-h6'\n },\n list: {\n ol: 'block-ol',\n ul: 'block-ul',\n listitem: 'block-listitem'\n }\n },\n onError: (err) => {\n // eslint-disable-next-line no-console\n console.error(err);\n }\n};\n\nlet featureId = 0;\n\nconst featuresToNodeMapping = {\n heading: {\n node: HeadingNode,\n component: null\n },\n list: {\n node: [ListNode, ListItemNode],\n component: ListPlugin\n },\n link: {\n node: [LinkNode, AutoLinkNode],\n component: [AutoLinkPlugin, LinkPlugin]\n },\n code: {\n node: [CodeNode],\n component: null\n }\n};\n\nexport interface EditorProps {\n initialEditorState?: InitialEditorStateType;\n onChange?: (\n newEditorState: EditorState,\n editor: LexicalEditor,\n tags: Set<string>\n ) => void;\n editable?: boolean;\n children?: ReactNode;\n nodes?: InitialConfigType['nodes'];\n features?: (keyof typeof featuresToNodeMapping)[];\n dataManagementRef?: RefObject<DataManagementPluginHandle>;\n onChangePluginProps?: {\n ignoreHistoryMergeTagChange?: boolean;\n ignoreSelectionChange?: boolean;\n };\n}\n\nexport const Editor = ({\n nodes,\n onChange,\n editable,\n features,\n children,\n initialEditorState,\n dataManagementRef,\n onChangePluginProps\n}: EditorProps) => {\n const supportedFeatures = useMemo(() => {\n if (features) {\n const selectedNodes = features\n .map((item) => featuresToNodeMapping[item].node)\n .flat();\n\n const selectedPlugins = features\n .map((item) => featuresToNodeMapping[item].component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }));\n\n return { nodes: selectedNodes, components: selectedPlugins };\n }\n\n const defaultFeatures = {\n nodes: Object.values(featuresToNodeMapping)\n .map((item) => item.node)\n .flat(),\n components: Object.values(featuresToNodeMapping)\n .map((item) => item.component)\n .flat()\n .map((item) => ({ component: item, id: featureId++ }))\n };\n\n return defaultFeatures;\n }, [features]);\n\n return (\n <LexicalComposer\n initialConfig={{\n ...initialConfig,\n editorState: initialEditorState,\n editable,\n nodes: [...supportedFeatures.nodes, ...(nodes ?? [])]\n }}\n >\n <ToolbarContextPlugin>\n <HistoryPlugin />\n <ClearEditorPlugin />\n <DataManagementPlugin ref={dataManagementRef} />\n <TabFocusPlugin />\n <>\n {onChange && (\n <OnChangePlugin onChange={onChange} {...onChangePluginProps} />\n )}\n </>\n <>\n {supportedFeatures.components.map((comp) => {\n const ToolComponent = comp.component;\n if (ToolComponent) {\n return <ToolComponent key={comp.id} />;\n }\n\n return <Fragment key={comp.id} />;\n })}\n </>\n <>{children}</>\n </ToolbarContextPlugin>\n </LexicalComposer>\n );\n};\n"],"names":["Fragment"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
@@ -335,15 +335,20 @@ declare const featuresToNodeMapping: {
|
|
335
335
|
component: null;
|
336
336
|
};
|
337
337
|
};
|
338
|
-
|
338
|
+
interface EditorProps {
|
339
339
|
initialEditorState?: InitialEditorStateType;
|
340
340
|
onChange?: (newEditorState: EditorState, editor: LexicalEditor, tags: Set<string>) => void;
|
341
341
|
editable?: boolean;
|
342
342
|
children?: ReactNode;
|
343
|
-
nodes?: InitialConfigType[
|
343
|
+
nodes?: InitialConfigType['nodes'];
|
344
344
|
features?: (keyof typeof featuresToNodeMapping)[];
|
345
345
|
dataManagementRef?: RefObject<DataManagementPluginHandle>;
|
346
|
-
|
346
|
+
onChangePluginProps?: {
|
347
|
+
ignoreHistoryMergeTagChange?: boolean;
|
348
|
+
ignoreSelectionChange?: boolean;
|
349
|
+
};
|
350
|
+
}
|
351
|
+
declare const Editor: ({ nodes, onChange, editable, features, children, initialEditorState, dataManagementRef, onChangePluginProps }: EditorProps) => react_jsx_runtime.JSX.Element;
|
347
352
|
|
348
353
|
type SerializedHashTagNode = Spread<{
|
349
354
|
hashTagName: string;
|
@@ -442,4 +447,4 @@ declare class EmojiNode extends TextNode {
|
|
442
447
|
declare function $isEmojiNode(node: LexicalNode | null | undefined): node is EmojiNode;
|
443
448
|
declare function $createEmojiNode(className: string, emojiText: string): EmojiNode;
|
444
449
|
|
445
|
-
export { $createEmojiNode, $createHashTagNode, $createImageNode, $createKudosNode, $createMentionNode, $createVariableNode, $isEmojiNode, $isHashTagNode, $isImageNode, $isKudosNode, $isMentionNode, $isVariableNode, AutoLinkPlugin, BoldTool, CodeBlockTool, CodeTool, ConvertSelectionToLinkOnPastePlugin, DataManagementPlugin, type DataManagementPluginHandle, type DefaultToolbarTools, DialogLinkEditor, type DialogLinkEditorOptions, Editor, EditorFloatingToolbar, EditorLookupDropdownBase, type EditorLookupDropdownBaseProps, EditorToolbar, EmojiNode, EmojiPlugin, type FloatingToolbarProperties, type FloatingToolbarTools, FormatTool, type FormatToolProps, HashTagNode, HashTagPlugin, ImageNode, type ImagePayload, ImagesPlugin, type InsertImagePayload, ItalicTool, KudosNode, LinkPlugin, LinkTool, MentionNode, MentionsPlugin, OrderedListTool, RichEditor, type SerializedEmojiNode, type SerializedHashTagNode, type SerializedImageNode, type SerializedKudosNode, type SerializedMentionNode, type SerializedVariableNode, TabFocusPlugin, TextAlignTool, ToolbarContextConsumer, ToolbarContextPlugin, ToolbarStoreProvider, type ToolbarTools, type TypeaheadMenuData, UnderlineTool, UnorderedListTool, VariableNode, useToolbarStore };
|
450
|
+
export { $createEmojiNode, $createHashTagNode, $createImageNode, $createKudosNode, $createMentionNode, $createVariableNode, $isEmojiNode, $isHashTagNode, $isImageNode, $isKudosNode, $isMentionNode, $isVariableNode, AutoLinkPlugin, BoldTool, CodeBlockTool, CodeTool, ConvertSelectionToLinkOnPastePlugin, DataManagementPlugin, type DataManagementPluginHandle, type DefaultToolbarTools, DialogLinkEditor, type DialogLinkEditorOptions, Editor, EditorFloatingToolbar, EditorLookupDropdownBase, type EditorLookupDropdownBaseProps, type EditorProps, EditorToolbar, EmojiNode, EmojiPlugin, type FloatingToolbarProperties, type FloatingToolbarTools, FormatTool, type FormatToolProps, HashTagNode, HashTagPlugin, ImageNode, type ImagePayload, ImagesPlugin, type InsertImagePayload, ItalicTool, KudosNode, LinkPlugin, LinkTool, MentionNode, MentionsPlugin, OrderedListTool, RichEditor, type SerializedEmojiNode, type SerializedHashTagNode, type SerializedImageNode, type SerializedKudosNode, type SerializedMentionNode, type SerializedVariableNode, TabFocusPlugin, TextAlignTool, ToolbarContextConsumer, ToolbarContextPlugin, ToolbarStoreProvider, type ToolbarTools, type TypeaheadMenuData, UnderlineTool, UnorderedListTool, VariableNode, useToolbarStore };
|