Skip to content

Commit 5cca70a

Browse files
authored
Merge pull request #10655 from IgniteUI/mkirova/pivot-keys-separators
Add additional settable pivot keys: columnDimensionSeparator, rowDimensionSeparator.
2 parents 164673b + a0b540d commit 5cca70a

File tree

8 files changed

+131
-95
lines changed

8 files changed

+131
-95
lines changed

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
import { GridType, PivotGridType } from '../grids/common/grid.interface';
3-
import { IPivotDimension, IPivotDimensionStrategy, IPivotKeys, IPivotValue, PivotDimensionType } from '../grids/pivot-grid/pivot-grid.interface';
3+
import { DEFAULT_PIVOT_KEYS, IPivotDimension, IPivotDimensionStrategy, IPivotKeys, IPivotValue, PivotDimensionType } from '../grids/pivot-grid/pivot-grid.interface';
44
import { PivotUtil } from '../grids/pivot-grid/pivot-util';
55
import { FilteringStrategy } from './filtering-strategy';
66
import { GridColumnDataType } from './data-util';
@@ -31,8 +31,7 @@ export class PivotRowDimensionsStrategy implements IPivotDimensionStrategy {
3131
collection: any,
3232
rows: IPivotDimension[],
3333
values?: IPivotValue[],
34-
pivotKeys: IPivotKeys =
35-
{ aggregations: 'aggregations', records: 'records', children: 'children', level: 'level' }
34+
pivotKeys: IPivotKeys = DEFAULT_PIVOT_KEYS
3635
): any[] {
3736
let hierarchies;
3837
let data;
@@ -98,7 +97,7 @@ export class PivotColumnDimensionsStrategy implements IPivotDimensionStrategy {
9897
collection: any[],
9998
columns: IPivotDimension[],
10099
values: IPivotValue[],
101-
pivotKeys: IPivotKeys = { aggregations: 'aggregations', records: 'records', children: 'children', level: 'level' }
100+
pivotKeys: IPivotKeys = DEFAULT_PIVOT_KEYS
102101
): any[] {
103102
const res = this.processHierarchy(collection, columns, values, pivotKeys);
104103
return res;

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

Lines changed: 38 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import { IgxForOfSyncService, IgxForOfScrollSyncService } from '../../directives
3333
import { GridServiceType, GridType, IGX_GRID_BASE, IGX_GRID_SERVICE_BASE, RowType } from '../common/grid.interface';
3434
import { IgxGridCRUDService } from '../common/crud.service';
3535
import { IgxGridSummaryService } from '../summaries/grid-summary.service';
36-
import { IDimensionsChange, IPivotConfiguration, IPivotDimension, IPivotKeys, IValuesChange, PivotDimensionType } from './pivot-grid.interface';
36+
import { DEFAULT_PIVOT_KEYS, IDimensionsChange, IPivotConfiguration, IPivotDimension, IPivotKeys, IValuesChange, PivotDimensionType } from './pivot-grid.interface';
3737
import { IgxPivotHeaderRowComponent } from './pivot-header-row.component';
3838
import { IgxColumnGroupComponent } from '../columns/column-group.component';
3939
import { IgxColumnComponent } from '../columns/column.component';
@@ -294,7 +294,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
294294
public columnGroupStates = new Map<string, boolean>();
295295
public dimensionDataColumns;
296296
public get pivotKeys() {
297-
return this.pivotConfiguration.pivotKeys || {aggregations: 'aggregations', records: 'records', children: 'children', level: 'level'};
297+
return this.pivotConfiguration.pivotKeys || DEFAULT_PIVOT_KEYS;
298298
}
299299
public isPivot = true;
300300

@@ -577,24 +577,24 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
577577
public getDimensionData(dim: IPivotDimension,
578578
dimExprTree: IFilteringExpressionsTree,
579579
done: (colVals: any[]) => void) {
580-
let columnValues = [];
581-
const data = this.gridAPI.get_data();
582-
const state = {
583-
expressionsTree: dimExprTree,
584-
strategy: this.filterStrategy || new DimensionValuesFilteringStrategy(),
585-
advancedFilteringExpressionsTree: this.advancedFilteringExpressionsTree
586-
};
587-
const filtered = DataUtil.filter(data, state, this);
588-
const allValuesHierarchy = PivotUtil.getFieldsHierarchy(
589-
filtered,
590-
[dim],
591-
PivotDimensionType.Column,
592-
this.pivotKeys
593-
);
594-
const flatData = Array.from(allValuesHierarchy.values());
595-
columnValues = flatData.map(record => this.extractValue(record['value']));
596-
done(columnValues);
597-
return;
580+
let columnValues = [];
581+
const data = this.gridAPI.get_data();
582+
const state = {
583+
expressionsTree: dimExprTree,
584+
strategy: this.filterStrategy || new DimensionValuesFilteringStrategy(),
585+
advancedFilteringExpressionsTree: this.advancedFilteringExpressionsTree
586+
};
587+
const filtered = DataUtil.filter(data, state, this);
588+
const allValuesHierarchy = PivotUtil.getFieldsHierarchy(
589+
filtered,
590+
[dim],
591+
PivotDimensionType.Column,
592+
this.pivotKeys
593+
);
594+
const flatData = Array.from(allValuesHierarchy.values());
595+
columnValues = flatData.map(record => this.extractValue(record['value']));
596+
done(columnValues);
597+
return;
598598
}
599599

600600
/** @hidden */
@@ -695,7 +695,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
695695
}
696696

697697
public resolveRowDimensionWidth(dim: IPivotDimension): number {
698-
if(!dim.width) {
698+
if (!dim.width) {
699699
return MINIMUM_COLUMN_WIDTH;
700700
}
701701
const isPercent = dim.width && dim.width.indexOf('%') !== -1;
@@ -1026,14 +1026,15 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
10261026
const rowFields = PivotUtil.flatten(this.pivotConfiguration.rows).map(x => x.memberName);
10271027
const keyFields = Object.values(this.pivotKeys);
10281028
const filteredFields = fields.filter(x => rowFields.indexOf(x) === -1 && keyFields.indexOf(x) === -1 &&
1029-
x.indexOf('_level') === -1 && x.indexOf('_records') === -1);
1029+
x.indexOf(this.pivotKeys.rowDimensionSeparator + this.pivotKeys.level) === -1 &&
1030+
x.indexOf(this.pivotKeys.rowDimensionSeparator + this.pivotKeys.records) === -1);
10301031
fieldsMap = this.generateFromData(filteredFields);
10311032
} else {
10321033
fieldsMap = PivotUtil.getFieldsHierarchy(
1033-
data,
1034-
this.columnDimensions,
1035-
PivotDimensionType.Column,
1036-
this.pivotKeys
1034+
data,
1035+
this.columnDimensions,
1036+
PivotDimensionType.Column,
1037+
this.pivotKeys
10371038
);
10381039
}
10391040
columns = this.generateColumnHierarchy(fieldsMap, data);
@@ -1062,17 +1063,18 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
10621063
}
10631064

10641065
protected generateFromData(fields: string[]) {
1065-
const dataArr = fields.map(x => x.split('-')).sort(x => x.length);
1066+
const separator = this.pivotKeys.columnDimensionSeparator;
1067+
const dataArr = fields.map(x => x.split(separator)).sort(x => x.length);
10661068
const hierarchy = new Map<string, any>();
10671069
dataArr.forEach(arr => {
10681070
let currentHierarchy = hierarchy;
10691071
const path = [];
10701072
for (const val of arr) {
10711073
path.push(val);
1072-
let h = currentHierarchy.get(path.join('-'));
1074+
let h = currentHierarchy.get(path.join(separator));
10731075
if (!h) {
1074-
currentHierarchy.set(path.join('-'), { expandable: true, children: new Map<string, any>() });
1075-
h = currentHierarchy.get(path.join('-'));
1076+
currentHierarchy.set(path.join(separator), { expandable: true, children: new Map<string, any>(), dimension: this.columnDimensions[0] });
1077+
h = currentHierarchy.get(path.join(separator));
10761078
}
10771079
currentHierarchy = h.children;
10781080
}
@@ -1111,7 +1113,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
11111113
const ref = this.hasMultipleValues ?
11121114
factoryColumnGroup.create(this.viewRef.injector) :
11131115
factoryColumn.create(this.viewRef.injector);
1114-
ref.instance.header = parent != null ? key.split(parent.header + '-')[1] : key;
1116+
ref.instance.header = parent != null ? key.split(parent.header + this.pivotKeys.columnDimensionSeparator)[1] : key;
11151117
ref.instance.field = key;
11161118
ref.instance.parent = parent;
11171119
ref.instance.width = value.dimension?.width || MINIMUM_COLUMN_WIDTH + 'px';
@@ -1131,7 +1133,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
11311133
ref.instance.parent = parent;
11321134
ref.instance.field = key;
11331135
ref.instance.sortable = true;
1134-
ref.instance.header = parent != null ? key.split(parent.header + '-')[1] : key;
1136+
ref.instance.header = parent != null ? key.split(parent.header + this.pivotKeys.columnDimensionSeparator)[1] : key;
11351137
if (value.expandable) {
11361138
ref.instance.headerTemplate = this.headerTemplate;
11371139
}
@@ -1147,7 +1149,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
11471149
columns = columns.concat(children);
11481150
if (value.dimension.childLevel) {
11491151
const refSibling = factoryColumnGroup.create(this.viewRef.injector);
1150-
refSibling.instance.header = parent != null ? key.split(parent.header + '-')[1] : key;
1152+
refSibling.instance.header = parent != null ? key.split(parent.header + this.pivotKeys.columnDimensionSeparator)[1] : key;
11511153
refSibling.instance.field = key;
11521154
refSibling.instance.parent = parent;
11531155
ref.instance.width = value.dimension?.width || MINIMUM_COLUMN_WIDTH + 'px';
@@ -1166,7 +1168,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
11661168
columns = columns.concat(children);
11671169
if (value.dimension.childLevel) {
11681170
const refSibling = factoryColumn.create(this.viewRef.injector);
1169-
refSibling.instance.header = parent != null ? key.split(parent.header + '-')[1] : key;
1171+
refSibling.instance.header = parent != null ? key.split(parent.header + this.pivotKeys.columnDimensionSeparator)[1] : key;
11701172
refSibling.instance.field = key;
11711173
refSibling.instance.parent = parent;
11721174
ref.instance.width = value.dimension?.width || MINIMUM_COLUMN_WIDTH + 'px';
@@ -1190,7 +1192,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
11901192
this.values.forEach(val => {
11911193
const ref = colFactory.create(this.viewRef.injector);
11921194
ref.instance.header = val.displayName || val.member;
1193-
ref.instance.field = parent.field + '-' + val.member;
1195+
ref.instance.field = parent.field + this.pivotKeys.columnDimensionSeparator + val.member;
11941196
ref.instance.parent = parent;
11951197
ref.instance.width = isPercent ? width + '%' : width + 'px';
11961198
ref.instance.hidden = hidden;
@@ -1203,6 +1205,6 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
12031205
return cols;
12041206
}
12051207
private extractValue(value) {
1206-
return value.split('-')[value.split('-').length - 1];
1208+
return value.split(this.pivotKeys.columnDimensionSeparator)[value.split(this.pivotKeys.columnDimensionSeparator).length - 1];
12071209
}
12081210
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ import { FilteringExpressionsTree } from '../../data-operations/filtering-expres
33
import { SortingDirection } from '../../data-operations/sorting-strategy';
44
import { ColumnType } from '../common/grid.interface';
55

6+
export const DEFAULT_PIVOT_KEYS = {
7+
aggregations: 'aggregations', records: 'records', children: 'children', level: 'level',
8+
rowDimensionSeparator: '_', columnDimensionSeparator: '-'
9+
};
10+
611
export interface IDimensionsChange {
712
dimensions: IPivotDimension[],
813
dimensionCollectionType: PivotDimensionType
@@ -98,6 +103,8 @@ export interface IPivotKeys {
98103
records: string;
99104
aggregations: string;
100105
level: string;
106+
columnDimensionSeparator: string;
107+
rowDimensionSeparator: string;
101108
}
102109

103110
export enum PivotDimensionType {

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

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,19 @@ import { cloneArray } from '../../core/utils';
33
import { DataUtil } from '../../data-operations/data-util';
44
import { FilteringExpressionsTree, IFilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
55
import { IFilteringStrategy } from '../../data-operations/filtering-strategy';
6-
import { IPivotConfiguration, IPivotKeys } from './pivot-grid.interface';
7-
import { DefaultPivotSortingStrategy, DimensionValuesFilteringStrategy, PivotColumnDimensionsStrategy,
8-
PivotRowDimensionsStrategy } from '../../data-operations/pivot-strategy';
6+
import { DEFAULT_PIVOT_KEYS, IPivotConfiguration, IPivotKeys } from './pivot-grid.interface';
7+
import {
8+
DefaultPivotSortingStrategy, DimensionValuesFilteringStrategy, PivotColumnDimensionsStrategy,
9+
PivotRowDimensionsStrategy
10+
} from '../../data-operations/pivot-strategy';
911
import { PivotUtil } from './pivot-util';
1012
import { FilteringLogic } from '../../data-operations/filtering-expression.interface';
1113
import { ISortingExpression, SortingDirection } from '../../data-operations/sorting-strategy';
1214
import { GridType } from '../common/grid.interface';
1315
import { GridBaseAPIService } from '../api.service';
1416
import { IgxGridBaseDirective } from '../grid-base.directive';
1517
import { IGridSortingStrategy } from '../common/strategy';
18+
1619
/**
1720
* @hidden
1821
*/
@@ -31,7 +34,7 @@ export class IgxPivotRowPipe implements PipeTransform {
3134
_pipeTrigger?: number,
3235
__?
3336
): any[] {
34-
const pivotKeys = config.pivotKeys || { aggregations: 'aggregations', records: 'records', children: 'children', level: 'level' };
37+
const pivotKeys = config.pivotKeys || DEFAULT_PIVOT_KEYS;
3538
const enabledRows = config.rows.filter(x => x.enabled);
3639
const rowStrategy = config.rowStrategy || PivotRowDimensionsStrategy.instance();
3740
const data = cloneArray(collection, true);
@@ -58,7 +61,7 @@ export class IgxPivotRowExpansionPipe implements PipeTransform {
5861
_pipeTrigger?: number,
5962
__?,
6063
): any[] {
61-
const pivotKeys = config.pivotKeys || { aggregations: 'aggregations', records: 'records', children: 'children', level: 'level' };
64+
const pivotKeys = config.pivotKeys || DEFAULT_PIVOT_KEYS;
6265
const enabledRows = config.rows.filter(x => x.enabled);
6366
const data = collection ? cloneArray(collection, true) : [];
6467
let totalLlv = 0;
@@ -105,7 +108,7 @@ export class IgxPivotColumnPipe implements PipeTransform {
105108
_pipeTrigger?: number,
106109
__?
107110
): any[] {
108-
const pivotKeys = config.pivotKeys || { aggregations: 'aggregations', records: 'records', children: 'children', level: 'level' };
111+
const pivotKeys = config.pivotKeys || DEFAULT_PIVOT_KEYS;
109112
const enabledColumns = config.columns.filter(x => x.enabled);
110113
const enabledValues = config.values.filter(x => x.enabled);
111114

@@ -171,7 +174,7 @@ export class IgxPivotGridColumnSortingPipe implements PipeTransform {
171174
expressions: ISortingExpression[],
172175
sorting: IGridSortingStrategy,
173176
pipeTrigger: number,
174-
pivotKeys: IPivotKeys = { aggregations: 'aggregations', records: 'records', children: 'children', level: 'level' }
177+
pivotKeys: IPivotKeys = DEFAULT_PIVOT_KEYS
175178
): any[] {
176179
let result: any[];
177180

@@ -187,7 +190,7 @@ export class IgxPivotGridColumnSortingPipe implements PipeTransform {
187190
/**
188191
* @hidden
189192
*/
190-
@Pipe({
193+
@Pipe({
191194
name: 'pivotGridSort',
192195
pure: true
193196
})

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ export class IgxPivotRowComponent extends IgxRowDirective implements OnChanges {
101101
}
102102

103103
public getLevel(col: IgxColumnComponent) {
104-
return this.data[col.field + '_level'];
104+
return this.data[col.field + this.grid.pivotKeys.rowDimensionSeparator + this.grid.pivotKeys.level];
105105
}
106106

107107

@@ -119,8 +119,7 @@ export class IgxPivotRowComponent extends IgxRowDirective implements OnChanges {
119119
}
120120
if (changes.pivotRowWidths && this.rowDimensionData) {
121121
for (const dim of rowDimConfig) {
122-
const dimData = PivotUtil.getDimensionLevel(dim, this.data,
123-
{ aggregations: 'aggregations', records: 'records', children: 'children', level: 'level'});
122+
const dimData = PivotUtil.getDimensionLevel(dim, this.data, this.grid.pivotKeys);
124123
const data = this.rowDimensionData.find(x => x.dimension.memberName === dimData.dimension.memberName);
125124
data.column.width = this.grid.resolveRowDimensionWidth(dim) + 'px';
126125
}
@@ -132,7 +131,7 @@ export class IgxPivotRowComponent extends IgxRowDirective implements OnChanges {
132131
if (configuration.values.length === 1) {
133132
return configuration.values[0].styles;
134133
}
135-
const colName = col.field.split('-');
134+
const colName = col.field.split(this.grid.pivotKeys.columnDimensionSeparator);
136135
const measureName = colName[colName.length - 1];
137136
return this.grid.pivotConfiguration.values.find(v => v.member === measureName)?.styles;
138137
}

0 commit comments

Comments
 (0)