app-base-web
Version:
web development common base package.
141 lines (134 loc) • 5.17 kB
JavaScript
import React from 'react'
import { Row, Col, Tag, Table, Modal, Button } from 'antd'
import { SearchOutlined } from '@ant-design/icons';
import './style'
export default class SelectTag extends React.Component {
constructor(props) {
super(props)
this.state = {
value: null, //type为checkbox是[],radio是'',
hasSelected: [], //临时变量保存选择过的value的数据, 用于取消时重置value
hasSelectedRows: [], //临时变量保存选择过的value的数据, 用于取消时重置value
selected: [],//Table checked
selectedRows: [],
//显藏控制
visible: false
}
}
onOk = () => {
let value = this.state.selectedRows.map(item => {
return item[this.props.targetKeys]
})
if(this.props.selectionType === 'radio') {
value = value[0]
}
console.log("value", value)
this.setState({
visible: false,
hasSelected: this.state.selected,
hasSelectedRows: this.state.selectedRows,
value
});
}
onCancel = () => {
this.setState({
visible: false,
selected: this.state.hasSelected,
selectedRows: this.state.hasSelectedRows
})
}
colseTag = (index) => {
let {selectedRows, selected} = this.state;
selectedRows.splice(index, 1);
selected.splice(index, 1);
this.setState({
selectedRows: [...this.state.selectedRows],
selected: [...this.state.selected]
}, ()=> {this.onOk()});
}
render() {
var tableCfg = {
scroll: { y: this.props.height },
size: "middle",
rowKey: "id",
columns: this.props.columns,
rowSelection: {
type: this.props.selectionType,
selectedRowKeys: this.state.selected,
onChange: (selectedRowKeys, selectedRows) => {
//此处第二次打开继续选择添加的时候,selectedRowKeys会再次返回当页已经读取的数据, 重新加入数据,需要去重
let removeSameSelectedRowKeys = [...selectedRowKeys];
let removeSameSelectedRows = [...selectedRows];
if(this.props.selectionType === "checkbox") {
// 找出selectedRowKeys和已选择的数据的差集,已选择数据和差集合并得到所有选择数据
let aSet = new Set(this.state.selected);
let difference1 = Array.from(new Set(this.state.selected.concat(selectedRowKeys).filter( v => !aSet.has(v) )));
removeSameSelectedRowKeys = [...this.state.selected, ...difference1];
// 对象数组removeSameSelectedRows和已选择的数据的差集,已选择数据和差集合并得到所有选择数据
let difference2 = [];
for(let i = 0; i < selectedRows.length; i++) {
for(let j =0; j < difference1.length; j ++) {
if(selectedRows[i].id === difference1[j]) {
difference2.push(selectedRows[i]);
}
}
}
removeSameSelectedRows = [...this.state.selectedRows, ...difference2];
}
this.setState({
selected: removeSameSelectedRowKeys,
selectedRows: removeSameSelectedRows
});
}
},
rowClassName: (record) => { return record.id === this.state.selectedRowId ? 'row-selected' : ''; },
onRow: (record) => {
return {
onClick: event => {
this.setState({ selectedRowId: record.id });
}
}
},
dataSource: this.props.data,
pagination: this.props.pagination,
loading: this.props.loading,
onChange: this.props.onChange
}
return <div>
<div className="ant-select ant-select-multiple ant-select-show-search">
<div className="ant-select-selector" onClick={() => this.setState({ visible: !this.state.visible })}>
{this.state.selectedRows.length > 0 ? this.state.selectedRows.map((item, index) => (
<Tag
className="ant-select-selection-item"
key={item.id}
closable={true}
onClose={(e) => { this.colseTag(index); }}
>{item[this.props.targetKeys]}</Tag>
)) : <span className="ant-select-selection-placeholder">{this.props.placeholder}</span> }
</div>
<span className="ant-select-arrow"><SearchOutlined /></span>
</div>
<Modal
title={[
<Row className="app-admin">
<Col className="main-title" style={{ marginBottom: '5px' }}><i className="iconfont icon-title"></i>{this.props.title ? this.props.title : ""}</Col>
</Row>
]}
centered
visible={this.state.visible}
onCancel={this.onCancel}
width={800}
footer={[
<Row justify="center">
<Col xs={24}>
<Button className="btn-cancel" icon={<i className="iconfont icon-cancel" />} onClick={this.onCancel}>取消</Button>
<Button className="btn-submit" icon={<i className="iconfont icon-submit"/>} onClick={this.onOk}>确定</Button>
</Col>
</Row>
]}
>
<Table {...tableCfg} />
</Modal>
</div>
}
}