Skip to content

Commit ad98cfe

Browse files
committed
implement column.filterValue
1 parent c01db26 commit ad98cfe

File tree

4 files changed

+55
-10
lines changed

4 files changed

+55
-10
lines changed

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
import { FILTER_TYPE } from './const';
22
import { LIKE, EQ } from './comparison';
33

4-
export const filterByText = _ => (data, dataField, { filterVal, comparator = LIKE }) =>
4+
export const filterByText = _ => (
5+
data,
6+
dataField,
7+
{ filterVal, comparator = LIKE },
8+
customFilterValue
9+
) =>
510
data.filter((row) => {
6-
const cell = _.get(row, dataField);
11+
let cell = _.get(row, dataField);
12+
if (customFilterValue) {
13+
cell = customFilterValue(cell, row);
14+
}
715
const cellStr = _.isDefined(cell) ? cell.toString() : '';
816
if (comparator === EQ) {
917
return cellStr === filterVal;
@@ -23,14 +31,15 @@ export const filterFactory = _ => (filterType) => {
2331
return filterFn;
2432
};
2533

26-
export const filters = (store, _) => (currFilters) => {
34+
export const filters = (store, columns, _) => (currFilters) => {
2735
const factory = filterFactory(_);
2836
let result = store.getAllData();
2937
let filterFn;
3038
Object.keys(currFilters).forEach((dataField) => {
3139
const filterObj = currFilters[dataField];
3240
filterFn = factory(filterObj.filterType);
33-
result = filterFn(result, dataField, filterObj);
41+
const { filterValue } = columns.find(col => col.dataField === dataField);
42+
result = filterFn(result, dataField, filterObj, filterValue);
3443
});
3544
return result;
3645
};

packages/react-bootstrap-table2-filter/src/wrapper.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { filters } from './filter';
55
export default class FilterWrapper extends Component {
66
static propTypes = {
77
store: PropTypes.object.isRequired,
8+
columns: PropTypes.array.isRequired,
89
baseElement: PropTypes.func.isRequired,
910
_: PropTypes.object.isRequired
1011
}
@@ -20,7 +21,7 @@ export default class FilterWrapper extends Component {
2021
}
2122

2223
onFilter(column, filterVal, filterType) {
23-
const { store, _ } = this.props;
24+
const { store, columns, _ } = this.props;
2425
const { currFilters } = this.state;
2526
const { dataField, filter } = column;
2627

@@ -31,7 +32,7 @@ export default class FilterWrapper extends Component {
3132
currFilters[dataField] = { filterVal, filterType, comparator };
3233
}
3334

34-
store.filteredData = filters(store, _)(currFilters);
35+
store.filteredData = filters(store, columns, _)(currFilters);
3536
store.filtering = Object.keys(currFilters).length > 0;
3637

3738
this.setState(() => ({ currFilters, isDataChanged: true }));

packages/react-bootstrap-table2-filter/test/filter.test.js

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import sinon from 'sinon';
12
import _ from 'react-bootstrap-table2/src/utils';
23
import Store from 'react-bootstrap-table2/src/store';
34

@@ -18,16 +19,27 @@ describe('filter', () => {
1819
let store;
1920
let filterFn;
2021
let currFilters;
22+
let columns;
2123

2224
beforeEach(() => {
2325
store = new Store('id');
2426
store.data = data;
2527
currFilters = {};
28+
columns = [{
29+
dataField: 'id',
30+
text: 'ID'
31+
}, {
32+
dataField: 'name',
33+
text: 'Name'
34+
}, {
35+
dataField: 'price',
36+
text: 'Price'
37+
}];
2638
});
2739

2840
describe('text filter', () => {
2941
beforeEach(() => {
30-
filterFn = filters(store, _);
42+
filterFn = filters(store, columns, _);
3143
});
3244

3345
describe(`when default comparator is ${LIKE}`, () => {
@@ -36,7 +48,7 @@ describe('filter', () => {
3648
filterVal: '3',
3749
filterType: FILTER_TYPE.TEXT
3850
};
39-
51+
4052
const result = filterFn(currFilters);
4153
expect(result).toBeDefined();
4254
expect(result).toHaveLength(2);
@@ -50,11 +62,33 @@ describe('filter', () => {
5062
filterType: FILTER_TYPE.TEXT,
5163
comparator: EQ
5264
};
53-
65+
5466
const result = filterFn(currFilters);
5567
expect(result).toBeDefined();
5668
expect(result).toHaveLength(1);
5769
});
5870
});
71+
72+
describe('column.filterValue is defined', () => {
73+
beforeEach(() => {
74+
columns[1].filterValue = sinon.stub();
75+
filterFn = filters(store, columns, _);
76+
});
77+
78+
it('should calling custom filterValue callback correctly', () => {
79+
currFilters.name = {
80+
filterVal: '3',
81+
filterType: FILTER_TYPE.TEXT
82+
};
83+
84+
const result = filterFn(currFilters);
85+
expect(result).toBeDefined();
86+
expect(columns[1].filterValue.callCount).toBe(data.length);
87+
const calls = columns[1].filterValue.getCalls();
88+
calls.forEach((call, i) => {
89+
expect(call.calledWith(data[i].name, data[i])).toBeTruthy();
90+
});
91+
});
92+
});
5993
});
6094
});

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,8 @@ HeaderCell.propTypes = {
134134
editCellStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
135135
editCellClasses: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),
136136
validator: PropTypes.func,
137-
filter: PropTypes.object
137+
filter: PropTypes.object,
138+
filterValue: PropTypes.func
138139
}).isRequired,
139140
index: PropTypes.number.isRequired,
140141
onSort: PropTypes.func,

0 commit comments

Comments
 (0)