- 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 { Node } from 'reactflow';
- import { useBuildComponentIdSelectOptions } from '../../hooks/use-get-begin-query';
- import { NodeData } from '../../interface';
-
- import styles from './index.less';
-
- interface IProps {
- node?: Node<NodeData>;
- }
-
- 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;
|