import { useRef } from 'react' import { useTranslation } from 'react-i18next' import clsx from 'clsx'; import type { ReactShapeConfig } from '@antv/x6-react-shape'; import { Flex } from 'antd'; import { CheckCircleFilled, CloseCircleFilled, LoadingOutlined } from '@ant-design/icons'; import NodeTools from './NodeTools' import { useVariableList } from '../Properties/hooks/useVariableList' import { isSubExprSet } from '../../utils' import { fileSubFieldOperators } from '../Properties/CaseList' const calculateIsSet = (item: any, type: string) => { switch (type) { case 'categories': return typeof item?.class_name === 'string' && item?.class_name !== '' case 'cases': { if (item?.sub_variable_condition !== undefined) { return !!item.left && !!item.operator } if (!item.left) return false if (['not_empty', 'empty'].includes(item.operator)) return true return !!item.left && (!!item.right || typeof item.right === 'boolean' || typeof item.right === 'number') } } } const ConditionNode: ReactShapeConfig['component'] = ({ node }) => { const data = node?.getData() || {}; const { t } = useTranslation() const graphRef = useRef(node?.model?.graph) const variableList = useVariableList(node ?? null, graphRef, data.chatVariables ?? []) const getLocaleField = (field: string, filedType: string) => { const key = filedType === 'boolean' ? `workflow.config.if-else..boolean.${field}` : filedType === 'number' ? `workflow.config.if-else.num.${field}` : `workflow.config.if-else.${field}` const value = t(key) return value !== key ? value : t(`workflow.config.if-else.num.${field}`) }; const getSubLocaleField = (field: string, fieldKey: string) => { const operators = fileSubFieldOperators[fieldKey] ?? fileSubFieldOperators.default const match = operators?.find(op => op.value === field) return match?.label ? t(match.label as string) : field } const labelRender = (value: string) => { const filterOption = variableList.find(vo => `{{${vo.value}}}` === value) ?? variableList.flatMap(vo => vo.children ?? []).find(child => `{{${child.value}}}` === value) ?? variableList.flatMap(vo => vo.children ?? []).flatMap((child: any) => child.children ?? []).find((grandchild: any) => `{{${grandchild.value}}}` === value) if (filterOption) { return ( {`{x}`} {filterOption.label} ) } return null } return (
{data.name ?? t(`workflow.${data.type}`)}
{data.executionStatus === 'completed' ? : data.executionStatus === 'failed' ? : data.executionStatus === 'running' ? : null } {data.type === 'question-classifier' && {data.config?.categories?.defaultValue.map((item: any, index: number) => (
{t('workflow.config.question-classifier.class_name')} {index + 1} {calculateIsSet(item, 'categories') ? t(`workflow.config.${data.type}.set`) : t(`workflow.config.${data.type}.unset`)}
))}
} {data.type === 'if-else' && {data.config?.cases?.defaultValue.map((item: any, index: number) => (
0 ? "space-between" : 'end'} className="rb:mb-1! rb:leading-4"> {item.expressions.length > 0 && CASE{index + 1}} {index === 0 ? 'IF' : `ELIF`} {item.expressions.length > 0 && {item.expressions.map((expression: any, eIndex: number) => (
{item.expressions.length > 1 && eIndex > 0 &&
{item.logical_operator?.toLocaleUpperCase()}
} 0, 'rb:py-1!': !expression.sub_variable_condition?.conditions || !expression.sub_variable_condition?.conditions?.length })} > {calculateIsSet(expression, 'cases') ? <> {labelRender(expression.left)} {getLocaleField(expression.operator, typeof expression.right)} {!['not_empty', 'empty'].includes(expression.operator) && {typeof expression.right === 'boolean' ? String(expression.right).charAt(0).toUpperCase() + String(expression.right).slice(1) : expression.right}} : t(`workflow.config.${data.type}.unset`) } {expression.sub_variable_condition?.conditions?.length > 0 && expression.sub_variable_condition?.conditions.every(isSubExprSet) ?
{expression.sub_variable_condition?.conditions.map((sub: any, sIndex: number) => (
{expression.sub_variable_condition?.conditions.length > 1 && sIndex > 0 &&
{expression.sub_variable_condition?.logical_operator?.toLocaleUpperCase()}
} {sub.key} {getSubLocaleField(sub.operator, sub.key)} {sub.key === 'type' ? t(`application.${sub.value}`) :!['not_empty', 'empty'].includes(sub.operator) ? {typeof sub.value === 'boolean' ? String(sub.value).charAt(0).toUpperCase() + String(sub.value).slice(1) : sub.value} : null }
))}
: expression.sub_variable_condition?.conditions?.length > 0 ? {t(`workflow.config.${data.type}.unset`)} : null }
))}
}
))} ELSE
}
); }; export default ConditionNode;