feat: support update sub variable value

This commit is contained in:
Joel 2024-08-19 11:43:52 +08:00
parent 0eb442f954
commit 876ea90fe9
6 changed files with 52 additions and 10 deletions

View File

@ -12,6 +12,7 @@ import type {
HandleAddSubVariableCondition, HandleAddSubVariableCondition,
HandleRemoveCondition, HandleRemoveCondition,
HandleUpdateCondition, HandleUpdateCondition,
HandleUpdateSubVariableCondition,
} from '../../types' } from '../../types'
import { import {
ComparisonOperator, ComparisonOperator,
@ -35,11 +36,14 @@ const optionNameI18NPrefix = 'workflow.nodes.ifElse.optionName'
type ConditionItemProps = { type ConditionItemProps = {
disabled?: boolean disabled?: boolean
caseId: string caseId: string
condition: Condition conditionId: string // in isSubVariableKey it's the value of the parent condition's id
condition: Condition // condition may the condition of case or condition of sub variable
file?: { key: string } file?: { key: string }
isSubVariableKey?: boolean isSubVariableKey?: boolean
subVariableKeyCaseId?: string
onRemoveCondition: HandleRemoveCondition onRemoveCondition: HandleRemoveCondition
onUpdateCondition: HandleUpdateCondition onUpdateCondition: HandleUpdateCondition
onUpdateSubVariableCondition?: HandleUpdateSubVariableCondition
nodesOutputVars: NodeOutPutVar[] nodesOutputVars: NodeOutPutVar[]
availableNodes: Node[] availableNodes: Node[]
numberVariables: NodeOutPutVar[] numberVariables: NodeOutPutVar[]
@ -48,11 +52,13 @@ type ConditionItemProps = {
const ConditionItem = ({ const ConditionItem = ({
disabled, disabled,
caseId, caseId,
conditionId,
condition, condition,
file, file,
isSubVariableKey, isSubVariableKey,
onRemoveCondition, onRemoveCondition,
onUpdateCondition, onUpdateCondition,
onUpdateSubVariableCondition,
nodesOutputVars, nodesOutputVars,
availableNodes, availableNodes,
numberVariables, numberVariables,
@ -120,8 +126,8 @@ const ConditionItem = ({
const newCondition = produce(condition, (draft) => { const newCondition = produce(condition, (draft) => {
draft.key = key draft.key = key
}) })
onUpdateCondition(caseId, condition.id, newCondition) onUpdateSubVariableCondition?.(caseId, conditionId, condition.id, newCondition)
}, [caseId, condition, onUpdateCondition]) }, [caseId, condition, conditionId, onUpdateSubVariableCondition])
return ( return (
<div className='flex mb-1 last-of-type:mb-0'> <div className='flex mb-1 last-of-type:mb-0'>
@ -136,7 +142,7 @@ const ConditionItem = ({
<Select <Select
wrapperClassName='h-6' wrapperClassName='h-6'
className='pl-0 text-xs' className='pl-0 text-xs'
defaultValue={condition.value} defaultValue={condition.key}
items={subVarOptions} items={subVarOptions}
onSelect={item => handleSubVarKeyChange(item.value as string)} onSelect={item => handleSubVarKeyChange(item.value as string)}
/> />
@ -202,15 +208,16 @@ const ConditionItem = ({
<div className='p-1'> <div className='p-1'>
<ConditionWrap <ConditionWrap
isSubVariable isSubVariable
conditionId={condition.id}
caseId={caseId} caseId={caseId}
conditionId={conditionId}
readOnly={!!disabled} readOnly={!!disabled}
nodeId='' nodeId=''
cases={condition.sub_variable_condition ? [condition.sub_variable_condition] : []} cases={condition.sub_variable_condition ? [condition.sub_variable_condition] : []}
handleAddSubVariableCondition={onAddSubVariableCondition} handleAddSubVariableCondition={onAddSubVariableCondition}
handleRemoveCase={() => { }} handleRemoveCase={() => { }}
handleAddCondition={() => { }} handleAddCondition={() => { }}
handleUpdateCondition={() => { }} handleUpdateCondition={onUpdateCondition}
handleUpdateSubVariableCondition={onUpdateSubVariableCondition}
handleRemoveCondition={() => { }} handleRemoveCondition={() => { }}
handleUpdateConditionLogicalOperator={() => { }} handleUpdateConditionLogicalOperator={() => { }}
nodesOutputVars={[]} nodesOutputVars={[]}

View File

@ -6,6 +6,7 @@ import type {
HandleRemoveCondition, HandleRemoveCondition,
HandleUpdateCondition, HandleUpdateCondition,
HandleUpdateConditionLogicalOperator, HandleUpdateConditionLogicalOperator,
HandleUpdateSubVariableCondition,
} from '../../types' } from '../../types'
import ConditionItem from './condition-item' import ConditionItem from './condition-item'
import type { import type {
@ -16,6 +17,8 @@ import type {
type ConditionListProps = { type ConditionListProps = {
isSubVariable?: boolean isSubVariable?: boolean
disabled?: boolean disabled?: boolean
caseId: string
conditionId?: string
caseItem: CaseItem caseItem: CaseItem
onUpdateCondition: HandleUpdateCondition onUpdateCondition: HandleUpdateCondition
onUpdateConditionLogicalOperator: HandleUpdateConditionLogicalOperator onUpdateConditionLogicalOperator: HandleUpdateConditionLogicalOperator
@ -25,10 +28,13 @@ type ConditionListProps = {
numberVariables: NodeOutPutVar[] numberVariables: NodeOutPutVar[]
varsIsVarFileAttribute: Record<string, boolean> varsIsVarFileAttribute: Record<string, boolean>
onAddSubVariableCondition?: HandleAddSubVariableCondition onAddSubVariableCondition?: HandleAddSubVariableCondition
onUpdateSubVariableCondition?: HandleUpdateSubVariableCondition
} }
const ConditionList = ({ const ConditionList = ({
isSubVariable, isSubVariable,
disabled, disabled,
caseId,
conditionId,
caseItem, caseItem,
onUpdateCondition, onUpdateCondition,
onUpdateConditionLogicalOperator, onUpdateConditionLogicalOperator,
@ -38,6 +44,7 @@ const ConditionList = ({
numberVariables, numberVariables,
varsIsVarFileAttribute, varsIsVarFileAttribute,
onAddSubVariableCondition, onAddSubVariableCondition,
onUpdateSubVariableCondition,
}: ConditionListProps) => { }: ConditionListProps) => {
const { conditions, logical_operator } = caseItem const { conditions, logical_operator } = caseItem
@ -65,7 +72,8 @@ const ConditionList = ({
<ConditionItem <ConditionItem
key={condition.id} key={condition.id}
disabled={disabled} disabled={disabled}
caseId={caseItem.case_id} caseId={caseId}
conditionId={isSubVariable ? conditionId! : condition.id}
condition={condition} condition={condition}
onUpdateCondition={onUpdateCondition} onUpdateCondition={onUpdateCondition}
onRemoveCondition={onRemoveCondition} onRemoveCondition={onRemoveCondition}
@ -75,6 +83,7 @@ const ConditionList = ({
file={varsIsVarFileAttribute[condition.id] ? { key: (condition.variable_selector || []).slice(-1)[0] } : undefined} file={varsIsVarFileAttribute[condition.id] ? { key: (condition.variable_selector || []).slice(-1)[0] } : undefined}
isSubVariableKey={isSubVariable} isSubVariableKey={isSubVariable}
onAddSubVariableCondition={onAddSubVariableCondition} onAddSubVariableCondition={onAddSubVariableCondition}
onUpdateSubVariableCondition={onUpdateSubVariableCondition}
/> />
)) ))
} }

View File

@ -8,7 +8,7 @@ import {
RiDeleteBinLine, RiDeleteBinLine,
RiDraggable, RiDraggable,
} from '@remixicon/react' } from '@remixicon/react'
import type { CaseItem, HandleAddCondition, HandleAddSubVariableCondition, HandleRemoveCondition, HandleUpdateCondition, HandleUpdateConditionLogicalOperator } from '../types' import type { CaseItem, HandleAddCondition, HandleAddSubVariableCondition, HandleRemoveCondition, HandleUpdateCondition, HandleUpdateConditionLogicalOperator, HandleUpdateSubVariableCondition } from '../types'
import type { Node, NodeOutPutVar, Var } from '../../../types' import type { Node, NodeOutPutVar, Var } from '../../../types'
import { VarType } from '../../../types' import { VarType } from '../../../types'
import { useGetAvailableVars } from '../../variable-assigner/hooks' import { useGetAvailableVars } from '../../variable-assigner/hooks'
@ -19,8 +19,8 @@ import Button from '@/app/components/base/button'
type Props = { type Props = {
isSubVariable?: boolean isSubVariable?: boolean
conditionId?: string
caseId?: string caseId?: string
conditionId?: string
nodeId: string nodeId: string
cases: CaseItem[] cases: CaseItem[]
readOnly: boolean readOnly: boolean
@ -28,6 +28,7 @@ type Props = {
handleRemoveCase: (caseId: string) => void handleRemoveCase: (caseId: string) => void
handleAddCondition?: HandleAddCondition handleAddCondition?: HandleAddCondition
handleAddSubVariableCondition?: HandleAddSubVariableCondition handleAddSubVariableCondition?: HandleAddSubVariableCondition
handleUpdateSubVariableCondition?: HandleUpdateSubVariableCondition
handleUpdateCondition: HandleUpdateCondition handleUpdateCondition: HandleUpdateCondition
handleRemoveCondition: HandleRemoveCondition handleRemoveCondition: HandleRemoveCondition
handleUpdateConditionLogicalOperator: HandleUpdateConditionLogicalOperator handleUpdateConditionLogicalOperator: HandleUpdateConditionLogicalOperator
@ -39,8 +40,8 @@ type Props = {
const ConditionWrap: FC<Props> = ({ const ConditionWrap: FC<Props> = ({
isSubVariable, isSubVariable,
conditionId: parentConditionId,
caseId: conditionParentCaseId, caseId: conditionParentCaseId,
conditionId: parentConditionId,
nodeId: id, nodeId: id,
cases = [], cases = [],
readOnly, readOnly,
@ -50,6 +51,7 @@ const ConditionWrap: FC<Props> = ({
handleAddCondition, handleAddCondition,
handleRemoveCondition, handleRemoveCondition,
handleAddSubVariableCondition, handleAddSubVariableCondition,
handleUpdateSubVariableCondition,
handleUpdateConditionLogicalOperator, handleUpdateConditionLogicalOperator,
nodesOutputVars, nodesOutputVars,
availableNodes, availableNodes,
@ -116,6 +118,8 @@ const ConditionWrap: FC<Props> = ({
<ConditionList <ConditionList
disabled={readOnly} disabled={readOnly}
caseItem={item} caseItem={item}
caseId={isSubVariable ? conditionParentCaseId! : item.case_id}
conditionId={parentConditionId}
onUpdateCondition={handleUpdateCondition} onUpdateCondition={handleUpdateCondition}
onRemoveCondition={handleRemoveCondition} onRemoveCondition={handleRemoveCondition}
onUpdateConditionLogicalOperator={handleUpdateConditionLogicalOperator} onUpdateConditionLogicalOperator={handleUpdateConditionLogicalOperator}
@ -124,6 +128,7 @@ const ConditionWrap: FC<Props> = ({
numberVariables={getAvailableVars(id, '', filterNumberVar)} numberVariables={getAvailableVars(id, '', filterNumberVar)}
varsIsVarFileAttribute={varsIsVarFileAttribute} varsIsVarFileAttribute={varsIsVarFileAttribute}
onAddSubVariableCondition={handleAddSubVariableCondition} onAddSubVariableCondition={handleAddSubVariableCondition}
onUpdateSubVariableCondition={handleUpdateSubVariableCondition}
isSubVariable={isSubVariable} isSubVariable={isSubVariable}
/> />
</div> </div>

View File

@ -31,6 +31,7 @@ const Panel: FC<NodePanelProps<IfElseNodeType>> = ({
handleUpdateCondition, handleUpdateCondition,
handleRemoveCondition, handleRemoveCondition,
handleAddSubVariableCondition, handleAddSubVariableCondition,
handleUpdateSubVariableCondition,
handleUpdateConditionLogicalOperator, handleUpdateConditionLogicalOperator,
nodesOutputVars, nodesOutputVars,
availableNodes, availableNodes,
@ -51,6 +52,7 @@ const Panel: FC<NodePanelProps<IfElseNodeType>> = ({
handleRemoveCondition={handleRemoveCondition} handleRemoveCondition={handleRemoveCondition}
handleUpdateConditionLogicalOperator={handleUpdateConditionLogicalOperator} handleUpdateConditionLogicalOperator={handleUpdateConditionLogicalOperator}
handleAddSubVariableCondition={handleAddSubVariableCondition} handleAddSubVariableCondition={handleAddSubVariableCondition}
handleUpdateSubVariableCondition={handleUpdateSubVariableCondition}
nodesOutputVars={nodesOutputVars} nodesOutputVars={nodesOutputVars}
availableNodes={availableNodes} availableNodes={availableNodes}
varsIsVarFileAttribute={varsIsVarFileAttribute} varsIsVarFileAttribute={varsIsVarFileAttribute}

View File

@ -61,4 +61,5 @@ export type HandleAddCondition = (caseId: string, valueSelector: ValueSelector,
export type HandleAddSubVariableCondition = (caseId: string, conditionId: string) => void export type HandleAddSubVariableCondition = (caseId: string, conditionId: string) => void
export type HandleRemoveCondition = (caseId: string, conditionId: string) => void export type HandleRemoveCondition = (caseId: string, conditionId: string) => void
export type HandleUpdateCondition = (caseId: string, conditionId: string, newCondition: Condition) => void export type HandleUpdateCondition = (caseId: string, conditionId: string, newCondition: Condition) => void
export type HandleUpdateSubVariableCondition = (caseId: string, conditionId: string, subConditionId: string, newSubCondition: Condition) => void
export type HandleUpdateConditionLogicalOperator = (caseId: string, value: LogicalOperator) => void export type HandleUpdateConditionLogicalOperator = (caseId: string, value: LogicalOperator) => void

View File

@ -13,6 +13,7 @@ import type {
HandleRemoveCondition, HandleRemoveCondition,
HandleUpdateCondition, HandleUpdateCondition,
HandleUpdateConditionLogicalOperator, HandleUpdateConditionLogicalOperator,
HandleUpdateSubVariableCondition,
IfElseNodeType, IfElseNodeType,
} from './types' } from './types'
import { import {
@ -165,6 +166,22 @@ const useConfig = (id: string, payload: IfElseNodeType) => {
}) })
setInputs(newInputs) setInputs(newInputs)
}, [inputs, setInputs]) }, [inputs, setInputs])
// console.log(inputs.cases)
const handleUpdateSubVariableCondition = useCallback<HandleUpdateSubVariableCondition>((caseId, conditionId, subConditionId, newSubCondition) => {
const newInputs = produce(inputs, (draft) => {
const targetCase = draft.cases?.find(item => item.case_id === caseId)
if (targetCase) {
const targetCondition = targetCase.conditions.find(item => item.id === conditionId)
if (targetCondition && targetCondition.sub_variable_condition) {
const targetSubCondition = targetCondition.sub_variable_condition.conditions.find(item => item.id === subConditionId)
if (targetSubCondition)
Object.assign(targetSubCondition, newSubCondition)
}
}
})
setInputs(newInputs)
}, [inputs, setInputs])
const handleAddSubVariableCondition = useCallback<HandleAddSubVariableCondition>((caseId: string, conditionId: string) => { const handleAddSubVariableCondition = useCallback<HandleAddSubVariableCondition>((caseId: string, conditionId: string) => {
const newInputs = produce(inputs, (draft) => { const newInputs = produce(inputs, (draft) => {
@ -217,6 +234,7 @@ const useConfig = (id: string, payload: IfElseNodeType) => {
handleRemoveCondition, handleRemoveCondition,
handleUpdateCondition, handleUpdateCondition,
handleAddSubVariableCondition, handleAddSubVariableCondition,
handleUpdateSubVariableCondition,
handleUpdateConditionLogicalOperator, handleUpdateConditionLogicalOperator,
nodesOutputVars: availableVars, nodesOutputVars: availableVars,
availableNodes: availableNodesWithParent, availableNodes: availableNodesWithParent,