@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
77 lines • 11.6 kB
JavaScript
import { inject, Injectable } from '@angular/core';
import { combineLatest, firstValueFrom, map } from 'rxjs';
import { AppStateService } from './ui-state.service';
import { gettext } from '@c8y/ngx-components/gettext';
import { TranslateService } from '@ngx-translate/core';
import { AlertService } from '../alert/alert.service';
import * as i0 from "@angular/core";
export const SupportedApps = {
devicemanagement: 'devicemanagement-application-key',
cockpit: 'cockpit-application-key',
administration: 'administration-application-key',
smartrules: 'smartrule-key'
};
/**
* Service that provides methods to interact with other applications.
* It allows retrieving a specific app by key, checking its availability, verifying if it is not the current application,
* determining if a link to another app should be shown, and navigating to it.
*/
export class InterAppService {
constructor() {
this.stateService = inject(AppStateService);
this.alertService = inject(AlertService);
this.translateService = inject(TranslateService);
}
/**
* Retrieve application by its key as observable.
* @param key {SupportedAppKey} - Application key.
* @returns Observable of Application
*/
getApp$(key) {
return this.stateService.currentAppsOfUser.pipe(map(apps => apps.find(app => app.key === key)));
}
/**
* Checks if current application is the same as the one that key is provided
* @param key {SupportedAppKey} - Application key.
* @returns Observable of boolean; true if current app matches provided key.
*/
isCurrentApp$(key) {
return this.stateService.currentApplication.pipe(map(app => app?.key === key));
}
/**
* Checks if other (other than current) application link should be displayed. It consists of two conditions:
* - app that link leads to exists and is available for current user
* - app link leads to app that is not current app
* @param appKey {SupportedAppKey} - Application key that link leads to.
* @returns Observable of boolean; only true when app that link leads to is available and app link leads to app that is not current app
*/
shouldShowAppLink$(appKey) {
return combineLatest([
this.getApp$(appKey).pipe(map(Boolean)),
this.isCurrentApp$(appKey).pipe(map(val => !val))
]).pipe(map(([linkedAppIsAvailable, linkLeadsToOtherAppThanCurrent]) => linkedAppIsAvailable && linkLeadsToOtherAppThanCurrent));
}
/**
* Navigates to app by provided app key
* @param appKey {SupportedAppKey} - Application key that links leads to.
* @param path {string} - Additional path in target application.
*/
async navigateToApp(appKey, path) {
const contextPath = await firstValueFrom(this.getApp$(appKey).pipe(map(app => app?.contextPath)));
if (!contextPath) {
const msg = this.translateService.instant(gettext('Application with key "{{appKey}}" not found.'), { appKey });
this.alertService.danger(msg);
return;
}
const baseUrl = `/apps/${contextPath}`;
const url = path ? `${baseUrl}/${path}` : baseUrl;
window.open(url, '_blank', 'noopener,noreferrer');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InterAppService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InterAppService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InterAppService, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXItYXBwLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL2NvbW1vbi9pbnRlci1hcHAuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRXRELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRztJQUMzQixnQkFBZ0IsRUFBRSxrQ0FBa0M7SUFDcEQsT0FBTyxFQUFFLHlCQUF5QjtJQUNsQyxjQUFjLEVBQUUsZ0NBQWdDO0lBQ2hELFVBQVUsRUFBRSxlQUFlO0NBQ25CLENBQUM7QUFHWDs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFFVSxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2QyxpQkFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNwQyxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQTZEckQ7SUEzREM7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxHQUFNO1FBQ1osT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxhQUFhLENBQUMsR0FBTTtRQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsa0JBQWtCLENBQUMsTUFBUztRQUMxQixPQUFPLGFBQWEsQ0FBQztZQUNuQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNsRCxDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FDRCxDQUFDLENBQUMsb0JBQW9CLEVBQUUsOEJBQThCLENBQUMsRUFBRSxFQUFFLENBQ3pELG9CQUFvQixJQUFJLDhCQUE4QixDQUN6RCxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBUyxFQUFFLElBQWE7UUFDMUMsTUFBTSxXQUFXLEdBQUcsTUFBTSxjQUFjLENBQ3RDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUN4RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQ3ZDLE9BQU8sQ0FBQyw4Q0FBOEMsQ0FBQyxFQUN2RCxFQUFFLE1BQU0sRUFBRSxDQUNYLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLFNBQVMsV0FBVyxFQUFFLENBQUM7UUFDdkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRWxELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3BELENBQUM7K0dBL0RVLGVBQWU7bUhBQWYsZUFBZSxjQURGLE1BQU07OzRGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUFwcGxpY2F0aW9uIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgZmlyc3RWYWx1ZUZyb20sIG1hcCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXBwU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2dldHRleHQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWxlcnQvYWxlcnQuc2VydmljZSc7XG5cbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRBcHBzID0ge1xuICBkZXZpY2VtYW5hZ2VtZW50OiAnZGV2aWNlbWFuYWdlbWVudC1hcHBsaWNhdGlvbi1rZXknLFxuICBjb2NrcGl0OiAnY29ja3BpdC1hcHBsaWNhdGlvbi1rZXknLFxuICBhZG1pbmlzdHJhdGlvbjogJ2FkbWluaXN0cmF0aW9uLWFwcGxpY2F0aW9uLWtleScsXG4gIHNtYXJ0cnVsZXM6ICdzbWFydHJ1bGUta2V5J1xufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFN1cHBvcnRlZEFwcEtleSA9ICh0eXBlb2YgU3VwcG9ydGVkQXBwcylba2V5b2YgdHlwZW9mIFN1cHBvcnRlZEFwcHNdO1xuXG4vKipcbiAqIFNlcnZpY2UgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIGludGVyYWN0IHdpdGggb3RoZXIgYXBwbGljYXRpb25zLlxuICogSXQgYWxsb3dzIHJldHJpZXZpbmcgYSBzcGVjaWZpYyBhcHAgYnkga2V5LCBjaGVja2luZyBpdHMgYXZhaWxhYmlsaXR5LCB2ZXJpZnlpbmcgaWYgaXQgaXMgbm90IHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLFxuICogZGV0ZXJtaW5pbmcgaWYgYSBsaW5rIHRvIGFub3RoZXIgYXBwIHNob3VsZCBiZSBzaG93biwgYW5kIG5hdmlnYXRpbmcgdG8gaXQuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgSW50ZXJBcHBTZXJ2aWNlPFQgZXh0ZW5kcyBzdHJpbmcgPSBTdXBwb3J0ZWRBcHBLZXk+IHtcbiAgcHJpdmF0ZSBzdGF0ZVNlcnZpY2UgPSBpbmplY3QoQXBwU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhbGVydFNlcnZpY2UgPSBpbmplY3QoQWxlcnRTZXJ2aWNlKTtcbiAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBhcHBsaWNhdGlvbiBieSBpdHMga2V5IGFzIG9ic2VydmFibGUuXG4gICAqIEBwYXJhbSBrZXkge1N1cHBvcnRlZEFwcEtleX0gLSBBcHBsaWNhdGlvbiBrZXkuXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgQXBwbGljYXRpb25cbiAgICovXG4gIGdldEFwcCQoa2V5OiBUKTogT2JzZXJ2YWJsZTxJQXBwbGljYXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZVNlcnZpY2UuY3VycmVudEFwcHNPZlVzZXIucGlwZShtYXAoYXBwcyA9PiBhcHBzLmZpbmQoYXBwID0+IGFwcC5rZXkgPT09IGtleSkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgY3VycmVudCBhcHBsaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHRoYXQga2V5IGlzIHByb3ZpZGVkXG4gICAqIEBwYXJhbSBrZXkge1N1cHBvcnRlZEFwcEtleX0gLSBBcHBsaWNhdGlvbiBrZXkuXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgb2YgYm9vbGVhbjsgdHJ1ZSBpZiBjdXJyZW50IGFwcCBtYXRjaGVzIHByb3ZpZGVkIGtleS5cbiAgICovXG4gIGlzQ3VycmVudEFwcCQoa2V5OiBUKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVTZXJ2aWNlLmN1cnJlbnRBcHBsaWNhdGlvbi5waXBlKG1hcChhcHAgPT4gYXBwPy5rZXkgPT09IGtleSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBvdGhlciAob3RoZXIgdGhhbiBjdXJyZW50KSBhcHBsaWNhdGlvbiBsaW5rIHNob3VsZCBiZSBkaXNwbGF5ZWQuIEl0IGNvbnNpc3RzIG9mIHR3byBjb25kaXRpb25zOlxuICAgKiAtIGFwcCB0aGF0IGxpbmsgbGVhZHMgdG8gZXhpc3RzIGFuZCBpcyBhdmFpbGFibGUgZm9yIGN1cnJlbnQgdXNlclxuICAgKiAtIGFwcCBsaW5rIGxlYWRzIHRvIGFwcCB0aGF0IGlzIG5vdCBjdXJyZW50IGFwcFxuICAgKiBAcGFyYW0gYXBwS2V5IHtTdXBwb3J0ZWRBcHBLZXl9IC0gQXBwbGljYXRpb24ga2V5IHRoYXQgbGluayBsZWFkcyB0by5cbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBvZiBib29sZWFuOyBvbmx5IHRydWUgd2hlbiBhcHAgdGhhdCBsaW5rIGxlYWRzIHRvIGlzIGF2YWlsYWJsZSBhbmQgYXBwIGxpbmsgbGVhZHMgdG8gYXBwIHRoYXQgaXMgbm90IGN1cnJlbnQgYXBwXG4gICAqL1xuICBzaG91bGRTaG93QXBwTGluayQoYXBwS2V5OiBUKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5nZXRBcHAkKGFwcEtleSkucGlwZShtYXAoQm9vbGVhbikpLFxuICAgICAgdGhpcy5pc0N1cnJlbnRBcHAkKGFwcEtleSkucGlwZShtYXAodmFsID0+ICF2YWwpKVxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbbGlua2VkQXBwSXNBdmFpbGFibGUsIGxpbmtMZWFkc1RvT3RoZXJBcHBUaGFuQ3VycmVudF0pID0+XG4gICAgICAgICAgbGlua2VkQXBwSXNBdmFpbGFibGUgJiYgbGlua0xlYWRzVG9PdGhlckFwcFRoYW5DdXJyZW50XG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gYXBwIGJ5IHByb3ZpZGVkIGFwcCBrZXlcbiAgICogQHBhcmFtIGFwcEtleSB7U3VwcG9ydGVkQXBwS2V5fSAtIEFwcGxpY2F0aW9uIGtleSB0aGF0IGxpbmtzIGxlYWRzIHRvLlxuICAgKiBAcGFyYW0gcGF0aCB7c3RyaW5nfSAtIEFkZGl0aW9uYWwgcGF0aCBpbiB0YXJnZXQgYXBwbGljYXRpb24uXG4gICAqL1xuICBhc3luYyBuYXZpZ2F0ZVRvQXBwKGFwcEtleTogVCwgcGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGNvbnRleHRQYXRoID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICB0aGlzLmdldEFwcCQoYXBwS2V5KS5waXBlKG1hcChhcHAgPT4gYXBwPy5jb250ZXh0UGF0aCkpXG4gICAgKTtcbiAgICBpZiAoIWNvbnRleHRQYXRoKSB7XG4gICAgICBjb25zdCBtc2cgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgZ2V0dGV4dCgnQXBwbGljYXRpb24gd2l0aCBrZXkgXCJ7e2FwcEtleX19XCIgbm90IGZvdW5kLicpLFxuICAgICAgICB7IGFwcEtleSB9XG4gICAgICApO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZGFuZ2VyKG1zZyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJhc2VVcmwgPSBgL2FwcHMvJHtjb250ZXh0UGF0aH1gO1xuICAgIGNvbnN0IHVybCA9IHBhdGggPyBgJHtiYXNlVXJsfS8ke3BhdGh9YCA6IGJhc2VVcmw7XG5cbiAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnLCAnbm9vcGVuZXIsbm9yZWZlcnJlcicpO1xuICB9XG59XG4iXX0=