diff --git a/src/app/pages/dashboard/security-cameras/security-cameras.component.html b/src/app/pages/dashboard/security-cameras/security-cameras.component.html index 54863311..119280bd 100644 --- a/src/app/pages/dashboard/security-cameras/security-cameras.component.html +++ b/src/app/pages/dashboard/security-cameras/security-cameras.component.html @@ -1,43 +1,58 @@ - + + -
- Security Cameras - - - - - - - - -
+ Security Cameras + + +
- -
+ +
+ +
- {{ selectedCamera.title }} + {{ selectedCamera.title }}
-
-
+
- {{ camera.title }} + {{ camera.title }}
- + +
+ - + - Pause + + Pause - Logs + + Logs - Search + + Search - Setup + + Setup diff --git a/src/app/pages/dashboard/security-cameras/security-cameras.component.scss b/src/app/pages/dashboard/security-cameras/security-cameras.component.scss index a0da3cf4..9fdaf607 100644 --- a/src/app/pages/dashboard/security-cameras/security-cameras.component.scss +++ b/src/app/pages/dashboard/security-cameras/security-cameras.component.scss @@ -3,96 +3,72 @@ @import '~bootstrap/scss/mixins/breakpoints'; @include nb-install-component() { + nb-card-header { - padding: 0; - border: none; - } - - nb-card-body { - padding: 0; - position: relative; - } - - nb-card-footer { - padding: 1rem 0; - border: none; - } - - .cameras-card-header { display: flex; + align-items: center; + } - .cameras-card-title { - flex: 1; - padding: 1.25rem; + .single-view-button { + .nb-square { + font-size: 1.25rem; + } + + @include nb-ltr { + margin-left: auto; + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + @include nb-rtl { + margin-right: auto; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } } - .cameras-filter { + .grid-view-button { + ::ng-deep svg { + vertical-align: top; + } + + @include nb-ltr { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + @include nb-rtl { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } + + .grid-container { + height: 100%; display: flex; - - a { - font-size: 2.5rem; - padding: 0 0.75rem; - display: flex; - flex-direction: column; - justify-content: center; - color: nb-theme(color-fg); - } - - a:first-child { - @include nb-ltr(border-left, 1px solid nb-theme(separator)); - @include nb-rtl(border-right, 1px solid nb-theme(separator)); - } - - a:last-child { - @include nb-ltr(border-top-right-radius, nb-theme(card-border-radius)); - @include nb-rtl(border-top-left-radius, nb-theme(card-border-radius)); - } - - a.active { - background-color: nb-theme(color-bg-active); - color: nb-theme(color-fg-heading); - border: none; - } } - .cameras { - position: absolute; + .single-view, + .grid-view { + flex: 1 0 100%; + } + + .grid-view { display: flex; flex-wrap: wrap; + + .camera { + flex: 1 0 50%; + } + } + + .single-view .camera { width: 100%; height: 100%; } - .cameras.single-view { - .camera { - height: 100%; - width: 100%; - - &::before { - height: 100%; - } - } - } - .camera { - position: relative; background-position: center; background-size: cover; - height: 50%; - padding: 0; - - span { - position: absolute; - bottom: 0; - width: 100%; - color: white; - background: rgba(0, 0, 0, 0.4); - font-family: nb-theme(font-secondary); - font-weight: nb-theme(font-weight-bolder); - font-size: 1.25rem; - padding: 0.5rem 1rem; - } + position: relative; &::before { background-color: rgba(255, 255, 255, 0.1); @@ -108,69 +84,29 @@ } } + .camera-name { + position: absolute; + bottom: 0; + width: 100%; + color: white; + background: nb-theme(overlay-backdrop-background-color); + padding: 0.5rem 1rem; + } + nb-action { - padding: 0 0.5rem 0 0; - - i { - color: nb-theme(color-fg); - font-size: 3rem; - margin-right: 0.5rem; - - @include nb-for-theme(corporate) { - color: nb-theme(actions-fg); - } + nb-icon { + @include nb-ltr(margin-right, 0.5rem); + @include nb-rtl(margin-left, 0.5rem); } - span { - font-family: nb-theme(font-secondary); - font-weight: nb-theme(font-weight-bold); - color: nb-theme(color-fg-heading); - text-transform: uppercase; + ::ng-deep svg { + vertical-align: top; } } - @include nb-for-theme(cosmic) { - .cameras-filter a.active { - color: nb-theme(color-fg-highlight); - } - - .camera { - span { - background: rgba(88, 73, 184, 0.5); - } - - &::before { - background-color: rgba(0, 0, 0, 0.2); - } - } - - nb-action span { - font-weight: nb-theme(font-weight-bolder); - } - } - - @include nb-for-theme(corporate) { - .cameras-filter a { - &.active { - color: nb-theme(color-primary); - } - - &:first-child { - @include nb-ltr(border-left, 1px solid nb-theme(border-color)); - @include nb-rtl(border-right, 1px solid nb-theme(border-color)); - } - } - } - - @include media-breakpoint-down(lg) { + @include media-breakpoint-down(xl) { nb-action { padding: 0; - i { - margin: 0; - } - span { - display: none; - } } } } diff --git a/src/app/pages/dashboard/security-cameras/security-cameras.component.ts b/src/app/pages/dashboard/security-cameras/security-cameras.component.ts index 13e3a4de..3daf0327 100644 --- a/src/app/pages/dashboard/security-cameras/security-cameras.component.ts +++ b/src/app/pages/dashboard/security-cameras/security-cameras.component.ts @@ -1,35 +1,53 @@ -import { Component, OnDestroy } from '@angular/core'; +import { Component, OnDestroy, OnInit } from '@angular/core'; +import { map, takeUntil } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +import { NbComponentSize, NbMediaBreakpointsService, NbThemeService } from '@nebular/theme'; + import { Camera, SecurityCamerasData } from '../../../@core/data/security-cameras'; -import { takeWhile } from 'rxjs/operators'; @Component({ selector: 'ngx-security-cameras', styleUrls: ['./security-cameras.component.scss'], templateUrl: './security-cameras.component.html', }) -export class SecurityCamerasComponent implements OnDestroy { +export class SecurityCamerasComponent implements OnInit, OnDestroy { - private alive = true; + private destroy$ = new Subject(); cameras: Camera[]; selectedCamera: Camera; isSingleView = false; + actionSize: NbComponentSize = 'medium'; - constructor(private securityCamerasService: SecurityCamerasData) { + constructor( + private themeService: NbThemeService, + private breakpointService: NbMediaBreakpointsService, + private securityCamerasService: SecurityCamerasData, + ) {} + + ngOnInit() { this.securityCamerasService.getCamerasData() - .pipe(takeWhile(() => this.alive)) + .pipe(takeUntil(this.destroy$)) .subscribe((cameras: Camera[]) => { this.cameras = cameras; this.selectedCamera = this.cameras[0]; }); + + const breakpoints = this.breakpointService.getBreakpointsMap(); + this.themeService.onMediaQueryChange() + .pipe(map(([, breakpoint]) => breakpoint.width)) + .subscribe((width: number) => { + this.actionSize = width > breakpoints.md ? 'medium' : 'small'; + }); + } + + ngOnDestroy() { + this.destroy$.next(); + this.destroy$.complete(); } selectCamera(camera: any) { this.selectedCamera = camera; this.isSingleView = true; } - - ngOnDestroy() { - this.alive = false; - } }