1+ import { columnFieldPath , parseDate , resolveNestedPath } from '../core/utils' ;
12import { GridType } from '../grids/common/grid.interface' ;
23
34
@@ -28,7 +29,11 @@ export interface IGridMergeStrategy {
2829 result : any [ ] ,
2930 /* The active row indexes, where merging should break the sequence. */
3031 activeRowIndexes : number [ ] ,
31- /* Optional reference to the grid */
32+ /* (Optional) Indicates if the field is of type Date. */
33+ isDate ?: boolean ,
34+ /* (Optional) Indicates if the field is of type Time. */
35+ isTime ?: boolean ,
36+ /* (Optional) Reference to the grid */
3237 grid ?: GridType
3338 ) => any [ ] ;
3439 /**
@@ -48,9 +53,11 @@ export class DefaultMergeStrategy implements IGridMergeStrategy {
4853 public merge (
4954 data : any [ ] ,
5055 field : string ,
51- comparer : ( prevRecord : any , record : any , field : string ) => boolean = this . comparer ,
56+ comparer : ( prevRecord : any , record : any , field : string , isDate ?: boolean , isTime ?: boolean ) => boolean = this . comparer ,
5257 result : any [ ] ,
5358 activeRowIndexes : number [ ] ,
59+ isDate = false ,
60+ isTime = false ,
5461 grid ?: GridType
5562 ) {
5663 let prev = null ;
@@ -69,7 +76,7 @@ export class DefaultMergeStrategy implements IGridMergeStrategy {
6976 }
7077 let recToUpdateData = recData ?? { recordRef : grid . isGhostRecord ( rec ) ? rec . recordRef : rec , cellMergeMeta : new Map < string , IMergeByResult > ( ) , ghostRecord : rec . ghostRecord } ;
7178 recToUpdateData . cellMergeMeta . set ( field , { rowSpan : 1 } ) ;
72- if ( prev && comparer ( prev . recordRef , recToUpdateData . recordRef , field ) && prev . ghostRecord === recToUpdateData . ghostRecord ) {
79+ if ( prev && comparer . call ( this , prev . recordRef , recToUpdateData . recordRef , field , isDate , isTime ) && prev . ghostRecord === recToUpdateData . ghostRecord ) {
7380 const root = prev . cellMergeMeta . get ( field ) ?. root ?? prev ;
7481 root . cellMergeMeta . get ( field ) . rowSpan += 1 ;
7582 recToUpdateData . cellMergeMeta . get ( field ) . root = root ;
@@ -84,9 +91,9 @@ export class DefaultMergeStrategy implements IGridMergeStrategy {
8491 }
8592
8693 /* blazorSuppress */
87- public comparer ( prevRecord : any , record : any , field : string ) : boolean {
88- const a = prevRecord [ field ] ;
89- const b = record [ field ] ;
94+ public comparer ( prevRecord : any , record : any , field : string , isDate = false , isTime = false ) : boolean {
95+ const a = this . getFieldValue ( prevRecord , field , isDate , isTime ) ;
96+ const b = this . getFieldValue ( record , field , isDate , isTime ) ;
9097 const an = ( a === null || a === undefined ) ;
9198 const bn = ( b === null || b === undefined ) ;
9299 if ( an ) {
@@ -99,14 +106,49 @@ export class DefaultMergeStrategy implements IGridMergeStrategy {
99106 }
100107 return a === b ;
101108 }
109+
110+ /**
111+ * Retrieves the value of the specified field from the given object, considering date and time data types.
112+ * `key`: The key of the field to retrieve.
113+ * `isDate`: (Optional) Indicates if the field is of type Date.
114+ * `isTime`: (Optional) Indicates if the field is of type Time.
115+ * Returns the value of the specified field in the data object.
116+ * @internal
117+ */
118+ protected getFieldValue < T > ( obj : T , key : string , isDate = false , isTime = false ) {
119+ let resolvedValue = resolveNestedPath ( obj , columnFieldPath ( key ) ) ;
120+ if ( isDate || isTime ) {
121+ resolvedValue = this . getDateValue ( resolvedValue , isDate , isTime ) ;
122+ }
123+ return resolvedValue ;
124+ }
125+
126+ /**
127+ * @internal
128+ */
129+ protected getDateValue < T > ( obj : T , isDate = false , isTime = false ) {
130+ let date = obj instanceof Date ? obj : parseDate ( obj ) ;
131+ let resolvedValue ;
132+ if ( isDate && isTime ) {
133+ // date + time
134+ resolvedValue = date . getTime ( ) ;
135+ } else if ( date && isDate && ! isTime ) {
136+ // date, but no time
137+ resolvedValue = new Date ( date . getFullYear ( ) , date . getMonth ( ) , date . getDate ( ) , 0 , 0 , 0 , 0 ) . getTime ( ) ;
138+ } else if ( date && isTime && ! isDate ) {
139+ // just time
140+ resolvedValue = new Date ( new Date ( ) . setHours ( date . getHours ( ) , date . getMinutes ( ) , date . getSeconds ( ) , date . getMilliseconds ( ) ) ) . getTime ( ) ;
141+ }
142+ return resolvedValue ;
143+ }
102144}
103145
104146
105147export class DefaultTreeGridMergeStrategy extends DefaultMergeStrategy {
106148 /* blazorSuppress */
107- public override comparer ( prevRecord : any , record : any , field : string ) : boolean {
108- const a = prevRecord . data [ field ] ;
109- const b = record . data [ field ] ;
149+ public override comparer ( prevRecord : any , record : any , field : string , isDate = false , isTime = false ) : boolean {
150+ const a = this . getFieldValue ( prevRecord . data , field , isDate , isTime ) ;
151+ const b = this . getFieldValue ( record . data , field , isDate , isTime ) ;
110152 const an = ( a === null || a === undefined ) ;
111153 const bn = ( b === null || b === undefined ) ;
112154 if ( an ) {
@@ -123,9 +165,9 @@ export class DefaultTreeGridMergeStrategy extends DefaultMergeStrategy {
123165
124166export class ByLevelTreeGridMergeStrategy extends DefaultMergeStrategy {
125167 /* blazorSuppress */
126- public override comparer ( prevRecord : any , record : any , field : string ) : boolean {
127- const a = prevRecord . data [ field ] ;
128- const b = record . data [ field ] ;
168+ public override comparer ( prevRecord : any , record : any , field : string , isDate = false , isTime = false ) : boolean {
169+ const a = this . getFieldValue ( prevRecord . data , field , isDate , isTime ) ;
170+ const b = this . getFieldValue ( record . data , field , isDate , isTime ) ;
129171 const levelA = prevRecord . level ;
130172 const levelB = record . level ;
131173 const an = ( a === null || a === undefined ) ;
0 commit comments