import { Component, ElementRef, HostListener, OnDestroy, OnInit, Renderer } from '@angular/core'; import { ClassName, DISMISS_REASONS, ModalOptions, TransitionDurations } from './modal-options.class'; import { BsModalService } from './bs-modal.service'; import { isBs3 } from '../utils/ng2-bootstrap-config'; @Component({ selector: 'modal-container', template: `
`, // tslint:disable-next-line host: { class: 'modal', role: 'dialog', tabindex: '-1' } }) export class ModalContainerComponent implements OnInit, OnDestroy { public config: ModalOptions; public isShown: boolean = false; public level: number; public isAnimated: boolean; protected _element: ElementRef; private isModalHiding: boolean = false; @HostListener('click', ['$event']) public onClick(event: any): void { if (this.config.ignoreBackdropClick || this.config.backdrop === 'static' || event.target !== this._element.nativeElement) { return; } this.bsModalService.setDismissReason(DISMISS_REASONS.BACKRDOP); this.hide(); } @HostListener('window:keydown.esc') public onEsc(): void { if (this.config.keyboard && this.level === this.bsModalService.getModalsCount()) { this.bsModalService.setDismissReason(DISMISS_REASONS.ESC); this.hide(); } } // @HostListener('window:focusin', ['$event']) // public enforceFocus($event:any): void { // if (!(this._element.nativeElement === $event.target || this._element.nativeElement.contains($event.target))) { // this._element.nativeElement.focus(); // } // } // @HostListener('focusout', ['$event']) // public preventFocusOut($event:any): void { // if (!$event.relatedTarget) { // this._element.nativeElement.focus(); // } // } public constructor(options: ModalOptions, _element: ElementRef, private bsModalService: BsModalService, private _renderer: Renderer) { this._element = _element; this.config = Object.assign({}, options); } ngOnInit(): void { if (this.isAnimated) { this._renderer.setElementClass(this._element.nativeElement, ClassName.FADE, true); } this._renderer.setElementStyle(this._element.nativeElement, 'display', 'block'); setTimeout(() => { this.isShown = true; this._renderer.setElementClass(this._element.nativeElement, isBs3() ? ClassName.IN : ClassName.SHOW, true); }, this.isAnimated ? TransitionDurations.BACKDROP : 0); if (document && document.body) { if (this.bsModalService.getModalsCount() === 1) { this.bsModalService.checkScrollbar(); this.bsModalService.setScrollbar(); } this._renderer.setElementClass(document.body, ClassName.OPEN, true); } } ngOnDestroy(): void { if (this.isShown) { this.hide(); } } hide(): void { if (this.isModalHiding || !this.isShown) { return; } this.isModalHiding = true; this._renderer.setElementClass(this._element.nativeElement, isBs3() ? ClassName.IN : ClassName.SHOW, false); setTimeout(() => { this.isShown = false; if (document && document.body && this.bsModalService.getModalsCount() === 1) { this._renderer.setElementClass(document.body, ClassName.OPEN, false); } this.bsModalService.hide(this.level); this.isModalHiding = false; }, this.isAnimated ? TransitionDurations.MODAL : 0); } }