| import { useTranslate } from '@/hooks/commonHooks'; | |
| import { CloseOutlined } from '@ant-design/icons'; | |
| import { Button, Card, Form, Input, Select, Typography } from 'antd'; | |
| import { useUpdateNodeInternals } from 'reactflow'; | |
| import { ICategorizeItem } from '../interface'; | |
| import { useBuildCategorizeToOptions, useHandleToSelectChange } from './hooks'; | |
| interface IProps { | |
| nodeId?: string; | |
| } | |
| const DynamicCategorize = ({ nodeId }: IProps) => { | |
| const updateNodeInternals = useUpdateNodeInternals(); | |
| const form = Form.useFormInstance(); | |
| const buildCategorizeToOptions = useBuildCategorizeToOptions(); | |
| const { handleSelectChange } = useHandleToSelectChange(nodeId); | |
| const { t } = useTranslate('flow'); | |
| return ( | |
| <> | |
| <Form.List name="items"> | |
| {(fields, { add, remove }) => { | |
| const handleAdd = () => { | |
| const idx = fields.length; | |
| add({ name: `Categorize ${idx + 1}` }); | |
| if (nodeId) updateNodeInternals(nodeId); | |
| }; | |
| return ( | |
| <div | |
| style={{ display: 'flex', rowGap: 10, flexDirection: 'column' }} | |
| > | |
| {fields.map((field) => ( | |
| <Card | |
| size="small" | |
| key={field.key} | |
| extra={ | |
| <CloseOutlined | |
| onClick={() => { | |
| remove(field.name); | |
| }} | |
| /> | |
| } | |
| > | |
| <Form.Item | |
| label={t('name')} | |
| name={[field.name, 'name']} | |
| rules={[{ required: true, message: t('nameMessage') }]} | |
| > | |
| <Input /> | |
| </Form.Item> | |
| <Form.Item | |
| label={t('description')} | |
| name={[field.name, 'description']} | |
| > | |
| <Input.TextArea rows={3} /> | |
| </Form.Item> | |
| <Form.Item | |
| label={t('examples')} | |
| name={[field.name, 'examples']} | |
| > | |
| <Input.TextArea rows={3} /> | |
| </Form.Item> | |
| <Form.Item label={t('to')} name={[field.name, 'to']}> | |
| <Select | |
| allowClear | |
| options={buildCategorizeToOptions( | |
| (form.getFieldValue(['items']) ?? []) | |
| .map((x: ICategorizeItem) => x.to) | |
| .filter( | |
| (x: string) => | |
| x !== | |
| form.getFieldValue(['items', field.name, 'to']), | |
| ), | |
| )} | |
| onChange={handleSelectChange( | |
| form.getFieldValue(['items', field.name, 'name']), | |
| )} | |
| /> | |
| </Form.Item> | |
| </Card> | |
| ))} | |
| <Button type="dashed" onClick={handleAdd} block> | |
| + Add Item | |
| </Button> | |
| </div> | |
| ); | |
| }} | |
| </Form.List> | |
| <Form.Item noStyle shouldUpdate> | |
| {() => ( | |
| <Typography> | |
| <pre>{JSON.stringify(form.getFieldsValue(), null, 2)}</pre> | |
| </Typography> | |
| )} | |
| </Form.Item> | |
| </> | |
| ); | |
| }; | |
| export default DynamicCategorize; | |