Skip to content

Commit 7171802

Browse files
authored
Merge pull request #10745 from IgniteUI/dkamburov/pivot-tests
fix(pivot): Fix specifying filter in dimensions
2 parents c3324f6 + 53de92f commit 7171802

File tree

7 files changed

+110
-25
lines changed

7 files changed

+110
-25
lines changed

projects/igniteui-angular/src/lib/grids/grid-base.directive.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import { FilteringLogic, IFilteringExpression } from '../data-operations/filteri
4343
import { IGroupByRecord } from '../data-operations/groupby-record.interface';
4444
import { IgxGridForOfDirective } from '../directives/for-of/for_of.directive';
4545
import { IgxTextHighlightDirective } from '../directives/text-highlight/text-highlight.directive';
46-
import { IgxSummaryOperand, ISummaryExpression } from './summaries/grid-summary';
46+
import { ISummaryExpression } from './summaries/grid-summary';
4747
import { RowEditPositionStrategy, IPinningConfig } from './grid.common';
4848
import { IgxGridToolbarComponent } from './toolbar/grid-toolbar.component';
4949
import { IgxRowDirective } from './row.directive';

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ export class IgxPivotFilteringService extends IgxFilteringService {
1818
const config = (grid as IgxPivotGridComponent).pivotConfiguration;
1919
const allDimensions = PivotUtil.flatten(config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null && x !== undefined));
2020
const dim = allDimensions.find(x => x.memberName === fieldName || x.member === fieldName);
21-
dim.filters = undefined;
21+
dim.filter = undefined;
2222
grid.filteringPipeTrigger++;
23-
if (PivotUtil.flatten(config.columns).indexOf(dim) !== -1) {
23+
if (allDimensions.indexOf(dim) !== -1) {
2424
// update columns
2525
(grid as any).setupColumns();
2626
}
@@ -33,16 +33,16 @@ export class IgxPivotFilteringService extends IgxFilteringService {
3333
const allDimensions = PivotUtil.flatten(config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null && x !== undefined));
3434
const enabledDimensions = allDimensions.filter(x => x && x.enabled);
3535
const dim = enabledDimensions.find(x => x.memberName === fieldName || x.member === fieldName);
36-
const filteringTree = dim.filters || new FilteringExpressionsTree(FilteringLogic.And);
36+
const filteringTree = dim.filter || new FilteringExpressionsTree(FilteringLogic.And);
3737
const fieldFilterIndex = filteringTree.findIndex(fieldName);
3838
if (fieldFilterIndex > -1) {
3939
filteringTree.filteringOperands.splice(fieldFilterIndex, 1);
4040
}
4141

4242
this.prepare_filtering_expression(filteringTree, fieldName, term, conditionOrExpressionsTree, ignoreCase, fieldFilterIndex);
43-
dim.filters = filteringTree;
43+
dim.filter = filteringTree;
4444
grid.filteringPipeTrigger++;
45-
if (PivotUtil.flatten(config.columns).indexOf(dim) !== -1) {
45+
if (allDimensions.indexOf(dim) !== -1) {
4646
// update columns
4747
(grid as any).setupColumns();
4848
}

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
EventEmitter,
88
ComponentFactoryResolver,
99
ElementRef,
10-
forwardRef,
1110
HostBinding,
1211
Inject,
1312
Input,
@@ -30,10 +29,10 @@ import { IgxGridBaseDirective } from '../grid-base.directive';
3029
import { IgxFilteringService } from '../filtering/grid-filtering.service';
3130
import { IgxGridSelectionService } from '../selection/selection.service';
3231
import { IgxForOfSyncService, IgxForOfScrollSyncService } from '../../directives/for-of/for_of.sync.service';
33-
import { GridServiceType, GridType, IGX_GRID_BASE, IGX_GRID_SERVICE_BASE, RowType } from '../common/grid.interface';
32+
import { GridType, IGX_GRID_BASE, RowType } from '../common/grid.interface';
3433
import { IgxGridCRUDService } from '../common/crud.service';
3534
import { IgxGridSummaryService } from '../summaries/grid-summary.service';
36-
import { DEFAULT_PIVOT_KEYS, IDimensionsChange, IPivotConfiguration, IPivotDimension, IPivotKeys, IValuesChange, PivotDimensionType } from './pivot-grid.interface';
35+
import { DEFAULT_PIVOT_KEYS, IDimensionsChange, IPivotConfiguration, IPivotDimension, IValuesChange, PivotDimensionType } from './pivot-grid.interface';
3736
import { IgxPivotHeaderRowComponent } from './pivot-header-row.component';
3837
import { IgxColumnGroupComponent } from '../columns/column-group.component';
3938
import { IgxColumnComponent } from '../columns/column.component';
@@ -551,6 +550,8 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
551550
// pivot grid always generates columns automatically.
552551
this.autoGenerate = true;
553552
this.uniqueColumnValuesStrategy = this.uniqueColumnValuesStrategy || this.uniqueDimensionValuesStrategy;
553+
const config = this.pivotConfiguration;
554+
this.filteringExpressionsTree = PivotUtil.buildExpressionTree(config);
554555
super.ngOnInit();
555556
}
556557

@@ -1042,7 +1043,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
10421043
*/
10431044
protected autogenerateColumns() {
10441045
let columns = [];
1045-
const data = this.gridAPI.get_data();
1046+
const data = this.gridAPI.filterDataByExpressions(this.filteringExpressionsTree);
10461047
this.dimensionDataColumns = this.generateDimensionColumns();
10471048
let fieldsMap;
10481049
if (this.pivotConfiguration.columnStrategy && this.pivotConfiguration.columnStrategy instanceof NoopPivotDimensionsStrategy) {
@@ -1122,9 +1123,9 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
11221123
}
11231124
currentFields.forEach((value, key) => {
11241125
let shouldGenerate = true;
1125-
if (value.dimension && value.dimension.filters) {
1126+
if (value.dimension && value.dimension.filter) {
11261127
const state = {
1127-
expressionsTree: value.dimension.filters.filteringOperands[0],
1128+
expressionsTree: value.dimension.filter.filteringOperands[0],
11281129
strategy: this.filterStrategy || new DimensionValuesFilteringStrategy(),
11291130
advancedFilteringExpressionsTree: this.advancedFilteringExpressionsTree
11301131
};

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ 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 { DEFAULT_PIVOT_KEYS, IPivotConfiguration, IPivotKeys } from './pivot-grid.interface';
6+
import { DEFAULT_PIVOT_KEYS, IPivotConfiguration, IPivotDimension, IPivotKeys } from './pivot-grid.interface';
77
import {
88
DefaultPivotSortingStrategy, DimensionValuesFilteringStrategy, PivotColumnDimensionsStrategy,
99
PivotRowDimensionsStrategy
@@ -138,16 +138,8 @@ export class IgxPivotGridFilterPipe implements PipeTransform {
138138
advancedExpressionsTree: IFilteringExpressionsTree,
139139
_filterPipeTrigger: number,
140140
_pipeTrigger: number): any[] {
141-
const allDimensions = config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null && x !== undefined);
142-
const enabledDimensions = allDimensions.filter(x => x && x.enabled);
141+
const expressionsTree = PivotUtil.buildExpressionTree(config);
143142

144-
const expressionsTree = new FilteringExpressionsTree(FilteringLogic.And);
145-
// add expression trees from all filters
146-
PivotUtil.flatten(enabledDimensions).forEach(x => {
147-
if (x.filters) {
148-
expressionsTree.filteringOperands.push(x.filters);
149-
}
150-
});
151143
const state = {
152144
expressionsTree,
153145
strategy: filterStrategy || new DimensionValuesFilteringStrategy(),

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

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { fakeAsync, TestBed } from '@angular/core/testing';
22
import { By } from '@angular/platform-browser';
33
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
4-
import { IgxPivotDateDimension, IgxPivotGridModule } from 'igniteui-angular';
4+
import { FilteringExpressionsTree, FilteringLogic, IgxPivotDateDimension, IgxPivotGridModule, IgxStringFilteringOperand } from 'igniteui-angular';
55
import { IgxChipsAreaComponent } from '../../chips/chips-area.component';
66
import { configureTestSuite } from '../../test-utils/configure-suite';
77
import { GridFunctions, GridSelectionFunctions } from '../../test-utils/grid-functions.spec';
@@ -109,6 +109,37 @@ describe('Basic IgxPivotGrid #pivotGrid', () => {
109109
expect(pivotGrid.columns.length).not.toBe(9);
110110
});
111111

112+
it('should remove filter dimension from chip', () => {
113+
const pivotGrid = fixture.componentInstance.pivotGrid;
114+
115+
const filteringExpressionTree = new FilteringExpressionsTree(FilteringLogic.And);
116+
filteringExpressionTree.filteringOperands = [
117+
{
118+
condition: IgxStringFilteringOperand.instance().condition('equals'),
119+
fieldName: 'SellerName',
120+
searchVal: 'Stanley'
121+
}
122+
];
123+
const filterDimension = {
124+
memberName: 'SellerName',
125+
enabled: true,
126+
filter: filteringExpressionTree
127+
};
128+
pivotGrid.pivotConfiguration.filters = [filterDimension];
129+
pivotGrid.pipeTrigger++;
130+
fixture.detectChanges();
131+
expect(pivotGrid.pivotConfiguration.filters[0].enabled).toBeTrue();
132+
expect(pivotGrid.rowList.length).toBe(2);
133+
134+
const headerRow = fixture.nativeElement.querySelector('igx-pivot-header-row');
135+
const rowChip = headerRow.querySelector('igx-chip[id="SellerName"]');
136+
const removeIcon = rowChip.querySelectorAll('igx-icon')[2];
137+
removeIcon.click();
138+
fixture.detectChanges();
139+
expect(pivotGrid.pivotConfiguration.filters[0].enabled).toBeFalse();
140+
expect(pivotGrid.rowList.length).toBe(5);
141+
});
142+
112143
it('should collapse column with 1 value dimension', () => {
113144
const pivotGrid = fixture.componentInstance.pivotGrid;
114145
pivotGrid.pivotConfiguration.values.pop();
@@ -479,6 +510,29 @@ describe('Basic IgxPivotGrid #pivotGrid', () => {
479510
expect(pivotGrid.gridAPI.get_cell_by_index(0, 'USA').value).toBe(0);
480511
expect(pivotGrid.gridAPI.get_cell_by_index(0, 'Uruguay').value).toBe(242.08);
481512
});
513+
it('should show one aggregations drop-down at a time', () => {
514+
const pivotGrid = fixture.componentInstance.pivotGrid;
515+
pivotGrid.width = '1500px';
516+
fixture.detectChanges();
517+
const headerRow = fixture.nativeElement.querySelector('igx-pivot-header-row');
518+
const valueChipUnitsSold = headerRow.querySelector('igx-chip[id="UnitsSold"]');
519+
520+
const aggregatesIconUnitsSold = valueChipUnitsSold.querySelectorAll('igx-icon')[1];
521+
aggregatesIconUnitsSold.click();
522+
fixture.detectChanges();
523+
524+
let dropDown = fixture.debugElement.queryAll(By.css(`.${CSS_CLASS_LIST}`));
525+
expect(dropDown.length).toBe(1);
526+
527+
const valueChipUnitPrice = headerRow.querySelector('igx-chip[id="UnitPrice"]');
528+
529+
const aggregatesIconUnitPrice = valueChipUnitPrice.querySelectorAll('igx-icon')[1];
530+
aggregatesIconUnitPrice.click();
531+
fixture.detectChanges();
532+
533+
dropDown = fixture.debugElement.queryAll(By.css(`.${CSS_CLASS_LIST}`));
534+
expect(dropDown.length).toBe(1);
535+
});
482536

483537
it('should allow reorder in row chip area.', () => {
484538
const pivotGrid = fixture.componentInstance.pivotGrid;

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { cloneValue } from '../../core/utils';
22
import { DataUtil } from '../../data-operations/data-util';
3+
import { FilteringLogic } from '../../data-operations/filtering-expression.interface';
4+
import { FilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
35
import { ISortingExpression } from '../../data-operations/sorting-strategy';
46
import { IGridSortingStrategy, IgxSorting } from '../common/strategy';
57
import { IPivotConfiguration, IPivotDimension, IPivotKeys, IPivotValue, PivotDimensionType } from './pivot-grid.interface';
@@ -407,6 +409,21 @@ export class PivotUtil {
407409
return flatData;
408410
}
409411

412+
public static buildExpressionTree(config: IPivotConfiguration) {
413+
const allDimensions = config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null && x !== undefined);
414+
const enabledDimensions = allDimensions.filter(x => x && x.enabled);
415+
416+
const expressionsTree = new FilteringExpressionsTree(FilteringLogic.And);
417+
// add expression trees from all filters
418+
PivotUtil.flatten(enabledDimensions).forEach((x: IPivotDimension) => {
419+
if (x.filter && x.filter.filteringOperands) {
420+
expressionsTree.filteringOperands.push(...x.filter.filteringOperands);
421+
}
422+
});
423+
424+
return expressionsTree;
425+
}
426+
410427
private static collectRecords(children, pivotKeys: IPivotKeys) {
411428
let result = [];
412429
children.forEach(value => result = result.concat(value[pivotKeys.records]));

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import {
88
IgxPivotDateDimension,
99
IPivotDimension,
1010
IDimensionsChange,
11-
DisplayDensity
11+
DisplayDensity,
12+
FilteringExpressionsTree,
13+
FilteringLogic,
14+
IgxStringFilteringOperand
1215
} from 'igniteui-angular';
1316
import { HIERARCHICAL_SAMPLE_DATA } from '../shared/sample-data';
1417

@@ -49,6 +52,18 @@ export class PivotGridSampleComponent {
4952
public cosy: DisplayDensity = DisplayDensity.cosy;
5053
public compact: DisplayDensity = DisplayDensity.compact;
5154

55+
public filterExpTree = new FilteringExpressionsTree(FilteringLogic.And);
56+
57+
constructor() {
58+
this.filterExpTree.filteringOperands = [
59+
{
60+
condition: IgxStringFilteringOperand.instance().condition('equals'),
61+
fieldName: 'SellerName',
62+
searchVal: 'Stanley'
63+
}
64+
];
65+
}
66+
5267
public dimensions: IPivotDimension[] = [
5368
{
5469
memberName: 'Country',
@@ -139,7 +154,13 @@ export class PivotGridSampleComponent {
139154
},
140155
}
141156
],
142-
filters: null
157+
filters: [
158+
{
159+
memberName: 'SellerName',
160+
enabled: true,
161+
filter: this.filterExpTree
162+
}
163+
]
143164
};
144165

145166
public origData = [

0 commit comments

Comments
 (0)