balibabu
Feat: The Begin and IterationStart operators cannot be deleted using shortcut keys #4287 (#4288)
b1ea792
import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons'; | |
import { Button, Collapse, Flex, Form, Input, Select } from 'antd'; | |
import { PropsWithChildren, useCallback } from 'react'; | |
import { useTranslation } from 'react-i18next'; | |
import { useBuildComponentIdSelectOptions } from '../../hooks/use-get-begin-query'; | |
import { RAGFlowNodeType } from '../../interface'; | |
import styles from './index.less'; | |
interface IProps { | |
node?: RAGFlowNodeType; | |
} | |
enum VariableType { | |
Reference = 'reference', | |
Input = 'input', | |
} | |
const getVariableName = (type: string) => | |
type === VariableType.Reference ? 'component_id' : 'value'; | |
const DynamicVariableForm = ({ node }: IProps) => { | |
const { t } = useTranslation(); | |
const valueOptions = useBuildComponentIdSelectOptions( | |
node?.id, | |
node?.parentId, | |
); | |
const form = Form.useFormInstance(); | |
const options = [ | |
{ value: VariableType.Reference, label: t('flow.reference') }, | |
{ value: VariableType.Input, label: t('flow.input') }, | |
]; | |
const handleTypeChange = useCallback( | |
(name: number) => () => { | |
setTimeout(() => { | |
form.setFieldValue(['query', name, 'component_id'], undefined); | |
form.setFieldValue(['query', name, 'value'], undefined); | |
}, 0); | |
}, | |
[form], | |
); | |
return ( | |
<Form.List name="query"> | |
{(fields, { add, remove }) => ( | |
<> | |
{fields.map(({ key, name, ...restField }) => ( | |
<Flex key={key} gap={10} align={'baseline'}> | |
<Form.Item | |
{...restField} | |
name={[name, 'type']} | |
className={styles.variableType} | |
> | |
<Select | |
options={options} | |
onChange={handleTypeChange(name)} | |
></Select> | |
</Form.Item> | |
<Form.Item noStyle dependencies={[name, 'type']}> | |
{({ getFieldValue }) => { | |
const type = getFieldValue(['query', name, 'type']); | |
return ( | |
<Form.Item | |
{...restField} | |
name={[name, getVariableName(type)]} | |
className={styles.variableValue} | |
> | |
{type === VariableType.Reference ? ( | |
<Select | |
placeholder={t('common.pleaseSelect')} | |
options={valueOptions} | |
></Select> | |
) : ( | |
<Input placeholder={t('common.pleaseInput')} /> | |
)} | |
</Form.Item> | |
); | |
}} | |
</Form.Item> | |
<MinusCircleOutlined onClick={() => remove(name)} /> | |
</Flex> | |
))} | |
<Form.Item> | |
<Button | |
type="dashed" | |
onClick={() => add({ type: VariableType.Reference })} | |
block | |
icon={<PlusOutlined />} | |
className={styles.addButton} | |
> | |
{t('flow.addVariable')} | |
</Button> | |
</Form.Item> | |
</> | |
)} | |
</Form.List> | |
); | |
}; | |
export function FormCollapse({ | |
children, | |
title, | |
}: PropsWithChildren<{ title: string }>) { | |
return ( | |
<Collapse | |
className={styles.dynamicInputVariable} | |
defaultActiveKey={['1']} | |
items={[ | |
{ | |
key: '1', | |
label: <span className={styles.title}>{title}</span>, | |
children, | |
}, | |
]} | |
/> | |
); | |
} | |
const DynamicInputVariable = ({ node }: IProps) => { | |
const { t } = useTranslation(); | |
return ( | |
<FormCollapse title={t('flow.input')}> | |
<DynamicVariableForm node={node}></DynamicVariableForm> | |
</FormCollapse> | |
); | |
}; | |
export default DynamicInputVariable; | |