dify/web/app/components/workflow/nodes/if-else/default.ts
yyh 2ec34b2cfb
feat(workflow): improve block selector navigation and previews (#39212)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-18 09:56:36 +00:00

106 lines
3.5 KiB
TypeScript

import type { TFunction } from 'i18next'
import type { NodeDefault } from '../../types'
import type { IfElseNodeType } from './types'
import { BlockClassification } from '@/app/components/workflow/block-selector/types'
import { BlockEnum } from '@/app/components/workflow/types'
import { genNodeMetaData } from '@/app/components/workflow/utils'
import { VarType } from '../../types'
import { LogicalOperator } from './types'
import { isEmptyRelatedOperator } from './utils'
const i18nPrefix = 'errorMsg'
const metaData = genNodeMetaData({
classification: BlockClassification.Logic,
sort: 1,
type: BlockEnum.IfElse,
helpLinkUri: 'ifelse',
})
const nodeDefault: NodeDefault<IfElseNodeType> = {
metaData,
defaultValue: {
_targetBranches: [
{
id: 'true',
name: 'IF',
},
{
id: 'false',
name: 'ELSE',
},
],
cases: [
{
case_id: 'true',
logical_operator: LogicalOperator.and,
conditions: [],
},
],
},
checkValid(payload: IfElseNodeType, t: TFunction<'workflow'>) {
let errorMessages = ''
const { cases } = payload
if (!cases || cases.length === 0)
errorMessages = t(($) => $[`${i18nPrefix}.fieldRequired`], { ns: 'workflow', field: 'IF' })
cases.forEach((caseItem, index) => {
if (!caseItem.conditions.length)
errorMessages = t(($) => $[`${i18nPrefix}.fieldRequired`], {
ns: 'workflow',
field: index === 0 ? 'IF' : 'ELIF',
})
caseItem.conditions.forEach((condition) => {
if (
!errorMessages &&
(!condition.variable_selector || condition.variable_selector.length === 0)
)
errorMessages = t(($) => $[`${i18nPrefix}.fieldRequired`], {
ns: 'workflow',
field: t(($) => $[`${i18nPrefix}.fields.variable`], { ns: 'workflow' }),
})
if (!errorMessages && !condition.comparison_operator)
errorMessages = t(($) => $[`${i18nPrefix}.fieldRequired`], {
ns: 'workflow',
field: t(($) => $['nodes.ifElse.operator'], { ns: 'workflow' }),
})
if (!errorMessages) {
if (condition.sub_variable_condition) {
const isSet = condition.sub_variable_condition.conditions.every((c) => {
if (!c.comparison_operator) return false
if (isEmptyRelatedOperator(c.comparison_operator!)) return true
return c.varType === VarType.boolean || c.varType === VarType.arrayBoolean
? c.value === undefined
: !!c.value
})
if (!isSet)
errorMessages = t(($) => $[`${i18nPrefix}.fieldRequired`], {
ns: 'workflow',
field: t(($) => $[`${i18nPrefix}.fields.variableValue`], { ns: 'workflow' }),
})
} else {
if (
!isEmptyRelatedOperator(condition.comparison_operator!) &&
(condition.varType === VarType.boolean || condition.varType === VarType.arrayBoolean
? condition.value === undefined
: !condition.value)
)
errorMessages = t(($) => $[`${i18nPrefix}.fieldRequired`], {
ns: 'workflow',
field: t(($) => $[`${i18nPrefix}.fields.variableValue`], { ns: 'workflow' }),
})
}
}
})
})
return {
isValid: !errorMessages,
errorMessage: errorMessages,
}
},
}
export default nodeDefault