From d3bb5e9f3d52e6dc33b550d0852688f58bb3c37c Mon Sep 17 00:00:00 2001 From: balibabu Date: Wed, 6 Nov 2024 18:48:05 +0800 Subject: [PATCH] feat: Display input parameters on operator nodes #3240 (#3241) ### What problem does this PR solve? feat: Display input parameters on operator nodes #3240 ### Type of change - [x] New Feature (non-breaking change which adds functionality) --- web/package-lock.json | 37 ++++++ web/package.json | 1 + web/src/components/ui/popover.tsx | 31 +++++ web/src/components/ui/table.tsx | 117 ++++++++++++++++++ web/src/interfaces/common.ts | 3 +- web/src/locales/en.ts | 3 + web/src/locales/zh-traditional.ts | 3 + web/src/locales/zh.ts | 3 + web/src/pages/flow/canvas/node/card.tsx | 57 +++++++++ .../flow/canvas/node/categorize-node.tsx | 85 ++++++------- .../pages/flow/canvas/node/generate-node.tsx | 95 +++++++------- web/src/pages/flow/canvas/node/index.tsx | 49 ++++---- .../pages/flow/canvas/node/invoke-node.tsx | 67 +++++----- .../pages/flow/canvas/node/keyword-node.tsx | 65 +++++----- web/src/pages/flow/canvas/node/logic-node.tsx | 49 ++++---- .../pages/flow/canvas/node/message-node.tsx | 79 ++++++------ .../pages/flow/canvas/node/node-header.tsx | 52 +++++--- web/src/pages/flow/canvas/node/popover.tsx | 105 +++++++++++----- .../pages/flow/canvas/node/relevant-node.tsx | 91 +++++++------- .../pages/flow/canvas/node/retrieval-node.tsx | 95 +++++++------- .../pages/flow/canvas/node/rewrite-node.tsx | 65 +++++----- .../pages/flow/canvas/node/switch-node.tsx | 97 +++++++-------- web/src/pages/flow/hooks.ts | 5 +- 23 files changed, 772 insertions(+), 482 deletions(-) create mode 100644 web/src/components/ui/popover.tsx create mode 100644 web/src/components/ui/table.tsx create mode 100644 web/src/pages/flow/canvas/node/card.tsx diff --git a/web/package-lock.json b/web/package-lock.json index 9b07b6bca..48ef9a83b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -17,6 +17,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-icons": "^1.3.1", "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-slot": "^1.1.0", @@ -4370,6 +4371,42 @@ } } }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-popover/-/react-popover-1.1.2.tgz", + "integrity": "sha512-u2HRUyWW+lOiA2g0Le0tMmT55FGOEWHwPFt1EPfbLly7uXQExFo5duNKqG2DzmFXIdqOeNd+TpE8baHWJCyP9w==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.1", + "@radix-ui/react-focus-guards": "1.1.1", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.2", + "@radix-ui/react-presence": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.6.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-popper": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", diff --git a/web/package.json b/web/package.json index 67c138939..515d7aa78 100644 --- a/web/package.json +++ b/web/package.json @@ -28,6 +28,7 @@ "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-icons": "^1.3.1", "@radix-ui/react-label": "^2.1.0", + "@radix-ui/react-popover": "^1.1.2", "@radix-ui/react-select": "^2.1.2", "@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-slot": "^1.1.0", diff --git a/web/src/components/ui/popover.tsx b/web/src/components/ui/popover.tsx new file mode 100644 index 000000000..02beaa958 --- /dev/null +++ b/web/src/components/ui/popover.tsx @@ -0,0 +1,31 @@ +'use client'; + +import * as PopoverPrimitive from '@radix-ui/react-popover'; +import * as React from 'react'; + +import { cn } from '@/lib/utils'; + +const Popover = PopoverPrimitive.Root; + +const PopoverTrigger = PopoverPrimitive.Trigger; + +const PopoverContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => ( + + + +)); +PopoverContent.displayName = PopoverPrimitive.Content.displayName; + +export { Popover, PopoverContent, PopoverTrigger }; diff --git a/web/src/components/ui/table.tsx b/web/src/components/ui/table.tsx new file mode 100644 index 000000000..8f5d0e76e --- /dev/null +++ b/web/src/components/ui/table.tsx @@ -0,0 +1,117 @@ +import * as React from 'react'; + +import { cn } from '@/lib/utils'; + +const Table = React.forwardRef< + HTMLTableElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+ + +)); +Table.displayName = 'Table'; + +const TableHeader = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableHeader.displayName = 'TableHeader'; + +const TableBody = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableBody.displayName = 'TableBody'; + +const TableFooter = React.forwardRef< + HTMLTableSectionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + tr]:last:border-b-0', + className, + )} + {...props} + /> +)); +TableFooter.displayName = 'TableFooter'; + +const TableRow = React.forwardRef< + HTMLTableRowElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableRow.displayName = 'TableRow'; + +const TableHead = React.forwardRef< + HTMLTableCellElement, + React.ThHTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +TableHead.displayName = 'TableHead'; + +const TableCell = React.forwardRef< + HTMLTableCellElement, + React.TdHTMLAttributes +>(({ className, ...props }, ref) => ( + +)); +TableCell.displayName = 'TableCell'; + +const TableCaption = React.forwardRef< + HTMLTableCaptionElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => ( +
+)); +TableCaption.displayName = 'TableCaption'; + +export { + Table, + TableBody, + TableCaption, + TableCell, + TableFooter, + TableHead, + TableHeader, + TableRow, +}; diff --git a/web/src/interfaces/common.ts b/web/src/interfaces/common.ts index 666e60705..11f176c53 100644 --- a/web/src/interfaces/common.ts +++ b/web/src/interfaces/common.ts @@ -11,7 +11,8 @@ export interface BaseState { export interface IModalProps { showModal?(): void; - hideModal(): void; + hideModal?(): void; + switchVisible?(visible: boolean): void; visible?: boolean; loading?: boolean; onOk?(payload?: T): Promise | void; diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index 265c9b1fa..c951120bb 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -1031,8 +1031,11 @@ The above is the content you need to summarize.`, 'If the response is HTML formatted and only the primary content wanted, please toggle it on.', reference: 'Reference', input: 'Input', + output: 'Output', parameter: 'Parameter', howUseId: 'How to use agent ID?', + content: 'Content', + operationResults: 'Operation Results', }, footer: { profile: 'All rights reserved @ React', diff --git a/web/src/locales/zh-traditional.ts b/web/src/locales/zh-traditional.ts index a3f45a098..60148310c 100644 --- a/web/src/locales/zh-traditional.ts +++ b/web/src/locales/zh-traditional.ts @@ -979,8 +979,11 @@ export default { cleanHtmlTip: '如果回應是 HTML 格式並且只需要主要內容,請將其開啟。', reference: '引用', input: '輸入', + output: '輸出', parameter: '參數', howUseId: '如何使用Agent ID?', + content: '內容', + operationResults: '運行結果', }, footer: { profile: '“保留所有權利 @ react”', diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index f5ab425bf..582ede982 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -999,8 +999,11 @@ export default { cleanHtmlTip: '如果响应是 HTML 格式且只需要主要内容,请将其打开。', reference: '引用', input: '输入', + output: '输出', parameter: '参数', howUseId: '如何使用Agent ID?', + content: '内容', + operationResults: '运行结果', }, footer: { profile: 'All rights reserved @ React', diff --git a/web/src/pages/flow/canvas/node/card.tsx b/web/src/pages/flow/canvas/node/card.tsx new file mode 100644 index 000000000..042ca45e0 --- /dev/null +++ b/web/src/pages/flow/canvas/node/card.tsx @@ -0,0 +1,57 @@ +import { Button } from '@/components/ui/button'; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from '@/components/ui/card'; +import { Input } from '@/components/ui/input'; +import { Label } from '@/components/ui/label'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select'; + +export function CardWithForm() { + return ( + + + Create project + Deploy your new project in one-click. + + +
+
+
+ + +
+
+ + +
+
+
+
+ + + + +
+ ); +} diff --git a/web/src/pages/flow/canvas/node/categorize-node.tsx b/web/src/pages/flow/canvas/node/categorize-node.tsx index b367bd93f..1112ccb57 100644 --- a/web/src/pages/flow/canvas/node/categorize-node.tsx +++ b/web/src/pages/flow/canvas/node/categorize-node.tsx @@ -8,55 +8,52 @@ import { RightHandleStyle } from './handle-icon'; import { useBuildCategorizeHandlePositions } from './hooks'; import styles from './index.less'; import NodeHeader from './node-header'; -import NodePopover from './popover'; export function CategorizeNode({ id, data, selected }: NodeProps) { const { positions } = useBuildCategorizeHandlePositions({ data, id }); return ( - -
+ + + + + +
+ +
+ {positions.map((position, idx) => { + return ( +
+
{position.text}
+ +
+ ); })} - > - - - - - -
- -
- {positions.map((position, idx) => { - return ( -
-
{position.text}
- -
- ); - })} -
-
-
+ + ); } diff --git a/web/src/pages/flow/canvas/node/generate-node.tsx b/web/src/pages/flow/canvas/node/generate-node.tsx index 31537ea47..4a4200d81 100644 --- a/web/src/pages/flow/canvas/node/generate-node.tsx +++ b/web/src/pages/flow/canvas/node/generate-node.tsx @@ -8,7 +8,6 @@ import { IGenerateParameter, NodeData } from '../../interface'; import { LeftHandleStyle, RightHandleStyle } from './handle-icon'; import styles from './index.less'; import NodeHeader from './node-header'; -import NodePopover from './popover'; export function GenerateNode({ id, @@ -20,55 +19,53 @@ export function GenerateNode({ const getLabel = useGetComponentLabelByValue(id); return ( - -
- - +
+ + - + -
- -
- - {parameters.map((x) => ( - - - - {getLabel(x.component_id)} - - - ))} - -
- +
+ +
+ + {parameters.map((x) => ( + + + + {getLabel(x.component_id)} + + + ))} + +
); } diff --git a/web/src/pages/flow/canvas/node/index.tsx b/web/src/pages/flow/canvas/node/index.tsx index 0001507fb..c6f25d3dd 100644 --- a/web/src/pages/flow/canvas/node/index.tsx +++ b/web/src/pages/flow/canvas/node/index.tsx @@ -4,7 +4,6 @@ import { NodeData } from '../../interface'; import { LeftHandleStyle, RightHandleStyle } from './handle-icon'; import styles from './index.less'; import NodeHeader from './node-header'; -import NodePopover from './popover'; export function RagNode({ id, @@ -13,30 +12,28 @@ export function RagNode({ selected, }: NodeProps) { return ( - -
- - - -
-
+
+ + + +
); } diff --git a/web/src/pages/flow/canvas/node/invoke-node.tsx b/web/src/pages/flow/canvas/node/invoke-node.tsx index c69ccb35b..6619b156e 100644 --- a/web/src/pages/flow/canvas/node/invoke-node.tsx +++ b/web/src/pages/flow/canvas/node/invoke-node.tsx @@ -7,7 +7,6 @@ import { NodeData } from '../../interface'; import { LeftHandleStyle, RightHandleStyle } from './handle-icon'; import styles from './index.less'; import NodeHeader from './node-header'; -import NodePopover from './popover'; export function InvokeNode({ id, @@ -18,39 +17,37 @@ export function InvokeNode({ const { t } = useTranslation(); const url = get(data, 'form.url'); return ( - -
- - - - -
{t('flow.url')}
-
{url}
-
-
-
+
+ + + + +
{t('flow.url')}
+
{url}
+
+
); } diff --git a/web/src/pages/flow/canvas/node/keyword-node.tsx b/web/src/pages/flow/canvas/node/keyword-node.tsx index 6c74a0b97..b4ef62d75 100644 --- a/web/src/pages/flow/canvas/node/keyword-node.tsx +++ b/web/src/pages/flow/canvas/node/keyword-node.tsx @@ -6,7 +6,6 @@ import { NodeData } from '../../interface'; import { LeftHandleStyle, RightHandleStyle } from './handle-icon'; import styles from './index.less'; import NodeHeader from './node-header'; -import NodePopover from './popover'; export function KeywordNode({ id, @@ -15,40 +14,38 @@ export function KeywordNode({ selected, }: NodeProps) { return ( - -
- - +
+ + - + -
- -
-
- +
+ +
+
); } diff --git a/web/src/pages/flow/canvas/node/logic-node.tsx b/web/src/pages/flow/canvas/node/logic-node.tsx index 3501917d9..69df9d31d 100644 --- a/web/src/pages/flow/canvas/node/logic-node.tsx +++ b/web/src/pages/flow/canvas/node/logic-node.tsx @@ -4,7 +4,6 @@ import { NodeData } from '../../interface'; import { LeftHandleStyle, RightHandleStyle } from './handle-icon'; import styles from './index.less'; import NodeHeader from './node-header'; -import NodePopover from './popover'; export function LogicNode({ id, @@ -13,30 +12,28 @@ export function LogicNode({ selected, }: NodeProps) { return ( - -
- - - -
-
+
+ + + +
); } diff --git a/web/src/pages/flow/canvas/node/message-node.tsx b/web/src/pages/flow/canvas/node/message-node.tsx index a0db83491..d14ef6cf2 100644 --- a/web/src/pages/flow/canvas/node/message-node.tsx +++ b/web/src/pages/flow/canvas/node/message-node.tsx @@ -6,7 +6,6 @@ import { NodeData } from '../../interface'; import { LeftHandleStyle, RightHandleStyle } from './handle-icon'; import styles from './index.less'; import NodeHeader from './node-header'; -import NodePopover from './popover'; export function MessageNode({ id, @@ -17,47 +16,45 @@ export function MessageNode({ const messages: string[] = get(data, 'form.messages', []); return ( - -
+ + + 0, })} - > - - - 0, - })} - > + > - - {messages.map((message, idx) => { - return ( -
- {message} -
- ); - })} -
-
-
+ + {messages.map((message, idx) => { + return ( +
+ {message} +
+ ); + })} +
+ ); } diff --git a/web/src/pages/flow/canvas/node/node-header.tsx b/web/src/pages/flow/canvas/node/node-header.tsx index 4386f9c47..89c1b332a 100644 --- a/web/src/pages/flow/canvas/node/node-header.tsx +++ b/web/src/pages/flow/canvas/node/node-header.tsx @@ -1,34 +1,52 @@ import { Flex } from 'antd'; - import { Operator, operatorMap } from '../../constant'; import OperatorIcon from '../../operator-icon'; import NodeDropdown from './dropdown'; + +import { useTranslate } from '@/hooks/common-hooks'; import styles from './index.less'; +import { NextNodePopover } from './popover'; interface IProps { id: string; - label: string; - name: string; + label?: string; + name?: string; gap?: number; className?: string; } +export function RunStatus({ id, name }: IProps) { + const { t } = useTranslate('flow'); + return ( +
+ + + {t('operationResults')} + + +
+ ); +} + const NodeHeader = ({ label, id, name, gap = 4, className }: IProps) => { return ( - - - {name} - - +
+ {label !== Operator.Answer && } + + + {name} + + +
); }; diff --git a/web/src/pages/flow/canvas/node/popover.tsx b/web/src/pages/flow/canvas/node/popover.tsx index 69deac9e2..8bdd5d49c 100644 --- a/web/src/pages/flow/canvas/node/popover.tsx +++ b/web/src/pages/flow/canvas/node/popover.tsx @@ -1,49 +1,98 @@ import { useFetchFlow } from '@/hooks/flow-hooks'; -import { Popover } from 'antd'; import get from 'lodash/get'; -import React, { useMemo } from 'react'; +import React, { MouseEventHandler, useCallback, useMemo } from 'react'; import JsonView from 'react18-json-view'; import 'react18-json-view/src/style.css'; -import { Operator } from '../../constant'; import { useReplaceIdWithText } from '../../hooks'; -import styles from './index.less'; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from '@/components/ui/popover'; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from '@/components/ui/table'; +import { useTranslate } from '@/hooks/common-hooks'; interface IProps extends React.PropsWithChildren { nodeId: string; + name?: string; } -const NodePopover = ({ children, nodeId }: IProps) => { +export function NextNodePopover({ children, nodeId, name }: IProps) { + const { t } = useTranslate('flow'); + const { data } = useFetchFlow(); const component = useMemo(() => { return get(data, ['dsl', 'components', nodeId], {}); }, [nodeId, data]); + const inputs: Array<{ component_id: string; content: string }> = get( + component, + ['obj', 'params', 'inputs'], + [], + ); const output = get(component, ['obj', 'params', 'output'], {}); - const componentName = get(component, ['obj', 'component_name'], ''); - const replacedOutput = useReplaceIdWithText(output); - - const content = - componentName !== Operator.Answer ? ( -
{ - e.preventDefault(); - e.stopPropagation(); - }} - > - -
- ) : undefined; + const { replacedOutput, getNameById } = useReplaceIdWithText(output); + const stopPropagation: MouseEventHandler = useCallback((e) => { + e.stopPropagation(); + }, []); return ( - - {children} + + + {children} + + +
+ {name} {t('operationResults')} +
+
+
+ {t('input')} +
+ + + + {t('componentId')} + {t('content')} + + + + {inputs.map((x, idx) => ( + + {getNameById(x.component_id)} + {x.content} + + ))} + +
+
+
+
+ {t('output')} +
+ +
+
+
+
); -}; - -export default NodePopover; +} diff --git a/web/src/pages/flow/canvas/node/relevant-node.tsx b/web/src/pages/flow/canvas/node/relevant-node.tsx index 3820282ea..02407fc4d 100644 --- a/web/src/pages/flow/canvas/node/relevant-node.tsx +++ b/web/src/pages/flow/canvas/node/relevant-node.tsx @@ -3,7 +3,6 @@ import classNames from 'classnames'; import { Handle, NodeProps, Position } from 'reactflow'; import { NodeData } from '../../interface'; import { RightHandleStyle } from './handle-icon'; -import NodePopover from './popover'; import { get } from 'lodash'; import styles from './index.less'; @@ -13,53 +12,51 @@ export function RelevantNode({ id, data, selected }: NodeProps) { const yes = get(data, 'form.yes'); const no = get(data, 'form.no'); return ( - -
- - - - +
+ + + + - - -
Yes
-
{yes}
-
- -
No
-
{no}
-
+ + +
Yes
+
{yes}
-
- + +
No
+
{no}
+
+ +
); } diff --git a/web/src/pages/flow/canvas/node/retrieval-node.tsx b/web/src/pages/flow/canvas/node/retrieval-node.tsx index 8ab79f62c..8fce5391e 100644 --- a/web/src/pages/flow/canvas/node/retrieval-node.tsx +++ b/web/src/pages/flow/canvas/node/retrieval-node.tsx @@ -9,7 +9,6 @@ import { NodeData } from '../../interface'; import { LeftHandleStyle, RightHandleStyle } from './handle-icon'; import styles from './index.less'; import NodeHeader from './node-header'; -import NodePopover from './popover'; export function RetrievalNode({ id, @@ -31,55 +30,53 @@ export function RetrievalNode({ }, [knowledgeList, knowledgeBaseIds]); return ( - -
+ + + 0, })} - > - - - 0, - })} - > - - {knowledgeBases.map((knowledge) => { - return ( -
- - } - src={knowledge.avatar} - /> - - {knowledge.name} - + > + + {knowledgeBases.map((knowledge) => { + return ( +
+ + } + src={knowledge.avatar} + /> + + {knowledge.name} -
- ); - })} -
-
-
+ + + ); + })} + + ); } diff --git a/web/src/pages/flow/canvas/node/rewrite-node.tsx b/web/src/pages/flow/canvas/node/rewrite-node.tsx index 8f645ecea..e5ead08ef 100644 --- a/web/src/pages/flow/canvas/node/rewrite-node.tsx +++ b/web/src/pages/flow/canvas/node/rewrite-node.tsx @@ -6,7 +6,6 @@ import { NodeData } from '../../interface'; import { LeftHandleStyle, RightHandleStyle } from './handle-icon'; import styles from './index.less'; import NodeHeader from './node-header'; -import NodePopover from './popover'; export function RewriteNode({ id, @@ -15,40 +14,38 @@ export function RewriteNode({ selected, }: NodeProps) { return ( - -
- - +
+ + - + -
- -
-
- +
+ +
+
); } diff --git a/web/src/pages/flow/canvas/node/switch-node.tsx b/web/src/pages/flow/canvas/node/switch-node.tsx index 06eb5f056..3bc41c15b 100644 --- a/web/src/pages/flow/canvas/node/switch-node.tsx +++ b/web/src/pages/flow/canvas/node/switch-node.tsx @@ -7,7 +7,6 @@ import { RightHandleStyle } from './handle-icon'; import { useBuildSwitchHandlePositions } from './hooks'; import styles from './index.less'; import NodeHeader from './node-header'; -import NodePopover from './popover'; const getConditionKey = (idx: number, length: number) => { if (idx === 0 && length !== 1) { @@ -58,55 +57,53 @@ export function SwitchNode({ id, data, selected }: NodeProps) { const { positions } = useBuildSwitchHandlePositions({ data, id }); return ( - -
- - - - {positions.map((position, idx) => { - return ( -
- - - {idx < positions.length - 1 && position.text} - {getConditionKey(idx, positions.length)} - - {position.condition && ( - - )} +
+ + + + {positions.map((position, idx) => { + return ( +
+ + + {idx < positions.length - 1 && position.text} + {getConditionKey(idx, positions.length)} - -
- ); - })} -
-
- + {position.condition && ( + + )} +
+ +
+ ); + })} +
+
); } diff --git a/web/src/pages/flow/hooks.ts b/web/src/pages/flow/hooks.ts index 6ed0f519d..b0179dc73 100644 --- a/web/src/pages/flow/hooks.ts +++ b/web/src/pages/flow/hooks.ts @@ -524,7 +524,10 @@ export const useReplaceIdWithText = (output: unknown) => { return getNode(id)?.data.name; }; - return replaceIdWithText(output, getNameById); + return { + replacedOutput: replaceIdWithText(output, getNameById), + getNameById, + }; }; /**