UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

105 lines 16.5 kB
import { Injector, Injectable, runInInjectionContext } from '@angular/core'; import { Router } from '@angular/router'; import { from, isObservable, of } from 'rxjs'; import { every, filter, map, mergeMap, toArray, tap } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; export class RouterTabsResolver { constructor(injector, router) { this.injector = injector; this.router = router; } get routerStateSnapshot() { return this.router.routerState.snapshot; } resolve(currentRoute) { const routeConfig = currentRoute.routeConfig; const latestChildren = this.getLatestChildRoutes(routeConfig.rootContext); return from(latestChildren || []).pipe(mergeMap((child) => from(this.getGuards(child)).pipe(map(canActivate => canActivate(currentRoute, this.routerStateSnapshot)), mergeMap((result) => { if (isObservable(result)) { return result; } const resultAsPromise = result; if (resultAsPromise && typeof resultAsPromise.then === 'function') { return from(resultAsPromise); } return of(result); }), tap(result => { if (Array.isArray(result)) { child.tabs = result; } }), every(result => !!result), filter(result => result), mergeMap(() => (Array.isArray(child.tabs) ? from(child.tabs) : of(child))), map(result => { const url = this.getBaselUrl(currentRoute).join('/'); return result.label || result.path ? { label: result.label, icon: result.icon, path: `/${decodeURIComponent(url)}/${result.path}`, priority: result.priority, hide: result.hide, badge: result.badge, tooltipText: result.tooltipText, featureId: result.featureId, tabsOutlet: result.tabsOutlet, showAlways: result.showAlways } : undefined; }))), filter(tabs => !!tabs), toArray()); } getBaselUrl(currentRoute) { let prefix = []; if (currentRoute.parent?.url.length > 0) { prefix = this.getBaselUrl(currentRoute.parent); } return [...prefix, ...currentRoute.url]; } getLatestChildRoutes(context) { const thisContextRoute = this.findRootContextRoutes(this.router.config, context); return thisContextRoute?.children || []; } findRootContextRoutes(routes, context) { for (const route of routes) { if (route.rootContext === context) { return route; } if (route.children) { const childResult = this.findRootContextRoutes(route.children, context); if (childResult) { return childResult; } } } return null; } getGuards(child) { const injector = child._injector || this.injector; const canActivates = child.canActivate || []; const guards = canActivates.map(guard => { return ((route, state) => { // for legacy CanActivate guards const instance = this.injector.get(guard, null); if (instance) { return instance.canActivate(route, state); } // for current CanActivateFn guards const canActivate = guard; return runInInjectionContext(injector, () => { return canActivate(route, state); }); }); }); if (child.data && child.data.showIf) { guards.push((route, state) => child.data.showIf(route, state)); } return guards; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterTabsResolver, deps: [{ token: i0.Injector }, { token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterTabsResolver, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterTabsResolver, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLXRhYnMucmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3JvdXRlci9yb3V0ZXItdGFicy5yZXNvbHZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBaUIscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0YsT0FBTyxFQUVMLE1BQU0sRUFRUCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBTzVFLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFDVSxRQUFrQixFQUNsQixNQUFjO1FBRGQsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO0lBQ3JCLENBQUM7SUFFSixJQUFJLG1CQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztJQUMxQyxDQUFDO0lBRUQsT0FBTyxDQUFDLFlBQW9DO1FBQzFDLE1BQU0sV0FBVyxHQUF5QixZQUFZLENBQUMsV0FBbUMsQ0FBQztRQUMzRixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3BDLFFBQVEsQ0FBQyxDQUFDLEtBQW1CLEVBQUUsRUFBRSxDQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDOUIsR0FBRyxDQUFDLFdB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QW1DO2dCQUNuQyxNQUFNLFdBQVcsR0FBRyxLQUFzQixDQUFDO2dCQUMzQyxPQUFPLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7b0JBQzFDLE9BQU8sV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDbkMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQWtCLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBNkIsRUFBRSxLQUEwQixFQUFFLEVBQUUsQ0FDeEUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUNoQyxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7K0dBakhVLGtCQUFrQjttSEFBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RvciwgSW5qZWN0YWJsZSwgUHJvdmlkZXJUb2tlbiwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBSb3V0ZXIsXG4gIENhbkFjdGl2YXRlRm4sXG4gIFJvdXRlcyxcbiAgVXJsU2VnbWVudCxcbiAgQ2FuQWN0aXZhdGUsXG4gIFJvdXRlclN0YXRlU25hcHNob3QsXG4gIE1heWJlQXN5bmMsXG4gIEd1YXJkUmVzdWx0XG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBmcm9tLCBpc09ic2VydmFibGUsIG9mLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBldmVyeSwgZmlsdGVyLCBtYXAsIG1lcmdlTWFwLCB0b0FycmF5LCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUYWIgfSBmcm9tICcuLi90YWJzL3RhYi5tb2RlbCc7XG5pbXBvcnQgeyBSb3V0ZSwgUm91dGVXaXRoVGFiLCBWaWV3Q29udGV4dCwgVmlld0NvbnRleHRSb290Um91dGUgfSBmcm9tICcuL3JvdXRlci5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFJvdXRlclRhYnNSZXNvbHZlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXJcbiAgKSB7fVxuXG4gIGdldCByb3V0ZXJTdGF0ZVNuYXBzaG90KCkge1xuICAgIHJldHVybiB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdDtcbiAgfVxuXG4gIHJlc29sdmUoY3VycmVudFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KSB7XG4gICAgY29uc3Qgcm91dGVDb25maWc6IFZpZXdDb250ZXh0Um9vdFJvdXRlID0gY3VycmVudFJvdXRlLnJvdXRlQ29uZmlnIGFzIFZpZXdDb250ZXh0Um9vdFJvdXRlO1xuICAgIGNvbnN0IGxhdGVzdENoaWxkcmVuID0gdGhpcy5nZXRMYXRlc3RDaGlsZFJvdXRlcyhyb3V0ZUNvbmZpZy5yb290Q29udGV4dCk7XG4gICAgcmV0dXJuIGZyb20obGF0ZXN0Q2hpbGRyZW4gfHwgW10pLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoY2hpbGQ6IFJvdXRlV2l0aFRhYikgPT5cbiAgICAgICAgZnJvbSh0aGlzLmdldEd1YXJkcyhjaGlsZCkpLnBpcGUoXG4gICAgICAgICAgbWFwKGNhbkFjdGl2YXRlID0+IGNhbkFjdGl2YXRlKGN1cnJlbnRSb3V0ZSwgdGhpcy5yb3V0ZXJTdGF0ZVNuYXBzaG90KSksXG4gICAgICAgICAgbWVyZ2VNYXAoKHJlc3VsdDogTWF5YmVBc3luYzxHdWFyZFJlc3VsdD4pID0+IHtcbiAgICAgICAgICAgIGlmIChpc09ic2VydmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByZXN1bHRBc1Byb21pc2UgPSByZXN1bHQgYXMgUHJvbWlzZTxHdWFyZFJlc3VsdD47XG4gICAgICAgICAgICBpZiAocmVzdWx0QXNQcm9taXNlICYmIHR5cGVvZiByZXN1bHRBc1Byb21pc2UudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZXR1cm4gZnJvbShyZXN1bHRBc1Byb21pc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9mKHJlc3VsdCBhcyBHdWFyZFJlc3VsdCk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKSB7XG4gICAgICAgICAgICAgIGNoaWxkLnRhYnMgPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgICAgZXZlcnkocmVzdWx0ID0+ICEhcmVzdWx0KSxcbiAgICAgICAgICBmaWx0ZXIocmVzdWx0ID0+IHJlc3VsdCksXG4gICAgICAgICAgbWVyZ2VNYXAoKCkgPT4gKEFycmF5LmlzQXJyYXkoY2hpbGQudGFicykgPyBmcm9tKGNoaWxkLnRhYnMpIDogb2YoY2hpbGQpKSksXG4gICAgICAgICAgbWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldEJhc2VsVXJsKGN1cnJlbnRSb3V0ZSkuam9pbignLycpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5sYWJlbCB8fCByZXN1bHQucGF0aFxuICAgICAgICAgICAgICA/ICh7XG4gICAgICAgICAgICAgICAgICBsYWJlbDogcmVzdWx0LmxhYmVsLFxuICAgICAgICAgICAgICAgICAgaWNvbjogcmVzdWx0Lmljb24sXG4gICAgICAgICAgICAgICAgICBwYXRoOiBgLyR7ZGVjb2RlVVJJQ29tcG9uZW50KHVybCl9LyR7cmVzdWx0LnBhdGh9YCxcbiAgICAgICAgICAgICAgICAgIHByaW9yaXR5OiByZXN1bHQucHJpb3JpdHksXG4gICAgICAgICAgICAgICAgICBoaWRlOiByZXN1bHQuaGlkZSxcbiAgICAgICAgICAgICAgICAgIGJhZGdlOiByZXN1bHQuYmFkZ2UsXG4gICAgICAgICAgICAgICAgICB0b29sdGlwVGV4dDogcmVzdWx0LnRvb2x0aXBUZXh0LFxuICAgICAgICAgICAgICAgICAgZmVhdHVyZUlkOiByZXN1bHQuZmVhdHVyZUlkLFxuICAgICAgICAgICAgICAgICAgdGFic091dGxldDogcmVzdWx0LnRhYnNPdXRsZXQsXG4gICAgICAgICAgICAgICAgICBzaG93QWx3YXlzOiByZXN1bHQuc2hvd0Fsd2F5c1xuICAgICAgICAgICAgICAgIH0gYXMgVGFiKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApLFxuICAgICAgZmlsdGVyKHRhYnMgPT4gISF0YWJzKSxcbiAgICAgIHRvQXJyYXkoKVxuICAgICkgYXMgT2JzZXJ2YWJsZTxUYWJbXT47XG4gIH1cblxuICBwcml2YXRlIGdldEJhc2VsVXJsKGN1cnJlbnRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCkge1xuICAgIGxldCBwcmVmaXg6IFVybFNlZ21lbnRbXSA9IFtdO1xuICAgIGlmIChjdXJyZW50Um91dGUucGFyZW50Py51cmwubGVuZ3RoID4gMCkge1xuICAgICAgcHJlZml4ID0gdGhpcy5nZXRCYXNlbFVybChjdXJyZW50Um91dGUucGFyZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gWy4uLnByZWZpeCwgLi4uY3VycmVudFJvdXRlLnVybF07XG4gIH1cblxuICBwcml2YXRlIGdldExhdGVzdENoaWxkUm91dGVzKGNvbnRleHQ6IFZpZXdDb250ZXh0KSB7XG4gICAgY29uc3QgdGhpc0NvbnRleHRSb3V0ZSA9IHRoaXMuZmluZFJvb3RDb250ZXh0Um91dGVzKHRoaXMucm91dGVyLmNvbmZpZywgY29udGV4dCk7XG4gICAgcmV0dXJuIHRoaXNDb250ZXh0Um91dGU/LmNoaWxkcmVuIHx8IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUm9vdENvbnRleHRSb3V0ZXMocm91dGVzOiBSb3V0ZXMsIGNvbnRleHQ6IFZpZXdDb250ZXh0KSB7XG4gICAgZm9yIChjb25zdCByb3V0ZSBvZiByb3V0ZXMpIHtcbiAgICAgIGlmICgocm91dGUgYXMgVmlld0NvbnRleHRSb290Um91dGUpLnJvb3RDb250ZXh0ID09PSBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiByb3V0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBjaGlsZFJlc3VsdCA9IHRoaXMuZmluZFJvb3RDb250ZXh0Um91dGVzKHJvdXRlLmNoaWxkcmVuLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKGNoaWxkUmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkUmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRHdWFyZHMoY2hpbGQ6IFJvdXRlKTogQ2FuQWN0aXZhdGVGbltdIHtcbiAgICBjb25zdCBpbmplY3RvcjogSW5qZWN0b3IgPSAoKDxhbnk+Y2hpbGQpLl9pbmplY3RvciBhcyBhbnkpIHx8IHRoaXMuaW5qZWN0b3I7XG4gICAgY29uc3QgY2FuQWN0aXZhdGVzOiBBcnJheTxDYW5BY3RpdmF0ZUZuIHwgUHJvdmlkZXJUb2tlbjxDYW5BY3RpdmF0ZT4+ID0gY2hpbGQuY2FuQWN0aXZhdGUgfHwgW107XG4gICAgY29uc3QgZ3VhcmRzID0gY2FuQWN0aXZhdGVzLm1hcChndWFyZCA9PiB7XG4gICAgICByZXR1cm4gKChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpID0+IHtcbiAgICAgICAgLy8gZm9yIGxlZ2FjeSBDYW5BY3RpdmF0ZSBndWFyZHNcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmluamVjdG9yLmdldChndWFyZCwgbnVsbCk7XG4gICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5jYW5BY3RpdmF0ZShyb3V0ZSwgc3RhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZm9yIGN1cnJlbnQgQ2FuQWN0aXZhdGVGbiBndWFyZHNcbiAgICAgICAgY29uc3QgY2FuQWN0aXZhdGUgPSBndWFyZCBhcyBDYW5BY3RpdmF0ZUZuO1xuICAgICAgICByZXR1cm4gcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNhbkFjdGl2YXRlKHJvdXRlLCBzdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSkgYXMgQ2FuQWN0aXZhdGVGbjtcbiAgICB9KTtcbiAgICBpZiAoY2hpbGQuZGF0YSAmJiBjaGlsZC5kYXRhLnNob3dJZikge1xuICAgICAgZ3VhcmRzLnB1c2goKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCkgPT5cbiAgICAgICAgY2hpbGQuZGF0YS5zaG93SWYocm91dGUsIHN0YXRlKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGd1YXJkcztcbiAgfVxufVxuIl19