Add support for table default sort order (#6449)

This commit is contained in:
Graeme Yeates 2017-07-11 17:34:04 -04:00 committed by 乐仪
parent 8016cccd18
commit 40e94945d9
4 changed files with 54 additions and 4 deletions

View File

@ -58,6 +58,11 @@ export interface TableRowSelection<T> {
selections?: SelectionDecorator[] | boolean; selections?: SelectionDecorator[] | boolean;
} }
export interface DefaultColumnSortOrder {
columnTitle: string;
sortOrder: 'ascend' | 'descend';
}
export interface TableProps<T> { export interface TableProps<T> {
prefixCls?: string; prefixCls?: string;
dropdownPrefixCls?: string; dropdownPrefixCls?: string;
@ -70,6 +75,7 @@ export interface TableProps<T> {
rowClassName?: (record: T, index: number) => string; rowClassName?: (record: T, index: number) => string;
expandedRowRender?: any; expandedRowRender?: any;
defaultExpandedRowKeys?: string[] | number[]; defaultExpandedRowKeys?: string[] | number[];
defaultSortOrder?: DefaultColumnSortOrder;
expandedRowKeys?: string[] | number[]; expandedRowKeys?: string[] | number[];
expandIconAsCell?: boolean; expandIconAsCell?: boolean;
expandIconColumnIndex?: number; expandIconColumnIndex?: number;
@ -156,7 +162,7 @@ export default class Table<T> extends React.Component<TableProps<T>, any> {
this.columns = props.columns || normalizeColumns(props.children); this.columns = props.columns || normalizeColumns(props.children);
this.state = { this.state = {
...this.getSortStateFromColumns(), ...this.getDefaultSortOrder(this.columns),
// 减少状态 // 减少状态
filters: this.getFiltersFromColumns(), filters: this.getFiltersFromColumns(),
pagination: this.getDefaultPagination(props), pagination: this.getDefaultPagination(props),
@ -332,16 +338,32 @@ export default class Table<T> extends React.Component<TableProps<T>, any> {
return filters; return filters;
} }
getDefaultSortOrder(columns?) {
const definedSortState = this.getSortStateFromColumns(columns);
if (this.props.defaultSortOrder && !definedSortState.sortColumn) {
let columnTitle = this.props.defaultSortOrder.columnTitle;
return {
sortColumn: flatFilter(columns || this.columns || [], column => column.title === columnTitle)[0],
sortOrder: this.props.defaultSortOrder.sortOrder
};
}
return definedSortState;
}
getSortStateFromColumns(columns?) { getSortStateFromColumns(columns?) {
// return fisrt column which sortOrder is not falsy // return first column which sortOrder is not falsy
const sortedColumn = const sortedColumn =
this.getSortOrderColumns(columns).filter(col => col.sortOrder)[0]; this.getSortOrderColumns(columns).filter(col => col.sortOrder)[0];
if (sortedColumn) { if (sortedColumn) {
return { return {
sortColumn: sortedColumn, sortColumn: sortedColumn,
sortOrder: sortedColumn.sortOrder, sortOrder: sortedColumn.sortOrder,
}; };
} }
return { return {
sortColumn: null, sortColumn: null,
sortOrder: null, sortOrder: null,

View File

@ -38,6 +38,28 @@ describe('Table.sorter', () => {
expect(wrapper.find('thead')).toMatchSnapshot(); expect(wrapper.find('thead')).toMatchSnapshot();
}); });
it('default sort order ascend', () => {
const wrapper = mount(createTable({
defaultSortOrder: {
columnTitle: 'Name',
sortOrder: 'ascend',
},
}));
expect(renderedNames(wrapper)).toEqual(['Jack', 'Jerry', 'Lucy', 'Tom']);
});
it('default sort order descend', () => {
const wrapper = mount(createTable({
defaultSortOrder: {
columnTitle: 'Name',
sortOrder: 'descend',
},
}));
expect(renderedNames(wrapper)).toEqual(['Tom', 'Lucy', 'Jack', 'Jerry']);
});
it('sort records', () => { it('sort records', () => {
const wrapper = mount(createTable()); const wrapper = mount(createTable());

View File

@ -89,5 +89,10 @@ function onChange(pagination, filters, sorter) {
console.log('params', pagination, filters, sorter); console.log('params', pagination, filters, sorter);
} }
ReactDOM.render(<Table columns={columns} dataSource={data} onChange={onChange} />, mountNode); ReactDOM.render(<Table
columns={columns}
dataSource={data}
onChange={onChange}
defaultSortOrder={{ columnTitle: 'Age', sortOrder: 'descend' }}
/>, mountNode);
```` ````

View File

@ -60,7 +60,8 @@ const columns = [{
| rowKey | get row's key, could be a string or function | string\|Function(record):string | 'key' | | rowKey | get row's key, could be a string or function | string\|Function(record):string | 'key' |
| rowClassName | get row's className | Function(record, index):string | - | | rowClassName | get row's className | Function(record, index):string | - |
| expandedRowRender | expanded container render for each row | Function | - | | expandedRowRender | expanded container render for each row | Function | - |
| defaultExpandedRowKeys | initial expanded row keys | string[] | - | | defaultSortOrder | default column sorting | Object({columnTitle, sortOrder}) | - |
| defaultExpandedRowKeys | initial expanded row keys | | - |
| expandedRowKeys | current expanded rows keys | string[] | - | | expandedRowKeys | current expanded rows keys | string[] | - |
| defaultExpandAllRows | expand all rows initially | boolean | false | | defaultExpandAllRows | expand all rows initially | boolean | false |
| onExpandedRowsChange | function to call when the expanded rows change | Function(expandedRows) | | | onExpandedRowsChange | function to call when the expanded rows change | Function(expandedRows) | |