增加定时任务筛选

This commit is contained in:
zhouteng 2021-06-09 17:53:56 +08:00
parent c7a87efb8d
commit 065f1dca01
2 changed files with 114 additions and 1 deletions

View File

@ -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 (
<Modal
title={'新建筛选'}
visible={visible}
forceRender
onOk={handleOk}
onCancel={handleCancel}
destroyOnClose
>
<Form form={form} layout="vertical" name="form_in_modal" preserve={false}>
<Form.Item name="title" label="名称" rules={[{ required: true }]}>
<Input placeholder="请输入筛选Tab名称" />
</Form.Item>
<Form.Item name="key" label="关键词" rules={[{ required: true }]}>
<Input placeholder="请输入名称或者关键词" />
</Form.Item>
</Form>
</Modal>
);
});
export default addFilterModal;

View File

@ -1,4 +1,11 @@
import React, { PureComponent, Fragment, useState, useEffect } from 'react'; import React, {
PureComponent,
Fragment,
useState,
useEffect,
useCallback,
useRef,
} from 'react';
import { import {
Button, Button,
message, message,
@ -11,6 +18,7 @@ import {
Menu, Menu,
Typography, Typography,
Input, Input,
Tabs,
} from 'antd'; } from 'antd';
import { import {
ClockCircleOutlined, ClockCircleOutlined,
@ -31,10 +39,13 @@ import { PageContainer } from '@ant-design/pro-layout';
import { request } from '@/utils/http'; import { request } from '@/utils/http';
import CronModal from './modal'; import CronModal from './modal';
import CronLogModal from './logModal'; import CronLogModal from './logModal';
import AddFilterModal from './addFilterModal';
const { Text } = Typography; const { Text } = Typography;
const { Search } = Input; const { Search } = Input;
type Pane = { title: string; key: string };
enum CrontabStatus { enum CrontabStatus {
'running', 'running',
'idle', 'idle',
@ -58,6 +69,8 @@ enum OperationPath {
'stop', 'stop',
} }
const KEY_ALL = 'all';
const Crontab = () => { const Crontab = () => {
const columns = [ const columns = [
{ {
@ -187,6 +200,21 @@ const Crontab = () => {
const [isLogModalVisible, setIsLogModalVisible] = useState(false); const [isLogModalVisible, setIsLogModalVisible] = useState(false);
const [logCron, setLogCron] = useState<any>(); const [logCron, setLogCron] = useState<any>();
const [selectedRowIds, setSelectedRowIds] = useState<string[]>([]); const [selectedRowIds, setSelectedRowIds] = useState<string[]>([]);
const [panes, setPanes] = useState<Pane[]>([
{
title: '内置命令',
key: 'ql',
},
]);
const [activeKey, setActiveKey] = useState<string>(KEY_ALL);
const addFilterModalRef = useRef(null);
const handleAddFilter = useCallback(
(values) => {
setPanes([...panes, values]);
},
[panes, setPanes],
);
const getCrons = () => { const getCrons = () => {
setLoading(true); 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(() => { useEffect(() => {
if (logCron) { if (logCron) {
localStorage.setItem('logCron', logCron._id); localStorage.setItem('logCron', logCron._id);
@ -598,6 +650,18 @@ const Crontab = () => {
</span> </span>
</div> </div>
)} )}
<Tabs
style={{ marginBottom: 16 }}
type="editable-card"
onEdit={onEdit}
activeKey={activeKey}
onChange={onTabChange}
>
<Tabs.TabPane key={KEY_ALL} tab="全部" closable={false}></Tabs.TabPane>
{panes.map((pane) => {
return <Tabs.TabPane key={pane.key} tab={pane.title}></Tabs.TabPane>;
})}
</Tabs>
<Table <Table
columns={columns} columns={columns}
pagination={{ pagination={{
@ -627,6 +691,7 @@ const Crontab = () => {
handleCancel={handleCancel} handleCancel={handleCancel}
cron={editedCron} cron={editedCron}
/> />
<AddFilterModal ref={addFilterModalRef} handleOk={handleAddFilter} />
</PageContainer> </PageContainer>
); );
}; };