Skip to content

Commit bb276e5

Browse files
committed
Merge branch 'master' of https://github.com/IgniteUI/igniteui-angular into rkaraivanov/row-classes-bindings
2 parents 9827a3d + 7b6c997 commit bb276e5

File tree

10 files changed

+122
-44
lines changed

10 files changed

+122
-44
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
All notable changes for each version of this project will be documented in this file.
44

5+
## 12.1.6
6+
7+
### New Features
8+
- `igxGrid`, `igxHierarchicalGrid`, `igxTreeGrid`
9+
- Added capability to restore the state of multi column headers with `IgxGridStateDirective`.
10+
511
## 12.1.3
612

713
### New Features

ROADMAP.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
1. Add row at top of grid [#9675](https://github.com/IgniteUI/igniteui-angular/issues/9675)
88
2. Grid row styles and classes [#9969](https://github.com/IgniteUI/igniteui-angular/issues/9969)
99
3. Freezing Columns/Rows on Export to Excel (Angular) [#9863](https://github.com/IgniteUI/igniteui-angular/issues/9863)
10-
4. Stepper component [#8667](https://github.com/IgniteUI/igniteui-angular/issues/8667)
10+
4. Persistent State directive for column group [#8516](https://github.com/IgniteUI/igniteui-angular/issues/8516)
1111
5. IgxTreeGrid: display only filtered records [#9923](https://github.com/IgniteUI/igniteui-angular/issues/9923)
1212

1313
## Going down the road
@@ -17,6 +17,7 @@
1717
3. PDF Export feature on Angular Grid [#5696](https://github.com/IgniteUI/igniteui-angular/issues/5696)
1818
4. Themes: Move code to Sass modules [#9554](https://github.com/IgniteUI/igniteui-angular/issues/9554)
1919
5. Themes: Split themes and aid with Grid refactoring [#9556](https://github.com/IgniteUI/igniteui-angular/issues/9556)
20+
6. Stepper component [#8667](https://github.com/IgniteUI/igniteui-angular/issues/8667)
2021

2122
# Previous Milestone
2223

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3026,7 +3026,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
30263026
};
30273027

30283028
private transactionChange$ = new Subject<void>();
3029-
3029+
private _rendered = false;
30303030
private readonly DRAG_SCROLL_DELTA = 10;
30313031

30323032
/**
@@ -3711,6 +3711,7 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
37113711
this.paginator.totalRecords = this.totalRecords;
37123712
this.paginator.overlaySettings = { outlet: this.outlet };
37133713
}
3714+
this._rendered = true;
37143715
});
37153716
Promise.resolve().then(() => this.rendered.next(true));
37163717
}
@@ -4065,16 +4066,24 @@ export abstract class IgxGridBaseDirective extends DisplayDensityBase implements
40654066
return this.featureColumnsWidth();
40664067
}
40674068

4069+
/**
4070+
* @hidden
4071+
* @internal
4072+
*/
4073+
public get columns(): IgxColumnComponent[] {
4074+
return this._columns;
4075+
}
4076+
40684077
/**
40694078
* Gets an array of `IgxColumnComponent`s.
40704079
*
40714080
* @example
40724081
* ```typescript
4073-
* const colums = this.grid.columns.
4082+
* const colums = this.grid.columnsCollection.
40744083
* ```
40754084
*/
4076-
public get columns(): IgxColumnComponent[] {
4077-
return this._columns;
4085+
public get columnsCollection(): IgxColumnComponent[] {
4086+
return this._rendered ? this._columns : [];
40784087
}
40794088

40804089
/**

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,7 @@ describe('IgxGrid - Cell selection #grid', () => {
667667
} finally {
668668
fix.detectChanges();
669669
}
670-
expect(errorMessage).toEqual('Cannot read property \'visibleIndex\' of undefined');
670+
expect(errorMessage).toContain('visibleIndex');
671671
expect(selectionChangeSpy).toHaveBeenCalledTimes(0);
672672
expect(grid.getSelectedData()).toEqual([]);
673673
expect(grid.getSelectedRanges()).toEqual([]);
@@ -699,7 +699,7 @@ describe('IgxGrid - Cell selection #grid', () => {
699699
} finally {
700700
fix.detectChanges();
701701
}
702-
expect(errorMessage).toEqual('Cannot read property \'visibleIndex\' of undefined');
702+
expect(errorMessage).toContain('visibleIndex');
703703
GridSelectionFunctions.verifySelectedRange(grid, 1, 2, 0, 1);
704704
expect(selectionChangeSpy).toHaveBeenCalledTimes(0);
705705
expect(grid.getSelectedData()).toEqual(expectedData);
@@ -718,7 +718,7 @@ describe('IgxGrid - Cell selection #grid', () => {
718718
} finally {
719719
fix.detectChanges();
720720
}
721-
expect(errorMessage).toEqual('Cannot read property \'visibleIndex\' of undefined');
721+
expect(errorMessage).toContain('visibleIndex');
722722
expect(selectionChangeSpy).toHaveBeenCalledTimes(0);
723723
expect(grid.getSelectedData()).toEqual([]);
724724
expect(grid.getSelectedRanges()).toEqual([]);

projects/igniteui-angular/src/lib/grids/state.directive.spec.ts

Lines changed: 5 additions & 5 deletions
Large diffs are not rendered by default.

projects/igniteui-angular/src/lib/grids/state.directive.ts

Lines changed: 52 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { ISortingExpression } from '../data-operations/sorting-expression.interf
33
import { FilteringExpressionsTree, IFilteringExpressionsTree } from '../data-operations/filtering-expressions-tree';
44
import { IFilteringExpression } from '../data-operations/filtering-expression.interface';
55
import { IgxColumnComponent } from './columns/column.component';
6+
import { IgxColumnGroupComponent } from './columns/column-group.component';
67
import { IGroupingExpression } from '../data-operations/grouping-expression.interface';
78
import { IPagingState } from '../data-operations/paging-state.interface';
89
import { GridColumnDataType } from '../data-operations/data-util';
@@ -76,6 +77,8 @@ export interface IColumnState {
7677
header: string;
7778
resizable: boolean;
7879
searchable: boolean;
80+
columnGroup: boolean;
81+
parent: any;
7982
}
8083

8184
export type GridFeatures = keyof IGridStateOptions;
@@ -162,37 +165,61 @@ export class IgxGridStateDirective {
162165
columns: {
163166
getFeatureState: (context: IgxGridStateDirective): IGridState => {
164167
const gridColumns: IColumnState[] = context.currGrid.columns.map((c) => ({
165-
pinned: c.pinned,
166-
sortable: c.sortable,
167-
filterable: c.filterable,
168-
editable: c.editable,
169-
sortingIgnoreCase: c.sortingIgnoreCase,
170-
filteringIgnoreCase: c.filteringIgnoreCase,
171-
headerClasses: c.headerClasses,
172-
headerGroupClasses: c.headerGroupClasses,
173-
maxWidth: c.maxWidth,
174-
groupable: c.groupable,
175-
movable: c.movable,
176-
hidden: c.hidden,
177-
dataType: c.dataType,
178-
hasSummary: c.hasSummary,
179-
field: c.field,
180-
width: c.width,
181-
header: c.header,
182-
resizable: c.resizable,
183-
searchable: c.searchable,
184-
selectable: c.selectable
185-
}));
168+
pinned: c.pinned,
169+
sortable: c.sortable,
170+
filterable: c.filterable,
171+
editable: c.editable,
172+
sortingIgnoreCase: c.sortingIgnoreCase,
173+
filteringIgnoreCase: c.filteringIgnoreCase,
174+
headerClasses: c.headerClasses,
175+
headerGroupClasses: c.headerGroupClasses,
176+
maxWidth: c.maxWidth,
177+
groupable: c.groupable,
178+
movable: c.movable,
179+
hidden: c.hidden,
180+
dataType: c.dataType,
181+
hasSummary: c.hasSummary,
182+
field: c.field,
183+
width: c.width,
184+
header: c.header,
185+
resizable: c.resizable,
186+
searchable: c.searchable,
187+
selectable: c.selectable,
188+
parent: c.parent ? c.parent.header : null,
189+
columnGroup: c.columnGroup
190+
}));
186191
return { columns: gridColumns };
187192
},
188193
restoreFeatureState: (context: IgxGridStateDirective, state: IColumnState[]): void => {
189194
const newColumns = [];
190195
const factory = context.resolver.resolveComponentFactory(IgxColumnComponent);
196+
const groupFactory = context.resolver.resolveComponentFactory(IgxColumnGroupComponent);
191197
state.forEach((colState) => {
192-
const ref = factory.create(context.viewRef.injector);
193-
Object.assign(ref.instance, colState);
194-
ref.changeDetectorRef.detectChanges();
195-
newColumns.push(ref.instance);
198+
const hasColumnGroup = colState.columnGroup;
199+
delete colState.columnGroup;
200+
if (hasColumnGroup) {
201+
const ref1 = groupFactory.create(context.viewRef.injector);
202+
Object.assign(ref1.instance, colState);
203+
if (ref1.instance.parent) {
204+
const columnGroup: IgxColumnGroupComponent = newColumns.find(e => e.header === ref1.instance.parent);
205+
columnGroup.children.reset([...columnGroup.children.toArray(), ref1.instance]);
206+
ref1.instance.parent = columnGroup;
207+
}
208+
ref1.changeDetectorRef.detectChanges();
209+
newColumns.push(ref1.instance);
210+
} else {
211+
const ref = factory.create(context.viewRef.injector);
212+
Object.assign(ref.instance, colState);
213+
if (ref.instance.parent) {
214+
const columnGroup: IgxColumnGroupComponent = newColumns.find(e => e.header === ref.instance.parent);
215+
if (columnGroup) {
216+
ref.instance.parent = columnGroup;
217+
columnGroup.children.reset([...columnGroup.children.toArray(), ref.instance]);
218+
}
219+
}
220+
ref.changeDetectorRef.detectChanges();
221+
newColumns.push(ref.instance);
222+
}
196223
});
197224
context.currGrid.columnList.reset(newColumns);
198225
context.currGrid.columnList.notifyOnChanges();

0 commit comments

Comments
 (0)