novo-elements
Version:
Bullhorn's NOVO Element Repository for Angular 2
64 lines (58 loc) • 2.22 kB
text/typescript
// NG2
import { EventEmitter, ElementRef, OnDestroy } from '@angular/core';
// APP
import { Helpers } from '../Helpers';
/**
* Outside click helper, makes to set the element as inactive when clicking outside of it
*/
export class OutsideClick implements OnDestroy {
element: ElementRef;
otherElement: ElementRef;
active: boolean = false;
onOutsideClick: EventListenerOrEventListenerObject;
onActiveChange: EventEmitter<boolean> = new EventEmitter<boolean>();
constructor(element: ElementRef) {
// Component element
this.element = element;
// Outside click handler
// Property because `this.func.bind(this)` returns a new function each time
this.onOutsideClick = this.handleOutsideClick.bind(this);
}
/**
* When the element is destroyed, make sure to remove the handler
*/
ngOnDestroy() {
window.removeEventListener('click', this.onOutsideClick);
}
/**
* Toggles the element as active and adds/removes the outside click handler
* @param event
* @param forceValue
*/
public toggleActive(event?: MouseEvent, forceValue?: boolean): void {
// Reverse the active property (if forceValue, use that)
this.active = !Helpers.isBlank(forceValue) ? forceValue : !this.active;
// Bind window click events to hide on outside click
if (this.active) {
window.addEventListener('click', this.onOutsideClick);
} else {
window.removeEventListener('click', this.onOutsideClick);
}
// Fire the active change event
this.onActiveChange.emit(this.active);
}
/**
* When clicking outside, checks the element and closes if outside
* @param event
*/
public handleOutsideClick(event: MouseEvent): void {
// If the elements doesn't contain the target element, it is an outside click
let outsideClick = !this.element.nativeElement.contains(event.target);
if (this.otherElement && outsideClick) {
outsideClick = !this.otherElement.nativeElement.contains(event.target);
}
if (outsideClick) {
this.toggleActive(event, false);
}
}
}