ngx-admin/src/app/theme/sidebar/sidebar.component.ts

125 lines
3.3 KiB
TypeScript
Raw Normal View History

2016-04-29 17:08:05 +03:00
import {Component, ElementRef, HostListener, ViewEncapsulation, Input} from 'angular2/core';
import {Router} from 'angular2/router';
2016-04-27 16:02:27 +03:00
import {layoutSizes} from '../theme.constants';
2016-04-27 16:02:27 +03:00
import {SidebarService} from './sidebar.service';
2016-05-02 14:40:12 +03:00
import {ThemeGlobal} from "../theme.global";
2016-04-27 13:17:51 +03:00
@Component({
2016-04-29 17:27:19 +03:00
selector: 'sidebar',
encapsulation: ViewEncapsulation.None,
styles: [require('./sidebar.scss')],
template: require('./sidebar.html'),
providers: [SidebarService],
directives: [],
pipes: []
2016-04-27 13:17:51 +03:00
})
2016-04-27 16:02:27 +03:00
export class Sidebar {
2016-04-29 17:27:19 +03:00
menuItems:Array<any>;
menuHeight:number;
isMenuCollapsed:boolean;
2016-04-29 17:27:19 +03:00
showHoverElem:boolean;
hoverElemHeight:number;
hoverElemTop:number;
2016-04-28 16:44:32 +03:00
2016-04-29 17:27:19 +03:00
outOfArea:number = -200;
2016-04-29 17:27:19 +03:00
isMenuShouldCollapsed:boolean = false;
2016-05-02 12:45:56 +03:00
constructor(private _elementRef:ElementRef,
private _router:Router,
2016-04-29 17:27:19 +03:00
private _sidebarService:SidebarService,
2016-05-02 14:40:12 +03:00
private _themeGlobal:ThemeGlobal) {
2016-05-02 12:45:56 +03:00
2016-04-29 17:27:19 +03:00
}
ngOnInit() {
2016-05-02 12:45:56 +03:00
this.menuItems = this._sidebarService.getMenuItems();
this.selectMenuItem();
2016-05-02 12:45:56 +03:00
this._router.root.subscribe(() => this.selectMenuItem());
}
// TODO: is it really the best event for this kind of things?
ngAfterViewInit() {
this.updateSidebarHeight();
}
@HostListener('window:resize', ['$event'])
onWindowResize($event) {
var isMenuShouldCollapsed = $event.target.innerWidth <= layoutSizes.resWidthCollapseSidebar;
if (this.isMenuShouldCollapsed !== isMenuShouldCollapsed) {
this.menuCollapseStateChange(isMenuShouldCollapsed);
}
this.isMenuShouldCollapsed = isMenuShouldCollapsed;
this.updateSidebarHeight();
}
2016-04-29 17:27:19 +03:00
menuExpand() {
this.menuCollapseStateChange(false);
}
2016-04-29 17:27:19 +03:00
menuCollapse() {
this.menuCollapseStateChange(true);
}
menuCollapseStateChange(isCollapsed) {
this.isMenuCollapsed = isCollapsed;
2016-05-02 14:40:12 +03:00
this._themeGlobal.setData('menu.isCollapsed', this.isMenuCollapsed);
}
2016-04-29 17:27:19 +03:00
hoverItem($event) {
2016-04-28 16:44:32 +03:00
this.showHoverElem = true;
2016-04-29 17:27:19 +03:00
this.hoverElemHeight = $event.currentTarget.clientHeight;
2016-04-28 16:44:32 +03:00
// TODO: get rid of magic 66 constant
this.hoverElemTop = $event.currentTarget.getBoundingClientRect().top - 66;
}
updateSidebarHeight() {
// TODO: get rid of magic 84 constant
2016-05-02 12:45:56 +03:00
this.menuHeight = this._elementRef.nativeElement.childNodes[0].clientHeight - 84;
}
2016-04-29 17:27:19 +03:00
toggleSubMenu($event, item) {
var submenu = $($event.currentTarget).next();
if (this.isMenuCollapsed) {
this.menuExpand();
if (!item.expanded) {
2016-04-28 16:37:07 +03:00
item.expanded = !item.expanded;
submenu.slideToggle();
}
} else {
item.expanded = !item.expanded;
2016-04-28 16:37:07 +03:00
submenu.slideToggle();
}
return false;
}
private selectMenuItem() {
2016-05-02 14:40:12 +03:00
let currentMenu;
2016-05-02 12:45:56 +03:00
let isCurrent = (instruction) => (instruction ? this._router.isRouteActive(this._router.generate([instruction])) : false);
2016-05-02 14:40:12 +03:00
let assignCurrent = (menu) => (menu.selected ? currentMenu = menu : null);
2016-05-02 12:45:56 +03:00
this.menuItems.forEach(function (menu: any) {
menu.selected = isCurrent(menu.name);
menu.expanded = menu.expanded || menu.selected;
2016-05-02 14:40:12 +03:00
assignCurrent(menu);
if (menu.subMenu) {
menu.subMenu.forEach(function (subMenu) {
subMenu.selected = isCurrent(subMenu.name) && !subMenu.disabled;
2016-05-02 14:40:12 +03:00
assignCurrent(menu);
});
}
});
2016-05-02 14:40:12 +03:00
// notifies all subscribers
this._themeGlobal.setData('menu.activeLink', currentMenu);
2016-04-27 16:02:27 +03:00
}
}