2017-09-14 15:45:18 +08:00
|
|
|
|
import React, { Component } from "react";
|
|
|
|
|
import Checkbox from "bee-checkbox";
|
|
|
|
|
/**
|
|
|
|
|
* multiSelect={
|
|
|
|
|
* type--默认值为checkbox
|
|
|
|
|
* param--可以设置返回的选中的数据属性;默认值:null;
|
|
|
|
|
* }
|
|
|
|
|
* getSelectedDataFunc--function,能获取到选中的数据
|
|
|
|
|
* 使用全选时得注意,data中的key值一定要是唯一值
|
|
|
|
|
*/
|
2017-11-28 16:24:54 +08:00
|
|
|
|
export default function multiSelect(Table) {
|
2017-09-14 15:45:18 +08:00
|
|
|
|
Array.prototype.indexOf = function(val) {
|
|
|
|
|
for (var i = 0; i < this.length; i++) {
|
|
|
|
|
if (this[i] == val) return i;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
};
|
|
|
|
|
Array.prototype.remove = function(val) {
|
|
|
|
|
var index = this.indexOf(val);
|
|
|
|
|
if (index > -1) {
|
|
|
|
|
this.splice(index, 1);
|
|
|
|
|
}
|
|
|
|
|
};
|
2017-12-28 10:40:41 +08:00
|
|
|
|
return class multiSelect extends Component {
|
2017-09-14 15:45:18 +08:00
|
|
|
|
constructor(props) {
|
|
|
|
|
super(props);
|
2018-01-03 14:19:24 +08:00
|
|
|
|
let { data } = props,
|
|
|
|
|
checkedObj = this.initCheckedObj(props);
|
2017-09-14 15:45:18 +08:00
|
|
|
|
this.state = {
|
|
|
|
|
checkedAll: false,
|
2017-12-27 22:21:52 +08:00
|
|
|
|
checkedObj: checkedObj,
|
2017-09-14 15:45:18 +08:00
|
|
|
|
selIds: [],
|
|
|
|
|
data: this.props.data
|
|
|
|
|
};
|
|
|
|
|
}
|
2017-12-28 10:40:41 +08:00
|
|
|
|
componentWillReceiveProps(nextProps) {
|
|
|
|
|
let props = this.props,
|
2018-01-03 14:19:24 +08:00
|
|
|
|
{ selectDisabled, selectedRow, data } = props,
|
2017-12-28 10:40:41 +08:00
|
|
|
|
checkedObj = {};
|
2018-01-03 16:14:01 +08:00
|
|
|
|
if (
|
|
|
|
|
nextProps.data !== data ||
|
|
|
|
|
nextProps.selectDisabled !== selectDisabled ||
|
|
|
|
|
nextProps.selectedRow !== selectedRow
|
|
|
|
|
) {
|
2018-01-03 14:19:24 +08:00
|
|
|
|
checkedObj = this.initCheckedObj(nextProps);
|
2017-12-28 10:40:41 +08:00
|
|
|
|
this.setState({
|
|
|
|
|
checkedAll: false,
|
|
|
|
|
checkedObj: checkedObj,
|
|
|
|
|
selIds: [],
|
|
|
|
|
data: nextProps.data
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
2018-01-03 14:19:24 +08:00
|
|
|
|
initCheckedObj = props => {
|
|
|
|
|
let checkedObj = {},
|
|
|
|
|
{ selectDisabled, selectedRow, data } = props;
|
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
2018-01-03 16:14:01 +08:00
|
|
|
|
let bool = (selectDisabled && selectDisabled(data[i], i)) || false;
|
2018-01-03 14:19:24 +08:00
|
|
|
|
if (!bool) {
|
2018-01-03 16:14:01 +08:00
|
|
|
|
checkedObj[data[i]["key"]] =
|
|
|
|
|
(selectedRow && selectedRow(data[i], i)) || false;
|
2018-01-03 14:19:24 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return checkedObj;
|
|
|
|
|
};
|
2017-09-14 15:45:18 +08:00
|
|
|
|
onAllCheckChange = () => {
|
|
|
|
|
let self = this;
|
|
|
|
|
let listData = self.state.data.concat();
|
|
|
|
|
let checkedObj = Object.assign({}, self.state.checkedObj);
|
2017-12-27 22:21:52 +08:00
|
|
|
|
let { data } = self.props;
|
2017-09-14 15:45:18 +08:00
|
|
|
|
let selIds = [];
|
|
|
|
|
let id = self.props.multiSelect.param;
|
|
|
|
|
if (self.state.checkedAll) {
|
|
|
|
|
selIds = [];
|
|
|
|
|
} else {
|
|
|
|
|
for (var i = 0; i < listData.length; i++) {
|
|
|
|
|
if (id) {
|
|
|
|
|
selIds[i] = listData[i][id];
|
|
|
|
|
} else {
|
|
|
|
|
selIds[i] = listData[i];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-12-27 22:21:52 +08:00
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
|
|
|
let bool = checkedObj.hasOwnProperty(data[i]["key"]);
|
|
|
|
|
if (!bool) {
|
|
|
|
|
selIds.splice(i, 1);
|
|
|
|
|
} else {
|
|
|
|
|
checkedObj[data[i]["key"]] = !self.state.checkedAll;
|
|
|
|
|
}
|
|
|
|
|
}
|
2017-09-14 15:45:18 +08:00
|
|
|
|
self.setState({
|
|
|
|
|
checkedAll: !self.state.checkedAll,
|
|
|
|
|
checkedObj: checkedObj,
|
|
|
|
|
selIds: selIds
|
|
|
|
|
});
|
|
|
|
|
self.props.getSelectedDataFunc(selIds);
|
|
|
|
|
};
|
|
|
|
|
onCheckboxChange = (text, record, index) => {
|
|
|
|
|
let self = this;
|
|
|
|
|
let allFlag = false;
|
|
|
|
|
let selIds = self.state.selIds;
|
2017-09-18 15:18:42 +08:00
|
|
|
|
let id = self.props.multiSelect
|
|
|
|
|
? self.props.multiSelect.param
|
|
|
|
|
? record[self.props.multiSelect.param]
|
|
|
|
|
: record
|
2017-09-14 15:45:18 +08:00
|
|
|
|
: record;
|
|
|
|
|
let checkedObj = Object.assign({}, self.state.checkedObj);
|
|
|
|
|
let checkedArray = Object.keys(checkedObj);
|
2017-09-18 15:18:42 +08:00
|
|
|
|
let { getSelectedDataFunc } = self.props;
|
2017-09-14 15:45:18 +08:00
|
|
|
|
if (checkedObj[record["key"]]) {
|
|
|
|
|
selIds.remove(id);
|
|
|
|
|
} else {
|
|
|
|
|
selIds.push(id);
|
|
|
|
|
}
|
|
|
|
|
checkedObj[record["key"]] = !checkedObj[record["key"]];
|
|
|
|
|
for (var i = 0; i < checkedArray.length; i++) {
|
|
|
|
|
if (!checkedObj[checkedArray[i]]) {
|
|
|
|
|
allFlag = false;
|
|
|
|
|
break;
|
|
|
|
|
} else {
|
|
|
|
|
allFlag = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
self.setState({
|
|
|
|
|
checkedAll: allFlag,
|
|
|
|
|
checkedObj: checkedObj,
|
|
|
|
|
selIds: selIds
|
|
|
|
|
});
|
2017-11-28 16:24:54 +08:00
|
|
|
|
if (typeof getSelectedDataFunc === "function") {
|
2017-09-18 15:18:42 +08:00
|
|
|
|
getSelectedDataFunc(selIds);
|
|
|
|
|
}
|
2017-09-14 15:45:18 +08:00
|
|
|
|
};
|
|
|
|
|
renderColumnsMultiSelect(columns) {
|
|
|
|
|
const { data } = this.state;
|
|
|
|
|
let checkedObj = Object.assign({}, this.state.checkedObj);
|
|
|
|
|
let checkedArray = Object.keys(checkedObj);
|
|
|
|
|
let { multiSelect } = this.props;
|
|
|
|
|
let select_column = {};
|
|
|
|
|
let indeterminate_bool = false;
|
|
|
|
|
if (!multiSelect || !multiSelect.type) {
|
|
|
|
|
multiSelect = Object.assign({}, multiSelect, { type: "checkbox" });
|
|
|
|
|
}
|
|
|
|
|
if (multiSelect && multiSelect.type === "checkbox") {
|
|
|
|
|
let i = checkedArray.length;
|
|
|
|
|
while (i--) {
|
|
|
|
|
if (checkedObj[checkedArray[i]]) {
|
|
|
|
|
indeterminate_bool = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
let defaultColumns = [
|
|
|
|
|
{
|
|
|
|
|
title: (
|
|
|
|
|
<Checkbox
|
|
|
|
|
className="table-checkbox"
|
|
|
|
|
checked={this.state.checkedAll}
|
|
|
|
|
indeterminate={indeterminate_bool && !this.state.checkedAll}
|
|
|
|
|
onChange={this.onAllCheckChange}
|
|
|
|
|
/>
|
|
|
|
|
),
|
|
|
|
|
key: "checkbox",
|
|
|
|
|
dataIndex: "checkbox",
|
2017-12-27 16:23:25 +08:00
|
|
|
|
width: "100px",
|
2017-09-14 15:45:18 +08:00
|
|
|
|
render: (text, record, index) => {
|
2017-12-27 22:21:52 +08:00
|
|
|
|
let bool = checkedObj.hasOwnProperty(record["key"]);
|
2017-09-14 15:45:18 +08:00
|
|
|
|
return (
|
|
|
|
|
<Checkbox
|
|
|
|
|
className="table-checkbox"
|
|
|
|
|
checked={checkedObj[record.key]}
|
2017-12-27 22:21:52 +08:00
|
|
|
|
disabled={!bool}
|
2017-09-14 15:45:18 +08:00
|
|
|
|
onChange={this.onCheckboxChange.bind(
|
|
|
|
|
this,
|
|
|
|
|
text,
|
|
|
|
|
record,
|
|
|
|
|
index
|
|
|
|
|
)}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
];
|
|
|
|
|
columns = defaultColumns.concat(columns);
|
|
|
|
|
}
|
|
|
|
|
return columns;
|
|
|
|
|
}
|
|
|
|
|
render() {
|
|
|
|
|
let columns = this.renderColumnsMultiSelect(this.props.columns).concat();
|
2017-09-14 20:04:34 +08:00
|
|
|
|
return <Table {...this.props} columns={columns} />;
|
2017-09-14 15:45:18 +08:00
|
|
|
|
}
|
|
|
|
|
};
|
2017-11-28 16:24:54 +08:00
|
|
|
|
}
|