Skip to content

Commit 06154d8

Browse files
FIX: setState() throws error when column and columnGroup have same header --master (#14435)
* fix(GridState): when restoring column groups add additional check #13697 * test(gridState): no error is thrown when column groups are restored #13697 * chore(*): set correctly the initialState value * chore(*): fix failing test --------- Co-authored-by: Hristo <[email protected]>
1 parent 111330f commit 06154d8

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

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

+21
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,27 @@ describe('IgxGridState - input properties #grid', () => {
423423
expect(addressInfoGroup.collapsible).toBe(true);
424424
expect(addressInfoGroup.expanded).toBe(false);
425425
});
426+
427+
it('setState should correctly restore grid columns with Column Groups and same headers', () => {
428+
const fix = TestBed.createComponent(IgxGridStateComponent);
429+
fix.detectChanges();
430+
const state = fix.componentInstance.state;
431+
/* eslint-disable max-len */
432+
const initialState = '{"columns":[{"pinned":true,"sortable":true,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"testCss","headerGroupClasses":"","maxWidth":"300px","groupable":false,"hidden":false,"dataType":"number","hasSummary":false,"field":"ProductID","width":"150px","header":"Product ID","resizable":true,"searchable":false,"parent":null,"columnGroup":false,"disableHiding":false,"disablePinning":false},{"pinned":false,"sortable":true,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","maxWidth":"300px","groupable":true,"hidden":false,"dataType":"string","hasSummary":false,"field":"ProductName","width":"150px","header":"Prodyct Name","resizable":true,"searchable":true,"selectable":false,"parent":null,"columnGroup":false,"disableHiding":false,"disablePinning":false},{"pinned":false,"sortable":false,"filterable":true,"editable":true,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","maxWidth":"300px","groupable":false,"hidden":false,"dataType":"boolean","hasSummary":true,"field":"InStock","width":"140px","header":"In Stock","resizable":true,"searchable":true,"parent":null,"columnGroup":false,"disableHiding":false,"disablePinning":true},{"pinned":false,"sortable":true,"filterable":false,"editable":true,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","maxWidth":"300px","groupable":true,"hidden":false,"dataType":"date","hasSummary":false,"field":"OrderDate","width":"110px","header":"Date ordered","resizable":false,"searchable":true,"parent":null,"columnGroup":false,"disableHiding":false,"disablePinning":false}]}';
433+
const columnsState = '{"columns":[{"pinned":false,"sortable":false,"filterable":false,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"testCss","headerGroupClasses":"","maxWidth":"300px","groupable":false,"hidden":false,"dataType":"string","hasSummary":false,"field":"ProductID","width":"150px","header":"General Information","resizable":true,"searchable":true,"parent":null,"columnGroup":false,"disableHiding":false,"disablePinning":false},{"pinned":false,"sortable":false,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","maxWidth":"300px","groupable":true,"hidden":false,"dataType":"string","hasSummary":false,"field":"","width":"398px","header":"General Information","resizable":false,"searchable":true,"selectable":true,"parent":null,"columnGroup":true,"disableHiding":false,"disablePinning":false},{"pinned":false,"sortable":true,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","maxWidth":"300px","groupable":false,"hidden":false,"dataType":"boolean","hasSummary":false,"field":"ProductName","width":"199px","header":"","resizable":true,"searchable":true,"selectable":true,"parent":"General Information","columnGroup":false,"disableHiding":false},{"pinned":false,"sortable":true,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","groupable":false,"hidden":false,"dataType":"string","hasSummary":false,"field":"UnitsInStock","width":"199px","header":"","resizable":true,"searchable":true,"selectable":true,"parent":"General Information","columnGroup":false,"disableHiding":false},{"pinned":false,"sortable":true,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","groupable":false,"hidden":false,"dataType":"string","hasSummary":false,"field":"InStock","width":"199px","header":"","resizable":true,"searchable":true,"selectable":true,"parent":null,"columnGroup":false,"disableHiding":false}],"filtering":{"filteringOperands":[],"operator":0},"advancedFiltering":{},"sorting":[],"groupBy":{"expressions":[],"expansion":[],"defaultExpanded":true},"cellSelection":[],"rowSelection":[],"columnSelection":[],"rowPinning":[],"expansion":[],"moving":true,"rowIslands":[]}';
434+
/* eslint-enable max-len */
435+
const columnsStateObject = JSON.parse(columnsState);
436+
let gridState = state.getState(true, 'columns');
437+
438+
expect(gridState).toBe(initialState);
439+
expect(() => {
440+
state.setState(columnsStateObject);
441+
}).not.toThrow();
442+
443+
gridState = state.getState(false, 'columns') as IGridState;
444+
HelperFunctions.verifyColumns(columnsStateObject.columns, gridState);
445+
});
446+
426447
it('setState should correctly restore grid paging state from string', () => {
427448
const fix = TestBed.createComponent(IgxGridStateComponent);
428449
fix.detectChanges();

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ export class IgxGridStateDirective {
220220
Object.assign(ref1.instance, colState);
221221
ref1.instance.grid = context.currGrid;
222222
if (ref1.instance.parent) {
223-
const columnGroup: IgxColumnGroupComponent = newColumns.find(e => e.header === ref1.instance.parent);
223+
const columnGroup: IgxColumnGroupComponent = newColumns.find(e => e.header === ref1.instance.parent && e.columnGroup);
224224
columnGroup.children.reset([...columnGroup.children.toArray(), ref1.instance]);
225225
ref1.instance.parent = columnGroup;
226226
}
@@ -231,7 +231,7 @@ export class IgxGridStateDirective {
231231
Object.assign(ref.instance, colState);
232232
ref.instance.grid = context.currGrid;
233233
if (ref.instance.parent) {
234-
const columnGroup: IgxColumnGroupComponent = newColumns.find(e => e.header === ref.instance.parent);
234+
const columnGroup: IgxColumnGroupComponent = newColumns.find(e => e.header === ref.instance.parent && e.columnGroup);
235235
if (columnGroup) {
236236
ref.instance.parent = columnGroup;
237237
columnGroup.children.reset([...columnGroup.children.toArray(), ref.instance]);

0 commit comments

Comments
 (0)