@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
59 lines • 8.93 kB
JavaScript
import { Injectable, Injector } from '@angular/core';
import { InventoryService } from '@c8y/client';
import { from, of } from 'rxjs';
import { catchError, map, shareReplay, tap } from 'rxjs/operators';
import { ViewContextServices } from './view-context.service';
import * as i0 from "@angular/core";
export class ContextRouteGuard {
constructor(injector) {
this.injector = injector;
this.caches = new Map();
}
canActivate(route) {
const id = route.paramMap.get('id');
const service = this.service(route);
this.clearDetailCached(service, id);
return this.detailCached(service, id).pipe(tap(contextData => {
Object.keys(route.data.contextData).forEach(key => delete route.data.contextData[key]);
Object.assign(route.data.contextData, contextData);
}), map(() => true), catchError(() => of(false)));
}
service(route) {
const serviceInstance = ViewContextServices.contextToService(route.data.context);
return this.injector.get(serviceInstance);
}
detailCached(service, id) {
if (id === 'new') {
return of(undefined);
}
const cache = this.getCache(service);
let cached = cache[id];
if (!cached) {
const params = service instanceof InventoryService ? { withChildren: false } : undefined;
cached = from(service.detail(id, params)).pipe(map(({ data }) => data), shareReplay(1));
cache[id] = cached;
}
return cached;
}
clearDetailCached(service, id) {
const cache = this.getCache(service);
delete cache[id];
}
getCache(service) {
let cache = this.caches.get(service);
if (!cache) {
cache = {};
this.caches.set(service, cache);
}
return cache;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContextRouteGuard, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContextRouteGuard, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ContextRouteGuard, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i0.Injector }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1yb3V0ZS5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvcm91dGVyL2NvbnRleHQtcm91dGUuZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQVEsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFLN0QsTUFBTSxPQUFPLGlCQUFpQjtJQUU1QixZQUFvQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBRDlCLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2MsQ0FBQztJQUUxQyxXQUFXLENBQUMsS0FBNkI7UUFDdkMsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUN4QyxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN2RixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFDZixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQzVCLENBQUM7SUFDSixDQUFDO0lBRU8sT0FBTyxDQUFDLEtBQTZCO1FBQzNDLE1BQU0sZUFBZSxHQUFHLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakYsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxlQUE2RCxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVPLFlBQVksQ0FDbEIsT0FBaUQsRUFDakQsRUFBbUI7UUFFbkIsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDakIsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkIsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sTUFBTSxHQUFHLE9BQU8sWUFBWSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUN6RixNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUM1QyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFDdkIsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7WUFDRixLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8saUJBQWlCLENBQ3ZCLE9BQWlELEVBQ2pELEVBQW1CO1FBRW5CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsT0FBTyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVPLFFBQVEsQ0FBQyxPQUFpRDtRQUNoRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7K0dBMURVLGlCQUFpQjttSEFBakIsaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBJbnZlbnRvcnlTZXJ2aWNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc2hhcmVSZXBsYXksIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFZpZXdDb250ZXh0U2VydmljZXMgfSBmcm9tICcuL3ZpZXctY29udGV4dC5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ29udGV4dFJvdXRlR3VhcmQge1xuICBwcml2YXRlIGNhY2hlcyA9IG5ldyBNYXAoKTtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgY2FuQWN0aXZhdGUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBpZCA9IHJvdXRlLnBhcmFtTWFwLmdldCgnaWQnKTtcbiAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5zZXJ2aWNlKHJvdXRlKTtcbiAgICB0aGlzLmNsZWFyRGV0YWlsQ2FjaGVkKHNlcnZpY2UsIGlkKTtcbiAgICByZXR1cm4gdGhpcy5kZXRhaWxDYWNoZWQoc2VydmljZSwgaWQpLnBpcGUoXG4gICAgICB0YXAoY29udGV4dERhdGEgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhyb3V0ZS5kYXRhLmNvbnRleHREYXRhKS5mb3JFYWNoKGtleSA9PiBkZWxldGUgcm91dGUuZGF0YS5jb250ZXh0RGF0YVtrZXldKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihyb3V0ZS5kYXRhLmNvbnRleHREYXRhLCBjb250ZXh0RGF0YSk7XG4gICAgICB9KSxcbiAgICAgIG1hcCgoKSA9PiB0cnVlKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoZmFsc2UpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNlcnZpY2Uocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpIHtcbiAgICBjb25zdCBzZXJ2aWNlSW5zdGFuY2UgPSBWaWV3Q29udGV4dFNlcnZpY2VzLmNvbnRleHRUb1NlcnZpY2Uocm91dGUuZGF0YS5jb250ZXh0KTtcbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoc2VydmljZUluc3RhbmNlIGFzIFR5cGU8SW5zdGFuY2VUeXBlPHR5cGVvZiBzZXJ2aWNlSW5zdGFuY2U+Pik7XG4gIH1cblxuICBwcml2YXRlIGRldGFpbENhY2hlZChcbiAgICBzZXJ2aWNlOiBSZXR1cm5UeXBlPENvbnRleHRSb3V0ZUd1YXJkWydzZXJ2aWNlJ10+LFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogT2JzZXJ2YWJsZTxBd2FpdGVkPFJldHVyblR5cGU8UmV0dXJuVHlwZTxDb250ZXh0Um91dGVHdWFyZFsnc2VydmljZSddPlsnZGV0YWlsJ10+PlsnZGF0YSddPiB7XG4gICAgaWYgKGlkID09PSAnbmV3Jykge1xuICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5nZXRDYWNoZShzZXJ2aWNlKTtcbiAgICBsZXQgY2FjaGVkID0gY2FjaGVbaWRdO1xuICAgIGlmICghY2FjaGVkKSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBzZXJ2aWNlIGluc3RhbmNlb2YgSW52ZW50b3J5U2VydmljZSA/IHsgd2l0aENoaWxkcmVuOiBmYWxzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY2FjaGVkID0gZnJvbShzZXJ2aWNlLmRldGFpbChpZCwgcGFyYW1zKSkucGlwZShcbiAgICAgICAgbWFwKCh7IGRhdGEgfSkgPT4gZGF0YSksXG4gICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICApO1xuICAgICAgY2FjaGVbaWRdID0gY2FjaGVkO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckRldGFpbENhY2hlZChcbiAgICBzZXJ2aWNlOiBSZXR1cm5UeXBlPENvbnRleHRSb3V0ZUd1YXJkWydzZXJ2aWNlJ10+LFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKSB7XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLmdldENhY2hlKHNlcnZpY2UpO1xuICAgIGRlbGV0ZSBjYWNoZVtpZF07XG4gIH1cblxuICBwcml2YXRlIGdldENhY2hlKHNlcnZpY2U6IFJldHVyblR5cGU8Q29udGV4dFJvdXRlR3VhcmRbJ3NlcnZpY2UnXT4pIHtcbiAgICBsZXQgY2FjaGUgPSB0aGlzLmNhY2hlcy5nZXQoc2VydmljZSk7XG4gICAgaWYgKCFjYWNoZSkge1xuICAgICAgY2FjaGUgPSB7fTtcbiAgICAgIHRoaXMuY2FjaGVzLnNldChzZXJ2aWNlLCBjYWNoZSk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZTtcbiAgfVxufVxuIl19