markdown-flow-ui 0.2.35-dev.2 → 0.2.36-dev.1
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/README.md +12 -0
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/_virtual/index.es9.js +2 -2
- package/dist/_virtual/index8.cjs +1 -1
- package/dist/_virtual/index9.cjs +1 -1
- package/dist/_virtual/variable-name.cjs +2 -0
- package/dist/_virtual/variable-name.cjs.map +1 -0
- package/dist/_virtual/variable-name.es.js +5 -0
- package/dist/_virtual/variable-name.es.js.map +1 -0
- package/dist/components/ContentRender/plugins/CustomVariable.cjs +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.cjs.map +1 -1
- package/dist/components/ContentRender/plugins/CustomVariable.es.js +52 -51
- package/dist/components/ContentRender/plugins/CustomVariable.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +71 -70
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js +16 -16
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js +23 -23
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js +15 -15
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js +13 -13
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.es.js +8 -8
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js +13 -13
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js +11 -11
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs +3 -3
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js +104 -103
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.test.d.ts +1 -0
- package/dist/components/MarkdownFlowEditor/utils.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/utils.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/utils.d.ts +2 -3
- package/dist/components/MarkdownFlowEditor/utils.es.js +43 -50
- package/dist/components/MarkdownFlowEditor/utils.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/utils.variables.test.d.ts +1 -0
- package/dist/lib/interaction-defaults.cjs +1 -1
- package/dist/lib/interaction-defaults.cjs.map +1 -1
- package/dist/lib/interaction-defaults.es.js +49 -49
- package/dist/lib/interaction-defaults.es.js.map +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
- package/dist/node_modules/classnames/index.cjs +1 -1
- package/dist/node_modules/classnames/index.es.js +1 -1
- package/dist/node_modules/remark-flow/dist/index.cjs +1 -1
- package/dist/node_modules/remark-flow/dist/index.cjs.map +1 -1
- package/dist/node_modules/remark-flow/dist/index.es.js +41 -24
- package/dist/node_modules/remark-flow/dist/index.es.js.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-parser.cjs +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-parser.cjs.map +1 -1
- package/dist/node_modules/remark-flow/dist/interaction-parser.es.js +44 -45
- package/dist/node_modules/remark-flow/dist/interaction-parser.es.js.map +1 -1
- package/dist/node_modules/remark-flow/dist/variable-name.cjs +2 -0
- package/dist/node_modules/remark-flow/dist/variable-name.cjs.map +1 -0
- package/dist/node_modules/remark-flow/dist/variable-name.es.js +31 -0
- package/dist/node_modules/remark-flow/dist/variable-name.es.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownFlowEditor.es.js","sources":["../../../src/components/MarkdownFlowEditor/MarkdownFlowEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport {\n syntaxHighlighting,\n defaultHighlightStyle,\n} from \"@codemirror/language\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport CustomDialog from \"./components/CustomDialog\";\nimport CustomPopover from \"./components/CustomPopover\";\nimport EditorToolbar from \"./components/EditorToolbar\";\nimport VariableSearchDropdown from \"./components/VariableSearchDropdown\";\nimport EditorContext from \"./editor-context\";\nimport ImageInject from \"./components/ImageInject\";\nimport VideoInject from \"./components/VideoInject\";\nimport VariableSelect from \"./components/VariableSelect\";\nimport {\n SelectedOption,\n IEditorContext,\n Variable,\n SelectContentInfo,\n PopoverPosition,\n EditorAction,\n EditorApi,\n} from \"./types\";\nimport \"./markdownFlowEditor.css\";\n\nimport {\n createSlashCommands,\n parseContentInfo,\n getImageContentToInsert,\n getVideoContentToInsert,\n extractVariableNames,\n createVariableExpressionRegexp,\n} from \"./utils\";\nimport ImgPlaceholder from \"./plugins/ImgPlaceholder\";\nimport VideoPlaceholder from \"./plugins/VideoPlaceholder\";\nimport { mediaPlaceholderLabels } from \"./plugins/mediaPlaceholderLabels\";\nimport VariablePlaceholder from \"./plugins/VariablePlaceholder\";\nimport SyntaxHighlighter from \"./plugins/SyntaxHighlighter\";\n// import createFixedTextPlaceholder from \"./plugins/FixedTextPlaceholder\";\n// import DividerPlaceholder from \"./plugins/DividerPlaceholder\";\nimport { initReactI18next, useTranslation } from \"react-i18next\";\nimport i18next from \"i18next\";\nimport { UploadProps } from \"./uploadTypes\";\nimport {\n DEFAULT_EDITOR_LOCALE,\n editorLocaleResources,\n getEditorLocaleMessages,\n} from \"./editorI18n\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n normalizeMarkdownFlowLocale,\n type MarkdownFlowLocale,\n} from \"../../lib/locale\";\nimport { useDetachedLanguage } from \"../../lib/useDetachedLanguage\";\nimport { useResolvedDirection } from \"../../lib/useResolvedDirection\";\n\nif (!i18next.isInitialized) {\n i18next.use(initReactI18next).init({\n resources: editorLocaleResources,\n lng: DEFAULT_EDITOR_LOCALE,\n fallbackLng: DEFAULT_EDITOR_LOCALE,\n interpolation: { escapeValue: false },\n });\n} else {\n Object.entries(editorLocaleResources).forEach(([lng, resource]) => {\n i18next.addResourceBundle(\n lng,\n \"translation\",\n resource.translation,\n true,\n true\n );\n });\n}\n\nexport enum EditMode {\n CodeEdit = \"codeEdit\",\n QuickEdit = \"quickEdit\",\n}\n\ntype EditorProps = {\n content?: string;\n editMode?: EditMode;\n variables?: Variable[];\n systemVariables?: Variable[];\n onChange?: (value: string) => void;\n onBlur?: () => void;\n locale?: MarkdownFlowLocale;\n /** Overrides the locale-derived language. */\n lang?: string;\n uploadProps?: UploadProps;\n disabled?: boolean;\n toolbarActionsRight?: EditorAction[];\n onReady?: (api: EditorApi) => void;\n};\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\n// Detect whether cursor is still inside a {{variable}} expression\nconst isCursorInsideVariableExpression = (\n content: string,\n cursorPosition: number\n) => {\n if (!content || cursorPosition < 0) {\n return false;\n }\n const regexp = createVariableExpressionRegexp();\n let match: RegExpExecArray | null;\n\n while ((match = regexp.exec(content)) !== null) {\n const matchStart = match.index ?? 0;\n const matchEnd = matchStart + match[0].length;\n const innerStart = matchStart + 2;\n const innerEnd = matchEnd - 2;\n if (cursorPosition >= innerStart && cursorPosition <= innerEnd) {\n return true;\n }\n if (regexp.lastIndex === match.index) {\n regexp.lastIndex++;\n }\n }\n\n return false;\n};\n\nconst buildVariableTemplate = (variableName = \"\") => `{{${variableName}}}`;\n\nconst Editor: React.FC<EditorProps> = ({\n content = \"\",\n editMode = EditMode.CodeEdit,\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n onChange,\n onBlur,\n locale,\n lang,\n uploadProps,\n disabled = false,\n toolbarActionsRight,\n onReady,\n}) => {\n const { t, i18n } = useTranslation();\n const resolvedLocale = normalizeMarkdownFlowLocale(\n locale ?? DEFAULT_EDITOR_LOCALE\n );\n const direction = getMarkdownFlowDirection(locale);\n const language = lang ?? getMarkdownFlowLanguage(locale);\n\n useEffect(() => {\n if (i18n.language !== resolvedLocale) {\n i18n.changeLanguage(resolvedLocale);\n }\n }, [i18n, resolvedLocale]);\n\n const currentStrings = getEditorLocaleMessages(resolvedLocale);\n const toolbarLabels = useMemo(\n () => ({\n image: t(\"toolbarInsertImage\", {\n defaultValue: \"Insert image\",\n }),\n video: t(\"toolbarInsertVideo\", {\n defaultValue: \"Insert video\",\n }),\n variable: t(\"slashVariable\", {\n defaultValue: \"Variable\",\n }),\n addVariable: t(\"toolbarInsertNewVariable\", {\n defaultValue: \"Insert new variable\",\n }),\n search: t(\"toolbarInsertExistingVariable\", {\n defaultValue: \"Insert existing variable\",\n }),\n confirmOutput: t(\"toolbarConfirmOutput\", {\n defaultValue: \"Confirm output\",\n }),\n insertLink: t(\"toolbarInsertLink\", {\n defaultValue: \"Insert link\",\n }),\n insertButton: t(\"toolbarInsertButton\", {\n defaultValue: \"Insert button\",\n }),\n insertSingleChoice: t(\"toolbarInsertSingleChoice\", {\n defaultValue: \"Insert single choice\",\n }),\n insertMultiChoice: t(\"toolbarInsertMultiChoice\", {\n defaultValue: \"Insert multi choice\",\n }),\n insertInput: t(\"toolbarInsertInput\", {\n defaultValue: \"Insert input\",\n }),\n singleChoiceOption1: t(\"toolbarChoiceOption1\", {\n defaultValue: \"Option 1\",\n }),\n singleChoiceOption2: t(\"toolbarChoiceOption2\", {\n defaultValue: \"Option 2\",\n }),\n inputPlaceholder: t(\"toolbarInputPlaceholder\", {\n defaultValue: \"Please enter\",\n }),\n }),\n [t]\n );\n const variableSearchLabels = useMemo(\n () => ({\n searchPlaceholder: t(\"variableSearchPlaceholder\", {\n defaultValue: \"Search variable\",\n }),\n systemLabel: t(\"variableSectionSystem\", \"System Variables\"),\n customLabel: t(\"variableSectionCustom\", \"Custom Variables\"),\n emptyLabel: t(\"variableNotFound\", \"No variables found\"),\n }),\n [t]\n );\n const placeholderText =\n editMode === EditMode.QuickEdit\n ? t(\"placeholderQuickEdit\", {\n defaultValue: t(\"placeholderCodeEdit\", {\n defaultValue: t(\"placeholder\"),\n }),\n })\n : t(\"placeholderCodeEdit\", { defaultValue: t(\"placeholder\") });\n // Normalize variables to avoid duplicating system variables in the custom list\n const normalizedSystemVariables = useMemo(() => {\n const seen = new Set<string>();\n return (initialSystemVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (!normalized || seen.has(normalized)) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialSystemVariables]);\n\n const normalizedCustomVariables = useMemo(() => {\n const systemNameSet = new Set(\n normalizedSystemVariables.map((variable) => variable.name.toLowerCase())\n );\n const seen = new Set<string>();\n return (initialVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (\n !normalized ||\n systemNameSet.has(normalized) ||\n seen.has(normalized)\n ) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialVariables, normalizedSystemVariables]);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const editorRootRef = useRef<HTMLDivElement>(null);\n const portalLanguage = useDetachedLanguage(editorRootRef, language);\n const { resolvedDirection: portalDirection } = useResolvedDirection(\n editorRootRef,\n direction\n );\n const [popoverPosition, setPopoverPosition] =\n useState<PopoverPosition | null>(null);\n const [variables, setVariables] = useState<Variable[]>(\n normalizedCustomVariables\n );\n const [systemVariables, setSystemVariables] = useState<Variable[]>(\n normalizedSystemVariables\n );\n\n useEffect(() => {\n setVariables(normalizedCustomVariables);\n }, [normalizedCustomVariables]);\n\n useEffect(() => {\n setSystemVariables(normalizedSystemVariables);\n }, [normalizedSystemVariables]);\n\n const [selectedOption, setSelectedOption] = useState<SelectedOption>(\n SelectedOption.Empty\n );\n const [selectContentInfo, setSelectContentInfo] =\n useState<SelectContentInfo | null>();\n const editorViewRef = useRef<EditorView | null>(null);\n const pendingVariableContentRef = useRef<string | null>(null);\n const variableSearchAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [variableSearchOpen, setVariableSearchOpen] = useState(false);\n const closeVariableSearch = useCallback(() => {\n setVariableSearchOpen(false);\n variableSearchAnchorRef.current = null;\n }, []);\n const handleVariableSearchToggle = useCallback(\n (button: HTMLButtonElement) => {\n if (disabled) {\n return;\n }\n if (variableSearchOpen && variableSearchAnchorRef.current === button) {\n closeVariableSearch();\n return;\n }\n variableSearchAnchorRef.current = button;\n setVariableSearchOpen(true);\n },\n [closeVariableSearch, disabled, variableSearchOpen]\n );\n\n const editorContextValue: IEditorContext = {\n selectedOption,\n setSelectedOption,\n dialogOpen,\n setDialogOpen,\n popoverOpen,\n setPopoverOpen,\n popoverPosition,\n setPopoverPosition,\n };\n\n useEffect(() => {\n if (!disabled) {\n return;\n }\n setDialogOpen(false);\n setPopoverOpen(false);\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n setPopoverPosition(null);\n closeVariableSearch();\n }, [\n closeVariableSearch,\n disabled,\n setDialogOpen,\n setPopoverOpen,\n setPopoverPosition,\n setSelectedOption,\n setSelectContentInfo,\n ]);\n\n const addVariablesFromContent = useCallback(\n (text: string) => {\n if (editMode !== EditMode.QuickEdit || !text) {\n return;\n }\n\n const names = extractVariableNames(text);\n if (!names.length) {\n return;\n }\n\n const systemNameSet = new Set(\n systemVariables.map((variable) => variable.name.toLowerCase())\n );\n\n setVariables((prev) => {\n const existingNames = new Set(\n prev.map((variable) => variable.name.toLowerCase())\n );\n const addedNames = new Set<string>();\n const newVariables: Variable[] = [];\n\n names.forEach((rawName) => {\n const normalized = rawName.toLowerCase();\n if (\n !rawName ||\n systemNameSet.has(normalized) ||\n existingNames.has(normalized) ||\n addedNames.has(normalized)\n ) {\n return;\n }\n newVariables.push({ name: rawName });\n addedNames.add(normalized);\n });\n\n if (!newVariables.length) {\n return prev;\n }\n\n return [...newVariables, ...prev];\n });\n },\n [editMode, systemVariables]\n );\n\n useEffect(() => {\n addVariablesFromContent(content);\n }, [content, addVariablesFromContent]);\n\n // const insertFixedText = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const selectedText = state.sliceDoc(selection.from, selection.to);\n // const startTag = \"===\";\n // const endTag = \"===\";\n // const insertContent = `${startTag}${selectedText ?? \"\"}${endTag}`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + startTag.length + (selectedText?.length ?? 0),\n // },\n // });\n // view.focus();\n // }, []);\n\n // const insertDivider = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const insertContent = `\\n\\n---\\n\\n`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + insertContent.length,\n // },\n // });\n // view.focus();\n // }, []);\n\n const onSelectedOption = useCallback(\n (option: SelectedOption) => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n // if (option === SelectedOption.FixedText) {\n // insertFixedText();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n // if (option === SelectedOption.Divider) {\n // insertDivider();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n setSelectedOption(option);\n\n if (option === SelectedOption.Variable) {\n if (editorViewRef.current) {\n const { state } = editorViewRef.current;\n const pos = state.selection.main.from;\n const coords = editorViewRef.current.coordsAtPos(pos);\n if (coords) {\n setPopoverPosition({\n x: coords.left,\n y: coords.bottom,\n });\n }\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [closeVariableSearch, disabled]\n );\n\n const insertText = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) return;\n\n const { state, dispatch } = editorViewRef.current;\n const from = state.selection.main.from;\n\n dispatch({\n changes: { from, insert: text },\n selection: { anchor: from + text.length },\n });\n },\n [editorViewRef, disabled]\n );\n\n const replaceSelection = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const { state, dispatch } = editorViewRef.current;\n const selection = state.selection.main;\n dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n selection: { anchor: selection.from + text.length },\n });\n },\n [disabled]\n );\n\n const focusEditor = useCallback(() => {\n editorViewRef.current?.focus();\n }, []);\n\n const getContent = useCallback(() => {\n return editorViewRef.current?.state.doc.toString() ?? \"\";\n }, []);\n\n const setContent = useCallback(\n (text: string) => {\n if (disabled) {\n return;\n }\n if (!editorViewRef.current) {\n onChange?.(text);\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n dispatch({\n changes: { from: 0, to: state.doc.length, insert: text },\n selection: { anchor: text.length },\n });\n },\n [disabled, onChange]\n );\n\n const deleteSelectedContent = useCallback(() => {\n if (disabled) {\n return;\n }\n if (\n !selectContentInfo ||\n !editorViewRef.current ||\n selectContentInfo.from === -1\n )\n return;\n\n const { from, to } = selectContentInfo;\n const { dispatch } = editorViewRef.current;\n\n dispatch({\n changes: { from, to, insert: \"\" },\n });\n }, [selectContentInfo, editorViewRef, disabled]);\n\n const insertVariableContent = useCallback(\n (\n variableName: string,\n range?: { from: number; to: number },\n placeCursorAtEnd = false\n ) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = range ?? state.selection.main;\n const template = buildVariableTemplate(variableName);\n const cursorOffset = placeCursorAtEnd\n ? template.length\n : 2 + variableName.length; // 2 braces before variable content\n\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + cursorOffset,\n },\n });\n view.focus();\n },\n [disabled]\n );\n\n const insertVariableTemplate = useCallback(() => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n insertVariableContent(\"\");\n }, [closeVariableSearch, disabled, insertVariableContent]);\n\n const insertConfirmOutputMarker = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"======\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 3,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertLinkTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"[]()\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 1,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertButtonTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"?[]\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 2,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertSingleChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} | ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertMultiChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} || ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertInputFieldTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const placeholder = toolbarLabels.inputPlaceholder ?? \"请输入\";\n const template = `?[%{{}}...${placeholder}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [disabled, toolbarLabels.inputPlaceholder]);\n\n const handleSelectImage = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n }: {\n resourceUrl?: string;\n resourceTitle?: string;\n scalePercent?: number;\n }) => {\n if (!resourceUrl || disabled) return;\n const textToInsert = getImageContentToInsert({\n resourceUrl,\n resourceTitle,\n scalePercent,\n });\n if (selectContentInfo?.type === SelectedOption.Image) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVideo = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n }: {\n resourceUrl: string;\n resourceTitle: string;\n }) => {\n if (disabled) {\n return;\n }\n const textToInsert = getVideoContentToInsert(resourceUrl, resourceTitle);\n if (selectContentInfo?.type === SelectedOption.Video) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVariable = useCallback(\n (variable: Variable) => {\n if (disabled) {\n return;\n }\n const selectionRange =\n selectContentInfo?.type === SelectedOption.Variable\n ? { from: selectContentInfo.from, to: selectContentInfo.to }\n : undefined;\n insertVariableContent(variable.name, selectionRange, true);\n setPopoverOpen(false);\n closeVariableSearch();\n },\n [disabled, insertVariableContent, selectContentInfo, closeVariableSearch]\n );\n\n const slashCommandsExtension = useCallback(() => {\n return autocompletion({\n override: [\n createSlashCommands(onSelectedOption, {\n // divider: currentStrings.slashDivider,\n // fixedText: currentStrings.slashFixedText,\n image: currentStrings.slashImage,\n video: currentStrings.slashVideo,\n variable: currentStrings.slashVariable,\n }),\n ],\n });\n }, [\n // currentStrings.slashDivider,\n // currentStrings.slashFixedText,\n currentStrings.slashImage,\n currentStrings.slashVideo,\n currentStrings.slashVariable,\n onSelectedOption,\n ]);\n\n // const fixedTextPlaceholderExtension = useMemo(\n // () =>\n // createFixedTextPlaceholder(\n // currentStrings.fixedTextPlaceholder ?? \"添加固定文本\",\n // currentStrings.fixedTextTooltip ??\n // currentStrings.slashFixedText ??\n // \"固定文本\"\n // ),\n // [\n // currentStrings.fixedTextPlaceholder,\n // currentStrings.fixedTextTooltip,\n // currentStrings.slashFixedText,\n // ]\n // );\n\n const handleEditorUpdate = useCallback(\n (update: ViewUpdate) => {\n editorViewRef.current = update.view;\n if (\n editMode === EditMode.QuickEdit &&\n pendingVariableContentRef.current &&\n update.selectionSet\n ) {\n const cursorPosition = update.state.selection.main.head;\n const docText = update.state.doc.toString();\n const stillInside = isCursorInsideVariableExpression(\n docText,\n cursorPosition\n );\n if (!stillInside) {\n addVariablesFromContent(docText);\n pendingVariableContentRef.current = null;\n }\n }\n },\n [addVariablesFromContent, editMode]\n );\n\n const handleTagClick = useCallback(\n (event: any) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n const { type, from, to, dataset, target } = event.detail;\n const value = parseContentInfo(type, dataset);\n setSelectContentInfo({\n type,\n value,\n from,\n to,\n });\n setSelectedOption(type);\n\n if (type === SelectedOption.Variable) {\n if (target) {\n const rect = target.getBoundingClientRect();\n const anchorDirection =\n target.ownerDocument.defaultView?.getComputedStyle(\n editorRootRef.current ?? target\n ).direction;\n setPopoverPosition({\n x: anchorDirection === \"rtl\" ? rect.right : rect.left,\n y: rect.bottom,\n });\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [disabled]\n );\n\n useEffect(() => {\n if (!dialogOpen) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [dialogOpen]);\n\n useEffect(() => {\n if (!popoverOpen && selectedOption === SelectedOption.Variable) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [popoverOpen, selectedOption]);\n\n useEffect(() => {\n const handleWrap = (e: any) => {\n if (e.detail.view === editorViewRef.current) {\n handleTagClick(e);\n }\n };\n window.addEventListener(\"globalTagClick\", handleWrap);\n return () => {\n window.removeEventListener(\"globalTagClick\", handleWrap);\n };\n }, [handleTagClick]);\n\n const imagePlaceholderTitle = t(\"imageDefaultTitle\");\n const videoPlaceholderTitle = t(\"videoDefaultTitle\");\n const mediaPlaceholderLabelsExtension = useMemo(\n () =>\n mediaPlaceholderLabels.of({\n image: imagePlaceholderTitle,\n video: videoPlaceholderTitle,\n }),\n [imagePlaceholderTitle, videoPlaceholderTitle]\n );\n\n const editorExtensions = useMemo(() => {\n const extensions = [\n EditorView.lineWrapping,\n markdown(),\n syntaxHighlighting(defaultHighlightStyle),\n SyntaxHighlighter,\n ];\n\n if (!disabled) {\n extensions.push(slashCommandsExtension());\n }\n\n if (editMode === EditMode.QuickEdit) {\n extensions.push(\n mediaPlaceholderLabelsExtension,\n ImgPlaceholder,\n VideoPlaceholder,\n VariablePlaceholder\n // fixedTextPlaceholderExtension,\n // DividerPlaceholder,\n );\n }\n\n extensions.push(\n EditorView.updateListener.of((update) => {\n handleEditorUpdate(update);\n })\n );\n\n return extensions;\n }, [\n disabled,\n editMode,\n slashCommandsExtension,\n handleEditorUpdate,\n mediaPlaceholderLabelsExtension,\n ]);\n\n const handleContentChange = useCallback(\n (value: string) => {\n if (disabled) {\n return;\n }\n const cursorPosition =\n editorViewRef.current?.state.selection.main.head ?? -1;\n const skipAddition = isCursorInsideVariableExpression(\n value,\n cursorPosition\n );\n if (skipAddition) {\n pendingVariableContentRef.current = value;\n } else {\n pendingVariableContentRef.current = null;\n addVariablesFromContent(value);\n }\n onChange?.(value);\n },\n [addVariablesFromContent, onChange, disabled]\n );\n\n const isVariableSearchOpen = !disabled && variableSearchOpen;\n const editorApi = useMemo(\n () => ({\n insertTextAtCursor: insertText,\n replaceSelection,\n focus: focusEditor,\n getContent,\n setContent,\n }),\n [focusEditor, getContent, insertText, replaceSelection, setContent]\n );\n\n const handleToolbarActionClick = useCallback(\n (action: EditorAction) => {\n if (disabled || \"render\" in action) {\n return;\n }\n action.onClick?.(editorApi);\n },\n [disabled, editorApi]\n );\n\n const toolbarRightSlot = useMemo(() => {\n if (!toolbarActionsRight?.length) {\n return null;\n }\n return (\n <div className=\"markdown-flow-editor-toolbar-right\">\n {toolbarActionsRight.map((action) => {\n if (\"render\" in action) {\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {action.render(editorApi)}\n </div>\n );\n }\n const ariaLabel = action.label || action.tooltip || undefined;\n const button = (\n <button\n type=\"button\"\n key={action.key}\n disabled={disabled || action.disabled}\n onClick={() => handleToolbarActionClick(action)}\n className=\"markdown-flow-editor-toolbar-right-button\"\n aria-label={ariaLabel}\n title={action.label || action.tooltip}\n >\n {action.icon ? (\n <span className=\"toolbar-right-icon\">{action.icon}</span>\n ) : null}\n {action.label ? (\n <span className=\"toolbar-right-label\">{action.label}</span>\n ) : null}\n </button>\n );\n const wrapped = action.tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"top\"\n dir={portalDirection}\n lang={portalLanguage}\n >\n {action.tooltip}\n </TooltipContent>\n </Tooltip>\n ) : (\n button\n );\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {wrapped}\n </div>\n );\n })}\n </div>\n );\n }, [\n disabled,\n editorApi,\n handleToolbarActionClick,\n portalDirection,\n portalLanguage,\n toolbarActionsRight,\n ]);\n\n useEffect(() => {\n onReady?.(editorApi);\n }, [editorApi]);\n\n return (\n <div\n className=\"markdown-flow-editor\"\n ref={editorRootRef}\n dir={direction}\n lang={language}\n data-disabled={disabled ? \"true\" : undefined}\n aria-disabled={disabled}\n >\n <EditorToolbar\n disabled={disabled}\n labels={toolbarLabels}\n tooltipDirection={portalDirection}\n tooltipLanguage={portalLanguage}\n onSelect={onSelectedOption}\n onInsertVariablePlaceholder={insertVariableTemplate}\n onVariableSearchToggle={handleVariableSearchToggle}\n onVariableSearchClose={closeVariableSearch}\n onInsertConfirmOutput={insertConfirmOutputMarker}\n onInsertLink={insertLinkTemplate}\n onInsertButton={insertButtonTemplate}\n onInsertSingleChoice={insertSingleChoiceTemplate}\n onInsertMultiChoice={insertMultiChoiceTemplate}\n onInsertInputField={insertInputFieldTemplate}\n variableSearchActive={isVariableSearchOpen}\n rightSlot={toolbarRightSlot}\n />\n <VariableSearchDropdown\n open={isVariableSearchOpen}\n anchorElement={variableSearchAnchorRef.current}\n onClose={closeVariableSearch}\n onSelect={handleSelectVariable}\n variables={variables}\n systemVariables={systemVariables}\n labels={variableSearchLabels}\n />\n <div className=\"markdown-flow-editor-body relative overflow-auto\">\n <EditorContext.Provider value={editorContextValue}>\n <CodeMirror\n extensions={editorExtensions}\n basicSetup={{\n lineNumbers: false,\n searchKeymap: false,\n syntaxHighlighting: true,\n highlightActiveLine: true,\n highlightActiveLineGutter: true,\n foldGutter: false,\n }}\n className=\"rounded-md\"\n placeholder={placeholderText}\n value={content}\n theme=\"light\"\n minHeight=\"2rem\"\n editable={!disabled}\n onChange={handleContentChange}\n onBlur={onBlur}\n />\n {!disabled && (\n <CustomDialog\n dir={portalDirection}\n lang={portalLanguage}\n labels={{\n closeButtonLabel: t(\"dialogCloseLabel\"),\n title:\n selectedOption === SelectedOption.Image\n ? t(\"dialogTitleImage\")\n : selectedOption === SelectedOption.Video\n ? t(\"dialogTitleVideo\")\n : selectedOption === SelectedOption.Variable\n ? t(\"dialogTitleVariable\")\n : t(\"dialogTitle\"),\n }}\n >\n {selectedOption === SelectedOption.Image && (\n <ImageInject\n value={selectContentInfo?.value}\n onSelect={handleSelectImage}\n uploadProps={uploadProps}\n />\n )}\n {selectedOption === SelectedOption.Video && (\n <VideoInject\n value={selectContentInfo?.value}\n onSelect={handleSelectVideo}\n />\n )}\n </CustomDialog>\n )}\n\n {!disabled && (\n <CustomPopover dir={portalDirection} lang={portalLanguage}>\n <VariableSelect\n variables={variables}\n systemVariables={systemVariables}\n selectedName={selectContentInfo?.value?.variableName}\n onSelect={handleSelectVariable}\n onAddVariable={(variable) => {\n setVariables((prev) => {\n const normalized = variable.name.toLowerCase();\n const exists = prev.some(\n (item) => item.name.toLowerCase() === normalized\n );\n if (exists) {\n return prev;\n }\n return [variable, ...prev];\n });\n }}\n />\n </CustomPopover>\n )}\n </EditorContext.Provider>\n </div>\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["i18next","editorLocaleResources","lng","resource","initReactI18next","DEFAULT_EDITOR_LOCALE","EMPTY_VARIABLES","isCursorInsideVariableExpression","content","cursorPosition","regexp","createVariableExpressionRegexp","match","matchStart","matchEnd","innerStart","innerEnd","buildVariableTemplate","variableName","Editor","editMode","initialVariables","initialSystemVariables","onChange","onBlur","locale","lang","uploadProps","disabled","toolbarActionsRight","onReady","t","i18n","useTranslation","resolvedLocale","normalizeMarkdownFlowLocale","direction","getMarkdownFlowDirection","language","getMarkdownFlowLanguage","useEffect","currentStrings","getEditorLocaleMessages","toolbarLabels","useMemo","variableSearchLabels","placeholderText","normalizedSystemVariables","seen","variable","normalized","normalizedCustomVariables","systemNameSet","dialogOpen","setDialogOpen","useState","popoverOpen","setPopoverOpen","editorRootRef","useRef","portalLanguage","useDetachedLanguage","portalDirection","useResolvedDirection","popoverPosition","setPopoverPosition","variables","setVariables","systemVariables","setSystemVariables","selectedOption","setSelectedOption","SelectedOption","selectContentInfo","setSelectContentInfo","editorViewRef","pendingVariableContentRef","variableSearchAnchorRef","variableSearchOpen","setVariableSearchOpen","closeVariableSearch","useCallback","handleVariableSearchToggle","button","editorContextValue","addVariablesFromContent","text","names","extractVariableNames","prev","existingNames","addedNames","newVariables","rawName","onSelectedOption","option","state","pos","coords","insertText","dispatch","from","replaceSelection","selection","focusEditor","getContent","setContent","view","deleteSelectedContent","to","insertVariableContent","range","placeCursorAtEnd","template","cursorOffset","insertVariableTemplate","insertConfirmOutputMarker","insertLinkTemplate","insertButtonTemplate","insertSingleChoiceTemplate","optionLabel1","optionLabel2","insertMultiChoiceTemplate","insertInputFieldTemplate","handleSelectImage","resourceUrl","resourceTitle","scalePercent","textToInsert","getImageContentToInsert","handleSelectVideo","getVideoContentToInsert","handleSelectVariable","selectionRange","slashCommandsExtension","autocompletion","createSlashCommands","handleEditorUpdate","update","docText","handleTagClick","event","type","dataset","target","value","parseContentInfo","rect","anchorDirection","handleWrap","e","imagePlaceholderTitle","videoPlaceholderTitle","mediaPlaceholderLabelsExtension","mediaPlaceholderLabels","editorExtensions","extensions","EditorView","markdown","syntaxHighlighting","defaultHighlightStyle","SyntaxHighlighter","ImgPlaceholder","VideoPlaceholder","VariablePlaceholder","handleContentChange","isVariableSearchOpen","editorApi","handleToolbarActionClick","action","toolbarRightSlot","jsx","ariaLabel","jsxs","wrapped","Tooltip","TooltipTrigger","TooltipContent","EditorToolbar","VariableSearchDropdown","EditorContext","CodeMirror","CustomDialog","ImageInject","VideoInject","CustomPopover","VariableSelect","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MarkdownFlowEditor.es.js","sources":["../../../src/components/MarkdownFlowEditor/MarkdownFlowEditor.tsx"],"sourcesContent":["\"use client\";\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from \"react\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { autocompletion } from \"@codemirror/autocomplete\";\nimport { EditorView, ViewUpdate } from \"@codemirror/view\";\nimport { markdown } from \"@codemirror/lang-markdown\";\nimport {\n syntaxHighlighting,\n defaultHighlightStyle,\n} from \"@codemirror/language\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../ui/tooltip\";\nimport CustomDialog from \"./components/CustomDialog\";\nimport CustomPopover from \"./components/CustomPopover\";\nimport EditorToolbar from \"./components/EditorToolbar\";\nimport VariableSearchDropdown from \"./components/VariableSearchDropdown\";\nimport EditorContext from \"./editor-context\";\nimport ImageInject from \"./components/ImageInject\";\nimport VideoInject from \"./components/VideoInject\";\nimport VariableSelect from \"./components/VariableSelect\";\nimport {\n SelectedOption,\n IEditorContext,\n Variable,\n SelectContentInfo,\n PopoverPosition,\n EditorAction,\n EditorApi,\n} from \"./types\";\nimport \"./markdownFlowEditor.css\";\n\nimport {\n createSlashCommands,\n parseContentInfo,\n getImageContentToInsert,\n getVideoContentToInsert,\n extractVariableNames,\n createVariableExpressionRegexp,\n} from \"./utils\";\nimport ImgPlaceholder from \"./plugins/ImgPlaceholder\";\nimport VideoPlaceholder from \"./plugins/VideoPlaceholder\";\nimport { mediaPlaceholderLabels } from \"./plugins/mediaPlaceholderLabels\";\nimport VariablePlaceholder from \"./plugins/VariablePlaceholder\";\nimport SyntaxHighlighter from \"./plugins/SyntaxHighlighter\";\n// import createFixedTextPlaceholder from \"./plugins/FixedTextPlaceholder\";\n// import DividerPlaceholder from \"./plugins/DividerPlaceholder\";\nimport { initReactI18next, useTranslation } from \"react-i18next\";\nimport i18next from \"i18next\";\nimport { UploadProps } from \"./uploadTypes\";\nimport {\n DEFAULT_EDITOR_LOCALE,\n editorLocaleResources,\n getEditorLocaleMessages,\n} from \"./editorI18n\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n normalizeMarkdownFlowLocale,\n type MarkdownFlowLocale,\n} from \"../../lib/locale\";\nimport { useDetachedLanguage } from \"../../lib/useDetachedLanguage\";\nimport { useResolvedDirection } from \"../../lib/useResolvedDirection\";\n\nif (!i18next.isInitialized) {\n i18next.use(initReactI18next).init({\n resources: editorLocaleResources,\n lng: DEFAULT_EDITOR_LOCALE,\n fallbackLng: DEFAULT_EDITOR_LOCALE,\n interpolation: { escapeValue: false },\n });\n} else {\n Object.entries(editorLocaleResources).forEach(([lng, resource]) => {\n i18next.addResourceBundle(\n lng,\n \"translation\",\n resource.translation,\n true,\n true\n );\n });\n}\n\nexport enum EditMode {\n CodeEdit = \"codeEdit\",\n QuickEdit = \"quickEdit\",\n}\n\ntype EditorProps = {\n content?: string;\n editMode?: EditMode;\n variables?: Variable[];\n systemVariables?: Variable[];\n onChange?: (value: string) => void;\n onBlur?: () => void;\n locale?: MarkdownFlowLocale;\n /** Overrides the locale-derived language. */\n lang?: string;\n uploadProps?: UploadProps;\n disabled?: boolean;\n toolbarActionsRight?: EditorAction[];\n onReady?: (api: EditorApi) => void;\n};\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\n// Detect whether cursor is still inside a {{variable}} expression\nconst isCursorInsideVariableExpression = (\n content: string,\n cursorPosition: number\n) => {\n if (!content || cursorPosition < 0) {\n return false;\n }\n const regexp = createVariableExpressionRegexp();\n let match: RegExpExecArray | null;\n\n while ((match = regexp.exec(content)) !== null) {\n const matchStart = match.index ?? 0;\n const matchEnd = matchStart + match[0].length;\n const innerStart = matchStart + 2;\n const innerEnd = matchEnd - 2;\n if (cursorPosition >= innerStart && cursorPosition <= innerEnd) {\n return true;\n }\n if (regexp.lastIndex === match.index) {\n regexp.lastIndex++;\n }\n }\n\n return false;\n};\n\nconst buildVariableTemplate = (variableName = \"\") => `{{${variableName}}}`;\n\nconst Editor: React.FC<EditorProps> = ({\n content = \"\",\n editMode = EditMode.CodeEdit,\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n onChange,\n onBlur,\n locale,\n lang,\n uploadProps,\n disabled = false,\n toolbarActionsRight,\n onReady,\n}) => {\n const { t, i18n } = useTranslation();\n const resolvedLocale = normalizeMarkdownFlowLocale(\n locale ?? DEFAULT_EDITOR_LOCALE\n );\n const direction = getMarkdownFlowDirection(locale);\n const language = lang ?? getMarkdownFlowLanguage(locale);\n\n useEffect(() => {\n if (i18n.language !== resolvedLocale) {\n i18n.changeLanguage(resolvedLocale);\n }\n }, [i18n, resolvedLocale]);\n\n const currentStrings = getEditorLocaleMessages(resolvedLocale);\n const toolbarLabels = useMemo(\n () => ({\n image: t(\"toolbarInsertImage\", {\n defaultValue: \"Insert image\",\n }),\n video: t(\"toolbarInsertVideo\", {\n defaultValue: \"Insert video\",\n }),\n variable: t(\"slashVariable\", {\n defaultValue: \"Variable\",\n }),\n addVariable: t(\"toolbarInsertNewVariable\", {\n defaultValue: \"Insert new variable\",\n }),\n search: t(\"toolbarInsertExistingVariable\", {\n defaultValue: \"Insert existing variable\",\n }),\n confirmOutput: t(\"toolbarConfirmOutput\", {\n defaultValue: \"Confirm output\",\n }),\n insertLink: t(\"toolbarInsertLink\", {\n defaultValue: \"Insert link\",\n }),\n insertButton: t(\"toolbarInsertButton\", {\n defaultValue: \"Insert button\",\n }),\n insertSingleChoice: t(\"toolbarInsertSingleChoice\", {\n defaultValue: \"Insert single choice\",\n }),\n insertMultiChoice: t(\"toolbarInsertMultiChoice\", {\n defaultValue: \"Insert multi choice\",\n }),\n insertInput: t(\"toolbarInsertInput\", {\n defaultValue: \"Insert input\",\n }),\n singleChoiceOption1: t(\"toolbarChoiceOption1\", {\n defaultValue: \"Option 1\",\n }),\n singleChoiceOption2: t(\"toolbarChoiceOption2\", {\n defaultValue: \"Option 2\",\n }),\n inputPlaceholder: t(\"toolbarInputPlaceholder\", {\n defaultValue: \"Please enter\",\n }),\n }),\n [t]\n );\n const variableSearchLabels = useMemo(\n () => ({\n searchPlaceholder: t(\"variableSearchPlaceholder\", {\n defaultValue: \"Search variable\",\n }),\n systemLabel: t(\"variableSectionSystem\", \"System Variables\"),\n customLabel: t(\"variableSectionCustom\", \"Custom Variables\"),\n emptyLabel: t(\"variableNotFound\", \"No variables found\"),\n }),\n [t]\n );\n const placeholderText =\n editMode === EditMode.QuickEdit\n ? t(\"placeholderQuickEdit\", {\n defaultValue: t(\"placeholderCodeEdit\", {\n defaultValue: t(\"placeholder\"),\n }),\n })\n : t(\"placeholderCodeEdit\", { defaultValue: t(\"placeholder\") });\n // Normalize variables to avoid duplicating system variables in the custom list\n const normalizedSystemVariables = useMemo(() => {\n const seen = new Set<string>();\n return (initialSystemVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (!normalized || seen.has(normalized)) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialSystemVariables]);\n\n const normalizedCustomVariables = useMemo(() => {\n const systemNameSet = new Set(\n normalizedSystemVariables.map((variable) => variable.name.toLowerCase())\n );\n const seen = new Set<string>();\n return (initialVariables ?? EMPTY_VARIABLES).filter((variable) => {\n const normalized =\n typeof variable?.name === \"string\" ? variable.name.toLowerCase() : \"\";\n if (\n !normalized ||\n systemNameSet.has(normalized) ||\n seen.has(normalized)\n ) {\n return false;\n }\n seen.add(normalized);\n return true;\n });\n }, [initialVariables, normalizedSystemVariables]);\n\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const editorRootRef = useRef<HTMLDivElement>(null);\n const portalLanguage = useDetachedLanguage(editorRootRef, language);\n const { resolvedDirection: portalDirection } = useResolvedDirection(\n editorRootRef,\n direction\n );\n const [popoverPosition, setPopoverPosition] =\n useState<PopoverPosition | null>(null);\n const [variables, setVariables] = useState<Variable[]>(\n normalizedCustomVariables\n );\n const [systemVariables, setSystemVariables] = useState<Variable[]>(\n normalizedSystemVariables\n );\n\n useEffect(() => {\n setVariables(normalizedCustomVariables);\n }, [normalizedCustomVariables]);\n\n useEffect(() => {\n setSystemVariables(normalizedSystemVariables);\n }, [normalizedSystemVariables]);\n\n const [selectedOption, setSelectedOption] = useState<SelectedOption>(\n SelectedOption.Empty\n );\n const [selectContentInfo, setSelectContentInfo] =\n useState<SelectContentInfo | null>();\n const editorViewRef = useRef<EditorView | null>(null);\n const pendingVariableContentRef = useRef<string | null>(null);\n const variableSearchAnchorRef = useRef<HTMLButtonElement | null>(null);\n const [variableSearchOpen, setVariableSearchOpen] = useState(false);\n const closeVariableSearch = useCallback(() => {\n setVariableSearchOpen(false);\n variableSearchAnchorRef.current = null;\n }, []);\n const handleVariableSearchToggle = useCallback(\n (button: HTMLButtonElement) => {\n if (disabled) {\n return;\n }\n if (variableSearchOpen && variableSearchAnchorRef.current === button) {\n closeVariableSearch();\n return;\n }\n variableSearchAnchorRef.current = button;\n setVariableSearchOpen(true);\n },\n [closeVariableSearch, disabled, variableSearchOpen]\n );\n\n const editorContextValue: IEditorContext = {\n selectedOption,\n setSelectedOption,\n dialogOpen,\n setDialogOpen,\n popoverOpen,\n setPopoverOpen,\n popoverPosition,\n setPopoverPosition,\n };\n\n useEffect(() => {\n if (!disabled) {\n return;\n }\n setDialogOpen(false);\n setPopoverOpen(false);\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n setPopoverPosition(null);\n closeVariableSearch();\n }, [\n closeVariableSearch,\n disabled,\n setDialogOpen,\n setPopoverOpen,\n setPopoverPosition,\n setSelectedOption,\n setSelectContentInfo,\n ]);\n\n const addVariablesFromContent = useCallback(\n (text: string) => {\n if (editMode !== EditMode.QuickEdit || !text) {\n return;\n }\n\n const names = extractVariableNames(text);\n if (!names.length) {\n return;\n }\n\n const systemNameSet = new Set(\n systemVariables.map((variable) => variable.name.toLowerCase())\n );\n\n setVariables((prev) => {\n const existingNames = new Set(\n prev.map((variable) => variable.name.toLowerCase())\n );\n const addedNames = new Set<string>();\n const newVariables: Variable[] = [];\n\n names.forEach((rawName) => {\n const normalized = rawName.toLowerCase();\n if (\n !rawName ||\n systemNameSet.has(normalized) ||\n existingNames.has(normalized) ||\n addedNames.has(normalized)\n ) {\n return;\n }\n newVariables.push({ name: rawName });\n addedNames.add(normalized);\n });\n\n if (!newVariables.length) {\n return prev;\n }\n\n return [...newVariables, ...prev];\n });\n },\n [editMode, systemVariables]\n );\n\n useEffect(() => {\n addVariablesFromContent(content);\n }, [content, addVariablesFromContent]);\n\n // const insertFixedText = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const selectedText = state.sliceDoc(selection.from, selection.to);\n // const startTag = \"===\";\n // const endTag = \"===\";\n // const insertContent = `${startTag}${selectedText ?? \"\"}${endTag}`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + startTag.length + (selectedText?.length ?? 0),\n // },\n // });\n // view.focus();\n // }, []);\n\n // const insertDivider = useCallback(() => {\n // if (!editorViewRef.current) return;\n // const view = editorViewRef.current;\n // const { state, dispatch } = view;\n // const selection = state.selection.main;\n // const insertContent = `\\n\\n---\\n\\n`;\n\n // dispatch({\n // changes: {\n // from: selection.from,\n // to: selection.to,\n // insert: insertContent,\n // },\n // selection: {\n // anchor: selection.from + insertContent.length,\n // },\n // });\n // view.focus();\n // }, []);\n\n const onSelectedOption = useCallback(\n (option: SelectedOption) => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n // if (option === SelectedOption.FixedText) {\n // insertFixedText();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n // if (option === SelectedOption.Divider) {\n // insertDivider();\n // setSelectedOption(SelectedOption.Empty);\n // setDialogOpen(false);\n // setPopoverOpen(false);\n // setSelectContentInfo(null);\n // setPopoverPosition(null);\n // return;\n // }\n\n setSelectedOption(option);\n\n if (option === SelectedOption.Variable) {\n if (editorViewRef.current) {\n const { state } = editorViewRef.current;\n const pos = state.selection.main.from;\n const coords = editorViewRef.current.coordsAtPos(pos);\n if (coords) {\n setPopoverPosition({\n x: coords.left,\n y: coords.bottom,\n });\n }\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [closeVariableSearch, disabled]\n );\n\n const insertText = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) return;\n\n const { state, dispatch } = editorViewRef.current;\n const from = state.selection.main.from;\n\n dispatch({\n changes: { from, insert: text },\n selection: { anchor: from + text.length },\n });\n },\n [editorViewRef, disabled]\n );\n\n const replaceSelection = useCallback(\n (text: string) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const { state, dispatch } = editorViewRef.current;\n const selection = state.selection.main;\n dispatch({\n changes: { from: selection.from, to: selection.to, insert: text },\n selection: { anchor: selection.from + text.length },\n });\n },\n [disabled]\n );\n\n const focusEditor = useCallback(() => {\n editorViewRef.current?.focus();\n }, []);\n\n const getContent = useCallback(() => {\n return editorViewRef.current?.state.doc.toString() ?? \"\";\n }, []);\n\n const setContent = useCallback(\n (text: string) => {\n if (disabled) {\n return;\n }\n if (!editorViewRef.current) {\n onChange?.(text);\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n dispatch({\n changes: { from: 0, to: state.doc.length, insert: text },\n selection: { anchor: text.length },\n });\n },\n [disabled, onChange]\n );\n\n const deleteSelectedContent = useCallback(() => {\n if (disabled) {\n return;\n }\n if (\n !selectContentInfo ||\n !editorViewRef.current ||\n selectContentInfo.from === -1\n )\n return;\n\n const { from, to } = selectContentInfo;\n const { dispatch } = editorViewRef.current;\n\n dispatch({\n changes: { from, to, insert: \"\" },\n });\n }, [selectContentInfo, editorViewRef, disabled]);\n\n const insertVariableContent = useCallback(\n (\n variableName: string,\n range?: { from: number; to: number },\n placeCursorAtEnd = false\n ) => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = range ?? state.selection.main;\n const template = buildVariableTemplate(variableName);\n const cursorOffset = placeCursorAtEnd\n ? template.length\n : 2 + variableName.length; // 2 braces before variable content\n\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + cursorOffset,\n },\n });\n view.focus();\n },\n [disabled]\n );\n\n const insertVariableTemplate = useCallback(() => {\n if (disabled) {\n return;\n }\n closeVariableSearch();\n insertVariableContent(\"\");\n }, [closeVariableSearch, disabled, insertVariableContent]);\n\n const insertConfirmOutputMarker = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"======\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 3,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertLinkTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"[]()\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 1,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertButtonTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const template = \"?[]\";\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 2,\n },\n });\n view.focus();\n }, [disabled]);\n\n const insertSingleChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} | ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertMultiChoiceTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const optionLabel1 = toolbarLabels.singleChoiceOption1;\n const optionLabel2 = toolbarLabels.singleChoiceOption2;\n const template = `?[%{{}} ${optionLabel1} || ${optionLabel2}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [\n disabled,\n toolbarLabels.singleChoiceOption1,\n toolbarLabels.singleChoiceOption2,\n ]);\n\n const insertInputFieldTemplate = useCallback(() => {\n if (disabled || !editorViewRef.current) {\n return;\n }\n const view = editorViewRef.current;\n const { state, dispatch } = view;\n const selection = state.selection.main;\n const placeholder = toolbarLabels.inputPlaceholder ?? \"请输入\";\n const template = `?[%{{}}...${placeholder}]`;\n dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert: template,\n },\n selection: {\n anchor: selection.from + 5,\n },\n });\n view.focus();\n }, [disabled, toolbarLabels.inputPlaceholder]);\n\n const handleSelectImage = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n }: {\n resourceUrl?: string;\n resourceTitle?: string;\n scalePercent?: number;\n }) => {\n if (!resourceUrl || disabled) return;\n const textToInsert = getImageContentToInsert({\n resourceUrl,\n resourceTitle,\n scalePercent,\n });\n if (selectContentInfo?.type === SelectedOption.Image) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVideo = useCallback(\n ({\n resourceUrl,\n resourceTitle,\n }: {\n resourceUrl: string;\n resourceTitle: string;\n }) => {\n if (disabled) {\n return;\n }\n const textToInsert = getVideoContentToInsert(resourceUrl, resourceTitle);\n if (selectContentInfo?.type === SelectedOption.Video) {\n deleteSelectedContent();\n if (!editorViewRef.current) return;\n const { dispatch } = editorViewRef.current;\n dispatch({\n changes: { from: selectContentInfo.from, insert: textToInsert },\n });\n } else {\n insertText(textToInsert);\n }\n setDialogOpen(false);\n },\n [deleteSelectedContent, disabled, insertText, selectContentInfo]\n );\n\n const handleSelectVariable = useCallback(\n (variable: Variable) => {\n if (disabled) {\n return;\n }\n const selectionRange =\n selectContentInfo?.type === SelectedOption.Variable\n ? { from: selectContentInfo.from, to: selectContentInfo.to }\n : undefined;\n insertVariableContent(variable.name, selectionRange, true);\n setPopoverOpen(false);\n closeVariableSearch();\n },\n [disabled, insertVariableContent, selectContentInfo, closeVariableSearch]\n );\n\n const slashCommandsExtension = useCallback(() => {\n return autocompletion({\n override: [\n createSlashCommands(onSelectedOption, {\n // divider: currentStrings.slashDivider,\n // fixedText: currentStrings.slashFixedText,\n image: currentStrings.slashImage,\n video: currentStrings.slashVideo,\n variable: currentStrings.slashVariable,\n }),\n ],\n });\n }, [\n // currentStrings.slashDivider,\n // currentStrings.slashFixedText,\n currentStrings.slashImage,\n currentStrings.slashVideo,\n currentStrings.slashVariable,\n onSelectedOption,\n ]);\n\n // const fixedTextPlaceholderExtension = useMemo(\n // () =>\n // createFixedTextPlaceholder(\n // currentStrings.fixedTextPlaceholder ?? \"添加固定文本\",\n // currentStrings.fixedTextTooltip ??\n // currentStrings.slashFixedText ??\n // \"固定文本\"\n // ),\n // [\n // currentStrings.fixedTextPlaceholder,\n // currentStrings.fixedTextTooltip,\n // currentStrings.slashFixedText,\n // ]\n // );\n\n const handleEditorUpdate = useCallback(\n (update: ViewUpdate) => {\n editorViewRef.current = update.view;\n if (\n editMode === EditMode.QuickEdit &&\n pendingVariableContentRef.current &&\n update.selectionSet\n ) {\n const cursorPosition = update.state.selection.main.head;\n const docText = update.state.doc.toString();\n const stillInside = isCursorInsideVariableExpression(\n docText,\n cursorPosition\n );\n if (!stillInside) {\n addVariablesFromContent(docText);\n pendingVariableContentRef.current = null;\n }\n }\n },\n [addVariablesFromContent, editMode]\n );\n\n const handleTagClick = useCallback(\n (event: any) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n const { type, from, to, dataset, target } = event.detail;\n const value = parseContentInfo(type, dataset);\n setSelectContentInfo({\n type,\n value,\n from,\n to,\n });\n setSelectedOption(type);\n\n if (type === SelectedOption.Variable) {\n if (target) {\n const rect = target.getBoundingClientRect();\n const anchorDirection =\n target.ownerDocument.defaultView?.getComputedStyle(\n editorRootRef.current ?? target\n ).direction;\n setPopoverPosition({\n x: anchorDirection === \"rtl\" ? rect.right : rect.left,\n y: rect.bottom,\n });\n }\n setPopoverOpen(true);\n } else {\n setDialogOpen(true);\n }\n },\n [disabled]\n );\n\n useEffect(() => {\n if (!dialogOpen) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [dialogOpen]);\n\n useEffect(() => {\n if (!popoverOpen && selectedOption === SelectedOption.Variable) {\n setSelectedOption(SelectedOption.Empty);\n setSelectContentInfo(null);\n }\n }, [popoverOpen, selectedOption]);\n\n useEffect(() => {\n const handleWrap = (e: any) => {\n if (e.detail.view === editorViewRef.current) {\n handleTagClick(e);\n }\n };\n window.addEventListener(\"globalTagClick\", handleWrap);\n return () => {\n window.removeEventListener(\"globalTagClick\", handleWrap);\n };\n }, [handleTagClick]);\n\n const imagePlaceholderTitle = t(\"imageDefaultTitle\");\n const videoPlaceholderTitle = t(\"videoDefaultTitle\");\n const mediaPlaceholderLabelsExtension = useMemo(\n () =>\n mediaPlaceholderLabels.of({\n image: imagePlaceholderTitle,\n video: videoPlaceholderTitle,\n }),\n [imagePlaceholderTitle, videoPlaceholderTitle]\n );\n\n const editorExtensions = useMemo(() => {\n const extensions = [\n EditorView.lineWrapping,\n markdown(),\n syntaxHighlighting(defaultHighlightStyle),\n SyntaxHighlighter,\n ];\n\n if (!disabled) {\n extensions.push(slashCommandsExtension());\n }\n\n if (editMode === EditMode.QuickEdit) {\n extensions.push(\n mediaPlaceholderLabelsExtension,\n ImgPlaceholder,\n VideoPlaceholder,\n VariablePlaceholder\n // fixedTextPlaceholderExtension,\n // DividerPlaceholder,\n );\n }\n\n extensions.push(\n EditorView.updateListener.of((update) => {\n handleEditorUpdate(update);\n })\n );\n\n return extensions;\n }, [\n disabled,\n editMode,\n slashCommandsExtension,\n handleEditorUpdate,\n mediaPlaceholderLabelsExtension,\n ]);\n\n const handleContentChange = useCallback(\n (value: string) => {\n if (disabled) {\n return;\n }\n const cursorPosition =\n editorViewRef.current?.state.selection.main.head ?? -1;\n const skipAddition = isCursorInsideVariableExpression(\n value,\n cursorPosition\n );\n if (skipAddition) {\n pendingVariableContentRef.current = value;\n } else {\n pendingVariableContentRef.current = null;\n addVariablesFromContent(value);\n }\n onChange?.(value);\n },\n [addVariablesFromContent, onChange, disabled]\n );\n\n const isVariableSearchOpen = !disabled && variableSearchOpen;\n const editorApi = useMemo(\n () => ({\n insertTextAtCursor: insertText,\n replaceSelection,\n focus: focusEditor,\n getContent,\n setContent,\n }),\n [focusEditor, getContent, insertText, replaceSelection, setContent]\n );\n\n const handleToolbarActionClick = useCallback(\n (action: EditorAction) => {\n if (disabled || \"render\" in action) {\n return;\n }\n action.onClick?.(editorApi);\n },\n [disabled, editorApi]\n );\n\n const toolbarRightSlot = useMemo(() => {\n if (!toolbarActionsRight?.length) {\n return null;\n }\n return (\n <div className=\"markdown-flow-editor-toolbar-right\">\n {toolbarActionsRight.map((action) => {\n if (\"render\" in action) {\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {action.render(editorApi)}\n </div>\n );\n }\n const ariaLabel = action.label || action.tooltip || undefined;\n const button = (\n <button\n type=\"button\"\n key={action.key}\n disabled={disabled || action.disabled}\n onClick={() => handleToolbarActionClick(action)}\n className=\"markdown-flow-editor-toolbar-right-button\"\n aria-label={ariaLabel}\n title={action.label || action.tooltip}\n >\n {action.icon ? (\n <span className=\"toolbar-right-icon\">{action.icon}</span>\n ) : null}\n {action.label ? (\n <span className=\"toolbar-right-label\">{action.label}</span>\n ) : null}\n </button>\n );\n const wrapped = action.tooltip ? (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"top\"\n dir={portalDirection}\n lang={portalLanguage}\n >\n {action.tooltip}\n </TooltipContent>\n </Tooltip>\n ) : (\n button\n );\n return (\n <div\n className=\"markdown-flow-editor-toolbar-right-item\"\n key={action.key}\n >\n {wrapped}\n </div>\n );\n })}\n </div>\n );\n }, [\n disabled,\n editorApi,\n handleToolbarActionClick,\n portalDirection,\n portalLanguage,\n toolbarActionsRight,\n ]);\n\n useEffect(() => {\n onReady?.(editorApi);\n }, [editorApi]);\n\n return (\n <div\n className=\"markdown-flow-editor\"\n ref={editorRootRef}\n dir={direction}\n lang={language}\n data-disabled={disabled ? \"true\" : undefined}\n aria-disabled={disabled}\n >\n <EditorToolbar\n disabled={disabled}\n labels={toolbarLabels}\n tooltipDirection={portalDirection}\n tooltipLanguage={portalLanguage}\n onSelect={onSelectedOption}\n onInsertVariablePlaceholder={insertVariableTemplate}\n onVariableSearchToggle={handleVariableSearchToggle}\n onVariableSearchClose={closeVariableSearch}\n onInsertConfirmOutput={insertConfirmOutputMarker}\n onInsertLink={insertLinkTemplate}\n onInsertButton={insertButtonTemplate}\n onInsertSingleChoice={insertSingleChoiceTemplate}\n onInsertMultiChoice={insertMultiChoiceTemplate}\n onInsertInputField={insertInputFieldTemplate}\n variableSearchActive={isVariableSearchOpen}\n rightSlot={toolbarRightSlot}\n />\n <VariableSearchDropdown\n open={isVariableSearchOpen}\n anchorElement={variableSearchAnchorRef.current}\n onClose={closeVariableSearch}\n onSelect={handleSelectVariable}\n variables={variables}\n systemVariables={systemVariables}\n labels={variableSearchLabels}\n />\n <div className=\"markdown-flow-editor-body relative overflow-auto\">\n <EditorContext.Provider value={editorContextValue}>\n <CodeMirror\n extensions={editorExtensions}\n basicSetup={{\n lineNumbers: false,\n searchKeymap: false,\n syntaxHighlighting: true,\n highlightActiveLine: true,\n highlightActiveLineGutter: true,\n foldGutter: false,\n }}\n className=\"rounded-md\"\n placeholder={placeholderText}\n value={content}\n theme=\"light\"\n minHeight=\"2rem\"\n editable={!disabled}\n onChange={handleContentChange}\n onBlur={onBlur}\n />\n {!disabled && (\n <CustomDialog\n dir={portalDirection}\n lang={portalLanguage}\n labels={{\n closeButtonLabel: t(\"dialogCloseLabel\"),\n title:\n selectedOption === SelectedOption.Image\n ? t(\"dialogTitleImage\")\n : selectedOption === SelectedOption.Video\n ? t(\"dialogTitleVideo\")\n : selectedOption === SelectedOption.Variable\n ? t(\"dialogTitleVariable\")\n : t(\"dialogTitle\"),\n }}\n >\n {selectedOption === SelectedOption.Image && (\n <ImageInject\n value={selectContentInfo?.value}\n onSelect={handleSelectImage}\n uploadProps={uploadProps}\n />\n )}\n {selectedOption === SelectedOption.Video && (\n <VideoInject\n value={selectContentInfo?.value}\n onSelect={handleSelectVideo}\n />\n )}\n </CustomDialog>\n )}\n\n {!disabled && (\n <CustomPopover dir={portalDirection} lang={portalLanguage}>\n <VariableSelect\n variables={variables}\n systemVariables={systemVariables}\n selectedName={selectContentInfo?.value?.variableName}\n onSelect={handleSelectVariable}\n onAddVariable={(variable) => {\n setVariables((prev) => {\n const normalized = variable.name.toLowerCase();\n const exists = prev.some(\n (item) => item.name.toLowerCase() === normalized\n );\n if (exists) {\n return prev;\n }\n return [variable, ...prev];\n });\n }}\n />\n </CustomPopover>\n )}\n </EditorContext.Provider>\n </div>\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["i18next","editorLocaleResources","lng","resource","initReactI18next","DEFAULT_EDITOR_LOCALE","EMPTY_VARIABLES","isCursorInsideVariableExpression","content","cursorPosition","regexp","createVariableExpressionRegexp","match","matchStart","matchEnd","innerStart","innerEnd","buildVariableTemplate","variableName","Editor","editMode","initialVariables","initialSystemVariables","onChange","onBlur","locale","lang","uploadProps","disabled","toolbarActionsRight","onReady","t","i18n","useTranslation","resolvedLocale","normalizeMarkdownFlowLocale","direction","getMarkdownFlowDirection","language","getMarkdownFlowLanguage","useEffect","currentStrings","getEditorLocaleMessages","toolbarLabels","useMemo","variableSearchLabels","placeholderText","normalizedSystemVariables","seen","variable","normalized","normalizedCustomVariables","systemNameSet","dialogOpen","setDialogOpen","useState","popoverOpen","setPopoverOpen","editorRootRef","useRef","portalLanguage","useDetachedLanguage","portalDirection","useResolvedDirection","popoverPosition","setPopoverPosition","variables","setVariables","systemVariables","setSystemVariables","selectedOption","setSelectedOption","SelectedOption","selectContentInfo","setSelectContentInfo","editorViewRef","pendingVariableContentRef","variableSearchAnchorRef","variableSearchOpen","setVariableSearchOpen","closeVariableSearch","useCallback","handleVariableSearchToggle","button","editorContextValue","addVariablesFromContent","text","names","extractVariableNames","prev","existingNames","addedNames","newVariables","rawName","onSelectedOption","option","state","pos","coords","insertText","dispatch","from","replaceSelection","selection","focusEditor","getContent","setContent","view","deleteSelectedContent","to","insertVariableContent","range","placeCursorAtEnd","template","cursorOffset","insertVariableTemplate","insertConfirmOutputMarker","insertLinkTemplate","insertButtonTemplate","insertSingleChoiceTemplate","optionLabel1","optionLabel2","insertMultiChoiceTemplate","insertInputFieldTemplate","handleSelectImage","resourceUrl","resourceTitle","scalePercent","textToInsert","getImageContentToInsert","handleSelectVideo","getVideoContentToInsert","handleSelectVariable","selectionRange","slashCommandsExtension","autocompletion","createSlashCommands","handleEditorUpdate","update","docText","handleTagClick","event","type","dataset","target","value","parseContentInfo","rect","anchorDirection","handleWrap","e","imagePlaceholderTitle","videoPlaceholderTitle","mediaPlaceholderLabelsExtension","mediaPlaceholderLabels","editorExtensions","extensions","EditorView","markdown","syntaxHighlighting","defaultHighlightStyle","SyntaxHighlighter","ImgPlaceholder","VideoPlaceholder","VariablePlaceholder","handleContentChange","isVariableSearchOpen","editorApi","handleToolbarActionClick","action","toolbarRightSlot","jsx","ariaLabel","jsxs","wrapped","Tooltip","TooltipTrigger","TooltipContent","EditorToolbar","VariableSearchDropdown","EditorContext","CodeMirror","CustomDialog","ImageInject","VideoInject","CustomPopover","VariableSelect","item"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),a=require("react"),M=require("../../ui/input.cjs"),v=require("../../ui/button.cjs"),L=require("../../../lib/utils.cjs"),
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),a=require("react"),M=require("../../ui/input.cjs"),v=require("../../ui/button.cjs"),L=require("../../../lib/utils.cjs"),Q=require("../../../_virtual/index.cjs"),$=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),O=require("../../../node_modules/lucide-react/dist/esm/icons/search.cjs"),y=require("../../../node_modules/lucide-react/dist/esm/icons/check.cjs"),U=require("../../../node_modules/lucide-react/dist/esm/icons/x.cjs"),Y=require("../../../node_modules/lucide-react/dist/esm/icons/plus.cjs"),z=[],G=({variables:D,systemVariables:P,selectedName:r,onSelect:l,onAddVariable:B})=>{const{t}=$.useTranslation(),o=D??z,R=P??z,[i,w]=a.useState(o);a.useEffect(()=>{w(o)},[o]);const c=R,[d,V]=a.useState(""),[T,u]=a.useState(!1),[S,m]=a.useState(""),[x,f]=a.useState(!1),[C,h]=a.useState(!1),b=()=>{f(!1),h(!1)},n=d.toLowerCase(),E=s=>{const N=s.name.toLowerCase().includes(n),A=s.label?s.label.toLowerCase().includes(n):!1;return N||A},p=a.useMemo(()=>c.filter(E),[c,n]),g=a.useMemo(()=>i.filter(E),[i,n]),_=p.length>0||g.length>0,k=()=>{const s=Q.distExports.normalizeVariableName(S);if(!s){h(!0),f(!1);return}const N=s.toLowerCase();if([...i,...c].some(j=>j.name.toLowerCase()===N)){f(!0),h(!1);return}const I={name:s};w(j=>[I,...j]),B?.({name:s}),m(""),u(!1),V(""),b(),l?.(I)},q=()=>{u(!1),m(""),b()},F=s=>{m(s.target.value),(x||C)&&b()},K=s=>{s.key==="Enter"?k():s.key==="Escape"&&q()};return e.jsxs("div",{className:"w-full max-w-sm rounded-lg border bg-white",children:[e.jsxs("div",{className:"relative",children:[e.jsx(O.default,{className:"absolute start-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground"}),e.jsx(M.Input,{type:"text",placeholder:t("variableSearchPlaceholder","Search variable"),value:d,onChange:s=>V(s.target.value),className:"ps-8 h-8 border-0 focus-visible:ring-0 focus-visible:ring-offset-0"})]}),e.jsx("div",{className:"max-h-[300px] overflow-y-auto p-2",children:_?e.jsxs("div",{className:"space-y-4",children:[p.length>0&&e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"px-3 text-xs font-medium text-muted-foreground",children:t("variableSectionSystem","System Variables")}),e.jsx("div",{className:"space-y-1",children:p.map(s=>e.jsxs("button",{onClick:()=>l?.(s),className:L.cn("flex w-full items-start justify-between rounded-md px-3 py-2 text-start transition-colors hover:bg-accent",r===s.name&&"bg-accent"),children:[e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{className:"text-sm font-medium text-foreground",children:s.name}),s.label&&e.jsx("span",{className:"text-xs text-muted-foreground",children:s.label})]}),r===s.name&&e.jsx(y.default,{className:"mt-1 h-4 w-4 text-foreground"})]},`system-${s.name}`))})]}),g.length>0&&e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"px-3 text-xs font-medium text-muted-foreground",children:t("variableSectionCustom","Custom Variables")}),e.jsx("div",{className:"space-y-1",children:g.map(s=>e.jsxs("button",{onClick:()=>l?.(s),className:L.cn("flex w-full items-start justify-between rounded-md px-3 py-2 text-start transition-colors hover:bg-accent",r===s.name&&"bg-accent"),children:[e.jsxs("div",{className:"flex flex-col",children:[e.jsx("span",{className:"text-sm font-medium text-foreground",children:s.name}),s.label&&e.jsx("span",{className:"text-xs text-muted-foreground",children:s.label})]}),r===s.name&&e.jsx(y.default,{className:"mt-1 h-4 w-4 text-foreground"})]},`custom-${s.name}`))})]})]}):e.jsx("div",{className:"px-3 py-6 text-center text-sm text-muted-foreground",children:d?t("variableNotFound","No variables found"):t("variableEmpty","No variables yet")})}),e.jsx("div",{className:"border-t border-border p-2",children:T?e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 rounded-md border border-border bg-background px-3 py-2",children:[e.jsx(M.Input,{type:"text",placeholder:t("variableNamePlaceholder","Variable name"),value:S,onChange:F,onKeyDown:K,autoFocus:!0,className:"h-8 flex-1 border-0 px-0 focus-visible:ring-0 focus-visible:ring-offset-0"}),e.jsx(v.Button,{variant:"ghost",size:"icon",onClick:q,className:"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground",children:e.jsx(U.default,{className:"h-4 w-4"})}),e.jsx(v.Button,{variant:"ghost",size:"icon",onClick:k,className:"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground",children:e.jsx(y.default,{className:"h-4 w-4"})})]}),(x||C)&&e.jsx("p",{className:"mt-1 px-3 text-xs text-red-500",children:x?t("variableAlreadyExists","Variable already exists"):t("variableNameInvalid","Use a non-empty name without spaces or braces")})]}):e.jsxs(v.Button,{variant:"ghost",size:"sm",onClick:()=>u(!0),className:"w-full justify-start text-muted-foreground hover:text-foreground",children:[e.jsx(Y.default,{className:"me-2 h-4 w-4"}),t("variableAddNew","Add new variable")]})})]})};exports.default=G;
|
|
2
2
|
//# sourceMappingURL=VariableSelect.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariableSelect.cjs","sources":["../../../../src/components/MarkdownFlowEditor/components/VariableSelect.tsx"],"sourcesContent":["import type React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Search, Plus, Check, X } from \"lucide-react\";\nimport { Input } from \"../../ui/input\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../../lib/utils\";\nimport { Variable } from \"../types\";\nimport { isValidVariableName } from \"../utils\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface VariableSelectProps {\n variables?: Variable[];\n systemVariables?: Variable[];\n selectedName?: string;\n onSelect?: (variable: Variable) => void;\n onAddVariable?: (variable: Variable) => void;\n}\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\nconst VariableSelect = ({\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n selectedName,\n onSelect,\n onAddVariable,\n}: VariableSelectProps) => {\n const { t } = useTranslation();\n const safeInitialVariables = initialVariables ?? EMPTY_VARIABLES;\n const safeInitialSystemVariables = initialSystemVariables ?? EMPTY_VARIABLES;\n\n const [variables, setVariables] = useState<Variable[]>(safeInitialVariables);\n useEffect(() => {\n setVariables(safeInitialVariables);\n }, [safeInitialVariables]);\n const systemVariables = safeInitialSystemVariables;\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isAddingNew, setIsAddingNew] = useState(false);\n const [newVariableName, setNewVariableName] = useState(\"\");\n const [duplicateError, setDuplicateError] = useState(false);\n const [invalidNameError, setInvalidNameError] = useState(false);\n const resetErrors = () => {\n setDuplicateError(false);\n setInvalidNameError(false);\n };\n const normalizedSearch = searchQuery.toLowerCase();\n const filterPredicate = (variable: Variable) => {\n const nameMatch = variable.name.toLowerCase().includes(normalizedSearch);\n const labelMatch = variable.label\n ? variable.label.toLowerCase().includes(normalizedSearch)\n : false;\n return nameMatch || labelMatch;\n };\n\n const filteredSystemVariables = useMemo(\n () => systemVariables.filter(filterPredicate),\n [systemVariables, normalizedSearch]\n );\n const filteredCustomVariables = useMemo(\n () => variables.filter(filterPredicate),\n [variables, normalizedSearch]\n );\n const hasAnyResult =\n filteredSystemVariables.length > 0 || filteredCustomVariables.length > 0;\n\n const handleAddVariable = () => {\n const inputValue = newVariableName;\n if (!inputValue || !isValidVariableName(inputValue)) {\n setInvalidNameError(true);\n setDuplicateError(false);\n return;\n }\n\n const lowerName = inputValue.toLowerCase();\n const isDuplicate = [...variables, ...systemVariables].some(\n (v) => v.name.toLowerCase() === lowerName\n );\n\n if (isDuplicate) {\n setDuplicateError(true);\n setInvalidNameError(false);\n return;\n }\n\n const newVariable: Variable = {\n name: inputValue,\n };\n setVariables((prev) => [newVariable, ...prev]);\n onAddVariable?.({ name: inputValue });\n setNewVariableName(\"\");\n setIsAddingNew(false);\n setSearchQuery(\"\");\n resetErrors();\n onSelect?.(newVariable);\n };\n\n const handleCancelAdd = () => {\n setIsAddingNew(false);\n setNewVariableName(\"\");\n resetErrors();\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setNewVariableName(e.target.value);\n if (duplicateError || invalidNameError) {\n resetErrors();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n handleAddVariable();\n } else if (e.key === \"Escape\") {\n handleCancelAdd();\n }\n };\n return (\n <div className=\"w-full max-w-sm rounded-lg border bg-white\">\n <div className=\"relative\">\n <Search className=\"absolute start-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder={t(\"variableSearchPlaceholder\", \"Search variable\")}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-8 h-8 border-0 focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n\n <div className=\"max-h-[300px] overflow-y-auto p-2\">\n {hasAnyResult ? (\n <div className=\"space-y-4\">\n {filteredSystemVariables.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"px-3 text-xs font-medium text-muted-foreground\">\n {t(\"variableSectionSystem\", \"System Variables\")}\n </p>\n <div className=\"space-y-1\">\n {filteredSystemVariables.map((variable) => (\n <button\n key={`system-${variable.name}`}\n onClick={() => onSelect?.(variable)}\n className={cn(\n \"flex w-full items-start justify-between rounded-md px-3 py-2 text-start transition-colors hover:bg-accent\",\n selectedName === variable.name && \"bg-accent\"\n )}\n >\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-foreground\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"text-xs text-muted-foreground\">\n {variable.label}\n </span>\n )}\n </div>\n {selectedName === variable.name && (\n <Check className=\"mt-1 h-4 w-4 text-foreground\" />\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {filteredCustomVariables.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"px-3 text-xs font-medium text-muted-foreground\">\n {t(\"variableSectionCustom\", \"Custom Variables\")}\n </p>\n <div className=\"space-y-1\">\n {filteredCustomVariables.map((variable) => (\n <button\n key={`custom-${variable.name}`}\n onClick={() => onSelect?.(variable)}\n className={cn(\n \"flex w-full items-start justify-between rounded-md px-3 py-2 text-start transition-colors hover:bg-accent\",\n selectedName === variable.name && \"bg-accent\"\n )}\n >\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-foreground\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"text-xs text-muted-foreground\">\n {variable.label}\n </span>\n )}\n </div>\n {selectedName === variable.name && (\n <Check className=\"mt-1 h-4 w-4 text-foreground\" />\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"px-3 py-6 text-center text-sm text-muted-foreground\">\n {searchQuery\n ? t(\"variableNotFound\", \"No variables found\")\n : t(\"variableEmpty\", \"No variables yet\")}\n </div>\n )}\n </div>\n\n <div className=\"border-t border-border p-2\">\n {isAddingNew ? (\n <div>\n <div className=\"flex items-center gap-2 rounded-md border border-border bg-background px-3 py-2\">\n <Input\n type=\"text\"\n placeholder={t(\"variableNamePlaceholder\", \"Variable name\")}\n value={newVariableName}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n autoFocus\n className=\"h-8 flex-1 border-0 px-0 focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCancelAdd}\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleAddVariable}\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground\"\n >\n <Check className=\"h-4 w-4\" />\n </Button>\n </div>\n {(duplicateError || invalidNameError) && (\n <p className=\"mt-1 px-3 text-xs text-red-500\">\n {duplicateError\n ? t(\"variableAlreadyExists\", \"Variable already exists\")\n : t(\n \"variableNameInvalid\",\n \"Use letters, numbers, or underscores without spaces\"\n )}\n </p>\n )}\n </div>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setIsAddingNew(true)}\n className=\"w-full justify-start text-muted-foreground hover:text-foreground\"\n >\n <Plus className=\"me-2 h-4 w-4\" />\n {t(\"variableAddNew\", \"Add new variable\")}\n </Button>\n )}\n </div>\n </div>\n );\n};\nexport default VariableSelect;\n"],"names":["EMPTY_VARIABLES","VariableSelect","initialVariables","initialSystemVariables","selectedName","onSelect","onAddVariable","useTranslation","safeInitialVariables","safeInitialSystemVariables","variables","setVariables","useState","useEffect","systemVariables","searchQuery","setSearchQuery","isAddingNew","setIsAddingNew","newVariableName","setNewVariableName","duplicateError","setDuplicateError","invalidNameError","setInvalidNameError","resetErrors","normalizedSearch","filterPredicate","variable","nameMatch","labelMatch","filteredSystemVariables","useMemo","filteredCustomVariables","hasAnyResult","handleAddVariable","inputValue","isValidVariableName","lowerName","v","newVariable","prev","handleCancelAdd","handleInputChange","e","handleKeyDown","jsxs","jsx","Search","Input","cn","Check","Button","X","Plus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VariableSelect.cjs","sources":["../../../../src/components/MarkdownFlowEditor/components/VariableSelect.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { Search, Plus, Check, X } from \"lucide-react\";\nimport { Input } from \"../../ui/input\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../../lib/utils\";\nimport { Variable } from \"../types\";\nimport { normalizeVariableName } from \"../utils\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface VariableSelectProps {\n variables?: Variable[];\n systemVariables?: Variable[];\n selectedName?: string;\n onSelect?: (variable: Variable) => void;\n onAddVariable?: (variable: Variable) => void;\n}\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\nconst VariableSelect = ({\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n selectedName,\n onSelect,\n onAddVariable,\n}: VariableSelectProps) => {\n const { t } = useTranslation();\n const safeInitialVariables = initialVariables ?? EMPTY_VARIABLES;\n const safeInitialSystemVariables = initialSystemVariables ?? EMPTY_VARIABLES;\n\n const [variables, setVariables] = useState<Variable[]>(safeInitialVariables);\n useEffect(() => {\n setVariables(safeInitialVariables);\n }, [safeInitialVariables]);\n const systemVariables = safeInitialSystemVariables;\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isAddingNew, setIsAddingNew] = useState(false);\n const [newVariableName, setNewVariableName] = useState(\"\");\n const [duplicateError, setDuplicateError] = useState(false);\n const [invalidNameError, setInvalidNameError] = useState(false);\n const resetErrors = () => {\n setDuplicateError(false);\n setInvalidNameError(false);\n };\n const normalizedSearch = searchQuery.toLowerCase();\n const filterPredicate = (variable: Variable) => {\n const nameMatch = variable.name.toLowerCase().includes(normalizedSearch);\n const labelMatch = variable.label\n ? variable.label.toLowerCase().includes(normalizedSearch)\n : false;\n return nameMatch || labelMatch;\n };\n\n const filteredSystemVariables = useMemo(\n () => systemVariables.filter(filterPredicate),\n [systemVariables, normalizedSearch]\n );\n const filteredCustomVariables = useMemo(\n () => variables.filter(filterPredicate),\n [variables, normalizedSearch]\n );\n const hasAnyResult =\n filteredSystemVariables.length > 0 || filteredCustomVariables.length > 0;\n\n const handleAddVariable = () => {\n const inputValue = normalizeVariableName(newVariableName);\n if (!inputValue) {\n setInvalidNameError(true);\n setDuplicateError(false);\n return;\n }\n\n const lowerName = inputValue.toLowerCase();\n const isDuplicate = [...variables, ...systemVariables].some(\n (v) => v.name.toLowerCase() === lowerName\n );\n\n if (isDuplicate) {\n setDuplicateError(true);\n setInvalidNameError(false);\n return;\n }\n\n const newVariable: Variable = {\n name: inputValue,\n };\n setVariables((prev) => [newVariable, ...prev]);\n onAddVariable?.({ name: inputValue });\n setNewVariableName(\"\");\n setIsAddingNew(false);\n setSearchQuery(\"\");\n resetErrors();\n onSelect?.(newVariable);\n };\n\n const handleCancelAdd = () => {\n setIsAddingNew(false);\n setNewVariableName(\"\");\n resetErrors();\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setNewVariableName(e.target.value);\n if (duplicateError || invalidNameError) {\n resetErrors();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n handleAddVariable();\n } else if (e.key === \"Escape\") {\n handleCancelAdd();\n }\n };\n return (\n <div className=\"w-full max-w-sm rounded-lg border bg-white\">\n <div className=\"relative\">\n <Search className=\"absolute start-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder={t(\"variableSearchPlaceholder\", \"Search variable\")}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-8 h-8 border-0 focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n\n <div className=\"max-h-[300px] overflow-y-auto p-2\">\n {hasAnyResult ? (\n <div className=\"space-y-4\">\n {filteredSystemVariables.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"px-3 text-xs font-medium text-muted-foreground\">\n {t(\"variableSectionSystem\", \"System Variables\")}\n </p>\n <div className=\"space-y-1\">\n {filteredSystemVariables.map((variable) => (\n <button\n key={`system-${variable.name}`}\n onClick={() => onSelect?.(variable)}\n className={cn(\n \"flex w-full items-start justify-between rounded-md px-3 py-2 text-start transition-colors hover:bg-accent\",\n selectedName === variable.name && \"bg-accent\"\n )}\n >\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-foreground\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"text-xs text-muted-foreground\">\n {variable.label}\n </span>\n )}\n </div>\n {selectedName === variable.name && (\n <Check className=\"mt-1 h-4 w-4 text-foreground\" />\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {filteredCustomVariables.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"px-3 text-xs font-medium text-muted-foreground\">\n {t(\"variableSectionCustom\", \"Custom Variables\")}\n </p>\n <div className=\"space-y-1\">\n {filteredCustomVariables.map((variable) => (\n <button\n key={`custom-${variable.name}`}\n onClick={() => onSelect?.(variable)}\n className={cn(\n \"flex w-full items-start justify-between rounded-md px-3 py-2 text-start transition-colors hover:bg-accent\",\n selectedName === variable.name && \"bg-accent\"\n )}\n >\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-foreground\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"text-xs text-muted-foreground\">\n {variable.label}\n </span>\n )}\n </div>\n {selectedName === variable.name && (\n <Check className=\"mt-1 h-4 w-4 text-foreground\" />\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"px-3 py-6 text-center text-sm text-muted-foreground\">\n {searchQuery\n ? t(\"variableNotFound\", \"No variables found\")\n : t(\"variableEmpty\", \"No variables yet\")}\n </div>\n )}\n </div>\n\n <div className=\"border-t border-border p-2\">\n {isAddingNew ? (\n <div>\n <div className=\"flex items-center gap-2 rounded-md border border-border bg-background px-3 py-2\">\n <Input\n type=\"text\"\n placeholder={t(\"variableNamePlaceholder\", \"Variable name\")}\n value={newVariableName}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n autoFocus\n className=\"h-8 flex-1 border-0 px-0 focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCancelAdd}\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleAddVariable}\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground\"\n >\n <Check className=\"h-4 w-4\" />\n </Button>\n </div>\n {(duplicateError || invalidNameError) && (\n <p className=\"mt-1 px-3 text-xs text-red-500\">\n {duplicateError\n ? t(\"variableAlreadyExists\", \"Variable already exists\")\n : t(\n \"variableNameInvalid\",\n \"Use a non-empty name without spaces or braces\"\n )}\n </p>\n )}\n </div>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setIsAddingNew(true)}\n className=\"w-full justify-start text-muted-foreground hover:text-foreground\"\n >\n <Plus className=\"me-2 h-4 w-4\" />\n {t(\"variableAddNew\", \"Add new variable\")}\n </Button>\n )}\n </div>\n </div>\n );\n};\nexport default VariableSelect;\n"],"names":["EMPTY_VARIABLES","VariableSelect","initialVariables","initialSystemVariables","selectedName","onSelect","onAddVariable","useTranslation","safeInitialVariables","safeInitialSystemVariables","variables","setVariables","useState","useEffect","systemVariables","searchQuery","setSearchQuery","isAddingNew","setIsAddingNew","newVariableName","setNewVariableName","duplicateError","setDuplicateError","invalidNameError","setInvalidNameError","resetErrors","normalizedSearch","filterPredicate","variable","nameMatch","labelMatch","filteredSystemVariables","useMemo","filteredCustomVariables","hasAnyResult","handleAddVariable","inputValue","normalizeVariableName","lowerName","v","newVariable","prev","handleCancelAdd","handleInputChange","e","handleKeyDown","jsxs","jsx","Search","Input","cn","Check","Button","X","Plus"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsxs as a, jsx as t } from "react/jsx-runtime";
|
|
2
|
-
import { useState as r, useEffect as Y, useMemo as
|
|
3
|
-
import { Input as
|
|
2
|
+
import { useState as r, useEffect as Y, useMemo as D } from "react";
|
|
3
|
+
import { Input as P } from "../../ui/input.es.js";
|
|
4
4
|
import { Button as w } from "../../ui/button.es.js";
|
|
5
5
|
import { cn as M } from "../../../lib/utils.es.js";
|
|
6
|
-
import {
|
|
6
|
+
import { d as _ } from "../../../_virtual/index.es.js";
|
|
7
7
|
import { useTranslation as q } from "../../../node_modules/react-i18next/dist/es/useTranslation.es.js";
|
|
8
8
|
import G from "../../../node_modules/lucide-react/dist/esm/icons/search.es.js";
|
|
9
9
|
import V from "../../../node_modules/lucide-react/dist/esm/icons/check.es.js";
|
|
@@ -20,34 +20,34 @@ const B = [], ie = ({
|
|
|
20
20
|
Y(() => {
|
|
21
21
|
C(i);
|
|
22
22
|
}, [i]);
|
|
23
|
-
const m = R, [d, E] = r(""), [T, u] = r(!1), [S, f] = r(""), [h,
|
|
24
|
-
|
|
23
|
+
const m = R, [d, E] = r(""), [T, u] = r(!1), [S, f] = r(""), [h, p] = r(!1), [k, x] = r(!1), b = () => {
|
|
24
|
+
p(!1), x(!1);
|
|
25
25
|
}, l = d.toLowerCase(), A = (e) => {
|
|
26
26
|
const v = e.name.toLowerCase().includes(l), j = e.label ? e.label.toLowerCase().includes(l) : !1;
|
|
27
27
|
return v || j;
|
|
28
|
-
}, N =
|
|
28
|
+
}, N = D(
|
|
29
29
|
() => m.filter(A),
|
|
30
30
|
[m, l]
|
|
31
|
-
), g =
|
|
31
|
+
), g = D(
|
|
32
32
|
() => c.filter(A),
|
|
33
33
|
[c, l]
|
|
34
34
|
), $ = N.length > 0 || g.length > 0, I = () => {
|
|
35
|
-
const e = S;
|
|
36
|
-
if (!e
|
|
37
|
-
|
|
35
|
+
const e = _.normalizeVariableName(S);
|
|
36
|
+
if (!e) {
|
|
37
|
+
x(!0), p(!1);
|
|
38
38
|
return;
|
|
39
39
|
}
|
|
40
40
|
const v = e.toLowerCase();
|
|
41
41
|
if ([...c, ...m].some(
|
|
42
42
|
(y) => y.name.toLowerCase() === v
|
|
43
43
|
)) {
|
|
44
|
-
|
|
44
|
+
p(!0), x(!1);
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
|
-
const
|
|
47
|
+
const z = {
|
|
48
48
|
name: e
|
|
49
49
|
};
|
|
50
|
-
C((y) => [
|
|
50
|
+
C((y) => [z, ...y]), Q?.({ name: e }), f(""), u(!1), E(""), b(), n?.(z);
|
|
51
51
|
}, L = () => {
|
|
52
52
|
u(!1), f(""), b();
|
|
53
53
|
}, U = (e) => {
|
|
@@ -59,7 +59,7 @@ const B = [], ie = ({
|
|
|
59
59
|
/* @__PURE__ */ a("div", { className: "relative", children: [
|
|
60
60
|
/* @__PURE__ */ t(G, { className: "absolute start-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }),
|
|
61
61
|
/* @__PURE__ */ t(
|
|
62
|
-
|
|
62
|
+
P,
|
|
63
63
|
{
|
|
64
64
|
type: "text",
|
|
65
65
|
placeholder: s("variableSearchPlaceholder", "Search variable"),
|
|
@@ -116,7 +116,7 @@ const B = [], ie = ({
|
|
|
116
116
|
/* @__PURE__ */ t("div", { className: "border-t border-border p-2", children: T ? /* @__PURE__ */ a("div", { children: [
|
|
117
117
|
/* @__PURE__ */ a("div", { className: "flex items-center gap-2 rounded-md border border-border bg-background px-3 py-2", children: [
|
|
118
118
|
/* @__PURE__ */ t(
|
|
119
|
-
|
|
119
|
+
P,
|
|
120
120
|
{
|
|
121
121
|
type: "text",
|
|
122
122
|
placeholder: s("variableNamePlaceholder", "Variable name"),
|
|
@@ -150,7 +150,7 @@ const B = [], ie = ({
|
|
|
150
150
|
] }),
|
|
151
151
|
(h || k) && /* @__PURE__ */ t("p", { className: "mt-1 px-3 text-xs text-red-500", children: h ? s("variableAlreadyExists", "Variable already exists") : s(
|
|
152
152
|
"variableNameInvalid",
|
|
153
|
-
"Use
|
|
153
|
+
"Use a non-empty name without spaces or braces"
|
|
154
154
|
) })
|
|
155
155
|
] }) : /* @__PURE__ */ a(
|
|
156
156
|
w,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariableSelect.es.js","sources":["../../../../src/components/MarkdownFlowEditor/components/VariableSelect.tsx"],"sourcesContent":["import type React from \"react\";\nimport { useEffect, useMemo, useState } from \"react\";\nimport { Search, Plus, Check, X } from \"lucide-react\";\nimport { Input } from \"../../ui/input\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../../lib/utils\";\nimport { Variable } from \"../types\";\nimport { isValidVariableName } from \"../utils\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface VariableSelectProps {\n variables?: Variable[];\n systemVariables?: Variable[];\n selectedName?: string;\n onSelect?: (variable: Variable) => void;\n onAddVariable?: (variable: Variable) => void;\n}\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\nconst VariableSelect = ({\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n selectedName,\n onSelect,\n onAddVariable,\n}: VariableSelectProps) => {\n const { t } = useTranslation();\n const safeInitialVariables = initialVariables ?? EMPTY_VARIABLES;\n const safeInitialSystemVariables = initialSystemVariables ?? EMPTY_VARIABLES;\n\n const [variables, setVariables] = useState<Variable[]>(safeInitialVariables);\n useEffect(() => {\n setVariables(safeInitialVariables);\n }, [safeInitialVariables]);\n const systemVariables = safeInitialSystemVariables;\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isAddingNew, setIsAddingNew] = useState(false);\n const [newVariableName, setNewVariableName] = useState(\"\");\n const [duplicateError, setDuplicateError] = useState(false);\n const [invalidNameError, setInvalidNameError] = useState(false);\n const resetErrors = () => {\n setDuplicateError(false);\n setInvalidNameError(false);\n };\n const normalizedSearch = searchQuery.toLowerCase();\n const filterPredicate = (variable: Variable) => {\n const nameMatch = variable.name.toLowerCase().includes(normalizedSearch);\n const labelMatch = variable.label\n ? variable.label.toLowerCase().includes(normalizedSearch)\n : false;\n return nameMatch || labelMatch;\n };\n\n const filteredSystemVariables = useMemo(\n () => systemVariables.filter(filterPredicate),\n [systemVariables, normalizedSearch]\n );\n const filteredCustomVariables = useMemo(\n () => variables.filter(filterPredicate),\n [variables, normalizedSearch]\n );\n const hasAnyResult =\n filteredSystemVariables.length > 0 || filteredCustomVariables.length > 0;\n\n const handleAddVariable = () => {\n const inputValue = newVariableName;\n if (!inputValue || !isValidVariableName(inputValue)) {\n setInvalidNameError(true);\n setDuplicateError(false);\n return;\n }\n\n const lowerName = inputValue.toLowerCase();\n const isDuplicate = [...variables, ...systemVariables].some(\n (v) => v.name.toLowerCase() === lowerName\n );\n\n if (isDuplicate) {\n setDuplicateError(true);\n setInvalidNameError(false);\n return;\n }\n\n const newVariable: Variable = {\n name: inputValue,\n };\n setVariables((prev) => [newVariable, ...prev]);\n onAddVariable?.({ name: inputValue });\n setNewVariableName(\"\");\n setIsAddingNew(false);\n setSearchQuery(\"\");\n resetErrors();\n onSelect?.(newVariable);\n };\n\n const handleCancelAdd = () => {\n setIsAddingNew(false);\n setNewVariableName(\"\");\n resetErrors();\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setNewVariableName(e.target.value);\n if (duplicateError || invalidNameError) {\n resetErrors();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n handleAddVariable();\n } else if (e.key === \"Escape\") {\n handleCancelAdd();\n }\n };\n return (\n <div className=\"w-full max-w-sm rounded-lg border bg-white\">\n <div className=\"relative\">\n <Search className=\"absolute start-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder={t(\"variableSearchPlaceholder\", \"Search variable\")}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-8 h-8 border-0 focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n\n <div className=\"max-h-[300px] overflow-y-auto p-2\">\n {hasAnyResult ? (\n <div className=\"space-y-4\">\n {filteredSystemVariables.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"px-3 text-xs font-medium text-muted-foreground\">\n {t(\"variableSectionSystem\", \"System Variables\")}\n </p>\n <div className=\"space-y-1\">\n {filteredSystemVariables.map((variable) => (\n <button\n key={`system-${variable.name}`}\n onClick={() => onSelect?.(variable)}\n className={cn(\n \"flex w-full items-start justify-between rounded-md px-3 py-2 text-start transition-colors hover:bg-accent\",\n selectedName === variable.name && \"bg-accent\"\n )}\n >\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-foreground\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"text-xs text-muted-foreground\">\n {variable.label}\n </span>\n )}\n </div>\n {selectedName === variable.name && (\n <Check className=\"mt-1 h-4 w-4 text-foreground\" />\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {filteredCustomVariables.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"px-3 text-xs font-medium text-muted-foreground\">\n {t(\"variableSectionCustom\", \"Custom Variables\")}\n </p>\n <div className=\"space-y-1\">\n {filteredCustomVariables.map((variable) => (\n <button\n key={`custom-${variable.name}`}\n onClick={() => onSelect?.(variable)}\n className={cn(\n \"flex w-full items-start justify-between rounded-md px-3 py-2 text-start transition-colors hover:bg-accent\",\n selectedName === variable.name && \"bg-accent\"\n )}\n >\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-foreground\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"text-xs text-muted-foreground\">\n {variable.label}\n </span>\n )}\n </div>\n {selectedName === variable.name && (\n <Check className=\"mt-1 h-4 w-4 text-foreground\" />\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"px-3 py-6 text-center text-sm text-muted-foreground\">\n {searchQuery\n ? t(\"variableNotFound\", \"No variables found\")\n : t(\"variableEmpty\", \"No variables yet\")}\n </div>\n )}\n </div>\n\n <div className=\"border-t border-border p-2\">\n {isAddingNew ? (\n <div>\n <div className=\"flex items-center gap-2 rounded-md border border-border bg-background px-3 py-2\">\n <Input\n type=\"text\"\n placeholder={t(\"variableNamePlaceholder\", \"Variable name\")}\n value={newVariableName}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n autoFocus\n className=\"h-8 flex-1 border-0 px-0 focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCancelAdd}\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleAddVariable}\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground\"\n >\n <Check className=\"h-4 w-4\" />\n </Button>\n </div>\n {(duplicateError || invalidNameError) && (\n <p className=\"mt-1 px-3 text-xs text-red-500\">\n {duplicateError\n ? t(\"variableAlreadyExists\", \"Variable already exists\")\n : t(\n \"variableNameInvalid\",\n \"Use letters, numbers, or underscores without spaces\"\n )}\n </p>\n )}\n </div>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setIsAddingNew(true)}\n className=\"w-full justify-start text-muted-foreground hover:text-foreground\"\n >\n <Plus className=\"me-2 h-4 w-4\" />\n {t(\"variableAddNew\", \"Add new variable\")}\n </Button>\n )}\n </div>\n </div>\n );\n};\nexport default VariableSelect;\n"],"names":["EMPTY_VARIABLES","VariableSelect","initialVariables","initialSystemVariables","selectedName","onSelect","onAddVariable","t","useTranslation","safeInitialVariables","safeInitialSystemVariables","variables","setVariables","useState","useEffect","systemVariables","searchQuery","setSearchQuery","isAddingNew","setIsAddingNew","newVariableName","setNewVariableName","duplicateError","setDuplicateError","invalidNameError","setInvalidNameError","resetErrors","normalizedSearch","filterPredicate","variable","nameMatch","labelMatch","filteredSystemVariables","useMemo","filteredCustomVariables","hasAnyResult","handleAddVariable","inputValue","isValidVariableName","lowerName","v","newVariable","prev","handleCancelAdd","handleInputChange","handleKeyDown","jsxs","jsx","Search","Input","cn","Check","Button","X","Plus"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VariableSelect.es.js","sources":["../../../../src/components/MarkdownFlowEditor/components/VariableSelect.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { Search, Plus, Check, X } from \"lucide-react\";\nimport { Input } from \"../../ui/input\";\nimport { Button } from \"../../ui/button\";\nimport { cn } from \"../../../lib/utils\";\nimport { Variable } from \"../types\";\nimport { normalizeVariableName } from \"../utils\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface VariableSelectProps {\n variables?: Variable[];\n systemVariables?: Variable[];\n selectedName?: string;\n onSelect?: (variable: Variable) => void;\n onAddVariable?: (variable: Variable) => void;\n}\n\nconst EMPTY_VARIABLES: Variable[] = [];\n\nconst VariableSelect = ({\n variables: initialVariables,\n systemVariables: initialSystemVariables,\n selectedName,\n onSelect,\n onAddVariable,\n}: VariableSelectProps) => {\n const { t } = useTranslation();\n const safeInitialVariables = initialVariables ?? EMPTY_VARIABLES;\n const safeInitialSystemVariables = initialSystemVariables ?? EMPTY_VARIABLES;\n\n const [variables, setVariables] = useState<Variable[]>(safeInitialVariables);\n useEffect(() => {\n setVariables(safeInitialVariables);\n }, [safeInitialVariables]);\n const systemVariables = safeInitialSystemVariables;\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isAddingNew, setIsAddingNew] = useState(false);\n const [newVariableName, setNewVariableName] = useState(\"\");\n const [duplicateError, setDuplicateError] = useState(false);\n const [invalidNameError, setInvalidNameError] = useState(false);\n const resetErrors = () => {\n setDuplicateError(false);\n setInvalidNameError(false);\n };\n const normalizedSearch = searchQuery.toLowerCase();\n const filterPredicate = (variable: Variable) => {\n const nameMatch = variable.name.toLowerCase().includes(normalizedSearch);\n const labelMatch = variable.label\n ? variable.label.toLowerCase().includes(normalizedSearch)\n : false;\n return nameMatch || labelMatch;\n };\n\n const filteredSystemVariables = useMemo(\n () => systemVariables.filter(filterPredicate),\n [systemVariables, normalizedSearch]\n );\n const filteredCustomVariables = useMemo(\n () => variables.filter(filterPredicate),\n [variables, normalizedSearch]\n );\n const hasAnyResult =\n filteredSystemVariables.length > 0 || filteredCustomVariables.length > 0;\n\n const handleAddVariable = () => {\n const inputValue = normalizeVariableName(newVariableName);\n if (!inputValue) {\n setInvalidNameError(true);\n setDuplicateError(false);\n return;\n }\n\n const lowerName = inputValue.toLowerCase();\n const isDuplicate = [...variables, ...systemVariables].some(\n (v) => v.name.toLowerCase() === lowerName\n );\n\n if (isDuplicate) {\n setDuplicateError(true);\n setInvalidNameError(false);\n return;\n }\n\n const newVariable: Variable = {\n name: inputValue,\n };\n setVariables((prev) => [newVariable, ...prev]);\n onAddVariable?.({ name: inputValue });\n setNewVariableName(\"\");\n setIsAddingNew(false);\n setSearchQuery(\"\");\n resetErrors();\n onSelect?.(newVariable);\n };\n\n const handleCancelAdd = () => {\n setIsAddingNew(false);\n setNewVariableName(\"\");\n resetErrors();\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setNewVariableName(e.target.value);\n if (duplicateError || invalidNameError) {\n resetErrors();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n handleAddVariable();\n } else if (e.key === \"Escape\") {\n handleCancelAdd();\n }\n };\n return (\n <div className=\"w-full max-w-sm rounded-lg border bg-white\">\n <div className=\"relative\">\n <Search className=\"absolute start-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n type=\"text\"\n placeholder={t(\"variableSearchPlaceholder\", \"Search variable\")}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"ps-8 h-8 border-0 focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n\n <div className=\"max-h-[300px] overflow-y-auto p-2\">\n {hasAnyResult ? (\n <div className=\"space-y-4\">\n {filteredSystemVariables.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"px-3 text-xs font-medium text-muted-foreground\">\n {t(\"variableSectionSystem\", \"System Variables\")}\n </p>\n <div className=\"space-y-1\">\n {filteredSystemVariables.map((variable) => (\n <button\n key={`system-${variable.name}`}\n onClick={() => onSelect?.(variable)}\n className={cn(\n \"flex w-full items-start justify-between rounded-md px-3 py-2 text-start transition-colors hover:bg-accent\",\n selectedName === variable.name && \"bg-accent\"\n )}\n >\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-foreground\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"text-xs text-muted-foreground\">\n {variable.label}\n </span>\n )}\n </div>\n {selectedName === variable.name && (\n <Check className=\"mt-1 h-4 w-4 text-foreground\" />\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n\n {filteredCustomVariables.length > 0 && (\n <div className=\"space-y-1\">\n <p className=\"px-3 text-xs font-medium text-muted-foreground\">\n {t(\"variableSectionCustom\", \"Custom Variables\")}\n </p>\n <div className=\"space-y-1\">\n {filteredCustomVariables.map((variable) => (\n <button\n key={`custom-${variable.name}`}\n onClick={() => onSelect?.(variable)}\n className={cn(\n \"flex w-full items-start justify-between rounded-md px-3 py-2 text-start transition-colors hover:bg-accent\",\n selectedName === variable.name && \"bg-accent\"\n )}\n >\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium text-foreground\">\n {variable.name}\n </span>\n {variable.label && (\n <span className=\"text-xs text-muted-foreground\">\n {variable.label}\n </span>\n )}\n </div>\n {selectedName === variable.name && (\n <Check className=\"mt-1 h-4 w-4 text-foreground\" />\n )}\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n ) : (\n <div className=\"px-3 py-6 text-center text-sm text-muted-foreground\">\n {searchQuery\n ? t(\"variableNotFound\", \"No variables found\")\n : t(\"variableEmpty\", \"No variables yet\")}\n </div>\n )}\n </div>\n\n <div className=\"border-t border-border p-2\">\n {isAddingNew ? (\n <div>\n <div className=\"flex items-center gap-2 rounded-md border border-border bg-background px-3 py-2\">\n <Input\n type=\"text\"\n placeholder={t(\"variableNamePlaceholder\", \"Variable name\")}\n value={newVariableName}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n autoFocus\n className=\"h-8 flex-1 border-0 px-0 focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCancelAdd}\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground\"\n >\n <X className=\"h-4 w-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleAddVariable}\n className=\"h-8 w-8 shrink-0 text-muted-foreground hover:text-foreground\"\n >\n <Check className=\"h-4 w-4\" />\n </Button>\n </div>\n {(duplicateError || invalidNameError) && (\n <p className=\"mt-1 px-3 text-xs text-red-500\">\n {duplicateError\n ? t(\"variableAlreadyExists\", \"Variable already exists\")\n : t(\n \"variableNameInvalid\",\n \"Use a non-empty name without spaces or braces\"\n )}\n </p>\n )}\n </div>\n ) : (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setIsAddingNew(true)}\n className=\"w-full justify-start text-muted-foreground hover:text-foreground\"\n >\n <Plus className=\"me-2 h-4 w-4\" />\n {t(\"variableAddNew\", \"Add new variable\")}\n </Button>\n )}\n </div>\n </div>\n );\n};\nexport default VariableSelect;\n"],"names":["EMPTY_VARIABLES","VariableSelect","initialVariables","initialSystemVariables","selectedName","onSelect","onAddVariable","t","useTranslation","safeInitialVariables","safeInitialSystemVariables","variables","setVariables","useState","useEffect","systemVariables","searchQuery","setSearchQuery","isAddingNew","setIsAddingNew","newVariableName","setNewVariableName","duplicateError","setDuplicateError","invalidNameError","setInvalidNameError","resetErrors","normalizedSearch","filterPredicate","variable","nameMatch","labelMatch","filteredSystemVariables","useMemo","filteredCustomVariables","hasAnyResult","handleAddVariable","inputValue","normalizeVariableName","lowerName","v","newVariable","prev","handleCancelAdd","handleInputChange","handleKeyDown","jsxs","jsx","Search","Input","cn","Check","Button","X","Plus"],"mappings":"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"}
|