diff --git a/mock/rule.js b/mock/rule.js
index 2090ce8e18a0687987045ab6119471aa21508d86..fea91ca11357b64799ed5c845dc307058b324816 100644
--- a/mock/rule.js
+++ b/mock/rule.js
@@ -8,10 +8,10 @@ for (let i = 0; i < 46; i += 1) {
disabled: ((i % 6) === 0),
href: 'https://ant.design',
avatar: ['https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png'][i % 2],
- no: `TradeCode ${i}`,
+ name: `TradeCode ${i}`,
title: `一个任务名称 ${i}`,
owner: '曲丽丽',
- description: '这是一段描述',
+ desc: '这是一段描述',
callNo: Math.floor(Math.random() * 1000),
status: Math.floor(Math.random() * 10) % 4,
updatedAt: new Date(`2017-07-${Math.floor(i / 2) + 1}`),
@@ -51,8 +51,8 @@ export function getRule(req, res, u) {
dataSource = filterDataSource;
}
- if (params.no) {
- dataSource = dataSource.filter(data => data.no.indexOf(params.no) > -1);
+ if (params.name) {
+ dataSource = dataSource.filter(data => data.name.indexOf(params.name) > -1);
}
let pageSize = 10;
@@ -83,12 +83,12 @@ export function postRule(req, res, u, b) {
}
const body = (b && b.body) || req.body;
- const { method, no, description } = body;
+ const { method, name, desc, key } = body;
switch (method) {
/* eslint no-case-declarations:0 */
case 'delete':
- tableListDataSource = tableListDataSource.filter(item => no.indexOf(item.no) === -1);
+ tableListDataSource = tableListDataSource.filter(item => key.indexOf(item.key) === -1);
break;
case 'post':
const i = Math.ceil(Math.random() * 10000);
@@ -96,10 +96,10 @@ export function postRule(req, res, u, b) {
key: i,
href: 'https://ant.design',
avatar: ['https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png', 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png'][i % 2],
- no: `TradeCode ${i}`,
+ name: `TradeCode ${i}`,
title: `一个任务名称 ${i}`,
owner: '曲丽丽',
- description,
+ desc,
callNo: Math.floor(Math.random() * 1000),
status: Math.floor(Math.random() * 10) % 2,
updatedAt: new Date(),
@@ -107,6 +107,14 @@ export function postRule(req, res, u, b) {
progress: Math.ceil(Math.random() * 100),
});
break;
+ case 'update':
+ tableListDataSource = tableListDataSource.map((item) => {
+ if (item.key === key) {
+ return { ...item, desc, name };
+ }
+ return item;
+ });
+ break;
default:
break;
}
diff --git a/src/models/rule.js b/src/models/rule.js
index 9ae968f8d0204c32e02a9f9fa0cb4f8785c4c7ef..8303dd21198c112689c84f7c42918c3da4bca430 100644
--- a/src/models/rule.js
+++ b/src/models/rule.js
@@ -1,4 +1,4 @@
-import { queryRule, removeRule, addRule } from '../services/api';
+import { queryRule, removeRule, addRule, updateRule } from '../services/api';
export default {
namespace: 'rule',
@@ -34,6 +34,14 @@ export default {
});
if (callback) callback();
},
+ *update({ payload, callback }, { call, put }) {
+ const response = yield call(updateRule, payload);
+ yield put({
+ type: 'save',
+ payload: response,
+ });
+ if (callback) callback();
+ },
},
reducers: {
diff --git a/src/routes/List/TableList.js b/src/routes/List/TableList.js
index a74860c78d2026b4797a59031c211e3f068fb11f..507442cc18d233352e70820744591f46df144145 100644
--- a/src/routes/List/TableList.js
+++ b/src/routes/List/TableList.js
@@ -1,77 +1,21 @@
import React, { PureComponent, Fragment } from 'react';
import { connect } from 'dva';
import moment from 'moment';
-import { Row, Col, Card, Form, Input, Select, Icon, Button, Dropdown, Menu, InputNumber, DatePicker, Modal, message, Badge, Divider } from 'antd';
+import { Row, Col, Card, Form, Input, Select, Icon, Button, Dropdown, Menu,
+ InputNumber, DatePicker, Modal, message, Badge, Divider, Steps, Radio } from 'antd';
import StandardTable from '../../components/StandardTable';
import PageHeaderLayout from '../../layouts/PageHeaderLayout';
import styles from './TableList.less';
const FormItem = Form.Item;
+const { Step } = Steps;
+const { TextArea } = Input;
const { Option } = Select;
+const RadioGroup = Radio.Group;
const getValue = obj => Object.keys(obj).map(key => obj[key]).join(',');
const statusMap = ['default', 'processing', 'success', 'error'];
const status = ['关闭', '运行中', '已上线', '异常'];
-const columns = [
- {
- title: '规则编号',
- dataIndex: 'no',
- },
- {
- title: '描述',
- dataIndex: 'description',
- },
- {
- title: '服务调用次数',
- dataIndex: 'callNo',
- sorter: true,
- align: 'right',
- render: val => `${val} 万`,
- // mark to display a total number
- needTotal: true,
- },
- {
- title: '状态',
- dataIndex: 'status',
- filters: [
- {
- text: status[0],
- value: 0,
- },
- {
- text: status[1],
- value: 1,
- },
- {
- text: status[2],
- value: 2,
- },
- {
- text: status[3],
- value: 3,
- },
- ],
- render(val) {
- return ;
- },
- },
- {
- title: '更新时间',
- dataIndex: 'updatedAt',
- sorter: true,
- render: val => {moment(val).format('YYYY-MM-DD HH:mm:ss')},
- },
- {
- title: '操作',
- render: () => (
-
- 配置
-
- 订阅警报
-
- ),
- },
-];
const CreateForm = Form.create()((props) => {
const { modalVisible, form, handleAdd, handleModalVisible } = props;
@@ -83,6 +27,7 @@ const CreateForm = Form.create()((props) => {
};
return (
{
label="描述"
>
{form.getFieldDecorator('desc', {
- rules: [{ required: true, message: 'Please input some description...' }],
+ rules: [{ required: true, message: '请输入至少五个字符的规则描述!', min: 5 }],
})(
)}
@@ -103,6 +48,190 @@ const CreateForm = Form.create()((props) => {
);
});
+@Form.create()
+class UpdateForm extends PureComponent {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ formVals: {
+ name: props.values.name,
+ desc: props.values.desc,
+ key: props.values.key,
+ target: '0',
+ template: '0',
+ type: '1',
+ time: '',
+ frequency: 'month',
+ },
+ currentStep: 0,
+ };
+
+ this.formLayout = {
+ labelCol: { span: 7 },
+ wrapperCol: { span: 13 },
+ };
+ }
+ handleNext = (currentStep) => {
+ const { form, handleUpdate } = this.props;
+ form.validateFields((err, fieldsValue) => {
+ if (err) return;
+ const formVals = { ...this.state.formVals, ...fieldsValue };
+ this.setState({
+ formVals,
+ }, () => {
+ if (currentStep < 2) {
+ this.forward();
+ } else {
+ handleUpdate(this.state.formVals);
+ }
+ });
+ });
+ }
+ backward = () => {
+ this.setState({
+ currentStep: this.state.currentStep - 1,
+ });
+ }
+ forward = () => {
+ this.setState({
+ currentStep: this.state.currentStep + 1,
+ });
+ }
+ renderContent = (currentStep, formVals) => {
+ const { form } = this.props;
+ if (currentStep === 1) {
+ return [
+
+ {form.getFieldDecorator('target', {
+ initialValue: formVals.target,
+ })(
+
+ )}
+ ,
+
+ {form.getFieldDecorator('template', {
+ initialValue: formVals.template,
+ })(
+
+ )}
+ ,
+
+ {form.getFieldDecorator('type', {
+ initialValue: formVals.type,
+ })(
+
+ 强
+ 弱
+
+ )}
+ ,
+ ];
+ }
+ if (currentStep === 2) {
+ return [
+
+ {form.getFieldDecorator('time', {
+ rules: [{ required: true, message: '请选择开始时间!' }],
+ })(
+
+ )}
+ ,
+
+ {form.getFieldDecorator('frequency', {
+ initialValue: formVals.frequency,
+ })(
+
+ )}
+ ,
+ ];
+ }
+ return [
+
+ {form.getFieldDecorator('name', {
+ rules: [{ required: true, message: '请输入规则名称!' }],
+ initialValue: formVals.name,
+ })(
+
+ )}
+ ,
+
+ {form.getFieldDecorator('desc', {
+ rules: [{ required: true, message: '请输入至少五个字符的规则描述!', min: 5 }],
+ initialValue: formVals.desc,
+ })(
+
+ )}
+ ,
+ ];
+ }
+ renderFooter = (currentStep) => {
+ const { handleUpdateModalVisible } = this.props;
+ if (currentStep === 1) {
+ return [
+ ,
+ ,
+ ,
+ ];
+ }
+ if (currentStep === 2) {
+ return [
+ ,
+ ,
+ ,
+ ];
+ }
+ return [
+ ,
+ ,
+ ];
+ }
+ render() {
+ const { updateModalVisible, handleUpdateModalVisible } = this.props;
+ const { currentStep, formVals } = this.state;
+
+ return (
+ handleUpdateModalVisible()}
+ >
+
+
+
+
+
+ { this.renderContent(currentStep, formVals) }
+
+ );
+ }
+}
+
+/* eslint react/no-multi-comp:0 */
@connect(({ rule, loading }) => ({
rule,
loading: loading.models.rule,
@@ -111,9 +240,11 @@ const CreateForm = Form.create()((props) => {
export default class TableList extends PureComponent {
state = {
modalVisible: false,
+ updateModalVisible: false,
expandForm: false,
selectedRows: [],
formValues: {},
+ stepFormValues: {},
};
componentDidMount() {
@@ -123,6 +254,67 @@ export default class TableList extends PureComponent {
});
}
+ columns = [
+ {
+ title: '规则名称',
+ dataIndex: 'name',
+ },
+ {
+ title: '描述',
+ dataIndex: 'desc',
+ },
+ {
+ title: '服务调用次数',
+ dataIndex: 'callNo',
+ sorter: true,
+ align: 'right',
+ render: val => `${val} 万`,
+ // mark to display a total number
+ needTotal: true,
+ },
+ {
+ title: '状态',
+ dataIndex: 'status',
+ filters: [
+ {
+ text: status[0],
+ value: 0,
+ },
+ {
+ text: status[1],
+ value: 1,
+ },
+ {
+ text: status[2],
+ value: 2,
+ },
+ {
+ text: status[3],
+ value: 3,
+ },
+ ],
+ render(val) {
+ return ;
+ },
+ },
+ {
+ title: '上次调度时间',
+ dataIndex: 'updatedAt',
+ sorter: true,
+ render: val => {moment(val).format('YYYY-MM-DD HH:mm:ss')},
+ },
+ {
+ title: '操作',
+ render: (text, record) => (
+
+ this.handleUpdateModalVisible(true, record)}>配置
+
+ 订阅警报
+
+ ),
+ },
+ ];
+
handleStandardTableChange = (pagination, filtersArg, sorter) => {
const { dispatch } = this.props;
const { formValues } = this.state;
@@ -172,13 +364,12 @@ export default class TableList extends PureComponent {
const { selectedRows } = this.state;
if (!selectedRows) return;
-
switch (e.key) {
case 'remove':
dispatch({
type: 'rule/remove',
payload: {
- no: selectedRows.map(row => row.no).join(','),
+ key: selectedRows.map(row => row.key),
},
callback: () => {
this.setState({
@@ -228,18 +419,37 @@ export default class TableList extends PureComponent {
});
}
+ handleUpdateModalVisible = (flag, record) => {
+ this.setState({
+ updateModalVisible: !!flag,
+ stepFormValues: record || {},
+ });
+ }
+
handleAdd = (fields) => {
this.props.dispatch({
type: 'rule/add',
payload: {
- description: fields.desc,
+ desc: fields.desc,
},
});
message.success('添加成功');
- this.setState({
- modalVisible: false,
+ this.handleModalVisible();
+ }
+
+ handleUpdate = (fields) => {
+ this.props.dispatch({
+ type: 'rule/update',
+ payload: {
+ name: fields.name,
+ desc: fields.desc,
+ key: fields.key,
+ },
});
+
+ message.success('配置成功');
+ this.handleUpdateModalVisible();
}
renderSimpleForm() {
@@ -248,8 +458,8 @@ export default class TableList extends PureComponent {