diff --git a/docs/README.md b/docs/README.md
index b7c5982..83213a6 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -202,6 +202,7 @@ paginator({
totalSize, // Total data size. It's necessary when remote is enabled
pageStartIndex: 0, // first page will be 0, default is 1
paginationSize: 3, // the pagination bar size, default is 5
+ showTotal: true, // display pagination information
sizePerPageList: [ {
text: '5', value: 5
}, {
@@ -223,6 +224,7 @@ paginator({
hidePageListOnlyOnePage: true, // hide pagination bar when only one page, default is false
onPageChange: (page, sizePerPage) => {}, // callback function when page was changing
onSizePerPageChange: (sizePerPage, page) => {}, // callback function when page size was changing
+ paginationTotalRenderer: (from, to, size) => { ... } // custom the pagination total
})
```
diff --git a/docs/columns.md b/docs/columns.md
index e7b477b..4b78e36 100644
--- a/docs/columns.md
+++ b/docs/columns.md
@@ -648,6 +648,8 @@ Configure `column.filter` will able to setup a column level filter on the header
* Text(`textFilter`)
* Select(`selectFilter`)
+* Number(`numberFilter`)
+* Date(`dateFilter`)
We have a quick example to show you how to use `column.filter`:
diff --git a/docs/migration.md b/docs/migration.md
index a9d2104..5385172 100644
--- a/docs/migration.md
+++ b/docs/migration.md
@@ -72,7 +72,7 @@ Due to no `TableHeaderColumn` so that no `dataSort` here, please add [`sort`](ht
Please see [Work with selection](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/basic-row-select.html).
Please see [available selectRow configurations](https://react-bootstrap-table.github.io/react-bootstrap-table2/docs/row-select-props.html).
-No huge change for row selection, but can not custom the selection column currently. Coming soon!!!
+No huge change for row selection.
## Column Filter
@@ -87,9 +87,9 @@ Please see [available filter configuration](https://react-bootstrap-table.github
- [x] Select Filter
- [x] Custom Select Filter
- [X] Number Filter
-- [ ] Date Filter
+- [X] Date Filter
- [ ] Array Filter
-- [ ] Programmatically Filter
+- [X] Programmatically Filter
Remember to install [`react-bootstrap-table2-filter`](https://www.npmjs.com/package/react-bootstrap-table2-filter) firstly.
diff --git a/docs/row-selection.md b/docs/row-selection.md
index ac7eba7..eb57e6b 100644
--- a/docs/row-selection.md
+++ b/docs/row-selection.md
@@ -16,6 +16,8 @@
* [onSelect](#onSelect)
* [onSelectAll](#onSelectAll)
* [hideSelectColumn](#hideSelectColumn)
+* [selectionRenderer](#selectionRenderer)
+* [selectionHeaderRenderer](#selectionHeaderRenderer)
### selectRow.mode - [String]
@@ -156,6 +158,34 @@ const selectRow = {
};
```
+### selectRow.selectionRenderer - [Function]
+Provide a callback function which allow you to custom the checkbox/radio box. This callback only have one argument which is an object and contain following properties:
+
+```js
+const selectRow = {
+ mode: 'checkbox',
+ selectionRenderer: ({ mode, checked, disabled }) => (
+ // ....
+ )
+};
+```
+
+> By default, `react-bootstrap-table2` will help you to handle the click event, it's not necessary to handle again by developer.
+
+### selectRow.selectionHeaderRenderer - [Function]
+Provide a callback function which allow you to custom the checkbox/radio box in the selection header column. This callback only have one argument which is an object and contain following properties:
+
+```js
+const selectRow = {
+ mode: 'checkbox',
+ selectionHeaderRenderer: ({ mode, checked, indeterminate }) => (
+ // ....
+ )
+};
+```
+
+> By default, `react-bootstrap-table2` will help you to handle the click event, it's not necessary to handle again by developer.
+
### selectRow.onSelect - [Function]
This callback function will be called when a row is select/unselect and pass following three arguments:
`row`, `isSelect`, `rowIndex` and `e`.
diff --git a/packages/react-bootstrap-table2-example/examples/column-filter/custom-date-filter.js b/packages/react-bootstrap-table2-example/examples/column-filter/custom-date-filter.js
new file mode 100644
index 0000000..226708d
--- /dev/null
+++ b/packages/react-bootstrap-table2-example/examples/column-filter/custom-date-filter.js
@@ -0,0 +1,77 @@
+import React from 'react';
+import BootstrapTable from 'react-bootstrap-table-next';
+import filterFactory, { dateFilter, Comparator } from 'react-bootstrap-table2-filter';
+import Code from 'components/common/code-block';
+import { stockGenerator } from 'utils/common';
+
+const stocks = stockGenerator(8);
+
+const columns = [{
+ dataField: 'id',
+ text: 'Product ID'
+}, {
+ dataField: 'name',
+ text: 'Product Name'
+}, {
+ dataField: 'inStockDate',
+ text: 'InStock Date',
+ filter: dateFilter({
+ delay: 400,
+ placeholder: 'custom placeholder',
+ withoutEmptyComparatorOption: true,
+ comparators: [Comparator.EQ, Comparator.GT, Comparator.LT],
+ style: { display: 'inline-grid' },
+ className: 'custom-datefilter-class',
+ comparatorStyle: { backgroundColor: 'antiquewhite' },
+ comparatorClassName: 'custom-comparator-class',
+ dateStyle: { backgroundColor: 'cadetblue', margin: '0px' },
+ dateClassName: 'custom-date-class'
+ })
+}];
+
+const sourceCode = `\
+import BootstrapTable from 'react-bootstrap-table-next';
+import filterFactory, { dateFilter } from 'react-bootstrap-table2-filter';
+
+const columns = [{
+ dataField: 'id',
+ text: 'Product ID'
+}, {
+ dataField: 'name',
+ text: 'Product Name'
+}, {
+ dataField: 'inStockDate',
+ text: 'InStock Date',
+ filter: dateFilter({
+ delay: 400,
+ placeholder: 'custom placeholder',
+ withoutEmptyComparatorOption: true,
+ comparators: [Comparator.EQ, Comparator.GT, Comparator.LT],
+ style: { display: 'inline-grid' },
+ className: 'custom-datefilter-class',
+ comparatorStyle: { backgroundColor: 'antiquewhite' },
+ comparatorClassName: 'custom-comparator-class',
+ dateStyle: { backgroundColor: 'cadetblue', margin: '0px' },
+ dateClassName: 'custom-date-class'
+ })
+}];
+
+
{ sourceCode }
+ { sourceCode }
+ { sourceCode }
+ { sourceCode }
+ { sourceCode1 }
+ { sourceCode2 }
+ | - + { + selectionRenderer ? selectionRenderer({ + mode: inputType, + checked: selected, + disabled + }) : ( + + ) + } | ); } diff --git a/packages/react-bootstrap-table2/src/row-selection/selection-header-cell.js b/packages/react-bootstrap-table2/src/row-selection/selection-header-cell.js index 0105bf3..9879026 100644 --- a/packages/react-bootstrap-table2/src/row-selection/selection-header-cell.js +++ b/packages/react-bootstrap-table2/src/row-selection/selection-header-cell.js @@ -22,7 +22,8 @@ export default class SelectionHeaderCell extends Component { static propTypes = { mode: PropTypes.string.isRequired, checkedStatus: PropTypes.string, - onAllRowsSelect: PropTypes.func + onAllRowsSelect: PropTypes.func, + selectionHeaderRenderer: PropTypes.func } constructor() { @@ -52,25 +53,37 @@ export default class SelectionHeaderCell extends Component { render() { const { - CHECKBOX_STATUS_CHECKED, CHECKBOX_STATUS_INDETERMINATE, ROW_SELECT_SINGLE + CHECKBOX_STATUS_CHECKED, CHECKBOX_STATUS_INDETERMINATE, ROW_SELECT_MULTIPLE } = Const; - const { mode, checkedStatus } = this.props; + const { mode, checkedStatus, selectionHeaderRenderer } = this.props; const checked = checkedStatus === CHECKBOX_STATUS_CHECKED; const indeterminate = checkedStatus === CHECKBOX_STATUS_INDETERMINATE; - return mode === ROW_SELECT_SINGLE - ?- : ( - |
- |
+ const attrs = {};
+ let content;
+ if (selectionHeaderRenderer) {
+ content = selectionHeaderRenderer({
+ mode,
+ checked,
+ indeterminate
+ });
+ attrs.onClick = this.handleCheckBoxClick;
+ } else if (mode === ROW_SELECT_MULTIPLE) {
+ content = (
+ { content } | + ); } } diff --git a/packages/react-bootstrap-table2/src/sort/wrapper.js b/packages/react-bootstrap-table2/src/sort/wrapper.js index d20d207..6d55f1c 100644 --- a/packages/react-bootstrap-table2/src/sort/wrapper.js +++ b/packages/react-bootstrap-table2/src/sort/wrapper.js @@ -39,15 +39,17 @@ export default Base => } componentWillReceiveProps(nextProps) { - let sortedColumn; - for (let i = 0; i < nextProps.columns.length; i += 1) { - if (nextProps.columns[i].dataField === nextProps.store.sortField) { - sortedColumn = nextProps.columns[i]; - break; + if (!this.isRemoteSort() && !this.isRemotePagination()) { + let sortedColumn; + for (let i = 0; i < nextProps.columns.length; i += 1) { + if (nextProps.columns[i].dataField === nextProps.store.sortField) { + sortedColumn = nextProps.columns[i]; + break; + } + } + if (sortedColumn && sortedColumn.sort) { + nextProps.store.sortBy(sortedColumn); } - } - if (sortedColumn && sortedColumn.sort) { - nextProps.store.sortBy(sortedColumn); } } diff --git a/packages/react-bootstrap-table2/test/row-selection/selection-cell.test.js b/packages/react-bootstrap-table2/test/row-selection/selection-cell.test.js index c0069e2..02e9d85 100644 --- a/packages/react-bootstrap-table2/test/row-selection/selection-cell.test.js +++ b/packages/react-bootstrap-table2/test/row-selection/selection-cell.test.js @@ -193,5 +193,36 @@ describe('
|---|