diff --git a/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx b/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx index df19f77e97..3ce84dafc0 100644 --- a/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx +++ b/web/app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx @@ -13,10 +13,12 @@ import type { } from '../../types' import { ComparisonOperator, + LogicalOperator, } from '../../types' import { comparisonOperatorNotRequireValue } from '../../utils' import ConditionNumberInput from '../condition-number-input' import { FILE_TYPE_OPTIONS, TRANSFER_METHOD } from '../../default' +import ConditionWrap from '../condition-wrap' import ConditionOperator from './condition-operator' import ConditionInput from './condition-input' import VariableTag from '@/app/components/workflow/nodes/_base/components/variable-tag' @@ -81,10 +83,10 @@ const ConditionItem = ({ onUpdateCondition(caseId, condition.id, newCondition) }, [caseId, condition, onUpdateCondition]) - const isSelect = condition.comparison_operator && [ComparisonOperator.in, ComparisonOperator.notIn].includes(condition.comparison_operator) + const isSelect = condition.comparison_operator && [ComparisonOperator.in, ComparisonOperator.notIn, ComparisonOperator.allOf].includes(condition.comparison_operator) const selectOptions = useMemo(() => { if (isSelect) { - if (file?.key === 'type') { + if (file?.key === 'type' || condition.comparison_operator === ComparisonOperator.allOf) { return FILE_TYPE_OPTIONS.map(item => ({ name: t(`${optionNameI18NPrefix}.${item.i18nKey}`), value: item.value, @@ -99,8 +101,11 @@ const ConditionItem = ({ return [] } return [] - }, [file?.key, isSelect, t]) + }, [condition.comparison_operator, file?.key, isSelect, t]) + const isSubVariable = condition.varType === VarType.arrayFile && [ComparisonOperator.contains, ComparisonOperator.notContains].includes(condition.comparison_operator!) + + const isNotInput = isSelect || isSubVariable return (
{ - !comparisonOperatorNotRequireValue(condition.comparison_operator) && !isSelect && condition.varType !== VarType.number && ( + !comparisonOperatorNotRequireValue(condition.comparison_operator) && !isNotInput && condition.varType !== VarType.number && (
) } + { + !comparisonOperatorNotRequireValue(condition.comparison_operator) && isSubVariable && ( +
+ { }} + handleAddCondition={() => { }} + handleUpdateCondition={() => { }} + handleRemoveCondition={() => { }} + handleUpdateConditionLogicalOperator={() => { }} + nodesOutputVars={[]} + availableNodes={[]} + varsIsVarFileAttribute={{}} + filterVar={() => true} + /> +
+ ) + }
= ({ + isSubVariable, nodeId: id, cases, readOnly, - handleSortCase, + handleSortCase = () => { }, handleUpdateCondition, handleRemoveCondition, handleUpdateConditionLogicalOperator, @@ -65,6 +67,7 @@ const ConditionWrap: FC = ({ handle='.handle' ghostClass='bg-components-panel-bg' animation={150} + disabled={readOnly || isSubVariable} > { cases.map((item, index) => ( diff --git a/web/app/components/workflow/nodes/if-else/types.ts b/web/app/components/workflow/nodes/if-else/types.ts index 41406d977d..0216e6028c 100644 --- a/web/app/components/workflow/nodes/if-else/types.ts +++ b/web/app/components/workflow/nodes/if-else/types.ts @@ -30,6 +30,16 @@ export enum ComparisonOperator { isNotNull = 'is not null', in = 'in', notIn = 'not in', + allOf = 'all of', +} + +export type SubVariableCondition = { + id: string + path: string + type: VarType + comparison_operator?: ComparisonOperator + value: string + numberVarType?: NumberVarType } export type Condition = { @@ -39,6 +49,7 @@ export type Condition = { comparison_operator?: ComparisonOperator value: string numberVarType?: NumberVarType + sub_variable_condition?: SubVariableCondition[] } export type CaseItem = { diff --git a/web/app/components/workflow/nodes/if-else/utils.ts b/web/app/components/workflow/nodes/if-else/utils.ts index e35382ca9f..53b0811cab 100644 --- a/web/app/components/workflow/nodes/if-else/utils.ts +++ b/web/app/components/workflow/nodes/if-else/utils.ts @@ -121,6 +121,14 @@ export const getOperators = (type?: VarType, file?: { key: string }) => { ComparisonOperator.empty, ComparisonOperator.notEmpty, ] + case VarType.arrayFile: + return [ + ComparisonOperator.contains, + ComparisonOperator.notContains, + ComparisonOperator.allOf, + ComparisonOperator.empty, + ComparisonOperator.notEmpty, + ] default: return [ ComparisonOperator.is, diff --git a/web/i18n/en-US/workflow.ts b/web/i18n/en-US/workflow.ts index b0915a1f20..3c2df8a743 100644 --- a/web/i18n/en-US/workflow.ts +++ b/web/i18n/en-US/workflow.ts @@ -420,6 +420,7 @@ const translation = { 'not null': 'is not null', 'in': 'in', 'not in': 'not in', + 'all of': 'all of', }, optionName: { image: 'Image', diff --git a/web/i18n/zh-Hans/workflow.ts b/web/i18n/zh-Hans/workflow.ts index 15f5606d29..03390de4cc 100644 --- a/web/i18n/zh-Hans/workflow.ts +++ b/web/i18n/zh-Hans/workflow.ts @@ -420,6 +420,7 @@ const translation = { 'not null': '不为空', 'in': '是', 'not in': '不是', + 'all of': '全部是', }, optionName: { image: '图片',