mirror of
https://github.com/akveo/ngx-admin.git
synced 2025-09-21 21:40:49 +02:00

With this change all components, which used data services before, now use abstract classes of service interfaces, mock services extend interface services, CoreModule contains code to inject a needed implementation of some service.
152 lines
4.3 KiB
TypeScript
152 lines
4.3 KiB
TypeScript
import { Component, OnDestroy } from '@angular/core';
|
|
import { delay, withLatestFrom, takeWhile } from 'rxjs/operators';
|
|
import {
|
|
NbMediaBreakpoint,
|
|
NbMediaBreakpointsService,
|
|
NbMenuItem,
|
|
NbMenuService,
|
|
NbSidebarService,
|
|
NbThemeService,
|
|
} from '@nebular/theme';
|
|
|
|
import { StateService } from '../../../@core/utils';
|
|
|
|
// TODO: move layouts into the framework
|
|
@Component({
|
|
selector: 'ngx-sample-layout',
|
|
styleUrls: ['./sample.layout.scss'],
|
|
template: `
|
|
<nb-layout [center]="layout.id === 'center-column'" windowMode>
|
|
<nb-layout-header fixed>
|
|
<ngx-header [position]="sidebar.id === 'start' ? 'normal': 'inverse'"></ngx-header>
|
|
</nb-layout-header>
|
|
|
|
<nb-sidebar class="menu-sidebar"
|
|
tag="menu-sidebar"
|
|
responsive
|
|
[end]="sidebar.id === 'end'">
|
|
<nb-sidebar-header *ngIf="currentTheme !== 'corporate'">
|
|
<a href="#" class="btn btn-hero-success main-btn">
|
|
<i class="ion ion-social-github"></i> <span>Support Us</span>
|
|
</a>
|
|
</nb-sidebar-header>
|
|
<ng-content select="nb-menu"></ng-content>
|
|
</nb-sidebar>
|
|
|
|
<nb-layout-column class="main-content">
|
|
<ng-content select="router-outlet"></ng-content>
|
|
</nb-layout-column>
|
|
|
|
<nb-layout-column start class="small" *ngIf="layout.id === 'two-column' || layout.id === 'three-column'">
|
|
<nb-menu [items]="subMenu"></nb-menu>
|
|
</nb-layout-column>
|
|
|
|
<nb-layout-column class="small" *ngIf="layout.id === 'three-column'">
|
|
<nb-menu [items]="subMenu"></nb-menu>
|
|
</nb-layout-column>
|
|
|
|
<nb-layout-footer fixed>
|
|
<ngx-footer></ngx-footer>
|
|
</nb-layout-footer>
|
|
|
|
<nb-sidebar class="settings-sidebar"
|
|
tag="settings-sidebar"
|
|
state="collapsed"
|
|
fixed
|
|
[end]="sidebar.id !== 'end'">
|
|
<ngx-theme-settings></ngx-theme-settings>
|
|
</nb-sidebar>
|
|
</nb-layout>
|
|
<ngx-toggle-settings-button></ngx-toggle-settings-button>
|
|
`,
|
|
})
|
|
export class SampleLayoutComponent implements OnDestroy {
|
|
|
|
subMenu: NbMenuItem[] = [
|
|
{
|
|
title: 'PAGE LEVEL MENU',
|
|
group: true,
|
|
},
|
|
{
|
|
title: 'Buttons',
|
|
icon: 'ion ion-android-radio-button-off',
|
|
link: '/pages/ui-features/buttons',
|
|
},
|
|
{
|
|
title: 'Grid',
|
|
icon: 'ion ion-android-radio-button-off',
|
|
link: '/pages/ui-features/grid',
|
|
},
|
|
{
|
|
title: 'Icons',
|
|
icon: 'ion ion-android-radio-button-off',
|
|
link: '/pages/ui-features/icons',
|
|
},
|
|
{
|
|
title: 'Modals',
|
|
icon: 'ion ion-android-radio-button-off',
|
|
link: '/pages/ui-features/modals',
|
|
},
|
|
{
|
|
title: 'Typography',
|
|
icon: 'ion ion-android-radio-button-off',
|
|
link: '/pages/ui-features/typography',
|
|
},
|
|
{
|
|
title: 'Animated Searches',
|
|
icon: 'ion ion-android-radio-button-off',
|
|
link: '/pages/ui-features/search-fields',
|
|
},
|
|
{
|
|
title: 'Tabs',
|
|
icon: 'ion ion-android-radio-button-off',
|
|
link: '/pages/ui-features/tabs',
|
|
},
|
|
];
|
|
layout: any = {};
|
|
sidebar: any = {};
|
|
|
|
private alive = true;
|
|
|
|
currentTheme: string;
|
|
|
|
constructor(protected stateService: StateService,
|
|
protected menuService: NbMenuService,
|
|
protected themeService: NbThemeService,
|
|
protected bpService: NbMediaBreakpointsService,
|
|
protected sidebarService: NbSidebarService) {
|
|
this.stateService.onLayoutState()
|
|
.pipe(takeWhile(() => this.alive))
|
|
.subscribe((layout: string) => this.layout = layout);
|
|
|
|
this.stateService.onSidebarState()
|
|
.pipe(takeWhile(() => this.alive))
|
|
.subscribe((sidebar: string) => {
|
|
this.sidebar = sidebar;
|
|
});
|
|
|
|
const isBp = this.bpService.getByName('is');
|
|
this.menuService.onItemSelect()
|
|
.pipe(
|
|
takeWhile(() => this.alive),
|
|
withLatestFrom(this.themeService.onMediaQueryChange()),
|
|
delay(20),
|
|
)
|
|
.subscribe(([item, [bpFrom, bpTo]]: [any, [NbMediaBreakpoint, NbMediaBreakpoint]]) => {
|
|
|
|
if (bpTo.width <= isBp.width) {
|
|
this.sidebarService.collapse('menu-sidebar');
|
|
}
|
|
});
|
|
|
|
this.themeService.getJsTheme()
|
|
.pipe(takeWhile(() => this.alive))
|
|
.subscribe(theme => {
|
|
this.currentTheme = theme.name;
|
|
});
|
|
}
|
|
|
|
ngOnDestroy() {
|
|
this.alive = false;
|
|
}
|
|
}
|