Skip to content

Commit 0e62a88

Browse files
committed
feat(pivot): Update pivot to Angular 13 and partial ivy compilation
1 parent 290759e commit 0e62a88

14 files changed

+92
-247
lines changed

projects/igniteui-angular/src/lib/chips/chip.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ export class IgxChipComponent extends DisplayDensityBase {
814814
* @hidden
815815
* @internal
816816
*/
817-
public onChipOverHandler(event: IDropDroppedEventArgs) {
817+
public onChipOverHandler(event: IDropBaseEventArgs) {
818818
const eventArgs: IChipEnterDragAreaEventArgs = {
819819
owner: this,
820820
dragChip: event.drag.data.chip,

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ import { IPivotDimension, IPivotKeys, IPivotValue, PivotDimensionType } from '..
55
import { PivotUtil } from '../grids/pivot-grid/pivot-util';
66
import { FilteringStrategy } from './filtering-strategy';
77
import { GridColumnDataType } from './data-util';
8-
import { SortingDirection } from './sorting-expression.interface';
9-
import { DefaultSortingStrategy, ISortingStrategy } from './sorting-strategy';
8+
import { DefaultSortingStrategy, ISortingStrategy, SortingDirection } from './sorting-strategy';
109
import { parseDate } from '../core/utils';
1110

1211
export interface IPivotDimensionStrategy {
Lines changed: 5 additions & 177 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,4 @@
1-
import { cloneArray, IBaseEventArgs, parseDate, resolveNestedPath } from '../core/utils';
2-
import { GridType } from '../grids/common/grid.interface';
3-
import { IGroupByExpandState } from './groupby-expand-state.interface';
4-
import { IGroupByRecord } from './groupby-record.interface';
5-
import { IGroupingState } from './groupby-state.interface';
6-
import { IGroupingExpression } from './grouping-expression.interface';
7-
import { IGroupByResult } from './grouping-result.interface';
8-
import { getHierarchy, isHierarchyMatch } from './operations';
9-
10-
const DATE_TYPE = 'date';
11-
const TIME_TYPE = 'time';
12-
const DATE_TIME_TYPE = 'dateTime';
1+
import { IBaseEventArgs } from '../core/utils';
132

143
export enum SortingDirection {
154
None = 0,
@@ -32,8 +21,7 @@ export interface ISortingStrategy {
3221
ignoreCase: boolean,
3322
valueResolver: (obj: any, key: string, isDate?: boolean) => any,
3423
isDate?: boolean,
35-
isTime?: boolean,
36-
grid?: GridType
24+
isTime?: boolean
3725
) => any[];
3826
}
3927

@@ -85,8 +73,8 @@ export class DefaultSortingStrategy implements ISortingStrategy {
8573
isDate: boolean,
8674
isTime: boolean
8775
) {
88-
let a = valueResolver.call(this, obj1, key, isDate, isTime);
89-
let b = valueResolver.call(this, obj2, key, isDate, isTime);
76+
let a = valueResolver(obj1, key, isDate, isTime);
77+
let b = valueResolver(obj2, key, isDate, isTime);
9078
if (ignoreCase) {
9179
a = a && a.toLowerCase ? a.toLowerCase() : a;
9280
b = b && b.toLowerCase ? b.toLowerCase() : b;
@@ -97,164 +85,4 @@ export class DefaultSortingStrategy implements ISortingStrategy {
9785
protected arraySort(data: any[], compareFn?: (arg0: any, arg1: any) => number): any[] {
9886
return data.sort(compareFn);
9987
}
100-
}
101-
102-
export interface IGridSortingStrategy {
103-
sort(data: any[], expressions: ISortingExpression[], grid?: GridType): any[];
104-
}
105-
106-
export class NoopSortingStrategy implements IGridSortingStrategy {
107-
private static _instance: NoopSortingStrategy = null;
108-
109-
private constructor() { }
110-
111-
public static instance() {
112-
return this._instance || (this._instance = new NoopSortingStrategy());
113-
}
114-
115-
public sort(data: any[]): any[] {
116-
return data;
117-
}
118-
}
119-
120-
export class IgxSorting implements IGridSortingStrategy {
121-
public sort(data: any[], expressions: ISortingExpression[], grid?: GridType): any[] {
122-
return this.sortDataRecursive(data, expressions, 0, grid);
123-
}
124-
125-
protected groupDataRecursive<T>(data: T[], state: IGroupingState, level: number,
126-
parent: IGroupByRecord, metadata: IGroupByRecord[], grid: GridType = null,
127-
groupsRecords: any[] = [], fullResult: IGroupByResult = { data: [], metadata: [] }): T[] {
128-
const expressions = state.expressions;
129-
const expansion = state.expansion;
130-
let i = 0;
131-
let result = [];
132-
while (i < data.length) {
133-
const column = grid ? grid.getColumnByName(expressions[level].fieldName) : null;
134-
const isDate = column?.dataType === DATE_TYPE || column?.dataType === DATE_TIME_TYPE;
135-
const isTime = column?.dataType === TIME_TYPE;
136-
const group = this.groupedRecordsByExpression(data, i, expressions[level], isDate);
137-
const groupRow: IGroupByRecord = {
138-
expression: expressions[level],
139-
level,
140-
records: cloneArray(group),
141-
value: this.getFieldValue(group[0], expressions[level].fieldName, isDate, isTime),
142-
groupParent: parent,
143-
groups: [],
144-
height: grid ? grid.renderedRowHeight : null,
145-
column
146-
};
147-
if (parent) {
148-
parent.groups.push(groupRow);
149-
} else {
150-
groupsRecords.push(groupRow);
151-
}
152-
const hierarchy = getHierarchy(groupRow);
153-
const expandState: IGroupByExpandState = expansion.find((s) =>
154-
isHierarchyMatch(s.hierarchy || [{ fieldName: groupRow.expression.fieldName, value: groupRow.value }], hierarchy));
155-
const expanded = expandState ? expandState.expanded : state.defaultExpanded;
156-
let recursiveResult;
157-
result.push(groupRow);
158-
metadata.push(null);
159-
fullResult.data.push(groupRow);
160-
fullResult.metadata.push(null);
161-
if (level < expressions.length - 1) {
162-
recursiveResult = this.groupDataRecursive(group, state, level + 1, groupRow,
163-
expanded ? metadata : [], grid, groupsRecords, fullResult);
164-
if (expanded) {
165-
result = result.concat(recursiveResult);
166-
}
167-
} else {
168-
for (const groupItem of group) {
169-
fullResult.metadata.push(groupRow);
170-
fullResult.data.push(groupItem);
171-
}
172-
if (expanded) {
173-
metadata.push(...fullResult.metadata.slice(fullResult.metadata.length - group.length));
174-
result.push(...fullResult.data.slice(fullResult.data.length - group.length));
175-
}
176-
}
177-
i += group.length;
178-
}
179-
return result;
180-
}
181-
182-
protected getFieldValue(obj: any, key: string, isDate: boolean = false, isTime: boolean = false): any {
183-
let resolvedValue = resolveNestedPath(obj, key);
184-
if (isDate || isTime) {
185-
const date = parseDate(resolvedValue);
186-
resolvedValue = isTime && date ?
187-
new Date().setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()) : date;
188-
189-
}
190-
return resolvedValue;
191-
}
192-
193-
protected sortDataRecursive<T>(data: T[],
194-
expressions: ISortingExpression[],
195-
expressionIndex: number = 0,
196-
grid: GridType): T[] {
197-
let i;
198-
let j;
199-
let gbData;
200-
let gbDataLen;
201-
const exprsLen = expressions.length;
202-
const dataLen = data.length;
203-
expressionIndex = expressionIndex || 0;
204-
if (expressionIndex >= exprsLen || dataLen <= 1) {
205-
return data;
206-
}
207-
const expr: ISortingExpression = expressions[expressionIndex];
208-
if (!expr.strategy) {
209-
expr.strategy = DefaultSortingStrategy.instance();
210-
}
211-
const column = grid?.getColumnByName(expr.fieldName);
212-
const isDate = column?.dataType === DATE_TYPE || column?.dataType === DATE_TIME_TYPE;
213-
const isTime = column?.dataType === TIME_TYPE;
214-
data = expr.strategy.sort(data, expr.fieldName, expr.dir, expr.ignoreCase, this.getFieldValue, isDate, isTime, grid);
215-
if (expressionIndex === exprsLen - 1) {
216-
return data;
217-
}
218-
// in case of multiple sorting
219-
for (i = 0; i < dataLen; i++) {
220-
gbData = this.groupedRecordsByExpression(data, i, expr, isDate);
221-
gbDataLen = gbData.length;
222-
if (gbDataLen > 1) {
223-
gbData = this.sortDataRecursive(gbData, expressions, expressionIndex + 1, grid);
224-
}
225-
for (j = 0; j < gbDataLen; j++) {
226-
data[i + j] = gbData[j];
227-
}
228-
i += gbDataLen - 1;
229-
}
230-
return data;
231-
}
232-
233-
private groupedRecordsByExpression(data: any[],
234-
index: number,
235-
expression: IGroupingExpression,
236-
isDate: boolean = false): any[] {
237-
const res = [];
238-
const key = expression.fieldName;
239-
const len = data.length;
240-
const groupval = this.getFieldValue(data[index], key, isDate);
241-
res.push(data[index]);
242-
index++;
243-
const comparer = expression.groupingComparer || DefaultSortingStrategy.instance().compareValues;
244-
for (let i = index; i < len; i++) {
245-
if (comparer(this.getFieldValue(data[i], key, isDate), groupval) === 0) {
246-
res.push(data[i]);
247-
} else {
248-
break;
249-
}
250-
}
251-
return res;
252-
}
253-
}
254-
255-
export class IgxDataRecordSorting extends IgxSorting {
256-
257-
protected getFieldValue(obj: any, key: string, isDate: boolean = false, isTime: boolean = false): any {
258-
return super.getFieldValue(obj.data, key, isDate, isTime);
259-
}
260-
}
88+
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ 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';
38+
import { IgxColumnComponent } from '../columns/column.component';
39+
3740

3841
export const IGX_GRID_BASE = new InjectionToken<GridType>('IgxGridBaseToken');
3942
export const IGX_GRID_SERVICE_BASE = new InjectionToken<GridServiceType>('IgxGridServiceBaseToken');
@@ -264,6 +267,7 @@ export interface GridType extends IGridDataBindable {
264267
renderedRowHeight: number;
265268
pipeTrigger: number;
266269
summaryPipeTrigger: number;
270+
filteringPipeTrigger: number;
267271
hasColumnLayouts: boolean;
268272
isLoading: boolean;
269273

@@ -502,6 +506,8 @@ export interface GridType extends IGridDataBindable {
502506
groupingMetadata?: any[];
503507
selectedCells?: CellType[];
504508
selectedRows: any[];
509+
activeDescendant?: string;
510+
isPivot?: boolean;
505511

506512
toggleGroup?(groupRow: IGroupByRecord): void;
507513
clearGrouping?(field: string): void;
@@ -580,6 +586,7 @@ export interface GridType extends IGridDataBindable {
580586
toggleAllGroupRows?(): void;
581587
toggleAll?(): void;
582588
generateRowPath?(rowId: any): any[];
589+
preventHeaderScroll?(args: any): void;
583590

584591
}
585592

@@ -611,6 +618,17 @@ export interface HierarchicalGridType extends GridType {
611618
childLayoutKeys: any[];
612619
}
613620

621+
export interface PivotGridType extends GridType {
622+
pivotConfiguration: IPivotConfiguration;
623+
columnDimensions: IPivotDimension[];
624+
rowDimensions: IPivotDimension[];
625+
values: IPivotValue[];
626+
filterDimensions: IPivotDimension[];
627+
dimensionDataColumns: IgxColumnComponent[];
628+
pivotRowWidths: number;
629+
setupColumns(): void;
630+
toggleRow(rowID: any): void;
631+
}
614632
export interface GridSVGIcon {
615633
name: string;
616634
value: string;

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

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,17 @@ import {
2121
TemplateRef,
2222
ViewChild,
2323
ViewChildren,
24-
ViewContainerRef
24+
ViewContainerRef,
25+
Injector,
26+
NgModuleRef,
27+
ApplicationRef
2528
} from '@angular/core';
2629
import { IgxGridBaseDirective } from '../grid-base.directive';
2730
import { GridBaseAPIService } from '../api.service';
2831
import { IgxFilteringService } from '../filtering/grid-filtering.service';
2932
import { IgxGridSelectionService } from '../selection/selection.service';
3033
import { IgxForOfSyncService, IgxForOfScrollSyncService } from '../../directives/for-of/for_of.sync.service';
31-
import { GridType } from '../common/grid.interface';
32-
import { IgxGridNavigationService } from '../grid-navigation.service';
34+
import { GridType, RowType } from '../common/grid.interface';
3335
import { IgxGridCRUDService } from '../common/crud.service';
3436
import { IgxGridSummaryService } from '../summaries/grid-summary.service';
3537
import { IPivotConfiguration, IPivotDimension, IPivotKeys, PivotDimensionType } from './pivot-grid.interface';
@@ -47,7 +49,6 @@ import {
4749
} from '../common/events';
4850
import { IgxGridRowComponent } from '../grid/grid-row.component';
4951
import { DropPosition } from '../moving/moving.service';
50-
import { RowType } from '../common/row.interface';
5152
import { DimensionValuesFilteringStrategy, NoopPivotDimensionsStrategy } from '../../data-operations/pivot-strategy';
5253
import { IgxGridExcelStyleFilteringComponent } from '../filtering/excel-style/grid.excel-style-filtering.component';
5354
import { IgxPivotGridNavigationService } from './pivot-grid-navigation.service';
@@ -56,11 +57,11 @@ import { IgxFlatTransactionFactory, IgxOverlayService, State, Transaction, Trans
5657
import { DOCUMENT } from '@angular/common';
5758
import { DisplayDensityToken, IDisplayDensityOptions } from '../../core/displayDensity';
5859
import { cloneArray, PlatformUtil } from '../../core/utils';
59-
import { IgxGridTransaction } from '../hierarchical-grid/public_api';
6060
import { IgxPivotFilteringService } from './pivot-filtering.service';
6161
import { DataUtil } from '../../data-operations/data-util';
6262
import { IFilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
63-
import { SortingDirection } from '../../data-operations/sorting-expression.interface';
63+
import { IgxGridTransaction } from '../common/types';
64+
import { SortingDirection } from '../../data-operations/sorting-strategy';
6465

6566
let NEXT_ID = 0;
6667
const MINIMUM_COLUMN_WIDTH = 200;
@@ -415,6 +416,10 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
415416
resolver: ComponentFactoryResolver,
416417
differs: IterableDiffers,
417418
viewRef: ViewContainerRef,
419+
private _appRef: ApplicationRef,
420+
private _moduleRef: NgModuleRef<any>,
421+
private _factoryResolver: ComponentFactoryResolver,
422+
private _injector: Injector,
418423
navigation: IgxPivotGridNavigationService,
419424
filteringService: IgxFilteringService,
420425
@Inject(IgxOverlayService) protected overlayService: IgxOverlayService,
@@ -435,6 +440,10 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
435440
resolver,
436441
differs,
437442
viewRef,
443+
_appRef,
444+
_moduleRef,
445+
_factoryResolver,
446+
_injector,
438447
navigation,
439448
filteringService,
440449
overlayService,
@@ -621,7 +630,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
621630
const state = this.columnGroupStates.get(col.field);
622631
const newState = !state;
623632
this.columnGroupStates.set(col.field, newState);
624-
this.toggleGroup(col, newState);
633+
this.toggleRowGroup(col, newState);
625634
this.reflow();
626635
}
627636

@@ -830,7 +839,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
830839
return this.calcHeight;
831840
}
832841

833-
protected toggleGroup(col: IgxColumnComponent, newState: boolean) {
842+
public toggleRowGroup(col: IgxColumnComponent, newState: boolean) {
834843
if (this.hasMultipleValues) {
835844
const fieldColumns = col.children.filter(x => !x.columnGroup);
836845
const groupColumns = col.children.filter(x => x.columnGroup);
@@ -856,6 +865,15 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
856865
}
857866
}
858867

868+
/*
869+
* @hidden
870+
* @internal
871+
* Expose setup columns so it can used in pivot-header-row.component
872+
*/
873+
public setupColumns() {
874+
super.setupColumns();
875+
}
876+
859877
protected resolveToggle(groupColumn: IgxColumnComponent) {
860878
const hasChildGroup = groupColumn.children.filter(x => x.columnGroup).length > 0;
861879
if (!groupColumn.hidden && hasChildGroup) {
@@ -922,7 +940,7 @@ export class IgxPivotGridComponent extends IgxGridBaseDirective implements OnIni
922940
}
923941
}
924942

925-
protected generateDimensionColumns() {
943+
protected generateDimensionColumns(): IgxColumnComponent[] {
926944
const config = this.pivotConfiguration;
927945
const allDimensions = config.rows.concat(config.columns).concat(config.filters).filter(x => x !== null);
928946
const leafFields = PivotUtil.flatten(allDimensions, 0).filter(x => !x.childLevel).map(x => x.memberName);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { GridColumnDataType } from '../../data-operations/data-util';
22
import { FilteringExpressionsTree } from '../../data-operations/filtering-expressions-tree';
33
import { IPivotDimensionStrategy } from '../../data-operations/pivot-strategy';
4+
import { SortingDirection } from '../../data-operations/sorting-strategy';
45
import { IgxColumnComponent } from '../columns/column.component';
5-
import { SortingDirection } from '../../data-operations/sorting-expression.interface';
66

77
export type PivotAggregation = (members: any[], data: any[]) => any;
88

0 commit comments

Comments
 (0)