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', () => )