UNPKG

carbon-components-angular

Version:
80 lines 10.7 kB
import { Injector, Injectable } from "@angular/core"; import { tap, delay } from "rxjs/operators"; import * as i0 from "@angular/core"; import * as i1 from "carbon-components-angular/placeholder"; /** * Modal service handles instantiating and destroying modal instances. * Uses PlaceholderService to track open instances, and for it's placeholder view reference. */ export class BaseModalService { /** * Creates an instance of `ModalService`. */ constructor(placeholderService) { this.placeholderService = placeholderService; } /** * Creates and renders the modal component that is passed in. * `inputs` is an optional parameter of `data` that can be passed to the `Modal` component. */ create(data) { let defaults = { inputs: {} }; data = Object.assign({}, defaults, data); const inputProviders = Object.keys(data.inputs).map(inputName => ({ provide: inputName, useValue: data.inputs[inputName] })); const injector = Injector.create({ providers: inputProviders }); const component = this.placeholderService.createComponent(data.component, injector); let focusedElement = document.activeElement; setTimeout(() => { component.instance.open = true; }); component["previouslyFocusedElement"] = focusedElement; // used to return focus to previously focused element component.instance.close.pipe( // trigger the close animation tap(() => { component.instance.open = false; }), // delay closing by an arbitrary amount to allow the animation to finish delay(240)).subscribe(() => { this.placeholderService.destroyComponent(component); // filter out our component BaseModalService.modalList = BaseModalService.modalList.filter(c => c !== component); }); component.onDestroy(() => { focusedElement.focus(); }); BaseModalService.modalList.push(component); return component; } /** * Destroys the modal on the supplied index. * When called without parameters it destroys the most recently created/top most modal. */ destroy(index = -1) { // return if nothing to destroy because it's already destroyed if (index >= BaseModalService.modalList.length || BaseModalService.modalList.length === 0) { return; } // on negative index destroy the last on the list (top modal) if (index < 0) { index = BaseModalService.modalList.length - 1; } // Let animation finish before component is removed setTimeout(() => { if (BaseModalService.modalList[index]) { this.placeholderService.destroyComponent(BaseModalService.modalList[index]); BaseModalService.modalList.splice(index, 1); } }, 240); } } // track all our open modals BaseModalService.modalList = []; BaseModalService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseModalService, deps: [{ token: i1.PlaceholderService }], target: i0.ɵɵFactoryTarget.Injectable }); BaseModalService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseModalService }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseModalService, decorators: [{ type: Injectable }], ctorParameters: function () { return [{ type: i1.PlaceholderService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RhbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGFsL2Jhc2UtbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFHNUM7OztHQUdHO0FBRUgsTUFBTSxPQUFPLGdCQUFnQjtJQUk1Qjs7T0FFRztJQUNILFlBQW1CLGtCQUFzQztRQUF0Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO0lBQUcsQ0FBQztJQUU3RDs7O09BR0c7SUFDSCxNQUFNLENBQUksSUFBc0M7UUFDL0MsSUFBSSxRQUFRLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDOUIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV6QyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztTQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNKLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNoRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDcEYsSUFBSSxjQUFjLEdBQUcsUUFBUSxDQUFDLGFBQTRCLENBQUM7UUFDM0QsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNmLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVILFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFFLHFEQUFxRDtRQUU5RyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJO1FBQzVCLDhCQUE4QjtRQUM5QixHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1IsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLENBQUMsQ0FBQztRQUNGLHdFQUF3RTtRQUN4RSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQ1YsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRCwyQkFBMkI7WUFDM0IsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7UUFDdEYsQ0FBQyxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUN4QixjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRTNDLE9BQU8sU0FBUyxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNqQiw4REFBOEQ7UUFDOUQsSUFBSSxLQUFLLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxRixPQUFPO1NBQ1A7UUFDRCw2REFBNkQ7UUFDN0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2QsS0FBSyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsbURBQW1EO1FBQ25ELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDdEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUM1RSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzthQUM1QztRQUNGLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNULENBQUM7O0FBeEVELDRCQUE0QjtBQUNYLDBCQUFTLEdBQTZCLEVBQUcsQ0FBQTs2R0FGOUMsZ0JBQWdCO2lIQUFoQixnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENvbXBvbmVudFJlZixcblx0SW5qZWN0b3IsXG5cdEluamVjdGFibGVcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFBsYWNlaG9sZGVyU2VydmljZSB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL3BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgeyB0YXAsIGRlbGF5IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cblxuLyoqXG4gKiBNb2RhbCBzZXJ2aWNlIGhhbmRsZXMgaW5zdGFudGlhdGluZyBhbmQgZGVzdHJveWluZyBtb2RhbCBpbnN0YW5jZXMuXG4gKiBVc2VzIFBsYWNlaG9sZGVyU2VydmljZSB0byB0cmFjayBvcGVuIGluc3RhbmNlcywgYW5kIGZvciBpdCdzIHBsYWNlaG9sZGVyIHZpZXcgcmVmZXJlbmNlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQmFzZU1vZGFsU2VydmljZSB7XG5cdC8vIHRyYWNrIGFsbCBvdXIgb3BlbiBtb2RhbHNcblx0cHJvdGVjdGVkIHN0YXRpYyBtb2RhbExpc3Q6IEFycmF5PENvbXBvbmVudFJlZjxhbnk+PiA9IFtdO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGBNb2RhbFNlcnZpY2VgLlxuXHQgKi9cblx0Y29uc3RydWN0b3IocHVibGljIHBsYWNlaG9sZGVyU2VydmljZTogUGxhY2Vob2xkZXJTZXJ2aWNlKSB7fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuZCByZW5kZXJzIHRoZSBtb2RhbCBjb21wb25lbnQgdGhhdCBpcyBwYXNzZWQgaW4uXG5cdCAqIGBpbnB1dHNgIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBvZiBgZGF0YWAgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBgTW9kYWxgIGNvbXBvbmVudC5cblx0ICovXG5cdGNyZWF0ZTxUPihkYXRhOiB7IGNvbXBvbmVudDogYW55LCBpbnB1dHM/OiBhbnkgfSk6IENvbXBvbmVudFJlZjxhbnk+IHtcblx0XHRsZXQgZGVmYXVsdHMgPSB7IGlucHV0czoge30gfTtcblx0XHRkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIGRhdGEpO1xuXG5cdFx0Y29uc3QgaW5wdXRQcm92aWRlcnMgPSBPYmplY3Qua2V5cyhkYXRhLmlucHV0cykubWFwKGlucHV0TmFtZSA9PiAoe1xuXHRcdFx0cHJvdmlkZTogaW5wdXROYW1lLFxuXHRcdFx0dXNlVmFsdWU6IGRhdGEuaW5wdXRzW2lucHV0TmFtZV1cblx0XHR9KSk7XG5cdFx0Y29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoeyBwcm92aWRlcnM6IGlucHV0UHJvdmlkZXJzIH0pO1xuXHRcdGNvbnN0IGNvbXBvbmVudCA9IHRoaXMucGxhY2Vob2xkZXJTZXJ2aWNlLmNyZWF0ZUNvbXBvbmVudChkYXRhLmNvbXBvbmVudCwgaW5qZWN0b3IpO1xuXHRcdGxldCBmb2N1c2VkRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRjb21wb25lbnQuaW5zdGFuY2Uub3BlbiA9IHRydWU7XG5cdFx0fSk7XG5cblx0XHRjb21wb25lbnRbXCJwcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnRcIl0gPSBmb2N1c2VkRWxlbWVudDsgIC8vIHVzZWQgdG8gcmV0dXJuIGZvY3VzIHRvIHByZXZpb3VzbHkgZm9jdXNlZCBlbGVtZW50XG5cblx0XHRjb21wb25lbnQuaW5zdGFuY2UuY2xvc2UucGlwZShcblx0XHRcdC8vIHRyaWdnZXIgdGhlIGNsb3NlIGFuaW1hdGlvblxuXHRcdFx0dGFwKCgpID0+IHtcblx0XHRcdFx0Y29tcG9uZW50Lmluc3RhbmNlLm9wZW4gPSBmYWxzZTtcblx0XHRcdH0pLFxuXHRcdFx0Ly8gZGVsYXkgY2xvc2luZyBieSBhbiBhcmJpdHJhcnkgYW1vdW50IHRvIGFsbG93IHRoZSBhbmltYXRpb24gdG8gZmluaXNoXG5cdFx0XHRkZWxheSgyNDApXG5cdFx0KS5zdWJzY3JpYmUoKCkgPT4ge1xuXHRcdFx0dGhpcy5wbGFjZWhvbGRlclNlcnZpY2UuZGVzdHJveUNvbXBvbmVudChjb21wb25lbnQpO1xuXHRcdFx0Ly8gZmlsdGVyIG91dCBvdXIgY29tcG9uZW50XG5cdFx0XHRCYXNlTW9kYWxTZXJ2aWNlLm1vZGFsTGlzdCA9IEJhc2VNb2RhbFNlcnZpY2UubW9kYWxMaXN0LmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudCk7XG5cdFx0fSk7XG5cblx0XHRjb21wb25lbnQub25EZXN0cm95KCgpID0+IHtcblx0XHRcdGZvY3VzZWRFbGVtZW50LmZvY3VzKCk7XG5cdFx0fSk7XG5cblx0XHRCYXNlTW9kYWxTZXJ2aWNlLm1vZGFsTGlzdC5wdXNoKGNvbXBvbmVudCk7XG5cblx0XHRyZXR1cm4gY29tcG9uZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIERlc3Ryb3lzIHRoZSBtb2RhbCBvbiB0aGUgc3VwcGxpZWQgaW5kZXguXG5cdCAqIFdoZW4gY2FsbGVkIHdpdGhvdXQgcGFyYW1ldGVycyBpdCBkZXN0cm95cyB0aGUgbW9zdCByZWNlbnRseSBjcmVhdGVkL3RvcCBtb3N0IG1vZGFsLlxuXHQgKi9cblx0ZGVzdHJveShpbmRleCA9IC0xKSB7XG5cdFx0Ly8gcmV0dXJuIGlmIG5vdGhpbmcgdG8gZGVzdHJveSBiZWNhdXNlIGl0J3MgYWxyZWFkeSBkZXN0cm95ZWRcblx0XHRpZiAoaW5kZXggPj0gQmFzZU1vZGFsU2VydmljZS5tb2RhbExpc3QubGVuZ3RoIHx8IEJhc2VNb2RhbFNlcnZpY2UubW9kYWxMaXN0Lmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBvbiBuZWdhdGl2ZSBpbmRleCBkZXN0cm95IHRoZSBsYXN0IG9uIHRoZSBsaXN0ICh0b3AgbW9kYWwpXG5cdFx0aWYgKGluZGV4IDwgMCkge1xuXHRcdFx0aW5kZXggPSBCYXNlTW9kYWxTZXJ2aWNlLm1vZGFsTGlzdC5sZW5ndGggLSAxO1xuXHRcdH1cblxuXHRcdC8vIExldCBhbmltYXRpb24gZmluaXNoIGJlZm9yZSBjb21wb25lbnQgaXMgcmVtb3ZlZFxuXHRcdHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0aWYgKEJhc2VNb2RhbFNlcnZpY2UubW9kYWxMaXN0W2luZGV4XSkge1xuXHRcdFx0XHR0aGlzLnBsYWNlaG9sZGVyU2VydmljZS5kZXN0cm95Q29tcG9uZW50KEJhc2VNb2RhbFNlcnZpY2UubW9kYWxMaXN0W2luZGV4XSk7XG5cdFx0XHRcdEJhc2VNb2RhbFNlcnZpY2UubW9kYWxMaXN0LnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHR9XG5cdFx0fSwgMjQwKTtcblx0fVxufVxuIl19