import { NgModule, Component, ElementRef, Input, Renderer2, OnDestroy,ChangeDetectorRef } from '@angular/core';
import { CommonModule } from '@angular/common';
import { DomHandler } from '../dom/domhandler';
import { MenuItem } from '../common/menuitem';
import { Location } from '@angular/common';
import { RouterModule } from '@angular/router';
@Component({
selector: 'p-menubarSub',
template: `
`,
providers: [DomHandler]
})
export class MenubarSub implements OnDestroy {
@Input() item: MenuItem;
@Input() root: boolean;
@Input() autoDisplay: boolean;
@Input() autoZIndex: boolean = true;
@Input() baseZIndex: number = 0;
documentClickListener: any;
menuClick: boolean;
menuHoverActive: boolean = false;
activeItem: any;
hideTimeout: any;
activeMenu: any;
constructor(public domHandler: DomHandler, public renderer: Renderer2, private cd: ChangeDetectorRef) { }
onItemMenuClick(event: Event, item: HTMLLIElement, menuitem: MenuItem) {
if (!this.autoDisplay) {
if (menuitem.disabled) {
return;
}
this.activeItem = this.activeMenu ? (this.activeMenu.isEqualNode(item)? null: item) : item;
let nextElement = item.children[0].nextElementSibling;
if (nextElement) {
let sublist = nextElement.children[0];
if (this.autoZIndex) {
sublist.style.zIndex = String(this.baseZIndex + (++DomHandler.zindex));
}
if (this.root) {
sublist.style.top = this.domHandler.getOuterHeight(item.children[0]) + 'px';
sublist.style.left = '0px'
}
else {
sublist.style.top = '0px';
sublist.style.left = this.domHandler.getOuterWidth(item.children[0]) + 'px';
}
}
this.menuClick = true;
this.menuHoverActive = this.activeMenu ? (!this.activeMenu.isEqualNode(item)) : true;
this.activeMenu = this.activeMenu ? (this.activeMenu.isEqualNode(item)? null: item) : item;
this.bindEventListener();
}
}
bindEventListener() {
if (!this.documentClickListener) {
this.documentClickListener = this.renderer.listen('document', 'click',(event) => {
if (!this.menuClick) {
this.activeItem = null;
this.menuHoverActive = false;
}
this.menuClick = false;
});
}
}
onItemMouseEnter(event: Event, item: HTMLLIElement, menuitem: MenuItem) {
if (this.autoDisplay || (!this.autoDisplay && this.root && this.menuHoverActive)) {
if (menuitem.disabled) {
return;
}
if(this.hideTimeout) {
clearTimeout(this.hideTimeout);
this.hideTimeout = null;
}
this.activeItem = this.activeItem ? (this.activeItem.isEqualNode(item)? null: item) : item;
let nextElement = item.children[0].nextElementSibling;
if (nextElement) {
let sublist = nextElement.children[0];
sublist.style.zIndex = String(++DomHandler.zindex);
if (this.root) {
sublist.style.top = this.domHandler.getOuterHeight(item.children[0]) + 'px';
sublist.style.left = '0px'
}
else {
sublist.style.top = '0px';
sublist.style.left = this.domHandler.getOuterWidth(item.children[0]) + 'px';
}
}
this.activeMenu = this.activeMenu ? (this.activeMenu.isEqualNode(item)? null: item) : item;
}
}
onItemMouseLeave(event: Event) {
if (this.autoDisplay) {
this.hideTimeout = setTimeout(() => {
this.activeItem = null;
this.cd.markForCheck();
}, 250);
}
}
itemClick(event, item: MenuItem) {
if (item.disabled) {
event.preventDefault();
return;
}
if (!item.url) {
event.preventDefault();
}
if (item.command) {
item.command({
originalEvent: event,
item: item
});
}
this.activeItem = null;
}
listClick(event) {
if (this.autoDisplay) {
this.activeItem = null;
}
}
ngOnDestroy() {
if(this.documentClickListener) {
this.documentClickListener();
this.documentClickListener = null;
}
}
}
@Component({
selector: 'p-menubar',
template: `
`,
providers: [DomHandler]
})
export class Menubar {
@Input() model: MenuItem[];
@Input() style: any;
@Input() styleClass: string;
@Input() autoDisplay: boolean = true;
@Input() autoZIndex: boolean = true;
@Input() baseZIndex: number = 0;
constructor(public el: ElementRef, public domHandler: DomHandler, public renderer: Renderer2) { }
}
@NgModule({
imports: [CommonModule, RouterModule],
exports: [Menubar, RouterModule],
declarations: [Menubar, MenubarSub]
})
export class MenubarModule { }