From 4e946d998f327ac5b183cf225a3e6ba7d2f05799 Mon Sep 17 00:00:00 2001 From: IMinchev64 Date: Fri, 28 Feb 2025 13:14:43 +0200 Subject: [PATCH 1/6] fix(pivot-grid): do not apply currency data type on values with count aggregator --- .../pivot-data-selector.component.ts | 33 +++++++++++++++- .../pivot-grid/pivot-grid-state.service.ts | 22 +++++++++++ .../grids/pivot-grid/pivot-grid.component.ts | 39 ++++++++++++++++++- .../pivot-grid/pivot-header-row.component.ts | 32 +++++++++++++++ 4 files changed, 123 insertions(+), 3 deletions(-) create mode 100644 projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid-state.service.ts diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts index 64ebfce8054..3f358d1cc65 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts @@ -47,6 +47,8 @@ import { IgxIconComponent } from "../../icon/icon.component"; import { IgxInputGroupComponent } from "../../input-group/input-group.component"; import { fadeIn, fadeOut } from 'igniteui-angular/animations'; import { Size } from '../common/enums'; +import { GridColumnDataType } from '../../data-operations/data-util'; +import { IgxPivotGridStateService } from './pivot-grid-state.service'; interface IDataSelectorPanel { name: string; @@ -250,7 +252,7 @@ export class IgxPivotDataSelectorComponent { return this._grid?.pivotConfiguration.values || []; } - constructor(private renderer: Renderer2, private cdr: ChangeDetectorRef) { } + constructor(private renderer: Renderer2, private cdr: ChangeDetectorRef, private pivotStateService: IgxPivotGridStateService) { } /** * @hidden @internal @@ -517,8 +519,37 @@ export class IgxPivotDataSelectorComponent { * @internal */ public onAggregationChange(event: ISelectionEventArgs) { + const valueMember = this.value.member; + const columns = this.grid.columns; + if (!this.isSelected(event.newSelection.value)) { this.value.aggregate = event.newSelection.value; + + const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count'; + const isSingleValue = this.grid.values.length === 1; + + columns.forEach(column => { + const isRelevantColumn = column.field?.includes(valueMember); + const isCurrencyColumn = column.dataType === GridColumnDataType.Currency; + + if (isSingleValue) { + if (isCountAggregator && isCurrencyColumn) { + column.dataType = GridColumnDataType.Number; + this.pivotStateService.addCurrencyColumn(valueMember); + } else if (this.pivotStateService.isCurrencyColumn(valueMember)) { + column.dataType = GridColumnDataType.Currency; + } + } else if (isRelevantColumn) { + if (isCountAggregator && isCurrencyColumn) { + column.dataType = GridColumnDataType.Number; + this.pivotStateService.addCurrencyColumn(valueMember); + } else if (this.pivotStateService.isCurrencyColumn(valueMember)) { + column.dataType = GridColumnDataType.Currency; + this.pivotStateService.removeCurrencyColumn(valueMember); + } + } + }); + this.grid.pipeTrigger++; this.grid.cdr.markForCheck(); } diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid-state.service.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid-state.service.ts new file mode 100644 index 00000000000..4d7cab22059 --- /dev/null +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid-state.service.ts @@ -0,0 +1,22 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class IgxPivotGridStateService { + public currencyColumnSet: Set = new Set(); + + constructor() {} + + public addCurrencyColumn(columnName: string): void { + this.currencyColumnSet.add(columnName); + } + + public removeCurrencyColumn(columnName: string): void { + this.currencyColumnSet.delete(columnName); + } + + public isCurrencyColumn(columnName: string): boolean { + return this.currencyColumnSet.has(columnName); + } +} diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts index 042519ef0c8..a453ef2acc7 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts @@ -71,7 +71,7 @@ import { IgxPivotColumnResizingService } from '../resizing/pivot-grid/pivot-resi import { IgxFlatTransactionFactory, IgxOverlayService, State, Transaction, TransactionService } from '../../services/public_api'; import { cloneArray, PlatformUtil, resizeObservable } from '../../core/utils'; import { IgxPivotFilteringService } from './pivot-filtering.service'; -import { DataUtil } from '../../data-operations/data-util'; +import { DataUtil, GridColumnDataType } from '../../data-operations/data-util'; import { IFilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree'; import { IgxGridTransaction } from '../common/types'; import { GridBaseAPIService } from '../api.service'; @@ -102,6 +102,7 @@ import { IgxTextHighlightService } from '../../directives/text-highlight/text-hi import { IgxPivotRowHeaderGroupComponent } from './pivot-row-header-group.component'; import { IgxPivotDateDimension } from './pivot-grid-dimensions'; import { IgxPivotRowDimensionMrlRowComponent } from './pivot-row-dimension-mrl-row.component'; +import { IgxPivotGridStateService } from './pivot-grid-state.service'; let NEXT_ID = 0; const MINIMUM_COLUMN_WIDTH = 200; @@ -1028,6 +1029,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni summaryService: IgxGridSummaryService, @Inject(LOCALE_ID) localeId: string, platform: PlatformUtil, + private pivotStateService: IgxPivotGridStateService, @Optional() @Inject(IgxGridTransaction) _diTransactions?: TransactionService ) { super( @@ -2280,11 +2282,18 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni if (fields.size === 0) { this.values.forEach((value) => { const ref = createComponent(IgxColumnComponent, { environmentInjector: this.envInjector, elementInjector: this.injector }); + let columnDataType = value.dataType || this.resolveDataTypes(data.length ? data[0][value.member] : null); + + if (value.aggregate?.key?.toLowerCase() === 'count' && columnDataType === GridColumnDataType.Currency) { + this.pivotStateService.addCurrencyColumn(value.member); + columnDataType = GridColumnDataType.Number; + } + ref.instance.header = value.displayName; ref.instance.field = value.member; ref.instance.parent = parent; ref.instance.sortable = true; - ref.instance.dataType = value.dataType || this.resolveDataTypes(data.length ? data[0][value.member] : null); + ref.instance.dataType = columnDataType; ref.instance.formatter = value.formatter; columns.push(ref.instance); }); @@ -2298,9 +2307,35 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni } if (shouldGenerate && (value.children == null || value.children.length === 0 || value.children.size === 0)) { const col = this.createColumnForDimension(value, data, parent, this.hasMultipleValues); + + this.values.forEach((aggregatorValue) => { + if (col.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') { + col.dataType = GridColumnDataType.Number; + this.pivotStateService.addCurrencyColumn(aggregatorValue.member); + } else if (this.pivotStateService.isCurrencyColumn(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { + col.dataType = GridColumnDataType.Currency; + this.pivotStateService.removeCurrencyColumn(aggregatorValue.member); + } + }) + columns.push(col); if (this.hasMultipleValues) { const measureChildren = this.getMeasureChildren(data, col, false, value.dimension.width); + + measureChildren.forEach((child) => { + this.values.forEach((aggregatorValue) => { + if (child.field.includes(aggregatorValue.member)) { + if (child.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') { + child.dataType = GridColumnDataType.Number; + this.pivotStateService.addCurrencyColumn(aggregatorValue.member); + } else if (this.pivotStateService.isCurrencyColumn(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { + child.dataType = GridColumnDataType.Currency; + this.pivotStateService.removeCurrencyColumn(aggregatorValue.member); + } + } + }) + }) + col.children.reset(measureChildren); columns = columns.concat(measureChildren); } diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts index 8ef6713927b..48b3726553c 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts @@ -38,6 +38,8 @@ import { IgxDropDirective } from '../../directives/drag-drop/drag-drop.directive import { NgTemplateOutlet, NgClass, NgStyle } from '@angular/common'; import { IgxPivotRowHeaderGroupComponent } from './pivot-row-header-group.component'; import { IgxPivotRowDimensionHeaderGroupComponent } from './pivot-row-dimension-header-group.component'; +import { GridColumnDataType } from '../../data-operations/data-util'; +import { IgxPivotGridStateService } from './pivot-grid-state.service'; /** * @@ -139,6 +141,7 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem ref: ElementRef, cdr: ChangeDetectorRef, protected renderer: Renderer2, + private pivotStateService: IgxPivotGridStateService ) { super(ref, cdr); } @@ -408,8 +411,37 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem * @internal */ public onAggregationChange(event: ISelectionEventArgs) { + const valueMember = this.value.member; + const columns = this.grid.columns; + if (!this.isSelected(event.newSelection.value)) { this.value.aggregate = event.newSelection.value; + + const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count'; + const isSingleValue = this.grid.values.length === 1; + + columns.forEach(column => { + const isRelevantColumn = column.field?.includes(valueMember); + const isCurrencyColumn = column.dataType === GridColumnDataType.Currency; + + if (isSingleValue) { + if (isCountAggregator && isCurrencyColumn) { + column.dataType = GridColumnDataType.Number; + this.pivotStateService.addCurrencyColumn(valueMember); + } else if (this.pivotStateService.isCurrencyColumn(valueMember)) { + column.dataType = GridColumnDataType.Currency; + } + } else if (isRelevantColumn) { + if (isCountAggregator && isCurrencyColumn) { + column.dataType = GridColumnDataType.Number; + this.pivotStateService.addCurrencyColumn(valueMember); + } else if (this.pivotStateService.isCurrencyColumn(valueMember)) { + column.dataType = GridColumnDataType.Currency; + this.pivotStateService.removeCurrencyColumn(valueMember); + } + } + }); + this.grid.pipeTrigger++; } } From 6cd017beea3da95e4f9c4caaba8122458257bf01 Mon Sep 17 00:00:00 2001 From: Ivan Minchev Date: Fri, 14 Mar 2025 11:36:53 +0200 Subject: [PATCH 2/6] refactor(pivot-grid): apply comments + minor fix to aggregation change logic --- .../src/lib/grids/common/grid.interface.ts | 2 ++ .../pivot-data-selector.component.ts | 18 +++++++++------ .../pivot-grid/pivot-grid-state.service.ts | 22 ------------------- .../grids/pivot-grid/pivot-grid.component.ts | 22 +++++++++---------- .../pivot-grid/pivot-header-row.component.ts | 19 +++++++++------- 5 files changed, 35 insertions(+), 48 deletions(-) delete mode 100644 projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid-state.service.ts diff --git a/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts b/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts index f0ea80c2def..ae3f000c204 100644 --- a/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts +++ b/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts @@ -1338,6 +1338,8 @@ export interface PivotGridType extends GridType { excelStyleFilterMinHeight: string; valueChipTemplate: TemplateRef; rowDimensionHeaderTemplate: TemplateRef; + /** @hidden @internal */ + currencyColumnSet: Set } export interface GridSVGIcon { diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts index 3f358d1cc65..22f6576a931 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts @@ -48,7 +48,6 @@ import { IgxInputGroupComponent } from "../../input-group/input-group.component" import { fadeIn, fadeOut } from 'igniteui-angular/animations'; import { Size } from '../common/enums'; import { GridColumnDataType } from '../../data-operations/data-util'; -import { IgxPivotGridStateService } from './pivot-grid-state.service'; interface IDataSelectorPanel { name: string; @@ -252,7 +251,7 @@ export class IgxPivotDataSelectorComponent { return this._grid?.pivotConfiguration.values || []; } - constructor(private renderer: Renderer2, private cdr: ChangeDetectorRef, private pivotStateService: IgxPivotGridStateService) { } + constructor(private renderer: Renderer2, private cdr: ChangeDetectorRef) { } /** * @hidden @internal @@ -527,6 +526,7 @@ export class IgxPivotDataSelectorComponent { const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count'; const isSingleValue = this.grid.values.length === 1; + let shouldRemoveFromSet: boolean = false; columns.forEach(column => { const isRelevantColumn = column.field?.includes(valueMember); @@ -535,21 +535,25 @@ export class IgxPivotDataSelectorComponent { if (isSingleValue) { if (isCountAggregator && isCurrencyColumn) { column.dataType = GridColumnDataType.Number; - this.pivotStateService.addCurrencyColumn(valueMember); - } else if (this.pivotStateService.isCurrencyColumn(valueMember)) { + this.grid.currencyColumnSet.add(valueMember); + } else if (this.grid.currencyColumnSet.has(valueMember)) { column.dataType = GridColumnDataType.Currency; } } else if (isRelevantColumn) { if (isCountAggregator && isCurrencyColumn) { column.dataType = GridColumnDataType.Number; - this.pivotStateService.addCurrencyColumn(valueMember); - } else if (this.pivotStateService.isCurrencyColumn(valueMember)) { + this.grid.currencyColumnSet.add(valueMember); + } else if (this.grid.currencyColumnSet.has(valueMember)) { column.dataType = GridColumnDataType.Currency; - this.pivotStateService.removeCurrencyColumn(valueMember); + shouldRemoveFromSet = true; } } }); + if (shouldRemoveFromSet) { + this.grid.currencyColumnSet.delete(valueMember); + } + this.grid.pipeTrigger++; this.grid.cdr.markForCheck(); } diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid-state.service.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid-state.service.ts deleted file mode 100644 index 4d7cab22059..00000000000 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid-state.service.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable({ - providedIn: 'root' -}) -export class IgxPivotGridStateService { - public currencyColumnSet: Set = new Set(); - - constructor() {} - - public addCurrencyColumn(columnName: string): void { - this.currencyColumnSet.add(columnName); - } - - public removeCurrencyColumn(columnName: string): void { - this.currencyColumnSet.delete(columnName); - } - - public isCurrencyColumn(columnName: string): boolean { - return this.currencyColumnSet.has(columnName); - } -} diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts index a453ef2acc7..fca26bed26f 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts @@ -36,7 +36,7 @@ import { IgxGridBaseDirective } from '../grid-base.directive'; import { IgxFilteringService } from '../filtering/grid-filtering.service'; import { IgxGridSelectionService } from '../selection/selection.service'; import { IgxForOfSyncService, IgxForOfScrollSyncService } from '../../directives/for-of/for_of.sync.service'; -import { ColumnType, GridType, IGX_GRID_BASE, IgxColumnTemplateContext, RowType } from '../common/grid.interface'; +import { ColumnType, GridType, IGX_GRID_BASE, IgxColumnTemplateContext, PivotGridType, RowType } from '../common/grid.interface'; import { IgxGridCRUDService } from '../common/crud.service'; import { IgxGridSummaryService } from '../summaries/grid-summary.service'; import { DEFAULT_PIVOT_KEYS, IDimensionsChange, IgxPivotGridValueTemplateContext, IPivotConfiguration, IPivotConfigurationChangedEventArgs, IPivotDimension, IPivotValue, IValuesChange, PivotDimensionType, IPivotUISettings, PivotRowLayoutType, PivotSummaryPosition } from './pivot-grid.interface'; @@ -102,7 +102,6 @@ import { IgxTextHighlightService } from '../../directives/text-highlight/text-hi import { IgxPivotRowHeaderGroupComponent } from './pivot-row-header-group.component'; import { IgxPivotDateDimension } from './pivot-grid-dimensions'; import { IgxPivotRowDimensionMrlRowComponent } from './pivot-row-dimension-mrl-row.component'; -import { IgxPivotGridStateService } from './pivot-grid-state.service'; let NEXT_ID = 0; const MINIMUM_COLUMN_WIDTH = 200; @@ -197,7 +196,7 @@ const MINIMUM_COLUMN_WIDTH_SUPER_COMPACT = 104; schemas: [CUSTOM_ELEMENTS_SCHEMA] }) export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnInit, AfterContentInit, - GridType, AfterViewInit, OnChanges { + PivotGridType, AfterViewInit, OnChanges { /** * Emitted when the dimension collection is changed via the grid chip area. @@ -1029,7 +1028,6 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni summaryService: IgxGridSummaryService, @Inject(LOCALE_ID) localeId: string, platform: PlatformUtil, - private pivotStateService: IgxPivotGridStateService, @Optional() @Inject(IgxGridTransaction) _diTransactions?: TransactionService ) { super( @@ -2277,6 +2275,8 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni return hierarchy; } + /** @hidden @internal */ + public currencyColumnSet: Set = new Set(); protected generateColumnHierarchy(fields: Map, data, parent = null): IgxColumnComponent[] { let columns = []; if (fields.size === 0) { @@ -2285,7 +2285,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni let columnDataType = value.dataType || this.resolveDataTypes(data.length ? data[0][value.member] : null); if (value.aggregate?.key?.toLowerCase() === 'count' && columnDataType === GridColumnDataType.Currency) { - this.pivotStateService.addCurrencyColumn(value.member); + this.currencyColumnSet.add(value.member); columnDataType = GridColumnDataType.Number; } @@ -2311,10 +2311,10 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni this.values.forEach((aggregatorValue) => { if (col.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') { col.dataType = GridColumnDataType.Number; - this.pivotStateService.addCurrencyColumn(aggregatorValue.member); - } else if (this.pivotStateService.isCurrencyColumn(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { + this.currencyColumnSet.add(aggregatorValue.member); + } else if (this.currencyColumnSet.has(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { col.dataType = GridColumnDataType.Currency; - this.pivotStateService.removeCurrencyColumn(aggregatorValue.member); + this.currencyColumnSet.delete(aggregatorValue.member); } }) @@ -2327,10 +2327,10 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni if (child.field.includes(aggregatorValue.member)) { if (child.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') { child.dataType = GridColumnDataType.Number; - this.pivotStateService.addCurrencyColumn(aggregatorValue.member); - } else if (this.pivotStateService.isCurrencyColumn(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { + this.currencyColumnSet.add(aggregatorValue.member); + } else if (this.currencyColumnSet.has(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { child.dataType = GridColumnDataType.Currency; - this.pivotStateService.removeCurrencyColumn(aggregatorValue.member); + this.currencyColumnSet.delete(aggregatorValue.member); } } }) diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts index 48b3726553c..0b98f23f0e8 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts @@ -39,7 +39,6 @@ import { NgTemplateOutlet, NgClass, NgStyle } from '@angular/common'; import { IgxPivotRowHeaderGroupComponent } from './pivot-row-header-group.component'; import { IgxPivotRowDimensionHeaderGroupComponent } from './pivot-row-dimension-header-group.component'; import { GridColumnDataType } from '../../data-operations/data-util'; -import { IgxPivotGridStateService } from './pivot-grid-state.service'; /** * @@ -140,8 +139,7 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem @Inject(IGX_GRID_BASE) public override grid: PivotGridType, ref: ElementRef, cdr: ChangeDetectorRef, - protected renderer: Renderer2, - private pivotStateService: IgxPivotGridStateService + protected renderer: Renderer2 ) { super(ref, cdr); } @@ -419,6 +417,7 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count'; const isSingleValue = this.grid.values.length === 1; + let shouldRemoveFromSet: boolean = false; columns.forEach(column => { const isRelevantColumn = column.field?.includes(valueMember); @@ -427,21 +426,25 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem if (isSingleValue) { if (isCountAggregator && isCurrencyColumn) { column.dataType = GridColumnDataType.Number; - this.pivotStateService.addCurrencyColumn(valueMember); - } else if (this.pivotStateService.isCurrencyColumn(valueMember)) { + this.grid.currencyColumnSet.add(valueMember); + } else if (this.grid.currencyColumnSet.has(valueMember)) { column.dataType = GridColumnDataType.Currency; } } else if (isRelevantColumn) { if (isCountAggregator && isCurrencyColumn) { column.dataType = GridColumnDataType.Number; - this.pivotStateService.addCurrencyColumn(valueMember); - } else if (this.pivotStateService.isCurrencyColumn(valueMember)) { + this.grid.currencyColumnSet.add(valueMember); + } else if (this.grid.currencyColumnSet.has(valueMember)) { column.dataType = GridColumnDataType.Currency; - this.pivotStateService.removeCurrencyColumn(valueMember); + shouldRemoveFromSet = true; } } }); + if (shouldRemoveFromSet) { + this.grid.currencyColumnSet.delete(valueMember); + } + this.grid.pipeTrigger++; } } From 4c5c837a3d5a76a5acafa050f81b55a63fc48871 Mon Sep 17 00:00:00 2001 From: Ivan Minchev Date: Fri, 14 Mar 2025 11:41:12 +0200 Subject: [PATCH 3/6] refactor(pivot-grid): move count aggregator handling to a separate method --- .../pivot-data-selector.component.ts | 66 ++++++++++--------- .../pivot-grid/pivot-header-row.component.ts | 60 +++++++++-------- 2 files changed, 67 insertions(+), 59 deletions(-) diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts index 22f6576a931..60f15615e83 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts @@ -518,47 +518,51 @@ export class IgxPivotDataSelectorComponent { * @internal */ public onAggregationChange(event: ISelectionEventArgs) { - const valueMember = this.value.member; - const columns = this.grid.columns; if (!this.isSelected(event.newSelection.value)) { this.value.aggregate = event.newSelection.value; - const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count'; - const isSingleValue = this.grid.values.length === 1; - let shouldRemoveFromSet: boolean = false; - - columns.forEach(column => { - const isRelevantColumn = column.field?.includes(valueMember); - const isCurrencyColumn = column.dataType === GridColumnDataType.Currency; - - if (isSingleValue) { - if (isCountAggregator && isCurrencyColumn) { - column.dataType = GridColumnDataType.Number; - this.grid.currencyColumnSet.add(valueMember); - } else if (this.grid.currencyColumnSet.has(valueMember)) { - column.dataType = GridColumnDataType.Currency; - } - } else if (isRelevantColumn) { - if (isCountAggregator && isCurrencyColumn) { - column.dataType = GridColumnDataType.Number; - this.grid.currencyColumnSet.add(valueMember); - } else if (this.grid.currencyColumnSet.has(valueMember)) { - column.dataType = GridColumnDataType.Currency; - shouldRemoveFromSet = true; - } - } - }); - - if (shouldRemoveFromSet) { - this.grid.currencyColumnSet.delete(valueMember); - } + this.handleCountAggregator(); this.grid.pipeTrigger++; this.grid.cdr.markForCheck(); } } + private handleCountAggregator() { + const valueMember = this.value.member; + const columns = this.grid.columns; + const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count'; + const isSingleValue = this.grid.values.length === 1; + let shouldRemoveFromSet: boolean = false; + + columns.forEach(column => { + const isRelevantColumn = column.field?.includes(valueMember); + const isCurrencyColumn = column.dataType === GridColumnDataType.Currency; + + if (isSingleValue) { + if (isCountAggregator && isCurrencyColumn) { + column.dataType = GridColumnDataType.Number; + this.grid.currencyColumnSet.add(valueMember); + } else if (this.grid.currencyColumnSet.has(valueMember)) { + column.dataType = GridColumnDataType.Currency; + } + } else if (isRelevantColumn) { + if (isCountAggregator && isCurrencyColumn) { + column.dataType = GridColumnDataType.Number; + this.grid.currencyColumnSet.add(valueMember); + } else if (this.grid.currencyColumnSet.has(valueMember)) { + column.dataType = GridColumnDataType.Currency; + shouldRemoveFromSet = true; + } + } + }); + + if (shouldRemoveFromSet) { + this.grid.currencyColumnSet.delete(valueMember); + } + } + /** * @hidden * @internal diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts index 0b98f23f0e8..15001ed2cc2 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts @@ -409,43 +409,47 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem * @internal */ public onAggregationChange(event: ISelectionEventArgs) { - const valueMember = this.value.member; - const columns = this.grid.columns; if (!this.isSelected(event.newSelection.value)) { this.value.aggregate = event.newSelection.value; - const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count'; - const isSingleValue = this.grid.values.length === 1; - let shouldRemoveFromSet: boolean = false; + this.handleCountAggregator(); - columns.forEach(column => { - const isRelevantColumn = column.field?.includes(valueMember); - const isCurrencyColumn = column.dataType === GridColumnDataType.Currency; + this.grid.pipeTrigger++; + } + } - if (isSingleValue) { - if (isCountAggregator && isCurrencyColumn) { - column.dataType = GridColumnDataType.Number; - this.grid.currencyColumnSet.add(valueMember); - } else if (this.grid.currencyColumnSet.has(valueMember)) { - column.dataType = GridColumnDataType.Currency; - } - } else if (isRelevantColumn) { - if (isCountAggregator && isCurrencyColumn) { - column.dataType = GridColumnDataType.Number; - this.grid.currencyColumnSet.add(valueMember); - } else if (this.grid.currencyColumnSet.has(valueMember)) { - column.dataType = GridColumnDataType.Currency; - shouldRemoveFromSet = true; - } + private handleCountAggregator() { + const valueMember = this.value.member; + const columns = this.grid.columns; + const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count'; + const isSingleValue = this.grid.values.length === 1; + let shouldRemoveFromSet: boolean = false; + + columns.forEach(column => { + const isRelevantColumn = column.field?.includes(valueMember); + const isCurrencyColumn = column.dataType === GridColumnDataType.Currency; + + if (isSingleValue) { + if (isCountAggregator && isCurrencyColumn) { + column.dataType = GridColumnDataType.Number; + this.grid.currencyColumnSet.add(valueMember); + } else if (this.grid.currencyColumnSet.has(valueMember)) { + column.dataType = GridColumnDataType.Currency; + } + } else if (isRelevantColumn) { + if (isCountAggregator && isCurrencyColumn) { + column.dataType = GridColumnDataType.Number; + this.grid.currencyColumnSet.add(valueMember); + } else if (this.grid.currencyColumnSet.has(valueMember)) { + column.dataType = GridColumnDataType.Currency; + shouldRemoveFromSet = true; } - }); - - if (shouldRemoveFromSet) { - this.grid.currencyColumnSet.delete(valueMember); } + }); - this.grid.pipeTrigger++; + if (shouldRemoveFromSet) { + this.grid.currencyColumnSet.delete(valueMember); } } From 038a4316058bbf541f3d8ce15cfe2b083d280c79 Mon Sep 17 00:00:00 2001 From: Ivan Minchev Date: Tue, 29 Apr 2025 10:21:05 +0300 Subject: [PATCH 4/6] refactor(pivot-grid): change logic for updating column data type --- .../src/lib/grids/common/grid.interface.ts | 2 - .../pivot-data-selector.component.ts | 37 +-------- .../grids/pivot-grid/pivot-grid.component.ts | 79 +++++++++---------- .../pivot-grid/pivot-header-row.component.ts | 37 +-------- .../src/lib/grids/pivot-grid/pivot-util.ts | 25 +++++- 5 files changed, 65 insertions(+), 115 deletions(-) diff --git a/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts b/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts index ae3f000c204..f0ea80c2def 100644 --- a/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts +++ b/projects/igniteui-angular/src/lib/grids/common/grid.interface.ts @@ -1338,8 +1338,6 @@ export interface PivotGridType extends GridType { excelStyleFilterMinHeight: string; valueChipTemplate: TemplateRef; rowDimensionHeaderTemplate: TemplateRef; - /** @hidden @internal */ - currencyColumnSet: Set } export interface GridSVGIcon { diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts index 60f15615e83..62de2a3d776 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts @@ -521,48 +521,15 @@ export class IgxPivotDataSelectorComponent { if (!this.isSelected(event.newSelection.value)) { this.value.aggregate = event.newSelection.value; + const isSingleValue = this.grid.values.length === 1; - this.handleCountAggregator(); + PivotUtil.handleCountAggregator(this.grid.columns, this.value, isSingleValue); this.grid.pipeTrigger++; this.grid.cdr.markForCheck(); } } - private handleCountAggregator() { - const valueMember = this.value.member; - const columns = this.grid.columns; - const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count'; - const isSingleValue = this.grid.values.length === 1; - let shouldRemoveFromSet: boolean = false; - - columns.forEach(column => { - const isRelevantColumn = column.field?.includes(valueMember); - const isCurrencyColumn = column.dataType === GridColumnDataType.Currency; - - if (isSingleValue) { - if (isCountAggregator && isCurrencyColumn) { - column.dataType = GridColumnDataType.Number; - this.grid.currencyColumnSet.add(valueMember); - } else if (this.grid.currencyColumnSet.has(valueMember)) { - column.dataType = GridColumnDataType.Currency; - } - } else if (isRelevantColumn) { - if (isCountAggregator && isCurrencyColumn) { - column.dataType = GridColumnDataType.Number; - this.grid.currencyColumnSet.add(valueMember); - } else if (this.grid.currencyColumnSet.has(valueMember)) { - column.dataType = GridColumnDataType.Currency; - shouldRemoveFromSet = true; - } - } - }); - - if (shouldRemoveFromSet) { - this.grid.currencyColumnSet.delete(valueMember); - } - } - /** * @hidden * @internal diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts index fca26bed26f..08ab6435d26 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts @@ -31,7 +31,7 @@ import { } from '@angular/core'; import { DOCUMENT, NgTemplateOutlet, NgClass, NgStyle } from '@angular/common'; -import { first, take, takeUntil} from 'rxjs/operators'; +import { first, take, takeUntil } from 'rxjs/operators'; import { IgxGridBaseDirective } from '../grid-base.directive'; import { IgxFilteringService } from '../filtering/grid-filtering.service'; import { IgxGridSelectionService } from '../selection/selection.service'; @@ -1655,7 +1655,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni public autoSizeRowDimension(dimension: IPivotDimension) { if (this.getDimensionType(dimension) === PivotDimensionType.Row) { const relatedDims: string[] = PivotUtil.flatten([dimension]).map((x: IPivotDimension) => x.memberName); - const contentCollection = this.getContentCollection(dimension); + const contentCollection = this.getContentCollection(dimension); const content = contentCollection.filter(x => relatedDims.indexOf(x.dimension.memberName) !== -1); const headers = content.map(x => x.headerGroups.toArray()).flat().map(x => x.header && x.header.refInstance); if (this.pivotUI.showRowHeaders) { @@ -1929,8 +1929,8 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni */ public getRowDimensionByName(memberName: string) { const visibleRows = this.pivotUI.rowLayout === PivotRowLayoutType.Vertical ? - this.pivotConfiguration.rows : - PivotUtil.flatten(this.pivotConfiguration.rows); + this.pivotConfiguration.rows : + PivotUtil.flatten(this.pivotConfiguration.rows); const dimIndex = visibleRows.findIndex((target) => target.memberName === memberName); const dim = visibleRows[dimIndex]; return dim; @@ -2254,7 +2254,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni const separator = this.pivotKeys.columnDimensionSeparator; const dataArr = fields.map(x => x.split(separator)).sort(x => x.length); const hierarchy = new Map(); - const columnDimensions = PivotUtil.flatten(this.columnDimensions); + const columnDimensions = PivotUtil.flatten(this.columnDimensions); dataArr.forEach(arr => { let currentHierarchy = hierarchy; const path = []; @@ -2274,9 +2274,23 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni }); return hierarchy; } - - /** @hidden @internal */ - public currencyColumnSet: Set = new Set(); + private updateColumnDataTypeByAggregator(column: any) { + this.values.forEach((aggregatorValue) => { + if ((aggregatorValue.dataType === GridColumnDataType.Currency || aggregatorValue.dataType === GridColumnDataType.Percent) && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') { + if (column.field?.includes(aggregatorValue.member) || this.values.length === 1) { + column.dataType = GridColumnDataType.Number; + } + } else if (aggregatorValue.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { + if (column.field?.includes(aggregatorValue.member) || this.values.length === 1) { + column.dataType = GridColumnDataType.Currency; + } + } else if (aggregatorValue.dataType === GridColumnDataType.Percent && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { + if (column.field?.includes(aggregatorValue.member) || this.values.length === 1) { + column.dataType = GridColumnDataType.Percent; + } + } + }) + } protected generateColumnHierarchy(fields: Map, data, parent = null): IgxColumnComponent[] { let columns = []; if (fields.size === 0) { @@ -2284,8 +2298,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni const ref = createComponent(IgxColumnComponent, { environmentInjector: this.envInjector, elementInjector: this.injector }); let columnDataType = value.dataType || this.resolveDataTypes(data.length ? data[0][value.member] : null); - if (value.aggregate?.key?.toLowerCase() === 'count' && columnDataType === GridColumnDataType.Currency) { - this.currencyColumnSet.add(value.member); + if (value.aggregate?.key?.toLowerCase() === 'count' && (columnDataType === GridColumnDataType.Currency || columnDataType == GridColumnDataType.Percent)) { columnDataType = GridColumnDataType.Number; } @@ -2308,32 +2321,14 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni if (shouldGenerate && (value.children == null || value.children.length === 0 || value.children.size === 0)) { const col = this.createColumnForDimension(value, data, parent, this.hasMultipleValues); - this.values.forEach((aggregatorValue) => { - if (col.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') { - col.dataType = GridColumnDataType.Number; - this.currencyColumnSet.add(aggregatorValue.member); - } else if (this.currencyColumnSet.has(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { - col.dataType = GridColumnDataType.Currency; - this.currencyColumnSet.delete(aggregatorValue.member); - } - }) + this.updateColumnDataTypeByAggregator(col); columns.push(col); if (this.hasMultipleValues) { const measureChildren = this.getMeasureChildren(data, col, false, value.dimension.width); measureChildren.forEach((child) => { - this.values.forEach((aggregatorValue) => { - if (child.field.includes(aggregatorValue.member)) { - if (child.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') { - child.dataType = GridColumnDataType.Number; - this.currencyColumnSet.add(aggregatorValue.member); - } else if (this.currencyColumnSet.has(aggregatorValue.member) && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { - child.dataType = GridColumnDataType.Currency; - this.currencyColumnSet.delete(aggregatorValue.member); - } - } - }) + this.updateColumnDataTypeByAggregator(child); }) col.children.reset(measureChildren); @@ -2405,20 +2400,20 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni }; values.push(value); break; - } - case "date": - { - const dimension: IPivotDimension = new IgxPivotDateDimension( + } + case "date": { - memberName: field, - enabled: isFirstDate, - dataType: dataType + const dimension: IPivotDimension = new IgxPivotDateDimension( + { + memberName: field, + enabled: isFirstDate, + dataType: dataType + } + ) + rowDimensions.push(dimension); + isFirstDate = false; + break; } - ) - rowDimensions.push(dimension); - isFirstDate = false; - break; - } default: { const dimension: IPivotDimension = { memberName: field, diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts index 15001ed2cc2..fbe4f0923d0 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts @@ -412,47 +412,14 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem if (!this.isSelected(event.newSelection.value)) { this.value.aggregate = event.newSelection.value; + const isSingleValue = this.grid.values.length === 1; - this.handleCountAggregator(); + PivotUtil.handleCountAggregator(this.grid.columns, this.value, isSingleValue); this.grid.pipeTrigger++; } } - private handleCountAggregator() { - const valueMember = this.value.member; - const columns = this.grid.columns; - const isCountAggregator = this.value.aggregate.key.toLowerCase() === 'count'; - const isSingleValue = this.grid.values.length === 1; - let shouldRemoveFromSet: boolean = false; - - columns.forEach(column => { - const isRelevantColumn = column.field?.includes(valueMember); - const isCurrencyColumn = column.dataType === GridColumnDataType.Currency; - - if (isSingleValue) { - if (isCountAggregator && isCurrencyColumn) { - column.dataType = GridColumnDataType.Number; - this.grid.currencyColumnSet.add(valueMember); - } else if (this.grid.currencyColumnSet.has(valueMember)) { - column.dataType = GridColumnDataType.Currency; - } - } else if (isRelevantColumn) { - if (isCountAggregator && isCurrencyColumn) { - column.dataType = GridColumnDataType.Number; - this.grid.currencyColumnSet.add(valueMember); - } else if (this.grid.currencyColumnSet.has(valueMember)) { - column.dataType = GridColumnDataType.Currency; - shouldRemoveFromSet = true; - } - } - }); - - if (shouldRemoveFromSet) { - this.grid.currencyColumnSet.delete(valueMember); - } - } - /** * @hidden * @internal diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts index e4624251ca2..cb6379b5785 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts @@ -3,7 +3,7 @@ import { DataUtil, GridColumnDataType } from '../../data-operations/data-util'; import { FilteringLogic } from '../../data-operations/filtering-expression.interface'; import { FilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree'; import { ISortingExpression } from '../../data-operations/sorting-strategy'; -import { PivotGridType } from '../common/grid.interface'; +import { ColumnType, PivotGridType } from '../common/grid.interface'; import { IGridSortingStrategy, IgxSorting } from '../common/strategy'; import { IgxPivotAggregate, IgxPivotDateAggregate, IgxPivotNumericAggregate, IgxPivotTimeAggregate } from './pivot-grid-aggregate'; import { IPivotAggregator, IPivotConfiguration, IPivotDimension, IPivotGridRecord, IPivotKeys, IPivotValue, PivotDimensionType, PivotSummaryPosition } from './pivot-grid.interface'; @@ -508,5 +508,28 @@ export class PivotUtil { } } + public static handleCountAggregator(columns: ColumnType[], value: IPivotValue, isSingleValue: boolean): void { + const isCountAggregator = value.aggregate.aggregator?.name?.toLowerCase() === 'count' || value.aggregate.aggregatorName?.toLowerCase() === 'count'; + if ((value.dataType === GridColumnDataType.Currency || value.dataType === GridColumnDataType.Percent) && isCountAggregator) { + columns.forEach(column => { + console.log(column.field?.includes(value.member)) + if (column.field?.includes(value.member) || isSingleValue) { + column.dataType = GridColumnDataType.Number; + } + }); + } else if (value.dataType === GridColumnDataType.Currency && !isCountAggregator) { + columns.forEach(column => { + if (column.field?.includes(value.member) || isSingleValue) { + column.dataType = GridColumnDataType.Currency; + } + }); + } else if (value.dataType === GridColumnDataType.Percent && !isCountAggregator) { + columns.forEach(column => { + if (column.field?.includes(value.member) || isSingleValue) { + column.dataType = GridColumnDataType.Percent; + } + }); + } + } } From a6a744a3e768df8f65cf0ab0d55ad38d1a53db34 Mon Sep 17 00:00:00 2001 From: Ivan Minchev Date: Wed, 18 Jun 2025 18:16:01 +0300 Subject: [PATCH 5/6] refactor(pivot-grid): remove repetitive code --- .../pivot-data-selector.component.ts | 2 +- .../grids/pivot-grid/pivot-grid.component.ts | 28 +++-------- .../pivot-grid/pivot-header-row.component.ts | 2 +- .../src/lib/grids/pivot-grid/pivot-util.ts | 46 +++++++++---------- 4 files changed, 30 insertions(+), 48 deletions(-) diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts index 62de2a3d776..5ab7457e275 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-data-selector.component.ts @@ -523,7 +523,7 @@ export class IgxPivotDataSelectorComponent { this.value.aggregate = event.newSelection.value; const isSingleValue = this.grid.values.length === 1; - PivotUtil.handleCountAggregator(this.grid.columns, this.value, isSingleValue); + PivotUtil.updateColumnTypeByAggregator(this.grid.columns, this.value, isSingleValue); this.grid.pipeTrigger++; this.grid.cdr.markForCheck(); diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts index 08ab6435d26..0f3c771790a 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-grid.component.ts @@ -2274,23 +2274,6 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni }); return hierarchy; } - private updateColumnDataTypeByAggregator(column: any) { - this.values.forEach((aggregatorValue) => { - if ((aggregatorValue.dataType === GridColumnDataType.Currency || aggregatorValue.dataType === GridColumnDataType.Percent) && aggregatorValue.aggregate?.key?.toLowerCase() === 'count') { - if (column.field?.includes(aggregatorValue.member) || this.values.length === 1) { - column.dataType = GridColumnDataType.Number; - } - } else if (aggregatorValue.dataType === GridColumnDataType.Currency && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { - if (column.field?.includes(aggregatorValue.member) || this.values.length === 1) { - column.dataType = GridColumnDataType.Currency; - } - } else if (aggregatorValue.dataType === GridColumnDataType.Percent && aggregatorValue.aggregate?.key?.toLowerCase() !== 'count') { - if (column.field?.includes(aggregatorValue.member) || this.values.length === 1) { - column.dataType = GridColumnDataType.Percent; - } - } - }) - } protected generateColumnHierarchy(fields: Map, data, parent = null): IgxColumnComponent[] { let columns = []; if (fields.size === 0) { @@ -2321,15 +2304,18 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni if (shouldGenerate && (value.children == null || value.children.length === 0 || value.children.size === 0)) { const col = this.createColumnForDimension(value, data, parent, this.hasMultipleValues); - this.updateColumnDataTypeByAggregator(col); + if (!this.hasMultipleValues && this.values.length > 0) { + PivotUtil.updateColumnTypeByAggregator([col], this.values[0], true); + } columns.push(col); if (this.hasMultipleValues) { const measureChildren = this.getMeasureChildren(data, col, false, value.dimension.width); - measureChildren.forEach((child) => { - this.updateColumnDataTypeByAggregator(child); - }) + measureChildren.forEach((child, index) => { + const pivotValue = this.values[index]; + PivotUtil.updateColumnTypeByAggregator([child], pivotValue, this.values.length === 1); + }); col.children.reset(measureChildren); columns = columns.concat(measureChildren); diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts index fbe4f0923d0..e24f18b9521 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-header-row.component.ts @@ -414,7 +414,7 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent implem this.value.aggregate = event.newSelection.value; const isSingleValue = this.grid.values.length === 1; - PivotUtil.handleCountAggregator(this.grid.columns, this.value, isSingleValue); + PivotUtil.updateColumnTypeByAggregator(this.grid.columns, this.value, isSingleValue); this.grid.pipeTrigger++; } diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts index cb6379b5785..629ea62639e 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts @@ -88,13 +88,13 @@ export class PivotUtil { } public static flattenGroupsHorizontally(data: IPivotGridRecord[], - dimension: IPivotDimension, - expansionStates, - defaultExpand: boolean, - visibleDimensions: IPivotDimension[], - summariesPosition: PivotSummaryPosition, - parent?: IPivotDimension, - parentRec?: IPivotGridRecord) { + dimension: IPivotDimension, + expansionStates, + defaultExpand: boolean, + visibleDimensions: IPivotDimension[], + summariesPosition: PivotSummaryPosition, + parent?: IPivotDimension, + parentRec?: IPivotGridRecord) { for (let i = 0; i < data.length; i++) { const rec = data[i]; const field = dimension.memberName; @@ -316,7 +316,7 @@ export class PivotUtil { const aggregationKey = groupName ? groupName + pivotKeys.columnDimensionSeparator + key : key; rec.aggregationValues.set(aggregationKey, aggregationData[key]); }); - } else if (aggregationKeys.length === 1) { + } else if (aggregationKeys.length === 1) { const aggregationKey = aggregationKeys[0]; rec.aggregationValues.set(groupName || aggregationKey, aggregationData[aggregationKey]); } @@ -508,28 +508,24 @@ export class PivotUtil { } } - public static handleCountAggregator(columns: ColumnType[], value: IPivotValue, isSingleValue: boolean): void { + public static updateColumnTypeByAggregator(columns: any[], value: IPivotValue, isSingleValue: boolean): void { + const targetColumnType = PivotUtil.getColumnDataTypeForValue(value); + columns.forEach(column => { + if (column.field?.includes(value.member) || isSingleValue) { + column.dataType = targetColumnType; + } + }) + } + + private static getColumnDataTypeForValue(value: IPivotValue): GridColumnDataType { const isCountAggregator = value.aggregate.aggregator?.name?.toLowerCase() === 'count' || value.aggregate.aggregatorName?.toLowerCase() === 'count'; if ((value.dataType === GridColumnDataType.Currency || value.dataType === GridColumnDataType.Percent) && isCountAggregator) { - columns.forEach(column => { - console.log(column.field?.includes(value.member)) - if (column.field?.includes(value.member) || isSingleValue) { - column.dataType = GridColumnDataType.Number; - } - }); + return GridColumnDataType.Number; } else if (value.dataType === GridColumnDataType.Currency && !isCountAggregator) { - columns.forEach(column => { - if (column.field?.includes(value.member) || isSingleValue) { - column.dataType = GridColumnDataType.Currency; - } - }); + return GridColumnDataType.Currency; } else if (value.dataType === GridColumnDataType.Percent && !isCountAggregator) { - columns.forEach(column => { - if (column.field?.includes(value.member) || isSingleValue) { - column.dataType = GridColumnDataType.Percent; - } - }); + return GridColumnDataType.Percent; } } } From 4742670920fe48c0ad2a8de22eba7b54812ad130 Mon Sep 17 00:00:00 2001 From: Ivan Minchev Date: Thu, 19 Jun 2025 16:24:48 +0300 Subject: [PATCH 6/6] fix(pivot-grid): add check to not change dataType to undefined --- .../igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts index 629ea62639e..cd73c2360ed 100644 --- a/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts +++ b/projects/igniteui-angular/src/lib/grids/pivot-grid/pivot-util.ts @@ -511,7 +511,7 @@ export class PivotUtil { public static updateColumnTypeByAggregator(columns: any[], value: IPivotValue, isSingleValue: boolean): void { const targetColumnType = PivotUtil.getColumnDataTypeForValue(value); columns.forEach(column => { - if (column.field?.includes(value.member) || isSingleValue) { + if ((column.field?.includes(value.member) || isSingleValue) && targetColumnType !== undefined) { column.dataType = targetColumnType; } })