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
package/README.md
CHANGED
|
@@ -90,6 +90,18 @@ can change that structure; typing an already received snapshot preserves it.
|
|
|
90
90
|
|
|
91
91
|
### Interactive Elements
|
|
92
92
|
|
|
93
|
+
This variable-name policy matches AI-Shifu's existing MarkdownFlow 2.0
|
|
94
|
+
implementation. It is a compatibility extension to the public MarkdownFlow
|
|
95
|
+
specification, which currently restricts names to letters, digits, and underscores
|
|
96
|
+
without surrounding whitespace.
|
|
97
|
+
|
|
98
|
+
Variable names follow that backend rule: they are non-empty and contain no
|
|
99
|
+
whitespace or braces. Question marks can remain in the name, so `?[%{{你的性别是?}} 男 | 女 | 秘密]` submits the unchanged key
|
|
100
|
+
`你的性别是?`. Whitespace around the name inside `{{ }}` is trimmed. The name
|
|
101
|
+
is a memory key; write the question text separately when it should be displayed.
|
|
102
|
+
Existing identifier names such as `user_name` continue to work. Interaction
|
|
103
|
+
delimiters retain their existing grammar.
|
|
104
|
+
|
|
93
105
|
```tsx
|
|
94
106
|
import { MarkdownFlow } from "markdown-flow-ui";
|
|
95
107
|
|
package/dist/_virtual/index8.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
|
|
2
2
|
//# sourceMappingURL=index8.cjs.map
|
package/dist/_virtual/index9.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
|
|
2
2
|
//# sourceMappingURL=index9.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variable-name.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variable-name.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const s=require("react/jsx-runtime"),v=require("react"),
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const s=require("react/jsx-runtime"),v=require("react"),_=require("../../../_virtual/index.cjs"),J=require("../../ui/button.cjs"),P=require("../../ui/checkbox.cjs"),E=require("../MarkdownFlowInput.cjs"),D=require("../../ui/inputGroup/input-group.cjs"),K=require("../../../lib/utils.cjs"),U=require("../contentRenderI18n.cjs"),A=({node:c,readonly:i,selectedValues:e,inputValue:r,confirmButtonText:a,handleCheckboxChange:n,handleInputChange:m,handleKeyDown:x,handleConfirmClick:b})=>{const h=c.properties?.placeholder,u=i||e.length===0&&!r?.trim(),f=p=>s.jsx("span",{className:K.cn("multi-select-confirm-wrapper flex flex-col items-center",u?"opacity-50 cursor-not-allowed":"cursor-pointer",p),children:s.jsx("button",{type:"button",className:"multi-select-confirm-button text-sm font-medium text-primary",disabled:u,onClick:b,children:a})});return s.jsxs("span",{className:"multi-select-container flex w-full flex-col",children:[s.jsx("span",{className:"flex flex-wrap gap-y-[9px] gap-x-6",children:c.properties?.buttonTexts?.map((p,l)=>{const N=c.properties?.buttonValues?.[l],d=N!==void 0?N:p;return s.jsx(P.Checkbox,{label:p,disabled:i,checked:e.includes(d),onCheckedChange:C=>n(d,C),className:"text-sm"},l)})}),h?s.jsx("span",{className:"block mb-1 w-full max-w-[500px]",children:s.jsxs("span",{className:"multi-select-input-row flex w-full items-end gap-3",children:[s.jsx(D.InputGroup,{"data-disabled":i,className:"flex-1",children:s.jsx(D.InputGroupTextarea,{disabled:i,placeholder:h,value:r,onChange:m,onKeyDown:x,className:"text-sm px-3",title:h})}),f("shrink-0")]})}):f("self-start multi-select-confirm-wrapper--stacked")]})},H=({dir:c,lang:i,node:e,readonly:r,locale:a,resolvedDefaultButtonText:n,handleButtonClick:m,inputValue:x,handleInputChange:b,handleSendClick:h})=>s.jsxs("span",{className:"single-select-container inline-flex w-full flex-col",children:[s.jsx("span",{className:"flex flex-wrap gap-y-[9px] gap-x-2",children:e.properties?.buttonTexts?.map((u,f)=>{const p=e.properties?.buttonValues?.[f],l=p!==void 0?p:u;return s.jsx(J.Button,{disabled:r,variant:"outline",type:"button",size:"sm",onClick:()=>m(l),className:K.cn("max-w-full shrink whitespace-normal break-words text-start leading-5 h-auto min-h-8 px-3 py-1.5","hover:bg-gray-200",n===u&&"select"),children:u},f)})}),e.properties?.placeholder&&s.jsx("span",{className:"mt-[9px] mb-1",children:s.jsx(E.default,{dir:c,lang:i,disabled:r,locale:a,placeholder:e.properties.placeholder,value:x,onChange:b,onSend:h,title:e.properties.placeholder})})]}),Q=({dir:c,lang:i,readonly:e,locale:r,placeholder:a,value:n,onChange:m,onSend:x})=>a?s.jsx(E.default,{dir:c,lang:i,disabled:e,locale:r,placeholder:a,value:n,onChange:m,onSend:x,title:a}):null,W=({dir:c,lang:i,node:e,readonly:r,locale:a,defaultButtonText:n,defaultInputText:m,defaultSelectedValues:x,onSend:b,confirmButtonText:h,beforeSend:u=()=>!0})=>{const f=U.getContentRenderLocaleTexts(a),p=h||f.confirmButtonText,[l,N]=v.useState(m||""),[d,C]=v.useState(x||[]),V=JSON.stringify({buttonTexts:e.properties?.buttonTexts,buttonValues:e.properties?.buttonValues,isMultiSelect:e.properties?.isMultiSelect,placeholder:e.properties?.placeholder,variableName:e.properties?.variableName}),g=e.properties?.isMultiSelect??!1,O=e.properties?.buttonTexts||[],M=!g&&O.length===0&&!e.properties?.placeholder,S=_.distExports.normalizeVariableName(e.properties?.variableName||"")||n||p,k=v.useMemo(()=>M?{...e,properties:{...e.properties||{},buttonTexts:[S],buttonValues:[S]}}:e,[S,e,M]),j=k.properties?.buttonTexts||[],q=k.properties?.buttonValues||[],y=!g&&j.length>0,R=t=>{const o={variableName:e.properties?.variableName||"",buttonText:t};u?.(o)&&b?.(o)},G=(t,o)=>{C(I=>o?[...I,t]:I.filter(L=>L!==t))},B=()=>{const t=d.length===0&&!l?.trim(),o={variableName:e.properties?.variableName||"",selectedValues:d,inputText:l?.trim()||void 0};r||t||u?.(o)&&b?.(o)},w=t=>{N(t.target.value)},z=t=>{t.nativeEvent.isComposing||t.keyCode===229||t.key==="Enter"&&!t.shiftKey&&(t.preventDefault(),g?d.length===0&&!l.trim()||B():T())},T=()=>{const t={variableName:e.properties?.variableName||"",inputText:l};u?.(t)&&b?.(t)},F=v.useMemo(()=>{if(!n)return;const t=q.indexOf(n);if(t>-1)return j[t]??n;const o=j.indexOf(n);if(o>-1)return j[o]},[n,j,q]);return v.useEffect(()=>{N(m||"")},[m,V]),v.useEffect(()=>{C(x||[])},[x,V]),s.jsxs("span",{className:"custom-variable-container inline-flex items-center flex-wrap",children:[g&&s.jsx(A,{node:e,readonly:r,selectedValues:d,inputValue:l,confirmButtonText:p,handleCheckboxChange:G,handleInputChange:w,handleKeyDown:z,handleConfirmClick:B}),!g&&y&&s.jsx(H,{dir:c,lang:i,node:k,readonly:r,locale:a,resolvedDefaultButtonText:F,handleButtonClick:R,inputValue:l,handleInputChange:w,handleSendClick:T}),!g&&!y&&e.properties?.placeholder&&s.jsx(Q,{dir:c,lang:i,readonly:r,locale:a,placeholder:e.properties.placeholder,value:l,onChange:w,onSend:T})]})};exports.default=W;
|
|
2
2
|
//# sourceMappingURL=CustomVariable.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomVariable.cjs","sources":["../../../../src/components/ContentRender/plugins/CustomVariable.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Components } from \"react-markdown\";\nimport { OnSendContentParams } from \"../../types\";\nimport { Button } from \"../../ui/button\";\nimport { Checkbox } from \"../../ui/checkbox\";\nimport MarkdownFlowInput from \"../MarkdownFlowInput\";\nimport {\n InputGroup,\n InputGroupTextarea,\n} from \"../../ui/inputGroup/input-group\";\nimport type { MarkdownFlowLocale } from \"../../../lib/locale\";\nimport { cn } from \"../../../lib/utils\";\nimport { getContentRenderLocaleTexts } from \"../contentRenderI18n\";\n\n// Define custom variable node type\ninterface CustomVariableNode {\n tagName: \"custom-variable\";\n properties?: {\n variableName?: string;\n buttonTexts?: string[];\n buttonValues?: string[];\n placeholder?: string;\n isMultiSelect?: boolean;\n };\n}\n\n// Define custom variable component Props type\ninterface CustomVariableProps {\n /** Explicit direction for nested input controls. */\n dir?: React.HTMLAttributes<HTMLDivElement>[\"dir\"];\n /** Explicit language for nested input controls. */\n lang?: string;\n node: CustomVariableNode;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n locale?: MarkdownFlowLocale;\n readonly?: boolean;\n onSend?: (content: OnSendContentParams) => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n beforeSend?: (param: OnSendContentParams) => boolean;\n}\n\ninterface ComponentsWithCustomVariable extends Components {\n \"custom-variable\"?: React.ComponentType<CustomVariableProps>;\n}\n\n// Multi select section( with checkboxes and input)\ninterface MultiSelectSectionProps {\n node: CustomVariableNode;\n readonly?: boolean;\n selectedValues: string[];\n inputValue: string;\n confirmButtonText: string;\n handleCheckboxChange: (value: string, checked: boolean) => void;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n handleConfirmClick: () => void;\n}\n\nconst MultiSelectSection = ({\n node,\n readonly,\n selectedValues,\n inputValue,\n confirmButtonText,\n handleCheckboxChange,\n handleInputChange,\n handleKeyDown,\n handleConfirmClick,\n}: MultiSelectSectionProps) => {\n const placeholder = node.properties?.placeholder;\n const confirmDisabled =\n readonly || (selectedValues.length === 0 && !inputValue?.trim());\n\n const renderConfirmButton = (extraWrapperClassName?: string) => (\n <span\n className={cn(\n \"multi-select-confirm-wrapper flex flex-col items-center\",\n confirmDisabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n extraWrapperClassName\n )}\n >\n <button\n type=\"button\"\n className=\"multi-select-confirm-button text-sm font-medium text-primary\"\n disabled={confirmDisabled}\n onClick={handleConfirmClick}\n >\n {confirmButtonText}\n </button>\n </span>\n );\n\n return (\n <span className=\"multi-select-container flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-6\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Checkbox\n key={index}\n label={text}\n disabled={readonly}\n checked={selectedValues.includes(buttonValue)}\n onCheckedChange={(checked) =>\n handleCheckboxChange(buttonValue, checked)\n }\n className=\"text-sm\"\n />\n );\n })}\n </span>\n {placeholder ? (\n <span className=\"block mb-1 w-full max-w-[500px]\">\n <span className=\"multi-select-input-row flex w-full items-end gap-3\">\n <InputGroup data-disabled={readonly} className=\"flex-1\">\n <InputGroupTextarea\n disabled={readonly}\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n className=\"text-sm px-3\"\n title={placeholder}\n />\n </InputGroup>\n {renderConfirmButton(\"shrink-0\")}\n </span>\n </span>\n ) : (\n renderConfirmButton(\"self-start multi-select-confirm-wrapper--stacked\")\n )}\n </span>\n );\n};\n\n// Single select section( with buttons and input)\ninterface SingleSelectSectionProps {\n dir?: CustomVariableProps[\"dir\"];\n lang?: string;\n node: CustomVariableNode;\n readonly?: boolean;\n locale?: MarkdownFlowLocale;\n resolvedDefaultButtonText?: string;\n handleButtonClick: (value: string) => void;\n inputValue: string;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleSendClick: () => void;\n}\n\nconst SingleSelectSection = ({\n dir,\n lang,\n node,\n readonly,\n locale,\n resolvedDefaultButtonText,\n handleButtonClick,\n inputValue,\n handleInputChange,\n handleSendClick,\n}: SingleSelectSectionProps) => (\n <span className=\"single-select-container inline-flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-2\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Button\n key={index}\n disabled={readonly}\n variant=\"outline\"\n type=\"button\"\n size=\"sm\"\n onClick={() => handleButtonClick(buttonValue)}\n className={cn(\n \"max-w-full shrink whitespace-normal break-words text-start leading-5 h-auto min-h-8 px-3 py-1.5\",\n \"hover:bg-gray-200\",\n resolvedDefaultButtonText === text && \"select\"\n )}\n >\n {text}\n </Button>\n );\n })}\n </span>\n {node.properties?.placeholder && (\n <span className=\"mt-[9px] mb-1\">\n <MarkdownFlowInput\n dir={dir}\n lang={lang}\n disabled={readonly}\n locale={locale}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n title={node.properties.placeholder}\n />\n </span>\n )}\n </span>\n);\n\n// Pure input\ninterface InputSectionProps {\n dir?: CustomVariableProps[\"dir\"];\n lang?: string;\n readonly?: boolean;\n locale?: MarkdownFlowLocale;\n placeholder?: string;\n value: string;\n onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onSend: () => void;\n}\n\nconst InputSection = ({\n dir,\n lang,\n readonly,\n locale,\n placeholder,\n value,\n onChange,\n onSend,\n}: InputSectionProps) => {\n if (!placeholder) {\n return null;\n }\n\n return (\n <MarkdownFlowInput\n dir={dir}\n lang={lang}\n disabled={readonly}\n locale={locale}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n onSend={onSend}\n title={placeholder}\n />\n );\n};\n\n// Define custom variable component\nconst CustomButtonInputVariable = ({\n dir,\n lang,\n node,\n readonly,\n locale,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n onSend,\n confirmButtonText,\n beforeSend = () => true,\n}: CustomVariableProps) => {\n const localeTexts = getContentRenderLocaleTexts(locale);\n const resolvedConfirmButtonText =\n confirmButtonText || localeTexts.confirmButtonText;\n const [inputValue, setInputValue] = React.useState(defaultInputText || \"\");\n const [selectedValues, setSelectedValues] = React.useState<string[]>(\n defaultSelectedValues || []\n );\n const interactionDefinitionKey = JSON.stringify({\n buttonTexts: node.properties?.buttonTexts,\n buttonValues: node.properties?.buttonValues,\n isMultiSelect: node.properties?.isMultiSelect,\n placeholder: node.properties?.placeholder,\n variableName: node.properties?.variableName,\n });\n const isMultiSelect = node.properties?.isMultiSelect ?? false;\n const baseButtonTexts = node.properties?.buttonTexts || [];\n const shouldUseFallbackButton =\n !isMultiSelect &&\n baseButtonTexts.length === 0 &&\n !node.properties?.placeholder;\n const fallbackButtonLabel =\n node.properties?.variableName?.trim() ||\n defaultButtonText ||\n resolvedConfirmButtonText;\n\n const singleSelectNode = React.useMemo<CustomVariableNode>(() => {\n if (!shouldUseFallbackButton) {\n return node;\n }\n return {\n ...node,\n properties: {\n ...(node.properties || {}),\n buttonTexts: [fallbackButtonLabel],\n buttonValues: [fallbackButtonLabel],\n },\n };\n }, [fallbackButtonLabel, node, shouldUseFallbackButton]);\n\n const singleSelectButtonTexts =\n singleSelectNode.properties?.buttonTexts || [];\n const singleSelectButtonValues =\n singleSelectNode.properties?.buttonValues || [];\n const isSingleSelect = !isMultiSelect && singleSelectButtonTexts.length > 0;\n\n const handleButtonClick = (value: string) => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n buttonText: value,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleCheckboxChange = (value: string, checked: boolean) => {\n setSelectedValues((prev) => {\n if (checked) {\n return [...prev, value];\n } else {\n return prev.filter((v) => v !== value);\n }\n });\n };\n\n const handleConfirmClick = () => {\n const noSelection = selectedValues.length === 0 && !inputValue?.trim();\n const param = {\n variableName: node.properties?.variableName || \"\",\n selectedValues,\n inputText: inputValue?.trim() || undefined,\n };\n if (readonly || noSelection) return;\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInputValue(e.target.value);\n };\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.nativeEvent.isComposing || e.keyCode === 229) {\n return;\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (isMultiSelect) {\n const noSelection = selectedValues.length === 0 && !inputValue.trim();\n if (!noSelection) handleConfirmClick();\n } else {\n handleSendClick();\n }\n }\n };\n const handleSendClick = () => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n inputText: inputValue,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const resolvedDefaultButtonText = React.useMemo(() => {\n if (!defaultButtonText) {\n return undefined;\n }\n const valueIndex = singleSelectButtonValues.indexOf(defaultButtonText);\n if (valueIndex > -1) {\n return singleSelectButtonTexts[valueIndex] ?? defaultButtonText;\n }\n const textIndex = singleSelectButtonTexts.indexOf(defaultButtonText);\n if (textIndex > -1) {\n return singleSelectButtonTexts[textIndex];\n }\n return undefined;\n }, [defaultButtonText, singleSelectButtonTexts, singleSelectButtonValues]);\n\n React.useEffect(() => {\n setInputValue(defaultInputText || \"\");\n }, [defaultInputText, interactionDefinitionKey]);\n\n React.useEffect(() => {\n setSelectedValues(defaultSelectedValues || []);\n }, [defaultSelectedValues, interactionDefinitionKey]);\n\n return (\n <span className=\"custom-variable-container inline-flex items-center flex-wrap\">\n {isMultiSelect && (\n <MultiSelectSection\n node={node}\n readonly={readonly}\n selectedValues={selectedValues}\n inputValue={inputValue}\n confirmButtonText={resolvedConfirmButtonText}\n handleCheckboxChange={handleCheckboxChange}\n handleInputChange={handleInputChange}\n handleKeyDown={handleKeyDown}\n handleConfirmClick={handleConfirmClick}\n />\n )}\n\n {!isMultiSelect && isSingleSelect && (\n <SingleSelectSection\n dir={dir}\n lang={lang}\n node={singleSelectNode}\n readonly={readonly}\n locale={locale}\n resolvedDefaultButtonText={resolvedDefaultButtonText}\n handleButtonClick={handleButtonClick}\n inputValue={inputValue}\n handleInputChange={handleInputChange}\n handleSendClick={handleSendClick}\n />\n )}\n\n {!isMultiSelect && !isSingleSelect && node.properties?.placeholder && (\n <InputSection\n dir={dir}\n lang={lang}\n readonly={readonly}\n locale={locale}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n />\n )}\n </span>\n );\n};\n\nexport default CustomButtonInputVariable;\nexport type {\n ComponentsWithCustomVariable,\n CustomVariableNode,\n CustomVariableProps,\n};\n"],"names":["MultiSelectSection","node","readonly","selectedValues","inputValue","confirmButtonText","handleCheckboxChange","handleInputChange","handleKeyDown","handleConfirmClick","placeholder","confirmDisabled","renderConfirmButton","extraWrapperClassName","jsx","cn","jsxs","text","index","value","buttonValue","Checkbox","checked","InputGroup","InputGroupTextarea","SingleSelectSection","dir","lang","locale","resolvedDefaultButtonText","handleButtonClick","handleSendClick","Button","MarkdownFlowInput","InputSection","onChange","onSend","CustomButtonInputVariable","defaultButtonText","defaultInputText","defaultSelectedValues","beforeSend","localeTexts","getContentRenderLocaleTexts","resolvedConfirmButtonText","setInputValue","React","setSelectedValues","interactionDefinitionKey","isMultiSelect","baseButtonTexts","shouldUseFallbackButton","fallbackButtonLabel","singleSelectNode","singleSelectButtonTexts","singleSelectButtonValues","isSingleSelect","param","prev","v","noSelection","e","valueIndex","textIndex"],"mappings":"yYA6DMA,EAAqB,CAAC,CAC1B,KAAAC,EACA,SAAAC,EACA,eAAAC,EACA,WAAAC,EACA,kBAAAC,EACA,qBAAAC,EACA,kBAAAC,EACA,cAAAC,EACA,mBAAAC,CACF,IAA+B,CAC7B,MAAMC,EAAcT,EAAK,YAAY,YAC/BU,EACJT,GAAaC,EAAe,SAAW,GAAK,CAACC,GAAY,KAAA,EAErDQ,EAAuBC,GAC3BC,EAAAA,IAAC,OAAA,CACC,UAAWC,EAAAA,GACT,0DACAJ,EAAkB,gCAAkC,iBACpDE,CAAA,EAGF,SAAAC,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,+DACV,SAAUH,EACV,QAASF,EAER,SAAAJ,CAAA,CAAA,CACH,CAAA,EAIJ,OACEW,EAAAA,KAAC,OAAA,CAAK,UAAU,8CACd,SAAA,CAAAF,EAAAA,IAAC,OAAA,CAAK,UAAU,qCACb,SAAAb,EAAK,YAAY,aAAa,IAAI,CAACgB,EAAMC,IAAU,CAClD,MAAMC,EAAQlB,EAAK,YAAY,eAAeiB,CAAK,EAC7CE,EAAcD,IAAU,OAAYA,EAAQF,EAClD,OACEH,EAAAA,IAACO,EAAAA,SAAA,CAEC,MAAOJ,EACP,SAAUf,EACV,QAASC,EAAe,SAASiB,CAAW,EAC5C,gBAAkBE,GAChBhB,EAAqBc,EAAaE,CAAO,EAE3C,UAAU,SAAA,EAPLJ,CAAA,CAUX,CAAC,CAAA,CACH,EACCR,QACE,OAAA,CAAK,UAAU,kCACd,SAAAM,EAAAA,KAAC,OAAA,CAAK,UAAU,qDACd,SAAA,CAAAF,EAAAA,IAACS,EAAAA,WAAA,CAAW,gBAAerB,EAAU,UAAU,SAC7C,SAAAY,EAAAA,IAACU,EAAAA,mBAAA,CACC,SAAUtB,EACV,YAAAQ,EACA,MAAON,EACP,SAAUG,EACV,UAAWC,EACX,UAAU,eACV,MAAOE,CAAA,CAAA,EAEX,EACCE,EAAoB,UAAU,CAAA,EACjC,CAAA,CACF,EAEAA,EAAoB,kDAAkD,CAAA,EAE1E,CAEJ,EAgBMa,EAAsB,CAAC,CAC3B,IAAAC,EACA,KAAAC,EACA,KAAA1B,EACA,SAAAC,EACA,OAAA0B,EACA,0BAAAC,EACA,kBAAAC,EACA,WAAA1B,EACA,kBAAAG,EACA,gBAAAwB,CACF,IACEf,EAAAA,KAAC,OAAA,CAAK,UAAU,sDACd,SAAA,CAAAF,EAAAA,IAAC,OAAA,CAAK,UAAU,qCACb,SAAAb,EAAK,YAAY,aAAa,IAAI,CAACgB,EAAMC,IAAU,CAClD,MAAMC,EAAQlB,EAAK,YAAY,eAAeiB,CAAK,EAC7CE,EAAcD,IAAU,OAAYA,EAAQF,EAClD,OACEH,EAAAA,IAACkB,EAAAA,OAAA,CAEC,SAAU9B,EACV,QAAQ,UACR,KAAK,SACL,KAAK,KACL,QAAS,IAAM4B,EAAkBV,CAAW,EAC5C,UAAWL,EAAAA,GACT,kGACA,oBACAc,IAA8BZ,GAAQ,QAAA,EAGvC,SAAAA,CAAA,EAZIC,CAAA,CAeX,CAAC,CAAA,CACH,EACCjB,EAAK,YAAY,aAChBa,EAAAA,IAAC,OAAA,CAAK,UAAU,gBACd,SAAAA,EAAAA,IAACmB,EAAAA,QAAA,CACC,IAAAP,EACA,KAAAC,EACA,SAAUzB,EACV,OAAA0B,EACA,YAAa3B,EAAK,WAAW,YAC7B,MAAOG,EACP,SAAUG,EACV,OAAQwB,EACR,MAAO9B,EAAK,WAAW,WAAA,CAAA,CACzB,CACF,CAAA,EAEJ,EAeIiC,EAAe,CAAC,CACpB,IAAAR,EACA,KAAAC,EACA,SAAAzB,EACA,OAAA0B,EACA,YAAAlB,EACA,MAAAS,EACA,SAAAgB,EACA,OAAAC,CACF,IACO1B,EAKHI,EAAAA,IAACmB,EAAAA,QAAA,CACC,IAAAP,EACA,KAAAC,EACA,SAAUzB,EACV,OAAA0B,EACA,YAAAlB,EACA,MAAAS,EACA,SAAAgB,EACA,OAAAC,EACA,MAAO1B,CAAA,CAAA,EAbF,KAmBL2B,EAA4B,CAAC,CACjC,IAAAX,EACA,KAAAC,EACA,KAAA1B,EACA,SAAAC,EACA,OAAA0B,EACA,kBAAAU,EACA,iBAAAC,EACA,sBAAAC,EACA,OAAAJ,EACA,kBAAA/B,EACA,WAAAoC,EAAa,IAAM,EACrB,IAA2B,CACzB,MAAMC,EAAcC,EAAAA,4BAA4Bf,CAAM,EAChDgB,EACJvC,GAAqBqC,EAAY,kBAC7B,CAACtC,EAAYyC,CAAa,EAAIC,EAAM,SAASP,GAAoB,EAAE,EACnE,CAACpC,EAAgB4C,CAAiB,EAAID,EAAM,SAChDN,GAAyB,CAAA,CAAC,EAEtBQ,EAA2B,KAAK,UAAU,CAC9C,YAAa/C,EAAK,YAAY,YAC9B,aAAcA,EAAK,YAAY,aAC/B,cAAeA,EAAK,YAAY,cAChC,YAAaA,EAAK,YAAY,YAC9B,aAAcA,EAAK,YAAY,YAAA,CAChC,EACKgD,EAAgBhD,EAAK,YAAY,eAAiB,GAClDiD,EAAkBjD,EAAK,YAAY,aAAe,CAAA,EAClDkD,EACJ,CAACF,GACDC,EAAgB,SAAW,GAC3B,CAACjD,EAAK,YAAY,YACdmD,EACJnD,EAAK,YAAY,cAAc,KAAA,GAC/BqC,GACAM,EAEIS,EAAmBP,EAAM,QAA4B,IACpDK,EAGE,CACL,GAAGlD,EACH,WAAY,CACV,GAAIA,EAAK,YAAc,CAAA,EACvB,YAAa,CAACmD,CAAmB,EACjC,aAAc,CAACA,CAAmB,CAAA,CACpC,EAROnD,EAUR,CAACmD,EAAqBnD,EAAMkD,CAAuB,CAAC,EAEjDG,EACJD,EAAiB,YAAY,aAAe,CAAA,EACxCE,EACJF,EAAiB,YAAY,cAAgB,CAAA,EACzCG,EAAiB,CAACP,GAAiBK,EAAwB,OAAS,EAEpExB,EAAqBX,GAAkB,CAC3C,MAAMsC,EAAQ,CACZ,aAAcxD,EAAK,YAAY,cAAgB,GAC/C,WAAYkB,CAAA,EAETsB,IAAagB,CAAK,GACvBrB,IAASqB,CAAK,CAChB,EAEMnD,EAAuB,CAACa,EAAeG,IAAqB,CAChEyB,EAAmBW,GACbpC,EACK,CAAC,GAAGoC,EAAMvC,CAAK,EAEfuC,EAAK,OAAQC,GAAMA,IAAMxC,CAAK,CAExC,CACH,EAEMV,EAAqB,IAAM,CAC/B,MAAMmD,EAAczD,EAAe,SAAW,GAAK,CAACC,GAAY,KAAA,EAC1DqD,EAAQ,CACZ,aAAcxD,EAAK,YAAY,cAAgB,GAC/C,eAAAE,EACA,UAAWC,GAAY,QAAU,MAAA,EAE/BF,GAAY0D,GACXnB,IAAagB,CAAK,GACvBrB,IAASqB,CAAK,CAChB,EAEMlD,EAAqBsD,GAA8C,CACvEhB,EAAcgB,EAAE,OAAO,KAAK,CAC9B,EACMrD,EAAiBqD,GAAgD,CACjEA,EAAE,YAAY,aAAeA,EAAE,UAAY,KAG3CA,EAAE,MAAQ,SAAW,CAACA,EAAE,WAC1BA,EAAE,eAAA,EACEZ,EACkB9C,EAAe,SAAW,GAAK,CAACC,EAAW,KAAA,GAC7CK,EAAA,EAElBsB,EAAA,EAGN,EACMA,EAAkB,IAAM,CAC5B,MAAM0B,EAAQ,CACZ,aAAcxD,EAAK,YAAY,cAAgB,GAC/C,UAAWG,CAAA,EAERqC,IAAagB,CAAK,GACvBrB,IAASqB,CAAK,CAChB,EAEM5B,EAA4BiB,EAAM,QAAQ,IAAM,CACpD,GAAI,CAACR,EACH,OAEF,MAAMwB,EAAaP,EAAyB,QAAQjB,CAAiB,EACrE,GAAIwB,EAAa,GACf,OAAOR,EAAwBQ,CAAU,GAAKxB,EAEhD,MAAMyB,EAAYT,EAAwB,QAAQhB,CAAiB,EACnE,GAAIyB,EAAY,GACd,OAAOT,EAAwBS,CAAS,CAG5C,EAAG,CAACzB,EAAmBgB,EAAyBC,CAAwB,CAAC,EAEzE,OAAAT,EAAM,UAAU,IAAM,CACpBD,EAAcN,GAAoB,EAAE,CACtC,EAAG,CAACA,EAAkBS,CAAwB,CAAC,EAE/CF,EAAM,UAAU,IAAM,CACpBC,EAAkBP,GAAyB,EAAE,CAC/C,EAAG,CAACA,EAAuBQ,CAAwB,CAAC,EAGlDhC,EAAAA,KAAC,OAAA,CAAK,UAAU,+DACb,SAAA,CAAAiC,GACCnC,EAAAA,IAACd,EAAA,CACC,KAAAC,EACA,SAAAC,EACA,eAAAC,EACA,WAAAC,EACA,kBAAmBwC,EACnB,qBAAAtC,EACA,kBAAAC,EACA,cAAAC,EACA,mBAAAC,CAAA,CAAA,EAIH,CAACwC,GAAiBO,GACjB1C,EAAAA,IAACW,EAAA,CACC,IAAAC,EACA,KAAAC,EACA,KAAM0B,EACN,SAAAnD,EACA,OAAA0B,EACA,0BAAAC,EACA,kBAAAC,EACA,WAAA1B,EACA,kBAAAG,EACA,gBAAAwB,CAAA,CAAA,EAIH,CAACkB,GAAiB,CAACO,GAAkBvD,EAAK,YAAY,aACrDa,EAAAA,IAACoB,EAAA,CACC,IAAAR,EACA,KAAAC,EACA,SAAAzB,EACA,OAAA0B,EACA,YAAa3B,EAAK,WAAW,YAC7B,MAAOG,EACP,SAAUG,EACV,OAAQwB,CAAA,CAAA,CACV,EAEJ,CAEJ"}
|
|
1
|
+
{"version":3,"file":"CustomVariable.cjs","sources":["../../../../src/components/ContentRender/plugins/CustomVariable.tsx"],"sourcesContent":["import React from \"react\";\nimport { normalizeVariableName } from \"remark-flow\";\nimport type { Components } from \"react-markdown\";\nimport { OnSendContentParams } from \"../../types\";\nimport { Button } from \"../../ui/button\";\nimport { Checkbox } from \"../../ui/checkbox\";\nimport MarkdownFlowInput from \"../MarkdownFlowInput\";\nimport {\n InputGroup,\n InputGroupTextarea,\n} from \"../../ui/inputGroup/input-group\";\nimport type { MarkdownFlowLocale } from \"../../../lib/locale\";\nimport { cn } from \"../../../lib/utils\";\nimport { getContentRenderLocaleTexts } from \"../contentRenderI18n\";\n\n// Define custom variable node type\ninterface CustomVariableNode {\n tagName: \"custom-variable\";\n properties?: {\n variableName?: string;\n buttonTexts?: string[];\n buttonValues?: string[];\n placeholder?: string;\n isMultiSelect?: boolean;\n };\n}\n\n// Define custom variable component Props type\ninterface CustomVariableProps {\n /** Explicit direction for nested input controls. */\n dir?: React.HTMLAttributes<HTMLDivElement>[\"dir\"];\n /** Explicit language for nested input controls. */\n lang?: string;\n node: CustomVariableNode;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n locale?: MarkdownFlowLocale;\n readonly?: boolean;\n onSend?: (content: OnSendContentParams) => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n beforeSend?: (param: OnSendContentParams) => boolean;\n}\n\ninterface ComponentsWithCustomVariable extends Components {\n \"custom-variable\"?: React.ComponentType<CustomVariableProps>;\n}\n\n// Multi select section( with checkboxes and input)\ninterface MultiSelectSectionProps {\n node: CustomVariableNode;\n readonly?: boolean;\n selectedValues: string[];\n inputValue: string;\n confirmButtonText: string;\n handleCheckboxChange: (value: string, checked: boolean) => void;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n handleConfirmClick: () => void;\n}\n\nconst MultiSelectSection = ({\n node,\n readonly,\n selectedValues,\n inputValue,\n confirmButtonText,\n handleCheckboxChange,\n handleInputChange,\n handleKeyDown,\n handleConfirmClick,\n}: MultiSelectSectionProps) => {\n const placeholder = node.properties?.placeholder;\n const confirmDisabled =\n readonly || (selectedValues.length === 0 && !inputValue?.trim());\n\n const renderConfirmButton = (extraWrapperClassName?: string) => (\n <span\n className={cn(\n \"multi-select-confirm-wrapper flex flex-col items-center\",\n confirmDisabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n extraWrapperClassName\n )}\n >\n <button\n type=\"button\"\n className=\"multi-select-confirm-button text-sm font-medium text-primary\"\n disabled={confirmDisabled}\n onClick={handleConfirmClick}\n >\n {confirmButtonText}\n </button>\n </span>\n );\n\n return (\n <span className=\"multi-select-container flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-6\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Checkbox\n key={index}\n label={text}\n disabled={readonly}\n checked={selectedValues.includes(buttonValue)}\n onCheckedChange={(checked) =>\n handleCheckboxChange(buttonValue, checked)\n }\n className=\"text-sm\"\n />\n );\n })}\n </span>\n {placeholder ? (\n <span className=\"block mb-1 w-full max-w-[500px]\">\n <span className=\"multi-select-input-row flex w-full items-end gap-3\">\n <InputGroup data-disabled={readonly} className=\"flex-1\">\n <InputGroupTextarea\n disabled={readonly}\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n className=\"text-sm px-3\"\n title={placeholder}\n />\n </InputGroup>\n {renderConfirmButton(\"shrink-0\")}\n </span>\n </span>\n ) : (\n renderConfirmButton(\"self-start multi-select-confirm-wrapper--stacked\")\n )}\n </span>\n );\n};\n\n// Single select section( with buttons and input)\ninterface SingleSelectSectionProps {\n dir?: CustomVariableProps[\"dir\"];\n lang?: string;\n node: CustomVariableNode;\n readonly?: boolean;\n locale?: MarkdownFlowLocale;\n resolvedDefaultButtonText?: string;\n handleButtonClick: (value: string) => void;\n inputValue: string;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleSendClick: () => void;\n}\n\nconst SingleSelectSection = ({\n dir,\n lang,\n node,\n readonly,\n locale,\n resolvedDefaultButtonText,\n handleButtonClick,\n inputValue,\n handleInputChange,\n handleSendClick,\n}: SingleSelectSectionProps) => (\n <span className=\"single-select-container inline-flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-2\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Button\n key={index}\n disabled={readonly}\n variant=\"outline\"\n type=\"button\"\n size=\"sm\"\n onClick={() => handleButtonClick(buttonValue)}\n className={cn(\n \"max-w-full shrink whitespace-normal break-words text-start leading-5 h-auto min-h-8 px-3 py-1.5\",\n \"hover:bg-gray-200\",\n resolvedDefaultButtonText === text && \"select\"\n )}\n >\n {text}\n </Button>\n );\n })}\n </span>\n {node.properties?.placeholder && (\n <span className=\"mt-[9px] mb-1\">\n <MarkdownFlowInput\n dir={dir}\n lang={lang}\n disabled={readonly}\n locale={locale}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n title={node.properties.placeholder}\n />\n </span>\n )}\n </span>\n);\n\n// Pure input\ninterface InputSectionProps {\n dir?: CustomVariableProps[\"dir\"];\n lang?: string;\n readonly?: boolean;\n locale?: MarkdownFlowLocale;\n placeholder?: string;\n value: string;\n onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onSend: () => void;\n}\n\nconst InputSection = ({\n dir,\n lang,\n readonly,\n locale,\n placeholder,\n value,\n onChange,\n onSend,\n}: InputSectionProps) => {\n if (!placeholder) {\n return null;\n }\n\n return (\n <MarkdownFlowInput\n dir={dir}\n lang={lang}\n disabled={readonly}\n locale={locale}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n onSend={onSend}\n title={placeholder}\n />\n );\n};\n\n// Define custom variable component\nconst CustomButtonInputVariable = ({\n dir,\n lang,\n node,\n readonly,\n locale,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n onSend,\n confirmButtonText,\n beforeSend = () => true,\n}: CustomVariableProps) => {\n const localeTexts = getContentRenderLocaleTexts(locale);\n const resolvedConfirmButtonText =\n confirmButtonText || localeTexts.confirmButtonText;\n const [inputValue, setInputValue] = React.useState(defaultInputText || \"\");\n const [selectedValues, setSelectedValues] = React.useState<string[]>(\n defaultSelectedValues || []\n );\n const interactionDefinitionKey = JSON.stringify({\n buttonTexts: node.properties?.buttonTexts,\n buttonValues: node.properties?.buttonValues,\n isMultiSelect: node.properties?.isMultiSelect,\n placeholder: node.properties?.placeholder,\n variableName: node.properties?.variableName,\n });\n const isMultiSelect = node.properties?.isMultiSelect ?? false;\n const baseButtonTexts = node.properties?.buttonTexts || [];\n const shouldUseFallbackButton =\n !isMultiSelect &&\n baseButtonTexts.length === 0 &&\n !node.properties?.placeholder;\n const fallbackButtonLabel =\n normalizeVariableName(node.properties?.variableName || \"\") ||\n defaultButtonText ||\n resolvedConfirmButtonText;\n\n const singleSelectNode = React.useMemo<CustomVariableNode>(() => {\n if (!shouldUseFallbackButton) {\n return node;\n }\n return {\n ...node,\n properties: {\n ...(node.properties || {}),\n buttonTexts: [fallbackButtonLabel],\n buttonValues: [fallbackButtonLabel],\n },\n };\n }, [fallbackButtonLabel, node, shouldUseFallbackButton]);\n\n const singleSelectButtonTexts =\n singleSelectNode.properties?.buttonTexts || [];\n const singleSelectButtonValues =\n singleSelectNode.properties?.buttonValues || [];\n const isSingleSelect = !isMultiSelect && singleSelectButtonTexts.length > 0;\n\n const handleButtonClick = (value: string) => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n buttonText: value,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleCheckboxChange = (value: string, checked: boolean) => {\n setSelectedValues((prev) => {\n if (checked) {\n return [...prev, value];\n } else {\n return prev.filter((v) => v !== value);\n }\n });\n };\n\n const handleConfirmClick = () => {\n const noSelection = selectedValues.length === 0 && !inputValue?.trim();\n const param = {\n variableName: node.properties?.variableName || \"\",\n selectedValues,\n inputText: inputValue?.trim() || undefined,\n };\n if (readonly || noSelection) return;\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInputValue(e.target.value);\n };\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.nativeEvent.isComposing || e.keyCode === 229) {\n return;\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (isMultiSelect) {\n const noSelection = selectedValues.length === 0 && !inputValue.trim();\n if (!noSelection) handleConfirmClick();\n } else {\n handleSendClick();\n }\n }\n };\n const handleSendClick = () => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n inputText: inputValue,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const resolvedDefaultButtonText = React.useMemo(() => {\n if (!defaultButtonText) {\n return undefined;\n }\n const valueIndex = singleSelectButtonValues.indexOf(defaultButtonText);\n if (valueIndex > -1) {\n return singleSelectButtonTexts[valueIndex] ?? defaultButtonText;\n }\n const textIndex = singleSelectButtonTexts.indexOf(defaultButtonText);\n if (textIndex > -1) {\n return singleSelectButtonTexts[textIndex];\n }\n return undefined;\n }, [defaultButtonText, singleSelectButtonTexts, singleSelectButtonValues]);\n\n React.useEffect(() => {\n setInputValue(defaultInputText || \"\");\n }, [defaultInputText, interactionDefinitionKey]);\n\n React.useEffect(() => {\n setSelectedValues(defaultSelectedValues || []);\n }, [defaultSelectedValues, interactionDefinitionKey]);\n\n return (\n <span className=\"custom-variable-container inline-flex items-center flex-wrap\">\n {isMultiSelect && (\n <MultiSelectSection\n node={node}\n readonly={readonly}\n selectedValues={selectedValues}\n inputValue={inputValue}\n confirmButtonText={resolvedConfirmButtonText}\n handleCheckboxChange={handleCheckboxChange}\n handleInputChange={handleInputChange}\n handleKeyDown={handleKeyDown}\n handleConfirmClick={handleConfirmClick}\n />\n )}\n\n {!isMultiSelect && isSingleSelect && (\n <SingleSelectSection\n dir={dir}\n lang={lang}\n node={singleSelectNode}\n readonly={readonly}\n locale={locale}\n resolvedDefaultButtonText={resolvedDefaultButtonText}\n handleButtonClick={handleButtonClick}\n inputValue={inputValue}\n handleInputChange={handleInputChange}\n handleSendClick={handleSendClick}\n />\n )}\n\n {!isMultiSelect && !isSingleSelect && node.properties?.placeholder && (\n <InputSection\n dir={dir}\n lang={lang}\n readonly={readonly}\n locale={locale}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n />\n )}\n </span>\n );\n};\n\nexport default CustomButtonInputVariable;\nexport type {\n ComponentsWithCustomVariable,\n CustomVariableNode,\n CustomVariableProps,\n};\n"],"names":["MultiSelectSection","node","readonly","selectedValues","inputValue","confirmButtonText","handleCheckboxChange","handleInputChange","handleKeyDown","handleConfirmClick","placeholder","confirmDisabled","renderConfirmButton","extraWrapperClassName","jsx","cn","jsxs","text","index","value","buttonValue","Checkbox","checked","InputGroup","InputGroupTextarea","SingleSelectSection","dir","lang","locale","resolvedDefaultButtonText","handleButtonClick","handleSendClick","Button","MarkdownFlowInput","InputSection","onChange","onSend","CustomButtonInputVariable","defaultButtonText","defaultInputText","defaultSelectedValues","beforeSend","localeTexts","getContentRenderLocaleTexts","resolvedConfirmButtonText","setInputValue","React","setSelectedValues","interactionDefinitionKey","isMultiSelect","baseButtonTexts","shouldUseFallbackButton","fallbackButtonLabel","normalizeVariableName","singleSelectNode","singleSelectButtonTexts","singleSelectButtonValues","isSingleSelect","param","prev","v","noSelection","e","valueIndex","textIndex"],"mappings":"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"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { jsxs as w, jsx as r } from "react/jsx-runtime";
|
|
2
2
|
import v from "react";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { d as J } from "../../../_virtual/index.es.js";
|
|
4
|
+
import { Button as U } from "../../ui/button.es.js";
|
|
5
|
+
import { Checkbox as q } from "../../ui/checkbox.es.js";
|
|
5
6
|
import O from "../MarkdownFlowInput.es.js";
|
|
6
|
-
import { InputGroup as
|
|
7
|
+
import { InputGroup as A, InputGroupTextarea as H } from "../../ui/inputGroup/input-group.es.js";
|
|
7
8
|
import { cn as j } from "../../../lib/utils.es.js";
|
|
8
|
-
import { getContentRenderLocaleTexts as
|
|
9
|
-
const
|
|
9
|
+
import { getContentRenderLocaleTexts as P } from "../contentRenderI18n.es.js";
|
|
10
|
+
const Q = ({
|
|
10
11
|
node: c,
|
|
11
12
|
readonly: i,
|
|
12
13
|
selectedValues: e,
|
|
13
14
|
inputValue: s,
|
|
14
15
|
confirmButtonText: o,
|
|
15
|
-
handleCheckboxChange:
|
|
16
|
+
handleCheckboxChange: l,
|
|
16
17
|
handleInputChange: m,
|
|
17
18
|
handleKeyDown: f,
|
|
18
19
|
handleConfirmClick: h
|
|
@@ -38,23 +39,23 @@ const P = ({
|
|
|
38
39
|
}
|
|
39
40
|
);
|
|
40
41
|
return /* @__PURE__ */ w("span", { className: "multi-select-container flex w-full flex-col", children: [
|
|
41
|
-
/* @__PURE__ */ r("span", { className: "flex flex-wrap gap-y-[9px] gap-x-6", children: c.properties?.buttonTexts?.map((u,
|
|
42
|
-
const N = c.properties?.buttonValues?.[
|
|
42
|
+
/* @__PURE__ */ r("span", { className: "flex flex-wrap gap-y-[9px] gap-x-6", children: c.properties?.buttonTexts?.map((u, n) => {
|
|
43
|
+
const N = c.properties?.buttonValues?.[n], d = N !== void 0 ? N : u;
|
|
43
44
|
return /* @__PURE__ */ r(
|
|
44
|
-
|
|
45
|
+
q,
|
|
45
46
|
{
|
|
46
47
|
label: u,
|
|
47
48
|
disabled: i,
|
|
48
49
|
checked: e.includes(d),
|
|
49
|
-
onCheckedChange: (k) =>
|
|
50
|
+
onCheckedChange: (k) => l(d, k),
|
|
50
51
|
className: "text-sm"
|
|
51
52
|
},
|
|
52
|
-
|
|
53
|
+
n
|
|
53
54
|
);
|
|
54
55
|
}) }),
|
|
55
56
|
b ? /* @__PURE__ */ r("span", { className: "block mb-1 w-full max-w-[500px]", children: /* @__PURE__ */ w("span", { className: "multi-select-input-row flex w-full items-end gap-3", children: [
|
|
56
|
-
/* @__PURE__ */ r(
|
|
57
|
-
|
|
57
|
+
/* @__PURE__ */ r(A, { "data-disabled": i, className: "flex-1", children: /* @__PURE__ */ r(
|
|
58
|
+
H,
|
|
58
59
|
{
|
|
59
60
|
disabled: i,
|
|
60
61
|
placeholder: b,
|
|
@@ -68,32 +69,32 @@ const P = ({
|
|
|
68
69
|
x("shrink-0")
|
|
69
70
|
] }) }) : x("self-start multi-select-confirm-wrapper--stacked")
|
|
70
71
|
] });
|
|
71
|
-
},
|
|
72
|
+
}, W = ({
|
|
72
73
|
dir: c,
|
|
73
74
|
lang: i,
|
|
74
75
|
node: e,
|
|
75
76
|
readonly: s,
|
|
76
77
|
locale: o,
|
|
77
|
-
resolvedDefaultButtonText:
|
|
78
|
+
resolvedDefaultButtonText: l,
|
|
78
79
|
handleButtonClick: m,
|
|
79
80
|
inputValue: f,
|
|
80
81
|
handleInputChange: h,
|
|
81
82
|
handleSendClick: b
|
|
82
83
|
}) => /* @__PURE__ */ w("span", { className: "single-select-container inline-flex w-full flex-col", children: [
|
|
83
84
|
/* @__PURE__ */ r("span", { className: "flex flex-wrap gap-y-[9px] gap-x-2", children: e.properties?.buttonTexts?.map((p, x) => {
|
|
84
|
-
const u = e.properties?.buttonValues?.[x],
|
|
85
|
+
const u = e.properties?.buttonValues?.[x], n = u !== void 0 ? u : p;
|
|
85
86
|
return /* @__PURE__ */ r(
|
|
86
|
-
|
|
87
|
+
U,
|
|
87
88
|
{
|
|
88
89
|
disabled: s,
|
|
89
90
|
variant: "outline",
|
|
90
91
|
type: "button",
|
|
91
92
|
size: "sm",
|
|
92
|
-
onClick: () => m(
|
|
93
|
+
onClick: () => m(n),
|
|
93
94
|
className: j(
|
|
94
95
|
"max-w-full shrink whitespace-normal break-words text-start leading-5 h-auto min-h-8 px-3 py-1.5",
|
|
95
96
|
"hover:bg-gray-200",
|
|
96
|
-
|
|
97
|
+
l === p && "select"
|
|
97
98
|
),
|
|
98
99
|
children: p
|
|
99
100
|
},
|
|
@@ -114,13 +115,13 @@ const P = ({
|
|
|
114
115
|
title: e.properties.placeholder
|
|
115
116
|
}
|
|
116
117
|
) })
|
|
117
|
-
] }),
|
|
118
|
+
] }), X = ({
|
|
118
119
|
dir: c,
|
|
119
120
|
lang: i,
|
|
120
121
|
readonly: e,
|
|
121
122
|
locale: s,
|
|
122
123
|
placeholder: o,
|
|
123
|
-
value:
|
|
124
|
+
value: l,
|
|
124
125
|
onChange: m,
|
|
125
126
|
onSend: f
|
|
126
127
|
}) => o ? /* @__PURE__ */ r(
|
|
@@ -131,25 +132,25 @@ const P = ({
|
|
|
131
132
|
disabled: e,
|
|
132
133
|
locale: s,
|
|
133
134
|
placeholder: o,
|
|
134
|
-
value:
|
|
135
|
+
value: l,
|
|
135
136
|
onChange: m,
|
|
136
137
|
onSend: f,
|
|
137
138
|
title: o
|
|
138
139
|
}
|
|
139
|
-
) : null,
|
|
140
|
+
) : null, ie = ({
|
|
140
141
|
dir: c,
|
|
141
142
|
lang: i,
|
|
142
143
|
node: e,
|
|
143
144
|
readonly: s,
|
|
144
145
|
locale: o,
|
|
145
|
-
defaultButtonText:
|
|
146
|
+
defaultButtonText: l,
|
|
146
147
|
defaultInputText: m,
|
|
147
148
|
defaultSelectedValues: f,
|
|
148
149
|
onSend: h,
|
|
149
150
|
confirmButtonText: b,
|
|
150
151
|
beforeSend: p = () => !0
|
|
151
152
|
}) => {
|
|
152
|
-
const x =
|
|
153
|
+
const x = P(o), u = b || x.confirmButtonText, [n, N] = v.useState(m || ""), [d, k] = v.useState(
|
|
153
154
|
f || []
|
|
154
155
|
), B = JSON.stringify({
|
|
155
156
|
buttonTexts: e.properties?.buttonTexts,
|
|
@@ -157,91 +158,91 @@ const P = ({
|
|
|
157
158
|
isMultiSelect: e.properties?.isMultiSelect,
|
|
158
159
|
placeholder: e.properties?.placeholder,
|
|
159
160
|
variableName: e.properties?.variableName
|
|
160
|
-
}), g = e.properties?.isMultiSelect ?? !1,
|
|
161
|
+
}), g = e.properties?.isMultiSelect ?? !1, z = e.properties?.buttonTexts || [], M = !g && z.length === 0 && !e.properties?.placeholder, S = J.normalizeVariableName(e.properties?.variableName || "") || l || u, T = v.useMemo(() => M ? {
|
|
161
162
|
...e,
|
|
162
163
|
properties: {
|
|
163
164
|
...e.properties || {},
|
|
164
165
|
buttonTexts: [S],
|
|
165
166
|
buttonValues: [S]
|
|
166
167
|
}
|
|
167
|
-
} : e, [S, e, M]), C = T.properties?.buttonTexts || [], I = T.properties?.buttonValues || [], D = !g && C.length > 0,
|
|
168
|
+
} : e, [S, e, M]), C = T.properties?.buttonTexts || [], I = T.properties?.buttonValues || [], D = !g && C.length > 0, F = (t) => {
|
|
168
169
|
const a = {
|
|
169
170
|
variableName: e.properties?.variableName || "",
|
|
170
171
|
buttonText: t
|
|
171
172
|
};
|
|
172
173
|
p?.(a) && h?.(a);
|
|
173
|
-
},
|
|
174
|
-
k((K) => a ? [...K, t] : K.filter((
|
|
174
|
+
}, G = (t, a) => {
|
|
175
|
+
k((K) => a ? [...K, t] : K.filter((_) => _ !== t));
|
|
175
176
|
}, E = () => {
|
|
176
|
-
const t = d.length === 0 && !
|
|
177
|
+
const t = d.length === 0 && !n?.trim(), a = {
|
|
177
178
|
variableName: e.properties?.variableName || "",
|
|
178
179
|
selectedValues: d,
|
|
179
|
-
inputText:
|
|
180
|
+
inputText: n?.trim() || void 0
|
|
180
181
|
};
|
|
181
182
|
s || t || p?.(a) && h?.(a);
|
|
182
183
|
}, V = (t) => {
|
|
183
184
|
N(t.target.value);
|
|
184
|
-
},
|
|
185
|
-
t.nativeEvent.isComposing || t.keyCode === 229 || t.key === "Enter" && !t.shiftKey && (t.preventDefault(), g ? d.length === 0 && !
|
|
185
|
+
}, L = (t) => {
|
|
186
|
+
t.nativeEvent.isComposing || t.keyCode === 229 || t.key === "Enter" && !t.shiftKey && (t.preventDefault(), g ? d.length === 0 && !n.trim() || E() : y());
|
|
186
187
|
}, y = () => {
|
|
187
188
|
const t = {
|
|
188
189
|
variableName: e.properties?.variableName || "",
|
|
189
|
-
inputText:
|
|
190
|
+
inputText: n
|
|
190
191
|
};
|
|
191
192
|
p?.(t) && h?.(t);
|
|
192
|
-
},
|
|
193
|
-
if (!
|
|
193
|
+
}, R = v.useMemo(() => {
|
|
194
|
+
if (!l)
|
|
194
195
|
return;
|
|
195
|
-
const t = I.indexOf(
|
|
196
|
+
const t = I.indexOf(l);
|
|
196
197
|
if (t > -1)
|
|
197
|
-
return C[t] ??
|
|
198
|
-
const a = C.indexOf(
|
|
198
|
+
return C[t] ?? l;
|
|
199
|
+
const a = C.indexOf(l);
|
|
199
200
|
if (a > -1)
|
|
200
201
|
return C[a];
|
|
201
|
-
}, [
|
|
202
|
+
}, [l, C, I]);
|
|
202
203
|
return v.useEffect(() => {
|
|
203
204
|
N(m || "");
|
|
204
205
|
}, [m, B]), v.useEffect(() => {
|
|
205
206
|
k(f || []);
|
|
206
207
|
}, [f, B]), /* @__PURE__ */ w("span", { className: "custom-variable-container inline-flex items-center flex-wrap", children: [
|
|
207
208
|
g && /* @__PURE__ */ r(
|
|
208
|
-
|
|
209
|
+
Q,
|
|
209
210
|
{
|
|
210
211
|
node: e,
|
|
211
212
|
readonly: s,
|
|
212
213
|
selectedValues: d,
|
|
213
|
-
inputValue:
|
|
214
|
+
inputValue: n,
|
|
214
215
|
confirmButtonText: u,
|
|
215
|
-
handleCheckboxChange:
|
|
216
|
+
handleCheckboxChange: G,
|
|
216
217
|
handleInputChange: V,
|
|
217
|
-
handleKeyDown:
|
|
218
|
+
handleKeyDown: L,
|
|
218
219
|
handleConfirmClick: E
|
|
219
220
|
}
|
|
220
221
|
),
|
|
221
222
|
!g && D && /* @__PURE__ */ r(
|
|
222
|
-
|
|
223
|
+
W,
|
|
223
224
|
{
|
|
224
225
|
dir: c,
|
|
225
226
|
lang: i,
|
|
226
227
|
node: T,
|
|
227
228
|
readonly: s,
|
|
228
229
|
locale: o,
|
|
229
|
-
resolvedDefaultButtonText:
|
|
230
|
-
handleButtonClick:
|
|
231
|
-
inputValue:
|
|
230
|
+
resolvedDefaultButtonText: R,
|
|
231
|
+
handleButtonClick: F,
|
|
232
|
+
inputValue: n,
|
|
232
233
|
handleInputChange: V,
|
|
233
234
|
handleSendClick: y
|
|
234
235
|
}
|
|
235
236
|
),
|
|
236
237
|
!g && !D && e.properties?.placeholder && /* @__PURE__ */ r(
|
|
237
|
-
|
|
238
|
+
X,
|
|
238
239
|
{
|
|
239
240
|
dir: c,
|
|
240
241
|
lang: i,
|
|
241
242
|
readonly: s,
|
|
242
243
|
locale: o,
|
|
243
244
|
placeholder: e.properties.placeholder,
|
|
244
|
-
value:
|
|
245
|
+
value: n,
|
|
245
246
|
onChange: V,
|
|
246
247
|
onSend: y
|
|
247
248
|
}
|
|
@@ -249,6 +250,6 @@ const P = ({
|
|
|
249
250
|
] });
|
|
250
251
|
};
|
|
251
252
|
export {
|
|
252
|
-
|
|
253
|
+
ie as default
|
|
253
254
|
};
|
|
254
255
|
//# sourceMappingURL=CustomVariable.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomVariable.es.js","sources":["../../../../src/components/ContentRender/plugins/CustomVariable.tsx"],"sourcesContent":["import React from \"react\";\nimport type { Components } from \"react-markdown\";\nimport { OnSendContentParams } from \"../../types\";\nimport { Button } from \"../../ui/button\";\nimport { Checkbox } from \"../../ui/checkbox\";\nimport MarkdownFlowInput from \"../MarkdownFlowInput\";\nimport {\n InputGroup,\n InputGroupTextarea,\n} from \"../../ui/inputGroup/input-group\";\nimport type { MarkdownFlowLocale } from \"../../../lib/locale\";\nimport { cn } from \"../../../lib/utils\";\nimport { getContentRenderLocaleTexts } from \"../contentRenderI18n\";\n\n// Define custom variable node type\ninterface CustomVariableNode {\n tagName: \"custom-variable\";\n properties?: {\n variableName?: string;\n buttonTexts?: string[];\n buttonValues?: string[];\n placeholder?: string;\n isMultiSelect?: boolean;\n };\n}\n\n// Define custom variable component Props type\ninterface CustomVariableProps {\n /** Explicit direction for nested input controls. */\n dir?: React.HTMLAttributes<HTMLDivElement>[\"dir\"];\n /** Explicit language for nested input controls. */\n lang?: string;\n node: CustomVariableNode;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n locale?: MarkdownFlowLocale;\n readonly?: boolean;\n onSend?: (content: OnSendContentParams) => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n beforeSend?: (param: OnSendContentParams) => boolean;\n}\n\ninterface ComponentsWithCustomVariable extends Components {\n \"custom-variable\"?: React.ComponentType<CustomVariableProps>;\n}\n\n// Multi select section( with checkboxes and input)\ninterface MultiSelectSectionProps {\n node: CustomVariableNode;\n readonly?: boolean;\n selectedValues: string[];\n inputValue: string;\n confirmButtonText: string;\n handleCheckboxChange: (value: string, checked: boolean) => void;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n handleConfirmClick: () => void;\n}\n\nconst MultiSelectSection = ({\n node,\n readonly,\n selectedValues,\n inputValue,\n confirmButtonText,\n handleCheckboxChange,\n handleInputChange,\n handleKeyDown,\n handleConfirmClick,\n}: MultiSelectSectionProps) => {\n const placeholder = node.properties?.placeholder;\n const confirmDisabled =\n readonly || (selectedValues.length === 0 && !inputValue?.trim());\n\n const renderConfirmButton = (extraWrapperClassName?: string) => (\n <span\n className={cn(\n \"multi-select-confirm-wrapper flex flex-col items-center\",\n confirmDisabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n extraWrapperClassName\n )}\n >\n <button\n type=\"button\"\n className=\"multi-select-confirm-button text-sm font-medium text-primary\"\n disabled={confirmDisabled}\n onClick={handleConfirmClick}\n >\n {confirmButtonText}\n </button>\n </span>\n );\n\n return (\n <span className=\"multi-select-container flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-6\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Checkbox\n key={index}\n label={text}\n disabled={readonly}\n checked={selectedValues.includes(buttonValue)}\n onCheckedChange={(checked) =>\n handleCheckboxChange(buttonValue, checked)\n }\n className=\"text-sm\"\n />\n );\n })}\n </span>\n {placeholder ? (\n <span className=\"block mb-1 w-full max-w-[500px]\">\n <span className=\"multi-select-input-row flex w-full items-end gap-3\">\n <InputGroup data-disabled={readonly} className=\"flex-1\">\n <InputGroupTextarea\n disabled={readonly}\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n className=\"text-sm px-3\"\n title={placeholder}\n />\n </InputGroup>\n {renderConfirmButton(\"shrink-0\")}\n </span>\n </span>\n ) : (\n renderConfirmButton(\"self-start multi-select-confirm-wrapper--stacked\")\n )}\n </span>\n );\n};\n\n// Single select section( with buttons and input)\ninterface SingleSelectSectionProps {\n dir?: CustomVariableProps[\"dir\"];\n lang?: string;\n node: CustomVariableNode;\n readonly?: boolean;\n locale?: MarkdownFlowLocale;\n resolvedDefaultButtonText?: string;\n handleButtonClick: (value: string) => void;\n inputValue: string;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleSendClick: () => void;\n}\n\nconst SingleSelectSection = ({\n dir,\n lang,\n node,\n readonly,\n locale,\n resolvedDefaultButtonText,\n handleButtonClick,\n inputValue,\n handleInputChange,\n handleSendClick,\n}: SingleSelectSectionProps) => (\n <span className=\"single-select-container inline-flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-2\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Button\n key={index}\n disabled={readonly}\n variant=\"outline\"\n type=\"button\"\n size=\"sm\"\n onClick={() => handleButtonClick(buttonValue)}\n className={cn(\n \"max-w-full shrink whitespace-normal break-words text-start leading-5 h-auto min-h-8 px-3 py-1.5\",\n \"hover:bg-gray-200\",\n resolvedDefaultButtonText === text && \"select\"\n )}\n >\n {text}\n </Button>\n );\n })}\n </span>\n {node.properties?.placeholder && (\n <span className=\"mt-[9px] mb-1\">\n <MarkdownFlowInput\n dir={dir}\n lang={lang}\n disabled={readonly}\n locale={locale}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n title={node.properties.placeholder}\n />\n </span>\n )}\n </span>\n);\n\n// Pure input\ninterface InputSectionProps {\n dir?: CustomVariableProps[\"dir\"];\n lang?: string;\n readonly?: boolean;\n locale?: MarkdownFlowLocale;\n placeholder?: string;\n value: string;\n onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onSend: () => void;\n}\n\nconst InputSection = ({\n dir,\n lang,\n readonly,\n locale,\n placeholder,\n value,\n onChange,\n onSend,\n}: InputSectionProps) => {\n if (!placeholder) {\n return null;\n }\n\n return (\n <MarkdownFlowInput\n dir={dir}\n lang={lang}\n disabled={readonly}\n locale={locale}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n onSend={onSend}\n title={placeholder}\n />\n );\n};\n\n// Define custom variable component\nconst CustomButtonInputVariable = ({\n dir,\n lang,\n node,\n readonly,\n locale,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n onSend,\n confirmButtonText,\n beforeSend = () => true,\n}: CustomVariableProps) => {\n const localeTexts = getContentRenderLocaleTexts(locale);\n const resolvedConfirmButtonText =\n confirmButtonText || localeTexts.confirmButtonText;\n const [inputValue, setInputValue] = React.useState(defaultInputText || \"\");\n const [selectedValues, setSelectedValues] = React.useState<string[]>(\n defaultSelectedValues || []\n );\n const interactionDefinitionKey = JSON.stringify({\n buttonTexts: node.properties?.buttonTexts,\n buttonValues: node.properties?.buttonValues,\n isMultiSelect: node.properties?.isMultiSelect,\n placeholder: node.properties?.placeholder,\n variableName: node.properties?.variableName,\n });\n const isMultiSelect = node.properties?.isMultiSelect ?? false;\n const baseButtonTexts = node.properties?.buttonTexts || [];\n const shouldUseFallbackButton =\n !isMultiSelect &&\n baseButtonTexts.length === 0 &&\n !node.properties?.placeholder;\n const fallbackButtonLabel =\n node.properties?.variableName?.trim() ||\n defaultButtonText ||\n resolvedConfirmButtonText;\n\n const singleSelectNode = React.useMemo<CustomVariableNode>(() => {\n if (!shouldUseFallbackButton) {\n return node;\n }\n return {\n ...node,\n properties: {\n ...(node.properties || {}),\n buttonTexts: [fallbackButtonLabel],\n buttonValues: [fallbackButtonLabel],\n },\n };\n }, [fallbackButtonLabel, node, shouldUseFallbackButton]);\n\n const singleSelectButtonTexts =\n singleSelectNode.properties?.buttonTexts || [];\n const singleSelectButtonValues =\n singleSelectNode.properties?.buttonValues || [];\n const isSingleSelect = !isMultiSelect && singleSelectButtonTexts.length > 0;\n\n const handleButtonClick = (value: string) => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n buttonText: value,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleCheckboxChange = (value: string, checked: boolean) => {\n setSelectedValues((prev) => {\n if (checked) {\n return [...prev, value];\n } else {\n return prev.filter((v) => v !== value);\n }\n });\n };\n\n const handleConfirmClick = () => {\n const noSelection = selectedValues.length === 0 && !inputValue?.trim();\n const param = {\n variableName: node.properties?.variableName || \"\",\n selectedValues,\n inputText: inputValue?.trim() || undefined,\n };\n if (readonly || noSelection) return;\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInputValue(e.target.value);\n };\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.nativeEvent.isComposing || e.keyCode === 229) {\n return;\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (isMultiSelect) {\n const noSelection = selectedValues.length === 0 && !inputValue.trim();\n if (!noSelection) handleConfirmClick();\n } else {\n handleSendClick();\n }\n }\n };\n const handleSendClick = () => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n inputText: inputValue,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const resolvedDefaultButtonText = React.useMemo(() => {\n if (!defaultButtonText) {\n return undefined;\n }\n const valueIndex = singleSelectButtonValues.indexOf(defaultButtonText);\n if (valueIndex > -1) {\n return singleSelectButtonTexts[valueIndex] ?? defaultButtonText;\n }\n const textIndex = singleSelectButtonTexts.indexOf(defaultButtonText);\n if (textIndex > -1) {\n return singleSelectButtonTexts[textIndex];\n }\n return undefined;\n }, [defaultButtonText, singleSelectButtonTexts, singleSelectButtonValues]);\n\n React.useEffect(() => {\n setInputValue(defaultInputText || \"\");\n }, [defaultInputText, interactionDefinitionKey]);\n\n React.useEffect(() => {\n setSelectedValues(defaultSelectedValues || []);\n }, [defaultSelectedValues, interactionDefinitionKey]);\n\n return (\n <span className=\"custom-variable-container inline-flex items-center flex-wrap\">\n {isMultiSelect && (\n <MultiSelectSection\n node={node}\n readonly={readonly}\n selectedValues={selectedValues}\n inputValue={inputValue}\n confirmButtonText={resolvedConfirmButtonText}\n handleCheckboxChange={handleCheckboxChange}\n handleInputChange={handleInputChange}\n handleKeyDown={handleKeyDown}\n handleConfirmClick={handleConfirmClick}\n />\n )}\n\n {!isMultiSelect && isSingleSelect && (\n <SingleSelectSection\n dir={dir}\n lang={lang}\n node={singleSelectNode}\n readonly={readonly}\n locale={locale}\n resolvedDefaultButtonText={resolvedDefaultButtonText}\n handleButtonClick={handleButtonClick}\n inputValue={inputValue}\n handleInputChange={handleInputChange}\n handleSendClick={handleSendClick}\n />\n )}\n\n {!isMultiSelect && !isSingleSelect && node.properties?.placeholder && (\n <InputSection\n dir={dir}\n lang={lang}\n readonly={readonly}\n locale={locale}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n />\n )}\n </span>\n );\n};\n\nexport default CustomButtonInputVariable;\nexport type {\n ComponentsWithCustomVariable,\n CustomVariableNode,\n CustomVariableProps,\n};\n"],"names":["MultiSelectSection","node","readonly","selectedValues","inputValue","confirmButtonText","handleCheckboxChange","handleInputChange","handleKeyDown","handleConfirmClick","placeholder","confirmDisabled","renderConfirmButton","extraWrapperClassName","jsx","cn","jsxs","text","index","value","buttonValue","Checkbox","checked","InputGroup","InputGroupTextarea","SingleSelectSection","dir","lang","locale","resolvedDefaultButtonText","handleButtonClick","handleSendClick","Button","MarkdownFlowInput","InputSection","onChange","onSend","CustomButtonInputVariable","defaultButtonText","defaultInputText","defaultSelectedValues","beforeSend","localeTexts","getContentRenderLocaleTexts","resolvedConfirmButtonText","setInputValue","React","setSelectedValues","interactionDefinitionKey","isMultiSelect","baseButtonTexts","shouldUseFallbackButton","fallbackButtonLabel","singleSelectNode","singleSelectButtonTexts","singleSelectButtonValues","isSingleSelect","param","prev","v","noSelection","e","valueIndex","textIndex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CustomVariable.es.js","sources":["../../../../src/components/ContentRender/plugins/CustomVariable.tsx"],"sourcesContent":["import React from \"react\";\nimport { normalizeVariableName } from \"remark-flow\";\nimport type { Components } from \"react-markdown\";\nimport { OnSendContentParams } from \"../../types\";\nimport { Button } from \"../../ui/button\";\nimport { Checkbox } from \"../../ui/checkbox\";\nimport MarkdownFlowInput from \"../MarkdownFlowInput\";\nimport {\n InputGroup,\n InputGroupTextarea,\n} from \"../../ui/inputGroup/input-group\";\nimport type { MarkdownFlowLocale } from \"../../../lib/locale\";\nimport { cn } from \"../../../lib/utils\";\nimport { getContentRenderLocaleTexts } from \"../contentRenderI18n\";\n\n// Define custom variable node type\ninterface CustomVariableNode {\n tagName: \"custom-variable\";\n properties?: {\n variableName?: string;\n buttonTexts?: string[];\n buttonValues?: string[];\n placeholder?: string;\n isMultiSelect?: boolean;\n };\n}\n\n// Define custom variable component Props type\ninterface CustomVariableProps {\n /** Explicit direction for nested input controls. */\n dir?: React.HTMLAttributes<HTMLDivElement>[\"dir\"];\n /** Explicit language for nested input controls. */\n lang?: string;\n node: CustomVariableNode;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n locale?: MarkdownFlowLocale;\n readonly?: boolean;\n onSend?: (content: OnSendContentParams) => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n beforeSend?: (param: OnSendContentParams) => boolean;\n}\n\ninterface ComponentsWithCustomVariable extends Components {\n \"custom-variable\"?: React.ComponentType<CustomVariableProps>;\n}\n\n// Multi select section( with checkboxes and input)\ninterface MultiSelectSectionProps {\n node: CustomVariableNode;\n readonly?: boolean;\n selectedValues: string[];\n inputValue: string;\n confirmButtonText: string;\n handleCheckboxChange: (value: string, checked: boolean) => void;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleKeyDown: (event: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n handleConfirmClick: () => void;\n}\n\nconst MultiSelectSection = ({\n node,\n readonly,\n selectedValues,\n inputValue,\n confirmButtonText,\n handleCheckboxChange,\n handleInputChange,\n handleKeyDown,\n handleConfirmClick,\n}: MultiSelectSectionProps) => {\n const placeholder = node.properties?.placeholder;\n const confirmDisabled =\n readonly || (selectedValues.length === 0 && !inputValue?.trim());\n\n const renderConfirmButton = (extraWrapperClassName?: string) => (\n <span\n className={cn(\n \"multi-select-confirm-wrapper flex flex-col items-center\",\n confirmDisabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\",\n extraWrapperClassName\n )}\n >\n <button\n type=\"button\"\n className=\"multi-select-confirm-button text-sm font-medium text-primary\"\n disabled={confirmDisabled}\n onClick={handleConfirmClick}\n >\n {confirmButtonText}\n </button>\n </span>\n );\n\n return (\n <span className=\"multi-select-container flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-6\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Checkbox\n key={index}\n label={text}\n disabled={readonly}\n checked={selectedValues.includes(buttonValue)}\n onCheckedChange={(checked) =>\n handleCheckboxChange(buttonValue, checked)\n }\n className=\"text-sm\"\n />\n );\n })}\n </span>\n {placeholder ? (\n <span className=\"block mb-1 w-full max-w-[500px]\">\n <span className=\"multi-select-input-row flex w-full items-end gap-3\">\n <InputGroup data-disabled={readonly} className=\"flex-1\">\n <InputGroupTextarea\n disabled={readonly}\n placeholder={placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n className=\"text-sm px-3\"\n title={placeholder}\n />\n </InputGroup>\n {renderConfirmButton(\"shrink-0\")}\n </span>\n </span>\n ) : (\n renderConfirmButton(\"self-start multi-select-confirm-wrapper--stacked\")\n )}\n </span>\n );\n};\n\n// Single select section( with buttons and input)\ninterface SingleSelectSectionProps {\n dir?: CustomVariableProps[\"dir\"];\n lang?: string;\n node: CustomVariableNode;\n readonly?: boolean;\n locale?: MarkdownFlowLocale;\n resolvedDefaultButtonText?: string;\n handleButtonClick: (value: string) => void;\n inputValue: string;\n handleInputChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n handleSendClick: () => void;\n}\n\nconst SingleSelectSection = ({\n dir,\n lang,\n node,\n readonly,\n locale,\n resolvedDefaultButtonText,\n handleButtonClick,\n inputValue,\n handleInputChange,\n handleSendClick,\n}: SingleSelectSectionProps) => (\n <span className=\"single-select-container inline-flex w-full flex-col\">\n <span className=\"flex flex-wrap gap-y-[9px] gap-x-2\">\n {node.properties?.buttonTexts?.map((text, index) => {\n const value = node.properties?.buttonValues?.[index];\n const buttonValue = value !== undefined ? value : text;\n return (\n <Button\n key={index}\n disabled={readonly}\n variant=\"outline\"\n type=\"button\"\n size=\"sm\"\n onClick={() => handleButtonClick(buttonValue)}\n className={cn(\n \"max-w-full shrink whitespace-normal break-words text-start leading-5 h-auto min-h-8 px-3 py-1.5\",\n \"hover:bg-gray-200\",\n resolvedDefaultButtonText === text && \"select\"\n )}\n >\n {text}\n </Button>\n );\n })}\n </span>\n {node.properties?.placeholder && (\n <span className=\"mt-[9px] mb-1\">\n <MarkdownFlowInput\n dir={dir}\n lang={lang}\n disabled={readonly}\n locale={locale}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n title={node.properties.placeholder}\n />\n </span>\n )}\n </span>\n);\n\n// Pure input\ninterface InputSectionProps {\n dir?: CustomVariableProps[\"dir\"];\n lang?: string;\n readonly?: boolean;\n locale?: MarkdownFlowLocale;\n placeholder?: string;\n value: string;\n onChange: (event: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onSend: () => void;\n}\n\nconst InputSection = ({\n dir,\n lang,\n readonly,\n locale,\n placeholder,\n value,\n onChange,\n onSend,\n}: InputSectionProps) => {\n if (!placeholder) {\n return null;\n }\n\n return (\n <MarkdownFlowInput\n dir={dir}\n lang={lang}\n disabled={readonly}\n locale={locale}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n onSend={onSend}\n title={placeholder}\n />\n );\n};\n\n// Define custom variable component\nconst CustomButtonInputVariable = ({\n dir,\n lang,\n node,\n readonly,\n locale,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n onSend,\n confirmButtonText,\n beforeSend = () => true,\n}: CustomVariableProps) => {\n const localeTexts = getContentRenderLocaleTexts(locale);\n const resolvedConfirmButtonText =\n confirmButtonText || localeTexts.confirmButtonText;\n const [inputValue, setInputValue] = React.useState(defaultInputText || \"\");\n const [selectedValues, setSelectedValues] = React.useState<string[]>(\n defaultSelectedValues || []\n );\n const interactionDefinitionKey = JSON.stringify({\n buttonTexts: node.properties?.buttonTexts,\n buttonValues: node.properties?.buttonValues,\n isMultiSelect: node.properties?.isMultiSelect,\n placeholder: node.properties?.placeholder,\n variableName: node.properties?.variableName,\n });\n const isMultiSelect = node.properties?.isMultiSelect ?? false;\n const baseButtonTexts = node.properties?.buttonTexts || [];\n const shouldUseFallbackButton =\n !isMultiSelect &&\n baseButtonTexts.length === 0 &&\n !node.properties?.placeholder;\n const fallbackButtonLabel =\n normalizeVariableName(node.properties?.variableName || \"\") ||\n defaultButtonText ||\n resolvedConfirmButtonText;\n\n const singleSelectNode = React.useMemo<CustomVariableNode>(() => {\n if (!shouldUseFallbackButton) {\n return node;\n }\n return {\n ...node,\n properties: {\n ...(node.properties || {}),\n buttonTexts: [fallbackButtonLabel],\n buttonValues: [fallbackButtonLabel],\n },\n };\n }, [fallbackButtonLabel, node, shouldUseFallbackButton]);\n\n const singleSelectButtonTexts =\n singleSelectNode.properties?.buttonTexts || [];\n const singleSelectButtonValues =\n singleSelectNode.properties?.buttonValues || [];\n const isSingleSelect = !isMultiSelect && singleSelectButtonTexts.length > 0;\n\n const handleButtonClick = (value: string) => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n buttonText: value,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleCheckboxChange = (value: string, checked: boolean) => {\n setSelectedValues((prev) => {\n if (checked) {\n return [...prev, value];\n } else {\n return prev.filter((v) => v !== value);\n }\n });\n };\n\n const handleConfirmClick = () => {\n const noSelection = selectedValues.length === 0 && !inputValue?.trim();\n const param = {\n variableName: node.properties?.variableName || \"\",\n selectedValues,\n inputText: inputValue?.trim() || undefined,\n };\n if (readonly || noSelection) return;\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setInputValue(e.target.value);\n };\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.nativeEvent.isComposing || e.keyCode === 229) {\n return;\n }\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n if (isMultiSelect) {\n const noSelection = selectedValues.length === 0 && !inputValue.trim();\n if (!noSelection) handleConfirmClick();\n } else {\n handleSendClick();\n }\n }\n };\n const handleSendClick = () => {\n const param = {\n variableName: node.properties?.variableName || \"\",\n inputText: inputValue,\n };\n if (!beforeSend?.(param)) return;\n onSend?.(param);\n };\n\n const resolvedDefaultButtonText = React.useMemo(() => {\n if (!defaultButtonText) {\n return undefined;\n }\n const valueIndex = singleSelectButtonValues.indexOf(defaultButtonText);\n if (valueIndex > -1) {\n return singleSelectButtonTexts[valueIndex] ?? defaultButtonText;\n }\n const textIndex = singleSelectButtonTexts.indexOf(defaultButtonText);\n if (textIndex > -1) {\n return singleSelectButtonTexts[textIndex];\n }\n return undefined;\n }, [defaultButtonText, singleSelectButtonTexts, singleSelectButtonValues]);\n\n React.useEffect(() => {\n setInputValue(defaultInputText || \"\");\n }, [defaultInputText, interactionDefinitionKey]);\n\n React.useEffect(() => {\n setSelectedValues(defaultSelectedValues || []);\n }, [defaultSelectedValues, interactionDefinitionKey]);\n\n return (\n <span className=\"custom-variable-container inline-flex items-center flex-wrap\">\n {isMultiSelect && (\n <MultiSelectSection\n node={node}\n readonly={readonly}\n selectedValues={selectedValues}\n inputValue={inputValue}\n confirmButtonText={resolvedConfirmButtonText}\n handleCheckboxChange={handleCheckboxChange}\n handleInputChange={handleInputChange}\n handleKeyDown={handleKeyDown}\n handleConfirmClick={handleConfirmClick}\n />\n )}\n\n {!isMultiSelect && isSingleSelect && (\n <SingleSelectSection\n dir={dir}\n lang={lang}\n node={singleSelectNode}\n readonly={readonly}\n locale={locale}\n resolvedDefaultButtonText={resolvedDefaultButtonText}\n handleButtonClick={handleButtonClick}\n inputValue={inputValue}\n handleInputChange={handleInputChange}\n handleSendClick={handleSendClick}\n />\n )}\n\n {!isMultiSelect && !isSingleSelect && node.properties?.placeholder && (\n <InputSection\n dir={dir}\n lang={lang}\n readonly={readonly}\n locale={locale}\n placeholder={node.properties.placeholder}\n value={inputValue}\n onChange={handleInputChange}\n onSend={handleSendClick}\n />\n )}\n </span>\n );\n};\n\nexport default CustomButtonInputVariable;\nexport type {\n ComponentsWithCustomVariable,\n CustomVariableNode,\n CustomVariableProps,\n};\n"],"names":["MultiSelectSection","node","readonly","selectedValues","inputValue","confirmButtonText","handleCheckboxChange","handleInputChange","handleKeyDown","handleConfirmClick","placeholder","confirmDisabled","renderConfirmButton","extraWrapperClassName","jsx","cn","jsxs","text","index","value","buttonValue","Checkbox","checked","InputGroup","InputGroupTextarea","SingleSelectSection","dir","lang","locale","resolvedDefaultButtonText","handleButtonClick","handleSendClick","Button","MarkdownFlowInput","InputSection","onChange","onSend","CustomButtonInputVariable","defaultButtonText","defaultInputText","defaultSelectedValues","beforeSend","localeTexts","getContentRenderLocaleTexts","resolvedConfirmButtonText","setInputValue","React","setSelectedValues","interactionDefinitionKey","isMultiSelect","baseButtonTexts","shouldUseFallbackButton","fallbackButtonLabel","normalizeVariableName","singleSelectNode","singleSelectButtonTexts","singleSelectButtonValues","isSingleSelect","param","prev","v","noSelection","e","valueIndex","textIndex"],"mappings":"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"}
|