You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

496 lines
14 KiB

10 years ago
import React from 'react';
import reqwest from 'reqwest-without-xhr2';
10 years ago
import Table from 'rc-table';
import Checkbox from '../checkbox';
import FilterDropdown from './filterDropdown';
import Pagination from '../pagination';
import objectAssign from 'object-assign';
10 years ago
9 years ago
function noop() {
}
9 years ago
function defaultResolve(data) {
return data || [];
}
class DataSource {
9 years ago
init(config) {
this.config = config;
this.url = config.url || '';
this.resolve = config.resolve || defaultResolve;
this.getParams = config.getParams || noop;
this.getPagination = config.getPagination || noop;
this.headers = config.headers || {};
this.data = config.data || {};
9 years ago
}
constructor(config) {
if (config) {
this.init(config);
}
}
clone(config = {}) {
return new DataSource(objectAssign({}, this.config, config));
}
}
var AntTable = React.createClass({
9 years ago
getInitialState() {
10 years ago
return {
9 years ago
// 减少状态
selectedRowKeys: [],
9 years ago
// only for remote
data: [],
dataSource: this.props.dataSource,
9 years ago
filters: {},
loading: false,
9 years ago
sortColumn: '',
sortOrder: '',
sorter: null,
pagination: this.hasPagination() ? objectAssign({
pageSize: 10,
current: 1
9 years ago
}, this.props.pagination) : {}
10 years ago
};
},
9 years ago
10 years ago
getDefaultProps() {
return {
prefixCls: 'ant-table',
10 years ago
useFixedHeader: false,
10 years ago
rowSelection: null,
9 years ago
size: 'normal',
bordered: false
10 years ago
};
},
9 years ago
propTypes: {
dataSource: React.PropTypes.oneOfType([React.PropTypes.array, React.PropTypes.instanceOf(DataSource)])
},
9 years ago
componentWillReceiveProps(nextProps) {
let newState = {};
9 years ago
if (('pagination' in nextProps) && nextProps.pagination !== false) {
newState.pagination = objectAssign({}, this.state.pagination, nextProps.pagination);
}
// 外界只有 dataSource 的变化会触发新请求
if ('dataSource' in nextProps &&
nextProps.dataSource !== this.props.dataSource) {
newState = {
selectedRowKeys: [],
dataSource: nextProps.dataSource,
loading: true
};
9 years ago
}
if (nextProps.columns !== this.props.columns) {
newState.filters = {};
}
this.setState(newState, this.fetch);
},
9 years ago
hasPagination(pagination) {
9 years ago
if (pagination === undefined) {
pagination = this.props.pagination;
}
9 years ago
return pagination !== false;
},
9 years ago
isLocalDataSource() {
return Array.isArray(this.state.dataSource);
},
9 years ago
getRemoteDataSource() {
return this.state.dataSource;
},
9 years ago
toggleSortOrder(order, column) {
let sortColumn = this.state.sortColumn;
let sortOrder = this.state.sortOrder;
9 years ago
let sorter;
// 只同时允许一列进行排序,否则会导致排序顺序的逻辑问题
let isSortColumn = this.isSortColumn(column);
if (!isSortColumn) { // 当前列未排序
sortOrder = order;
sortColumn = column;
} else { // 当前列已排序
if (sortOrder === order) { // 切换为未排序状态
sortOrder = '';
sortColumn = null;
} else { // 切换为排序状态
sortOrder = order;
}
}
9 years ago
if (this.isLocalDataSource()) {
sorter = function () {
let result = column.sorter.apply(this, arguments);
if (sortOrder === 'ascend') {
return result;
} else if (sortOrder === 'descend') {
return -result;
}
};
}
9 years ago
this.fetch({
10 years ago
sortOrder: sortOrder,
9 years ago
sortColumn: sortColumn,
sorter: sorter
9 years ago
});
},
9 years ago
9 years ago
handleFilter(column, filters) {
filters = objectAssign({}, this.state.filters, {
[this.getColumnKey(column)]: filters
});
this.fetch({
selectedRowKeys: [],
filters: filters
});
10 years ago
},
9 years ago
9 years ago
handleSelect(record, rowIndex, e) {
let checked = e.target.checked;
9 years ago
let selectedRowKeys = this.state.selectedRowKeys.concat();
let key = this.getRecordKey(record, rowIndex);
if (checked) {
9 years ago
selectedRowKeys.push(this.getRecordKey(record, rowIndex));
} else {
9 years ago
selectedRowKeys = selectedRowKeys.filter((i) => {
return key !== i;
});
}
this.setState({
9 years ago
selectedRowKeys: selectedRowKeys
});
if (this.props.rowSelection.onSelect) {
9 years ago
let data = this.getCurrentPageData();
let selectedRows = data.filter((row, i) => {
return selectedRowKeys.indexOf(this.getRecordKey(row, i)) >= 0;
10 years ago
});
9 years ago
this.props.rowSelection.onSelect(record, checked, selectedRows);
}
},
9 years ago
handleSelectAllRow(e) {
let checked = e.target.checked;
9 years ago
let data = this.getCurrentPageData();
let selectedRowKeys = checked ? data.map((item, i) => {
return this.getRecordKey(item, i);
}) : [];
10 years ago
this.setState({
selectedRowKeys: selectedRowKeys
});
if (this.props.rowSelection.onSelectAll) {
9 years ago
let selectedRows = data.filter((row, i) => {
return selectedRowKeys.indexOf(this.getRecordKey(row, i)) >= 0;
10 years ago
});
this.props.rowSelection.onSelectAll(checked, selectedRows);
10 years ago
}
},
9 years ago
handlePageChange(current) {
9 years ago
let pagination = objectAssign({}, this.state.pagination);
if (current) {
pagination.current = current;
} else {
pagination.current = pagination.current || 1;
}
9 years ago
this.fetch({
// 防止内存泄漏,只维持当页
selectedRowKeys: [],
10 years ago
pagination: pagination
9 years ago
});
},
9 years ago
renderSelectionCheckBox(value, record, index) {
9 years ago
let rowIndex = this.getRecordKey(record, index); // 从 1 开始
let checked = this.state.selectedRowKeys.indexOf(rowIndex) >= 0;
9 years ago
return <Checkbox checked={checked} onChange={this.handleSelect.bind(this, record, rowIndex)}/>;
},
9 years ago
getRecordKey(record, index) {
9 years ago
return record.key || index;
},
9 years ago
renderRowSelection() {
9 years ago
let columns = this.props.columns.concat();
if (this.props.rowSelection) {
9 years ago
let data = this.getCurrentPageData();
let checked;
if (!data.length) {
checked = false;
} else {
checked = data.every((item, i) => {
let key = this.getRecordKey(item, i);
return this.state.selectedRowKeys.indexOf(key) >= 0;
});
}
let checkboxAll = <Checkbox checked={checked} onChange={this.handleSelectAllRow}/>;
let selectionColumn = {
key: 'selection-column',
title: checkboxAll,
width: 60,
render: this.renderSelectionCheckBox,
className: 'ant-table-selection-column'
};
if (columns[0] &&
9 years ago
columns[0].key === 'selection-column') {
columns[0] = selectionColumn;
} else {
columns.unshift(selectionColumn);
}
}
return columns;
},
9 years ago
9 years ago
getCurrentPageData() {
9 years ago
return this.isLocalDataSource() ? this.getLocalDataPaging() : this.state.data;
},
getColumnKey(column, index) {
return column.key || column.dataIndex || index;
},
isSortColumn(column) {
if (!column || !this.state.sortColumn) {
return false;
}
let colKey = this.getColumnKey(column);
let isSortColumn = (this.getColumnKey(this.state.sortColumn) === colKey);
return isSortColumn;
9 years ago
},