From 583fe151fda7df55f8004aca1f1dee5367aba5de Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 6 Mar 2018 10:41:34 -0500 Subject: [PATCH] fix(drawer): show backdrop in "side" mode if hasBackdrop is explicitly set to true (#10251) Currently we only use `hasBackdrop` to hide the backdrop, however setting it to `true` explicitly also expresses an intent that the consumer might want the backdrop to always be shown. These changes make it so backdrop will also be shown for `side` drawers if `hasBackdrop` is set to `true`. --- src/demo-app/sidenav/sidenav-demo.html | 3 ++- src/demo-app/sidenav/sidenav-demo.ts | 1 + src/lib/sidenav/drawer.scss | 6 +++++ src/lib/sidenav/drawer.spec.ts | 34 ++++++++++++++++++++++++-- src/lib/sidenav/drawer.ts | 31 ++++++++++++++--------- src/lib/sidenav/sidenav.ts | 1 + 6 files changed, 62 insertions(+), 14 deletions(-) diff --git a/src/demo-app/sidenav/sidenav-demo.html b/src/demo-app/sidenav/sidenav-demo.html index 728a85dacd4..5918c181348 100644 --- a/src/demo-app/sidenav/sidenav-demo.html +++ b/src/demo-app/sidenav/sidenav-demo.html @@ -4,7 +4,7 @@
Header - + Start Side Sidenav @@ -41,6 +41,7 @@

Sidenav

+ Has backdrop Fixed mode Sidenav covers header/footer
diff --git a/src/demo-app/sidenav/sidenav-demo.ts b/src/demo-app/sidenav/sidenav-demo.ts index 0af65025eb7..4e1ad35c4e8 100644 --- a/src/demo-app/sidenav/sidenav-demo.ts +++ b/src/demo-app/sidenav/sidenav-demo.ts @@ -25,6 +25,7 @@ export class SidenavDemo { showHeader = false; showFooter = false; modeIndex = 0; + hasBackdrop: boolean; get mode() { return ['side', 'over', 'push'][this.modeIndex]; } get fixedTop() { return this.fixed && this.showHeader && !this.coverHeader ? 64 : 0; } get fixedBottom() { return this.fixed && this.showFooter && !this.coverHeader ? 64 : 0; } diff --git a/src/lib/sidenav/drawer.scss b/src/lib/sidenav/drawer.scss index 271478fd331..1b28845dacb 100644 --- a/src/lib/sidenav/drawer.scss +++ b/src/lib/sidenav/drawer.scss @@ -45,6 +45,12 @@ $mat-drawer-over-drawer-z-index: 4; overflow: hidden; } } + + // When the consumer explicitly enabled the backdrop, + // we have to pull the side drawers above it. + &.mat-drawer-container-explicit-backdrop .mat-drawer-side { + z-index: $mat-drawer-backdrop-z-index; + } } .mat-drawer-backdrop { diff --git a/src/lib/sidenav/drawer.spec.ts b/src/lib/sidenav/drawer.spec.ts index 67ac8d3fe57..753ed646d64 100644 --- a/src/lib/sidenav/drawer.spec.ts +++ b/src/lib/sidenav/drawer.spec.ts @@ -643,6 +643,35 @@ describe('MatDrawerContainer', () => { expect(fixture.nativeElement.querySelector('.mat-drawer-backdrop')).toBeFalsy(); })); + it('should be able to explicitly enable the backdrop in `side` mode', fakeAsync(() => { + const fixture = TestBed.createComponent(BasicTestApp); + const root = fixture.nativeElement; + + fixture.componentInstance.drawer.mode = 'side'; + fixture.detectChanges(); + fixture.componentInstance.drawer.open(); + fixture.detectChanges(); + tick(); + fixture.detectChanges(); + + let backdrop = root.querySelector('.mat-drawer-backdrop.mat-drawer-shown'); + + expect(backdrop).toBeFalsy(); + + fixture.componentInstance.hasBackdrop = true; + fixture.detectChanges(); + backdrop = root.querySelector('.mat-drawer-backdrop.mat-drawer-shown'); + + expect(backdrop).toBeTruthy(); + expect(fixture.componentInstance.drawer.opened).toBe(true); + + backdrop.click(); + fixture.detectChanges(); + tick(); + + expect(fixture.componentInstance.drawer.opened).toBe(false); + })); + }); @@ -666,7 +695,7 @@ class DrawerContainerTwoDrawerTestApp { @Component({ template: ` - = new EventEmitter(); @@ -663,8 +668,8 @@ export class MatDrawerContainer implements AfterContentInit, OnDestroy { /** Whether the container is being pushed to the side by one of the drawers. */ private _isPushed() { - return (this._isDrawerOpen(this._start) && this._start!.mode != 'over') || - (this._isDrawerOpen(this._end) && this._end!.mode != 'over'); + return (this._isDrawerOpen(this._start) && this._start.mode != 'over') || + (this._isDrawerOpen(this._end) && this._end.mode != 'over'); } _onBackdropClicked() { @@ -675,16 +680,20 @@ export class MatDrawerContainer implements AfterContentInit, OnDestroy { _closeModalDrawer() { // Close all open drawers where closing is not disabled and the mode is not `side`. [this._start, this._end] - .filter(drawer => drawer && !drawer.disableClose && drawer.mode !== 'side') + .filter(drawer => drawer && !drawer.disableClose && this._canHaveBackdrop(drawer)) .forEach(drawer => drawer!.close()); } _isShowingBackdrop(): boolean { - return (this._isDrawerOpen(this._start) && this._start!.mode != 'side') - || (this._isDrawerOpen(this._end) && this._end!.mode != 'side'); + return (this._isDrawerOpen(this._start) && this._canHaveBackdrop(this._start)) || + (this._isDrawerOpen(this._end) && this._canHaveBackdrop(this._end)); } - private _isDrawerOpen(drawer: MatDrawer | null): boolean { + private _canHaveBackdrop(drawer: MatDrawer): boolean { + return drawer.mode !== 'side' || !!this._backdropOverride; + } + + private _isDrawerOpen(drawer: MatDrawer | null): drawer is MatDrawer { return drawer != null && drawer.opened; } diff --git a/src/lib/sidenav/sidenav.ts b/src/lib/sidenav/sidenav.ts index c04cc8a7ca1..e1b026078e0 100644 --- a/src/lib/sidenav/sidenav.ts +++ b/src/lib/sidenav/sidenav.ts @@ -106,6 +106,7 @@ export class MatSidenav extends MatDrawer { styleUrls: ['drawer.css'], host: { 'class': 'mat-drawer-container mat-sidenav-container', + '[class.mat-drawer-container-explicit-backdrop]': '_backdropOverride', }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None,