carbon-components-angular
Version:
Next generation components
80 lines • 10.7 kB
JavaScript
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