Skip to content

Commit 4e946d9

Browse files
committed
fix(pivot-grid): do not apply currency data type on values with count aggregator
1 parent cb515ea commit 4e946d9

4 files changed

Lines changed: 123 additions & 3 deletions

File tree

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ import { IgxIconComponent } from "../../icon/icon.component";
4747
import { IgxInputGroupComponent } from "../../input-group/input-group.component";
4848
import { fadeIn, fadeOut } from 'igniteui-angular/animations';
4949
import { Size } from '../common/enums';
50+
import { GridColumnDataType } from '../../data-operations/data-util';
51+
import { IgxPivotGridStateService } from './pivot-grid-state.service';
5052

5153
interface IDataSelectorPanel {
5254
name: string;
@@ -250,7 +252,7 @@ export class IgxPivotDataSelectorComponent {
250252
return this._grid?.pivotConfiguration.values || [];
251253
}
252254

253-
constructor(private renderer: Renderer2, private cdr: ChangeDetectorRef) { }
255+
constructor(private renderer: Renderer2, private cdr: ChangeDetectorRef, private pivotStateService: IgxPivotGridStateService) { }
254256

255257
/**
256258
* @hidden @internal
@@ -517,8 +519,37 @@ export class IgxPivotDataSelectorComponent {
517519
* @internal
518520
*/
519521
public onAggregationChange(event: ISelectionEventArgs) {
522+
const valueMember = this.value.member;
523+
const columns = this.grid.columns;
524+
520525
if (!this.isSelected(event.newSelection.value)) {
521526
this.value.aggregate = event.newSelection.value;
527+
528+
const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count';
529+
const isSingleValue = this.grid.values.length === 1;
530+
531+
columns.forEach(column => {
532+
const isRelevantColumn = column.field?.includes(valueMember);
533+
const isCurrencyColumn = column.dataType === GridColumnDataType.Currency;
534+
535+
if (isSingleValue) {
536+
if (isCountAggregator && isCurrencyColumn) {
537+
column.dataType = GridColumnDataType.Number;
538+
this.pivotStateService.addCurrencyColumn(valueMember);
539+
} else if (this.pivotStateService.isCurrencyColumn(valueMember)) {
540+
column.dataType = GridColumnDataType.Currency;
541+
}
542+
} else if (isRelevantColumn) {
543+
if (isCountAggregator && isCurrencyColumn) {
544+
column.dataType = GridColumnDataType.Number;
545+
this.pivotStateService.addCurrencyColumn(valueMember);
546+
} else if (this.pivotStateService.isCurrencyColumn(valueMember)) {
547+
column.dataType = GridColumnDataType.Currency;
548+
this.pivotStateService.removeCurrencyColumn(valueMember);
549+
}
550+
}
551+
});
552+
522553
this.grid.pipeTrigger++;
523554
this.grid.cdr.markForCheck();
524555
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { Injectable } from '@angular/core';
2+
3+
@Injectable({
4+
providedIn: 'root'
5+
})
6+
export class IgxPivotGridStateService {
7+
public currencyColumnSet: Set<string> = new Set();
8+
9+
constructor() {}
10+
11+
public addCurrencyColumn(columnName: string): void {
12+
this.currencyColumnSet.add(columnName);
13+
}
14+
15+
public removeCurrencyColumn(columnName: string): void {
16+
this.currencyColumnSet.delete(columnName);
17+
}
18+
19+
public isCurrencyColumn(columnName: string): boolean {
20+
return this.currencyColumnSet.has(columnName);
21+
}
22+
}

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ import { IgxPivotColumnResizingService } from '../resizing/pivot-grid/pivot-resi
7171
import { IgxFlatTransactionFactory, IgxOverlayService, State, Transaction, TransactionService } from '../../services/public_api';
7272
import { cloneArray, PlatformUtil, resizeObservable } from '../../core/utils';
7373
import { IgxPivotFilteringService } from './pivot-filtering.service';
74-
import { DataUtil } from '../../data-operations/data-util';
74+
import { DataUtil, GridColumnDataType } from '../../data-operations/data-util';
7575
import { IFilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
7676
import { IgxGridTransaction } from '../common/types';
7777
import { GridBaseAPIService } from '../api.service';
@@ -102,6 +102,7 @@ import { IgxTextHighlightService } from '../../directives/text-highlight/text-hi
102102
import { IgxPivotRowHeaderGroupComponent } from './pivot-row-header-group.component';
103103
import { IgxPivotDateDimension } from './pivot-grid-dimensions';
104104
import { IgxPivotRowDimensionMrlRowComponent } from './pivot-row-dimension-mrl-row.component';
105+
import { IgxPivotGridStateService } from './pivot-grid-state.service';
105106

106107
let NEXT_ID = 0;
107108
const MINIMUM_COLUMN_WIDTH = 200;
@@ -1028,6 +1029,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
10281029
summaryService: IgxGridSummaryService,
10291030
@Inject(LOCALE_ID) localeId: string,
10301031
platform: PlatformUtil,
1032+
private pivotStateService: IgxPivotGridStateService,
10311033
@Optional() @Inject(IgxGridTransaction) _diTransactions?: TransactionService<Transaction, State>
10321034
) {
10331035
super(
@@ -2280,11 +2282,18 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
22802282
if (fields.size === 0) {
22812283
this.values.forEach((value) => {
22822284
const ref = createComponent(IgxColumnComponent, { environmentInjector: this.envInjector, elementInjector: this.injector });
2285+
let columnDataType = value.dataType || this.resolveDataTypes(data.length ? data[0][value.member] : null);
2286+
2287+
if (value.aggregate?.key?.toLowerCase() === 'count' && columnDataType === GridColumnDataType.Currency) {
2288+
this.pivotStateService.addCurrencyColumn(value.member);
2289+
columnDataType = GridColumnDataType.Number;
2290+
}
2291+
22832292
ref.instance.header = value.displayName;
22842293
ref.instance.field = value.member;
22852294
ref.instance.parent = parent;
22862295
ref.instance.sortable = true;
2287-
ref.instance.dataType = value.dataType || this.resolveDataTypes(data.length ? data[0][value.member] : null);
2296+
ref.instance.dataType = columnDataType;
22882297
ref.instance.formatter = value.formatter;
22892298
columns.push(ref.instance);
22902299
});
@@ -2298,9 +2307,35 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
22982307
}
22992308
if (shouldGenerate && (value.children == null || value.children.length === 0 || value.children.size === 0)) {
23002309
const col = this.createColumnForDimension(value, data, parent, this.hasMultipleValues);
2310+
2311+
this.values.forEach((aggregatorValue) => {
2312+
if (col.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') {
2313+
col.dataType = GridColumnDataType.Number;
2314+
this.pivotStateService.addCurrencyColumn(aggregatorValue.member);
2315+
} else if (this.pivotStateService.isCurrencyColumn(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') {
2316+
col.dataType = GridColumnDataType.Currency;
2317+
this.pivotStateService.removeCurrencyColumn(aggregatorValue.member);
2318+
}
2319+
})
2320+
23012321
columns.push(col);
23022322
if (this.hasMultipleValues) {
23032323
const measureChildren = this.getMeasureChildren(data, col, false, value.dimension.width);
2324+
2325+
measureChildren.forEach((child) => {
2326+
this.values.forEach((aggregatorValue) => {
2327+
if (child.field.includes(aggregatorValue.member)) {
2328+
if (child.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') {
2329+
child.dataType = GridColumnDataType.Number;
2330+
this.pivotStateService.addCurrencyColumn(aggregatorValue.member);
2331+
} else if (this.pivotStateService.isCurrencyColumn(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') {
2332+
child.dataType = GridColumnDataType.Currency;
2333+
this.pivotStateService.removeCurrencyColumn(aggregatorValue.member);
2334+
}
2335+
}
2336+
})
2337+
})
2338+
23042339
col.children.reset(measureChildren);
23052340
columns = columns.concat(measureChildren);
23062341
}

projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import { IgxDropDirective } from '../../directives/drag-drop/drag-drop.directive
3838
import { NgTemplateOutlet, NgClass, NgStyle } from '@angular/common';
3939
import { IgxPivotRowHeaderGroupComponent } from './pivot-row-header-group.component';
4040
import { IgxPivotRowDimensionHeaderGroupComponent } from './pivot-row-dimension-header-group.component';
41+
import { GridColumnDataType } from '../../data-operations/data-util';
42+
import { IgxPivotGridStateService } from './pivot-grid-state.service';
4143

4244
/**
4345
*
@@ -139,6 +141,7 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem
139141
ref: ElementRef<HTMLElement>,
140142
cdr: ChangeDetectorRef,
141143
protected renderer: Renderer2,
144+
private pivotStateService: IgxPivotGridStateService
142145
) {
143146
super(ref, cdr);
144147
}
@@ -408,8 +411,37 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem
408411
* @internal
409412
*/
410413
public onAggregationChange(event: ISelectionEventArgs) {
414+
const valueMember = this.value.member;
415+
const columns = this.grid.columns;
416+
411417
if (!this.isSelected(event.newSelection.value)) {
412418
this.value.aggregate = event.newSelection.value;
419+
420+
const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count';
421+
const isSingleValue = this.grid.values.length === 1;
422+
423+
columns.forEach(column => {
424+
const isRelevantColumn = column.field?.includes(valueMember);
425+
const isCurrencyColumn = column.dataType === GridColumnDataType.Currency;
426+
427+
if (isSingleValue) {
428+
if (isCountAggregator && isCurrencyColumn) {
429+
column.dataType = GridColumnDataType.Number;
430+
this.pivotStateService.addCurrencyColumn(valueMember);
431+
} else if (this.pivotStateService.isCurrencyColumn(valueMember)) {
432+
column.dataType = GridColumnDataType.Currency;
433+
}
434+
} else if (isRelevantColumn) {
435+
if (isCountAggregator && isCurrencyColumn) {
436+
column.dataType = GridColumnDataType.Number;
437+
this.pivotStateService.addCurrencyColumn(valueMember);
438+
} else if (this.pivotStateService.isCurrencyColumn(valueMember)) {
439+
column.dataType = GridColumnDataType.Currency;
440+
this.pivotStateService.removeCurrencyColumn(valueMember);
441+
}
442+
}
443+
});
444+
413445
this.grid.pipeTrigger++;
414446
}
415447
}

0 commit comments

Comments
 (0)