carbon-components-angular
Version:
Next generation components
96 lines • 13.1 kB
JavaScript
import { Injector, Injectable, inject, EnvironmentInjector } 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;
/**
* Current module/component injection enviornment
* Allows modules to use providers from calling component
*
* Root Module/
* └── Lazy loaded Feature Module/
* ├── Provides Service & imports modules
* ├── Modal component (component that extends base component)
* └── Modal component launcher (dynamically creates modal component)
*
* Passing EnvironmentInjector in `createComponent` will look for provider declaration in feature
* module instead of root module. This is required to pass correct context in a lazy-loaded applications.
* Services injected in root, will also be available as feature module enviornment will also hierarchically inherit
* the root services.
*/
this.environment = inject(EnvironmentInjector);
}
/**
* 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, undefined, this.environment);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1tb2RhbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGFsL2Jhc2UtbW9kYWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sUUFBUSxFQUNSLFVBQVUsRUFDVixNQUFNLEVBQ04sbUJBQW1CLEVBQ25CLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7OztBQUc1Qzs7O0dBR0c7QUFFSCxNQUFNLE9BQU8sZ0JBQWdCO0lBcUI1Qjs7T0FFRztJQUNILFlBQW1CLGtCQUFzQztRQUF0Qyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBcEJ6RDs7Ozs7Ozs7Ozs7Ozs7V0FjRztRQUNPLGdCQUFXLEdBQXdCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBS2IsQ0FBQztJQUU3RDs7O09BR0c7SUFDSCxNQUFNLENBQUksSUFBc0M7UUFDL0MsSUFBSSxRQUFRLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDOUIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV6QyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE9BQU8sRUFBRSxTQUFTO1lBQ2xCLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztTQUNoQyxDQUFDLENBQUMsQ0FBQztRQUNKLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNoRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUN4RCxJQUFJLENBQUMsU0FBUyxFQUNkLFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FDaEIsQ0FBQztRQUNGLElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxhQUE0QixDQUFDO1FBQzNELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZixTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsMEJBQTBCLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBRSxxREFBcUQ7UUFFOUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSTtRQUM1Qiw4QkFBOEI7UUFDOUIsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNSLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztRQUNqQyxDQUFDLENBQUM7UUFDRix3RUFBd0U7UUFDeEUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUNWLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNoQixJQUFJLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDcEQsMkJBQTJCO1lBQzNCLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ3RGLENBQUMsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDeEIsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBRUgsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUzQyxPQUFPLFNBQVMsQ0FBQztJQUNsQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDakIsOERBQThEO1FBQzlELElBQUksS0FBSyxJQUFJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUYsT0FBTztTQUNQO1FBQ0QsNkRBQTZEO1FBQzdELElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNkLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUM5QztRQUVELG1EQUFtRDtRQUNuRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2YsSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDNUUsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDNUM7UUFDRixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVCxDQUFDOztBQTlGRCw0QkFBNEI7QUFDWCwwQkFBUyxHQUE2QixFQUFHLENBQUE7NkdBRjlDLGdCQUFnQjtpSEFBaEIsZ0JBQWdCOzJGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnRSZWYsXG5cdEluamVjdG9yLFxuXHRJbmplY3RhYmxlLFxuXHRpbmplY3QsXG5cdEVudmlyb25tZW50SW5qZWN0b3Jcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFBsYWNlaG9sZGVyU2VydmljZSB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL3BsYWNlaG9sZGVyXCI7XG5pbXBvcnQgeyB0YXAsIGRlbGF5IH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5cblxuLyoqXG4gKiBNb2RhbCBzZXJ2aWNlIGhhbmRsZXMgaW5zdGFudGlhdGluZyBhbmQgZGVzdHJveWluZyBtb2RhbCBpbnN0YW5jZXMuXG4gKiBVc2VzIFBsYWNlaG9sZGVyU2VydmljZSB0byB0cmFjayBvcGVuIGluc3RhbmNlcywgYW5kIGZvciBpdCdzIHBsYWNlaG9sZGVyIHZpZXcgcmVmZXJlbmNlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQmFzZU1vZGFsU2VydmljZSB7XG5cdC8vIHRyYWNrIGFsbCBvdXIgb3BlbiBtb2RhbHNcblx0cHJvdGVjdGVkIHN0YXRpYyBtb2RhbExpc3Q6IEFycmF5PENvbXBvbmVudFJlZjxhbnk+PiA9IFtdO1xuXG5cdC8qKlxuXHQgKiBDdXJyZW50IG1vZHVsZS9jb21wb25lbnQgaW5qZWN0aW9uIGVudmlvcm5tZW50XG5cdCAqIEFsbG93cyBtb2R1bGVzIHRvIHVzZSBwcm92aWRlcnMgZnJvbSBjYWxsaW5nIGNvbXBvbmVudFxuXHQgKlxuXHQgKiBSb290IE1vZHVsZS9cblx0ICog4pSU4pSA4pSAIExhenkgbG9hZGVkIEZlYXR1cmUgTW9kdWxlL1xuXHQgKiBcdCDilJzilIDilIAgUHJvdmlkZXMgU2VydmljZSAmIGltcG9ydHMgbW9kdWxlc1xuXHQgKiBcdCDilJzilIDilIAgTW9kYWwgY29tcG9uZW50IChjb21wb25lbnQgdGhhdCBleHRlbmRzIGJhc2UgY29tcG9uZW50KVxuXHQgKiBcdCDilJTilIDilIAgTW9kYWwgY29tcG9uZW50IGxhdW5jaGVyIChkeW5hbWljYWxseSBjcmVhdGVzIG1vZGFsIGNvbXBvbmVudClcblx0ICpcblx0ICogUGFzc2luZyBFbnZpcm9ubWVudEluamVjdG9yIGluIGBjcmVhdGVDb21wb25lbnRgIHdpbGwgbG9vayBmb3IgcHJvdmlkZXIgZGVjbGFyYXRpb24gaW4gZmVhdHVyZVxuXHQgKiBtb2R1bGUgaW5zdGVhZCBvZiByb290IG1vZHVsZS4gVGhpcyBpcyByZXF1aXJlZCB0byBwYXNzIGNvcnJlY3QgY29udGV4dCBpbiBhIGxhenktbG9hZGVkIGFwcGxpY2F0aW9ucy5cblx0ICogU2VydmljZXMgaW5qZWN0ZWQgaW4gcm9vdCwgd2lsbCBhbHNvIGJlIGF2YWlsYWJsZSBhcyBmZWF0dXJlIG1vZHVsZSBlbnZpb3JubWVudCB3aWxsIGFsc28gaGllcmFyY2hpY2FsbHkgaW5oZXJpdFxuXHQgKiB0aGUgcm9vdCBzZXJ2aWNlcy5cblx0ICovXG5cdHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnRJbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBgTW9kYWxTZXJ2aWNlYC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyBwbGFjZWhvbGRlclNlcnZpY2U6IFBsYWNlaG9sZGVyU2VydmljZSkge31cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbmQgcmVuZGVycyB0aGUgbW9kYWwgY29tcG9uZW50IHRoYXQgaXMgcGFzc2VkIGluLlxuXHQgKiBgaW5wdXRzYCBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgb2YgYGRhdGFgIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUgYE1vZGFsYCBjb21wb25lbnQuXG5cdCAqL1xuXHRjcmVhdGU8VD4oZGF0YTogeyBjb21wb25lbnQ6IGFueSwgaW5wdXRzPzogYW55IH0pOiBDb21wb25lbnRSZWY8YW55PiB7XG5cdFx0bGV0IGRlZmF1bHRzID0geyBpbnB1dHM6IHt9IH07XG5cdFx0ZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzLCBkYXRhKTtcblxuXHRcdGNvbnN0IGlucHV0UHJvdmlkZXJzID0gT2JqZWN0LmtleXMoZGF0YS5pbnB1dHMpLm1hcChpbnB1dE5hbWUgPT4gKHtcblx0XHRcdHByb3ZpZGU6IGlucHV0TmFtZSxcblx0XHRcdHVzZVZhbHVlOiBkYXRhLmlucHV0c1tpbnB1dE5hbWVdXG5cdFx0fSkpO1xuXHRcdGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHsgcHJvdmlkZXJzOiBpbnB1dFByb3ZpZGVycyB9KTtcblx0XHRjb25zdCBjb21wb25lbnQgPSB0aGlzLnBsYWNlaG9sZGVyU2VydmljZS5jcmVhdGVDb21wb25lbnQoXG5cdFx0XHRkYXRhLmNvbXBvbmVudCxcblx0XHRcdGluamVjdG9yLFxuXHRcdFx0dW5kZWZpbmVkLFxuXHRcdFx0dGhpcy5lbnZpcm9ubWVudFxuXHRcdCk7XG5cdFx0bGV0IGZvY3VzZWRFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblx0XHRzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdGNvbXBvbmVudC5pbnN0YW5jZS5vcGVuID0gdHJ1ZTtcblx0XHR9KTtcblxuXHRcdGNvbXBvbmVudFtcInByZXZpb3VzbHlGb2N1c2VkRWxlbWVudFwiXSA9IGZvY3VzZWRFbGVtZW50OyAgLy8gdXNlZCB0byByZXR1cm4gZm9jdXMgdG8gcHJldmlvdXNseSBmb2N1c2VkIGVsZW1lbnRcblxuXHRcdGNvbXBvbmVudC5pbnN0YW5jZS5jbG9zZS5waXBlKFxuXHRcdFx0Ly8gdHJpZ2dlciB0aGUgY2xvc2UgYW5pbWF0aW9uXG5cdFx0XHR0YXAoKCkgPT4ge1xuXHRcdFx0XHRjb21wb25lbnQuaW5zdGFuY2Uub3BlbiA9IGZhbHNlO1xuXHRcdFx0fSksXG5cdFx0XHQvLyBkZWxheSBjbG9zaW5nIGJ5IGFuIGFyYml0cmFyeSBhbW91bnQgdG8gYWxsb3cgdGhlIGFuaW1hdGlvbiB0byBmaW5pc2hcblx0XHRcdGRlbGF5KDI0MClcblx0XHQpLnN1YnNjcmliZSgoKSA9PiB7XG5cdFx0XHR0aGlzLnBsYWNlaG9sZGVyU2VydmljZS5kZXN0cm95Q29tcG9uZW50KGNvbXBvbmVudCk7XG5cdFx0XHQvLyBmaWx0ZXIgb3V0IG91ciBjb21wb25lbnRcblx0XHRcdEJhc2VNb2RhbFNlcnZpY2UubW9kYWxMaXN0ID0gQmFzZU1vZGFsU2VydmljZS5tb2RhbExpc3QuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KTtcblx0XHR9KTtcblxuXHRcdGNvbXBvbmVudC5vbkRlc3Ryb3koKCkgPT4ge1xuXHRcdFx0Zm9jdXNlZEVsZW1lbnQuZm9jdXMoKTtcblx0XHR9KTtcblxuXHRcdEJhc2VNb2RhbFNlcnZpY2UubW9kYWxMaXN0LnB1c2goY29tcG9uZW50KTtcblxuXHRcdHJldHVybiBjb21wb25lbnQ7XG5cdH1cblxuXHQvKipcblx0ICogRGVzdHJveXMgdGhlIG1vZGFsIG9uIHRoZSBzdXBwbGllZCBpbmRleC5cblx0ICogV2hlbiBjYWxsZWQgd2l0aG91dCBwYXJhbWV0ZXJzIGl0IGRlc3Ryb3lzIHRoZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQvdG9wIG1vc3QgbW9kYWwuXG5cdCAqL1xuXHRkZXN0cm95KGluZGV4ID0gLTEpIHtcblx0XHQvLyByZXR1cm4gaWYgbm90aGluZyB0byBkZXN0cm95IGJlY2F1c2UgaXQncyBhbHJlYWR5IGRlc3Ryb3llZFxuXHRcdGlmIChpbmRleCA+PSBCYXNlTW9kYWxTZXJ2aWNlLm1vZGFsTGlzdC5sZW5ndGggfHwgQmFzZU1vZGFsU2VydmljZS5tb2RhbExpc3QubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vIG9uIG5lZ2F0aXZlIGluZGV4IGRlc3Ryb3kgdGhlIGxhc3Qgb24gdGhlIGxpc3QgKHRvcCBtb2RhbClcblx0XHRpZiAoaW5kZXggPCAwKSB7XG5cdFx0XHRpbmRleCA9IEJhc2VNb2RhbFNlcnZpY2UubW9kYWxMaXN0Lmxlbmd0aCAtIDE7XG5cdFx0fVxuXG5cdFx0Ly8gTGV0IGFuaW1hdGlvbiBmaW5pc2ggYmVmb3JlIGNvbXBvbmVudCBpcyByZW1vdmVkXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XG5cdFx0XHRpZiAoQmFzZU1vZGFsU2VydmljZS5tb2RhbExpc3RbaW5kZXhdKSB7XG5cdFx0XHRcdHRoaXMucGxhY2Vob2xkZXJTZXJ2aWNlLmRlc3Ryb3lDb21wb25lbnQoQmFzZU1vZGFsU2VydmljZS5tb2RhbExpc3RbaW5kZXhdKTtcblx0XHRcdFx0QmFzZU1vZGFsU2VydmljZS5tb2RhbExpc3Quc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdH1cblx0XHR9LCAyNDApO1xuXHR9XG59XG4iXX0=