153 lines
5.1 KiB
TypeScript
153 lines
5.1 KiB
TypeScript
import { forwardRef, useImperativeHandle, useState } from 'react';
|
|
import { Form, Input, Select, Checkbox, InputNumber, Button, App } from 'antd';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
import type { InnerToolModalRef, ToolItem, InnerConfigItem, InnerToolItem } from '../types'
|
|
import RbModal from '@/components/RbModal'
|
|
import { InnerConfigData } from '../constant'
|
|
import RbAlert from '@/components/RbAlert';
|
|
import { updateTool, testConnection } from '@/api/tools'
|
|
|
|
const FormItem = Form.Item;
|
|
|
|
interface InnerToolModalProps {
|
|
refreshTable: () => void;
|
|
}
|
|
|
|
const InnerToolModal = forwardRef<InnerToolModalRef, InnerToolModalProps>(({
|
|
refreshTable
|
|
}, ref) => {
|
|
const { t } = useTranslation();
|
|
const { message } = App.useApp();
|
|
const [visible, setVisible] = useState(false);
|
|
const [form] = Form.useForm<InnerToolItem>();
|
|
const [loading, setLoading] = useState(false)
|
|
const [editVo, setEditVo] = useState<ToolItem>({} as ToolItem)
|
|
const [config, setConfig] = useState<InnerConfigItem['config']>({});
|
|
const search_type = Form.useWatch(['config', 'parameters', 'search_type'], form)
|
|
|
|
// 封装取消方法,添加关闭弹窗逻辑
|
|
const handleClose = () => {
|
|
setVisible(false);
|
|
form.resetFields();
|
|
setLoading(false)
|
|
setConfig({})
|
|
};
|
|
|
|
const handleOpen = (data: ToolItem) => {
|
|
setEditVo(data)
|
|
const { config_data } = data
|
|
form.setFieldsValue({
|
|
config: {
|
|
...config_data,
|
|
parameters: {
|
|
search_type: 'web',
|
|
...(config_data as any).parameters
|
|
},
|
|
}
|
|
})
|
|
setConfig(InnerConfigData[config_data.tool_class].config)
|
|
setVisible(true)
|
|
};
|
|
// 封装保存方法,添加提交逻辑
|
|
const handleSave = () => {
|
|
form
|
|
.validateFields()
|
|
.then((values) => {
|
|
updateTool(editVo.id, {
|
|
config: {
|
|
...editVo.config_data,
|
|
...values.config,
|
|
}
|
|
} as any)
|
|
.then((res: any) => {
|
|
message.success(t('common.saveSuccess'));
|
|
testConnection(res.tool_id || editVo?.id)
|
|
.finally(() => {
|
|
setLoading(false);
|
|
handleClose();
|
|
refreshTable()
|
|
})
|
|
})
|
|
.catch(() => {
|
|
setLoading(false);
|
|
})
|
|
})
|
|
.catch((err) => {
|
|
console.log('err', err)
|
|
});
|
|
}
|
|
|
|
// 暴露给父组件的方法
|
|
useImperativeHandle(ref, () => ({
|
|
handleOpen,
|
|
handleClose
|
|
}));
|
|
|
|
return (
|
|
<RbModal
|
|
title={`${editVo.name} ${t('tool.config')}`}
|
|
open={visible}
|
|
onCancel={handleClose}
|
|
okText={t('tool.saveAndTest')}
|
|
onOk={handleSave}
|
|
confirmLoading={loading}
|
|
>
|
|
{editVo?.config_data?.tool_class && config && <>
|
|
<RbAlert className="rb:mb-3">
|
|
<div>
|
|
<div className="rb:text-[14px] rb:font-medium">{t('tool.configDesc')}</div>
|
|
<div className="rb:mt-2">{t(`tool.${editVo?.config_data?.tool_class}_config_desc`)}</div>
|
|
<div className="rb:font-medium">{t('tool.link')}: <Button size="small" type="link">{InnerConfigData[editVo?.config_data?.tool_class].link}</Button></div>
|
|
</div>
|
|
</RbAlert>
|
|
<Form
|
|
form={form}
|
|
layout="vertical"
|
|
>
|
|
{Object.keys(config).map((key) => {
|
|
const range = key === 'pagesize' && search_type ? config[key].range?.[search_type] ?? [] : [ config[key].min, config[key].max ]
|
|
return (
|
|
<FormItem
|
|
key={key}
|
|
label={config[key].type === 'checkbox' ? null : t(`tool.${key}`)}
|
|
name={config[key].name}
|
|
extra={config[key].desc ? t(`tool.${config[key].desc}`, { count1: range[0], count2: range[1] }) : null}
|
|
valuePropName={config[key].type === 'checkbox' ? 'checked' : 'value'}
|
|
rules={config[key].rules ? config[key].rules.map(vo => ({
|
|
...vo,
|
|
message: t(vo.message)
|
|
})) : []}
|
|
>
|
|
{config[key].type === 'input'
|
|
? <Input placeholder={t('common.inputPlaceholder', { title: t(`tool.${key}`) })} />
|
|
: config[key].type === 'number'
|
|
? <InputNumber
|
|
placeholder={t('common.pleaseEnter')}
|
|
min={range[0]}
|
|
max={range[1]}
|
|
step={config[key].step}
|
|
className="rb:w-full!"
|
|
/>
|
|
: config[key].type === 'checkbox'
|
|
? <Checkbox>{t(`tool.${key}`)}</Checkbox>
|
|
: config[key].type === 'select' && config[key].options
|
|
? <Select
|
|
placeholder={t('common.pleaseSelect')}
|
|
options={config[key].options.map(vo => ({
|
|
...vo,
|
|
label: t(`tool.${vo.label}`)
|
|
}))}
|
|
/>
|
|
: null
|
|
}
|
|
</FormItem>
|
|
)
|
|
})}
|
|
</Form>
|
|
</>}
|
|
</RbModal>
|
|
);
|
|
});
|
|
|
|
export default InnerToolModal; |