import type { FC } from 'react' import React from 'react' import { useTranslation } from 'react-i18next' import Field from '../_base/components/field' import RemoveEffectVarConfirm from '../_base/components/remove-effect-var-confirm' import useConfig from './use-config' import type { VariableAssignerNodeType } from './types' import VarGroupItem from './components/var-group-item' import cn from '@/utils/classnames' import { type NodePanelProps } from '@/app/components/workflow/types' import Split from '@/app/components/workflow/nodes/_base/components/split' import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' import Switch from '@/app/components/base/switch' import AddButton from '@/app/components/workflow/nodes/_base/components/add-button' const i18nPrefix = 'workflow.nodes.variableAssigner' const Panel: FC<NodePanelProps<VariableAssignerNodeType>> = ({ id, data, }) => { const { t } = useTranslation() const { readOnly, inputs, handleListOrTypeChange, isEnableGroup, handleGroupEnabledChange, handleAddGroup, handleListOrTypeChangeInGroup, handleGroupRemoved, handleVarGroupNameChange, isShowRemoveVarConfirm, hideRemoveVarConfirm, onRemoveVarConfirm, getAvailableVars, filterVar, } = useConfig(id, data) return ( <div className='mt-2'> <div className='px-4 pb-4 space-y-4'> {!isEnableGroup ? ( <VarGroupItem readOnly={readOnly} nodeId={id} payload={{ output_type: inputs.output_type, variables: inputs.variables, }} onChange={handleListOrTypeChange} groupEnabled={false} availableVars={getAvailableVars(id, 'target', filterVar(inputs.output_type), true)} /> ) : (<div> <div className='space-y-2'> {inputs.advanced_settings?.groups.map((item, index) => ( <div key={item.groupId}> <VarGroupItem readOnly={readOnly} nodeId={id} payload={item} onChange={handleListOrTypeChangeInGroup(item.groupId)} groupEnabled canRemove={!readOnly && inputs.advanced_settings?.groups.length > 1} onRemove={handleGroupRemoved(item.groupId)} onGroupNameChange={handleVarGroupNameChange(item.groupId)} availableVars={getAvailableVars(id, item.groupId, filterVar(item.output_type), true)} /> {index !== inputs.advanced_settings?.groups.length - 1 && <Split className='my-4' />} </div> ))} </div> <AddButton className='mt-2' text={t(`${i18nPrefix}.addGroup`)} onClick={handleAddGroup} /> </div>)} </div> <Split /> <div className={cn('px-4 pt-4', isEnableGroup ? 'pb-4' : 'pb-2')}> <Field title={t(`${i18nPrefix}.aggregationGroup`)} tooltip={t(`${i18nPrefix}.aggregationGroupTip`)!} operations={ <Switch defaultValue={isEnableGroup} onChange={handleGroupEnabledChange} size='md' disabled={readOnly} /> } /> </div> {isEnableGroup && ( <> <Split /> <div className='px-4 pt-4 pb-2'> <OutputVars> <> {inputs.advanced_settings?.groups.map((item, index) => ( <VarItem key={index} name={`${item.group_name}.output`} type={item.output_type} description={t(`${i18nPrefix}.outputVars.varDescribe`, { groupName: item.group_name, })} /> ))} </> </OutputVars> </div> </> )} <RemoveEffectVarConfirm isShow={isShowRemoveVarConfirm} onCancel={hideRemoveVarConfirm} onConfirm={onRemoveVarConfirm} /> </div> ) } export default React.memo(Panel)