1
1
import { FilteringLogic , IFilteringExpression } from './filtering-expression.interface' ;
2
2
import { FilteringExpressionsTree , IFilteringExpressionsTree } from './filtering-expressions-tree' ;
3
- import { resolveNestedPath } from '../core/utils' ;
3
+ import { resolveNestedPath , parseDate } from '../core/utils' ;
4
+ import { GridType } from '../grids/common/grid.interface' ;
5
+
6
+ const DateType = 'date' ;
4
7
5
8
export interface IFilteringStrategy {
6
- filter ( data : any [ ] , expressionsTree : IFilteringExpressionsTree , advancedExpressionsTree ?: IFilteringExpressionsTree ) : any [ ] ;
9
+ filter ( data : any [ ] , expressionsTree : IFilteringExpressionsTree , advancedExpressionsTree ?: IFilteringExpressionsTree ,
10
+ grid ?: GridType ) : any [ ] ;
7
11
}
8
12
9
13
export class NoopFilteringStrategy implements IFilteringStrategy {
@@ -22,17 +26,17 @@ export class NoopFilteringStrategy implements IFilteringStrategy {
22
26
23
27
export abstract class BaseFilteringStrategy implements IFilteringStrategy {
24
28
public abstract filter ( data : any [ ] , expressionsTree : IFilteringExpressionsTree ,
25
- advancedExpressionsTree ?: IFilteringExpressionsTree ) : any [ ] ;
29
+ advancedExpressionsTree ?: IFilteringExpressionsTree , grid ?: GridType ) : any [ ] ;
26
30
27
- protected abstract getFieldValue ( rec : object , fieldName : string ) : any ;
31
+ protected abstract getFieldValue ( rec : object , fieldName : string , isDate : boolean ) : any ;
28
32
29
- public findMatchByExpression ( rec : object , expr : IFilteringExpression ) : boolean {
33
+ public findMatchByExpression ( rec : object , expr : IFilteringExpression , isDate ?: boolean ) : boolean {
30
34
const cond = expr . condition ;
31
- const val = this . getFieldValue ( rec , expr . fieldName ) ;
35
+ const val = this . getFieldValue ( rec , expr . fieldName , isDate ) ;
32
36
return cond . logic ( val , expr . searchVal , expr . ignoreCase ) ;
33
37
}
34
38
35
- public matchRecord ( rec : object , expressions : IFilteringExpressionsTree | IFilteringExpression ) : boolean {
39
+ public matchRecord ( rec : object , expressions : IFilteringExpressionsTree | IFilteringExpression , grid ?: GridType ) : boolean {
36
40
if ( expressions ) {
37
41
if ( expressions instanceof FilteringExpressionsTree ) {
38
42
const expressionsTree = expressions as IFilteringExpressionsTree ;
@@ -42,7 +46,7 @@ export abstract class BaseFilteringStrategy implements IFilteringStrategy {
42
46
if ( expressionsTree . filteringOperands && expressionsTree . filteringOperands . length ) {
43
47
for ( let i = 0 ; i < expressionsTree . filteringOperands . length ; i ++ ) {
44
48
operand = expressionsTree . filteringOperands [ i ] ;
45
- matchOperand = this . matchRecord ( rec , operand ) ;
49
+ matchOperand = this . matchRecord ( rec , operand , grid ) ;
46
50
47
51
// Return false if at least one operand does not match and the filtering logic is And
48
52
if ( ! matchOperand && operator === FilteringLogic . And ) {
@@ -61,7 +65,9 @@ export abstract class BaseFilteringStrategy implements IFilteringStrategy {
61
65
return true ;
62
66
} else {
63
67
const expression = expressions as IFilteringExpression ;
64
- return this . findMatchByExpression ( rec , expression ) ;
68
+ const isDate = grid && grid . getColumnByName ( expression . fieldName ) ?
69
+ grid . getColumnByName ( expression . fieldName ) . dataType === DateType : false ;
70
+ return this . findMatchByExpression ( rec , expression , isDate ) ;
65
71
}
66
72
}
67
73
@@ -78,7 +84,8 @@ export class FilteringStrategy extends BaseFilteringStrategy {
78
84
return this . _instace || ( this . _instace = new this ( ) ) ;
79
85
}
80
86
81
- public filter < T > ( data : T [ ] , expressionsTree : IFilteringExpressionsTree , advancedExpressionsTree ?: IFilteringExpressionsTree ) : T [ ] {
87
+ public filter < T > ( data : T [ ] , expressionsTree : IFilteringExpressionsTree , advancedExpressionsTree : IFilteringExpressionsTree ,
88
+ grid : GridType ) : T [ ] {
82
89
let i ;
83
90
let rec ;
84
91
const len = data . length ;
@@ -88,14 +95,16 @@ export class FilteringStrategy extends BaseFilteringStrategy {
88
95
}
89
96
for ( i = 0 ; i < len ; i ++ ) {
90
97
rec = data [ i ] ;
91
- if ( this . matchRecord ( rec , expressionsTree ) && this . matchRecord ( rec , advancedExpressionsTree ) ) {
98
+ if ( this . matchRecord ( rec , expressionsTree , grid ) && this . matchRecord ( rec , advancedExpressionsTree , grid ) ) {
92
99
res . push ( rec ) ;
93
100
}
94
101
}
95
102
return res ;
96
103
}
97
104
98
- protected getFieldValue ( rec : object , fieldName : string ) : any {
99
- return resolveNestedPath ( rec , fieldName ) ;
105
+ protected getFieldValue ( rec : object , fieldName : string , isDate : boolean = false ) : any {
106
+ let value = resolveNestedPath ( rec , fieldName ) ;
107
+ value = value && isDate ? parseDate ( value ) : value ;
108
+ return value ;
100
109
}
101
110
}
0 commit comments