nts-ng2-components
Version:
Paquete de componentes para Angular2 desarrollado por NITSNETS.
102 lines (89 loc) • 3.29 kB
text/typescript
import {
Component,
ContentChild,
Directive,
ElementRef,
EventEmitter,
Host,
HostListener,
Input,
OnDestroy,
Output,
} from '@angular/core';
import { NtsMenuContainerComponent } from './container/container.component';
import { NtsPosition } from '../../../models/types';
export class NtsMenuComponent {
toggle = false;
keepOpen = false;
openedChange = new EventEmitter();
position: NtsPosition = null;
calculatedPosition: NtsPosition = null;
menuScope: NtsMenuContainerComponent;
opened = false;
constructor(private elementRef: ElementRef) { }
open(x = null) {
if (x) {
this.calculatedPosition = x > document.documentElement.clientWidth / 2 ? 'bottom-left' : 'bottom-right';
}
this.opened = true;
this.openedChange.emit(true);
}
close() {
this.opened = false;
this.openedChange.emit(false);
}
isInClosableZone(element: HTMLElement) {
if (!this.menuScope || this.keepOpen === false) { return false; }
return this.menuScope.elementRef.nativeElement.contains(element);
}
}
export class NtsMenuTriggerDirective implements OnDestroy {
private openedByFocus = false;
private closeMenuOnOutsideClick = (event: MouseEvent) => this.close(event);
constructor( public menu: NtsMenuComponent, private elementRef: ElementRef) { }
openMenu(ev: MouseEvent) {
if (this.openedByFocus) {
this.openedByFocus = false;
return;
}
if (this.menu.opened && this.menu.toggle) {
this.menu.close();
document.removeEventListener('click', this.closeMenuOnOutsideClick);
} else {
this.menu.open(ev.clientX);
document.addEventListener('click', this.closeMenuOnOutsideClick, true);
}
}
onFocus() {
this.openedByFocus = true;
this.menu.open();
document.addEventListener('click', this.closeMenuOnOutsideClick, true);
}
onBlur(event: FocusEvent) {
if (event.relatedTarget &&
!this.menu.isInClosableZone(<HTMLElement>event.relatedTarget) &&
event.relatedTarget !== this.elementRef.nativeElement) {
this.menu.close();
document.removeEventListener('click', this.closeMenuOnOutsideClick);
}
}
ngOnDestroy() {
document.removeEventListener('click', this.closeMenuOnOutsideClick);
}
private close(event: Event) {
if (!this.menu.isInClosableZone(<HTMLElement>event.target)
&& event.target !== this.elementRef.nativeElement
&& !this.elementRef.nativeElement.contains(event.target)) {
this.menu.close();
document.removeEventListener('click', this.closeMenuOnOutsideClick);
}
}
}