Skip to content

Commit c07111c

Browse files
authored
Merge pull request #10654 from IgniteUI/mevtimov/fix-10509-13.0.x
Collapse expanded panels when setting singleBranchExpand to true 13.0.x
2 parents abd86d6 + f40328a commit c07111c

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

projects/igniteui-angular/src/lib/accordion/accordion.component.spec.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,29 @@ describe('Rendering Tests', () => {
166166
expect(accordion.panelCollapsed.emit).toHaveBeenCalledTimes(5);
167167
}));
168168

169+
it(`Should collapse all expanded and not disabled panels except for the last one when setting singleBranchExpand to true`, () => {
170+
expect(accordion.panels[0].collapsed).toBeTrue();
171+
expect(accordion.panels[1].collapsed).toBeTrue();
172+
expect(accordion.panels[2].collapsed).toBeFalse();
173+
expect(accordion.panels[3].collapsed).toBeFalse();
174+
175+
accordion.panels[1].collapsed = false;
176+
fix.detectChanges();
177+
178+
expect(accordion.panels[0].collapsed).toBeTrue();
179+
expect(accordion.panels[1].collapsed).toBeFalse();
180+
expect(accordion.panels[2].collapsed).toBeFalse();
181+
expect(accordion.panels[3].collapsed).toBeFalse();
182+
183+
accordion.singleBranchExpand = true;
184+
fix.detectChanges();
185+
186+
expect(accordion.panels[0].collapsed).toBeTrue();
187+
expect(accordion.panels[1].collapsed).toBeTrue();
188+
expect(accordion.panels[2].collapsed).toBeFalse();
189+
expect(accordion.panels[3].collapsed).toBeFalse();
190+
});
191+
169192
it('Should emit ing and ed events when expand panel state is toggled', fakeAsync(() => {
170193
spyOn(accordion.panelExpanded, 'emit').and.callThrough();
171194
spyOn(accordion.panelExpanding, 'emit').and.callThrough();

projects/igniteui-angular/src/lib/accordion/accordion.component.ts

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { AfterContentInit, AfterViewInit, Component, ContentChildren, EventEmitter,
1+
import { AfterContentInit, AfterViewInit, ChangeDetectorRef, Component, ContentChildren, EventEmitter,
22
HostBinding, Input, OnDestroy, Output, QueryList } from '@angular/core';
33
import { fromEvent, Subject } from 'rxjs';
44
import { takeUntil } from 'rxjs/operators';
@@ -113,7 +113,16 @@ export class IgxAccordionComponent implements AfterContentInit, AfterViewInit, O
113113
* ```
114114
*/
115115
@Input()
116-
public singleBranchExpand = false;
116+
public get singleBranchExpand(): boolean {
117+
return this._singleBranchExpand;
118+
}
119+
120+
public set singleBranchExpand(val: boolean) {
121+
this._singleBranchExpand = val;
122+
if (val) {
123+
this.collapseAllExceptLast();
124+
}
125+
}
117126

118127
/**
119128
* Emitted before a panel is expanded.
@@ -200,12 +209,16 @@ export class IgxAccordionComponent implements AfterContentInit, AfterViewInit, O
200209
private _destroy$ = new Subject<void>();
201210
private _unsubChildren$ = new Subject<void>();
202211
private _enabledPanels!: IgxExpansionPanelComponent[];
212+
private _singleBranchExpand = false;
203213

204-
constructor() { }
214+
constructor(private cdr: ChangeDetectorRef) { }
205215

206216
/** @hidden @internal **/
207217
public ngAfterContentInit(): void {
208218
this.updatePanelsAnimation();
219+
if (this.singleBranchExpand) {
220+
this.collapseAllExceptLast();
221+
}
209222
}
210223

211224
/** @hidden @internal **/
@@ -256,6 +269,16 @@ export class IgxAccordionComponent implements AfterContentInit, AfterViewInit, O
256269
this.panels.forEach(panel => panel.collapse());
257270
}
258271

272+
private collapseAllExceptLast(): void {
273+
const lastExpanded = this.panels?.filter(p => !p.collapsed && !p.header.disabled).pop();
274+
this.panels?.forEach((p: IgxExpansionPanelComponent) => {
275+
if (p !== lastExpanded && !p.header.disabled) {
276+
p.collapsed = true;
277+
}
278+
});
279+
this.cdr.detectChanges();
280+
}
281+
259282
private handleKeydown(event: KeyboardEvent, panel: IgxExpansionPanelComponent): void {
260283
const key = event.key.toLowerCase();
261284
if (!(ACCORDION_NAVIGATION_KEYS.has(key))) {

0 commit comments

Comments
 (0)