@@ -213,85 +213,15 @@ export class TableDataStore {
213
213
this . filteredData = null ;
214
214
this . isOnFilter = false ;
215
215
this . filterObj = null ;
216
- if ( this . searchText !== null ) this . search ( this . searchText ) ;
216
+ if ( this . searchText ) this . _search ( this . data ) ;
217
217
} else {
218
+ let source = this . data ;
218
219
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 ) ;
295
225
}
296
226
}
297
227
@@ -431,51 +361,134 @@ export class TableDataStore {
431
361
this . filteredData = null ;
432
362
this . isOnFilter = false ;
433
363
this . searchText = null ;
434
- if ( this . filterObj !== null ) this . filter ( this . filterObj ) ;
364
+ if ( this . filterObj ) this . _filter ( this . data ) ;
435
365
} else {
366
+ let source = this . data ;
436
367
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
+ }
438
375
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
+ }
443
450
}
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 ;
471
484
}
472
485
}
473
486
}
474
487
}
475
- return valid ;
476
- } ) ;
477
- this . isOnFilter = true ;
478
- }
488
+ }
489
+ return valid ;
490
+ } ) ;
491
+ this . isOnFilter = true ;
479
492
}
480
493
481
494
getDataIgnoringPagination ( ) {
0 commit comments