Skip to content

Commit 7e60c13

Browse files
fix(column-groups): add logic for collapsible and expanded (#13919)
1 parent d9a76fb commit 7e60c13

File tree

4 files changed

+61
-7
lines changed

4 files changed

+61
-7
lines changed

projects/igniteui-angular/src/lib/grids/columns/column.component.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1541,7 +1541,7 @@ export class IgxColumnComponent implements AfterContentInit, OnDestroy, ColumnTy
15411541
this._visibleWhenCollapsed = value;
15421542
this.visibleWhenCollapsedChange.emit(this._visibleWhenCollapsed);
15431543
if (this.parent) {
1544-
this.parent.setExpandCollapseState();
1544+
this.parent?.setExpandCollapseState?.();
15451545
}
15461546
}
15471547

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

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { GridSelectionRange } from './common/types';
1818
import { CustomFilter } from '../test-utils/grid-samples.spec';
1919
import { IgxPaginatorComponent } from '../paginator/paginator.component';
2020
import { NgFor } from '@angular/common';
21-
import { IgxColumnComponent, IgxGridDetailTemplateDirective } from './public_api';
21+
import { IgxColumnComponent, IgxColumnGroupComponent, IgxGridDetailTemplateDirective } from './public_api';
2222

2323
/* eslint-disable max-len */
2424
describe('IgxGridState - input properties #grid', () => {
@@ -417,6 +417,33 @@ describe('IgxGridState - input properties #grid', () => {
417417
HelperFunctions.verifyColumns(columnsStateObject.columns, gridState);
418418
});
419419

420+
it('setState should correctly restore grid columns state properties: collapsible and expanded', () => {
421+
const fix = TestBed.createComponent(CollapsibleColumnGroupTestComponent);
422+
fix.detectChanges();
423+
const state = fix.componentInstance.state;
424+
const grid = fix.componentInstance.grid;
425+
/* eslint-disable max-len */
426+
const initialState = '{"columns":[{"pinned":false,"sortable":false,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","groupable":false,"movable":false,"hidden":false,"dataType":"string","hasSummary":false,"field":"ID","width":"100px","header":"","resizable":false,"searchable":true,"selectable":true,"parent":null,"columnGroup":false,"disableHiding":false,"disablePinning":false},{"pinned":false,"sortable":false,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","groupable":false,"movable":false,"hidden":false,"dataType":"string","hasSummary":false,"width":"100px","header":"Address Information","resizable":false,"searchable":true,"selectable":true,"parent":null,"columnGroup":true,"disableHiding":false,"disablePinning":false,"collapsible":true,"expanded":true},{"pinned":false,"sortable":false,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","groupable":false,"movable":false,"hidden":true,"dataType":"string","hasSummary":false,"field":"City","width":"100px","header":"","resizable":false,"searchable":true,"selectable":true,"parent":"Address Information","columnGroup":false,"disableHiding":false,"disablePinning":false,"visibleWhenCollapsed":true},{"pinned":false,"sortable":false,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","groupable":false,"movable":false,"hidden":false,"dataType":"string","hasSummary":false,"field":"Address","width":"100px","header":"","resizable":false,"searchable":true,"selectable":true,"parent":"Address Information","columnGroup":false,"disableHiding":false,"disablePinning":false,"visibleWhenCollapsed":false}]}'
427+
const newState = `{"columns":[{"pinned":false,"sortable":false,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","groupable":false,"movable":false,"hidden":false,"dataType":"string","hasSummary":false,"field":"ID","width":"100px","header":"","resizable":false,"searchable":true,"selectable":true,"parent":null,"columnGroup":false,"disableHiding":false,"disablePinning":false},{"pinned":false,"sortable":false,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","groupable":false,"movable":false,"hidden":false,"dataType":"string","hasSummary":false,"width":"100px","header":"Address Information","resizable":false,"searchable":true,"selectable":true,"parent":null,"columnGroup":true,"disableHiding":false,"disablePinning":false,"collapsible":true,"expanded":false},{"pinned":false,"sortable":false,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","groupable":false,"movable":false,"hidden":true,"dataType":"string","hasSummary":false,"field":"City","width":"100px","header":"","resizable":false,"searchable":true,"selectable":true,"parent":"Address Information","columnGroup":false,"disableHiding":false,"disablePinning":false,"visibleWhenCollapsed":true},{"pinned":false,"sortable":false,"filterable":true,"editable":false,"sortingIgnoreCase":true,"filteringIgnoreCase":true,"headerClasses":"","headerGroupClasses":"","groupable":false,"movable":false,"hidden":false,"dataType":"string","hasSummary":false,"field":"Address","width":"100px","header":"","resizable":false,"searchable":true,"selectable":true,"parent":"Address Information","columnGroup":false,"disableHiding":false,"disablePinning":false,"visibleWhenCollapsed":false}]}`
428+
/* eslint-enable max-len */
429+
const columnsStateObject = JSON.parse(newState);
430+
let gridState = state.getState(true, 'columns');
431+
expect(gridState).toBe(initialState);
432+
// 1. initial state collapsible:true, expanded: true;
433+
// 2. new state collapsible:true, expanded: false after restoration
434+
435+
state.setState(columnsStateObject); // set new state - resored state
436+
gridState = state.getState(false, 'columns') as IGridState;
437+
HelperFunctions.verifyColumns(columnsStateObject.columns, gridState);
438+
gridState = state.getState(true, 'columns');
439+
fix.detectChanges();
440+
expect(gridState).toBe(newState);
441+
442+
const addressInfoGroup = grid.columns.find(c => c.header === "Address Information");
443+
expect(addressInfoGroup.collapsible).toBe(true);
444+
expect(addressInfoGroup.expanded).toBe(false);
445+
});
446+
420447
it('setState should correctly restore grid paging state from string', () => {
421448
const fix = TestBed.createComponent(IgxGridStateComponent);
422449
fix.detectChanges();
@@ -867,5 +894,26 @@ export class IgxGridStateWithDetailsComponent {
867894

868895
public data = SampleTestData.foodProductData();
869896
}
897+
898+
@Component({
899+
template: `
900+
<igx-grid #grid [data]="data" igxGridState height="500px" width="1300px" columnWidth="100px">
901+
<igx-column field="ID"></igx-column>
902+
<igx-column-group header="Address Information" [collapsible]="true">
903+
<igx-column field="City" [visibleWhenCollapsed]="true"></igx-column>
904+
<igx-column field="Address" [visibleWhenCollapsed]="false"></igx-column>
905+
</igx-column-group>
906+
</igx-grid>
907+
`,
908+
standalone: true,
909+
imports: [IgxGridComponent, IgxColumnComponent, IgxColumnGroupComponent, IgxGridStateDirective, NgFor]
910+
})
911+
export class CollapsibleColumnGroupTestComponent {
912+
@ViewChild(IgxGridComponent, { read: IgxGridComponent, static: true })
913+
public grid: IgxGridComponent;
914+
@ViewChild(IgxGridStateDirective, { static: true })
915+
public state: IgxGridStateDirective;
916+
public data = SampleTestData.contactInfoDataFull();
917+
}
870918
/* eslint-enable max-len */
871919

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ export interface IColumnState {
9090
parent: any;
9191
disableHiding: boolean;
9292
disablePinning: boolean;
93+
collapsible?: boolean;
94+
expanded?: boolean;
95+
visibleWhenCollapsed?: boolean;
9396
}
9497

9598
export type GridFeatures = keyof IGridStateOptions;
@@ -202,7 +205,10 @@ export class IgxGridStateDirective {
202205
parent: c.parent ? c.parent.header : null,
203206
columnGroup: c.columnGroup,
204207
disableHiding: c.disableHiding,
205-
disablePinning: c.disablePinning
208+
disablePinning: c.disablePinning,
209+
collapsible: c.columnGroup ? c.collapsible : undefined,
210+
expanded: c.columnGroup ? c.expanded : undefined,
211+
visibleWhenCollapsed: c.parent?.columnGroup ? (c as IgxColumnComponent).visibleWhenCollapsed : undefined
206212
}));
207213
return { columns: gridColumns };
208214
},

src/app/grid-state/grid-state.component.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,10 @@
5858
<igx-column [resizable]="true" field="EmployeeID" [filterable]="false"></igx-column>
5959
<igx-column-group [pinned]="false" header="Employee">
6060
<igx-column [sortable]="true" [resizable]="true" field="Country"></igx-column>
61-
<igx-column-group header="Employee Names">
61+
<igx-column-group header="Employee Names" [collapsible]="true">
6262
<igx-column [pinned]="false" [sortable]="true" [resizable]="true"
63-
field="FirstName"></igx-column>
64-
<igx-column [sortable]="true" [resizable]="true" field="LastName"></igx-column>
63+
field="FirstName" [visibleWhenCollapsed]="true"></igx-column>
64+
<igx-column [sortable]="true" [resizable]="true" field="LastName" [visibleWhenCollapsed]="false"></igx-column>
6565
</igx-column-group>
6666
</igx-column-group>
6767
<igx-column-group header="Additional Information">
@@ -243,4 +243,4 @@
243243

244244
<ng-template igxCell #activeTemplate let-column let-cell="cell">
245245
Hi I'm {{ cell.value }}
246-
</ng-template>
246+
</ng-template>

0 commit comments

Comments
 (0)