Skip to content

Commit 8870766

Browse files
committed
Merge branch 'pivot-grid-master' of https://github.com/IgniteUI/igniteui-angular into mdragnev/feat-10713
2 parents c082e76 + 7171802 commit 8870766

File tree

10 files changed

+123
-36
lines changed

10 files changed

+123
-36
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
@@ -22,9 +22,9 @@ export class IgxPivotFilteringService extends IgxFilteringService {
2222
const config = (grid as IgxPivotGridComponent).pivotConfiguration;
2323
const allDimensions = PivotUtil.flatten(config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null && x !== undefined));
2424
const dim = allDimensions.find(x => x.memberName === fieldName || x.member === fieldName);
25-
dim.filters = undefined;
25+
dim.filter = undefined;
2626
grid.filteringPipeTrigger++;
27-
if (PivotUtil.flatten(config.columns).indexOf(dim) !== -1) {
27+
if (allDimensions.indexOf(dim) !== -1) {
2828
// update columns
2929
(grid as any).setupColumns();
3030
}
@@ -37,16 +37,16 @@ export class IgxPivotFilteringService extends IgxFilteringService {
3737
const allDimensions = PivotUtil.flatten(config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null && x !== undefined));
3838
const enabledDimensions = allDimensions.filter(x => x && x.enabled);
3939
const dim = enabledDimensions.find(x => x.memberName === fieldName || x.member === fieldName);
40-
const filteringTree = dim.filters || new FilteringExpressionsTree(FilteringLogic.And);
40+
const filteringTree = dim.filter || new FilteringExpressionsTree(FilteringLogic.And);
4141
const fieldFilterIndex = filteringTree.findIndex(fieldName);
4242
if (fieldFilterIndex > -1) {
4343
filteringTree.filteringOperands.splice(fieldFilterIndex, 1);
4444
}
4545

4646
this.prepare_filtering_expression(filteringTree, fieldName, term, conditionOrExpressionsTree, ignoreCase, fieldFilterIndex);
47-
dim.filters = filteringTree;
47+
dim.filter = filteringTree;
4848
grid.filteringPipeTrigger++;
49-
if (PivotUtil.flatten(config.columns).indexOf(dim) !== -1) {
49+
if (allDimensions.indexOf(dim) !== -1) {
5050
// update columns
5151
(grid as any).setupColumns();
5252
}

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

Lines changed: 13 additions & 5 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,
@@ -33,7 +32,7 @@ import { IgxForOfSyncService, IgxForOfScrollSyncService } from '../../directives
3332
import { ColumnType, 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';
@@ -313,6 +312,13 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
313312
*/
314313
public dragRowID = null;
315314

315+
/**
316+
* @hidden @internal
317+
*/
318+
public get rootSummariesEnabled(): boolean {
319+
return false;
320+
}
321+
316322
protected _defaultExpandState = false;
317323
private _data;
318324
private _filteredData;
@@ -542,6 +548,8 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
542548
// pivot grid always generates columns automatically.
543549
this.autoGenerate = true;
544550
this.uniqueColumnValuesStrategy = this.uniqueColumnValuesStrategy || this.uniqueDimensionValuesStrategy;
551+
const config = this.pivotConfiguration;
552+
this.filteringExpressionsTree = PivotUtil.buildExpressionTree(config);
545553
super.ngOnInit();
546554
}
547555

@@ -1047,7 +1055,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
10471055
*/
10481056
protected autogenerateColumns() {
10491057
let columns = [];
1050-
const data = this.gridAPI.get_data();
1058+
const data = this.gridAPI.filterDataByExpressions(this.filteringExpressionsTree);
10511059
this.dimensionDataColumns = this.generateDimensionColumns();
10521060
let fieldsMap;
10531061
if (this.pivotConfiguration.columnStrategy && this.pivotConfiguration.columnStrategy instanceof NoopPivotDimensionsStrategy) {
@@ -1127,9 +1135,9 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
11271135
}
11281136
currentFields.forEach((value, key) => {
11291137
let shouldGenerate = true;
1130-
if (value.dimension && value.dimension.filters) {
1138+
if (value.dimension && value.dimension.filter) {
11311139
const state = {
1132-
expressionsTree: value.dimension.filters.filteringOperands[0],
1140+
expressionsTree: value.dimension.filter.filteringOperands[0],
11331141
strategy: this.filterStrategy || new DimensionValuesFilteringStrategy(),
11341142
advancedFilteringExpressionsTree: this.advancedFilteringExpressionsTree
11351143
};

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 & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { fakeAsync, TestBed } from '@angular/core/testing';
22
import { By } from '@angular/platform-browser';
33
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
44
import { IgxChipComponent } from '../../chips/chip.component';
5+
import { FilteringExpressionsTree, FilteringLogic, IgxStringFilteringOperand } from 'igniteui-angular';
56
import { IgxChipsAreaComponent } from '../../chips/chips-area.component';
67
import { configureTestSuite } from '../../test-utils/configure-suite';
78
import { GridFunctions, GridSelectionFunctions } from '../../test-utils/grid-functions.spec';
@@ -110,6 +111,37 @@ describe('Basic IgxPivotGrid #pivotGrid', () => {
110111
expect(pivotGrid.columns.length).not.toBe(9);
111112
});
112113

114+
it('should remove filter dimension from chip', () => {
115+
const pivotGrid = fixture.componentInstance.pivotGrid;
116+
117+
const filteringExpressionTree = new FilteringExpressionsTree(FilteringLogic.And);
118+
filteringExpressionTree.filteringOperands = [
119+
{
120+
condition: IgxStringFilteringOperand.instance().condition('equals'),
121+
fieldName: 'SellerName',
122+
searchVal: 'Stanley'
123+
}
124+
];
125+
const filterDimension = {
126+
memberName: 'SellerName',
127+
enabled: true,
128+
filter: filteringExpressionTree
129+
};
130+
pivotGrid.pivotConfiguration.filters = [filterDimension];
131+
pivotGrid.pipeTrigger++;
132+
fixture.detectChanges();
133+
expect(pivotGrid.pivotConfiguration.filters[0].enabled).toBeTrue();
134+
expect(pivotGrid.rowList.length).toBe(2);
135+
136+
const headerRow = fixture.nativeElement.querySelector('igx-pivot-header-row');
137+
const rowChip = headerRow.querySelector('igx-chip[id="SellerName"]');
138+
const removeIcon = rowChip.querySelectorAll('igx-icon')[2];
139+
removeIcon.click();
140+
fixture.detectChanges();
141+
expect(pivotGrid.pivotConfiguration.filters[0].enabled).toBeFalse();
142+
expect(pivotGrid.rowList.length).toBe(5);
143+
});
144+
113145
it('should collapse column with 1 value dimension', () => {
114146
const pivotGrid = fixture.componentInstance.pivotGrid;
115147
pivotGrid.pivotConfiguration.values.pop();
@@ -639,6 +671,29 @@ describe('Basic IgxPivotGrid #pivotGrid', () => {
639671
expect(pivotGrid.gridAPI.get_cell_by_index(0, 'USA').value).toBe(0);
640672
expect(pivotGrid.gridAPI.get_cell_by_index(0, 'Uruguay').value).toBe(242.08);
641673
});
674+
it('should show one aggregations drop-down at a time', () => {
675+
const pivotGrid = fixture.componentInstance.pivotGrid;
676+
pivotGrid.width = '1500px';
677+
fixture.detectChanges();
678+
const headerRow = fixture.nativeElement.querySelector('igx-pivot-header-row');
679+
const valueChipUnitsSold = headerRow.querySelector('igx-chip[id="UnitsSold"]');
680+
681+
const aggregatesIconUnitsSold = valueChipUnitsSold.querySelectorAll('igx-icon')[1];
682+
aggregatesIconUnitsSold.click();
683+
fixture.detectChanges();
684+
685+
let dropDown = fixture.debugElement.queryAll(By.css(`.${CSS_CLASS_LIST}`));
686+
expect(dropDown.length).toBe(1);
687+
688+
const valueChipUnitPrice = headerRow.querySelector('igx-chip[id="UnitPrice"]');
689+
690+
const aggregatesIconUnitPrice = valueChipUnitPrice.querySelectorAll('igx-icon')[1];
691+
aggregatesIconUnitPrice.click();
692+
fixture.detectChanges();
693+
694+
dropDown = fixture.debugElement.queryAll(By.css(`.${CSS_CLASS_LIST}`));
695+
expect(dropDown.length).toBe(1);
696+
});
642697

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

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent {
178178
this.grid.setupColumns();
179179
this.grid.filteringService.clearFilter(col.memberName);
180180
this.grid.pipeTrigger++;
181-
this.grid.dimensionsChange.emit({ dimensions: this.grid.pivotConfiguration.columns, dimensionCollectionType: PivotDimensionType.Row });
181+
this.grid.dimensionsChange.emit({dimensions: this.grid.pivotConfiguration.columns, dimensionCollectionType: PivotDimensionType.Row});
182+
this.grid.reflow();
182183
}
183184

184185
public valueRemoved(event: IBaseChipEventArgs) {

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]));

projects/igniteui-angular/src/lib/grids/watch-changes.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ export function notifyChanges(repaint = false) {
7474

7575

7676
const originalSetter = propDesc ? propDesc.set : null;
77-
7877
propDesc.get = propDesc.get || (function(this) {
7978
return this[privateKey];
8079
});
@@ -83,15 +82,17 @@ export function notifyChanges(repaint = false) {
8382
if (originalSetter) {
8483
originalSetter.call(this, newValue);
8584
if (this.grid) {
86-
this.grid.notifyChanges(repaint);
85+
const shouldRepaint = this.grid.isPivot ? false : repaint;
86+
this.grid.notifyChanges(shouldRepaint);
8787
}
8888
} else {
8989
if (newValue === this[key]) {
9090
return;
9191
}
9292
this[privateKey] = newValue;
9393
if (this.grid) {
94-
this.grid.notifyChanges(repaint);
94+
const shouldRepaint = this.grid.isPivot ? false : repaint;
95+
this.grid.notifyChanges(shouldRepaint);
9596
}
9697
}
9798
};

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
placeholder="Dimension(s)" searchPlaceholder="Search...">
77
</igx-combo>
88
</div>
9-
<igx-pivot-grid #grid1 [data]="origData" [pivotConfiguration]="pivotConfigHierarchy" (dimensionsChange)='dimensionChange($event)' [defaultExpandState]='true'>
9+
<igx-pivot-grid [displayDensity]='"compact"' #grid1 [data]="origData" [pivotConfiguration]="pivotConfigHierarchy" (dimensionsChange)='dimensionChange($event)' [defaultExpandState]='true'>
1010
</igx-pivot-grid>
1111

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

Lines changed: 23 additions & 10 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',
@@ -142,15 +157,13 @@ export class PivotGridSampleComponent {
142157
},
143158
}
144159
],
145-
filters: [{
146-
memberName: 'ProductCategory',
147-
enabled:true,
148-
},
149-
this.dimensions[3],
150-
{
151-
memberName: 'City',
152-
enabled: true
153-
}]
160+
filters: [
161+
{
162+
memberName: 'SellerName',
163+
enabled: true,
164+
filter: this.filterExpTree
165+
}
166+
]
154167
};
155168

156169
public origData = [

0 commit comments

Comments
 (0)