|
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'; |
|
import styles from './index.less'; |
|
|
|
interface IProps { |
|
nodeId?: string; |
|
} |
|
|
|
enum VariableType { |
|
Reference = 'reference', |
|
Input = 'input', |
|
} |
|
|
|
const getVariableName = (type: string) => |
|
type === VariableType.Reference ? 'component_id' : 'value'; |
|
|
|
const DynamicVariableForm = ({ nodeId }: IProps) => { |
|
const { t } = useTranslation(); |
|
const valueOptions = useBuildComponentIdSelectOptions(nodeId); |
|
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.addItem')} |
|
</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 = ({ nodeId }: IProps) => { |
|
const { t } = useTranslation(); |
|
return ( |
|
<FormCollapse title={t('flow.input')}> |
|
<DynamicVariableForm nodeId={nodeId}></DynamicVariableForm> |
|
</FormCollapse> |
|
); |
|
}; |
|
|
|
export default DynamicInputVariable; |
|
|