novo-elements
Version:
Bullhorn's NOVO Element Repository for Angular 2
151 lines (130 loc) • 4.61 kB
text/typescript
// NG2
import { Directive, OnChanges, ComponentRef, ViewContainerRef, ComponentFactoryResolver, Input, Output, EventEmitter, HostListener, SimpleChange } from '@angular/core';
import { PopOverContent } from './PopOverContent';
export class PopOverDirective implements OnChanges {
protected PopoverComponent = PopOverContent;
protected popover: ComponentRef<PopOverContent>;
protected visible: boolean;
constructor(protected viewContainerRef: ViewContainerRef, protected resolver: ComponentFactoryResolver) { }
content: string | PopOverContent;
popoverDisabled: boolean;
popoverAlways: boolean;
popoverAnimation: boolean;
popoverPlacement: string;
popoverTitle: string;
popoverOnHover: boolean = false;
popoverDismissTimeout: number = 0;
onShown = new EventEmitter<PopOverDirective>();
onHidden = new EventEmitter<PopOverDirective>();
// ---------------------------------------------------
// Event listeners
// ---------------------------------------------------
showOrHideOnClick(): void {
if (this.popoverOnHover || this.popoverDisabled) {
return;
}
this.toggle();
}
showOnHover(): void {
if (!this.popoverOnHover || this.popoverDisabled) {
return;
}
this.show();
}
hideOnHover(): void {
if (!this.popoverOnHover || this.popoverDisabled) {
return;
}
this.hide();
}
ngOnChanges(changes: { [propertyName: string]: SimpleChange }) {
if (changes['popoverDisabled']) {
if (changes['popoverDisabled'].currentValue) {
this.hide();
}
}
if (changes['popoverAlways']) {
if (changes['popoverAlways'].currentValue) {
this.show();
}
}
}
toggle() {
if (!this.visible) {
this.show();
} else {
this.hide();
}
}
show() {
if (this.visible) {
return;
}
this.visible = true;
if (typeof this.content === 'string') {
const factory = this.resolver.resolveComponentFactory(this.PopoverComponent);
if (!this.visible) {
return;
}
this.popover = this.viewContainerRef.createComponent(factory);
const popover = this.popover.instance as PopOverContent;
popover.popover = this;
popover.content = this.content as string;
if (this.popoverPlacement !== undefined) {
popover.placement = this.popoverPlacement;
}
if (this.popoverAnimation !== undefined) {
popover.animation = this.popoverAnimation;
}
if (this.popoverTitle !== undefined) {
popover.title = this.popoverTitle;
}
popover.onCloseFromOutside.subscribe(() => this.hide());
if (this.popoverDismissTimeout > 0) {
setTimeout(() => this.hide(), this.popoverDismissTimeout);
}
} else {
const popover = this.content as PopOverContent;
popover.popover = this;
if (this.popoverPlacement !== undefined) {
popover.placement = this.popoverPlacement;
}
if (this.popoverAnimation !== undefined) {
popover.animation = this.popoverAnimation;
}
if (this.popoverTitle !== undefined) {
popover.title = this.popoverTitle;
}
popover.onCloseFromOutside.subscribe(() => this.hide());
if (this.popoverDismissTimeout > 0) {
setTimeout(() => this.hide(), this.popoverDismissTimeout);
}
popover.show();
}
this.onShown.emit(this);
}
hide() {
if (!this.visible) {
return;
}
this.visible = false;
if (this.popover) {
this.popover.destroy();
}
if (this.content instanceof PopOverContent) {
(this.content as PopOverContent).hideFromPopover();
}
this.onHidden.emit(this);
}
getElement() {
return this.viewContainerRef.element.nativeElement;
}
}