diff --git a/packages/react-bootstrap-table2-example/examples/column-filter/advance-custom-filter.js b/packages/react-bootstrap-table2-example/examples/column-filter/advance-custom-filter.js
new file mode 100644
index 0000000..3736dea
--- /dev/null
+++ b/packages/react-bootstrap-table2-example/examples/column-filter/advance-custom-filter.js
@@ -0,0 +1,184 @@
+/* eslint no-return-assign: 0 */
+import React from 'react';
+import PropTypes from 'prop-types';
+import BootstrapTable from 'react-bootstrap-table-next';
+import filterFactory, { textFilter, customFilter, Comparator, FILTER_TYPES } from 'react-bootstrap-table2-filter';
+import Code from 'components/common/code-block';
+import { productsGenerator } from 'utils/common';
+
+const products = productsGenerator(8);
+
+class PriceFilter extends React.Component {
+ static propTypes = {
+ column: PropTypes.object.isRequired,
+ onFilter: PropTypes.func.isRequired
+ }
+ constructor(props) {
+ super(props);
+ this.filter = this.filter.bind(this);
+ this.getValue = this.getValue.bind(this);
+ this.onChange = this.onChange.bind(this);
+ this.state = { value: 2100 };
+ }
+ onChange(e) {
+ this.setState({ value: e.target.value });
+ }
+ getValue() {
+ return parseInt(this.range.value, 10);
+ }
+ filter() {
+ this.props.onFilter({
+ number: this.getValue(),
+ comparator: this.select.value
+ });
+ }
+ render() {
+ return [
+ this.range = node }
+ type="range"
+ min="2100"
+ max="2110"
+ onChange={ this.onChange }
+ />,
+
this.showValue = node }
+ style={ { textAlign: 'center' } }
+ >
+ { this.state.value }
+
,
+ ,
+
+ ];
+ }
+}
+
+const columns = [{
+ dataField: 'id',
+ text: 'Product ID'
+}, {
+ dataField: 'name',
+ text: 'Product Name',
+ filter: textFilter()
+}, {
+ dataField: 'price',
+ text: 'Product Price',
+ filter: customFilter({
+ type: FILTER_TYPES.NUMBER // ask react-bootstrap-table to filter data as number
+ }),
+ filterRenderer: (onFilter, column) =>
+
+}];
+
+const sourceCode = `\
+import BootstrapTable from 'react-bootstrap-table-next';
+import filterFactory, { textFilter, customFilter, Comparator, FILTER_TYPES } from 'react-bootstrap-table2-filter';
+
+class PriceFilter extends React.Component {
+ static propTypes = {
+ column: PropTypes.object.isRequired,
+ onFilter: PropTypes.func.isRequired
+ }
+ constructor(props) {
+ super(props);
+ this.filter = this.filter.bind(this);
+ this.getValue = this.getValue.bind(this);
+ this.onChange = this.onChange.bind(this);
+ this.state = { value: 2100 };
+ }
+ onChange(e) {
+ this.setState({ value: e.target.value });
+ }
+ getValue() {
+ return parseInt(this.range.value, 10);
+ }
+ filter() {
+ this.props.onFilter({
+ number: this.getValue(),
+ comparator: this.select.value
+ });
+ }
+ render() {
+ return [
+ this.range = node }
+ type="range"
+ min="2100"
+ max="2110"
+ onChange={ this.onChange }
+ />,
+ this.showValue = node }
+ style={ { textAlign: 'center' } }
+ >
+ { this.state.value }
+
,
+ ,
+
+ ];
+ }
+}
+
+const columns = [{
+ dataField: 'id',
+ text: 'Product ID'
+}, {
+ dataField: 'name',
+ text: 'Product Name',
+ filter: textFilter()
+}, {
+ dataField: 'price',
+ text: 'Product Price',
+ filter: customFilter({
+ type: FILTER_TYPES.NUMBER // ask react-bootstrap-table to filter data as number
+ }),
+ filterRenderer: (onFilter, column) =>
+
+}];
+
+
+`;
+
+export default () => (
+
+
+ { sourceCode }
+
+);
diff --git a/packages/react-bootstrap-table2-example/examples/column-filter/custom-filter.js b/packages/react-bootstrap-table2-example/examples/column-filter/custom-filter.js
new file mode 100644
index 0000000..97fec6c
--- /dev/null
+++ b/packages/react-bootstrap-table2-example/examples/column-filter/custom-filter.js
@@ -0,0 +1,128 @@
+/* eslint no-return-assign: 0 */
+import React from 'react';
+import PropTypes from 'prop-types';
+import BootstrapTable from 'react-bootstrap-table-next';
+import filterFactory, { textFilter, customFilter } from 'react-bootstrap-table2-filter';
+import Code from 'components/common/code-block';
+import { productsGenerator } from 'utils/common';
+
+const products = productsGenerator(8);
+
+class PriceFilter extends React.Component {
+ static propTypes = {
+ column: PropTypes.object.isRequired,
+ onFilter: PropTypes.func.isRequired
+ }
+ constructor(props) {
+ super(props);
+ this.filter = this.filter.bind(this);
+ this.getValue = this.getValue.bind(this);
+ }
+ getValue() {
+ return this.input.value;
+ }
+ filter() {
+ this.props.onFilter(this.getValue());
+ }
+ render() {
+ return [
+ this.input = node }
+ type="text"
+ placeholder="Input price"
+ />,
+
+ ];
+ }
+}
+
+const columns = [{
+ dataField: 'id',
+ text: 'Product ID'
+}, {
+ dataField: 'name',
+ text: 'Product Name',
+ filter: textFilter()
+}, {
+ dataField: 'price',
+ text: 'Product Price',
+ filter: customFilter(),
+ filterRenderer: (onFilter, column) =>
+
+}];
+
+const sourceCode = `\
+import BootstrapTable from 'react-bootstrap-table-next';
+import filterFactory, { textFilter, customFilter } from 'react-bootstrap-table2-filter';
+
+class PriceFilter extends React.Component {
+ static propTypes = {
+ column: PropTypes.object.isRequired,
+ onFilter: PropTypes.func.isRequired
+ }
+ constructor(props) {
+ super(props);
+ this.filter = this.filter.bind(this);
+ this.getValue = this.getValue.bind(this);
+ }
+ getValue() {
+ return this.input.value;
+ }
+ filter() {
+ this.props.onFilter(this.getValue());
+ }
+ render() {
+ return [
+ this.input = node }
+ type="text"
+ placeholder="Input price"
+ />,
+
+ ];
+ }
+}
+
+const columns = [{
+ dataField: 'id',
+ text: 'Product ID'
+}, {
+ dataField: 'name',
+ text: 'Product Name',
+ filter: textFilter()
+}, {
+ dataField: 'price',
+ text: 'Product Price',
+ filter: customFilter(),
+ filterRenderer: (onFilter, column) =>
+
+}];
+
+
+`;
+
+export default () => (
+
+
+ { sourceCode }
+
+);
diff --git a/packages/react-bootstrap-table2-example/stories/index.js b/packages/react-bootstrap-table2-example/stories/index.js
index 08eaf85..64c4909 100644
--- a/packages/react-bootstrap-table2-example/stories/index.js
+++ b/packages/react-bootstrap-table2-example/stories/index.js
@@ -55,6 +55,8 @@ import ProgrammaticallyTextFilter from 'examples/column-filter/programmatically-
import ProgrammaticallySelectFilter from 'examples/column-filter/programmatically-select-filter';
import ProgrammaticallyNumberFilter from 'examples/column-filter/programmatically-number-filter';
import ProgrammaticallyDateFilter from 'examples/column-filter/programmatically-date-filter';
+import CustomFilter from 'examples/column-filter/custom-filter';
+import AdvanceCustomFilter from 'examples/column-filter/advance-custom-filter';
// work on rows
import RowStyleTable from 'examples/rows/row-style';
@@ -186,7 +188,9 @@ storiesOf('Column Filter', module)
.add('Programmatically Text Filter', () => )
.add('Programmatically Select Filter', () => )
.add('Programmatically Number Filter', () => )
- .add('Programmatically Date Filter', () => );
+ .add('Programmatically Date Filter', () => )
+ .add('Custom Filter', () => )
+ .add('Advance Custom Filter', () => );
storiesOf('Work on Rows', module)
.add('Customize Row Style', () => )