1
- import { cloneArray , resolveNestedPath } from '../core/utils' ;
1
+ import { cloneArray , resolveNestedPath , parseDate } from '../core/utils' ;
2
2
import { IGroupByRecord } from './groupby-record.interface' ;
3
3
import { ISortingExpression , SortingDirection } from './sorting-expression.interface' ;
4
4
import { IGroupingExpression } from './grouping-expression.interface' ;
5
5
import { IGroupingState } from './groupby-state.interface' ;
6
6
import { IGroupByExpandState } from './groupby-expand-state.interface' ;
7
7
import { IGroupByResult } from './grouping-result.interface' ;
8
8
import { getHierarchy , isHierarchyMatch } from './operations' ;
9
+ import { GridType } from '../grids/common/grid.interface' ;
10
+
11
+ const DATE_TYPE = 'date' ;
9
12
10
13
export interface ISortingStrategy {
11
14
sort : ( data : any [ ] ,
12
15
fieldName : string ,
13
16
dir : SortingDirection ,
14
17
ignoreCase : boolean ,
15
- valueResolver : ( obj : any , key : string ) => any ) => any [ ] ;
18
+ valueResolver : ( obj : any , key : string , isDate ?: boolean ) => any ,
19
+ isDate ?: boolean ) => any [ ] ;
16
20
}
17
21
18
22
export class DefaultSortingStrategy implements ISortingStrategy {
@@ -28,11 +32,12 @@ export class DefaultSortingStrategy implements ISortingStrategy {
28
32
fieldName : string ,
29
33
dir : SortingDirection ,
30
34
ignoreCase : boolean ,
31
- valueResolver : ( obj : any , key : string ) => any ) {
35
+ valueResolver : ( obj : any , key : string , isDate ?: boolean ) => any ,
36
+ isDate ?: boolean ) {
32
37
const key = fieldName ;
33
38
const reverse = ( dir === SortingDirection . Desc ? - 1 : 1 ) ;
34
39
const cmpFunc = ( obj1 , obj2 ) => {
35
- return this . compareObjects ( obj1 , obj2 , key , reverse , ignoreCase , valueResolver ) ;
40
+ return this . compareObjects ( obj1 , obj2 , key , reverse , ignoreCase , valueResolver , isDate ) ;
36
41
} ;
37
42
return this . arraySort ( data , cmpFunc ) ;
38
43
}
@@ -56,9 +61,10 @@ export class DefaultSortingStrategy implements ISortingStrategy {
56
61
key : string ,
57
62
reverse : number ,
58
63
ignoreCase : boolean ,
59
- valueResolver : ( obj : any , key : string ) => any ) {
60
- let a = valueResolver ( obj1 , key ) ;
61
- let b = valueResolver ( obj2 , key ) ;
64
+ valueResolver : ( obj : any , key : string , isDate ?: boolean ) => any ,
65
+ isDate : boolean ) {
66
+ let a = valueResolver ( obj1 , key , isDate ) ;
67
+ let b = valueResolver ( obj2 , key , isDate ) ;
62
68
if ( ignoreCase ) {
63
69
a = a && a . toLowerCase ? a . toLowerCase ( ) : a ;
64
70
b = b && b . toLowerCase ? b . toLowerCase ( ) : b ;
@@ -72,7 +78,7 @@ export class DefaultSortingStrategy implements ISortingStrategy {
72
78
}
73
79
74
80
export interface IGridSortingStrategy {
75
- sort ( data : any [ ] , expressions : ISortingExpression [ ] ) : any [ ] ;
81
+ sort ( data : any [ ] , expressions : ISortingExpression [ ] , grid ?: GridType ) : any [ ] ;
76
82
}
77
83
78
84
export class NoopSortingStrategy implements IGridSortingStrategy {
@@ -90,24 +96,25 @@ export class NoopSortingStrategy implements IGridSortingStrategy {
90
96
}
91
97
92
98
export class IgxSorting implements IGridSortingStrategy {
93
- public sort ( data : any [ ] , expressions : ISortingExpression [ ] ) : any [ ] {
94
- return this . sortDataRecursive ( data , expressions ) ;
99
+ public sort ( data : any [ ] , expressions : ISortingExpression [ ] , grid ?: GridType ) : any [ ] {
100
+ return this . sortDataRecursive ( data , expressions , 0 , grid ) ;
95
101
}
96
102
97
103
private groupedRecordsByExpression ( data : any [ ] ,
98
104
index : number ,
99
- expression : IGroupingExpression ) : any [ ] {
105
+ expression : IGroupingExpression ,
106
+ isDate : boolean = false ) : any [ ] {
100
107
let i ;
101
108
let groupval ;
102
109
const res = [ ] ;
103
110
const key = expression . fieldName ;
104
111
const len = data . length ;
105
112
res . push ( data [ index ] ) ;
106
- groupval = this . getFieldValue ( data [ index ] , key ) ;
113
+ groupval = this . getFieldValue ( data [ index ] , key , isDate ) ;
107
114
index ++ ;
108
115
const comparer = expression . groupingComparer || DefaultSortingStrategy . instance ( ) . compareValues ;
109
116
for ( i = index ; i < len ; i ++ ) {
110
- if ( comparer ( this . getFieldValue ( data [ i ] , key ) , groupval ) === 0 ) {
117
+ if ( comparer ( this . getFieldValue ( data [ i ] , key , isDate ) , groupval ) === 0 ) {
111
118
res . push ( data [ i ] ) ;
112
119
} else {
113
120
break ;
@@ -117,7 +124,8 @@ export class IgxSorting implements IGridSortingStrategy {
117
124
}
118
125
private sortDataRecursive < T > ( data : T [ ] ,
119
126
expressions : ISortingExpression [ ] ,
120
- expressionIndex : number = 0 ) : T [ ] {
127
+ expressionIndex : number = 0 ,
128
+ grid : GridType ) : T [ ] {
121
129
let i ;
122
130
let j ;
123
131
let expr : ISortingExpression ;
@@ -133,16 +141,18 @@ export class IgxSorting implements IGridSortingStrategy {
133
141
if ( ! expr . strategy ) {
134
142
expr . strategy = DefaultSortingStrategy . instance ( ) ;
135
143
}
136
- data = expr . strategy . sort ( data , expr . fieldName , expr . dir , expr . ignoreCase , this . getFieldValue ) ;
144
+ const isDate = grid && grid . getColumnByName ( expr . fieldName ) ?
145
+ grid . getColumnByName ( expr . fieldName ) . dataType === DATE_TYPE : false ;
146
+ data = expr . strategy . sort ( data , expr . fieldName , expr . dir , expr . ignoreCase , this . getFieldValue , isDate ) ;
137
147
if ( expressionIndex === exprsLen - 1 ) {
138
148
return data ;
139
149
}
140
150
// in case of multiple sorting
141
151
for ( i = 0 ; i < dataLen ; i ++ ) {
142
- gbData = this . groupedRecordsByExpression ( data , i , expr ) ;
152
+ gbData = this . groupedRecordsByExpression ( data , i , expr , isDate ) ;
143
153
gbDataLen = gbData . length ;
144
154
if ( gbDataLen > 1 ) {
145
- gbData = this . sortDataRecursive ( gbData , expressions , expressionIndex + 1 ) ;
155
+ gbData = this . sortDataRecursive ( gbData , expressions , expressionIndex + 1 , grid ) ;
146
156
}
147
157
for ( j = 0 ; j < gbDataLen ; j ++ ) {
148
158
data [ i + j ] = gbData [ j ] ;
@@ -152,20 +162,21 @@ export class IgxSorting implements IGridSortingStrategy {
152
162
return data ;
153
163
}
154
164
protected groupDataRecursive < T > ( data : T [ ] , state : IGroupingState , level : number ,
155
- parent : IGroupByRecord , metadata : IGroupByRecord [ ] , grid : any = null ,
165
+ parent : IGroupByRecord , metadata : IGroupByRecord [ ] , grid : GridType = null ,
156
166
groupsRecords : any [ ] = [ ] , fullResult : IGroupByResult = { data : [ ] , metadata : [ ] } ) : T [ ] {
157
167
const expressions = state . expressions ;
158
168
const expansion = state . expansion ;
159
169
let i = 0 ;
160
170
let result = [ ] ;
161
171
while ( i < data . length ) {
162
- const group = this . groupedRecordsByExpression ( data , i , expressions [ level ] ) ;
163
172
const column = grid ? grid . getColumnByName ( expressions [ level ] . fieldName ) : null ;
173
+ const isDate = column ?. dataType === DATE_TYPE ;
174
+ const group = this . groupedRecordsByExpression ( data , i , expressions [ level ] , isDate ) ;
164
175
const groupRow : IGroupByRecord = {
165
176
expression : expressions [ level ] ,
166
177
level,
167
178
records : cloneArray ( group ) ,
168
- value : this . getFieldValue ( group [ 0 ] , expressions [ level ] . fieldName ) ,
179
+ value : this . getFieldValue ( group [ 0 ] , expressions [ level ] . fieldName , isDate ) ,
169
180
groupParent : parent ,
170
181
groups : [ ] ,
171
182
height : grid ? grid . renderedRowHeight : null ,
@@ -205,14 +216,14 @@ export class IgxSorting implements IGridSortingStrategy {
205
216
}
206
217
return result ;
207
218
}
208
- protected getFieldValue ( obj : any , key : string ) : any {
209
- return resolveNestedPath ( obj , key ) ;
219
+ protected getFieldValue ( obj : any , key : string , isDate : boolean = false ) : any {
220
+ return isDate ? parseDate ( resolveNestedPath ( obj , key ) ) : resolveNestedPath ( obj , key ) ;
210
221
}
211
222
}
212
223
213
224
export class IgxDataRecordSorting extends IgxSorting {
214
225
215
- protected getFieldValue ( obj : any , key : string ) : any {
216
- return resolveNestedPath ( obj . data , key ) ;
226
+ protected getFieldValue ( obj : any , key : string , isDate : boolean = false ) : any {
227
+ return isDate ? parseDate ( resolveNestedPath ( obj . data , key ) ) : resolveNestedPath ( obj . data , key ) ;
217
228
}
218
229
}
0 commit comments