bee-table/src/lib/multiSelect.js

202 lines
4.8 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React, { Component } from "react";
import {ObjectAssign} from './util';
/**
* 参数: 过滤表头
* @param {*} Table
* @param {*} Checkbox
* @param {*} Popover
* @param {*} Icon
*/
export default function multiSelect(Table, Checkbox) {
return class MultiSelect extends Component {
static defaultProps = {
prefixCls: "u-table-mult-select",
getSelectedDataFunc:()=>{}
}
constructor(props) {
super(props);
let obj = this.getCheckedOrIndeter(props.data);
this.state = {
...obj,
data:ObjectAssign(props.data),
}
}
componentWillReceiveProps(nextProps){
if('data' in nextProps){
let obj = this.getCheckedOrIndeter(nextProps.data);
this.setState({
...obj,
data:ObjectAssign(nextProps.data),
})
}
}
/**
* @param {*} data
*/
getCheckedOrIndeter(data){
let obj = {};
let checkStatus = this.setChecked(data);
if(!checkStatus){
obj.checkedAll = false;
obj.indeterminate = false;
return obj;
}
if(checkStatus == 'indeter'){
obj.indeterminate = true;
obj.checkedAll = false;
}else if(checkStatus == 'all'){
obj.checkedAll = true;
obj.indeterminate = false;
}
return obj;
}
/**
* 判断数据是否全部选中
* @param {*} data
* reutnr string all(全选)、indeter(半选)
*/
setChecked(data){
if(!this.isArray(data))return false;
if(data.length == 0)return false;
let count = 0;
let disabledCount = 0;
data.forEach(da=>{
if(da._checked){
count ++;
}
if(da._disabled){
disabledCount ++;
}
})
if(data.length == count + disabledCount){
return "all";
}
return count == 0?false:"indeter";
}
/**
* 判断是否是数组
* @param {*} o
*/
isArray(o){
return Object.prototype.toString.call(o)=='[object Array]';
}
onAllCheckChange=()=>{
let {data,checkedAll,indeterminate} = this.state;
let check = false;
if(checkedAll){
check = false;
}else{
// if(indeterminate){
// check = true;
// }else{
// check = true;
// }
check = true;
}
let selectList = [];
data.forEach(item => {
if(!item._disabled){
item._checked = check;
}
if(item._checked){
selectList.push(item);
}
});
if(selectList.length > 0){
indeterminate = true;
}else{
indeterminate = false;
}
this.setState({
indeterminate:indeterminate,
checkedAll:check
});
this.props.getSelectedDataFunc(selectList);
}
handleClick=()=>{
}
onCheckboxChange = (text, record, index) => () => {
let {data} = this.state;
let selectList = [];
record._checked = record._checked?false:true;
let obj = this.getCheckedOrIndeter(data);
this.setState({
data:data,
...obj
})
data.forEach((da)=>{
if(da._checked){
selectList.push(da);
}
})
this.props.getSelectedDataFunc(selectList,record,index);
};
getDefaultColumns=(columns)=>{
let {checkedAll,indeterminate} = this.state;
let checkAttr = {checked:checkedAll?true:false};
const data = this.props.data;
const dataLength = data.length;
let disabledCount = 0;
indeterminate?checkAttr.indeterminate = true:"";
//设置表头Checkbox是否可以点击
data.forEach((item,index,arr)=>{
if(item._disabled){
disabledCount++;
}
})
let _defaultColumns =[{
title: (
<Checkbox
className="table-checkbox"
{...checkAttr}
disabled={disabledCount==dataLength?true:false}
onChange={this.onAllCheckChange}
/>
),
key: "checkbox",
dataIndex: "checkbox",
fixed:"left",
width: 50,
render: (text, record, index) => {
let attr = {};
record._disabled?attr.disabled = record._disabled:"";
return <Checkbox
key={index}
className="table-checkbox"
{...attr}
checked={record._checked}
onClick={this.handleClick}
onChange={this.onCheckboxChange(text, record, index)}
/>
}
}]
return _defaultColumns.concat(columns);
}
render() {
const {columns} = this.props;
const {data} = this.state;
return <Table {...this.props} columns={this.getDefaultColumns(columns)} data={data} />
}
};
}