2016-04-29 12:41:29 +03:00
|
|
|
import {Component, ElementRef, HostListener, ViewEncapsulation} from 'angular2/core';
|
2016-04-29 11:49:49 +03:00
|
|
|
import {Router} from 'angular2/router';
|
2016-04-27 16:02:27 +03:00
|
|
|
|
2016-04-28 17:52:30 +03:00
|
|
|
import {layoutSizes} from '../theme.constants';
|
2016-04-27 16:02:27 +03:00
|
|
|
import {SidebarService} from './sidebar.service';
|
2016-04-29 11:49:49 +03:00
|
|
|
import {SidebarStateService} from './sidebarState.service';
|
2016-04-27 13:17:51 +03:00
|
|
|
|
|
|
|
|
@Component({
|
|
|
|
|
selector: 'sidebar',
|
2016-04-29 12:41:29 +03:00
|
|
|
encapsulation: ViewEncapsulation.None,
|
2016-04-27 13:17:51 +03:00
|
|
|
styles: [ require('./sidebar.scss') ],
|
|
|
|
|
template: require('./sidebar.html'),
|
2016-04-27 16:02:27 +03:00
|
|
|
providers: [SidebarService],
|
2016-04-27 13:17:51 +03:00
|
|
|
directives: [],
|
|
|
|
|
pipes: []
|
|
|
|
|
})
|
2016-04-27 16:02:27 +03:00
|
|
|
export class Sidebar {
|
|
|
|
|
|
2016-04-28 13:08:33 +03:00
|
|
|
menuItems: Array<any>;
|
|
|
|
|
menuHeight: number;
|
|
|
|
|
isMenuCollapsed: boolean;
|
|
|
|
|
|
2016-04-28 16:44:32 +03:00
|
|
|
showHoverElem: boolean;
|
|
|
|
|
hoverElemHeight: number;
|
|
|
|
|
hoverElemTop: number;
|
|
|
|
|
|
2016-04-28 17:52:30 +03:00
|
|
|
isMenuShouldCollapsed: boolean = false;
|
|
|
|
|
|
2016-04-29 11:49:49 +03:00
|
|
|
constructor(private elementRef: ElementRef, private router: Router, private _sidebarService: SidebarService, private _sidebarStateService: SidebarStateService) {
|
|
|
|
|
|
2016-04-27 16:02:27 +03:00
|
|
|
this.menuItems = this._sidebarService.getMenuItems();
|
2016-04-28 15:08:48 +03:00
|
|
|
}
|
2016-04-28 13:08:33 +03:00
|
|
|
|
2016-04-28 15:08:48 +03:00
|
|
|
ngOnInit() {
|
2016-04-28 13:08:33 +03:00
|
|
|
this.selectMenuItem();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: is it really the best event for this kind of things?
|
|
|
|
|
ngAfterViewInit() {
|
2016-04-29 11:49:49 +03:00
|
|
|
this.updateSidebarHeight();
|
2016-04-28 13:08:33 +03:00
|
|
|
}
|
|
|
|
|
|
2016-04-28 17:52:30 +03:00
|
|
|
@HostListener('window:resize', ['$event'])
|
|
|
|
|
onWindowResize($event) {
|
|
|
|
|
|
|
|
|
|
var isMenuShouldCollapsed = $event.target.innerWidth <= layoutSizes.resWidthCollapseSidebar;
|
|
|
|
|
|
|
|
|
|
if (this.isMenuShouldCollapsed !== isMenuShouldCollapsed) {
|
2016-04-29 11:49:49 +03:00
|
|
|
this.menuCollapseStateChange(isMenuShouldCollapsed);
|
2016-04-28 17:52:30 +03:00
|
|
|
}
|
|
|
|
|
this.isMenuShouldCollapsed = isMenuShouldCollapsed;
|
2016-04-29 11:49:49 +03:00
|
|
|
this.updateSidebarHeight();
|
2016-04-28 17:52:30 +03:00
|
|
|
}
|
|
|
|
|
|
2016-04-28 13:08:33 +03:00
|
|
|
menuExpand () {
|
2016-04-29 11:49:49 +03:00
|
|
|
this.menuCollapseStateChange(false);
|
2016-04-28 13:08:33 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
menuCollapse () {
|
2016-04-29 11:49:49 +03:00
|
|
|
this.menuCollapseStateChange(true);
|
2016-04-28 13:08:33 +03:00
|
|
|
}
|
|
|
|
|
|
2016-04-29 11:49:49 +03:00
|
|
|
menuCollapseStateChange(isCollapsed) {
|
|
|
|
|
this.isMenuCollapsed = isCollapsed;
|
|
|
|
|
this._sidebarStateService.stateChanged(this.isMenuCollapsed);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
hoverItem ($event) {
|
2016-04-28 16:44:32 +03:00
|
|
|
this.showHoverElem = true;
|
|
|
|
|
this.hoverElemHeight = $event.currentTarget.clientHeight;
|
|
|
|
|
// TODO: get rid of magic 66 constant
|
|
|
|
|
this.hoverElemTop = $event.currentTarget.getBoundingClientRect().top - 66;
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-29 11:49:49 +03:00
|
|
|
updateSidebarHeight() {
|
|
|
|
|
// TODO: get rid of magic 84 constant
|
|
|
|
|
this.menuHeight = this.elementRef.nativeElement.childNodes[0].clientHeight - 84;
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-28 13:08:33 +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();
|
2016-04-28 13:08:33 +03:00
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
item.expanded = !item.expanded;
|
2016-04-28 16:37:07 +03:00
|
|
|
submenu.slideToggle();
|
2016-04-28 13:08:33 +03:00
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private selectMenuItem() {
|
2016-04-28 16:37:07 +03:00
|
|
|
let isCurrent = (instruction) => (instruction ? this.router.isRouteActive(this.router.generate([instruction])): false);
|
2016-04-28 13:08:33 +03:00
|
|
|
|
|
|
|
|
this.menuItems.forEach(function (menu) {
|
2016-04-28 15:08:48 +03:00
|
|
|
|
|
|
|
|
menu.selected = isCurrent(menu.name);
|
2016-04-28 13:08:33 +03:00
|
|
|
menu.expanded = menu.expanded || menu.selected;
|
2016-04-28 15:08:48 +03:00
|
|
|
|
2016-04-28 13:08:33 +03:00
|
|
|
if (menu.subMenu) {
|
|
|
|
|
menu.subMenu.forEach(function (subMenu) {
|
2016-04-28 15:08:48 +03:00
|
|
|
subMenu.selected = isCurrent(subMenu.name) && !subMenu.disabled;
|
2016-04-28 13:08:33 +03:00
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
2016-04-27 16:02:27 +03:00
|
|
|
}
|
|
|
|
|
}
|