import {
Component, ViewContainerRef, ViewChild, ComponentFactoryResolver, ReflectiveInjector, Type
} from '@angular/core';
import {DialogComponent} from "./dialog.component";
import {DialogService} from "./dialog.service";
@Component({
selector: 'dialog-wrapper',
template: `
`
})
export class DialogWrapperComponent {
/**
* Target element to insert dialog content component
*/
@ViewChild('element', {read: ViewContainerRef}) public element: ViewContainerRef;
/**
* Link container DOM element
*/
@ViewChild('container') public container;
/**
* Dialog content componet
* @type {DialogComponent}
*/
private content: DialogComponent;
/**
* Constructor
* @param {ComponentFactoryResolver} resolver
* @param {DialogService} dialogService
*/
constructor(private resolver: ComponentFactoryResolver, private dialogService: DialogService) {}
/**
* Adds content dialog component to wrapper
* @param {Type} component
* @return {DialogComponent}
*/
addComponent(component: Type>) {
let factory = this.resolver.resolveComponentFactory(component);
let injector = ReflectiveInjector.fromResolvedProviders([], this.element.injector);
let componentRef = factory.create(injector);
this.element.insert(componentRef.hostView);
this.content = > componentRef.instance;
this.content.wrapper = this;
return this.content;
}
/**
* Registers event handler to close dialog by click on backdrop
*/
closeByClickOutside() {
const containerEl = this.container.nativeElement;
containerEl.querySelector('.modal-content').addEventListener('click', (event)=> {
event.stopPropagation();
});
containerEl.addEventListener('click', () => {
this.dialogService.removeDialog(this.content);
}, false);
}
}