UNPKG

ngx-bootstrap

Version:
1,726 lines (1,718 loc) 51.1 kB
import { Injectable, InjectionToken, Component, ElementRef, Renderer2, HostListener, EventEmitter, Directive, ViewContainerRef, Optional, Inject, Input, Output, RendererFactory2, NgModule } from '@angular/core'; import { isBs3, Utils, document as document$1, window as window$1 } from 'ngx-bootstrap/utils'; import { ComponentLoaderFactory } from 'ngx-bootstrap/component-loader'; import { PositioningService } from 'ngx-bootstrap/positioning'; import { __values } from 'tslib'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var BsModalRef = /** @class */ (function () { function BsModalRef() { /** * Hides the modal */ this.hide = Function; /** * Sets new class to modal window */ this.setClass = Function; } BsModalRef.decorators = [ { type: Injectable } ]; return BsModalRef; }()); if (false) { /** * Allow user to ID for the modal. Otherwise, a unique number will be given * @type {?} */ BsModalRef.prototype.id; /** * Reference to a component inside the modal. Null if modal's been created with TemplateRef * @type {?} */ BsModalRef.prototype.content; /** * Hides the modal * @type {?} */ BsModalRef.prototype.hide; /** * Sets new class to modal window * @type {?} */ BsModalRef.prototype.setClass; /** * Event that is fired when the modal behind the ref starts hiding * @type {?} */ BsModalRef.prototype.onHide; /** * Event that is fired when the modal behind the ref finishes hiding * @type {?} */ BsModalRef.prototype.onHidden; } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var ModalBackdropOptions = /** @class */ (function () { function ModalBackdropOptions(options) { this.animate = true; Object.assign(this, options); } return ModalBackdropOptions; }()); if (false) { /** @type {?} */ ModalBackdropOptions.prototype.animate; } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var ModalOptions = /** @class */ (function () { function ModalOptions() { } ModalOptions.decorators = [ { type: Injectable } ]; return ModalOptions; }()); if (false) { /** * Allow user to ID for the modal. Otherwise, a unique number will be given * @type {?} */ ModalOptions.prototype.id; /** * Includes a modal-backdrop element. Alternatively, * specify static for a backdrop which doesn't close the modal on click. * @type {?} */ ModalOptions.prototype.backdrop; /** * Closes the modal when escape key is pressed. * @type {?} */ ModalOptions.prototype.keyboard; /** @type {?} */ ModalOptions.prototype.focus; /** * Shows the modal when initialized. * @type {?} */ ModalOptions.prototype.show; /** * Ignore the backdrop click * @type {?} */ ModalOptions.prototype.ignoreBackdropClick; /** * Css class for opened modal * @type {?} */ ModalOptions.prototype.class; /** * Toggle animation * @type {?} */ ModalOptions.prototype.animated; /** * Modal data * @type {?} */ ModalOptions.prototype.initialState; /** * Modal providers * @type {?} */ ModalOptions.prototype.providers; /** * aria-labelledby attribute value to set on the modal window * @type {?} */ ModalOptions.prototype.ariaLabelledBy; /** * aria-describedby attribute value to set on the modal window * @type {?} */ ModalOptions.prototype.ariaDescribedby; } /** @type {?} */ var modalConfigDefaults = { id: (new Date()).getUTCMilliseconds(), backdrop: true, keyboard: true, focus: true, show: false, ignoreBackdropClick: false, class: '', animated: true, initialState: {} }; /** @type {?} */ var MODAL_CONFIG_DEFAULT_OVERRIDE = new InjectionToken('override-default-config'); /** @type {?} */ var CLASS_NAME = { SCROLLBAR_MEASURER: 'modal-scrollbar-measure', BACKDROP: 'modal-backdrop', OPEN: 'modal-open', FADE: 'fade', IN: 'in', // bs3 SHOW: 'show' // bs4 }; /** @type {?} */ var SELECTOR = { DIALOG: '.modal-dialog', DATA_TOGGLE: '[data-toggle="modal"]', DATA_DISMISS: '[data-dismiss="modal"]', FIXED_CONTENT: '.navbar-fixed-top, .navbar-fixed-bottom, .is-fixed' }; /** @type {?} */ var TRANSITION_DURATIONS = { MODAL: 300, BACKDROP: 150 }; /** @type {?} */ var DISMISS_REASONS = { BACKRDOP: 'backdrop-click', ESC: 'esc' }; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var ModalContainerComponent = /** @class */ (function () { function ModalContainerComponent(options, _element, _renderer) { this._element = _element; this._renderer = _renderer; this.isShown = false; this.isModalHiding = false; this.clickStartedInContent = false; this.config = Object.assign({}, options); } /** * @return {?} */ ModalContainerComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; if (this.isAnimated) { this._renderer.addClass(this._element.nativeElement, CLASS_NAME.FADE); } this._renderer.setStyle(this._element.nativeElement, 'display', 'block'); setTimeout((/** * @return {?} */ function () { _this.isShown = true; _this._renderer.addClass(_this._element.nativeElement, isBs3() ? CLASS_NAME.IN : CLASS_NAME.SHOW); }), this.isAnimated ? TRANSITION_DURATIONS.BACKDROP : 0); if (document && document.body) { if (this.bsModalService.getModalsCount() === 1) { this.bsModalService.checkScrollbar(); this.bsModalService.setScrollbar(); } this._renderer.addClass(document.body, CLASS_NAME.OPEN); } if (this._element.nativeElement) { this._element.nativeElement.focus(); } }; /** * @param {?} event * @return {?} */ ModalContainerComponent.prototype.onClickStarted = /** * @param {?} event * @return {?} */ function (event) { this.clickStartedInContent = event.target !== this._element.nativeElement; }; /** * @param {?} event * @return {?} */ ModalContainerComponent.prototype.onClickStop = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var clickedInBackdrop = event.target === this._element.nativeElement && !this.clickStartedInContent; if (this.config.ignoreBackdropClick || this.config.backdrop === 'static' || !clickedInBackdrop) { this.clickStartedInContent = false; return; } this.bsModalService.setDismissReason(DISMISS_REASONS.BACKRDOP); this.hide(); }; /** * @return {?} */ ModalContainerComponent.prototype.onPopState = /** * @return {?} */ function () { this.hide(); }; /** * @param {?} event * @return {?} */ ModalContainerComponent.prototype.onEsc = /** * @param {?} event * @return {?} */ function (event) { if (!this.isShown) { return; } // tslint:disable-next-line:deprecation if (event.keyCode === 27 || event.key === 'Escape') { event.preventDefault(); } if (this.config.keyboard && this.level === this.bsModalService.getModalsCount()) { this.bsModalService.setDismissReason(DISMISS_REASONS.ESC); this.hide(); } }; /** * @return {?} */ ModalContainerComponent.prototype.ngOnDestroy = /** * @return {?} */ function () { if (this.isShown) { this.hide(); } }; /** * @return {?} */ ModalContainerComponent.prototype.hide = /** * @return {?} */ function () { var _this = this; if (this.isModalHiding || !this.isShown) { return; } this.isModalHiding = true; this._renderer.removeClass(this._element.nativeElement, isBs3() ? CLASS_NAME.IN : CLASS_NAME.SHOW); setTimeout((/** * @return {?} */ function () { _this.isShown = false; if (document && document.body && _this.bsModalService.getModalsCount() === 1) { _this._renderer.removeClass(document.body, CLASS_NAME.OPEN); } _this.bsModalService.hide(_this.config.id); _this.isModalHiding = false; }), this.isAnimated ? TRANSITION_DURATIONS.MODAL : 0); }; ModalContainerComponent.decorators = [ { type: Component, args: [{ selector: 'modal-container', template: "\n <div [class]=\"'modal-dialog' + (config.class ? ' ' + config.class : '')\" role=\"document\">\n <div class=\"modal-content\">\n <ng-content></ng-content>\n </div>\n </div>\n ", host: { class: 'modal', role: 'dialog', tabindex: '-1', '[attr.aria-modal]': 'true', '[attr.aria-labelledby]': 'config.ariaLabelledBy', '[attr.aria-describedby]': 'config.ariaDescribedby' } }] } ]; /** @nocollapse */ ModalContainerComponent.ctorParameters = function () { return [ { type: ModalOptions }, { type: ElementRef }, { type: Renderer2 } ]; }; ModalContainerComponent.propDecorators = { onClickStarted: [{ type: HostListener, args: ['mousedown', ['$event'],] }], onClickStop: [{ type: HostListener, args: ['mouseup', ['$event'],] }], onPopState: [{ type: HostListener, args: ['window:popstate',] }], onEsc: [{ type: HostListener, args: ['window:keydown.esc', ['$event'],] }] }; return ModalContainerComponent; }()); if (false) { /** @type {?} */ ModalContainerComponent.prototype.config; /** @type {?} */ ModalContainerComponent.prototype.isShown; /** @type {?} */ ModalContainerComponent.prototype.level; /** @type {?} */ ModalContainerComponent.prototype.isAnimated; /** @type {?} */ ModalContainerComponent.prototype.bsModalService; /** * @type {?} * @private */ ModalContainerComponent.prototype.isModalHiding; /** * @type {?} * @private */ ModalContainerComponent.prototype.clickStartedInContent; /** * @type {?} * @protected */ ModalContainerComponent.prototype._element; /** * @type {?} * @private */ ModalContainerComponent.prototype._renderer; } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * This component will be added as background layout for modals if enabled */ var ModalBackdropComponent = /** @class */ (function () { function ModalBackdropComponent(element, renderer) { this._isShown = false; this.element = element; this.renderer = renderer; } Object.defineProperty(ModalBackdropComponent.prototype, "isAnimated", { get: /** * @return {?} */ function () { return this._isAnimated; }, set: /** * @param {?} value * @return {?} */ function (value) { this._isAnimated = value; // this.renderer.setElementClass(this.element.nativeElement, `${ClassName.FADE}`, value); }, enumerable: true, configurable: true }); Object.defineProperty(ModalBackdropComponent.prototype, "isShown", { get: /** * @return {?} */ function () { return this._isShown; }, set: /** * @param {?} value * @return {?} */ function (value) { this._isShown = value; if (value) { this.renderer.addClass(this.element.nativeElement, "" + CLASS_NAME.IN); } else { this.renderer.removeClass(this.element.nativeElement, "" + CLASS_NAME.IN); } if (!isBs3()) { if (value) { this.renderer.addClass(this.element.nativeElement, "" + CLASS_NAME.SHOW); } else { this.renderer.removeClass(this.element.nativeElement, "" + CLASS_NAME.SHOW); } } }, enumerable: true, configurable: true }); /** * @return {?} */ ModalBackdropComponent.prototype.ngOnInit = /** * @return {?} */ function () { if (this.isAnimated) { this.renderer.addClass(this.element.nativeElement, "" + CLASS_NAME.FADE); Utils.reflow(this.element.nativeElement); } this.isShown = true; }; ModalBackdropComponent.decorators = [ { type: Component, args: [{ selector: 'bs-modal-backdrop', template: ' ', host: { class: CLASS_NAME.BACKDROP } }] } ]; /** @nocollapse */ ModalBackdropComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: Renderer2 } ]; }; return ModalBackdropComponent; }()); if (false) { /** @type {?} */ ModalBackdropComponent.prototype.element; /** @type {?} */ ModalBackdropComponent.prototype.renderer; /** * @type {?} * @protected */ ModalBackdropComponent.prototype._isAnimated; /** * @type {?} * @protected */ ModalBackdropComponent.prototype._isShown; } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** @type {?} */ var TRANSITION_DURATION = 300; /** @type {?} */ var BACKDROP_TRANSITION_DURATION = 150; /** * Mark any code with directive to show it's content in modal */ var ModalDirective = /** @class */ (function () { function ModalDirective(_element, _viewContainerRef, _renderer, clf, modalDefaultOption) { this._element = _element; this._renderer = _renderer; /** * This event fires immediately when the `show` instance method is called. */ this.onShow = new EventEmitter(); /** * This event is fired when the modal has been made visible to the user * (will wait for CSS transitions to complete) */ this.onShown = new EventEmitter(); /** * This event is fired immediately when * the hide instance method has been called. */ this.onHide = new EventEmitter(); /** * This event is fired when the modal has finished being * hidden from the user (will wait for CSS transitions to complete). */ this.onHidden = new EventEmitter(); this._isShown = false; this.isBodyOverflowing = false; this.originalBodyPadding = 0; this.scrollbarWidth = 0; this.timerHideModal = 0; this.timerRmBackDrop = 0; this.isNested = false; this.clickStartedInContent = false; this._backdrop = clf.createLoader(_element, _viewContainerRef, _renderer); this._config = modalConfigDefaults || modalConfigDefaults; } Object.defineProperty(ModalDirective.prototype, "config", { get: /** * @return {?} */ function () { return this._config; }, /** allows to set modal configuration via element property */ set: /** * allows to set modal configuration via element property * @param {?} conf * @return {?} */ function (conf) { this._config = this.getConfig(conf); }, enumerable: true, configurable: true }); Object.defineProperty(ModalDirective.prototype, "isShown", { get: /** * @return {?} */ function () { return this._isShown; }, enumerable: true, configurable: true }); /** * @param {?} event * @return {?} */ ModalDirective.prototype.onClickStarted = /** * @param {?} event * @return {?} */ function (event) { this.clickStartedInContent = event.target !== this._element.nativeElement; }; /** * @param {?} event * @return {?} */ ModalDirective.prototype.onClickStop = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var clickedInBackdrop = event.target === this._element.nativeElement && !this.clickStartedInContent; if (this.config.ignoreBackdropClick || this.config.backdrop === 'static' || !clickedInBackdrop) { this.clickStartedInContent = false; return; } this.dismissReason = DISMISS_REASONS.BACKRDOP; this.hide(event); }; // todo: consider preventing default and stopping propagation // todo: consider preventing default and stopping propagation /** * @param {?} event * @return {?} */ ModalDirective.prototype.onEsc = // todo: consider preventing default and stopping propagation /** * @param {?} event * @return {?} */ function (event) { if (!this._isShown) { return; } // tslint:disable-next-line:deprecation if (event.keyCode === 27 || event.key === 'Escape') { event.preventDefault(); } if (this.config.keyboard) { this.dismissReason = DISMISS_REASONS.ESC; this.hide(); } }; /** * @return {?} */ ModalDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { this.config = void 0; if (this._isShown) { this._isShown = false; this.hideModal(); this._backdrop.dispose(); } }; /** * @return {?} */ ModalDirective.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this._config = this._config || this.getConfig(); setTimeout((/** * @return {?} */ function () { if (_this._config.show) { _this.show(); } }), 0); }; /* Public methods */ /** Allows to manually toggle modal visibility */ /* Public methods */ /** * Allows to manually toggle modal visibility * @return {?} */ ModalDirective.prototype.toggle = /* Public methods */ /** * Allows to manually toggle modal visibility * @return {?} */ function () { return this._isShown ? this.hide() : this.show(); }; /** Allows to manually open modal */ /** * Allows to manually open modal * @return {?} */ ModalDirective.prototype.show = /** * Allows to manually open modal * @return {?} */ function () { var _this = this; this.dismissReason = null; this.onShow.emit(this); if (this._isShown) { return; } clearTimeout(this.timerHideModal); clearTimeout(this.timerRmBackDrop); this._isShown = true; this.checkScrollbar(); this.setScrollbar(); if (document$1 && document$1.body) { if (document$1.body.classList.contains(CLASS_NAME.OPEN)) { this.isNested = true; } else { this._renderer.addClass(document$1.body, CLASS_NAME.OPEN); } } this.showBackdrop((/** * @return {?} */ function () { _this.showElement(); })); }; /** Allows to manually close modal */ /** * Allows to manually close modal * @param {?=} event * @return {?} */ ModalDirective.prototype.hide = /** * Allows to manually close modal * @param {?=} event * @return {?} */ function (event) { var _this = this; if (event) { event.preventDefault(); } this.onHide.emit(this); // todo: add an option to prevent hiding if (!this._isShown) { return; } window$1.clearTimeout(this.timerHideModal); window$1.clearTimeout(this.timerRmBackDrop); this._isShown = false; this._renderer.removeClass(this._element.nativeElement, CLASS_NAME.IN); if (!isBs3()) { this._renderer.removeClass(this._element.nativeElement, CLASS_NAME.SHOW); } // this._addClassIn = false; if (this._config.animated) { this.timerHideModal = window$1.setTimeout((/** * @return {?} */ function () { return _this.hideModal(); }), TRANSITION_DURATION); } else { this.hideModal(); } }; /** Private methods @internal */ /** * Private methods \@internal * @protected * @param {?=} config * @return {?} */ ModalDirective.prototype.getConfig = /** * Private methods \@internal * @protected * @param {?=} config * @return {?} */ function (config) { return Object.assign({}, this._config, config); }; /** * Show dialog * @internal */ /** * Show dialog * \@internal * @protected * @return {?} */ ModalDirective.prototype.showElement = /** * Show dialog * \@internal * @protected * @return {?} */ function () { var _this = this; // todo: replace this with component loader usage if (!this._element.nativeElement.parentNode || this._element.nativeElement.parentNode.nodeType !== Node.ELEMENT_NODE) { // don't move modals dom position if (document$1 && document$1.body) { document$1.body.appendChild(this._element.nativeElement); } } this._renderer.setAttribute(this._element.nativeElement, 'aria-hidden', 'false'); this._renderer.setAttribute(this._element.nativeElement, 'aria-modal', 'true'); this._renderer.setStyle(this._element.nativeElement, 'display', 'block'); this._renderer.setProperty(this._element.nativeElement, 'scrollTop', 0); if (this._config.animated) { Utils.reflow(this._element.nativeElement); } // this._addClassIn = true; this._renderer.addClass(this._element.nativeElement, CLASS_NAME.IN); if (!isBs3()) { this._renderer.addClass(this._element.nativeElement, CLASS_NAME.SHOW); } /** @type {?} */ var transitionComplete = (/** * @return {?} */ function () { if (_this._config.focus) { _this._element.nativeElement.focus(); } _this.onShown.emit(_this); }); if (this._config.animated) { setTimeout(transitionComplete, TRANSITION_DURATION); } else { transitionComplete(); } }; /** @internal */ /** * \@internal * @protected * @return {?} */ ModalDirective.prototype.hideModal = /** * \@internal * @protected * @return {?} */ function () { var _this = this; this._renderer.setAttribute(this._element.nativeElement, 'aria-hidden', 'true'); this._renderer.setStyle(this._element.nativeElement, 'display', 'none'); this.showBackdrop((/** * @return {?} */ function () { if (!_this.isNested) { if (document$1 && document$1.body) { _this._renderer.removeClass(document$1.body, CLASS_NAME.OPEN); } _this.resetScrollbar(); } _this.resetAdjustments(); _this.focusOtherModal(); _this.onHidden.emit(_this); })); }; // todo: original show was calling a callback when done, but we can use // promise /** @internal */ // todo: original show was calling a callback when done, but we can use // promise /** * \@internal * @protected * @param {?=} callback * @return {?} */ ModalDirective.prototype.showBackdrop = // todo: original show was calling a callback when done, but we can use // promise /** * \@internal * @protected * @param {?=} callback * @return {?} */ function (callback) { var _this = this; if (this._isShown && this.config.backdrop && (!this.backdrop || !this.backdrop.instance.isShown)) { this.removeBackdrop(); this._backdrop .attach(ModalBackdropComponent) .to('body') .show({ isAnimated: this._config.animated }); this.backdrop = this._backdrop._componentRef; if (!callback) { return; } if (!this._config.animated) { callback(); return; } setTimeout(callback, BACKDROP_TRANSITION_DURATION); } else if (!this._isShown && this.backdrop) { this.backdrop.instance.isShown = false; /** @type {?} */ var callbackRemove = (/** * @return {?} */ function () { _this.removeBackdrop(); if (callback) { callback(); } }); if (this.backdrop.instance.isAnimated) { this.timerRmBackDrop = window$1.setTimeout(callbackRemove, BACKDROP_TRANSITION_DURATION); } else { callbackRemove(); } } else if (callback) { callback(); } }; /** @internal */ /** * \@internal * @protected * @return {?} */ ModalDirective.prototype.removeBackdrop = /** * \@internal * @protected * @return {?} */ function () { this._backdrop.hide(); }; /** Events tricks */ // no need for it // protected setEscapeEvent():void { // if (this._isShown && this._config.keyboard) { // $(this._element).on(Event.KEYDOWN_DISMISS, (event) => { // if (event.which === 27) { // this.hide() // } // }) // // } else if (!this._isShown) { // $(this._element).off(Event.KEYDOWN_DISMISS) // } // } // protected setResizeEvent():void { // console.log(this.renderer.listenGlobal('', Event.RESIZE)); // if (this._isShown) { // $(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this)) // } else { // $(window).off(Event.RESIZE) // } // } /** * Events tricks * @protected * @return {?} */ // no need for it // protected setEscapeEvent():void { // if (this._isShown && this._config.keyboard) { // $(this._element).on(Event.KEYDOWN_DISMISS, (event) => { // if (event.which === 27) { // this.hide() // } // }) // // } else if (!this._isShown) { // $(this._element).off(Event.KEYDOWN_DISMISS) // } // } // protected setResizeEvent():void { // console.log(this.renderer.listenGlobal('', Event.RESIZE)); // if (this._isShown) { // $(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this)) // } else { // $(window).off(Event.RESIZE) // } // } ModalDirective.prototype.focusOtherModal = /** * Events tricks * @protected * @return {?} */ // no need for it // protected setEscapeEvent():void { // if (this._isShown && this._config.keyboard) { // $(this._element).on(Event.KEYDOWN_DISMISS, (event) => { // if (event.which === 27) { // this.hide() // } // }) // // } else if (!this._isShown) { // $(this._element).off(Event.KEYDOWN_DISMISS) // } // } // protected setResizeEvent():void { // console.log(this.renderer.listenGlobal('', Event.RESIZE)); // if (this._isShown) { // $(window).on(Event.RESIZE, $.proxy(this._handleUpdate, this)) // } else { // $(window).off(Event.RESIZE) // } // } function () { if (this._element.nativeElement.parentElement == null) { return; } /** @type {?} */ var otherOpenedModals = this._element.nativeElement.parentElement.querySelectorAll('.in[bsModal]'); if (!otherOpenedModals.length) { return; } otherOpenedModals[otherOpenedModals.length - 1].focus(); }; /** @internal */ /** * \@internal * @protected * @return {?} */ ModalDirective.prototype.resetAdjustments = /** * \@internal * @protected * @return {?} */ function () { this._renderer.setStyle(this._element.nativeElement, 'paddingLeft', ''); this._renderer.setStyle(this._element.nativeElement, 'paddingRight', ''); }; /** Scroll bar tricks */ /** @internal */ /** Scroll bar tricks */ /** * \@internal * @protected * @return {?} */ ModalDirective.prototype.checkScrollbar = /** Scroll bar tricks */ /** * \@internal * @protected * @return {?} */ function () { this.isBodyOverflowing = document$1.body.clientWidth < window$1.innerWidth; this.scrollbarWidth = this.getScrollbarWidth(); }; /** * @protected * @return {?} */ ModalDirective.prototype.setScrollbar = /** * @protected * @return {?} */ function () { if (!document$1) { return; } this.originalBodyPadding = parseInt(window$1 .getComputedStyle(document$1.body) .getPropertyValue('padding-right') || 0, 10); if (this.isBodyOverflowing) { document$1.body.style.paddingRight = this.originalBodyPadding + this.scrollbarWidth + "px"; } }; /** * @protected * @return {?} */ ModalDirective.prototype.resetScrollbar = /** * @protected * @return {?} */ function () { document$1.body.style.paddingRight = this.originalBodyPadding + "px"; }; // thx d.walsh // thx d.walsh /** * @protected * @return {?} */ ModalDirective.prototype.getScrollbarWidth = // thx d.walsh /** * @protected * @return {?} */ function () { /** @type {?} */ var scrollDiv = this._renderer.createElement('div'); this._renderer.addClass(scrollDiv, CLASS_NAME.SCROLLBAR_MEASURER); this._renderer.appendChild(document$1.body, scrollDiv); /** @type {?} */ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; this._renderer.removeChild(document$1.body, scrollDiv); return scrollbarWidth; }; ModalDirective.decorators = [ { type: Directive, args: [{ selector: '[bsModal]', exportAs: 'bs-modal' },] } ]; /** @nocollapse */ ModalDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: ViewContainerRef }, { type: Renderer2 }, { type: ComponentLoaderFactory }, { type: ModalOptions, decorators: [{ type: Optional }, { type: Inject, args: [MODAL_CONFIG_DEFAULT_OVERRIDE,] }] } ]; }; ModalDirective.propDecorators = { config: [{ type: Input }], onShow: [{ type: Output }], onShown: [{ type: Output }], onHide: [{ type: Output }], onHidden: [{ type: Output }], onClickStarted: [{ type: HostListener, args: ['mousedown', ['$event'],] }], onClickStop: [{ type: HostListener, args: ['mouseup', ['$event'],] }], onEsc: [{ type: HostListener, args: ['keydown.esc', ['$event'],] }] }; return ModalDirective; }()); if (false) { /** * This event fires immediately when the `show` instance method is called. * @type {?} */ ModalDirective.prototype.onShow; /** * This event is fired when the modal has been made visible to the user * (will wait for CSS transitions to complete) * @type {?} */ ModalDirective.prototype.onShown; /** * This event is fired immediately when * the hide instance method has been called. * @type {?} */ ModalDirective.prototype.onHide; /** * This event is fired when the modal has finished being * hidden from the user (will wait for CSS transitions to complete). * @type {?} */ ModalDirective.prototype.onHidden; /** * This field contains last dismiss reason. * Possible values: `backdrop-click`, `esc` and `id: number` * (if modal was closed by direct call of `.hide()`). * @type {?} */ ModalDirective.prototype.dismissReason; /** * @type {?} * @protected */ ModalDirective.prototype._config; /** * @type {?} * @protected */ ModalDirective.prototype._isShown; /** * @type {?} * @protected */ ModalDirective.prototype.isBodyOverflowing; /** * @type {?} * @protected */ ModalDirective.prototype.originalBodyPadding; /** * @type {?} * @protected */ ModalDirective.prototype.scrollbarWidth; /** * @type {?} * @protected */ ModalDirective.prototype.timerHideModal; /** * @type {?} * @protected */ ModalDirective.prototype.timerRmBackDrop; /** * @type {?} * @protected */ ModalDirective.prototype.backdrop; /** * @type {?} * @private */ ModalDirective.prototype._backdrop; /** * @type {?} * @private */ ModalDirective.prototype.isNested; /** * @type {?} * @private */ ModalDirective.prototype.clickStartedInContent; /** * @type {?} * @private */ ModalDirective.prototype._element; /** * @type {?} * @private */ ModalDirective.prototype._renderer; } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var BsModalService = /** @class */ (function () { function BsModalService(rendererFactory, clf, modalDefaultOption) { this.clf = clf; this.modalDefaultOption = modalDefaultOption; // tslint:disable-next-line:no-any this.onShow = new EventEmitter(); // tslint:disable-next-line:no-any this.onShown = new EventEmitter(); // tslint:disable-next-line:no-any this.onHide = new EventEmitter(); // tslint:disable-next-line:no-any this.onHidden = new EventEmitter(); this.isBodyOverflowing = false; this.originalBodyPadding = 0; this.scrollbarWidth = 0; this.modalsCount = 0; this.lastDismissReason = null; this.loaders = []; this._backdropLoader = this.clf.createLoader(null, null, null); this._renderer = rendererFactory.createRenderer(null, null); this.config = modalDefaultOption ? (Object.assign({}, modalConfigDefaults, modalDefaultOption)) : modalConfigDefaults; } /** Shows a modal */ // tslint:disable-next-line:no-any /** * Shows a modal * @param {?} content * @param {?=} config * @return {?} */ // tslint:disable-next-line:no-any BsModalService.prototype.show = /** * Shows a modal * @param {?} content * @param {?=} config * @return {?} */ // tslint:disable-next-line:no-any function (content, config) { this.modalsCount++; this._createLoaders(); this.config = this.modalDefaultOption ? Object.assign({}, modalConfigDefaults, this.modalDefaultOption, config) : Object.assign({}, modalConfigDefaults, config); this._showBackdrop(); this.lastDismissReason = null; return this._showModal(content); }; /** * @param {?=} id * @return {?} */ BsModalService.prototype.hide = /** * @param {?=} id * @return {?} */ function (id) { var _this = this; if (this.modalsCount === 1 || id == null) { this._hideBackdrop(); this.resetScrollbar(); } this.modalsCount = this.modalsCount >= 1 && id != null ? this.modalsCount - 1 : 0; setTimeout((/** * @return {?} */ function () { _this._hideModal(id); _this.removeLoaders(id); }), this.config.animated ? TRANSITION_DURATIONS.BACKDROP : 0); }; /** * @return {?} */ BsModalService.prototype._showBackdrop = /** * @return {?} */ function () { /** @type {?} */ var isBackdropEnabled = this.config.backdrop || this.config.backdrop === 'static'; /** @type {?} */ var isBackdropInDOM = !this.backdropRef || !this.backdropRef.instance.isShown; if (this.modalsCount === 1) { this.removeBackdrop(); if (isBackdropEnabled && isBackdropInDOM) { this._backdropLoader .attach(ModalBackdropComponent) .to('body') .show({ isAnimated: this.config.animated }); this.backdropRef = this._backdropLoader._componentRef; } } }; /** * @return {?} */ BsModalService.prototype._hideBackdrop = /** * @return {?} */ function () { var _this = this; if (!this.backdropRef) { return; } this.backdropRef.instance.isShown = false; /** @type {?} */ var duration = this.config.animated ? TRANSITION_DURATIONS.BACKDROP : 0; setTimeout((/** * @return {?} */ function () { return _this.removeBackdrop(); }), duration); }; // tslint:disable-next-line:no-any // tslint:disable-next-line:no-any /** * @param {?} content * @return {?} */ BsModalService.prototype._showModal = // tslint:disable-next-line:no-any /** * @param {?} content * @return {?} */ function (content) { var e_1, _a; var _b; /** @type {?} */ var modalLoader = this.loaders[this.loaders.length - 1]; if (this.config && this.config.providers) { try { for (var _c = __values(this.config.providers), _d = _c.next(); !_d.done; _d = _c.next()) { var provider = _d.value; modalLoader.provide(provider); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_d && !_d.done && (_a = _c.return)) _a.call(_c); } finally { if (e_1) throw e_1.error; } } } /** @type {?} */ var bsModalRef = new BsModalRef(); /** @type {?} */ var modalContainerRef = modalLoader .provide({ provide: ModalOptions, useValue: this.config }) .provide({ provide: BsModalRef, useValue: bsModalRef }) .attach(ModalContainerComponent) .to('body'); bsModalRef.hide = (/** * @return {?} */ function () { return modalContainerRef.instance.hide(); }); bsModalRef.setClass = (/** * @param {?} newClass * @return {?} */ function (newClass) { modalContainerRef.instance.config.class = newClass; }); bsModalRef.onHidden = new EventEmitter(); bsModalRef.onHide = new EventEmitter(); this.copyEvent(modalLoader.onBeforeHide, bsModalRef.onHide); this.copyEvent(modalLoader.onHidden, bsModalRef.onHidden); // call 'show' method after assign setClass in bsModalRef. // it makes modal component's bsModalRef available to call setClass method modalContainerRef.show({ content: content, isAnimated: this.config.animated, initialState: this.config.initialState, bsModalService: this, id: this.config.id }); modalContainerRef.instance.level = this.getModalsCount(); bsModalRef.content = modalLoader.getInnerComponent() || null; bsModalRef.id = (_b = modalContainerRef.instance.config) === null || _b === void 0 ? void 0 : _b.id; return bsModalRef; }; /** * @param {?=} id * @return {?} */ BsModalService.prototype._hideModal = /** * @param {?=} id * @return {?} */ function (id) { if (id != null) { /** @type {?} */ var indexToRemove = this.loaders.findIndex((/** * @param {?} loader * @return {?} */ function (loader) { return loader.instance.config.id === id; })); /** @type {?} */ var modalLoader = this.loaders[indexToRemove]; if (modalLoader) { modalLoader.hide(id); } } else { this.loaders.forEach((/** * @param {?} loader * @return {?} */ function (loader) { loader.hide(loader.instance.config.id); })); } }; /** * @return {?} */ BsModalService.prototype.getModalsCount = /** * @return {?} */ function () { return this.modalsCount; }; /** * @param {?} reason * @return {?} */ BsModalService.prototype.setDismissReason = /** * @param {?} reason * @return {?} */ function (reason) { this.lastDismissReason = reason; }; /** * @return {?} */ BsModalService.prototype.removeBackdrop = /** * @return {?} */ function () { this._renderer.removeClass(document.body, CLASS_NAME.OPEN); this._backdropLoader.hide(); this.backdropRef = null; }; /** Checks if the body is overflowing and sets scrollbar width */ /** @internal */ /** Checks if the body is overflowing and sets scrollbar width */ /** * \@internal * @return {?} */ BsModalService.prototype.checkScrollbar = /** Checks if the body is overflowing and sets scrollbar width */ /** * \@internal * @return {?} */ function () { this.isBodyOverflowing = document.body.clientWidth < window.innerWidth; this.scrollbarWidth = this.getScrollbarWidth(); }; /** * @return {?} */ BsModalService.prototype.setScrollbar = /** * @return {?} */ function () { if (!document) { return; } this.originalBodyPadding = parseInt(window .getComputedStyle(document.body) .getPropertyValue('padding-right') || '0', 10); if (this.isBodyOverflowing) { document.body.style.paddingRight = this.originalBodyPadding + this.scrollbarWidth + "px"; } }; /** * @private * @return {?} */ BsModalService.prototype.resetScrollbar = /** * @private * @return {?} */ function () { document.body.style.paddingRight = this.originalBodyPadding + "px"; }; // thx d.walsh // thx d.walsh /** * @private * @return {?} */ BsModalService.prototype.getScrollbarWidth = // thx d.walsh /** * @private * @return {?} */ function () { /** @type {?} */ var scrollDiv = this._renderer.createElement('div'); this._renderer.addClass(scrollDiv, CLASS_NAME.SCROLLBAR_MEASURER); this._renderer.appendChild(document.body, scrollDiv); /** @type {?} */ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; this._renderer.removeChild(document.body, scrollDiv); return scrollbarWidth; }; /** * @private * @return {?} */ BsModalService.prototype._createLoaders = /** * @private * @return {?} */ function () { /** @type {?} */ var loader = this.clf.createLoader(null, null, null); this.copyEvent(loader.onBeforeShow, this.onShow); this.copyEvent(loader.onShown, this.onShown); this.copyEvent(loader.onBeforeHide, this.onHide); this.copyEvent(loader.onHidden, this.onHidden); this.loaders.push(loader); }; /** * @private * @param {?=} id * @return {?} */ BsModalService.prototype.removeLoaders = /** * @private * @param {?=} id * @return {?} */ function (id) { if (id != null) { /** @type {?} */ var indexToRemove = this.loaders.findIndex((/** * @param {?} loader * @return {?} */ function (loader) { return loader.instance.config.id === id; })); if (indexToRemove >= 0) { this.loaders.splice(indexToRemove, 1); this.loaders.forEach((/** * @param {?} loader * @param {?} i * @return {?} */ function (loader, i) { loader.instance.level = i + 1; })); } } else { this.loaders.splice(0, this.loaders.length); } }; // tslint:disable-next-line:no-any // tslint:disable-next-line:no-any /** * @private * @param {?} from * @param {?} to * @return {?} */ BsModalService.prototype.copyEvent = // tslint:disable-next-line:no-any /** * @private * @param {?} from * @param {?} to * @return {?} */ function (from, to) { var _this = this; from.subscribe((/** * @param {?} data * @return {?} */ function (data) { to.emit(_this.lastDismissReason || data); })); }; BsModalService.decorators = [ { type: Injectable } ]; /** @nocollapse */ BsModalService.ctorParameters = function () { return [ { type: RendererFactory2 }, { type: ComponentLoaderFactory }, { type: ModalOptions, decorators: [{ type: Optional }, { type: Inject, args: [MODAL_CONFIG_DEFAULT_OVERRIDE,] }] } ]; }; return BsModalService; }()); if (false) { /** @type {?} */ BsModalService.prototype.config; /** @type {?} */ BsModalService.prototype.onShow; /** @type {?} */ BsModalService.prototype.onShown; /** @type {?} */ BsModalService.prototype.onHide; /** @type {?} */ BsModalService.prototype.onHidden; /** * @type {?} * @protected */ BsModalService.prototype.isBodyOverflowing; /** * @type {?} * @protected */ BsModalService.prototype.originalBodyPadding; /** * @type {?} * @protected */ BsModalService.prototype.scrollbarWidth; /** * @type {?} * @protected */ BsModalService.prototype.backdropRef; /** * @type {?} * @private */ BsModalService.prototype._backdropLoader; /** * @type {?} * @private */ BsModalService.prototype.modalsCount; /** * @type {?} * @private */ BsModalService.prototype.lastDismissReason; /** * @type {?} * @private */ BsModalService.prototype.loaders; /** * @type {?} * @private */ BsModalService.prototype._renderer; /** * @type {?} * @private */ BsModalService.prototype.clf; /** * @type {?} * @private */ BsModalService.prototype.modalDefaultOption; } /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var ModalModule = /** @class */ (function () { function ModalModule() { } /** * @return {?} */ ModalModule.forRoot = /** * @return {?} */ function () { return { ngModule: ModalModule, providers: [BsModalService, ComponentLoaderFactory, PositioningService] }; }; /** * @return {?} */ ModalModule.forChild = /** * @return {?} */ function () { return { ngModule: ModalModule, providers: [BsModalService, Co