Skip to content

Commit a892a57

Browse files
MKirovaMKirova
authored andcommitted
chore(*): Add handling for different date related dataTypes on column.
1 parent a17df96 commit a892a57

File tree

4 files changed

+70
-16
lines changed

4 files changed

+70
-16
lines changed

projects/igniteui-angular/src/lib/data-operations/data-util.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { DefaultMergeStrategy, IGridMergeStrategy } from './merge-strategy';
2525
/**
2626
* @hidden
2727
*/
28-
export const DataType = {
28+
export const DataType = {
2929
String: 'string',
3030
Number: 'number',
3131
Boolean: 'boolean',
@@ -95,10 +95,20 @@ export class DataUtil {
9595
): any[] {
9696
let result = [];
9797
for (const col of columns) {
98-
strategy.merge(data, col.field, col.mergingComparer, result, activeRowIndexes, grid);
98+
const isDate = col?.dataType === 'date' || col?.dataType === 'dateTime';
99+
const isTime = col?.dataType === 'time' || col?.dataType === 'dateTime';
100+
strategy.merge(
101+
data,
102+
col.field,
103+
col.mergingComparer,
104+
result,
105+
activeRowIndexes,
106+
isDate,
107+
isTime,
108+
grid);
99109
}
100110
return result;
101-
}
111+
}
102112

103113
public static page<T>(data: T[], state: IPagingState, dataLength?: number): T[] {
104114
if (!state) {

projects/igniteui-angular/src/lib/data-operations/merge-strategy.ts

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { columnFieldPath, parseDate, resolveNestedPath } from '../core/utils';
12
import { 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

105147
export 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

124166
export 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);

projects/igniteui-angular/src/lib/grids/grid/cell-merge.spec.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,6 +1021,8 @@ class NoopMergeStrategy extends DefaultMergeStrategy {
10211021
comparer: (prevRecord: any, record: any, field: string) => boolean = this.comparer,
10221022
result: any[],
10231023
activeRowIndexes: number[],
1024+
isDate?: boolean,
1025+
isTime?: boolean,
10241026
grid?: GridType
10251027
) {
10261028
return data;

src/app/grid-cellMerging/grid-cellMerging.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ <h4 class="sample-title">Grid with cell merge</h4>
5252
</igx-column>
5353
<igx-column field="ShipCountry" header="Ship Country" width="200px" [merge]="true" sortable="true">
5454
</igx-column>
55-
<igx-column field="OrderDate" header="Order Date" width="200px" [dataType]="'date'" sortable="true">
55+
<igx-column field="OrderDate" header="Order Date" width="200px" [merge]="true" [groupable]="true" [dataType]="'date'" sortable="true">
5656
</igx-column>
5757
<igx-column field="PostalCode" header="Postal Code" width="200px" >
5858
</igx-column>

0 commit comments

Comments
 (0)