mirror of
https://github.com/akveo/ngx-admin.git
synced 2025-12-19 08:50:13 +01:00
menu collapsed state implemented using observer
This commit is contained in:
parent
5817744a37
commit
6a7266ddb3
3 changed files with 57 additions and 21 deletions
|
|
@ -3,6 +3,9 @@
|
||||||
*/
|
*/
|
||||||
import {Component, ViewEncapsulation} from 'angular2/core';
|
import {Component, ViewEncapsulation} from 'angular2/core';
|
||||||
import {RouteConfig, Router} from 'angular2/router';
|
import {RouteConfig, Router} from 'angular2/router';
|
||||||
|
import {Subscription} from 'rxjs/Subscription';
|
||||||
|
|
||||||
|
import {SidebarStateService} from './theme/sidebar/sidebarState.service';
|
||||||
|
|
||||||
import {Pages} from './pages';
|
import {Pages} from './pages';
|
||||||
|
|
||||||
|
|
@ -17,14 +20,14 @@ require("!style!css!sass!./theme/sass/_ionicons.scss");
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app',
|
selector: 'app',
|
||||||
pipes: [ ],
|
pipes: [ ],
|
||||||
providers: [ ],
|
providers: [SidebarStateService],
|
||||||
encapsulation: ViewEncapsulation.None,
|
encapsulation: ViewEncapsulation.None,
|
||||||
styles: [ require('normalize.css'), require('./app.scss') ],
|
styles: [ require('normalize.css'), require('./app.scss') ],
|
||||||
template: `
|
template: `
|
||||||
<header>
|
<header>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main>
|
<main [ngClass]="{'menu-collapsed': isMenuCollapsed}">
|
||||||
<router-outlet></router-outlet>
|
<router-outlet></router-outlet>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
|
|
@ -45,13 +48,23 @@ export class App {
|
||||||
angularclassLogo = 'assets/img/angularclass-avatar.png';
|
angularclassLogo = 'assets/img/angularclass-avatar.png';
|
||||||
name = 'Angular 2 Webpack Starter';
|
name = 'Angular 2 Webpack Starter';
|
||||||
url = 'https://twitter.com/AngularClass';
|
url = 'https://twitter.com/AngularClass';
|
||||||
|
isMenuCollapsed: boolean = false;
|
||||||
|
|
||||||
constructor() {}
|
private _sidebarStateSubscription: Subscription;
|
||||||
|
|
||||||
|
constructor(private _sidebarStateService:SidebarStateService) {
|
||||||
|
this._sidebarStateSubscription = this._sidebarStateService.getStateStream().subscribe((isCollapsed) => this.isMenuCollapsed = isCollapsed);
|
||||||
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
console.log('Initial App State');
|
console.log('Initial App State');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngOnDestroy(){
|
||||||
|
// prevent memory leak when component destroyed
|
||||||
|
this._sidebarStateSubscription.unsubscribe();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,9 @@
|
||||||
import {Component, ElementRef, HostListener} from 'angular2/core';
|
import {Component, ElementRef, HostListener} from 'angular2/core';
|
||||||
|
import {Router} from 'angular2/router';
|
||||||
|
|
||||||
import {layoutSizes} from '../theme.constants';
|
import {layoutSizes} from '../theme.constants';
|
||||||
import {SidebarService} from './sidebar.service';
|
import {SidebarService} from './sidebar.service';
|
||||||
import {Router} from 'angular2/router';
|
import {SidebarStateService} from './sidebarState.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'sidebar',
|
selector: 'sidebar',
|
||||||
|
|
@ -13,8 +14,6 @@ import {Router} from 'angular2/router';
|
||||||
pipes: []
|
pipes: []
|
||||||
})
|
})
|
||||||
export class Sidebar {
|
export class Sidebar {
|
||||||
elementRef: ElementRef;
|
|
||||||
router: Router;
|
|
||||||
|
|
||||||
menuItems: Array<any>;
|
menuItems: Array<any>;
|
||||||
menuHeight: number;
|
menuHeight: number;
|
||||||
|
|
@ -26,9 +25,8 @@ export class Sidebar {
|
||||||
|
|
||||||
isMenuShouldCollapsed: boolean = false;
|
isMenuShouldCollapsed: boolean = false;
|
||||||
|
|
||||||
constructor(el: ElementRef, router: Router, private _sidebarService: SidebarService) {
|
constructor(private elementRef: ElementRef, private router: Router, private _sidebarService: SidebarService, private _sidebarStateService: SidebarStateService) {
|
||||||
this.elementRef = el;
|
|
||||||
this.router = router;
|
|
||||||
this.menuItems = this._sidebarService.getMenuItems();
|
this.menuItems = this._sidebarService.getMenuItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -38,42 +36,46 @@ export class Sidebar {
|
||||||
|
|
||||||
// TODO: is it really the best event for this kind of things?
|
// TODO: is it really the best event for this kind of things?
|
||||||
ngAfterViewInit() {
|
ngAfterViewInit() {
|
||||||
// TODO: get rid of magic 84 constant
|
this.updateSidebarHeight();
|
||||||
this.menuHeight = this.elementRef.nativeElement.childNodes[0].clientHeight - 84;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@HostListener('window:resize', ['$event'])
|
@HostListener('window:resize', ['$event'])
|
||||||
onWindowResize($event) {
|
onWindowResize($event) {
|
||||||
|
|
||||||
var isMenuShouldCollapsed = $event.target.innerWidth <= layoutSizes.resWidthCollapseSidebar;
|
var isMenuShouldCollapsed = $event.target.innerWidth <= layoutSizes.resWidthCollapseSidebar;
|
||||||
var scopeApplied = false;
|
|
||||||
|
|
||||||
if (this.isMenuShouldCollapsed !== isMenuShouldCollapsed) {
|
if (this.isMenuShouldCollapsed !== isMenuShouldCollapsed) {
|
||||||
this.menuHeight = this.elementRef.nativeElement.childNodes[0].clientHeight - 84;
|
this.menuCollapseStateChange(isMenuShouldCollapsed);
|
||||||
this.isMenuCollapsed = isMenuShouldCollapsed;
|
|
||||||
scopeApplied = true;
|
|
||||||
}
|
|
||||||
if (!scopeApplied) {
|
|
||||||
this.menuHeight = this.elementRef.nativeElement.childNodes[0].clientHeight - 84;
|
|
||||||
}
|
}
|
||||||
this.isMenuShouldCollapsed = isMenuShouldCollapsed;
|
this.isMenuShouldCollapsed = isMenuShouldCollapsed;
|
||||||
|
this.updateSidebarHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
menuExpand () {
|
menuExpand () {
|
||||||
this.isMenuCollapsed = false;
|
this.menuCollapseStateChange(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
menuCollapse () {
|
menuCollapse () {
|
||||||
this.isMenuCollapsed = true;
|
this.menuCollapseStateChange(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
hoverItem = function ($event) {
|
menuCollapseStateChange(isCollapsed) {
|
||||||
|
this.isMenuCollapsed = isCollapsed;
|
||||||
|
this._sidebarStateService.stateChanged(this.isMenuCollapsed);
|
||||||
|
}
|
||||||
|
|
||||||
|
hoverItem ($event) {
|
||||||
this.showHoverElem = true;
|
this.showHoverElem = true;
|
||||||
this.hoverElemHeight = $event.currentTarget.clientHeight;
|
this.hoverElemHeight = $event.currentTarget.clientHeight;
|
||||||
// TODO: get rid of magic 66 constant
|
// TODO: get rid of magic 66 constant
|
||||||
this.hoverElemTop = $event.currentTarget.getBoundingClientRect().top - 66;
|
this.hoverElemTop = $event.currentTarget.getBoundingClientRect().top - 66;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateSidebarHeight() {
|
||||||
|
// TODO: get rid of magic 84 constant
|
||||||
|
this.menuHeight = this.elementRef.nativeElement.childNodes[0].clientHeight - 84;
|
||||||
|
}
|
||||||
|
|
||||||
toggleSubMenu ($event, item) {
|
toggleSubMenu ($event, item) {
|
||||||
var submenu = $($event.currentTarget).next();
|
var submenu = $($event.currentTarget).next();
|
||||||
|
|
||||||
|
|
|
||||||
21
src/app/theme/sidebar/sidebarState.service.ts
Normal file
21
src/app/theme/sidebar/sidebarState.service.ts
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
import {Injectable} from 'angular2/core'
|
||||||
|
import {Subject} from 'rxjs/Subject';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class SidebarStateService {
|
||||||
|
|
||||||
|
// Observable string sources
|
||||||
|
private _isCollapsed = new Subject<boolean>();
|
||||||
|
|
||||||
|
// Observable string streams
|
||||||
|
isCollapsedStream$ = this._isCollapsed.asObservable();
|
||||||
|
|
||||||
|
// Service message commands
|
||||||
|
stateChanged(isCollapsed: boolean) {
|
||||||
|
this._isCollapsed.next(isCollapsed)
|
||||||
|
}
|
||||||
|
|
||||||
|
getStateStream() {
|
||||||
|
return this.isCollapsedStream$;
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue