@hxui/angular
Version:
This README includes the steps that are necessary to import the HxUi-angular into a project or to contribute with development.
156 lines (155 loc) • 13.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} 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;
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
const /** @type {?} */ factory = this.componentFactoryResolver.resolveComponentFactory(component);
// the injector will be needed for DI in
// the custom component
const /** @type {?} */ childInjector = ReflectiveInjector.resolveAndCreate([], this.injector);
// create the actual component
const /** @type {?} */ 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() {
const /** @type {?} */ 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,] },] },
];
function ModalService_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ModalService.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ModalService.ctorParameters;
/** @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoeHVpL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvbW9kYWwvbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUVMLGtCQUFrQixFQUNsQixVQUFVLEVBR1Ysd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixNQUFNLEVBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzNDLE1BQU07Ozs7OztJQWdCSixZQUNVLDBCQUNBLGtCQUdBO1FBSkEsNkJBQXdCLEdBQXhCLHdCQUF3QjtRQUN4QixxQkFBZ0IsR0FBaEIsZ0JBQWdCO1FBR2hCLGFBQVEsR0FBUixRQUFRO21EQWJnRCxJQUFJO0tBY2xFOzs7OztJQUVKLHdCQUF3QixDQUFDLEtBQXVCO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0tBQ3BCOzs7OztJQUVELGdCQUFnQixDQUFDLFFBQWtCO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO0tBQzFCOzs7Ozs7OztJQUtELE1BQU0sQ0FBSSxTQUFjLEVBQUUsVUFBbUI7O1FBRTNDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUM1QyxzQkFBc0IsQ0FDdkIsQ0FBQzs7UUFHRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBSSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFMUUsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUN2RSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFakIsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7S0FDMUI7Ozs7SUFFRCxLQUFLO1FBQ0gsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDN0I7S0FDRjs7Ozs7Ozs7SUFLTyxzQkFBc0IsQ0FDNUIsU0FBYyxFQUNkLFVBQW1COzs7UUFJbkIsdUJBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FDbkUsU0FBUyxDQUNWLENBQUM7OztRQUdGLHVCQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDdkQsRUFBRSxFQUNGLElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FBQzs7UUFFRix1QkFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQzs7UUFHM0UsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDOztRQUVqRCxZQUFZLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsRUFBRTs7WUFFdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQzs7WUFFM0IsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNyQixDQUFDO1FBRUYsTUFBTSxDQUFDLFlBQVksQ0FBQzs7Ozs7SUFHZCxTQUFTO1FBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsNEJBQTRCLEVBQUUsQ0FBQzs7Ozs7SUFHeEMsWUFBWTtRQUNsQix1QkFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG1DQUFtQyxDQUFDO1FBRXpELEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLE9BQU8sQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQztZQUNuRCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDakI7UUFFRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQzFCOzs7OztJQUdLLDRCQUE0QjtRQUNsQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsbUNBQW1DLHFCQUFHLElBQUksQ0FBQyxRQUFRO2lCQUNyRCxhQUE0QixDQUFBLENBQUM7U0FDakM7Ozs7WUFsSEosVUFBVTs7OztZQVJULHdCQUF3QjtZQUtqQixnQkFBZ0I7NENBdUJwQixRQUFRLFlBQ1IsTUFBTSxTQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbiAgUmVmbGVjdGl2ZUluamVjdG9yLFxyXG4gIEluamVjdGFibGUsXHJcbiAgSW5qZWN0b3IsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBPcHRpb25hbCxcclxuICBJbmplY3RcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTW9kYWxCYWNrZHJvcENvbXBvbmVudCB9IGZyb20gJy4vbW9kYWwtYmFja2Ryb3AuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRm9jdXNUcmFwRmFjdG9yeSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTW9kYWxTZXJ2aWNlIHtcclxuICAvLyBoZXJlIHdlIGhvbGQgb3VyIHBsYWNlaG9sZGVyXHJcbiAgcHJpdmF0ZSB2Y1JlZjogVmlld0NvbnRhaW5lclJlZjtcclxuICAvLyBoZXJlIHdlIGhvbGQgb3VyIGluamVjdG9yXHJcbiAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3I7XHJcbiAgLy8gaGVyZSB3ZSBob2xkIHRoZSBiYWNrZHJvcCBjb21wb25lbnRcclxuICBwcml2YXRlIGJhY2tkcm9wUmVmOiBDb21wb25lbnRSZWY8TW9kYWxCYWNrZHJvcENvbXBvbmVudD47XHJcbiAgLy8gRWxlbWVudCB0aGF0IHdhcyBmb2N1c2VkIGJlZm9yZSB0aGUgZGlhbG9nIHdhcyBvcGVuZWQuIFNhdmUgdGhpcyB0byByZXN0b3JlIHVwb24gY2xvc2UuXHJcbiAgcHJpdmF0ZSBlbGVtZW50Rm9jdXNlZEJlZm9yZURpYWxvZ1dhc09wZW5lZDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBjb21wb25lbnRSZWY7XHJcblxyXG4gIHByaXZhdGUgY29tcG9uZW50TmF0aXZlRWxlbWVudDtcclxuXHJcbiAgcHJpdmF0ZSBmb2N1c1RyYXA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgIHByaXZhdGUgZm9jdXNUcmFwRmFjdG9yeTogRm9jdXNUcmFwRmFjdG9yeSxcclxuICAgIEBPcHRpb25hbCgpXHJcbiAgICBASW5qZWN0KERPQ1VNRU5UKVxyXG4gICAgcHJpdmF0ZSBkb2N1bWVudDogYW55XHJcbiAgKSB7fVxyXG5cclxuICByZWdpc3RlclZpZXdDb250YWluZXJSZWYodmNSZWY6IFZpZXdDb250YWluZXJSZWYpOiB2b2lkIHtcclxuICAgIHRoaXMudmNSZWYgPSB2Y1JlZjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVySW5qZWN0b3IoaW5qZWN0b3I6IEluamVjdG9yKTogdm9pZCB7XHJcbiAgICB0aGlzLmluamVjdG9yID0gaW5qZWN0b3I7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgY29tcG9uZW50IGR5bmFtaWNhbGx5XHJcbiAgICovXHJcbiAgY3JlYXRlPFQ+KGNvbXBvbmVudDogYW55LCBwYXJhbWV0ZXJzPzogT2JqZWN0KTogQ29tcG9uZW50UmVmPFQ+IHtcclxuICAgIC8vIGNyZWF0ZSBiYWNrZHJvcFxyXG4gICAgdGhpcy5iYWNrZHJvcFJlZiA9IHRoaXMuZHluYW1pY0NvbXBvbmVudExvYWRlcjxNb2RhbEJhY2tkcm9wQ29tcG9uZW50PihcclxuICAgICAgTW9kYWxCYWNrZHJvcENvbXBvbmVudFxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBjcmVhdGUgZHluYW1pYyBjb21wb25lbnRcclxuICAgIHRoaXMuY29tcG9uZW50UmVmID0gdGhpcy5keW5hbWljQ29tcG9uZW50TG9hZGVyPFQ+KGNvbXBvbmVudCwgcGFyYW1ldGVycyk7XHJcblxyXG4gICAgdGhpcy5jb21wb25lbnROYXRpdmVFbGVtZW50ID0gdGhpcy5jb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMudHJhcEZvY3VzKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50UmVmO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoKSB7XHJcbiAgICBpZiAoISF0aGlzLmNvbXBvbmVudFJlZikge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5kZXN0cm95KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkIGR5bmFtaWMgY29tcG9uZW50IGFuZCByZXR1cm4gY29tcG9uZW50UmVmXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50TG9hZGVyPFQ+KFxyXG4gICAgY29tcG9uZW50OiBhbnksXHJcbiAgICBwYXJhbWV0ZXJzPzogT2JqZWN0XHJcbiAgKTogQ29tcG9uZW50UmVmPGFueT4ge1xyXG4gICAgLy8gY29tcGlsZSB0aGUgY29tcG9uZW50IGJhc2VkIG9uIGl0cyB0eXBlIGFuZFxyXG4gICAgLy8gY3JlYXRlIGEgY29tcG9uZW50IGZhY3RvcnlcclxuICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShcclxuICAgICAgY29tcG9uZW50XHJcbiAgICApO1xyXG4gICAgLy8gdGhlIGluamVjdG9yIHdpbGwgYmUgbmVlZGVkIGZvciBESSBpblxyXG4gICAgLy8gdGhlIGN1c3RvbSBjb21wb25lbnRcclxuICAgIGNvbnN0IGNoaWxkSW5qZWN0b3IgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShcclxuICAgICAgW10sXHJcbiAgICAgIHRoaXMuaW5qZWN0b3JcclxuICAgICk7XHJcbiAgICAvLyBjcmVhdGUgdGhlIGFjdHVhbCBjb21wb25lbnRcclxuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMudmNSZWYuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnksIDAsIGNoaWxkSW5qZWN0b3IpO1xyXG5cclxuICAgIC8vIHBhc3MgdGhlIEBJbnB1dCBwYXJhbWV0ZXJzIHRvIHRoZSBpbnN0YW5jZVxyXG4gICAgT2JqZWN0LmFzc2lnbihjb21wb25lbnRSZWYuaW5zdGFuY2UsIHBhcmFtZXRlcnMpO1xyXG4gICAgLy8gYWRkIGEgZGVzdHJveSBtZXRob2QgdG8gdGhlIG1vZGFsIGluc3RhbmNlXHJcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2VbJ2Rlc3Ryb3knXSA9ICgpID0+IHtcclxuICAgICAgLy8gdGhpcyB3aWxsIGNsb3NlIHRoZSBiYWNrZHJvcFxyXG4gICAgICB0aGlzLmJhY2tkcm9wUmVmLmRlc3Ryb3koKTtcclxuICAgICAgLy8gdGhpcyB3aWxsIGRlc3Ryb3kgdGhlIGNvbXBvbmVudFxyXG4gICAgICBjb21wb25lbnRSZWYuZGVzdHJveSgpO1xyXG4gICAgICB0aGlzLnJlc3RvcmVGb2N1cygpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gY29tcG9uZW50UmVmO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmFwRm9jdXMoKSB7XHJcbiAgICB0aGlzLmZvY3VzVHJhcCA9IHRoaXMuZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUodGhpcy5jb21wb25lbnROYXRpdmVFbGVtZW50KTtcclxuICAgIHRoaXMuc2F2ZVByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpO1xyXG4gICAgdGhpcy5mb2N1c1RyYXAuZm9jdXNJbml0aWFsRWxlbWVudFdoZW5SZWFkeSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXN0b3JlRm9jdXMoKSB7XHJcbiAgICBjb25zdCB0b0ZvY3VzID0gdGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZURpYWxvZ1dhc09wZW5lZDtcclxuXHJcbiAgICBpZiAodG9Gb2N1cyAmJiB0eXBlb2YgdG9Gb2N1cy5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICB0b0ZvY3VzLmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZm9jdXNUcmFwKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNUcmFwLmRlc3Ryb3koKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2F2ZVByZXZpb3VzbHlGb2N1c2VkRWxlbWVudCgpIHtcclxuICAgIGlmICh0aGlzLmRvY3VtZW50KSB7XHJcbiAgICAgIHRoaXMuZWxlbWVudEZvY3VzZWRCZWZvcmVEaWFsb2dXYXNPcGVuZWQgPSB0aGlzLmRvY3VtZW50XHJcbiAgICAgICAgLmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==