@c8y/ngx-components 1017.0.229 → 1017.0.231

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -69,6 +69,11 @@ class DatapointLibraryDetailsComponent {
69
69
  this.alertService.saveSuccess(gettext('Data point library entry'))();
70
70
  }
71
71
  else {
72
+ // during managedObject creation (POST) a fragment with the value null is actually being created and stored to the DB compared to an update (PUT) which would remove the fragment.
73
+ // as we don't want to have that fragment stored in DB (if set to null), we will just set it to undefined.
74
+ if (mo.c8y_Global === null) {
75
+ mo.c8y_Global = undefined;
76
+ }
72
77
  const res = await this.inventory.create(mo);
73
78
  this.datapointUpdate(res.data);
74
79
  this.alertService.createSuccess(gettext('Data point library entry'))();
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-datapoint-library.mjs","sources":["../../datapoint-library/datapoint-library.model.ts","../../datapoint-library/datapoint-library-details/datapoint-library-details.component.ts","../../datapoint-library/datapoint-library-details/datapoint-library-details.component.html","../../datapoint-library/datapoint-library-list.component.ts","../../datapoint-library/datapoint-library-list.component.html","../../datapoint-library/datapoint-library.module.ts","../../datapoint-library/c8y-ngx-components-datapoint-library.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const pathToDatapointLibrary = 'datapointlibrary';\n\nexport const DATAPOINT_LIBRARY_CONFIG = new InjectionToken<DatapointLibraryOptions>(\n 'DatapointLibraryOptions'\n);\n\nexport interface DatapointLibraryOptions {\n /**\n * Allows to define whether the c8y_Global fragment should be added per default on newly created datapoints.\n */\n doNotAddGlobalFragmentByDefault?: boolean;\n /**\n * Will make a checkbox visible that allows the user to take the decision if the c8y_Global fragment should be set or not.\n */\n showCheckboxForGlobalFragment?: boolean;\n}\n","import { Component, Inject, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { ActivatedRoute, Data, Router } from '@angular/router';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport { AlertService, gettext, HumanizePipe } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { get, isEmpty } from 'lodash-es';\nimport { Subscription } from 'rxjs';\nimport {\n DatapointLibraryOptions,\n DATAPOINT_LIBRARY_CONFIG,\n pathToDatapointLibrary\n} from '../datapoint-library.model';\nimport { C8yValidators, ColorService } from '@c8y/ngx-components';\nimport { DatapointParserService } from '@c8y/ngx-components/datapoint-library/services';\nimport { DatapointSelectorService } from '@c8y/ngx-components/datapoint-selector';\n\n@Component({\n selector: 'c8y-datapoint-library-details',\n templateUrl: './datapoint-library-details.component.html'\n})\nexport class DatapointLibraryDetailsComponent implements OnInit, OnDestroy {\n path = pathToDatapointLibrary;\n formGroup: ReturnType<DatapointLibraryDetailsComponent['initForm']>;\n range: FormGroup;\n redRange: FormGroup;\n yellowRange: FormGroup;\n datapoint: IManagedObject;\n isLoading = true;\n\n rangeConfig = {};\n\n routeSub: Subscription;\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private inventory: InventoryService,\n private formBuilder: FormBuilder,\n private alertService: AlertService,\n private router: Router,\n private translate: TranslateService,\n private colorService: ColorService,\n private parser: DatapointParserService,\n private datapointSelectorService: DatapointSelectorService,\n @Optional() @Inject(DATAPOINT_LIBRARY_CONFIG) public config: DatapointLibraryOptions\n ) {\n this.formGroup = this.initForm();\n }\n\n ngOnInit() {\n this.routeSub = this.activatedRoute.parent.data.subscribe(data => {\n this.load(data);\n });\n }\n\n ngOnDestroy(): void {\n if (this.routeSub) {\n this.routeSub.unsubscribe();\n }\n }\n\n async save(value) {\n const kpiValues = this.extractKpiValuesFromFormValue(value);\n const kpi = Object.assign({}, this.datapoint?.c8y_Kpi || {}, kpiValues);\n const cleanedUpKpi = this.removeNullValues(kpi);\n\n const mo: Partial<IManagedObject> = {\n c8y_Kpi: cleanedUpKpi,\n c8y_Global: value.c8y_Global ? {} : null\n };\n try {\n if (this.datapoint?.id) {\n mo.id = this.datapoint.id;\n const res = await this.inventory.update(mo);\n this.datapointUpdate(res.data);\n this.alertService.saveSuccess(gettext('Data point library entry'))();\n } else {\n const res = await this.inventory.create(mo);\n this.datapointUpdate(res.data);\n this.alertService.createSuccess(gettext('Data point library entry'))();\n }\n this.navigateBackToList();\n } catch (e) {\n this.alertService.addServerFailure(e);\n }\n }\n\n cancel() {\n this.navigateBackToList();\n }\n\n formChange() {\n if (this.formGroup.invalid) {\n return;\n }\n const kpiValues = this.extractKpiValuesFromFormValue(this.formGroup.value);\n this.rangeConfig = Object.assign({ orientation: 'horizontal' }, kpiValues);\n }\n\n async pickDatapoint() {\n try {\n const datapoints = await this.datapointSelectorService.selectDataPoints({\n finishWithFirstSelection: true,\n ignoreDatapointTemplates: true,\n guessDatapointUnit: false\n });\n if (datapoints.length) {\n const datapoint = datapoints[0];\n this.formGroup.patchValue({\n fragment: datapoint.fragment,\n series: datapoint.series,\n color: datapoint.color,\n label: datapoint.label\n });\n this.formGroup.markAsTouched();\n this.formGroup.markAsDirty();\n }\n } catch (_e) {\n // modal closed\n }\n }\n\n private navigateBackToList() {\n return this.router.navigate([pathToDatapointLibrary]);\n }\n\n private datapointUpdate(tmpDatapoint: IManagedObject) {\n const datapoint = this.parser.parseDatapoint(tmpDatapoint);\n this.datapoint = datapoint;\n const {\n fragment,\n series,\n description,\n unit,\n target,\n label,\n color,\n yellowRangeMin,\n yellowRangeMax,\n redRangeMin,\n redRangeMax,\n min,\n max\n } = datapoint.c8y_Kpi;\n this.formGroup.patchValue({\n fragment,\n series,\n description,\n unit,\n target,\n label,\n color,\n range: { min, max },\n yellowRange: { min: yellowRangeMin, max: yellowRangeMax },\n redRange: { min: redRangeMin, max: redRangeMax },\n c8y_Global: !!datapoint.c8y_Global\n });\n this.formChange();\n }\n\n private extractKpiValuesFromFormValue(formValue: any) {\n const { fragment, series, description, unit, target, label, color } = formValue;\n return {\n fragment,\n series,\n description,\n unit,\n target,\n label,\n color,\n yellowRangeMin: get(formValue, 'yellowRange.min'),\n yellowRangeMax: get(formValue, 'yellowRange.max'),\n redRangeMin: get(formValue, 'redRange.min'),\n redRangeMax: get(formValue, 'redRange.max'),\n min: get(formValue, 'range.min'),\n max: get(formValue, 'range.max')\n };\n }\n\n private async load(data: Data) {\n this.isLoading = true;\n this.formGroup.reset();\n const { fragment, series } = this.activatedRoute.snapshot.queryParams;\n const humanize = new HumanizePipe();\n const label =\n fragment && series\n ? humanize.transform(`${fragment} => ${series}`)\n : this.translate.instant(gettext('New data point template'));\n const currentDate = new Date().toISOString();\n const color = await this.colorService.generateColor(currentDate);\n\n const contextFallback = {\n c8y_Kpi: {\n label,\n fragment,\n series,\n color\n },\n c8y_Global: !this.config?.doNotAddGlobalFragmentByDefault ? {} : null\n };\n const contextData = this.isContextSet(data) ? data.contextData : contextFallback;\n\n const { id } = contextData;\n if (id) {\n this.datapointUpdate((await this.inventory.detail(id)).data);\n } else {\n this.datapointUpdate(contextData);\n }\n this.isLoading = false;\n }\n\n private isContextSet(data: Data): boolean {\n return data && !isEmpty(data.contextData);\n }\n\n private initForm() {\n this.range = this.formBuilder.group(\n {\n min: [undefined, []],\n max: [undefined, []]\n },\n { validators: [C8yValidators.minMaxValidator(), C8yValidators.requireBothMinAndMax()] }\n );\n this.redRange = this.formBuilder.group(\n {\n min: [undefined, []],\n max: [undefined, []]\n },\n { validators: [C8yValidators.minMaxValidator(), C8yValidators.requireBothMinAndMax()] }\n );\n this.yellowRange = this.formBuilder.group(\n {\n min: [undefined, []],\n max: [undefined, []]\n },\n { validators: [C8yValidators.minMaxValidator(), C8yValidators.requireBothMinAndMax()] }\n );\n return this.formBuilder.group(\n {\n color: ['', [Validators.required, Validators.minLength(4)]],\n label: ['', [Validators.required, Validators.minLength(1), Validators.maxLength(120)]],\n description: ['', []],\n fragment: [\n '',\n [\n Validators.required,\n Validators.minLength(1),\n Validators.maxLength(120),\n Validators.pattern(/^[^.]*$/)\n ]\n ],\n series: [\n '',\n [\n Validators.required,\n Validators.minLength(1),\n Validators.maxLength(120),\n Validators.pattern(/^[^.]*$/)\n ]\n ],\n range: this.range,\n unit: [undefined, []],\n target: [undefined, []],\n redRange: this.redRange,\n yellowRange: this.yellowRange,\n c8y_Global: [!this.config?.doNotAddGlobalFragmentByDefault, []]\n },\n {\n validators: [\n C8yValidators.withinScale('redRange.min'),\n C8yValidators.withinScale('redRange.max'),\n C8yValidators.withinScale('yellowRange.min'),\n C8yValidators.withinScale('yellowRange.max'),\n C8yValidators.withinScale('target')\n ]\n }\n );\n }\n\n private removeNullValues(value) {\n // remove null values before sending data to backend\n const cleanedupValues = Object.assign({}, value);\n Object.keys(cleanedupValues).forEach(key => {\n if (cleanedupValues[key] === null) {\n delete cleanedupValues[key];\n }\n });\n return cleanedupValues;\n }\n}\n","<c8y-title *ngIf=\"!isLoading\">\n {{ formGroup.value?.label }}\n <small *ngIf=\"formGroup.value?.fragment && formGroup.value?.series\">\n {{ formGroup.value?.fragment }} / {{ formGroup.value?.series }}\n </small>\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-tools'\"\n [label]=\"'Configuration' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"'Data point library' | translate\"\n [path]=\"path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"formGroup.value?.label\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<form\n (ngSubmit)=\"formGroup.valid && save(formGroup.value)\"\n (change)=\"formChange()\"\n [formGroup]=\"formGroup\"\n class=\"card content-fullpage card--grid grid__col--6-6--md grid__row--fit-auto\"\n novalidate\n>\n <div class=\"card-header large-padding separator grid__col--fullspan\">\n <div class=\"card-title\">\n {{ formGroup.value?.label }}\n </div>\n </div>\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <div class=\"inner-scroll bg-level-0 flex-grow\">\n <div class=\"card-block large-padding\">\n <div class=\"d-flex\">\n <c8y-form-group>\n <label translate>Color</label>\n <div class=\"data-point-color form-control\">\n <div class=\"c8y-colorpicker\">\n <input\n [attr.aria-label]=\"'Color picker' | translate\"\n type=\"color\"\n name=\"color\"\n formControlName=\"color\"\n />\n <span [style.background-color]=\"formGroup.value?.color\"></span>\n </div>\n </div>\n </c8y-form-group>\n <c8y-form-group class=\"flex-grow p-l-8\">\n <label translate>Label</label>\n <input\n class=\"form-control\"\n formControlName=\"label\"\n name=\"label\"\n [placeholder]=\"'e.g. Temperature' | translate\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.label?.touched && formGroup.controls?.label?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n <c8y-form-group>\n <label translate>Description</label>\n <textarea\n class=\"form-control\"\n formControlName=\"description\"\n name=\"description\"\n [placeholder]=\"'e.g. Ambient Temperature in Celsius' | translate\"\n rows=\"3\"\n ></textarea>\n </c8y-form-group>\n\n <div class=\"d-flex a-i-center gap-8\">\n <c8y-form-group class=\"flex-grow\">\n <label translate>Fragment</label>\n <input\n class=\"form-control\"\n name=\"fragment\"\n formControlName=\"fragment\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Temperature' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.fragment?.touched && formGroup.controls?.fragment?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group class=\"flex-grow\">\n <label translate>Series</label>\n <input\n class=\"form-control\"\n formControlName=\"series\"\n name=\"series\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'T' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.series?.touched && formGroup.controls?.series?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n <div class=\"flex-no-grow\">\n <button\n class=\"btn btn-default p-l-8 p-r-8\"\n (click)=\"pickDatapoint()\"\n type=\"button\"\n [tooltip]=\"'Load fragment and series from an existing data point' | translate\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Load fragment and series from an existing data point' | translate\"\n >\n <i c8yIcon=\"eyedropper\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"config?.showCheckboxForGlobalFragment\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-checkbox\">\n <input name=\"c8y_Global\" formControlName=\"c8y_Global\" type=\"checkbox\" />\n <span></span>\n <span translate>Globally available</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Will make this entry available to all users on the tenant if checked.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n [outsideClick]=\"true\"\n >\n <i [c8yIcon]=\"'question-circle-o'\" class=\"text-info\"></i>\n </button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-block large-padding\">\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Preview</legend>\n <c8y-range-display [config]=\"rangeConfig\" class=\"m-b-16 d-block\"></c8y-range-display>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Range</legend>\n <div class=\"row\" formGroupName=\"range\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.min?.errors }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.min?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.max?.errors }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.max?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label translate>Unit</label>\n <input\n class=\"form-control\"\n name=\"unit\"\n formControlName=\"unit\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'ºC' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.unit?.touched && formGroup.controls?.unit?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n }\"\n >\n <label translate>Target</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"target\"\n formControlName=\"target\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 25 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"yellowRange\">\n <legend translate>Yellow range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 50 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.min?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.max?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"redRange\">\n <legend translate>Red range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.min?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.max?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <div class=\"card-footer separator grid__col--fullspan\">\n <button (click)=\"cancel()\" class=\"btn btn-default\" [title]=\"'Cancel' | translate\" type=\"button\">\n {{ 'Cancel' | translate }}\n </button>\n <button\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_UPDATE']; allowAny: true\"\n [disabled]=\"formGroup.invalid || formGroup.pristine\"\n class=\"btn btn-primary btn-form\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n","import { Component } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { IManagedObject, InventoryService, IResultList } from '@c8y/client';\nimport { AlertService, gettext, ModalService } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Observable, pipe } from 'rxjs';\nimport { map, shareReplay, switchMap, tap } from 'rxjs/operators';\nimport { pathToDatapointLibrary } from './datapoint-library.model';\nimport { DatapointParserService } from '@c8y/ngx-components/datapoint-library/services';\n\n@Component({\n selector: 'c8y-datapoint-library-list',\n templateUrl: './datapoint-library-list.component.html'\n})\nexport class DatapointLibraryListComponent {\n listClass = '';\n isLoading = true;\n reload$: BehaviorSubject<void> = new BehaviorSubject(null);\n datapoints$: Observable<IResultList<IManagedObject>> = this.reload$.pipe(\n tap(() => {\n this.isLoading = true;\n }),\n switchMap(() => this.getDatapoints()),\n tap(() => {\n this.isLoading = false;\n }),\n shareReplay()\n );\n\n parsePipe = pipe(map((data: IManagedObject[]) => this.parser.parseDatapoints(data)));\n\n constructor(\n private inventory: InventoryService,\n private router: Router,\n private modalService: ModalService,\n private translateService: TranslateService,\n private alertService: AlertService,\n private parser: DatapointParserService\n ) {}\n\n getDatapoints(): Promise<IResultList<IManagedObject>> {\n return this.inventory.list({ pageSize: 20, fragmentType: 'c8y_Kpi', withTotalPages: true });\n }\n\n addDatapointEntry() {\n this.router.navigate([pathToDatapointLibrary, 'new']);\n }\n\n editDatapointEntry(entry: IManagedObject) {\n this.router.navigate([pathToDatapointLibrary, entry.id]);\n }\n\n async removeDatapointEntry(entry: IManagedObject) {\n try {\n await this.modalService.confirm(\n gettext('Delete data point'),\n this.translateService.instant(\n gettext('You are about to delete data point \"{{ dpLabel }}\". Do you want to proceed?'),\n { dpLabel: entry.c8y_Kpi.label }\n ),\n 'danger'\n );\n } catch (e) {\n return;\n }\n try {\n await this.inventory.delete(entry.id);\n this.reload$.next();\n } catch (e) {\n this.alertService.addServerFailure(e);\n }\n }\n\n reload() {\n this.reload$.next();\n }\n}\n","<c8y-title>Data point library</c8y-title>\n<c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'c8y-tools'\" [label]=\"'Configuration' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-tools'\"\n [label]=\"'Data point library' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n<c8y-action-bar-item [placement]=\"'right'\" *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN']\" [priority]=\"1\">\n <button (click)=\"addDatapointEntry()\" class=\"btn btn-link\" [title]=\"'Add data point' | translate\">\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add data point' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" [priority]=\"0\">\n <button\n (click)=\"reload()\"\n class=\"btn btn-link\"\n [disabled]=\"isLoading\"\n [title]=\"'Reload' | translate\"\n type=\"button\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': isLoading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch\n (onListClassChange)=\"listClass = $event\"\n [listLength]=\"(datapoints$ | async)?.data?.length\"\n ></c8y-list-display-switch>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/cockpit/#data-point-library\"></c8y-help>\n\n<!-- empty state\n-->\n<c8y-ui-empty-state\n *ngIf=\"(datapoints$ | async)?.data?.length === 0\"\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Add a data point using the button below.' | translate\"\n>\n <p>\n <button\n (click)=\"addDatapointEntry()\"\n class=\"btn btn-primary\"\n [title]=\"'Add data point' | translate\"\n type=\"button\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add data point' | translate }}\n </button>\n </p>\n</c8y-ui-empty-state>\n\n<!-- loading indicator -->\n<div *ngIf=\"isLoading\" class=\"d-flex j-c-center\">\n <c8y-loading></c8y-loading>\n</div>\n\n<div\n class=\"card-group\"\n [ngClass]=\"listClass\"\n *ngIf=\"!isLoading && (datapoints$ | async) as datapoints\"\n>\n <div class=\"page-sticky-header hidden-xs\" *ngIf=\"datapoints.data.length\">\n <div class=\"d-flex\">\n <div class=\"card-header\">\n <div class=\"card-icon\"></div>\n <p translate>Label</p>\n </div>\n <div class=\"card-actions\"></div>\n <div class=\"card-block p-l-0\">\n <div class=\"col-sm-3 p-l-16\">\n <p translate>Fragment</p>\n </div>\n <div class=\"col-sm-2\">\n <p translate>Series</p>\n </div>\n <div class=\"col-sm-1\">\n <span translate>Unit</span>\n </div>\n <div class=\"col-sm-2\">\n <span translate>Target</span>\n </div>\n <div class=\"col-sm-4\">\n <span translate>Range</span>\n </div>\n </div>\n </div>\n </div>\n <div\n *c8yFor=\"let datapoint of datapoints; loadMore: 'hidden'; pipe: parsePipe\"\n class=\"col-sm-6 col-md-4 col-lg-3 col-xs-12\"\n >\n <div class=\"card pointer\" (click)=\"editDatapointEntry(datapoint)\">\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <div class=\"dropdown settings pull-right\" dropdown #datapointOptionsDropdown=\"bs-dropdown\" [cdkTrapFocus]=\"datapointOptionsDropdown.isOpen\">\n <button\n [title]=\"'Actions' | translate\"\n type=\"button\"\n class=\"dropdown-toggle c8y-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul class=\"dropdown-menu\" *dropdownMenu>\n <li>\n <button\n [title]=\"'Edit' | translate\"\n type=\"button\"\n (click)=\"editDatapointEntry(datapoint)\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n </li>\n <li>\n <button\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"removeDatapointEntry(datapoint)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Remove' | translate }}\n </button>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i c8yIcon=\"circle\" [style.color]=\"datapoint.c8y_Kpi?.color\"></i>\n </div>\n <div class=\"card-title text-truncate\" [title]=\"datapoint.c8y_Kpi?.label\">\n {{ datapoint.c8y_Kpi?.label }}\n </div>\n </div>\n <div class=\"card-block bg-level-1 p-b-24 card-hidden-list\">\n <div class=\"col-sm-3 col-md-2\">\n <c8y-range-display [config]=\"datapoint.c8y_Kpi\" [display]=\"'compact'\"></c8y-range-display>\n </div>\n </div>\n <div class=\"card-block\">\n <div class=\"col-sm-3 text-truncate\">\n <span>\n <label class=\"text-label-small m-r-4\" translate>Fragment</label>\n <span [title]=\"datapoint.c8y_Kpi?.fragment\">\n {{ datapoint.c8y_Kpi?.fragment }}\n </span>\n </span>\n </div>\n <div class=\"col-sm-2 text-truncate\">\n <label class=\"text-label-small m-r-4\" translate>Series</label>\n <span [title]=\"datapoint.c8y_Kpi?.series\">\n {{ datapoint.c8y_Kpi?.series }}\n </span>\n </div>\n <div class=\"col-sm-1 text-truncate card-hidden-grid\">\n <span *ngIf=\"datapoint.c8y_Kpi?.unit\">\n <label class=\"text-label-small m-r-4\" translate>Unit</label>\n <span [title]=\"datapoint.c8y_Kpi?.unit\">\n {{ datapoint.c8y_Kpi?.unit }}\n </span>\n </span>\n </div>\n <div class=\"col-sm-2 text-truncate\">\n <span *ngIf=\"datapoint.c8y_Kpi?.target\">\n <label class=\"text-label-small m-r-4\" translate>Target</label>\n <span [title]=\"datapoint.c8y_Kpi?.target\">\n {{ datapoint.c8y_Kpi?.target }}\n </span>\n </span>\n </div>\n <div class=\"col-sm-4 card-hidden-grid\">\n <c8y-range-display [config]=\"datapoint.c8y_Kpi\" [display]=\"'inline'\"></c8y-range-display>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport {\n CoreModule,\n gettext,\n hookNavigator,\n hookRoute,\n NavigatorNode,\n ViewContext\n} from '@c8y/ngx-components';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { DatapointLibraryDetailsComponent } from './datapoint-library-details/datapoint-library-details.component';\nimport { DatapointLibraryListComponent } from './datapoint-library-list.component';\nimport {\n DatapointLibraryOptions,\n DATAPOINT_LIBRARY_CONFIG,\n pathToDatapointLibrary\n} from './datapoint-library.model';\nimport { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';\n\n@NgModule({\n imports: [\n A11yModule,\n CoreModule,\n BsDropdownModule,\n PopoverModule,\n TooltipModule,\n DatapointSelectorModule\n ],\n declarations: [DatapointLibraryListComponent, DatapointLibraryDetailsComponent],\n exports: [DatapointLibraryListComponent, DatapointLibraryDetailsComponent]\n})\nexport class DatapointLibraryModule {\n static forRoot(\n config: DatapointLibraryOptions = {}\n ): ModuleWithProviders<DatapointLibraryModule> {\n return {\n ngModule: DatapointLibraryModule,\n providers: [\n hookRoute([\n {\n path: pathToDatapointLibrary,\n component: DatapointLibraryListComponent\n },\n {\n context: ViewContext.DatapointLibrary,\n path: 'details',\n component: DatapointLibraryDetailsComponent,\n label: gettext('Details'),\n icon: 'palette',\n priority: 500\n }\n ]),\n hookNavigator([\n new NavigatorNode({\n parent: gettext('Configuration'),\n label: gettext('Data point library'),\n featureId: 'dataPointLibrary',\n path: pathToDatapointLibrary,\n icon: 'c8y-data-points',\n routerLinkExact: false\n })\n ]),\n {\n provide: DATAPOINT_LIBRARY_CONFIG,\n useValue: config\n }\n ]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4","i8","i1","i2","i3","i5","i6","i7"],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-datapoint-library.mjs","sources":["../../datapoint-library/datapoint-library.model.ts","../../datapoint-library/datapoint-library-details/datapoint-library-details.component.ts","../../datapoint-library/datapoint-library-details/datapoint-library-details.component.html","../../datapoint-library/datapoint-library-list.component.ts","../../datapoint-library/datapoint-library-list.component.html","../../datapoint-library/datapoint-library.module.ts","../../datapoint-library/c8y-ngx-components-datapoint-library.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const pathToDatapointLibrary = 'datapointlibrary';\n\nexport const DATAPOINT_LIBRARY_CONFIG = new InjectionToken<DatapointLibraryOptions>(\n 'DatapointLibraryOptions'\n);\n\nexport interface DatapointLibraryOptions {\n /**\n * Allows to define whether the c8y_Global fragment should be added per default on newly created datapoints.\n */\n doNotAddGlobalFragmentByDefault?: boolean;\n /**\n * Will make a checkbox visible that allows the user to take the decision if the c8y_Global fragment should be set or not.\n */\n showCheckboxForGlobalFragment?: boolean;\n}\n","import { Component, Inject, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { FormBuilder, FormGroup, Validators } from '@angular/forms';\nimport { ActivatedRoute, Data, Router } from '@angular/router';\nimport { IManagedObject, InventoryService } from '@c8y/client';\nimport { AlertService, gettext, HumanizePipe } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { get, isEmpty } from 'lodash-es';\nimport { Subscription } from 'rxjs';\nimport {\n DatapointLibraryOptions,\n DATAPOINT_LIBRARY_CONFIG,\n pathToDatapointLibrary\n} from '../datapoint-library.model';\nimport { C8yValidators, ColorService } from '@c8y/ngx-components';\nimport { DatapointParserService } from '@c8y/ngx-components/datapoint-library/services';\nimport { DatapointSelectorService } from '@c8y/ngx-components/datapoint-selector';\n\n@Component({\n selector: 'c8y-datapoint-library-details',\n templateUrl: './datapoint-library-details.component.html'\n})\nexport class DatapointLibraryDetailsComponent implements OnInit, OnDestroy {\n path = pathToDatapointLibrary;\n formGroup: ReturnType<DatapointLibraryDetailsComponent['initForm']>;\n range: FormGroup;\n redRange: FormGroup;\n yellowRange: FormGroup;\n datapoint: IManagedObject;\n isLoading = true;\n\n rangeConfig = {};\n\n routeSub: Subscription;\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private inventory: InventoryService,\n private formBuilder: FormBuilder,\n private alertService: AlertService,\n private router: Router,\n private translate: TranslateService,\n private colorService: ColorService,\n private parser: DatapointParserService,\n private datapointSelectorService: DatapointSelectorService,\n @Optional() @Inject(DATAPOINT_LIBRARY_CONFIG) public config: DatapointLibraryOptions\n ) {\n this.formGroup = this.initForm();\n }\n\n ngOnInit() {\n this.routeSub = this.activatedRoute.parent.data.subscribe(data => {\n this.load(data);\n });\n }\n\n ngOnDestroy(): void {\n if (this.routeSub) {\n this.routeSub.unsubscribe();\n }\n }\n\n async save(value) {\n const kpiValues = this.extractKpiValuesFromFormValue(value);\n const kpi = Object.assign({}, this.datapoint?.c8y_Kpi || {}, kpiValues);\n const cleanedUpKpi = this.removeNullValues(kpi);\n\n const mo: Partial<IManagedObject> = {\n c8y_Kpi: cleanedUpKpi,\n c8y_Global: value.c8y_Global ? {} : null\n };\n try {\n if (this.datapoint?.id) {\n mo.id = this.datapoint.id;\n const res = await this.inventory.update(mo);\n this.datapointUpdate(res.data);\n this.alertService.saveSuccess(gettext('Data point library entry'))();\n } else {\n // during managedObject creation (POST) a fragment with the value null is actually being created and stored to the DB compared to an update (PUT) which would remove the fragment.\n // as we don't want to have that fragment stored in DB (if set to null), we will just set it to undefined.\n if (mo.c8y_Global === null) {\n mo.c8y_Global = undefined;\n }\n const res = await this.inventory.create(mo);\n this.datapointUpdate(res.data);\n this.alertService.createSuccess(gettext('Data point library entry'))();\n }\n this.navigateBackToList();\n } catch (e) {\n this.alertService.addServerFailure(e);\n }\n }\n\n cancel() {\n this.navigateBackToList();\n }\n\n formChange() {\n if (this.formGroup.invalid) {\n return;\n }\n const kpiValues = this.extractKpiValuesFromFormValue(this.formGroup.value);\n this.rangeConfig = Object.assign({ orientation: 'horizontal' }, kpiValues);\n }\n\n async pickDatapoint() {\n try {\n const datapoints = await this.datapointSelectorService.selectDataPoints({\n finishWithFirstSelection: true,\n ignoreDatapointTemplates: true,\n guessDatapointUnit: false\n });\n if (datapoints.length) {\n const datapoint = datapoints[0];\n this.formGroup.patchValue({\n fragment: datapoint.fragment,\n series: datapoint.series,\n color: datapoint.color,\n label: datapoint.label\n });\n this.formGroup.markAsTouched();\n this.formGroup.markAsDirty();\n }\n } catch (_e) {\n // modal closed\n }\n }\n\n private navigateBackToList() {\n return this.router.navigate([pathToDatapointLibrary]);\n }\n\n private datapointUpdate(tmpDatapoint: IManagedObject) {\n const datapoint = this.parser.parseDatapoint(tmpDatapoint);\n this.datapoint = datapoint;\n const {\n fragment,\n series,\n description,\n unit,\n target,\n label,\n color,\n yellowRangeMin,\n yellowRangeMax,\n redRangeMin,\n redRangeMax,\n min,\n max\n } = datapoint.c8y_Kpi;\n this.formGroup.patchValue({\n fragment,\n series,\n description,\n unit,\n target,\n label,\n color,\n range: { min, max },\n yellowRange: { min: yellowRangeMin, max: yellowRangeMax },\n redRange: { min: redRangeMin, max: redRangeMax },\n c8y_Global: !!datapoint.c8y_Global\n });\n this.formChange();\n }\n\n private extractKpiValuesFromFormValue(formValue: any) {\n const { fragment, series, description, unit, target, label, color } = formValue;\n return {\n fragment,\n series,\n description,\n unit,\n target,\n label,\n color,\n yellowRangeMin: get(formValue, 'yellowRange.min'),\n yellowRangeMax: get(formValue, 'yellowRange.max'),\n redRangeMin: get(formValue, 'redRange.min'),\n redRangeMax: get(formValue, 'redRange.max'),\n min: get(formValue, 'range.min'),\n max: get(formValue, 'range.max')\n };\n }\n\n private async load(data: Data) {\n this.isLoading = true;\n this.formGroup.reset();\n const { fragment, series } = this.activatedRoute.snapshot.queryParams;\n const humanize = new HumanizePipe();\n const label =\n fragment && series\n ? humanize.transform(`${fragment} => ${series}`)\n : this.translate.instant(gettext('New data point template'));\n const currentDate = new Date().toISOString();\n const color = await this.colorService.generateColor(currentDate);\n\n const contextFallback = {\n c8y_Kpi: {\n label,\n fragment,\n series,\n color\n },\n c8y_Global: !this.config?.doNotAddGlobalFragmentByDefault ? {} : null\n };\n const contextData = this.isContextSet(data) ? data.contextData : contextFallback;\n\n const { id } = contextData;\n if (id) {\n this.datapointUpdate((await this.inventory.detail(id)).data);\n } else {\n this.datapointUpdate(contextData);\n }\n this.isLoading = false;\n }\n\n private isContextSet(data: Data): boolean {\n return data && !isEmpty(data.contextData);\n }\n\n private initForm() {\n this.range = this.formBuilder.group(\n {\n min: [undefined, []],\n max: [undefined, []]\n },\n { validators: [C8yValidators.minMaxValidator(), C8yValidators.requireBothMinAndMax()] }\n );\n this.redRange = this.formBuilder.group(\n {\n min: [undefined, []],\n max: [undefined, []]\n },\n { validators: [C8yValidators.minMaxValidator(), C8yValidators.requireBothMinAndMax()] }\n );\n this.yellowRange = this.formBuilder.group(\n {\n min: [undefined, []],\n max: [undefined, []]\n },\n { validators: [C8yValidators.minMaxValidator(), C8yValidators.requireBothMinAndMax()] }\n );\n return this.formBuilder.group(\n {\n color: ['', [Validators.required, Validators.minLength(4)]],\n label: ['', [Validators.required, Validators.minLength(1), Validators.maxLength(120)]],\n description: ['', []],\n fragment: [\n '',\n [\n Validators.required,\n Validators.minLength(1),\n Validators.maxLength(120),\n Validators.pattern(/^[^.]*$/)\n ]\n ],\n series: [\n '',\n [\n Validators.required,\n Validators.minLength(1),\n Validators.maxLength(120),\n Validators.pattern(/^[^.]*$/)\n ]\n ],\n range: this.range,\n unit: [undefined, []],\n target: [undefined, []],\n redRange: this.redRange,\n yellowRange: this.yellowRange,\n c8y_Global: [!this.config?.doNotAddGlobalFragmentByDefault, []]\n },\n {\n validators: [\n C8yValidators.withinScale('redRange.min'),\n C8yValidators.withinScale('redRange.max'),\n C8yValidators.withinScale('yellowRange.min'),\n C8yValidators.withinScale('yellowRange.max'),\n C8yValidators.withinScale('target')\n ]\n }\n );\n }\n\n private removeNullValues(value) {\n // remove null values before sending data to backend\n const cleanedupValues = Object.assign({}, value);\n Object.keys(cleanedupValues).forEach(key => {\n if (cleanedupValues[key] === null) {\n delete cleanedupValues[key];\n }\n });\n return cleanedupValues;\n }\n}\n","<c8y-title *ngIf=\"!isLoading\">\n {{ formGroup.value?.label }}\n <small *ngIf=\"formGroup.value?.fragment && formGroup.value?.series\">\n {{ formGroup.value?.fragment }} / {{ formGroup.value?.series }}\n </small>\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-tools'\"\n [label]=\"'Configuration' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"'Data point library' | translate\"\n [path]=\"path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"formGroup.value?.label\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<form\n (ngSubmit)=\"formGroup.valid && save(formGroup.value)\"\n (change)=\"formChange()\"\n [formGroup]=\"formGroup\"\n class=\"card content-fullpage card--grid grid__col--6-6--md grid__row--fit-auto\"\n novalidate\n>\n <div class=\"card-header large-padding separator grid__col--fullspan\">\n <div class=\"card-title\">\n {{ formGroup.value?.label }}\n </div>\n </div>\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <div class=\"inner-scroll bg-level-0 flex-grow\">\n <div class=\"card-block large-padding\">\n <div class=\"d-flex\">\n <c8y-form-group>\n <label translate>Color</label>\n <div class=\"data-point-color form-control\">\n <div class=\"c8y-colorpicker\">\n <input\n [attr.aria-label]=\"'Color picker' | translate\"\n type=\"color\"\n name=\"color\"\n formControlName=\"color\"\n />\n <span [style.background-color]=\"formGroup.value?.color\"></span>\n </div>\n </div>\n </c8y-form-group>\n <c8y-form-group class=\"flex-grow p-l-8\">\n <label translate>Label</label>\n <input\n class=\"form-control\"\n formControlName=\"label\"\n name=\"label\"\n [placeholder]=\"'e.g. Temperature' | translate\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.label?.touched && formGroup.controls?.label?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n <c8y-form-group>\n <label translate>Description</label>\n <textarea\n class=\"form-control\"\n formControlName=\"description\"\n name=\"description\"\n [placeholder]=\"'e.g. Ambient Temperature in Celsius' | translate\"\n rows=\"3\"\n ></textarea>\n </c8y-form-group>\n\n <div class=\"d-flex a-i-center gap-8\">\n <c8y-form-group class=\"flex-grow\">\n <label translate>Fragment</label>\n <input\n class=\"form-control\"\n name=\"fragment\"\n formControlName=\"fragment\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Temperature' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.fragment?.touched && formGroup.controls?.fragment?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group class=\"flex-grow\">\n <label translate>Series</label>\n <input\n class=\"form-control\"\n formControlName=\"series\"\n name=\"series\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'T' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.series?.touched && formGroup.controls?.series?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n <div class=\"flex-no-grow\">\n <button\n class=\"btn btn-default p-l-8 p-r-8\"\n (click)=\"pickDatapoint()\"\n type=\"button\"\n [tooltip]=\"'Load fragment and series from an existing data point' | translate\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Load fragment and series from an existing data point' | translate\"\n >\n <i c8yIcon=\"eyedropper\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"config?.showCheckboxForGlobalFragment\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-checkbox\">\n <input name=\"c8y_Global\" formControlName=\"c8y_Global\" type=\"checkbox\" />\n <span></span>\n <span translate>Globally available</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Will make this entry available to all users on the tenant if checked.'\n | translate\n \"\n container=\"body\"\n type=\"button\"\n [outsideClick]=\"true\"\n >\n <i [c8yIcon]=\"'question-circle-o'\" class=\"text-info\"></i>\n </button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-block large-padding\">\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Preview</legend>\n <c8y-range-display [config]=\"rangeConfig\" class=\"m-b-16 d-block\"></c8y-range-display>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Range</legend>\n <div class=\"row\" formGroupName=\"range\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.min?.errors }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.min?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.max?.errors }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.max?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label translate>Unit</label>\n <input\n class=\"form-control\"\n name=\"unit\"\n formControlName=\"unit\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'ºC' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.unit?.touched && formGroup.controls?.unit?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n }\"\n >\n <label translate>Target</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"target\"\n formControlName=\"target\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 25 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"yellowRange\">\n <legend translate>Yellow range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 50 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.min?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.max?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"redRange\">\n <legend translate>Red range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.min?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.max?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <div class=\"card-footer separator grid__col--fullspan\">\n <button (click)=\"cancel()\" class=\"btn btn-default\" [title]=\"'Cancel' | translate\" type=\"button\">\n {{ 'Cancel' | translate }}\n </button>\n <button\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_UPDATE']; allowAny: true\"\n [disabled]=\"formGroup.invalid || formGroup.pristine\"\n class=\"btn btn-primary btn-form\"\n [title]=\"'Save' | translate\"\n type=\"submit\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n","import { Component } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { IManagedObject, InventoryService, IResultList } from '@c8y/client';\nimport { AlertService, gettext, ModalService } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BehaviorSubject, Observable, pipe } from 'rxjs';\nimport { map, shareReplay, switchMap, tap } from 'rxjs/operators';\nimport { pathToDatapointLibrary } from './datapoint-library.model';\nimport { DatapointParserService } from '@c8y/ngx-components/datapoint-library/services';\n\n@Component({\n selector: 'c8y-datapoint-library-list',\n templateUrl: './datapoint-library-list.component.html'\n})\nexport class DatapointLibraryListComponent {\n listClass = '';\n isLoading = true;\n reload$: BehaviorSubject<void> = new BehaviorSubject(null);\n datapoints$: Observable<IResultList<IManagedObject>> = this.reload$.pipe(\n tap(() => {\n this.isLoading = true;\n }),\n switchMap(() => this.getDatapoints()),\n tap(() => {\n this.isLoading = false;\n }),\n shareReplay()\n );\n\n parsePipe = pipe(map((data: IManagedObject[]) => this.parser.parseDatapoints(data)));\n\n constructor(\n private inventory: InventoryService,\n private router: Router,\n private modalService: ModalService,\n private translateService: TranslateService,\n private alertService: AlertService,\n private parser: DatapointParserService\n ) {}\n\n getDatapoints(): Promise<IResultList<IManagedObject>> {\n return this.inventory.list({ pageSize: 20, fragmentType: 'c8y_Kpi', withTotalPages: true });\n }\n\n addDatapointEntry() {\n this.router.navigate([pathToDatapointLibrary, 'new']);\n }\n\n editDatapointEntry(entry: IManagedObject) {\n this.router.navigate([pathToDatapointLibrary, entry.id]);\n }\n\n async removeDatapointEntry(entry: IManagedObject) {\n try {\n await this.modalService.confirm(\n gettext('Delete data point'),\n this.translateService.instant(\n gettext('You are about to delete data point \"{{ dpLabel }}\". Do you want to proceed?'),\n { dpLabel: entry.c8y_Kpi.label }\n ),\n 'danger'\n );\n } catch (e) {\n return;\n }\n try {\n await this.inventory.delete(entry.id);\n this.reload$.next();\n } catch (e) {\n this.alertService.addServerFailure(e);\n }\n }\n\n reload() {\n this.reload$.next();\n }\n}\n","<c8y-title>Data point library</c8y-title>\n<c8y-breadcrumb>\n <c8y-breadcrumb-item [icon]=\"'c8y-tools'\" [label]=\"'Configuration' | translate\"></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-tools'\"\n [label]=\"'Data point library' | translate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n<c8y-action-bar-item [placement]=\"'right'\" *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN']\" [priority]=\"1\">\n <button (click)=\"addDatapointEntry()\" class=\"btn btn-link\" [title]=\"'Add data point' | translate\">\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add data point' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" [priority]=\"0\">\n <button\n (click)=\"reload()\"\n class=\"btn btn-link\"\n [disabled]=\"isLoading\"\n [title]=\"'Reload' | translate\"\n type=\"button\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': isLoading }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'left'\" itemClass=\"navbar-form hidden-xs\">\n <c8y-list-display-switch\n (onListClassChange)=\"listClass = $event\"\n [listLength]=\"(datapoints$ | async)?.data?.length\"\n ></c8y-list-display-switch>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/cockpit/#data-point-library\"></c8y-help>\n\n<!-- empty state\n-->\n<c8y-ui-empty-state\n *ngIf=\"(datapoints$ | async)?.data?.length === 0\"\n [icon]=\"'c8y-data-points'\"\n [title]=\"'No data points to display.' | translate\"\n [subtitle]=\"'Add a data point using the button below.' | translate\"\n>\n <p>\n <button\n (click)=\"addDatapointEntry()\"\n class=\"btn btn-primary\"\n [title]=\"'Add data point' | translate\"\n type=\"button\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add data point' | translate }}\n </button>\n </p>\n</c8y-ui-empty-state>\n\n<!-- loading indicator -->\n<div *ngIf=\"isLoading\" class=\"d-flex j-c-center\">\n <c8y-loading></c8y-loading>\n</div>\n\n<div\n class=\"card-group\"\n [ngClass]=\"listClass\"\n *ngIf=\"!isLoading && (datapoints$ | async) as datapoints\"\n>\n <div class=\"page-sticky-header hidden-xs\" *ngIf=\"datapoints.data.length\">\n <div class=\"d-flex\">\n <div class=\"card-header\">\n <div class=\"card-icon\"></div>\n <p translate>Label</p>\n </div>\n <div class=\"card-actions\"></div>\n <div class=\"card-block p-l-0\">\n <div class=\"col-sm-3 p-l-16\">\n <p translate>Fragment</p>\n </div>\n <div class=\"col-sm-2\">\n <p translate>Series</p>\n </div>\n <div class=\"col-sm-1\">\n <span translate>Unit</span>\n </div>\n <div class=\"col-sm-2\">\n <span translate>Target</span>\n </div>\n <div class=\"col-sm-4\">\n <span translate>Range</span>\n </div>\n </div>\n </div>\n </div>\n <div\n *c8yFor=\"let datapoint of datapoints; loadMore: 'hidden'; pipe: parsePipe\"\n class=\"col-sm-6 col-md-4 col-lg-3 col-xs-12\"\n >\n <div class=\"card pointer\" (click)=\"editDatapointEntry(datapoint)\">\n <div class=\"card-actions\" (click)=\"$event.stopPropagation()\">\n <div class=\"dropdown settings pull-right\" dropdown #datapointOptionsDropdown=\"bs-dropdown\" [cdkTrapFocus]=\"datapointOptionsDropdown.isOpen\">\n <button\n [title]=\"'Actions' | translate\"\n type=\"button\"\n class=\"dropdown-toggle c8y-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul class=\"dropdown-menu\" *dropdownMenu>\n <li>\n <button\n [title]=\"'Edit' | translate\"\n type=\"button\"\n (click)=\"editDatapointEntry(datapoint)\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n </li>\n <li>\n <button\n [title]=\"'Remove' | translate\"\n type=\"button\"\n (click)=\"removeDatapointEntry(datapoint)\"\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Remove' | translate }}\n </button>\n </li>\n </ul>\n </div>\n </div>\n\n <div class=\"card-header separator\">\n <div class=\"card-icon\">\n <i c8yIcon=\"circle\" [style.color]=\"datapoint.c8y_Kpi?.color\"></i>\n </div>\n <div class=\"card-title text-truncate\" [title]=\"datapoint.c8y_Kpi?.label\">\n {{ datapoint.c8y_Kpi?.label }}\n </div>\n </div>\n <div class=\"card-block bg-level-1 p-b-24 card-hidden-list\">\n <div class=\"col-sm-3 col-md-2\">\n <c8y-range-display [config]=\"datapoint.c8y_Kpi\" [display]=\"'compact'\"></c8y-range-display>\n </div>\n </div>\n <div class=\"card-block\">\n <div class=\"col-sm-3 text-truncate\">\n <span>\n <label class=\"text-label-small m-r-4\" translate>Fragment</label>\n <span [title]=\"datapoint.c8y_Kpi?.fragment\">\n {{ datapoint.c8y_Kpi?.fragment }}\n </span>\n </span>\n </div>\n <div class=\"col-sm-2 text-truncate\">\n <label class=\"text-label-small m-r-4\" translate>Series</label>\n <span [title]=\"datapoint.c8y_Kpi?.series\">\n {{ datapoint.c8y_Kpi?.series }}\n </span>\n </div>\n <div class=\"col-sm-1 text-truncate card-hidden-grid\">\n <span *ngIf=\"datapoint.c8y_Kpi?.unit\">\n <label class=\"text-label-small m-r-4\" translate>Unit</label>\n <span [title]=\"datapoint.c8y_Kpi?.unit\">\n {{ datapoint.c8y_Kpi?.unit }}\n </span>\n </span>\n </div>\n <div class=\"col-sm-2 text-truncate\">\n <span *ngIf=\"datapoint.c8y_Kpi?.target\">\n <label class=\"text-label-small m-r-4\" translate>Target</label>\n <span [title]=\"datapoint.c8y_Kpi?.target\">\n {{ datapoint.c8y_Kpi?.target }}\n </span>\n </span>\n </div>\n <div class=\"col-sm-4 card-hidden-grid\">\n <c8y-range-display [config]=\"datapoint.c8y_Kpi\" [display]=\"'inline'\"></c8y-range-display>\n </div>\n </div>\n </div>\n </div>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport {\n CoreModule,\n gettext,\n hookNavigator,\n hookRoute,\n NavigatorNode,\n ViewContext\n} from '@c8y/ngx-components';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { DatapointLibraryDetailsComponent } from './datapoint-library-details/datapoint-library-details.component';\nimport { DatapointLibraryListComponent } from './datapoint-library-list.component';\nimport {\n DatapointLibraryOptions,\n DATAPOINT_LIBRARY_CONFIG,\n pathToDatapointLibrary\n} from './datapoint-library.model';\nimport { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';\n\n@NgModule({\n imports: [\n A11yModule,\n CoreModule,\n BsDropdownModule,\n PopoverModule,\n TooltipModule,\n DatapointSelectorModule\n ],\n declarations: [DatapointLibraryListComponent, DatapointLibraryDetailsComponent],\n exports: [DatapointLibraryListComponent, DatapointLibraryDetailsComponent]\n})\nexport class DatapointLibraryModule {\n static forRoot(\n config: DatapointLibraryOptions = {}\n ): ModuleWithProviders<DatapointLibraryModule> {\n return {\n ngModule: DatapointLibraryModule,\n providers: [\n hookRoute([\n {\n path: pathToDatapointLibrary,\n component: DatapointLibraryListComponent\n },\n {\n context: ViewContext.DatapointLibrary,\n path: 'details',\n component: DatapointLibraryDetailsComponent,\n label: gettext('Details'),\n icon: 'palette',\n priority: 500\n }\n ]),\n hookNavigator([\n new NavigatorNode({\n parent: gettext('Configuration'),\n label: gettext('Data point library'),\n featureId: 'dataPointLibrary',\n path: pathToDatapointLibrary,\n icon: 'c8y-data-points',\n routerLinkExact: false\n })\n ]),\n {\n provide: DATAPOINT_LIBRARY_CONFIG,\n useValue: config\n }\n ]\n };\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4","i8","i1","i2","i3","i5","i6","i7"],"mappings":"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"}
@@ -770,6 +770,9 @@ class AppStateService extends StateService {
770
770
  this.emitNewState();
771
771
  }
772
772
  showIncompatibleVersionsError() {
773
+ if (this.options.noVersionWarning) {
774
+ return;
775
+ }
773
776
  const uiVersion = this.state.versions.ui.ngx;
774
777
  const backendVersion = this.state.versions.backend;
775
778
  if (!satisfies(uiVersion, `<=${backendVersion} || ~${backendVersion}`)) {