Skip to content

Commit a4071e9

Browse files
committed
feat(sidenav): open all sidenavs from MdSidenavContainer
- added `open` and `close` functions that applies to both sidenavs in the container and resolves when both are finished fixes #2591
1 parent 37e4bad commit a4071e9

File tree

2 files changed

+55
-7
lines changed

2 files changed

+55
-7
lines changed

src/lib/sidenav/sidenav.spec.ts

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import {fakeAsync, async, tick, ComponentFixture, TestBed} from '@angular/core/testing';
2-
import {Component} from '@angular/core';
2+
import {Component, ViewChild} from '@angular/core';
33
import {By} from '@angular/platform-browser';
4-
import {MdSidenav, MdSidenavModule, MdSidenavToggleResult} from './sidenav';
4+
import {MdSidenav, MdSidenavModule, MdSidenavToggleResult, MdSidenavContainer} from './sidenav';
55
import {A11yModule} from '../core/a11y/index';
66
import {PlatformModule} from '../core/platform/index';
77
import {ESCAPE} from '../core/keyboard/keycodes';
88

9-
109
function endSidenavTransition(fixture: ComponentFixture<any>) {
1110
let sidenav: any = fixture.debugElement.query(By.directive(MdSidenav)).componentInstance;
1211
sidenav._onTransitionEnd(<any> {
@@ -23,7 +22,6 @@ describe('MdSidenav', () => {
2322
imports: [MdSidenavModule.forRoot(), A11yModule.forRoot(), PlatformModule.forRoot()],
2423
declarations: [
2524
BasicTestApp,
26-
SidenavContainerTwoSidenavTestApp,
2725
SidenavContainerNoSidenavTestApp,
2826
SidenavSetToOpenedFalse,
2927
SidenavSetToOpenedTrue,
@@ -444,6 +442,43 @@ describe('MdSidenav', () => {
444442
});
445443
});
446444

445+
describe('MdSidenavContainer', () => {
446+
beforeEach(async(() => {
447+
TestBed.configureTestingModule({
448+
imports: [MdSidenavModule.forRoot(), A11yModule.forRoot(), PlatformModule.forRoot()],
449+
declarations: [
450+
SidenavContainerTwoSidenavTestApp
451+
],
452+
});
453+
454+
TestBed.compileComponents();
455+
}));
456+
457+
describe('methods', () => {
458+
it('should be able to open and close', async(() => {
459+
const fixture = TestBed.createComponent(SidenavContainerTwoSidenavTestApp);
460+
461+
fixture.detectChanges();
462+
463+
const testComponent: SidenavContainerTwoSidenavTestApp =
464+
fixture.debugElement.componentInstance;
465+
const sidenavs = fixture.debugElement.queryAll(By.directive(MdSidenav));
466+
467+
expect(sidenavs.every(sidenav => sidenav.componentInstance.opened)).toBeFalsy();
468+
469+
return testComponent.sidenavContainer.open()
470+
.then(() => {
471+
expect(sidenavs.every(sidenav => sidenav.componentInstance.opened)).toBeTruthy();
472+
473+
return testComponent.sidenavContainer.close();
474+
})
475+
.then(() => {
476+
expect(sidenavs.every(sidenav => sidenav.componentInstance.opened)).toBeTruthy();
477+
});
478+
}));
479+
});
480+
});
481+
447482

448483
/** Test component that contains an MdSidenavContainer but no MdSidenav. */
449484
@Component({template: `<md-sidenav-container></md-sidenav-container>`})
@@ -453,11 +488,14 @@ class SidenavContainerNoSidenavTestApp { }
453488
@Component({
454489
template: `
455490
<md-sidenav-container>
456-
<md-sidenav> </md-sidenav>
457-
<md-sidenav> </md-sidenav>
491+
<md-sidenav align="start"> </md-sidenav>
492+
<md-sidenav align="end"> </md-sidenav>
458493
</md-sidenav-container>`,
459494
})
460-
class SidenavContainerTwoSidenavTestApp { }
495+
class SidenavContainerTwoSidenavTestApp {
496+
@ViewChild(MdSidenavContainer)
497+
sidenavContainer: MdSidenavContainer;
498+
}
461499

462500
/** Test component that contains an MdSidenavContainer and one MdSidenav. */
463501
@Component({

src/lib/sidenav/sidenav.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,16 @@ export class MdSidenavContainer implements AfterContentInit {
377377
this._ngZone.onMicrotaskEmpty.first().subscribe(() => this._enableTransitions = true);
378378
}
379379

380+
/** Calls `open` of both start and end sidenavs */
381+
public open() {
382+
return Promise.all([this._start, this._end].map(sidenav => sidenav && sidenav.open()));
383+
}
384+
385+
/** Calls `close` of both start and end sidenavs */
386+
public close() {
387+
return Promise.all([this._start, this._end].map(sidenav => sidenav && sidenav.close()));
388+
}
389+
380390
/**
381391
* Subscribes to sidenav events in order to set a class on the main container element when the
382392
* sidenav is open and the backdrop is visible. This ensures any overflow on the container element

0 commit comments

Comments
 (0)