From 44222da2962e8cfb9f4e96800fdfab8aa085bc03 Mon Sep 17 00:00:00 2001 From: AllenFang Date: Sun, 23 Feb 2020 16:41:52 +0800 Subject: [PATCH 1/6] close #1215 --- docs/columns.md | 1 + .../examples/footer/column-format-table.js | 4 ++-- packages/react-bootstrap-table2/src/footer-cell.js | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/columns.md b/docs/columns.md index 6d77335a5..5636c26ac 100644 --- a/docs/columns.md +++ b/docs/columns.md @@ -594,6 +594,7 @@ This prop also accept a function: * `column` * `columnIndex` +* `props`: It's an object and contain `text` property only. ## column.footerClasses - [String | Function] It's similar to [`column.classes`](#classes), `footerClasses` is available to have customized class on table footer column: diff --git a/packages/react-bootstrap-table2-example/examples/footer/column-format-table.js b/packages/react-bootstrap-table2-example/examples/footer/column-format-table.js index 26fbbc08b..ccd85bfd7 100644 --- a/packages/react-bootstrap-table2-example/examples/footer/column-format-table.js +++ b/packages/react-bootstrap-table2-example/examples/footer/column-format-table.js @@ -7,7 +7,7 @@ import { productsGenerator } from 'utils/common'; const products = productsGenerator(); -function priceFormatter(column, colIndex) { +function priceFormatter(column, colIndex, { text }) { return (
$$ {column.text} $$ @@ -37,7 +37,7 @@ const columns = [ const sourceCode = `\ import BootstrapTable from 'react-bootstrap-table-next'; -function priceFormatter(column, colIndex) { +function priceFormatter(column, colIndex, { text }) { return (
$$ { column.text } $$
); diff --git a/packages/react-bootstrap-table2/src/footer-cell.js b/packages/react-bootstrap-table2/src/footer-cell.js index e47ad0ae0..efad6dd38 100644 --- a/packages/react-bootstrap-table2/src/footer-cell.js +++ b/packages/react-bootstrap-table2/src/footer-cell.js @@ -54,7 +54,7 @@ class FooterCell extends eventDelegater(React.Component) { if (cellClasses) cellAttrs.className = cs(cellAttrs.className, cellClasses); if (!_.isEmptyObject(cellStyle)) cellAttrs.style = cellStyle; - const children = footerFormatter ? footerFormatter(column, index) : text; + const children = footerFormatter ? footerFormatter(column, index, { text }) : text; return React.createElement('th', cellAttrs, children); } From 9c66a2020b30cad4855935ec4e6094f7ee254319 Mon Sep 17 00:00:00 2001 From: AllenFang Date: Sun, 23 Feb 2020 16:56:47 +0800 Subject: [PATCH 2/6] fix #1260 --- packages/react-bootstrap-table2/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-bootstrap-table2/package.json b/packages/react-bootstrap-table2/package.json index fcf5d312e..fa5d6e74f 100644 --- a/packages/react-bootstrap-table2/package.json +++ b/packages/react-bootstrap-table2/package.json @@ -37,7 +37,7 @@ ], "dependencies": { "classnames": "^2.2.5", - "react-transition-group": "2.5.3", + "react-transition-group": "^4.2.0", "underscore": "1.9.1" }, "peerDependencies": { From 1f738068f29bb283d21dca6ee428736a9a274b1e Mon Sep 17 00:00:00 2001 From: AllenFang Date: Sun, 23 Feb 2020 20:09:47 +0800 Subject: [PATCH 3/6] fix #1221 --- .../column-filter/clear-all-filters.js | 30 ++++++++++++++++--- .../src/utils/common.js | 1 + .../src/context.js | 5 +++- .../src/filter.js | 29 +++++++++++------- .../test/context.test.js | 1 + 5 files changed, 51 insertions(+), 15 deletions(-) diff --git a/packages/react-bootstrap-table2-example/examples/column-filter/clear-all-filters.js b/packages/react-bootstrap-table2-example/examples/column-filter/clear-all-filters.js index 3e2a25bfa..c15f560a8 100644 --- a/packages/react-bootstrap-table2-example/examples/column-filter/clear-all-filters.js +++ b/packages/react-bootstrap-table2-example/examples/column-filter/clear-all-filters.js @@ -1,13 +1,20 @@ import React from 'react'; import BootstrapTable from 'react-bootstrap-table-next'; -import filterFactory, { textFilter, dateFilter } from 'react-bootstrap-table2-filter'; +import filterFactory, { textFilter, dateFilter, selectFilter } from 'react-bootstrap-table2-filter'; import Code from 'components/common/code-block'; import { stockGenerator } from 'utils/common'; const products = stockGenerator(8); +const selectOptions = { + 0: 'good', + 1: 'Bad', + 2: 'unknown' +}; + let nameFilter; let priceFilter; +let qualityFilter; let stockDateFilter; const columns = [{ @@ -19,7 +26,19 @@ const columns = [{ filter: textFilter({ getFilter: (filter) => { nameFilter = filter; - } + }, + onFilter: filterVal => console.log(`Filter product name ${filterVal}`) + }) +}, { + dataField: 'quality', + text: 'Product Quailty', + formatter: cell => selectOptions[cell], + filter: selectFilter({ + options: selectOptions, + getFilter: (filter) => { + qualityFilter = filter; + }, + onFilter: filterVal => console.log(`Filter quality ${filterVal}`) }) }, { dataField: 'price', @@ -27,7 +46,8 @@ const columns = [{ filter: textFilter({ getFilter: (filter) => { priceFilter = filter; - } + }, + onFilter: filterVal => console.log(`Filter Price: ${filterVal}`) }) }, { dataField: 'inStockDate', @@ -36,13 +56,15 @@ const columns = [{ filter: dateFilter({ getFilter: (filter) => { stockDateFilter = filter; - } + }, + onFilter: filterVal => console.log(`Filter date: ${filterVal}`) }) }]; const handleClick = () => { nameFilter(''); priceFilter(''); + qualityFilter(''); stockDateFilter(); }; diff --git a/packages/react-bootstrap-table2-example/src/utils/common.js b/packages/react-bootstrap-table2-example/src/utils/common.js index 5592779d7..131e30877 100644 --- a/packages/react-bootstrap-table2-example/src/utils/common.js +++ b/packages/react-bootstrap-table2-example/src/utils/common.js @@ -77,6 +77,7 @@ export const stockGenerator = (quantity = 5) => name: `Stock Name ${index}`, price: Math.floor((Math.random() * 2) + 1), visible: Math.random() > 0.5, + quality: index % 3, inStockDate: new Date(startDate.getTime() + Math.random() * (endDate.getTime() - startDate.getTime())) })); diff --git a/packages/react-bootstrap-table2-filter/src/context.js b/packages/react-bootstrap-table2-filter/src/context.js index f9be85f18..64f2d195f 100644 --- a/packages/react-bootstrap-table2-filter/src/context.js +++ b/packages/react-bootstrap-table2-filter/src/context.js @@ -25,6 +25,7 @@ export default ( constructor(props) { super(props); this.currFilters = {}; + this.clearFilters = {}; this.onFilter = this.onFilter.bind(this); this.doFilter = this.doFilter.bind(this); this.onExternalFilter = this.onExternalFilter.bind(this); @@ -42,6 +43,7 @@ export default ( return (filterVal) => { // watch out here if migration to context API, #334 const currFilters = Object.assign({}, this.currFilters); + this.clearFilters = {}; const { dataField, filter } = column; const needClearFilters = @@ -51,6 +53,7 @@ export default ( if (needClearFilters) { delete currFilters[dataField]; + this.clearFilters = { [dataField]: { clear: true, filterVal } }; } else { // select default comparator is EQ, others are LIKE const { @@ -93,7 +96,7 @@ export default ( doFilter(props, ignoreEmitDataChange = false) { const { dataChangeListener, data, columns } = props; - const result = filters(data, columns, _)(this.currFilters); + const result = filters(data, columns, _)(this.currFilters, this.clearFilters); this.data = result; if (dataChangeListener && !ignoreEmitDataChange) { this.isEmitDataChange = true; diff --git a/packages/react-bootstrap-table2-filter/src/filter.js b/packages/react-bootstrap-table2-filter/src/filter.js index 8769e4fd6..7aad77bc3 100644 --- a/packages/react-bootstrap-table2-filter/src/filter.js +++ b/packages/react-bootstrap-table2-filter/src/filter.js @@ -229,14 +229,13 @@ export const filterFactory = _ => (filterType) => { return filterFn; }; -export const filters = (data, columns, _) => (currFilters) => { +export const filters = (data, columns, _) => (currFilters, clearFilters = {}) => { const factory = filterFactory(_); + const filterState = { ...clearFilters, ...currFilters }; let result = data; let filterFn; - Object.keys(currFilters).forEach((dataField) => { + Object.keys(filterState).forEach((dataField) => { let currentResult; - const filterObj = currFilters[dataField]; - filterFn = factory(filterObj.filterType); let filterValue; let customFilter; for (let i = 0; i < columns.length; i += 1) { @@ -248,13 +247,23 @@ export const filters = (data, columns, _) => (currFilters) => { break; } } - if (customFilter) { - currentResult = customFilter(filterObj.filterVal, result); - } - if (typeof currentResult === 'undefined') { - result = filterFn(result, dataField, filterObj, filterValue); + + if (clearFilters[dataField] && customFilter) { + currentResult = customFilter(clearFilters[dataField].filterVal, result); + if (typeof currentResult !== 'undefined') { + result = currentResult; + } } else { - result = currentResult; + const filterObj = filterState[dataField]; + filterFn = factory(filterObj.filterType); + if (customFilter) { + currentResult = customFilter(filterObj.filterVal, result); + } + if (typeof currentResult === 'undefined') { + result = filterFn(result, dataField, filterObj, filterValue); + } else { + result = currentResult; + } } }); return result; diff --git a/packages/react-bootstrap-table2-filter/test/context.test.js b/packages/react-bootstrap-table2-filter/test/context.test.js index 7b15a28d2..eccef3063 100644 --- a/packages/react-bootstrap-table2-filter/test/context.test.js +++ b/packages/react-bootstrap-table2-filter/test/context.test.js @@ -171,6 +171,7 @@ describe('FilterContext', () => { filterVals.forEach((filterVal) => { instance.onFilter(columns[1], FILTER_TYPE.TEXT)(filterVal); expect(Object.keys(instance.currFilters)).toHaveLength(0); + expect(Object.keys(instance.clearFilters)).toHaveLength(1); }); }); }); From 6d7a4c478314b55b0a90551c6a83296991a387a6 Mon Sep 17 00:00:00 2001 From: AllenFang Date: Sat, 7 Mar 2020 14:34:09 +0800 Subject: [PATCH 4/6] fix #1269 --- .../examples/column-filter/text-filter.js | 5 +++-- .../src/components/date.js | 18 +++++++++++------ .../src/components/multiselect.js | 10 +++++++--- .../src/components/number.js | 20 ++++++++++++------- .../src/components/select.js | 10 +++++++--- .../src/components/text.js | 14 ++++++++----- 6 files changed, 51 insertions(+), 26 deletions(-) diff --git a/packages/react-bootstrap-table2-example/examples/column-filter/text-filter.js b/packages/react-bootstrap-table2-example/examples/column-filter/text-filter.js index c3789be40..58dc30828 100644 --- a/packages/react-bootstrap-table2-example/examples/column-filter/text-filter.js +++ b/packages/react-bootstrap-table2-example/examples/column-filter/text-filter.js @@ -14,7 +14,9 @@ const columns = [{ dataField: 'name', text: 'Product Name', footer: 'hello', - filter: textFilter() + filter: textFilter({ + id: 'identify' + }) }, { dataField: 'price', text: 'Product Price', @@ -54,7 +56,6 @@ export default () => ( data={ products } columns={ columns } filter={ filterFactory() } - filterPosition="bottom" selectRow={ selectRow } /> { sourceCode } diff --git a/packages/react-bootstrap-table2-filter/src/components/date.js b/packages/react-bootstrap-table2-filter/src/components/date.js index 3d8ff4536..54bb761ea 100644 --- a/packages/react-bootstrap-table2-filter/src/components/date.js +++ b/packages/react-bootstrap-table2-filter/src/components/date.js @@ -128,8 +128,9 @@ class DateFilter extends Component { render() { const { + id, placeholder, - column: { text }, + column: { dataField, text }, style, comparatorStyle, dateStyle, @@ -138,6 +139,9 @@ class DateFilter extends Component { dateClassName } = this.props; + const comparatorElmId = `date-filter-comparator-${dataField}${id ? `-${id}` : ''}`; + const inputElmId = `date-filter-column-${dataField}${id ? `-${id}` : ''}`; + return (
e.stopPropagation() } @@ -146,12 +150,12 @@ class DateFilter extends Component { > -