Skip to content

Commit bee5559

Browse files
MKirovaMKirova
authored andcommitted
Extract unique values and apply filter strategy based on dimension memberName and function.
1 parent 3d043e4 commit bee5559

File tree

4 files changed

+75
-17
lines changed

4 files changed

+75
-17
lines changed

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11

2+
import { GridType } from '../grids/common/grid.interface';
3+
import { IgxPivotGridComponent } from '../grids/pivot-grid/pivot-grid.component';
24
import { IPivotDimension, IPivotKeys, IPivotValue, PivotDimensionType } from '../grids/pivot-grid/pivot-grid.interface';
35
import { PivotUtil } from '../grids/pivot-grid/pivot-util';
6+
import { FilteringStrategy } from './filtering-strategy';
47

58
export interface IPivotDimensionStrategy {
69
process(collection: any,
@@ -149,3 +152,24 @@ export class PivotColumnDimensionsStrategy implements IPivotDimensionStrategy {
149152
return !(record[pivotKeys.records] && record[pivotKeys.records].some(r => r[pivotKeys.records]));
150153
}
151154
}
155+
156+
export class DimensionValuesFilteringStrategy extends FilteringStrategy {
157+
/**
158+
* Creates a new instance of FormattedValuesFilteringStrategy.
159+
*
160+
* @param fields An array of column field names that should be formatted.
161+
* If omitted the values of all columns which has formatter will be formatted.
162+
*/
163+
constructor(private fields?: string[]) {
164+
super();
165+
}
166+
167+
protected getFieldValue(rec: any, fieldName: string, isDate: boolean = false, isTime: boolean = false,
168+
grid?: IgxPivotGridComponent): any {
169+
const config = grid.pivotConfiguration;
170+
const allDimensions = config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null);
171+
const enabledDimensions = allDimensions.filter(x => x && x.enabled);
172+
const dim = PivotUtil.flatten(enabledDimensions).find(x => x.memberName === fieldName);
173+
return PivotUtil.extractValueFromDimension(dim, rec);
174+
}
175+
}

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

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ import { GridType } from '../common/grid.interface';
3030
import { IgxGridNavigationService } from '../grid-navigation.service';
3131
import { IgxGridCRUDService } from '../common/crud.service';
3232
import { IgxGridSummaryService } from '../summaries/grid-summary.service';
33-
import { IPivotConfiguration, IPivotKeys, PivotDimensionType } from './pivot-grid.interface';
33+
import { IPivotConfiguration, IPivotDimension, IPivotKeys, PivotDimensionType } from './pivot-grid.interface';
3434
import { IgxPivotHeaderRowComponent } from './pivot-header-row.component';
3535
import { IgxColumnGroupComponent } from '../columns/column-group.component';
3636
import { IgxColumnComponent } from '../columns/column.component';
3737
import { PivotUtil } from './pivot-util';
38-
import { NoopPivotDimensionsStrategy } from '../../data-operations/pivot-strategy';
38+
import { DimensionValuesFilteringStrategy, NoopPivotDimensionsStrategy } from '../../data-operations/pivot-strategy';
3939
import { IgxGridExcelStyleFilteringComponent } from '../filtering/excel-style/grid.excel-style-filtering.component';
4040
import { IgxPivotGridNavigationService } from './pivot-grid-navigation.service';
4141
import { IgxColumnResizingService } from '../resizing/resizing.service';
@@ -46,6 +46,7 @@ import { cloneArray, PlatformUtil } from '../../core/utils';
4646
import { IgxGridTransaction } from '../hierarchical-grid/public_api';
4747
import { IgxPivotFilteringService } from './pivot-filtering.service';
4848
import { DataUtil } from '../../data-operations/data-util';
49+
import { IFilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
4950

5051
let NEXT_ID = 0;
5152
const MINIMUM_COLUMN_WIDTH = 200;
@@ -112,7 +113,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
112113

113114

114115
public columnGroupStates = new Map<string, boolean>();
115-
public originalDataColumns;
116+
public dimensionDataColumns;
116117
public pivotKeys: IPivotKeys = {aggregations: 'aggregations', records: 'records', children: 'children', level: 'level'};
117118
public isPivot = true;
118119
protected _defaultExpandState = true;
@@ -168,6 +169,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
168169
public ngOnInit() {
169170
// pivot grid always generates columns automatically.
170171
this.autoGenerate = true;
172+
this.uniqueColumnValuesStrategy = this.uniqueColumnValuesStrategy || this.uniqueDimensionValuesStrategy;
171173
super.ngOnInit();
172174
}
173175

@@ -188,6 +190,32 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
188190
});
189191
}
190192

193+
public uniqueDimensionValuesStrategy(column: IgxColumnComponent, exprTree: IFilteringExpressionsTree,
194+
done: (uniqueValues: any[]) => void) {
195+
const config = this.pivotConfiguration;
196+
const allDimensions = config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null);
197+
const enabledDimensions = allDimensions.filter(x => x && x.enabled);
198+
const dim = PivotUtil.flatten(enabledDimensions).find(x => x.memberName === column.field);
199+
this.getDimensionData(dim, exprTree, uniqueValues => done(uniqueValues));
200+
}
201+
202+
public getDimensionData(dim: IPivotDimension,
203+
dimExprTree: IFilteringExpressionsTree,
204+
done: (colVals: any[]) => void) {
205+
let columnValues = [];
206+
const data = this.gridAPI.get_data();
207+
const allValuesHierarchy = PivotUtil.getFieldsHierarchy(
208+
data,
209+
[dim],
210+
PivotDimensionType.Column,
211+
{aggregations: 'aggregations', records: 'records', children: 'children', level: 'level'}
212+
);
213+
const flatData = Array.from(allValuesHierarchy.values());
214+
columnValues = flatData.map(record => this.extractValue(record['value']));
215+
done(columnValues);
216+
return;
217+
}
218+
191219
/** @hidden */
192220
public featureColumnsWidth() {
193221
return this.pivotRowWidths;
@@ -367,7 +395,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
367395
protected autogenerateColumns() {
368396
let columns = [];
369397
const data = this.gridAPI.get_data();
370-
this.originalDataColumns = this.generateOriginalColumns();
398+
this.dimensionDataColumns = this.generateDimensionColumns();
371399
let fieldsMap;
372400
if (this.pivotConfiguration.columnStrategy && this.pivotConfiguration.columnStrategy instanceof NoopPivotDimensionsStrategy) {
373401
const fields = this.generateDataFields(data);
@@ -393,15 +421,15 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
393421
}
394422
}
395423

396-
protected generateOriginalColumns() {
397-
const data = this.gridAPI.get_data();
398-
const fields = this.generateDataFields(data);
424+
protected generateDimensionColumns() {
425+
const config = this.pivotConfiguration;
426+
const allDimensions = config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null);
427+
const leafFields = PivotUtil.flatten(allDimensions, 0).filter(x => !x.childLevel).map(x => x.memberName);
399428
const columns = [];
400429
const factory = this.resolver.resolveComponentFactory(IgxColumnComponent);
401-
fields.forEach((field) => {
430+
leafFields.forEach((field) => {
402431
const ref = factory.create(this.viewRef.injector);
403432
ref.instance.field = field;
404-
ref.instance.dataType = this.resolveDataTypes(data[0][field]);
405433
ref.changeDetectorRef.detectChanges();
406434
columns.push(ref.instance);
407435
});
@@ -436,10 +464,10 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
436464
if (value.dimension && value.dimension.filters) {
437465
const state = {
438466
expressionsTree: value.dimension.filters.filteringOperands[0],
439-
strategy: this.filterStrategy,
467+
strategy: this.filterStrategy || new DimensionValuesFilteringStrategy(),
440468
advancedFilteringExpressionsTree: this.advancedFilteringExpressionsTree
441469
};
442-
const filtered = DataUtil.filter(cloneArray(value.records), state);
470+
const filtered = DataUtil.filter(cloneArray(value.records), state, this);
443471
if (filtered.length === 0) {
444472
shouldGenerate = false;
445473
}
@@ -514,4 +542,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
514542
});
515543
return cols;
516544
}
545+
private extractValue(value) {
546+
return value.split('-')[value.split('-').length - 1];
547+
}
517548
}

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ 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';
66
import { IPivotConfiguration, IPivotDimension, IPivotKeys } from './pivot-grid.interface';
7-
import { PivotColumnDimensionsStrategy, PivotRowDimensionsStrategy } from '../../data-operations/pivot-strategy';
7+
import { DimensionValuesFilteringStrategy, PivotColumnDimensionsStrategy,
8+
PivotRowDimensionsStrategy } from '../../data-operations/pivot-strategy';
89
import { PivotUtil } from './pivot-util';
910
import { FilteringLogic } from '../../data-operations/filtering-expression.interface';
11+
import { GridBaseAPIService, IgxGridBaseDirective } from '../hierarchical-grid/public_api';
12+
import { GridType } from '../common/grid.interface';
1013
/**
1114
* @hidden
1215
*/
@@ -96,7 +99,7 @@ export class IgxPivotColumnPipe implements PipeTransform {
9699
pure: true
97100
})
98101
export class IgxPivotGridFilterPipe implements PipeTransform {
99-
102+
constructor(private gridAPI: GridBaseAPIService<IgxGridBaseDirective & GridType>) { }
100103
public transform(collection: any[],
101104
config: IPivotConfiguration,
102105
filterStrategy: IFilteringStrategy,
@@ -115,15 +118,15 @@ export class IgxPivotGridFilterPipe implements PipeTransform {
115118
});
116119
const state = {
117120
expressionsTree,
118-
strategy: filterStrategy,
121+
strategy: filterStrategy || new DimensionValuesFilteringStrategy(),
119122
advancedExpressionsTree
120123
};
121124

122125
if (FilteringExpressionsTree.empty(state.expressionsTree) && FilteringExpressionsTree.empty(state.advancedExpressionsTree)) {
123126
return collection;
124127
}
125128

126-
const result = DataUtil.filter(cloneArray(collection), state);
129+
const result = DataUtil.filter(cloneArray(collection), state, this.gridAPI.grid);
127130

128131
return result;
129132
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,11 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent {
9090
let dim = dimension;
9191
let col;
9292
while(dim) {
93-
col = this.grid.originalDataColumns.find(x => x.field === dim.memberName || x.field === dim.member);
93+
col = this.grid.dimensionDataColumns.find(x => x.field === dim.memberName || x.field === dim.member);
9494
if (col) {
9595
break;
9696
} else {
97-
dim = dimension.childLevel;
97+
dim = dim.childLevel;
9898
}
9999
}
100100
this.grid.filteringService.toggleFilterDropdown(event.target, col);

0 commit comments

Comments
 (0)