From c643a46b501643cd79a630885e9350c9859a8d3f Mon Sep 17 00:00:00 2001 From: Sergey Andrievskiy Date: Fri, 30 Oct 2020 13:39:48 +0300 Subject: [PATCH] fix(header): prevent material popover from overlapping navigation --- .../components/header/header.component.scss | 10 +++ .../material-theme-link.component.html | 21 ++++--- .../material-theme-link.component.ts | 62 ++++++++++++++++--- 3 files changed, 73 insertions(+), 20 deletions(-) diff --git a/docs/app/@theme/components/header/header.component.scss b/docs/app/@theme/components/header/header.component.scss index 1a5d410c..e9cad406 100644 --- a/docs/app/@theme/components/header/header.component.scss +++ b/docs/app/@theme/components/header/header.component.scss @@ -267,6 +267,16 @@ flex-basis: auto; } + ::ng-deep ngx-material-theme-link { + display: none; + } + + @include media-breakpoint-up(is) { + ::ng-deep ngx-material-theme-link { + display: flex; + } + } + @include media-breakpoint-up(sm) { ::ng-deep nb-menu .menu-items li:first-child { display: list-item; diff --git a/docs/app/shared/components/material-theme-link/material-theme-link.component.html b/docs/app/shared/components/material-theme-link/material-theme-link.component.html index 8e2562ba..3682f0ac 100644 --- a/docs/app/shared/components/material-theme-link/material-theme-link.component.html +++ b/docs/app/shared/components/material-theme-link/material-theme-link.component.html @@ -1,15 +1,16 @@
- - Material Theme - + + Material Theme +
diff --git a/docs/app/shared/components/material-theme-link/material-theme-link.component.ts b/docs/app/shared/components/material-theme-link/material-theme-link.component.ts index fd530449..a73339ab 100644 --- a/docs/app/shared/components/material-theme-link/material-theme-link.component.ts +++ b/docs/app/shared/components/material-theme-link/material-theme-link.component.ts @@ -4,29 +4,71 @@ * Licensed under the MIT License. See License.txt in the project root for license information. */ -import { Component, ViewChild, AfterViewInit, Input } from '@angular/core'; +import { Component, ViewChild, AfterViewInit, Input, OnDestroy } from '@angular/core'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; -import { NbPopoverDirective } from '@nebular/theme'; +import { Subject, merge } from 'rxjs'; +import { map, take, takeUntil } from 'rxjs/operators'; +import { NbMediaBreakpointsService, NbMediaBreakpoint, NbPopoverDirective, NbThemeService } from '@nebular/theme'; @Component({ selector: 'ngx-material-theme-link', templateUrl: './material-theme-link.component.html', styleUrls: ['./material-theme-link.component.scss'], }) -export class MaterialThemeLinkComponent implements AfterViewInit { - public showPopover: boolean = false; +export class MaterialThemeLinkComponent implements AfterViewInit, OnDestroy { - @Input() public set withPopover(value: any) { + private destroy$ = new Subject(); + private hidePopover$ = new Subject(); + + showPopover: boolean = false; + + @Input() + set withPopover(value: any) { this.showPopover = coerceBooleanProperty(value); } - @ViewChild(NbPopoverDirective, { static: true }) public popover: NbPopoverDirective; + @ViewChild(NbPopoverDirective) popover: NbPopoverDirective; - public ngAfterViewInit(): void { - this.showPopover && this.popover && this.popover.show(); + constructor( + private breakpointService: NbMediaBreakpointsService, + private themeService: NbThemeService, + ) {} + + ngAfterViewInit(): void { + if (!this.showPopover) { + return; + } + + this.themeService.onMediaQueryChange() + .pipe( + map(([, currentBreakpoint]: NbMediaBreakpoint[]) => this.shouldShowPopover(currentBreakpoint)), + takeUntil(merge(this.destroy$, this.hidePopover$)), + ) + .subscribe((showPopover: boolean) => { + if (showPopover) { + this.popover.show(); + } else { + this.popover.hide(); + } + }); + + this.hidePopover$ + .pipe( + take(1), + takeUntil(this.destroy$), + ) + .subscribe(() => this.popover.hide()); } - public hidePopover(): void { - this.popover && this.popover.hide(); + ngOnDestroy() { + this.destroy$.next(); + } + + hidePopover(): void { + this.hidePopover$.next(); + } + + private shouldShowPopover(breakpoint: NbMediaBreakpoint): boolean { + return breakpoint.width >= this.breakpointService.getByName('is').width; } }