Skip to content

Commit 03348de

Browse files
authored
Merge pull request #11816 from IgniteUI/mkirova/feat-11786
feat(igxPivot): Add a filterDimension method.
2 parents ef82131 + 0b5aa60 commit 03348de

File tree

6 files changed

+140
-8
lines changed

6 files changed

+140
-8
lines changed

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

+24-2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ import { DefaultPivotSortingStrategy } from '../../data-operations/pivot-sort-st
7373
import { PivotSortUtil } from './pivot-sort-util';
7474
import { FilterUtil, IFilteringStrategy } from '../../data-operations/filtering-strategy';
7575
import { IgxPivotValueChipTemplateDirective } from './pivot-grid.directives';
76+
import { IFilteringOperation } from '../../data-operations/filtering-condition';
7677

7778
let NEXT_ID = 0;
7879
const MINIMUM_COLUMN_WIDTH = 200;
@@ -203,6 +204,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
203204
*/
204205
public set pivotConfiguration(value: IPivotConfiguration) {
205206
this._pivotConfiguration = value;
207+
this.filteringExpressionsTree = PivotUtil.buildExpressionTree(value);
206208
if (!this._init) {
207209
this.setupColumns();
208210
}
@@ -933,8 +935,6 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
933935
public ngOnInit() {
934936
// pivot grid always generates columns automatically.
935937
this.autoGenerate = true;
936-
const config = this.pivotConfiguration;
937-
this.filteringExpressionsTree = PivotUtil.buildExpressionTree(config);
938938
super.ngOnInit();
939939
}
940940

@@ -1696,6 +1696,28 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
16961696
this.cdr.detectChanges();
16971697
}
16981698

1699+
/**
1700+
* Filters a single `IPivotDimension`.
1701+
*
1702+
* @example
1703+
* ```typescript
1704+
* public filter() {
1705+
* const set = new Set();
1706+
* set.add('Value 1');
1707+
* set.add('Value 2');
1708+
* this.grid1.filterDimension(this.pivotConfigHierarchy.rows[0], set, IgxStringFilteringOperand.instance().condition('in'));
1709+
* }
1710+
* ```
1711+
*/
1712+
public filterDimension(dimension: IPivotDimension, value: any, conditionOrExpressionTree?: IFilteringOperation | IFilteringExpressionsTree ) {
1713+
this.filteringService.filter(dimension.memberName, value, conditionOrExpressionTree);
1714+
const dimensionType = this.getDimensionType(dimension);
1715+
if (dimensionType === PivotDimensionType.Column) {
1716+
this.setupColumns();
1717+
}
1718+
this.cdr.detectChanges();
1719+
}
1720+
16991721
/**
17001722
* @hidden @internal
17011723
*/

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { GridColumnDataType } from '../../data-operations/data-util';
2-
import { FilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
2+
import { IFilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
33
import { SortingDirection } from '../../data-operations/sorting-strategy';
44
import { ColumnType } from '../common/grid.interface';
55

@@ -99,7 +99,7 @@ export interface IPivotDimension {
9999
/**
100100
* A predefined or defined via the `igxPivotSelector` filter expression tree for the current dimension to be applied in the filter pipe.
101101
* */
102-
filter?: FilteringExpressionsTree | null;
102+
filter?: IFilteringExpressionsTree | null;
103103
/**
104104
* The sorting direction of the current dimension. Determines the order in which the values will appear in the related dimension.
105105
*/

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

+72
Original file line numberDiff line numberDiff line change
@@ -2507,5 +2507,77 @@ describe('IgxPivotGrid #pivotGrid', () => {
25072507
expect(pivotGrid.gridAPI.get_cell_by_index(0, 0).nativeElement.innerText).toBe('Accessories/Plovdiv:undefined');
25082508
expect(pivotGrid.gridAPI.get_cell_by_index(0, 3).nativeElement.innerText).toBe('Accessories/London:293');
25092509
});
2510+
2511+
it('should allow filtering a dimension runtime.', () => {
2512+
const colValues = new Set();
2513+
colValues.add('US');
2514+
colValues.add('UK');
2515+
pivotGrid.filterDimension(pivotGrid.pivotConfiguration.columns[0], colValues, IgxStringFilteringOperand.instance().condition('in'));
2516+
expect(pivotGrid.columns.length).toBe(6);
2517+
expect(pivotGrid.columns.filter(x => x.columnGroup).map(x => x.field)).toEqual(['US', 'UK']);
2518+
expect(pivotGrid.filteringExpressionsTree.filteringOperands.length).toEqual(1);
2519+
2520+
const rowValues = new Set();
2521+
rowValues.add('Clothing');
2522+
pivotGrid.filterDimension(pivotGrid.pivotConfiguration.rows[1].childLevel, rowValues, IgxStringFilteringOperand.instance().condition('in'));
2523+
expect(pivotGrid.rowList.length).toBe(4);
2524+
const rowDimData = pivotGrid.rowList.map(x => (x as IgxPivotRowComponent).data.dimensionValues.get('ProductCategory'))
2525+
expect(rowDimData).toEqual([undefined, 'Clothing', undefined, 'Clothing']);
2526+
expect(pivotGrid.filteringExpressionsTree.filteringOperands.length).toEqual(2);
2527+
});
2528+
2529+
it('should update filtering on pivot configuration change.', () => {
2530+
fixture.detectChanges();
2531+
expect(pivotGrid.filteringExpressionsTree.filteringOperands.length).toEqual(0);
2532+
const filterColumnExpTree = new FilteringExpressionsTree(FilteringLogic.And);
2533+
filterColumnExpTree.filteringOperands = [
2534+
{
2535+
condition: IgxStringFilteringOperand.instance().condition('in'),
2536+
fieldName: 'City',
2537+
searchVal: new Set(['Ciudad de la Costa'])
2538+
}
2539+
];
2540+
const filterRowExpTree = new FilteringExpressionsTree(FilteringLogic.And);
2541+
filterRowExpTree.filteringOperands = [
2542+
{
2543+
condition: IgxStringFilteringOperand.instance().condition('in'),
2544+
fieldName: 'ProductCategory',
2545+
searchVal: new Set(['Bikes'])
2546+
}
2547+
];
2548+
pivotGrid.pivotConfiguration = {
2549+
columns: [
2550+
{
2551+
memberName: 'City',
2552+
enabled: true,
2553+
filter: filterColumnExpTree
2554+
}
2555+
],
2556+
rows: [
2557+
{
2558+
memberName: 'ProductCategory',
2559+
enabled: true,
2560+
filter: filterRowExpTree
2561+
}],
2562+
values: [
2563+
{
2564+
member: 'UnitsSold',
2565+
aggregate: {
2566+
aggregator: IgxPivotNumericAggregate.sum,
2567+
key: 'SUM',
2568+
label: 'Sum'
2569+
},
2570+
enabled: true
2571+
}
2572+
]
2573+
};
2574+
fixture.detectChanges();
2575+
expect(pivotGrid.filteringExpressionsTree.filteringOperands.length).toEqual(2);
2576+
2577+
expect(pivotGrid.columns.length).toBe(1);
2578+
expect(pivotGrid.columns[0].field).toEqual('Ciudad de la Costa');
2579+
expect(pivotGrid.rowList.length).toBe(1);
2580+
expect(pivotGrid.rowList.toArray()[0].data.dimensionValues.get('ProductCategory')).toBe('Bikes');
2581+
});
25102582
});
25112583
});

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ export class PivotUtil {
291291
}
292292

293293
public static buildExpressionTree(config: IPivotConfiguration) {
294-
const allDimensions = (config.rows || []).concat((config.columns || [])).concat(config.filters || []).filter(x => x !== null && x !== undefined);
294+
const allDimensions = (config?.rows || []).concat((config?.columns || [])).concat(config?.filters || []).filter(x => x !== null && x !== undefined);
295295
const enabledDimensions = allDimensions.filter(x => x && x.enabled);
296296

297297
const expressionsTree = new FilteringExpressionsTree(FilteringLogic.And);

src/app/pivot-grid/pivot-grid.sample.html

+2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@
5353
<button (click)="toggleVal()">Toggle</button>
5454
<button (click)="moveVal()">Move</button>
5555
<button (click)="insertVal()">Insert</button>
56+
<button (click)="filterDim()">filterDim</button>
57+
<button (click)="newConfig()">newConfig</button>
5658
</div>
5759
<div class="pivot-container">
5860
<div>

src/app/pivot-grid/pivot-grid.sample.ts

+39-3
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,14 @@ export class PivotGridSampleComponent {
105105

106106
public pivotConfigHierarchy: IPivotConfiguration = {
107107
columns: [
108-
this.dimensions[1]
109-
],
110-
rows: [
111108
{
112109
memberName: 'City',
113110
enabled: true,
114111
width: '100px'
115112
},
113+
],
114+
rows: [
115+
116116
this.dimensions[2],
117117
{
118118
memberName: 'SellerName',
@@ -344,4 +344,40 @@ export class PivotGridSampleComponent {
344344
}
345345
}, 0);
346346
}
347+
348+
public filterDim() {
349+
const set = new Set();
350+
set.add('New York');
351+
// for excel-style filters, condition is 'in' and value is a Set of values.
352+
this.grid1.filterDimension(this.pivotConfigHierarchy.columns[0], set, IgxStringFilteringOperand.instance().condition('in'));
353+
}
354+
355+
public newConfig() {
356+
this.pivotConfigHierarchy = {
357+
columns: [
358+
{
359+
memberName: 'City',
360+
enabled: true,
361+
},
362+
],
363+
rows: [
364+
{
365+
memberName: 'SellerName',
366+
enabled: true,
367+
filter: this.filterExpTree
368+
}
369+
],
370+
values: [
371+
{
372+
member: 'UnitsSold',
373+
aggregate: {
374+
key: 'SUM',
375+
aggregator: IgxPivotNumericAggregate.sum,
376+
label: 'Sum'
377+
},
378+
enabled: true,
379+
}
380+
]
381+
};
382+
}
347383
}

0 commit comments

Comments
 (0)