nodram
Version:
A Really MEAN Web Framework
136 lines (91 loc) • 3.81 kB
text/typescript
/**
* Created by EdgeTech on 8/30/2016.
*/
import {
Inject, Injectable, Provider, ElementRef, Injector, Input, Output, ComponentRef,
DynamicComponentLoader, ApplicationRef,
Renderer, Type, ReflectiveInjector
} from '@angular/core';
import {Subject} from "rxjs/Rx";
declare var TweenMax: any;
export class ModalService {
private rootView: HTMLElement;
private modalView: HTMLElement;
private componentRef:ComponentRef;
// Observable string sources
private modalExitSource = new Subject<Object>();
// Observable string streams
public modalExitStream = this.modalExitSource.asObservable();
constructor(//@Inject(ElementRef) private element: ElementRef,
private renderer: Renderer,
private injector: Injector,
private dcl: DynamicComponentLoader,
private appRef: ApplicationRef){
// this.rootView = element.nativeElement;
}
private ensureModalElement() {
//this.modalView = this.rootView.querySelector("#ModalView");
if(this.modalView == null) {
this.modalView = this.renderer.createElement(this.rootView, "article", null);
this.modalView.setAttribute("id", "ModalView");
//create remove modal
let removeModal = this.renderer.createElement(this.modalView, "div", null);
removeModal.setAttribute("id", "removeModal");
removeModal.innerHTML = `<i class="ion-ios-close-empty"></i>`;
//set click event;
removeModal.onclick = () => this.removeModal();
}
var modalContent = this.modalView.querySelector("#ModalContent");
if(modalContent == null) {
modalContent = this.renderer.createElement(this.modalView, "section", null);
modalContent.setAttribute("id", "ModalContent");
}
}
private makeVisible(visible? : boolean){
let state;
if(typeof visible === "undefined" || visible)
state = "visible";
else
state = "hidden";
TweenMax.set(this.modalView,{visibility: state});
}
public notifyExit(tag, meta){
this.modalExitSource.next({tag : tag, meta : meta});
}
public removeModal(makeVisible? :boolean) {
if (this.componentRef) {
this.componentRef.destroy();
if(typeof makeVisible == "undefined" && !makeVisible)
this.makeVisible(false);
}
}
public load(component:Type, data?:Object, tag?: String) {
//Cleanup the old component
this.removeModal(true);
//ensureModal
this.ensureModalElement();
//make visible
this.makeVisible();
//Set providers
var providers = [];
if(typeof data !== "undefined"){
for (let key in data) {
providers.push(new Provider(key, {useValue: data[key]}));
}
}
var injector = ReflectiveInjector.resolveAndCreate(providers, this.injector);
this.dcl.loadAsRoot(component, "#ModalContent", injector).then((compRef:ComponentRef) => {
//lets suscribe to the openModal event
(<any>this.appRef)._loadComponent(compRef);
//store the component
this.componentRef = compRef;
//clean things up
compRef.onDestroy(() => {
(<any>this.appRef)._unloadComponent(compRef);
});
return compRef;
});
// modal-component
}
}