UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

130 lines 18.9 kB
import { Component, Input } from '@angular/core'; import { find, keys, get, isEmpty } from 'lodash-es'; import { OptionsService } from '../common/options.service'; import { IconDirective } from '../common'; import { NgClass, NgIf, NgStyle } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "../common/options.service"; export class AppIconComponent { constructor(options) { this.options = options; /** Application name. */ this.name = ''; this.model = this.emptyModel(); this.c8yAppIconsList = { analyticsbuilder: 'analytics-builder', 'analytics-builder': 'analytics-builder', cockpit: 'cockpit', devicemanagement: 'device-management', administration: 'administration', apamaepl: 'apama-epl' }; this.white = false; this.defaultIconStyle = { 'background-repeat': 'no-repeat', 'background-size': 'contain', 'background-position': 'center', 'aspect-ratio': '1' }; this.faIconMatch = /fa-/; this.c8yMatch = /^c8y-/; this.dltC8yMatch = /^dlt-c8y-/; } ngOnInit() { this.loadSetup(); } ngOnChanges() { this.loadSetup(); } emptyModel() { return { appIcon: '', configIcon: '', showIcon: true, iconClass: ['c8y-icon'], appNameAbbr: '', iconStyle: {} }; } isC8y(icon) { return this.c8yMatch.test(icon); } isFaIcon(icon) { return this.faIconMatch.test(icon); } isDltC8y(icon) { return this.dltC8yMatch.test(icon); } loadSetup() { this.model = this.emptyModel(); this.model.configIcon = this.getPropertyFromAppOrOptions(['config', 'icon']); if (!this.model.configIcon) { this.model.appIcon = this.iconFromAppDefinition(); const iconUrl = this.iconUrlFromAppDefinition(); if (iconUrl) { this.model.iconStyle = Object.assign({ 'background-image': iconUrl }, this.defaultIconStyle); } else if (!this.model.appIcon) { // only set static icon if no icon is set in the app definition this.model.appIcon = this.findStaticIcon(); } } this.model.showIcon = !!this.model.appIcon || !isEmpty(this.model.iconStyle) || !!this.model.configIcon; this.model.iconClass = [ 'c8y-icon', this.mapFontAwesomeToDelightIcons(this.model.appIcon), this.white ? 'c8y-icon-white' : 'c8y-icon-duocolor', !isEmpty(this.model.iconStyle) ? 'app-img-icon' : '' ].filter(c => !!c); const name = this.name || this.app?.name || ''; this.model.appNameAbbr = name.substring(0, 2); } iconFromAppDefinition() { return (this.getPropertyFromAppOrOptions(['icon', 'class']) || this.getPropertyFromAppOrOptions(['manifest', 'icon', 'class'])); } iconUrlFromAppDefinition() { return this.getPropertyFromAppOrOptions(['icon', 'url']); } getPropertyFromAppOrOptions(path) { const app = this.app || this.options; return get(app, ['manifest', ...path]) || get(app, path); } findStaticIcon() { const contextPath = this.contextPath || this.name || this.app?.contextPath || this.app?.name; if (!contextPath) { return undefined; } const appContextPathNormalized = find(keys(this.c8yAppIconsList), cp => { return contextPath.indexOf(cp) > -1; }); const appIcon = this.c8yAppIconsList[appContextPathNormalized]; return appIcon ? `c8y-icon-${appIcon}` : undefined; } mapFontAwesomeToDelightIcons(iconClasses) { if (!iconClasses) { return; } if (this.isFaIcon(iconClasses)) { const regex = /fa-/gi; return iconClasses.replace(regex, 'dlt-c8y-icon-'); } return this.isC8y(iconClasses) || this.isDltC8y(iconClasses) ? iconClasses : `dlt-c8y-icon-${iconClasses}`; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppIconComponent, deps: [{ token: i1.OptionsService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppIconComponent, isStandalone: true, selector: "c8y-app-icon", inputs: { contextPath: "contextPath", name: "name", app: "app" }, host: { classAttribute: "c8y-app-icon" }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"model.showIcon; else noIcon\">\n <i\n [ngStyle]=\"model.iconStyle\"\n *ngIf=\"!model.configIcon\"\n [ngClass]=\"model.iconClass\"\n ></i>\n <i\n [c8yIcon]=\"model.configIcon\"\n *ngIf=\"model.configIcon\"\n ></i>\n</ng-container>\n\n<ng-template #noIcon>\n <span class=\"app-noicon\">{{ model.appNameAbbr }}</span>\n</ng-template>\n", dependencies: [{ kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppIconComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-app-icon', host: { class: 'c8y-app-icon' }, standalone: true, imports: [IconDirective, NgStyle, NgIf, NgClass], template: "<ng-container *ngIf=\"model.showIcon; else noIcon\">\n <i\n [ngStyle]=\"model.iconStyle\"\n *ngIf=\"!model.configIcon\"\n [ngClass]=\"model.iconClass\"\n ></i>\n <i\n [c8yIcon]=\"model.configIcon\"\n *ngIf=\"model.configIcon\"\n ></i>\n</ng-container>\n\n<ng-template #noIcon>\n <span class=\"app-noicon\">{{ model.appNameAbbr }}</span>\n</ng-template>\n" }] }], ctorParameters: () => [{ type: i1.OptionsService }], propDecorators: { contextPath: [{ type: Input }], name: [{ type: Input }], app: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWljb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9hcHBsaWNhdGlvbi9hcHAtaWNvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL2FwcGxpY2F0aW9uL2FwcC1pY29uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUNwRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFTekQsTUFBTSxPQUFPLGdCQUFnQjtJQWdDM0IsWUFBb0IsT0FBdUI7UUFBdkIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUE3QjNDLHdCQUF3QjtRQUNmLFNBQUksR0FBRyxFQUFFLENBQUM7UUFJbkIsVUFBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixvQkFBZSxHQUFHO1lBQ3hCLGdCQUFnQixFQUFFLG1CQUFtQjtZQUNyQyxtQkFBbUIsRUFBRSxtQkFBbUI7WUFDeEMsT0FBTyxFQUFFLFNBQVM7WUFDbEIsZ0JBQWdCLEVBQUUsbUJBQW1CO1lBQ3JDLGNBQWMsRUFBRSxnQkFBZ0I7WUFDaEMsUUFBUSxFQUFFLFdBQVc7U0FDYixDQUFDO1FBRUgsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUVkLHFCQUFnQixHQUFHO1lBQ3pCLG1CQUFtQixFQUFFLFdBQVc7WUFDaEMsaUJBQWlCLEVBQUUsU0FBUztZQUM1QixxQkFBcUIsRUFBRSxRQUFR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LCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbmQsIGtleXMsIGdldCwgaXNFbXB0eSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBPcHRpb25zU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9vcHRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUFwcGxpY2F0aW9uIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgSWNvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ0lmLCBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWFwcC1pY29uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcC1pY29uLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2M4eS1hcHAtaWNvbicgfSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0ljb25EaXJlY3RpdmUsIE5nU3R5bGUsIE5nSWYsIE5nQ2xhc3NdXG59KVxuZXhwb3J0IGNsYXNzIEFwcEljb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKiBBcHBsaWNhdGlvbiBjb250ZXh0IHBhdGguICovXG4gIEBJbnB1dCgpIGNvbnRleHRQYXRoOiBzdHJpbmc7XG4gIC8qKiBBcHBsaWNhdGlvbiBuYW1lLiAqL1xuICBASW5wdXQoKSBuYW1lID0gJyc7XG4gIC8qKiBBcHBsaWNhdGlvbiBtYW5hZ2VkIG9iamVjdC4gKi9cbiAgQElucHV0KCkgYXBwOiBJQXBwbGljYXRpb247XG5cbiAgbW9kZWwgPSB0aGlzLmVtcHR5TW9kZWwoKTtcblxuICBwcml2YXRlIGM4eUFwcEljb25zTGlzdCA9IHtcbiAgICBhbmFseXRpY3NidWlsZGVyOiAnYW5hbHl0aWNzLWJ1aWxkZXInLFxuICAgICdhbmFseXRpY3MtYnVpbGRlcic6ICdhbmFseXRpY3MtYnVpbGRlcicsXG4gICAgY29ja3BpdDogJ2NvY2twaXQnLFxuICAgIGRldmljZW1hbmFnZW1lbnQ6ICdkZXZpY2UtbWFuYWdlbWVudCcsXG4gICAgYWRtaW5pc3RyYXRpb246ICdhZG1pbmlzdHJhdGlvbicsXG4gICAgYXBhbWFlcGw6ICdhcGFtYS1lcGwnXG4gIH0gYXMgY29uc3Q7XG5cbiAgcHJpdmF0ZSB3aGl0ZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZGVmYXVsdEljb25TdHlsZSA9IHtcbiAgICAnYmFja2dyb3VuZC1yZXBlYXQnOiAnbm8tcmVwZWF0JyxcbiAgICAnYmFja2dyb3VuZC1zaXplJzogJ2NvbnRhaW4nLFxuICAgICdiYWNrZ3JvdW5kLXBvc2l0aW9uJzogJ2NlbnRlcicsXG4gICAgJ2FzcGVjdC1yYXRpbyc6ICcxJ1xuICB9O1xuXG4gIHByaXZhdGUgZmFJY29uTWF0Y2ggPSAvZmEtLztcbiAgcHJpdmF0ZSBjOHlNYXRjaCA9IC9eYzh5LS87XG4gIHByaXZhdGUgZGx0Qzh5TWF0Y2ggPSAvXmRsdC1jOHktLztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnNTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubG9hZFNldHVwKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRTZXR1cCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbXB0eU1vZGVsKCkge1xuICAgIHJldHVybiB7XG4gICAgICBhcHBJY29uOiAnJyxcbiAgICAgIGNvbmZpZ0ljb246ICcnLFxuICAgICAgc2hvd0ljb246IHRydWUsXG4gICAgICBpY29uQ2xhc3M6IFsnYzh5LWljb24nXSxcbiAgICAgIGFwcE5hbWVBYmJyOiAnJyxcbiAgICAgIGljb25TdHlsZToge31cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0M4eShpY29uKSB7XG4gICAgcmV0dXJuIHRoaXMuYzh5TWF0Y2gudGVzdChpY29uKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNGYUljb24oaWNvbikge1xuICAgIHJldHVybiB0aGlzLmZhSWNvbk1hdGNoLnRlc3QoaWNvbik7XG4gIH1cblxuICBwcml2YXRlIGlzRGx0Qzh5KGljb24pIHtcbiAgICByZXR1cm4gdGhpcy5kbHRDOHlNYXRjaC50ZXN0KGljb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkU2V0dXAoKSB7XG4gICAgdGhpcy5tb2RlbCA9IHRoaXMuZW1wdHlNb2RlbCgpO1xuICAgIHRoaXMubW9kZWwuY29uZmlnSWNvbiA9IHRoaXMuZ2V0UHJvcGVydHlGcm9tQXBwT3JPcHRpb25zKFsnY29uZmlnJywgJ2ljb24nXSk7XG4gICAgaWYgKCF0aGlzLm1vZGVsLmNvbmZpZ0ljb24pIHtcbiAgICAgIHRoaXMubW9kZWwuYXBwSWNvbiA9IHRoaXMuaWNvbkZyb21BcHBEZWZpbml0aW9uKCk7XG4gICAgICBjb25zdCBpY29uVXJsID0gdGhpcy5pY29uVXJsRnJvbUFwcERlZmluaXRpb24oKTtcbiAgICAgIGlmIChpY29uVXJsKSB7XG4gICAgICAgIHRoaXMubW9kZWwuaWNvblN0eWxlID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICB7ICdiYWNrZ3JvdW5kLWltYWdlJzogaWNvblVybCB9LFxuICAgICAgICAgIHRoaXMuZGVmYXVsdEljb25TdHlsZVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5tb2RlbC5hcHBJY29uKSB7XG4gICAgICAgIC8vIG9ubHkgc2V0IHN0YXRpYyBpY29uIGlmIG5vIGljb24gaXMgc2V0IGluIHRoZSBhcHAgZGVmaW5pdGlvblxuICAgICAgICB0aGlzLm1vZGVsLmFwcEljb24gPSB0aGlzLmZpbmRTdGF0aWNJY29uKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubW9kZWwuc2hvd0ljb24gPVxuICAgICAgISF0aGlzLm1vZGVsLmFwcEljb24gfHwgIWlzRW1wdHkodGhpcy5tb2RlbC5pY29uU3R5bGUpIHx8ICEhdGhpcy5tb2RlbC5jb25maWdJY29uO1xuICAgIHRoaXMubW9kZWwuaWNvbkNsYXNzID0gW1xuICAgICAgJ2M4eS1pY29uJyxcbiAgICAgIHRoaXMubWFwRm9udEF3ZXNvbWVUb0RlbGlnaHRJY29ucyh0aGlzLm1vZGVsLmFwcEljb24pLFxuICAgICAgdGhpcy53aGl0ZSA/ICdjOHktaWNvbi13aGl0ZScgOiAnYzh5LWljb24tZHVvY29sb3InLFxuICAgICAgIWlzRW1wdHkodGhpcy5tb2RlbC5pY29uU3R5bGUpID8gJ2FwcC1pbWctaWNvbicgOiAnJ1xuICAgIF0uZmlsdGVyKGMgPT4gISFjKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5uYW1lIHx8IHRoaXMuYXBwPy5uYW1lIHx8ICcnO1xuICAgIHRoaXMubW9kZWwuYXBwTmFtZUFiYnIgPSBuYW1lLnN1YnN0cmluZygwLCAyKTtcbiAgfVxuXG4gIHByaXZhdGUgaWNvbkZyb21BcHBEZWZpbml0aW9uKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmdldFByb3BlcnR5RnJvbUFwcE9yT3B0aW9ucyhbJ2ljb24nLCAnY2xhc3MnXSkgfHxcbiAgICAgIHRoaXMuZ2V0UHJvcGVydHlGcm9tQXBwT3JPcHRpb25zKFsnbWFuaWZlc3QnLCAnaWNvbicsICdjbGFzcyddKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGljb25VcmxGcm9tQXBwRGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eUZyb21BcHBPck9wdGlvbnMoWydpY29uJywgJ3VybCddKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJvcGVydHlGcm9tQXBwT3JPcHRpb25zKHBhdGg6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgYXBwID0gdGhpcy5hcHAgfHwgdGhpcy5vcHRpb25zO1xuICAgIHJldHVybiBnZXQoYXBwLCBbJ21hbmlmZXN0JywgLi4ucGF0aF0pIHx8IGdldChhcHAsIHBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kU3RhdGljSWNvbigpIHtcbiAgICBjb25zdCBjb250ZXh0UGF0aCA9IHRoaXMuY29udGV4dFBhdGggfHwgdGhpcy5uYW1lIHx8IHRoaXMuYXBwPy5jb250ZXh0UGF0aCB8fCB0aGlzLmFwcD8ubmFtZTtcbiAgICBpZiAoIWNvbnRleHRQYXRoKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBhcHBDb250ZXh0UGF0aE5vcm1hbGl6ZWQgPSBmaW5kKGtleXModGhpcy5jOHlBcHBJY29uc0xpc3QpLCBjcCA9PiB7XG4gICAgICByZXR1cm4gY29udGV4dFBhdGguaW5kZXhPZihjcCkgPiAtMTtcbiAgICB9KTtcbiAgICBjb25zdCBhcHBJY29uOiBzdHJpbmcgPSB0aGlzLmM4eUFwcEljb25zTGlzdFthcHBDb250ZXh0UGF0aE5vcm1hbGl6ZWRdO1xuICAgIHJldHVybiBhcHBJY29uID8gKGBjOHktaWNvbi0ke2FwcEljb259YCBhcyBjb25zdCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIG1hcEZvbnRBd2Vzb21lVG9EZWxpZ2h0SWNvbnMoaWNvbkNsYXNzZXM6IHN0cmluZykge1xuICAgIGlmICghaWNvbkNsYXNzZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNGYUljb24oaWNvbkNsYXNzZXMpKSB7XG4gICAgICBjb25zdCByZWdleCA9IC9mYS0vZ2k7XG4gICAgICByZXR1cm4gaWNvbkNsYXNzZXMucmVwbGFjZShyZWdleCwgJ2RsdC1jOHktaWNvbi0nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNDOHkoaWNvbkNsYXNzZXMpIHx8IHRoaXMuaXNEbHRDOHkoaWNvbkNsYXNzZXMpXG4gICAgICA/IGljb25DbGFzc2VzXG4gICAgICA6IGBkbHQtYzh5LWljb24tJHtpY29uQ2xhc3Nlc31gO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZWwuc2hvd0ljb247IGVsc2Ugbm9JY29uXCI+XG4gIDxpXG4gICAgW25nU3R5bGVdPVwibW9kZWwuaWNvblN0eWxlXCJcbiAgICAqbmdJZj1cIiFtb2RlbC5jb25maWdJY29uXCJcbiAgICBbbmdDbGFzc109XCJtb2RlbC5pY29uQ2xhc3NcIlxuICA+PC9pPlxuICA8aVxuICAgIFtjOHlJY29uXT1cIm1vZGVsLmNvbmZpZ0ljb25cIlxuICAgICpuZ0lmPVwibW9kZWwuY29uZmlnSWNvblwiXG4gID48L2k+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNub0ljb24+XG4gIDxzcGFuIGNsYXNzPVwiYXBwLW5vaWNvblwiPnt7IG1vZGVsLmFwcE5hbWVBYmJyIH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==