Skip to content

Commit dc67221

Browse files
committed
1 parent 17390a0 commit dc67221

File tree

1 file changed

+127
-114
lines changed

1 file changed

+127
-114
lines changed

src/store/TableDataStore.js

Lines changed: 127 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -213,85 +213,15 @@ export class TableDataStore {
213213
this.filteredData = null;
214214
this.isOnFilter = false;
215215
this.filterObj = null;
216-
if (this.searchText !== null) this.search(this.searchText);
216+
if (this.searchText) this._search(this.data);
217217
} else {
218+
let source = this.data;
218219
this.filterObj = filterObj;
219-
this.filteredData = this.data.filter( row => {
220-
let valid = true;
221-
let filterVal;
222-
for (const key in filterObj) {
223-
let targetVal = row[key];
224-
if (targetVal === null) return false;
225-
226-
switch (filterObj[key].type) {
227-
case Const.FILTER_TYPE.NUMBER: {
228-
filterVal = filterObj[key].value.number;
229-
break;
230-
}
231-
case Const.FILTER_TYPE.CUSTOM: {
232-
filterVal = (typeof filterObj[key].value === 'object') ?
233-
undefined :
234-
(typeof filterObj[key].value === 'string') ?
235-
filterObj[key].value.toLowerCase() :
236-
filterObj[key].value;
237-
break;
238-
}
239-
case Const.FILTER_TYPE.DATE: {
240-
filterVal = filterObj[key].value.date;
241-
break;
242-
}
243-
case Const.FILTER_TYPE.REGEX: {
244-
filterVal = filterObj[key].value;
245-
break;
246-
}
247-
default: {
248-
filterVal = (typeof filterObj[key].value === 'string') ?
249-
filterObj[key].value.toLowerCase() :
250-
filterObj[key].value;
251-
if (filterVal === undefined) {
252-
// Support old filter
253-
filterVal = filterObj[key].toLowerCase();
254-
}
255-
break;
256-
}
257-
}
258-
259-
if (this.colInfos[key]) {
260-
const { format, filterFormatted, formatExtraData } = this.colInfos[key];
261-
if (filterFormatted && format) {
262-
targetVal = format(row[key], row, formatExtraData);
263-
}
264-
}
265-
266-
switch (filterObj[key].type) {
267-
case Const.FILTER_TYPE.NUMBER: {
268-
valid = this.filterNumber(targetVal, filterVal, filterObj[key].value.comparator);
269-
break;
270-
}
271-
case Const.FILTER_TYPE.DATE: {
272-
valid = this.filterDate(targetVal, filterVal, filterObj[key].value.comparator);
273-
break;
274-
}
275-
case Const.FILTER_TYPE.REGEX: {
276-
valid = this.filterRegex(targetVal, filterVal);
277-
break;
278-
}
279-
case Const.FILTER_TYPE.CUSTOM: {
280-
valid = this.filterCustom(targetVal, filterVal, filterObj[key].value);
281-
break;
282-
}
283-
default: {
284-
valid = this.filterText(targetVal, filterVal);
285-
break;
286-
}
287-
}
288-
if (!valid) {
289-
break;
290-
}
291-
}
292-
return valid;
293-
});
294-
this.isOnFilter = true;
220+
if (this.searchText) {
221+
this._search(source);
222+
source = this.filteredData;
223+
}
224+
this._filter(source);
295225
}
296226
}
297227

@@ -431,51 +361,134 @@ export class TableDataStore {
431361
this.filteredData = null;
432362
this.isOnFilter = false;
433363
this.searchText = null;
434-
if (this.filterObj !== null) this.filter(this.filterObj);
364+
if (this.filterObj) this._filter(this.data);
435365
} else {
366+
let source = this.data;
436367
this.searchText = searchText;
437-
let searchTextArray = [];
368+
if (this.filterObj) {
369+
this._filter(source);
370+
source = this.filteredData;
371+
}
372+
this._search(source);
373+
}
374+
}
438375

439-
if (this.multiColumnSearch) {
440-
searchTextArray = searchText.split(' ');
441-
} else {
442-
searchTextArray.push(searchText);
376+
_filter(source) {
377+
const filterObj = this.filterObj;
378+
this.filteredData = source.filter( row => {
379+
let valid = true;
380+
let filterVal;
381+
for (const key in filterObj) {
382+
let targetVal = row[key];
383+
if (targetVal === null) return false;
384+
385+
switch (filterObj[key].type) {
386+
case Const.FILTER_TYPE.NUMBER: {
387+
filterVal = filterObj[key].value.number;
388+
break;
389+
}
390+
case Const.FILTER_TYPE.CUSTOM: {
391+
filterVal = (typeof filterObj[key].value === 'object') ?
392+
undefined :
393+
(typeof filterObj[key].value === 'string') ?
394+
filterObj[key].value.toLowerCase() :
395+
filterObj[key].value;
396+
break;
397+
}
398+
case Const.FILTER_TYPE.DATE: {
399+
filterVal = filterObj[key].value.date;
400+
break;
401+
}
402+
case Const.FILTER_TYPE.REGEX: {
403+
filterVal = filterObj[key].value;
404+
break;
405+
}
406+
default: {
407+
filterVal = (typeof filterObj[key].value === 'string') ?
408+
filterObj[key].value.toLowerCase() :
409+
filterObj[key].value;
410+
if (filterVal === undefined) {
411+
// Support old filter
412+
filterVal = filterObj[key].toLowerCase();
413+
}
414+
break;
415+
}
416+
}
417+
418+
if (this.colInfos[key]) {
419+
const { format, filterFormatted, formatExtraData } = this.colInfos[key];
420+
if (filterFormatted && format) {
421+
targetVal = format(row[key], row, formatExtraData);
422+
}
423+
}
424+
425+
switch (filterObj[key].type) {
426+
case Const.FILTER_TYPE.NUMBER: {
427+
valid = this.filterNumber(targetVal, filterVal, filterObj[key].value.comparator);
428+
break;
429+
}
430+
case Const.FILTER_TYPE.DATE: {
431+
valid = this.filterDate(targetVal, filterVal, filterObj[key].value.comparator);
432+
break;
433+
}
434+
case Const.FILTER_TYPE.REGEX: {
435+
valid = this.filterRegex(targetVal, filterVal);
436+
break;
437+
}
438+
case Const.FILTER_TYPE.CUSTOM: {
439+
valid = this.filterCustom(targetVal, filterVal, filterObj[key].value);
440+
break;
441+
}
442+
default: {
443+
valid = this.filterText(targetVal, filterVal);
444+
break;
445+
}
446+
}
447+
if (!valid) {
448+
break;
449+
}
443450
}
444-
// Mark following code for fixing #363
445-
// To avoid to search on a data which be searched or filtered
446-
// But this solution have a poor performance, because I do a filter again
447-
// const source = this.isOnFilter ? this.filteredData : this.data;
448-
const source = this.filterObj !== null ? this.filter(this.filterObj) : this.data;
449-
450-
this.filteredData = source.filter( row => {
451-
const keys = Object.keys(row);
452-
let valid = false;
453-
// for loops are ugly, but performance matters here.
454-
// And you cant break from a forEach.
455-
// http://jsperf.com/for-vs-foreach/66
456-
for (let i = 0, keysLength = keys.length; i < keysLength; i++) {
457-
const key = keys[i];
458-
if (this.colInfos[key] && row[key]) {
459-
const { format, filterFormatted, formatExtraData, searchable } = this.colInfos[key];
460-
let targetVal = row[key];
461-
if (searchable) {
462-
if (filterFormatted && format) {
463-
targetVal = format(targetVal, row, formatExtraData);
464-
}
465-
for (let j = 0, textLength = searchTextArray.length; j < textLength; j++) {
466-
const filterVal = searchTextArray[j].toLowerCase();
467-
if (targetVal.toString().toLowerCase().indexOf(filterVal) !== -1) {
468-
valid = true;
469-
break;
470-
}
451+
return valid;
452+
});
453+
this.isOnFilter = true;
454+
}
455+
456+
_search(source) {
457+
let searchTextArray = [];
458+
459+
if (this.multiColumnSearch) {
460+
searchTextArray = this.searchText.split(' ');
461+
} else {
462+
searchTextArray.push(this.searchText);
463+
}
464+
this.filteredData = source.filter( row => {
465+
const keys = Object.keys(row);
466+
let valid = false;
467+
// for loops are ugly, but performance matters here.
468+
// And you cant break from a forEach.
469+
// http://jsperf.com/for-vs-foreach/66
470+
for (let i = 0, keysLength = keys.length; i < keysLength; i++) {
471+
const key = keys[i];
472+
if (this.colInfos[key] && row[key]) {
473+
const { format, filterFormatted, formatExtraData, searchable } = this.colInfos[key];
474+
let targetVal = row[key];
475+
if (searchable) {
476+
if (filterFormatted && format) {
477+
targetVal = format(targetVal, row, formatExtraData);
478+
}
479+
for (let j = 0, textLength = searchTextArray.length; j < textLength; j++) {
480+
const filterVal = searchTextArray[j].toLowerCase();
481+
if (targetVal.toString().toLowerCase().indexOf(filterVal) !== -1) {
482+
valid = true;
483+
break;
471484
}
472485
}
473486
}
474487
}
475-
return valid;
476-
});
477-
this.isOnFilter = true;
478-
}
488+
}
489+
return valid;
490+
});
491+
this.isOnFilter = true;
479492
}
480493

481494
getDataIgnoringPagination() {

0 commit comments

Comments
 (0)