@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
63 lines • 8.88 kB
JavaScript
import { Directive, EnvironmentInjector, Injector, Input, Type, ViewContainerRef, inject } from '@angular/core';
import * as i0 from "@angular/core";
/**
* Simplified version of [NgComponentOutlet](https://github.com/angular/angular/blob/main/packages/common/src/directives/ng_component_outlet.ts)
*
* In contrast to NgComponentOutlet it allows to set the environment injector.
*
* A [PR](https://github.com/angular/angular/pull/54764) has been raised to add that functionality in Angular.
*
* TODO: Remove this directive once the PR is merged.
*/
export class C8yComponentOutlet {
constructor(__viewContainerRef) {
this.__viewContainerRef = __viewContainerRef;
this.c8yComponentOutlet = null;
this.environment = inject(EnvironmentInjector);
}
ngOnChanges(changes) {
if (this._needToReCreateComponentInstance(changes)) {
this.__viewContainerRef.clear();
this._componentRef = undefined;
if (this.c8yComponentOutlet) {
// creating a new injector ensures that the Angular Chrome extension properly shows the element hierarchy
const injector = Injector.create({
providers: [],
parent: this.c8yComponentOutletInjector || this.__viewContainerRef.injector,
name: 'c8yComponentOutletInjector'
});
this._componentRef = this.__viewContainerRef.createComponent(this.c8yComponentOutlet, {
injector: injector,
environmentInjector: this.c8yComponentOutletEnvironmentInjector || this.environment
});
}
}
}
ngOnDestroy() {
this._componentRef?.destroy();
}
_needToReCreateComponentInstance(changes) {
// Note: square brackets property accessor is safe for Closure compiler optimizations (the
// `changes` argument of the `ngOnChanges` lifecycle hook retains the names of the fields that
// were changed).
return (changes['c8yComponentOutlet'] !== undefined ||
changes['c8yComponentOutletInjector'] !== undefined ||
changes['c8yComponentOutletEnvironmentInjector'] !== undefined);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C8yComponentOutlet, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: C8yComponentOutlet, isStandalone: true, selector: "[c8yComponentOutlet]", inputs: { c8yComponentOutlet: "c8yComponentOutlet", c8yComponentOutletInjector: "c8yComponentOutletInjector", c8yComponentOutletEnvironmentInjector: "c8yComponentOutletEnvironmentInjector" }, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: C8yComponentOutlet, decorators: [{
type: Directive,
args: [{
selector: '[c8yComponentOutlet]',
standalone: true
}]
}], ctorParameters: () => [{ type: i0.ViewContainerRef }], propDecorators: { c8yComponentOutlet: [{
type: Input
}], c8yComponentOutletInjector: [{
type: Input
}], c8yComponentOutletEnvironmentInjector: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LW91dGxldC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2NvbW1vbi9jb21wb25lbnQtb3V0bGV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULG1CQUFtQixFQUNuQixRQUFRLEVBQ1IsS0FBSyxFQUlMLElBQUksRUFDSixnQkFBZ0IsRUFDaEIsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDOztBQUV2Qjs7Ozs7Ozs7R0FRRztBQUtILE1BQU0sT0FBTyxrQkFBa0I7SUFXN0IsWUFBb0Isa0JBQW9DO1FBQXBDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBa0I7UUFWL0MsdUJBQWtCLEdBQXFCLElBQUksQ0FBQztRQVE3QyxnQkFBVyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRVMsQ0FBQztJQUU1RCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJLENBQUMsZ0NBQWdDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7WUFFL0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDNUIseUdBQXlHO2dCQUN6RyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO29CQUMvQixTQUFTLEVBQUUsRUFBRTtvQkFDYixNQUFNLEVBQUUsSUFBSSxDQUFDLDBCQUEwQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRO29CQUMzRSxJQUFJLEVBQUUsNEJBQTRCO2lCQUNuQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtvQkFDcEYsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLG1CQUFtQixFQUFFLElBQUksQ0FBQyxxQ0FBcUMsSUFBSSxJQUFJLENBQUMsV0FBVztpQkFDcEYsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVPLGdDQUFnQyxDQUFDLE9BQXNCO1FBQzdELDBGQUEwRjtRQUMxRiw4RkFBOEY7UUFDOUYsaUJBQWlCO1FBQ2pCLE9BQU8sQ0FDTCxPQUFPLENBQUMsb0JBQW9CLENBQUMsS0FBSyxTQUFTO1lBQzNDLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLFNBQVM7WUFDbkQsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLEtBQUssU0FBUyxDQUMvRCxDQUFDO0lBQ0osQ0FBQzsrR0E5Q1Usa0JBQWtCO21HQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBSjlCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsVUFBVSxFQUFFLElBQUk7aUJBQ2pCO3FGQUVVLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBRUcscUNBQXFDO3NCQUE3QyxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50UmVmLFxuICBEaXJlY3RpdmUsXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFR5cGUsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIGluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBTaW1wbGlmaWVkIHZlcnNpb24gb2YgW05nQ29tcG9uZW50T3V0bGV0XShodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFpbi9wYWNrYWdlcy9jb21tb24vc3JjL2RpcmVjdGl2ZXMvbmdfY29tcG9uZW50X291dGxldC50cylcbiAqXG4gKiBJbiBjb250cmFzdCB0byBOZ0NvbXBvbmVudE91dGxldCBpdCBhbGxvd3MgdG8gc2V0IHRoZSBlbnZpcm9ubWVudCBpbmplY3Rvci5cbiAqXG4gKiBBIFtQUl0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9wdWxsLzU0NzY0KSBoYXMgYmVlbiByYWlzZWQgdG8gYWRkIHRoYXQgZnVuY3Rpb25hbGl0eSBpbiBBbmd1bGFyLlxuICpcbiAqIFRPRE86IFJlbW92ZSB0aGlzIGRpcmVjdGl2ZSBvbmNlIHRoZSBQUiBpcyBtZXJnZWQuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tjOHlDb21wb25lbnRPdXRsZXRdJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBDOHlDb21wb25lbnRPdXRsZXQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGM4eUNvbXBvbmVudE91dGxldDogVHlwZTxhbnk+IHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgYzh5Q29tcG9uZW50T3V0bGV0SW5qZWN0b3I/OiBJbmplY3RvcjtcblxuICBASW5wdXQoKSBjOHlDb21wb25lbnRPdXRsZXRFbnZpcm9ubWVudEluamVjdG9yPzogRW52aXJvbm1lbnRJbmplY3RvcjtcblxuICBwcml2YXRlIF9jb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxhbnk+IHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgZW52aXJvbm1lbnQgPSBpbmplY3QoRW52aXJvbm1lbnRJbmplY3Rvcik7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmICh0aGlzLl9uZWVkVG9SZUNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLl9fdmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodGhpcy5jOHlDb21wb25lbnRPdXRsZXQpIHtcbiAgICAgICAgLy8gY3JlYXRpbmcgYSBuZXcgaW5qZWN0b3IgZW5zdXJlcyB0aGF0IHRoZSBBbmd1bGFyIENocm9tZSBleHRlbnNpb24gcHJvcGVybHkgc2hvd3MgdGhlIGVsZW1lbnQgaGllcmFyY2h5XG4gICAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgICBwcm92aWRlcnM6IFtdLFxuICAgICAgICAgIHBhcmVudDogdGhpcy5jOHlDb21wb25lbnRPdXRsZXRJbmplY3RvciB8fCB0aGlzLl9fdmlld0NvbnRhaW5lclJlZi5pbmplY3RvcixcbiAgICAgICAgICBuYW1lOiAnYzh5Q29tcG9uZW50T3V0bGV0SW5qZWN0b3InXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9jb21wb25lbnRSZWYgPSB0aGlzLl9fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQodGhpcy5jOHlDb21wb25lbnRPdXRsZXQsIHtcbiAgICAgICAgICBpbmplY3RvcjogaW5qZWN0b3IsXG4gICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogdGhpcy5jOHlDb21wb25lbnRPdXRsZXRFbnZpcm9ubWVudEluamVjdG9yIHx8IHRoaXMuZW52aXJvbm1lbnRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gIH1cblxuICBwcml2YXRlIF9uZWVkVG9SZUNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICAvLyBOb3RlOiBzcXVhcmUgYnJhY2tldHMgcHJvcGVydHkgYWNjZXNzb3IgaXMgc2FmZSBmb3IgQ2xvc3VyZSBjb21waWxlciBvcHRpbWl6YXRpb25zICh0aGVcbiAgICAvLyBgY2hhbmdlc2AgYXJndW1lbnQgb2YgdGhlIGBuZ09uQ2hhbmdlc2AgbGlmZWN5Y2xlIGhvb2sgcmV0YWlucyB0aGUgbmFtZXMgb2YgdGhlIGZpZWxkcyB0aGF0XG4gICAgLy8gd2VyZSBjaGFuZ2VkKS5cbiAgICByZXR1cm4gKFxuICAgICAgY2hhbmdlc1snYzh5Q29tcG9uZW50T3V0bGV0J10gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgY2hhbmdlc1snYzh5Q29tcG9uZW50T3V0bGV0SW5qZWN0b3InXSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBjaGFuZ2VzWydjOHlDb21wb25lbnRPdXRsZXRFbnZpcm9ubWVudEluamVjdG9yJ10gIT09IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cbn1cbiJdfQ==