UNPKG

@hxui/angular

Version:

* * *

153 lines 13.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { ReflectiveInjector, Injectable, ComponentFactoryResolver, Optional, Inject } from '@angular/core'; import { ModalBackdropComponent } from './modal-backdrop.component'; import { FocusTrapFactory } from '@angular/cdk/a11y'; import { DOCUMENT } from '@angular/common'; export class ModalService { /** * @param {?} componentFactoryResolver * @param {?} focusTrapFactory * @param {?} document */ constructor(componentFactoryResolver, focusTrapFactory, document) { this.componentFactoryResolver = componentFactoryResolver; this.focusTrapFactory = focusTrapFactory; this.document = document; // Element that was focused before the dialog was opened. Save this to restore upon close. this.elementFocusedBeforeDialogWasOpened = null; } /** * @param {?} vcRef * @return {?} */ registerViewContainerRef(vcRef) { this.vcRef = vcRef; } /** * @param {?} injector * @return {?} */ registerInjector(injector) { this.injector = injector; } /** * Create component dynamically * @template T * @param {?} component * @param {?=} parameters * @return {?} */ create(component, parameters) { // create backdrop this.backdropRef = this.dynamicComponentLoader(ModalBackdropComponent); // create dynamic component this.componentRef = this.dynamicComponentLoader(component, parameters); this.componentNativeElement = this.componentRef.location.nativeElement; this.trapFocus(); return this.componentRef; } /** * @return {?} */ close() { if (!!this.componentRef) { this.componentRef.destroy(); } } /** * Load dynamic component and return componentRef * @template T * @param {?} component * @param {?=} parameters * @return {?} */ dynamicComponentLoader(component, parameters) { // compile the component based on its type and // create a component factory /** @type {?} */ const factory = this.componentFactoryResolver.resolveComponentFactory(component); // the injector will be needed for DI in // the custom component /** @type {?} */ const childInjector = ReflectiveInjector.resolveAndCreate([], this.injector); // create the actual component /** @type {?} */ const componentRef = this.vcRef.createComponent(factory, 0, childInjector); // pass the @Input parameters to the instance Object.assign(componentRef.instance, parameters); // add a destroy method to the modal instance componentRef.instance['destroy'] = () => { // this will close the backdrop this.backdropRef.destroy(); // this will destroy the component componentRef.destroy(); this.restoreFocus(); }; return componentRef; } /** * @return {?} */ trapFocus() { this.focusTrap = this.focusTrapFactory.create(this.componentNativeElement); this.savePreviouslyFocusedElement(); this.focusTrap.focusInitialElementWhenReady(); } /** * @return {?} */ restoreFocus() { /** @type {?} */ const toFocus = this.elementFocusedBeforeDialogWasOpened; if (toFocus && typeof toFocus.focus === 'function') { toFocus.focus(); } if (this.focusTrap) { this.focusTrap.destroy(); } } /** * @return {?} */ savePreviouslyFocusedElement() { if (this.document) { this.elementFocusedBeforeDialogWasOpened = (/** @type {?} */ (this.document .activeElement)); } } } ModalService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ ModalService.ctorParameters = () => [ { type: ComponentFactoryResolver }, { type: FocusTrapFactory }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] } ]; if (false) { /** @type {?} */ ModalService.prototype.vcRef; /** @type {?} */ ModalService.prototype.injector; /** @type {?} */ ModalService.prototype.backdropRef; /** @type {?} */ ModalService.prototype.elementFocusedBeforeDialogWasOpened; /** @type {?} */ ModalService.prototype.componentRef; /** @type {?} */ ModalService.prototype.componentNativeElement; /** @type {?} */ ModalService.prototype.focusTrap; /** @type {?} */ ModalService.prototype.componentFactoryResolver; /** @type {?} */ ModalService.prototype.focusTrapFactory; /** @type {?} */ ModalService.prototype.document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoeHVpL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvbW9kYWwvbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUVMLGtCQUFrQixFQUNsQixVQUFVLEVBR1Ysd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzNDLE1BQU0sT0FBTyxZQUFZOzs7Ozs7SUFnQnZCLFlBQ1Usd0JBQWtELEVBQ2xELGdCQUFrQyxFQUdsQyxRQUFhO1FBSmIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBR2xDLGFBQVEsR0FBUixRQUFRLENBQUs7O1FBYmYsd0NBQW1DLEdBQXVCLElBQUksQ0FBQztJQWNwRSxDQUFDOzs7OztJQUVKLHdCQUF3QixDQUFDLEtBQXVCO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsUUFBa0I7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQzs7Ozs7Ozs7SUFLRCxNQUFNLENBQUksU0FBYyxFQUFFLFVBQW1CO1FBQzNDLGtCQUFrQjtRQUNsQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FDNUMsc0JBQXNCLENBQ3ZCLENBQUM7UUFFRiwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUksU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTFFLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDdkUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRWpCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDOzs7O0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM3QjtJQUNILENBQUM7Ozs7Ozs7O0lBS08sc0JBQXNCLENBQzVCLFNBQWMsRUFDZCxVQUFtQjs7OztjQUliLE9BQU8sR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsdUJBQXVCLENBQ25FLFNBQVMsQ0FDVjs7OztjQUdLLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDdkQsRUFBRSxFQUNGLElBQUksQ0FBQyxRQUFRLENBQ2Q7OztjQUVLLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLGFBQWEsQ0FBQztRQUUxRSw2Q0FBNkM7UUFDN0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELDZDQUE2QztRQUM3QyxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsRUFBRTtZQUN0QywrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQixrQ0FBa0M7WUFDbEMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUM7UUFFRixPQUFPLFlBQVksQ0FBQztJQUN0QixDQUFDOzs7O0lBRU8sU0FBUztRQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLDRCQUE0QixFQUFFLENBQUM7SUFDaEQsQ0FBQzs7OztJQUVPLFlBQVk7O2NBQ1osT0FBTyxHQUFHLElBQUksQ0FBQyxtQ0FBbUM7UUFFeEQsSUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLENBQUMsS0FBSyxLQUFLLFVBQVUsRUFBRTtZQUNsRCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDakI7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7Ozs7SUFFTyw0QkFBNEI7UUFDbEMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxtQ0FBbUMsR0FBRyxtQkFBQSxJQUFJLENBQUMsUUFBUTtpQkFDckQsYUFBYSxFQUFlLENBQUM7U0FDakM7SUFDSCxDQUFDOzs7WUFuSEYsVUFBVTs7OztZQVJULHdCQUF3QjtZQUtqQixnQkFBZ0I7NENBdUJwQixRQUFRLFlBQ1IsTUFBTSxTQUFDLFFBQVE7Ozs7SUFsQmxCLDZCQUFnQzs7SUFFaEMsZ0NBQTJCOztJQUUzQixtQ0FBMEQ7O0lBRTFELDJEQUF1RTs7SUFFdkUsb0NBQXFCOztJQUVyQiw4Q0FBK0I7O0lBRS9CLGlDQUFrQjs7SUFHaEIsZ0RBQTBEOztJQUMxRCx3Q0FBMEM7O0lBQzFDLGdDQUVxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgVmlld0NvbnRhaW5lclJlZixcclxuICBSZWZsZWN0aXZlSW5qZWN0b3IsXHJcbiAgSW5qZWN0YWJsZSxcclxuICBJbmplY3RvcixcclxuICBDb21wb25lbnRSZWYsXHJcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gIE9wdGlvbmFsLFxyXG4gIEluamVjdFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNb2RhbEJhY2tkcm9wQ29tcG9uZW50IH0gZnJvbSAnLi9tb2RhbC1iYWNrZHJvcC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGb2N1c1RyYXBGYWN0b3J5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xyXG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBNb2RhbFNlcnZpY2Uge1xyXG4gIC8vIGhlcmUgd2UgaG9sZCBvdXIgcGxhY2Vob2xkZXJcclxuICBwcml2YXRlIHZjUmVmOiBWaWV3Q29udGFpbmVyUmVmO1xyXG4gIC8vIGhlcmUgd2UgaG9sZCBvdXIgaW5qZWN0b3JcclxuICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcjtcclxuICAvLyBoZXJlIHdlIGhvbGQgdGhlIGJhY2tkcm9wIGNvbXBvbmVudFxyXG4gIHByaXZhdGUgYmFja2Ryb3BSZWY6IENvbXBvbmVudFJlZjxNb2RhbEJhY2tkcm9wQ29tcG9uZW50PjtcclxuICAvLyBFbGVtZW50IHRoYXQgd2FzIGZvY3VzZWQgYmVmb3JlIHRoZSBkaWFsb2cgd2FzIG9wZW5lZC4gU2F2ZSB0aGlzIHRvIHJlc3RvcmUgdXBvbiBjbG9zZS5cclxuICBwcml2YXRlIGVsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIGNvbXBvbmVudFJlZjtcclxuXHJcbiAgcHJpdmF0ZSBjb21wb25lbnROYXRpdmVFbGVtZW50O1xyXG5cclxuICBwcml2YXRlIGZvY3VzVHJhcDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJpdmF0ZSBmb2N1c1RyYXBGYWN0b3J5OiBGb2N1c1RyYXBGYWN0b3J5LFxyXG4gICAgQE9wdGlvbmFsKClcclxuICAgIEBJbmplY3QoRE9DVU1FTlQpXHJcbiAgICBwcml2YXRlIGRvY3VtZW50OiBhbnlcclxuICApIHt9XHJcblxyXG4gIHJlZ2lzdGVyVmlld0NvbnRhaW5lclJlZih2Y1JlZjogVmlld0NvbnRhaW5lclJlZik6IHZvaWQge1xyXG4gICAgdGhpcy52Y1JlZiA9IHZjUmVmO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJJbmplY3RvcihpbmplY3RvcjogSW5qZWN0b3IpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5qZWN0b3IgPSBpbmplY3RvcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBjb21wb25lbnQgZHluYW1pY2FsbHlcclxuICAgKi9cclxuICBjcmVhdGU8VD4oY29tcG9uZW50OiBhbnksIHBhcmFtZXRlcnM/OiBPYmplY3QpOiBDb21wb25lbnRSZWY8VD4ge1xyXG4gICAgLy8gY3JlYXRlIGJhY2tkcm9wXHJcbiAgICB0aGlzLmJhY2tkcm9wUmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50TG9hZGVyPE1vZGFsQmFja2Ryb3BDb21wb25lbnQ+KFxyXG4gICAgICBNb2RhbEJhY2tkcm9wQ29tcG9uZW50XHJcbiAgICApO1xyXG5cclxuICAgIC8vIGNyZWF0ZSBkeW5hbWljIGNvbXBvbmVudFxyXG4gICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLmR5bmFtaWNDb21wb25lbnRMb2FkZXI8VD4oY29tcG9uZW50LCBwYXJhbWV0ZXJzKTtcclxuXHJcbiAgICB0aGlzLmNvbXBvbmVudE5hdGl2ZUVsZW1lbnQgPSB0aGlzLmNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy50cmFwRm9jdXMoKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRSZWY7XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpIHtcclxuICAgIGlmICghIXRoaXMuY29tcG9uZW50UmVmKSB7XHJcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWQgZHluYW1pYyBjb21wb25lbnQgYW5kIHJldHVybiBjb21wb25lbnRSZWZcclxuICAgKi9cclxuICBwcml2YXRlIGR5bmFtaWNDb21wb25lbnRMb2FkZXI8VD4oXHJcbiAgICBjb21wb25lbnQ6IGFueSxcclxuICAgIHBhcmFtZXRlcnM/OiBPYmplY3RcclxuICApOiBDb21wb25lbnRSZWY8YW55PiB7XHJcbiAgICAvLyBjb21waWxlIHRoZSBjb21wb25lbnQgYmFzZWQgb24gaXRzIHR5cGUgYW5kXHJcbiAgICAvLyBjcmVhdGUgYSBjb21wb25lbnQgZmFjdG9yeVxyXG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KFxyXG4gICAgICBjb21wb25lbnRcclxuICAgICk7XHJcbiAgICAvLyB0aGUgaW5qZWN0b3Igd2lsbCBiZSBuZWVkZWQgZm9yIERJIGluXHJcbiAgICAvLyB0aGUgY3VzdG9tIGNvbXBvbmVudFxyXG4gICAgY29uc3QgY2hpbGRJbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFxyXG4gICAgICBbXSxcclxuICAgICAgdGhpcy5pbmplY3RvclxyXG4gICAgKTtcclxuICAgIC8vIGNyZWF0ZSB0aGUgYWN0dWFsIGNvbXBvbmVudFxyXG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy52Y1JlZi5jcmVhdGVDb21wb25lbnQoZmFjdG9yeSwgMCwgY2hpbGRJbmplY3Rvcik7XHJcblxyXG4gICAgLy8gcGFzcyB0aGUgQElucHV0IHBhcmFtZXRlcnMgdG8gdGhlIGluc3RhbmNlXHJcbiAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZSwgcGFyYW1ldGVycyk7XHJcbiAgICAvLyBhZGQgYSBkZXN0cm95IG1ldGhvZCB0byB0aGUgbW9kYWwgaW5zdGFuY2VcclxuICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZVsnZGVzdHJveSddID0gKCkgPT4ge1xyXG4gICAgICAvLyB0aGlzIHdpbGwgY2xvc2UgdGhlIGJhY2tkcm9wXHJcbiAgICAgIHRoaXMuYmFja2Ryb3BSZWYuZGVzdHJveSgpO1xyXG4gICAgICAvLyB0aGlzIHdpbGwgZGVzdHJveSB0aGUgY29tcG9uZW50XHJcbiAgICAgIGNvbXBvbmVudFJlZi5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMucmVzdG9yZUZvY3VzKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBjb21wb25lbnRSZWY7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYXBGb2N1cygpIHtcclxuICAgIHRoaXMuZm9jdXNUcmFwID0gdGhpcy5mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZSh0aGlzLmNvbXBvbmVudE5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy5zYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk7XHJcbiAgICB0aGlzLmZvY3VzVHJhcC5mb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc3RvcmVGb2N1cygpIHtcclxuICAgIGNvbnN0IHRvRm9jdXMgPSB0aGlzLmVsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkO1xyXG5cclxuICAgIGlmICh0b0ZvY3VzICYmIHR5cGVvZiB0b0ZvY3VzLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRvRm9jdXMuZm9jdXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcclxuICAgICAgdGhpcy5mb2N1c1RyYXAuZGVzdHJveSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCkge1xyXG4gICAgaWYgKHRoaXMuZG9jdW1lbnQpIHtcclxuICAgICAgdGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZURpYWxvZ1dhc09wZW5lZCA9IHRoaXMuZG9jdW1lbnRcclxuICAgICAgICAuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19