bee-complex-grid
Version:
Complex Grid for React
279 lines (263 loc) • 7.28 kB
JavaScript
import React, { Component } from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import Table from "bee-table";
import multiSelect from "bee-table/build/lib/newMultiSelect";
import filterColumn from "bee-table/build/lib/filterColumn";
import dragColumn from "bee-table/build/lib/dragColumn";
// import sum from "bee-table/build/lib/sum";
import sort from "bee-table/build/lib/sort";
import Icon from "bee-icon";
import Checkbox from "bee-checkbox";
import Popover from "bee-popover";
import Pagination from "bee-pagination";
import Menu from "bee-menus";
import Dropdown from "bee-dropdown";
const propTypes = {
showHeaderMenu: PropTypes.bool
};
const defaultProps = {
scroll: {
y: true
},
bordered: true,
multiSelect: { type: "checkbox" },
showHeaderMenu: false
};
const { Item } = Menu;
// const ComplexTable = filterColumn(
// dragColumn(multiSelect(sum(sort(Table, Icon)), Checkbox)),
// Popover
// );
const ComplexTable = filterColumn(
dragColumn(multiSelect(sort(Table, Icon), Checkbox)),
Popover
);
class Grid extends Component {
constructor(props) {
super(props);
let { paginationObj = {} ,sort={}} = props;
this.state = {
activePage: paginationObj.activePage ? paginationObj.activePage : 1,
total: paginationObj.total ? paginationObj.total : 1,
pageItems: paginationObj.items ? paginationObj.items : 1,
columns: props.columns
};
sort.originSortFun = sort.originSortFun?sort.originSortFun:sort.sortFun;
sort.sortFun = this.sortFun;
this.sort= sort;
}
componentWillReceiveProps(nextProps) {
if (nextProps.paginationObj) {
this.setState({
activePage: nextProps.paginationObj.activePage
? nextProps.paginationObj.activePage
: 1,
total: nextProps.paginationObj.total
? nextProps.paginationObj.total
: 1,
pageItems: nextProps.paginationObj.items
? nextProps.paginationObj.items
: 1
});
}
if (nextProps.columns && nextProps.columns !== this.state.columns) {
this.setState({
columns: nextProps.columns
})
}
}
/**
* 点击分页
*/
handleSelectPage = eventKey => {
let { paginationObj = {} } = this.props;
this.setState({
activePage: eventKey
});
paginationObj.freshData && paginationObj.freshData(eventKey);
};
/**
* 设置相关固定Cols
*/
optFixCols = (columns, key) => {
let fixedLeftCols = [];
let fixedRightCols = [];
let nonColums = [];
columns.find(da => {
if (da.key == key) {
da.fixed ? delete da.fixed : (da.fixed = "left");
}
if (da.fixed == "left") {
fixedLeftCols.push(da);
} else if (da.fixed == "right") {
fixedRightCols.push(da);
} else {
nonColums.push(da);
}
});
columns = [...fixedLeftCols, ...nonColums, ...fixedRightCols];
return columns;
};
/**
* 设置隐藏显示Cols
*/
optShowCols = (columns, key) => {
columns.forEach((item, index) => {
if (item.key == key) {
item.ifshow = false;
return;
}
});
return columns;
};
onMenuSelect = ({ key, item }) => {
let columns = this.state.columns;
const fieldKey = item.props.data.fieldKey;
if (key == "fix") {
columns = this.optFixCols(columns, fieldKey);
} else {
columns = this.optShowCols(columns, fieldKey);
}
this.setState({
columns
});
};
/**
* 渲染表头下拉菜单(过滤、隐藏)
* @param {Array} columns 表格列数组
*/
renderColumnsDropdown(columns) {
const icon = "uf-arrow-down";
return columns.map((originColumn, index) => {
let column = Object.assign({}, originColumn);
let menuInfo = [],
fixTitle = "锁定",
showTitle = "隐藏";
if (originColumn.fixed) {
fixTitle = "解锁";
}
//显示的列showTitle应该都是隐藏
// if(originColumn.hasOwnProperty('ifshow') && originColumn.ifshow == false){
// showTitle = '显示';
// }
menuInfo.push({
info: fixTitle,
key: `fix`,
fieldKey: originColumn.key,
index: 0
});
//非固定列添加是否显示菜单item
if (!originColumn.fixed) {
menuInfo.push({
info: showTitle,
key: `show`,
fieldKey: originColumn.key,
index: 1
});
}
const menu = (
<Menu onSelect={this.onMenuSelect} selectedKeys={[]}>
{menuInfo.map(da => {
return (
<Item key={da.key} index={da.index} data={da}>
{da.info}
</Item>
);
})}
</Menu>
);
column.title = (
<span className="title-con drop-menu">
{column.title}
<Dropdown trigger={["click"]} overlay={menu} animation="slide-up">
<Icon type={icon} />
</Dropdown>
</span>
);
return column;
});
}
/**
* 表头menu和表格整体过滤时有冲突,因此添加了回调函数
*/
afterFilter = (optData, columns) => {
let originColumns = this.state.columns;
originColumns.find(da => {
if (da.key == optData.key) {
da.ifshow = optData.ifshow;
}
});
this.setState({
columns: originColumns
});
if (typeof this.props.afterFilter == "function") {
this.props.afterFilter(optData, originColumns);
}
};
/**
* 后端获取数据
*/
sortFun = sortParam => {
// console.info(sortParam);
//解析sortParam,方便column查找
let sortObj = {};
sortParam.forEach(item => {
sortObj[item.field] = item;
});
let originColumns = this.state.columns;
originColumns.forEach(da => {
//保存返回的column状态,没有则终止order状态
if (sortObj[da.dataIndex]) {
da = Object.assign(da, sortObj[da.dataIndex]);
}else{
da.order= 'flatscend';
da.orderNum='';
}
});
this.setState({
columns: originColumns
});
//将参数传递给后端排序
if (typeof this.sort.originSortFun == "function") {
this.sort.originSortFun(sortParam);
}
};
render() {
const props = this.props;
let { sort = {} } = props;
//默认固定表头
// let scroll = Object.assign({y:true},props.scroll);
let columns = this.state.columns;
//是否显示表头菜单
if (props.showHeaderMenu) {
columns = this.renderColumnsDropdown(columns);
}
return (
<div className={classNames("u-grid", props.className)}>
<ComplexTable
{...props}
columns={columns}
afterFilter={this.afterFilter}
sort={this.sort}
/>
<Pagination
first
last
prev
next
maxButtons={5}
boundaryLinks
activePage={this.state.activePage}
onSelect={this.handleSelectPage}
showJump={true}
items={this.state.pageItems}
total={this.state.total}
/>
</div>
);
}
}
Grid.propTypes = propTypes;
Grid.defaultProps = defaultProps;
export default Grid;