Skip to content

Commit 2a63e69

Browse files
committed
fix(pivot-grid): do not apply currency data type on values with count aggregator
1 parent 212f811 commit 2a63e69

File tree

4 files changed

+123
-3
lines changed

4 files changed

+123
-3
lines changed

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
@@ -48,6 +48,8 @@ import { IgxIconComponent } from "../../icon/icon.component";
4848
import { IgxInputGroupComponent } from "../../input-group/input-group.component";
4949
import { fadeIn, fadeOut } from 'igniteui-angular/animations';
5050
import { Size } from '../common/enums';
51+
import { GridColumnDataType } from '../../data-operations/data-util';
52+
import { IgxPivotGridStateService } from './pivot-grid-state.service';
5153

5254
interface IDataSelectorPanel {
5355
name: string;
@@ -251,7 +253,7 @@ export class IgxPivotDataSelectorComponent {
251253
return this._grid?.pivotConfiguration.values || [];
252254
}
253255

254-
constructor(private renderer: Renderer2, private cdr: ChangeDetectorRef) { }
256+
constructor(private renderer: Renderer2, private cdr: ChangeDetectorRef, private pivotStateService: IgxPivotGridStateService) { }
255257

256258
/**
257259
* @hidden @internal
@@ -518,8 +520,37 @@ export class IgxPivotDataSelectorComponent {
518520
* @internal
519521
*/
520522
public onAggregationChange(event: ISelectionEventArgs) {
523+
const valueMember = this.value.member;
524+
const columns = this.grid.columns;
525+
521526
if (!this.isSelected(event.newSelection.value)) {
522527
this.value.aggregate = event.newSelection.value;
528+
529+
const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count';
530+
const isSingleValue = this.grid.values.length === 1;
531+
532+
columns.forEach(column => {
533+
const isRelevantColumn = column.field?.includes(valueMember);
534+
const isCurrencyColumn = column.dataType === GridColumnDataType.Currency;
535+
536+
if (isSingleValue) {
537+
if (isCountAggregator && isCurrencyColumn) {
538+
column.dataType = GridColumnDataType.Number;
539+
this.pivotStateService.addCurrencyColumn(valueMember);
540+
} else if (this.pivotStateService.isCurrencyColumn(valueMember)) {
541+
column.dataType = GridColumnDataType.Currency;
542+
}
543+
} else if (isRelevantColumn) {
544+
if (isCountAggregator && isCurrencyColumn) {
545+
column.dataType = GridColumnDataType.Number;
546+
this.pivotStateService.addCurrencyColumn(valueMember);
547+
} else if (this.pivotStateService.isCurrencyColumn(valueMember)) {
548+
column.dataType = GridColumnDataType.Currency;
549+
this.pivotStateService.removeCurrencyColumn(valueMember);
550+
}
551+
}
552+
});
553+
523554
this.grid.pipeTrigger++;
524555
this.grid.cdr.markForCheck();
525556
}
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;
@@ -1031,6 +1032,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
10311032
summaryService: IgxGridSummaryService,
10321033
@Inject(LOCALE_ID) localeId: string,
10331034
platform: PlatformUtil,
1035+
private pivotStateService: IgxPivotGridStateService,
10341036
@Optional() @Inject(IgxGridTransaction) _diTransactions?: TransactionService<Transaction, State>
10351037
) {
10361038
super(
@@ -2281,11 +2283,18 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
22812283
if (fields.size === 0) {
22822284
this.values.forEach((value) => {
22832285
const ref = createComponent(IgxColumnComponent, { environmentInjector: this.envInjector, elementInjector: this.injector });
2286+
let columnDataType = value.dataType || this.resolveDataTypes(data.length ? data[0][value.member] : null);
2287+
2288+
if (value.aggregate?.key?.toLowerCase() === 'count' && columnDataType === GridColumnDataType.Currency) {
2289+
this.pivotStateService.addCurrencyColumn(value.member);
2290+
columnDataType = GridColumnDataType.Number;
2291+
}
2292+
22842293
ref.instance.header = value.displayName;
22852294
ref.instance.field = value.member;
22862295
ref.instance.parent = parent;
22872296
ref.instance.sortable = true;
2288-
ref.instance.dataType = value.dataType || this.resolveDataTypes(data.length ? data[0][value.member] : null);
2297+
ref.instance.dataType = columnDataType;
22892298
ref.instance.formatter = value.formatter;
22902299
columns.push(ref.instance);
22912300
});
@@ -2299,9 +2308,35 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
22992308
}
23002309
if (shouldGenerate && (value.children == null || value.children.length === 0 || value.children.size === 0)) {
23012310
const col = this.createColumnForDimension(value, data, parent, this.hasMultipleValues);
2311+
2312+
this.values.forEach((aggregatorValue) => {
2313+
if (col.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') {
2314+
col.dataType = GridColumnDataType.Number;
2315+
this.pivotStateService.addCurrencyColumn(aggregatorValue.member);
2316+
} else if (this.pivotStateService.isCurrencyColumn(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') {
2317+
col.dataType = GridColumnDataType.Currency;
2318+
this.pivotStateService.removeCurrencyColumn(aggregatorValue.member);
2319+
}
2320+
})
2321+
23022322
columns.push(col);
23032323
if (this.hasMultipleValues) {
23042324
const measureChildren = this.getMeasureChildren(data, col, false, value.dimension.width);
2325+
2326+
measureChildren.forEach((child) => {
2327+
this.values.forEach((aggregatorValue) => {
2328+
if (child.field.includes(aggregatorValue.member)) {
2329+
if (child.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') {
2330+
child.dataType = GridColumnDataType.Number;
2331+
this.pivotStateService.addCurrencyColumn(aggregatorValue.member);
2332+
} else if (this.pivotStateService.isCurrencyColumn(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') {
2333+
child.dataType = GridColumnDataType.Currency;
2334+
this.pivotStateService.removeCurrencyColumn(aggregatorValue.member);
2335+
}
2336+
}
2337+
})
2338+
})
2339+
23052340
col.children.reset(measureChildren);
23062341
columns = columns.concat(measureChildren);
23072342
}

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 { NgIf, NgFor, 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
*
@@ -140,6 +142,7 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem
140142
ref: ElementRef<HTMLElement>,
141143
cdr: ChangeDetectorRef,
142144
protected renderer: Renderer2,
145+
private pivotStateService: IgxPivotGridStateService
143146
) {
144147
super(ref, cdr);
145148
}
@@ -409,8 +412,37 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem
409412
* @internal
410413
*/
411414
public onAggregationChange(event: ISelectionEventArgs) {
415+
const valueMember = this.value.member;
416+
const columns = this.grid.columns;
417+
412418
if (!this.isSelected(event.newSelection.value)) {
413419
this.value.aggregate = event.newSelection.value;
420+
421+
const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count';
422+
const isSingleValue = this.grid.values.length === 1;
423+
424+
columns.forEach(column => {
425+
const isRelevantColumn = column.field?.includes(valueMember);
426+
const isCurrencyColumn = column.dataType === GridColumnDataType.Currency;
427+
428+
if (isSingleValue) {
429+
if (isCountAggregator && isCurrencyColumn) {
430+
column.dataType = GridColumnDataType.Number;
431+
this.pivotStateService.addCurrencyColumn(valueMember);
432+
} else if (this.pivotStateService.isCurrencyColumn(valueMember)) {
433+
column.dataType = GridColumnDataType.Currency;
434+
}
435+
} else if (isRelevantColumn) {
436+
if (isCountAggregator && isCurrencyColumn) {
437+
column.dataType = GridColumnDataType.Number;
438+
this.pivotStateService.addCurrencyColumn(valueMember);
439+
} else if (this.pivotStateService.isCurrencyColumn(valueMember)) {
440+
column.dataType = GridColumnDataType.Currency;
441+
this.pivotStateService.removeCurrencyColumn(valueMember);
442+
}
443+
}
444+
});
445+
414446
this.grid.pipeTrigger++;
415447
}
416448
}

0 commit comments

Comments
 (0)