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 { }