import {NgModule,Component,ElementRef,AfterViewInit,OnDestroy,Input,Output,Renderer2} from '@angular/core';
import {CommonModule} from '@angular/common';
import {DomHandler} from '../dom/domhandler';
import {MenuItem} from '../common/menuitem';
import {RouterModule} from '@angular/router';
@Component({
selector: 'p-tieredMenuSub',
template: `
`,
providers: [DomHandler]
})
export class TieredMenuSub {
@Input() item: MenuItem;
@Input() root: boolean;
@Input() autoZIndex: boolean = true;
@Input() baseZIndex: number = 0;
constructor(public domHandler: DomHandler) {}
activeItem: HTMLLIElement;
hideTimeout: any;
onItemMouseEnter(event: Event, item: HTMLLIElement, menuitem: MenuItem) {
if(menuitem.disabled) {
return;
}
if(this.hideTimeout) {
clearTimeout(this.hideTimeout);
this.hideTimeout = null;
}
this.activeItem = item;
let nextElement: HTMLElement = item.children[0].nextElementSibling;
if(nextElement) {
let sublist: HTMLElement = nextElement.children[0];
if(this.autoZIndex) {
sublist.style.zIndex = String(this.baseZIndex + (++DomHandler.zindex));
}
sublist.style.zIndex = String(++DomHandler.zindex);
sublist.style.top = '0px';
sublist.style.left = this.domHandler.getOuterWidth(item.children[0]) + 'px';
}
}
onItemMouseLeave(event: Event) {
this.hideTimeout = setTimeout(() => {
this.activeItem = null;
}, 250);
}
itemClick(event: Event, item: MenuItem) {
if(item.disabled) {
event.preventDefault();
return true;
}
if(!item.url) {
event.preventDefault();
}
if(item.command) {
item.command({
originalEvent: event,
item: item
});
}
}
listClick(event: Event) {
this.activeItem = null;
}
}
@Component({
selector: 'p-tieredMenu',
template: `
`,
providers: [DomHandler]
})
export class TieredMenu implements AfterViewInit,OnDestroy {
@Input() model: MenuItem[];
@Input() popup: boolean;
@Input() style: any;
@Input() styleClass: string;
@Input() appendTo: any;
@Input() autoZIndex: boolean = true;
@Input() baseZIndex: number = 0;
container: any;
documentClickListener: any;
preventDocumentDefault: any;
constructor(public el: ElementRef, public domHandler: DomHandler, public renderer: Renderer2) {}
ngAfterViewInit() {
this.container = this.el.nativeElement.children[0];
if(this.popup) {
if(this.appendTo) {
if(this.appendTo === 'body')
document.body.appendChild(this.container);
else
this.domHandler.appendChild(this.container, this.appendTo);
}
}
}
toggle(event: Event) {
if(this.container.offsetParent)
this.hide();
else
this.show(event);
}
show(event: Event) {
this.preventDocumentDefault = true;
this.moveOnTop();
this.container.style.display = 'block';
this.domHandler.absolutePosition(this.container, event.currentTarget);
this.domHandler.fadeIn(this.container, 250);
this.bindDocumentClickListener();
}
hide() {
this.container.style.display = 'none';
this.unbindDocumentClickListener();
}
moveOnTop() {
if(this.autoZIndex) {
this.container.style.zIndex = String(this.baseZIndex + (++DomHandler.zindex));
}
}
unbindDocumentClickListener() {
if(this.documentClickListener) {
this.documentClickListener();
this.documentClickListener = null;
}
}
bindDocumentClickListener() {
if(!this.documentClickListener) {
this.documentClickListener = this.renderer.listen('document', 'click', () => {
if(!this.preventDocumentDefault) {
this.hide();
}
this.preventDocumentDefault = false;
});
}
}
ngOnDestroy() {
if(this.popup) {
if(this.documentClickListener) {
this.unbindDocumentClickListener();
}
if(this.appendTo) {
this.el.nativeElement.appendChild(this.container);
}
}
}
}
@NgModule({
imports: [CommonModule,RouterModule],
exports: [TieredMenu,RouterModule],
declarations: [TieredMenu,TieredMenuSub]
})
export class TieredMenuModule { }