UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

108 lines 15.3 kB
import { Injectable, Injector } from '@angular/core'; import { set } from 'lodash'; import { Observable, Subject } from 'rxjs'; import * as i0 from "@angular/core"; export class DynamicResolverService { constructor(injector) { this.injector = injector; this._triggerBulkResolving = new Subject(); this.requestId = 0; this.bulkResolvingTrigger$ = this._triggerBulkResolving.asObservable(); } async executeResolvers(details, dynamicDef) { const requestId = this.getRequestId(); const res = dynamicDef.map((def, index) => this.executeResolversForSingleComponent(def, details[index].config, requestId)); const promise = this.waitForResults(res); this.triggerResolving(requestId); return await promise; } serialize(details, dynamicDef) { return dynamicDef.map((def, index) => { return this.serializeSingleComponent(def, details[index].config); }); } serializeSingleComponent(dynamicDef, config) { const res = {}; if (!dynamicDef?.resolve) { return res; } Object.entries(dynamicDef.resolve).forEach(([key, value]) => { try { const resolver = this.injector.get(value, null); if (resolver && resolver.serialize) { res[key] = resolver.serialize(config, key); } else { console.warn(`DynamicDetailsResolver: "${value}" not found or does not implement serialize method.`); } } catch { console.warn(`Failed to serialize key: "${key}" for dynamic component: "${dynamicDef.id}"`); } }); return res; } triggerResolving(requestId) { this._triggerBulkResolving.next(requestId); } executeResolversForSingleComponent(dynamicDef, config, requestId) { const res = {}; if (!dynamicDef?.resolve) { return res; } Object.entries(dynamicDef.resolve).forEach(([key, value]) => { try { const resolver = this.injector.get(value, null); if (resolver && resolver.resolve) { res[key] = resolver.resolve(config, key, requestId); } else { console.warn(`DynamicDetailsResolver: "${value}" not found or does not implement resolve method.`); } } catch { console.warn(`Failed to resolve key: "${key}" for dynamic component: "${dynamicDef.id}"`); } }); return res; } async waitForResults(data) { return Promise.all(data.map(tmp => this.waitForResultsOfSingleEntry(tmp))); } async waitForResultsOfSingleEntry(data) { const res = {}; try { const arr = await Promise.all(Object.values(data).map(tmp => this.awaitResult(tmp))); Object.keys(data).forEach((key, index) => set(res, key, arr[index])); } catch { console.warn(`Failed to to resolve data using dynamic component resolver.`); } return res; } async awaitResult(data) { try { if (data instanceof Promise) { return await data; } if (data instanceof Observable) { return await data.toPromise(); } return data; } catch { console.warn(`Failed to to resolve data using dynamic component resolver.`); return; } } getRequestId() { return this.requestId++; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicResolverService, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicResolverService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DynamicResolverService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i0.Injector }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy1yZXNvbHZlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9keW5hbWljLWNvbXBvbmVudC9keW5hbWljLXJlc29sdmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFLM0MsTUFBTSxPQUFPLHNCQUFzQjtJQUtqQyxZQUFvQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBSDlCLDBCQUFxQixHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7UUFDOUMsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUdwQixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pFLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQ3BCLE9BQW9ELEVBQ3BELFVBQXdDO1FBRXhDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0QyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3hDLElBQUksQ0FBQyxrQ0FBa0MsQ0FBTSxHQUFHLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FDcEYsQ0FBQztRQUVGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWpDLE9BQU8sTUFBTSxPQUFPLENBQUM7SUFD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VCxDQUFDO0lBQ0gsQ0FBQztJQUVPLFlBQVk7UUFDbEIsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDMUIsQ0FBQzsrR0E3SFUsc0JBQXNCO21IQUF0QixzQkFBc0IsY0FEVCxNQUFNOzs0RkFDbkIsc0JBQXNCO2tCQURsQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzZXQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRHluYW1pY0NvbXBvbmVudERlZmluaXRpb24gfSBmcm9tICcuL2R5bmFtaWMtY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNEZXRhaWxzUmVzb2x2ZXIgfSBmcm9tICcuL2R5bmFtaWMtZGV0YWlscy1yZXNvbHZlcic7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgRHluYW1pY1Jlc29sdmVyU2VydmljZSB7XG4gIGJ1bGtSZXNvbHZpbmdUcmlnZ2VyJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBwcml2YXRlIF90cmlnZ2VyQnVsa1Jlc29sdmluZyA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZXF1ZXN0SWQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5idWxrUmVzb2x2aW5nVHJpZ2dlciQgPSB0aGlzLl90cmlnZ2VyQnVsa1Jlc29sdmluZy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIGFzeW5jIGV4ZWN1dGVSZXNvbHZlcnMoXG4gICAgZGV0YWlsczogQXJyYXk8eyBjb21wb25lbnRJZDogc3RyaW5nOyBjb25maWc6IGFueSB9PixcbiAgICBkeW5hbWljRGVmOiBEeW5hbWljQ29tcG9uZW50RGVmaW5pdGlvbltdXG4gICk6IFByb21pc2U8dW5rbm93bltdPiB7XG4gICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5nZXRSZXF1ZXN0SWQoKTtcbiAgICBjb25zdCByZXMgPSBkeW5hbWljRGVmLm1hcCgoZGVmLCBpbmRleCkgPT5cbiAgICAgIHRoaXMuZXhlY3V0ZVJlc29sdmVyc0ZvclNpbmdsZUNvbXBvbmVudDxhbnk+KGRlZiwgZGV0YWlsc1tpbmRleF0uY29uZmlnLCByZXF1ZXN0SWQpXG4gICAgKTtcblxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLndhaXRGb3JSZXN1bHRzKHJlcyk7XG4gICAgdGhpcy50cmlnZ2VyUmVzb2x2aW5nKHJlcXVlc3RJZCk7XG5cbiAgICByZXR1cm4gYXdhaXQgcHJvbWlzZTtcbiAgfVxuXG4gIHNlcmlhbGl6ZShcbiAgICBkZXRhaWxzOiBBcnJheTx7IGNvbXBvbmVudElkOiBzdHJpbmc7IGNvbmZpZzogYW55IH0+LFxuICAgIGR5bmFtaWNEZWY6IER5bmFtaWNDb21wb25lbnREZWZpbml0aW9uW11cbiAgKSB7XG4gICAgcmV0dXJuIGR5bmFtaWNEZWYubWFwKChkZWYsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5zZXJpYWxpemVTaW5nbGVDb21wb25lbnQ8YW55PihkZWYsIGRldGFpbHNbaW5kZXhdLmNvbmZpZyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNlcmlhbGl6ZVNpbmdsZUNvbXBvbmVudDxUPihkeW5hbWljRGVmOiBEeW5hbWljQ29tcG9uZW50RGVmaW5pdGlvbiwgY29uZmlnOiBhbnkpIHtcbiAgICBjb25zdCByZXM6IHsgW2tleTogc3RyaW5nXTogUGFydGlhbDxUPiB8IEFycmF5PFBhcnRpYWw8VD4+IH0gPSB7fTtcbiAgICBpZiAoIWR5bmFtaWNEZWY/LnJlc29sdmUpIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIE9iamVjdC5lbnRyaWVzKGR5bmFtaWNEZWYucmVzb2x2ZSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNvbHZlciA9IHRoaXMuaW5qZWN0b3IuZ2V0PER5bmFtaWNEZXRhaWxzUmVzb2x2ZXI8VD4+KHZhbHVlLCBudWxsKTtcbiAgICAgICAgaWYgKHJlc29sdmVyICYmIHJlc29sdmVyLnNlcmlhbGl6ZSkge1xuICAgICAgICAgIHJlc1trZXldID0gcmVzb2x2ZXIuc2VyaWFsaXplKGNvbmZpZywga2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgRHluYW1pY0RldGFpbHNSZXNvbHZlcjogXCIke3ZhbHVlfVwiIG5vdCBmb3VuZCBvciBkb2VzIG5vdCBpbXBsZW1lbnQgc2VyaWFsaXplIG1ldGhvZC5gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHNlcmlhbGl6ZSBrZXk6IFwiJHtrZXl9XCIgZm9yIGR5bmFtaWMgY29tcG9uZW50OiBcIiR7ZHluYW1pY0RlZi5pZH1cImApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIHRyaWdnZXJSZXNvbHZpbmcocmVxdWVzdElkOiBudW1iZXIpIHtcbiAgICB0aGlzLl90cmlnZ2VyQnVsa1Jlc29sdmluZy5uZXh0KHJlcXVlc3RJZCk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVSZXNvbHZlcnNGb3JTaW5nbGVDb21wb25lbnQ8VD4oXG4gICAgZHluYW1pY0RlZjogRHluYW1pY0NvbXBvbmVudERlZmluaXRpb24sXG4gICAgY29uZmlnOiBhbnksXG4gICAgcmVxdWVzdElkOiBudW1iZXJcbiAgKSB7XG4gICAgY29uc3QgcmVzOiB7IFtrZXk6IHN0cmluZ106IFQgfCBQcm9taXNlPFQ+IHwgT2JzZXJ2YWJsZTxUPiB9ID0ge307XG4gICAgaWYgKCFkeW5hbWljRGVmPy5yZXNvbHZlKSB7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH1cbiAgICBPYmplY3QuZW50cmllcyhkeW5hbWljRGVmLnJlc29sdmUpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSB0aGlzLmluamVjdG9yLmdldDxEeW5hbWljRGV0YWlsc1Jlc29sdmVyPGFueT4+KHZhbHVlLCBudWxsKTtcbiAgICAgICAgaWYgKHJlc29sdmVyICYmIHJlc29sdmVyLnJlc29sdmUpIHtcbiAgICAgICAgICByZXNba2V5XSA9IHJlc29sdmVyLnJlc29sdmUoY29uZmlnLCBrZXksIHJlcXVlc3RJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYER5bmFtaWNEZXRhaWxzUmVzb2x2ZXI6IFwiJHt2YWx1ZX1cIiBub3QgZm91bmQgb3IgZG9lcyBub3QgaW1wbGVtZW50IHJlc29sdmUgbWV0aG9kLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gcmVzb2x2ZSBrZXk6IFwiJHtrZXl9XCIgZm9yIGR5bmFtaWMgY29tcG9uZW50OiBcIiR7ZHluYW1pY0RlZi5pZH1cImApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JSZXN1bHRzKFxuICAgIGRhdGE6IEFycmF5PHsgW2tleTogc3RyaW5nXTogdW5rbm93biB8IFByb21pc2U8dW5rbm93bj4gfCBPYnNlcnZhYmxlPHVua25vd24+IH0+XG4gICk6IFByb21pc2U8YW55W10+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoZGF0YS5tYXAodG1wID0+IHRoaXMud2FpdEZvclJlc3VsdHNPZlNpbmdsZUVudHJ5KHRtcCkpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvclJlc3VsdHNPZlNpbmdsZUVudHJ5KGRhdGE6IHtcbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duIHwgUHJvbWlzZTx1bmtub3duPiB8IE9ic2VydmFibGU8dW5rbm93bj47XG4gIH0pOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHJlcyA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcnIgPSBhd2FpdCBQcm9taXNlLmFsbChPYmplY3QudmFsdWVzKGRhdGEpLm1hcCh0bXAgPT4gdGhpcy5hd2FpdFJlc3VsdCh0bXApKSk7XG4gICAgICBPYmplY3Qua2V5cyhkYXRhKS5mb3JFYWNoKChrZXksIGluZGV4KSA9PiBzZXQocmVzLCBrZXksIGFycltpbmRleF0pKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHRvIHJlc29sdmUgZGF0YSB1c2luZyBkeW5hbWljIGNvbXBvbmVudCByZXNvbHZlci5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhd2FpdFJlc3VsdChcbiAgICBkYXRhOiB1bmtub3duIHwgUHJvbWlzZTx1bmtub3duPiB8IE9ic2VydmFibGU8dW5rbm93bj5cbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZGF0YTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZGF0YS50b1Byb21pc2UoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byB0byByZXNvbHZlIGRhdGEgdXNpbmcgZHluYW1pYyBjb21wb25lbnQgcmVzb2x2ZXIuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXF1ZXN0SWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0SWQrKztcbiAgfVxufVxuIl19