diff --git a/src/pages/crontab/addFilterModal.tsx b/src/pages/crontab/addFilterModal.tsx new file mode 100644 index 00000000..f3d391ea --- /dev/null +++ b/src/pages/crontab/addFilterModal.tsx @@ -0,0 +1,48 @@ +import React, { useCallback, useImperativeHandle, useState } from 'react'; +import { Modal, Input, Form } from 'antd'; + +const addFilterModal = React.forwardRef((props: any, ref) => { + const [form] = Form.useForm(); + const [visible, setVisible] = useState(false); + + useImperativeHandle(ref, () => ({ + showModal: () => { + form.resetFields(); + setVisible(true); + }, + })); + + const handleCancel = useCallback(() => { + form.resetFields(); + setVisible(false); + }, [form, setVisible]); + + const handleOk = useCallback(async () => { + form.validateFields().then((values) => { + setVisible(false); + props.handleOk(values); + }); + }, [setVisible, props.handleOk]); + + return ( + +
+ + + + + + +
+
+ ); +}); + +export default addFilterModal; diff --git a/src/pages/crontab/index.tsx b/src/pages/crontab/index.tsx index 8d57ae2f..876390e8 100644 --- a/src/pages/crontab/index.tsx +++ b/src/pages/crontab/index.tsx @@ -1,4 +1,11 @@ -import React, { PureComponent, Fragment, useState, useEffect } from 'react'; +import React, { + PureComponent, + Fragment, + useState, + useEffect, + useCallback, + useRef, +} from 'react'; import { Button, message, @@ -11,6 +18,7 @@ import { Menu, Typography, Input, + Tabs, } from 'antd'; import { ClockCircleOutlined, @@ -31,10 +39,13 @@ import { PageContainer } from '@ant-design/pro-layout'; import { request } from '@/utils/http'; import CronModal from './modal'; import CronLogModal from './logModal'; +import AddFilterModal from './addFilterModal'; const { Text } = Typography; const { Search } = Input; +type Pane = { title: string; key: string }; + enum CrontabStatus { 'running', 'idle', @@ -58,6 +69,8 @@ enum OperationPath { 'stop', } +const KEY_ALL = 'all'; + const Crontab = () => { const columns = [ { @@ -187,6 +200,21 @@ const Crontab = () => { const [isLogModalVisible, setIsLogModalVisible] = useState(false); const [logCron, setLogCron] = useState(); const [selectedRowIds, setSelectedRowIds] = useState([]); + const [panes, setPanes] = useState([ + { + title: '内置命令', + key: 'ql', + }, + ]); + const [activeKey, setActiveKey] = useState(KEY_ALL); + const addFilterModalRef = useRef(null); + + const handleAddFilter = useCallback( + (values) => { + setPanes([...panes, values]); + }, + [panes, setPanes], + ); const getCrons = () => { setLoading(true); @@ -511,6 +539,30 @@ const Crontab = () => { }); }; + const remove = useCallback( + (targetKey) => { + setPanes(panes.filter((pane) => pane.key !== targetKey)); + }, + [panes, setPanes], + ); + + const add = useCallback(() => { + (addFilterModalRef.current as any).showModal(); + }, []); + + const onEdit = useCallback((targetKey: string, action: string) => { + if (action === 'remove') { + remove(targetKey); + } else { + add(); + } + }, []); + + const onTabChange = useCallback((activeKey: string) => { + activeKey !== KEY_ALL && onSearch(activeKey); + setActiveKey(activeKey); + }, []); + useEffect(() => { if (logCron) { localStorage.setItem('logCron', logCron._id); @@ -598,6 +650,18 @@ const Crontab = () => { )} + + + {panes.map((pane) => { + return ; + })} + { handleCancel={handleCancel} cron={editedCron} /> + ); };