import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Modal, message, Input, Form, Statistic, Button, Space, Select, } from 'antd'; import { request } from '@/utils/http'; import config from '@/utils/config'; import { MinusCircleOutlined, PlusOutlined } from '@ant-design/icons'; import IconFont from '@/components/iconfont'; import { CrontabStatus } from './type'; import { useRequest } from 'ahooks'; const PROPERTIES = [ { name: intl.get('命令'), value: 'command' }, { name: intl.get('名称'), value: 'name' }, { name: intl.get('定时规则'), value: 'schedule' }, { name: intl.get('状态'), value: 'status', onlySelect: true }, { name: intl.get('标签'), value: 'labels' }, { name: intl.get('订阅'), value: 'sub_id', onlySelect: true }, ]; const EOperation: any = { Reg: '', NotReg: '', In: 'select', Nin: 'select', }; const OPERATIONS = [ { name: intl.get('包含'), value: 'Reg' }, { name: intl.get('不包含'), value: 'NotReg' }, { name: intl.get('属于'), value: 'In', type: 'select' }, { name: intl.get('不属于'), value: 'Nin', type: 'select' }, // { name: '等于', value: 'Eq' }, // { name: '不等于', value: 'Ne' }, // { name: '为空', value: 'IsNull' }, // { name: '不为空', value: 'NotNull' }, ]; const SORTTYPES = [ { name: intl.get('顺序'), value: 'ASC' }, { name: intl.get('倒序'), value: 'DESC' }, ]; enum ViewFilterRelation { 'and' = '且', 'or' = '或', } const ViewCreateModal = ({ view, handleCancel, visible, }: { view?: any; visible: boolean; handleCancel: (param?: any) => void; }) => { const [form] = Form.useForm(); const [loading, setLoading] = useState(false); const [filterRelation, setFilterRelation] = useState<'and' | 'or'>('and'); const filtersValue = Form.useWatch('filters', form); const { data } = useRequest( () => request.get(`${config.apiPrefix}subscriptions`), { cacheKey: 'subscriptions', }, ); const STATUS_MAP = { status: [ { name: intl.get('运行中'), value: CrontabStatus.running }, { name: intl.get('空闲中'), value: CrontabStatus.idle }, { name: intl.get('已禁用'), value: CrontabStatus.disabled }, ], sub_id: data?.data.map((x) => ({ name: x.name, value: x.id })), }; const handleOk = async (values: any) => { setLoading(true); values.filterRelation = filterRelation; const method = view ? 'put' : 'post'; try { const { code, data } = await request[method]( `${config.apiPrefix}crons/views`, view ? { ...values, id: view.id } : values, ); if (code === 200) { handleCancel(data); } setLoading(false); } catch (error: any) { setLoading(false); } }; useEffect(() => { if (!view) { form.resetFields(); } form.setFieldsValue( view || { filters: [{ property: 'command' }], }, ); }, [view, visible]); const OperationElement = ({ name }: { name: number }) => { const property = form.getFieldValue(['filters', name, 'property']); return ( ); }; const propertyElement = (props: any, style: React.CSSProperties = {}) => { return ( ); }; const typeElement = ( ); const statusElement = (property: keyof typeof STATUS_MAP) => { return ( ); }; return ( { form .validateFields() .then((values) => { handleOk(values); }) .catch((info) => { console.log('Validate Failed:', info); }); }} onCancel={() => handleCancel()} confirmLoading={loading} >
{(fields, { add, remove }) => (
1 ? 'active' : '' }`} > {fields.length > 1 && (
)}
{fields.map(({ key, name, ...restField }) => ( {propertyElement(PROPERTIES, { width: 120 })} {EOperation[filtersValue?.[name]['operation']] === 'select' ? ( statusElement(filtersValue?.[name]['property']) ) : ( )} {name !== 0 && ( remove(name)} /> )} ))} add({ property: 'command', operation: 'Reg' }) } > {intl.get('新增筛选条件')}
)}
{(fields, { add, remove }) => (
1 ? 'active' : '' }`} > {fields.length > 1 && (
)}
{fields.map(({ key, name, ...restField }) => ( {propertyElement(PROPERTIES)} {typeElement} remove(name)} /> ))} add({ property: 'command', type: 'ASC' })}> {intl.get('新增排序方式')}
)}
); }; export default ViewCreateModal;