|
|
|
@ -1,35 +1,56 @@ |
|
|
|
import React, { PureComponent, Fragment } from 'react'; |
|
|
|
import moment from 'moment'; |
|
|
|
import { Table, Alert, Badge, Divider } from 'antd'; |
|
|
|
import React, { PureComponent } from 'react'; |
|
|
|
import { Table, Alert } from 'antd'; |
|
|
|
import styles from './index.less'; |
|
|
|
|
|
|
|
const statusMap = ['default', 'processing', 'success', 'error']; |
|
|
|
function initTotalList(columns) { |
|
|
|
const totalList = []; |
|
|
|
columns.forEach((column) => { |
|
|
|
if (column.needTotal) { |
|
|
|
totalList.push({ ...column, total: 0 }); |
|
|
|
} |
|
|
|
}); |
|
|
|
return totalList; |
|
|
|
} |
|
|
|
|
|
|
|
class StandardTable extends PureComponent { |
|
|
|
state = { |
|
|
|
constructor(props) { |
|
|
|
super(props); |
|
|
|
const { columns } = props; |
|
|
|
const needTotalList = initTotalList(columns); |
|
|
|
|
|
|
|
this.state = { |
|
|
|
selectedRowKeys: [], |
|
|
|
totalCallNo: 0, |
|
|
|
needTotalList, |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
componentWillReceiveProps(nextProps) { |
|
|
|
// clean state
|
|
|
|
if (nextProps.selectedRows.length === 0) { |
|
|
|
const needTotalList = initTotalList(nextProps.columns); |
|
|
|
this.setState({ |
|
|
|
selectedRowKeys: [], |
|
|
|
totalCallNo: 0, |
|
|
|
needTotalList, |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
handleRowSelectChange = (selectedRowKeys, selectedRows) => { |
|
|
|
const totalCallNo = selectedRows.reduce((sum, val) => { |
|
|
|
return sum + parseFloat(val.callNo, 10); |
|
|
|
}, 0); |
|
|
|
let needTotalList = [...this.state.needTotalList]; |
|
|
|
needTotalList = needTotalList.map((item) => { |
|
|
|
return { |
|
|
|
...item, |
|
|
|
total: selectedRows.reduce((sum, val) => { |
|
|
|
return sum + parseFloat(val[item.dataIndex], 10); |
|
|
|
}, 0), |
|
|
|
}; |
|
|
|
}); |
|
|
|
|
|
|
|
if (this.props.onSelectRow) { |
|
|
|
this.props.onSelectRow(selectedRows); |
|
|
|
} |
|
|
|
|
|
|
|
this.setState({ selectedRowKeys, totalCallNo }); |
|
|
|
this.setState({ selectedRowKeys, needTotalList }); |
|
|
|
} |
|
|
|
|
|
|
|
handleTableChange = (pagination, filters, sorter) => { |
|
|
|
@ -41,69 +62,8 @@ class StandardTable extends PureComponent { |
|
|
|
} |
|
|
|
|
|
|
|
render() { |
|
|
|
const { selectedRowKeys, totalCallNo } = this.state; |
|
|
|
const { data: { list, pagination }, loading } = this.props; |
|
|
|
|
|
|
|
const status = ['关闭', '运行中', '已上线', '异常']; |
|
|
|
|
|
|
|
const columns = [ |
|
|
|
{ |
|
|
|
title: '规则编号', |
|
|
|
dataIndex: 'no', |
|
|
|
}, |
|
|
|
{ |
|
|
|
title: '描述', |
|
|
|
dataIndex: 'description', |
|
|
|
}, |
|
|
|
{ |
|
|
|
title: '服务调用次数', |
|
|
|
dataIndex: 'callNo', |
|
|
|
sorter: true, |
|
|
|
align: 'right', |
|
|
|
render: val => `${val} 万`, |
|
|
|
}, |
|
|
|
{ |
|
|
|
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 <Badge status={statusMap[val]} text={status[val]} />; |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
title: '更新时间', |
|
|
|
dataIndex: 'updatedAt', |
|
|
|
sorter: true, |
|
|
|
render: val => <span>{moment(val).format('YYYY-MM-DD HH:mm:ss')}</span>, |
|
|
|
}, |
|
|
|
{ |
|
|
|
title: '操作', |
|
|
|
render: () => ( |
|
|
|
<Fragment> |
|
|
|
<a href="">配置</a> |
|
|
|
<Divider type="vertical" /> |
|
|
|
<a href="">订阅警报</a> |
|
|
|
</Fragment> |
|
|
|
), |
|
|
|
}, |
|
|
|
]; |
|
|
|
const { selectedRowKeys, needTotalList } = this.state; |
|
|
|
const { data: { list, pagination }, loading, columns } = this.props; |
|
|
|
|
|
|
|
const paginationProps = { |
|
|
|
showSizeChanger: true, |
|
|
|
@ -126,7 +86,16 @@ class StandardTable extends PureComponent { |
|
|
|
message={( |
|
|
|
<div> |
|
|
|
已选择 <a style={{ fontWeight: 600 }}>{selectedRowKeys.length}</a> 项 |
|
|
|
服务调用总计 <span style={{ fontWeight: 600 }}>{totalCallNo}</span> 万 |
|
|
|
{ |
|
|
|
needTotalList.map(item => ( |
|
|
|
<span style={{ marginLeft: 8 }} key={item.dataIndex}>{item.title}总计 |
|
|
|
<span style={{ fontWeight: 600 }}> |
|
|
|
{item.render ? item.render(item.total) : item.total} |
|
|
|
</span> |
|
|
|
</span> |
|
|
|
) |
|
|
|
) |
|
|
|
} |
|
|
|
<a onClick={this.cleanSelectedKeys} style={{ marginLeft: 24 }}>清空</a> |
|
|
|
</div> |
|
|
|
)} |
|
|
|
|