Skip to content

Commit a07b2da

Browse files
committed
1 parent 2068f51 commit a07b2da

File tree

7 files changed

+130
-8
lines changed

7 files changed

+130
-8
lines changed

docs/README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,15 @@ You can give `dataField` and `order` to specify the sorting state in table, For
211211
```
212212

213213
#### One-time sorting configuration
214-
**TBD**
214+
In earily version, we only can configure [`sortCaret`](./columns.md#sortCaret) and [`sortFunc` ](./columns.md#sortFunc) per column. But they are same in most of cases.
215+
So here we give you a chance to just setup these prop in one time.
216+
217+
```js
218+
<BootstrapTable sort={ {
219+
sortCaret: ...
220+
sortFunc: ...
221+
} }>
222+
```
215223

216224
### <a name='defaultSorted'>defaultSorted - [Array]</a>
217225
`defaultSorted` accept an object array which allow you to define the default sort columns when first render.
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
/* eslint no-unused-vars: 0 */
2+
import React from 'react';
3+
4+
import BootstrapTable from 'react-bootstrap-table-next';
5+
import Code from 'components/common/code-block';
6+
import { productsGenerator } from 'utils/common';
7+
8+
const products = productsGenerator();
9+
10+
const columns = [{
11+
dataField: 'id',
12+
text: 'Product ID',
13+
sort: true
14+
}, {
15+
dataField: 'name',
16+
text: 'Product Name',
17+
sort: true
18+
}, {
19+
dataField: 'price',
20+
text: 'Product Price'
21+
}];
22+
23+
const sourceCode = `\
24+
import BootstrapTable from 'react-bootstrap-table-next';
25+
26+
const columns = [{
27+
dataField: 'id',
28+
text: 'Product ID',
29+
sort: true
30+
}, {
31+
dataField: 'name',
32+
text: 'Product Name',
33+
sort: true
34+
}, {
35+
dataField: 'price',
36+
text: 'Product Price'
37+
}];
38+
39+
class OnetimeSortConfiguration extends React.Component {
40+
sortFunc = (a, b, order, dataField) => {
41+
if (order === 'asc') {
42+
return b - a;
43+
}
44+
return a - b; // desc
45+
}
46+
47+
render() {
48+
const sortOption = {
49+
// No need to configure sortFunc per column
50+
sortFunc: this.sortFunc,
51+
// No need to configure sortCaret per column
52+
sortCaret: (order, column) => {
53+
if (!order) return (<span>&nbsp;&nbsp;Desc/Asc</span>);
54+
else if (order === 'asc') return (<span>&nbsp;&nbsp;Desc/<font color="red">Asc</font></span>);
55+
else if (order === 'desc') return (<span>&nbsp;&nbsp;<font color="red">Desc</font>/Asc</span>);
56+
return null;
57+
}
58+
};
59+
60+
return (
61+
<div>
62+
<button className="btn btn-default" onClick={ this.handleClick }>Change Data</button>
63+
<BootstrapTable keyField="id" data={ products } columns={ columns } sort={ sortOption } />
64+
<Code>{ sourceCode }</Code>
65+
</div>
66+
);
67+
}
68+
}
69+
`;
70+
71+
export default class OnetimeSortConfiguration extends React.Component {
72+
sortFunc = (a, b, order, dataField) => {
73+
if (order === 'asc') {
74+
return b - a;
75+
}
76+
return a - b; // desc
77+
}
78+
79+
render() {
80+
const sortOption = {
81+
sortFunc: this.sortFunc,
82+
sortCaret: (order, column) => {
83+
if (!order) return (<span>&nbsp;&nbsp;Desc/Asc</span>);
84+
else if (order === 'asc') return (<span>&nbsp;&nbsp;Desc/<font color="red">Asc</font></span>);
85+
else if (order === 'desc') return (<span>&nbsp;&nbsp;<font color="red">Desc</font>/Asc</span>);
86+
return null;
87+
}
88+
};
89+
90+
return (
91+
<div>
92+
<h3>Reverse Sorting Table</h3>
93+
<BootstrapTable keyField="id" data={ products } columns={ columns } sort={ sortOption } />
94+
<Code>{ sourceCode }</Code>
95+
</div>
96+
);
97+
}
98+
}

packages/react-bootstrap-table2-example/stories/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ import DefaultSortTable from 'examples/sort/default-sort-table';
107107
import DefaultSortDirectionTable from 'examples/sort/default-sort-direction';
108108
import SortEvents from 'examples/sort/sort-events';
109109
import SortManagement from 'examples/sort/sort-management';
110+
import OneTimeSortConfiguration from 'examples/sort/one-time-sort-configuration';
110111
import CustomSortValue from 'examples/sort/custom-sort-value';
111112
import CustomSortTable from 'examples/sort/custom-sort-table';
112113
import CustomSortCaretTable from 'examples/sort/custom-sort-caret';
@@ -367,6 +368,7 @@ storiesOf('Sort Table', module)
367368
.add('Default Sort Direction Table', () => <DefaultSortDirectionTable />)
368369
.add('Sort Events', () => <SortEvents />)
369370
.add('Sort Management', () => <SortManagement />)
371+
.add('One-time Sort Configuation', () => <OneTimeSortConfiguration />)
370372
.add('Custom Sort Value', () => <CustomSortValue />)
371373
.add('Custom Sort Fuction', () => <CustomSortTable />)
372374
.add('Custom Sort Caret', () => <CustomSortCaretTable />)

packages/react-bootstrap-table2/src/bootstrap-table.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ class BootstrapTable extends PropsBaseResolver(Component) {
9797
sortField={ this.props.sortField }
9898
sortOrder={ this.props.sortOrder }
9999
onSort={ this.props.onSort }
100+
globalSortCaret={ this.props.sort && this.props.sort.sortCaret }
100101
onFilter={ this.props.onFilter }
101102
currFilters={ this.props.currFilters }
102103
onExternalFilter={ this.props.onExternalFilter }
@@ -234,7 +235,9 @@ BootstrapTable.propTypes = {
234235
})),
235236
sort: PropTypes.shape({
236237
dataField: PropTypes.string,
237-
order: PropTypes.oneOf([Const.SORT_DESC, Const.SORT_ASC])
238+
order: PropTypes.oneOf([Const.SORT_DESC, Const.SORT_ASC]),
239+
sortFunc: PropTypes.func,
240+
sortCaret: PropTypes.func
238241
}),
239242
defaultSortDirection: PropTypes.oneOf([Const.SORT_DESC, Const.SORT_ASC]),
240243
overlay: PropTypes.func,

packages/react-bootstrap-table2/src/contexts/sort-context.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ export default (
2222
})),
2323
sort: PropTypes.shape({
2424
dataField: PropTypes.string,
25-
order: PropTypes.oneOf([Const.SORT_DESC, Const.SORT_ASC])
25+
order: PropTypes.oneOf([Const.SORT_DESC, Const.SORT_ASC]),
26+
sortFunc: PropTypes.func
2627
}),
2728
defaultSortDirection: PropTypes.oneOf([Const.SORT_DESC, Const.SORT_ASC])
2829
}
@@ -92,9 +93,11 @@ export default (
9293

9394
render() {
9495
let { data } = this.props;
96+
const { sort } = this.props;
9597
const { sortOrder, sortColumn } = this.state;
9698
if (!isRemoteSort() && sortColumn) {
97-
data = dataOperator.sort(data, sortOrder, sortColumn);
99+
const sortFunc = sortColumn.sortFunc ? sortColumn.sortFunc : (sort && sort.sortFunc);
100+
data = dataOperator.sort(data, sortOrder, { ...sortColumn, sortFunc });
98101
}
99102

100103
return (

packages/react-bootstrap-table2/src/header-cell.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ class HeaderCell extends eventDelegater(React.Component) {
2222
onFilter,
2323
currFilters,
2424
filterPosition,
25-
onExternalFilter
25+
onExternalFilter,
26+
globalSortCaret
2627
} = this.props;
2728

2829
const {
@@ -42,6 +43,8 @@ class HeaderCell extends eventDelegater(React.Component) {
4243
headerSortingStyle
4344
} = column;
4445

46+
const sortCaretfunc = sortCaret || globalSortCaret;
47+
4548
const delegateEvents = this.delegate(headerEvents);
4649

4750
const customAttrs = _.isFunction(headerAttrs)
@@ -81,7 +84,9 @@ class HeaderCell extends eventDelegater(React.Component) {
8184
cellAttrs.className = cs(cellAttrs.className, 'sortable');
8285

8386
if (sorting) {
84-
sortSymbol = sortCaret ? sortCaret(sortOrder, column) : <SortCaret order={ sortOrder } />;
87+
sortSymbol = sortCaretfunc ?
88+
sortCaretfunc(sortOrder, column) :
89+
<SortCaret order={ sortOrder } />;
8590

8691
// append customized classes or style if table was sorting based on the current column.
8792
cellClasses = cs(
@@ -98,7 +103,7 @@ class HeaderCell extends eventDelegater(React.Component) {
98103
: headerSortingStyle
99104
};
100105
} else {
101-
sortSymbol = sortCaret ? sortCaret(undefined, column) : <SortSymbol />;
106+
sortSymbol = sortCaretfunc ? sortCaretfunc(undefined, column) : <SortSymbol />;
102107
}
103108
}
104109

packages/react-bootstrap-table2/src/header.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ const Header = (props) => {
2121
expandRow,
2222
currFilters,
2323
onExternalFilter,
24-
filterPosition
24+
filterPosition,
25+
globalSortCaret
2526
} = props;
2627

2728
let SelectionHeaderCellComp = () => null;
@@ -52,6 +53,7 @@ const Header = (props) => {
5253
onSort={ onSort }
5354
sorting={ currSort }
5455
sortOrder={ sortOrder }
56+
globalSortCaret={ globalSortCaret }
5557
isLastSorting={ isLastSorting }
5658
onFilter={ onFilter }
5759
currFilters={ currFilters }
@@ -95,6 +97,7 @@ Header.propTypes = {
9597
selectRow: PropTypes.object,
9698
currFilters: PropTypes.object,
9799
onExternalFilter: PropTypes.func,
100+
globalSortCaret: PropTypes.func,
98101
className: PropTypes.string,
99102
expandRow: PropTypes.object,
100103
filterPosition: PropTypes.oneOf([

0 commit comments

Comments
 (0)