Skip to content

Commit 34cf776

Browse files
committed
Merge branch 'pivot-grid-master' of https://github.com/IgniteUI/igniteui-angular into pivot-grid-master
� Conflicts: � src/app/pivot-grid/pivot-grid.sample.html
2 parents 610db3d + 2045176 commit 34cf776

File tree

9 files changed

+261
-124
lines changed

9 files changed

+261
-124
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { IGridGroupingStrategy, IGridSortingStrategy } from './strategy';
3434
import { IForOfState, IgxGridForOfDirective } from '../../directives/for-of/for_of.directive';
3535
import { OverlaySettings } from '../../services/overlay/utilities';
3636
import { IPinningConfig } from '../grid.common';
37-
import { IPivotConfiguration, IPivotDimension, IPivotValue } from '../pivot-grid/pivot-grid.interface';
37+
import { IDimensionsChange, IPivotConfiguration, IPivotDimension, IPivotValue, IValuesChange } from '../pivot-grid/pivot-grid.interface';
3838

3939

4040
export const IGX_GRID_BASE = new InjectionToken<GridType>('IgxGridBaseToken');
@@ -628,6 +628,8 @@ export interface PivotGridType extends GridType {
628628
setupColumns(): void;
629629
toggleRow(rowID: any): void;
630630
resolveDataTypes(field: any): GridColumnDataType;
631+
dimensionsChange: EventEmitter<IDimensionsChange>;
632+
valuesChange: EventEmitter<IValuesChange>;
631633
}
632634
export interface GridSVGIcon {
633635
name: string;

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

Lines changed: 93 additions & 54 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 { IPivotConfiguration, IPivotDimension, IPivotKeys, PivotDimensionType } from './pivot-grid.interface';
36+
import { 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';
@@ -86,6 +86,34 @@ const MINIMUM_COLUMN_WIDTH = 200;
8686
export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnInit, AfterContentInit,
8787
GridType, AfterViewInit {
8888

89+
/**
90+
* Emitted when the dimension collection is changed via the grid chip area.
91+
*
92+
* @remarks
93+
* Returns the new dimension collection and its type:
94+
* @example
95+
* ```html
96+
* <igx-pivot-grid #grid [data]="localData" [height]="'305px'" [autoGenerate]="true"
97+
* (dimensionsChange)="dimensionsChange($event)"></igx-grid>
98+
* ```
99+
*/
100+
@Output()
101+
public dimensionsChange = new EventEmitter<IDimensionsChange>();
102+
103+
/**
104+
* Emitted when the values collection is changed via the grid chip area.
105+
*
106+
* @remarks
107+
* Returns the new dimension
108+
* @example
109+
* ```html
110+
* <igx-pivot-grid #grid [data]="localData" [height]="'305px'" [autoGenerate]="true"
111+
* (valuesChange)="valuesChange($event)"></igx-grid>
112+
* ```
113+
*/
114+
@Output()
115+
public valuesChange = new EventEmitter<IValuesChange>();
116+
89117
/** @hidden @internal */
90118
@ViewChild(IgxPivotHeaderRowComponent, { static: true })
91119
public theadRow: IgxPivotHeaderRowComponent;
@@ -266,7 +294,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
266294

267295
public columnGroupStates = new Map<string, boolean>();
268296
public dimensionDataColumns;
269-
public pivotKeys: IPivotKeys = {aggregations: 'aggregations', records: 'records', children: 'children', level: 'level'};
297+
public pivotKeys: IPivotKeys = { aggregations: 'aggregations', records: 'records', children: 'children', level: 'level' };
270298
public isPivot = true;
271299

272300
/**
@@ -442,29 +470,29 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
442470
@Inject(LOCALE_ID) localeId: string,
443471
protected platform: PlatformUtil,
444472
@Optional() @Inject(IgxGridTransaction) protected _diTransactions?: TransactionService<Transaction, State>) {
445-
super(
446-
selectionService,
447-
colResizingService,
448-
gridAPI,
449-
transactionFactory,
450-
elementRef,
451-
zone,
452-
document,
453-
cdr,
454-
resolver,
455-
differs,
456-
viewRef,
457-
appRef,
458-
moduleRef,
459-
factoryResolver,
460-
injector,
461-
navigation,
462-
filteringService,
463-
overlayService,
464-
summaryService,
465-
_displayDensityOptions,
466-
localeId,
467-
platform);
473+
super(
474+
selectionService,
475+
colResizingService,
476+
gridAPI,
477+
transactionFactory,
478+
elementRef,
479+
zone,
480+
document,
481+
cdr,
482+
resolver,
483+
differs,
484+
viewRef,
485+
appRef,
486+
moduleRef,
487+
factoryResolver,
488+
injector,
489+
navigation,
490+
filteringService,
491+
overlayService,
492+
summaryService,
493+
_displayDensityOptions,
494+
localeId,
495+
platform);
468496
}
469497

470498
/**
@@ -494,6 +522,17 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
494522
});
495523
}
496524

525+
/**
526+
* Notifies for dimension change.
527+
*/
528+
public notifyDimensionChange(regenerateColumns = false) {
529+
if (regenerateColumns) {
530+
this.setupColumns();
531+
}
532+
this.pipeTrigger++;
533+
this.cdr.detectChanges();
534+
}
535+
497536
public uniqueDimensionValuesStrategy(column: IgxColumnComponent, exprTree: IFilteringExpressionsTree,
498537
done: (uniqueValues: any[]) => void) {
499538
const config = this.pivotConfiguration;
@@ -508,24 +547,24 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
508547
public getDimensionData(dim: IPivotDimension,
509548
dimExprTree: IFilteringExpressionsTree,
510549
done: (colVals: any[]) => void) {
511-
let columnValues = [];
512-
const data = this.gridAPI.get_data();
513-
const state = {
514-
expressionsTree: dimExprTree,
515-
strategy: this.filterStrategy || new DimensionValuesFilteringStrategy(),
516-
advancedFilteringExpressionsTree: this.advancedFilteringExpressionsTree
517-
};
518-
const filtered = DataUtil.filter(data, state, this);
519-
const allValuesHierarchy = PivotUtil.getFieldsHierarchy(
520-
filtered,
521-
[dim],
522-
PivotDimensionType.Column,
523-
{aggregations: 'aggregations', records: 'records', children: 'children', level: 'level'}
524-
);
525-
const flatData = Array.from(allValuesHierarchy.values());
526-
columnValues = flatData.map(record => this.extractValue(record['value']));
527-
done(columnValues);
528-
return;
550+
let columnValues = [];
551+
const data = this.gridAPI.get_data();
552+
const state = {
553+
expressionsTree: dimExprTree,
554+
strategy: this.filterStrategy || new DimensionValuesFilteringStrategy(),
555+
advancedFilteringExpressionsTree: this.advancedFilteringExpressionsTree
556+
};
557+
const filtered = DataUtil.filter(data, state, this);
558+
const allValuesHierarchy = PivotUtil.getFieldsHierarchy(
559+
filtered,
560+
[dim],
561+
PivotDimensionType.Column,
562+
{ aggregations: 'aggregations', records: 'records', children: 'children', level: 'level' }
563+
);
564+
const flatData = Array.from(allValuesHierarchy.values());
565+
columnValues = flatData.map(record => this.extractValue(record['value']));
566+
done(columnValues);
567+
return;
529568
}
530569

531570
/** @hidden */
@@ -926,12 +965,12 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
926965
/**
927966
* @hidden
928967
*/
929-
protected autogenerateColumns() {
930-
let columns = [];
931-
const data = this.gridAPI.get_data();
932-
this.dimensionDataColumns = this.generateDimensionColumns();
933-
let fieldsMap;
934-
if (this.pivotConfiguration.columnStrategy && this.pivotConfiguration.columnStrategy instanceof NoopPivotDimensionsStrategy) {
968+
protected autogenerateColumns() {
969+
let columns = [];
970+
const data = this.gridAPI.get_data();
971+
this.dimensionDataColumns = this.generateDimensionColumns();
972+
let fieldsMap;
973+
if (this.pivotConfiguration.columnStrategy && this.pivotConfiguration.columnStrategy instanceof NoopPivotDimensionsStrategy) {
935974
const fields = this.generateDataFields(data);
936975
const rowFields = PivotUtil.flatten(this.pivotConfiguration.rows).map(x => x.memberName);
937976
const keyFields = Object.values(this.pivotKeys);
@@ -940,10 +979,10 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
940979
fieldsMap = this.generateFromData(filteredFields);
941980
} else {
942981
fieldsMap = PivotUtil.getFieldsHierarchy(
943-
data,
944-
this.columnDimensions,
945-
PivotDimensionType.Column,
946-
{aggregations: 'aggregations', records: 'records', children: 'children', level: 'level'}
982+
data,
983+
this.columnDimensions,
984+
PivotDimensionType.Column,
985+
{ aggregations: 'aggregations', records: 'records', children: 'children', level: 'level' }
947986
);
948987
}
949988
columns = this.generateColumnHierarchy(fieldsMap, data);
@@ -1035,7 +1074,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
10351074
columns = columns.concat(measureChildren);
10361075
}
10371076

1038-
} else if(shouldGenerate) {
1077+
} else if (shouldGenerate) {
10391078
const ref = factoryColumnGroup.create(this.viewRef.injector);
10401079
ref.instance.parent = parent;
10411080
ref.instance.field = key;

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@ 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 interface IDimensionsChange {
7+
dimensions: IPivotDimension[],
8+
dimensionCollectionType: PivotDimensionType
9+
}
10+
11+
export interface IValuesChange {
12+
values: IPivotValue[]
13+
}
614

715
export interface IPivotDimensionStrategy {
816
process(collection: any,

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent {
8484
row.enabled = false;
8585
this.grid.pipeTrigger++;
8686
this.grid.filteringService.clearFilter(row.memberName);
87+
this.grid.dimensionsChange.emit({dimensions: this.grid.pivotConfiguration.rows, dimensionCollectionType: PivotDimensionType.Row});
8788
}
8889

8990
public columnRemoved(event: IBaseChipEventArgs) {
@@ -92,20 +93,23 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent {
9293
this.grid.setupColumns();
9394
this.grid.filteringService.clearFilter(col.memberName);
9495
this.grid.pipeTrigger++;
96+
this.grid.dimensionsChange.emit({dimensions: this.grid.pivotConfiguration.columns, dimensionCollectionType: PivotDimensionType.Row});
9597
}
9698

9799
public valueRemoved(event: IBaseChipEventArgs) {
98100
const value = this.grid.pivotConfiguration.values.find(x => x.member === event.owner.id);
99101
value.enabled = false;
100102
this.grid.setupColumns();
101103
this.grid.pipeTrigger++;
104+
this.grid.valuesChange.emit({values: this.grid.pivotConfiguration.values});
102105
}
103106

104107
public filterRemoved(event: IBaseChipEventArgs) {
105108
const filter = this.grid.pivotConfiguration.filters.find(x => x.memberName === event.owner.id);
106109
filter.enabled = false;
107110
this.grid.filteringService.clearFilter(filter.memberName);
108111
this.grid.pipeTrigger++;
112+
this.grid.dimensionsChange.emit({dimensions: this.grid.pivotConfiguration.filters, dimensionCollectionType: PivotDimensionType.Filter});
109113
}
110114

111115
public onFilteringIconPointerDown(event) {
@@ -243,6 +247,7 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent {
243247
currentDim.splice(dragChipIndex, 1);
244248
currentDim.splice(dragChipIndex > chipIndex ? chipIndex : chipIndex - 1, 0, newDim);
245249
this.grid.setupColumns();
250+
this.grid.valuesChange.emit({values: this.grid.pivotConfiguration.values});
246251
}
247252
}
248253

@@ -299,6 +304,7 @@ export class IgxPivotHeaderRowComponent extends IgxGridHeaderRowComponent {
299304
this.grid.setupColumns();
300305
}
301306
this.grid.pipeTrigger++;
307+
this.grid.dimensionsChange.emit({dimensions: currentDim, dimensionCollectionType: dimension});
302308
}
303309

304310
protected getDimensionsByType(dimension: PivotDimensionType) {
Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
<igx-pivot-grid
2-
#grid1
3-
[data]="origData"
4-
[pivotConfiguration]="pivotConfigHierarchy">
5-
</igx-pivot-grid>
6-
1+
<div class="sample-column">
2+
<span>Dimensions:</span>
3+
<igx-combo #combo class="combo" [itemsMaxHeight]="250" (selectionChanging)="handleChange($event)"
4+
[data]="dimensions" [displayKey]="'memberName'" [(ngModel)]="selected"
5+
placeholder="Dimension(s)" searchPlaceholder="Search...">
6+
</igx-combo>
7+
<igx-pivot-grid #grid1 [data]="origData" [pivotConfiguration]="pivotConfigHierarchy" (dimensionsChange)='dimensionChange($event)'>
8+
</igx-pivot-grid>
9+
</div>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@
2121
}
2222

2323
.sample-column {
24-
max-width: 900px;
24+
max-width: 1200px;
2525
}
2626
}

0 commit comments

Comments
 (0)