@c8y/ngx-components 1023.57.0 → 1023.58.3
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.
- package/ai/agents/html/index.d.ts +6 -0
- package/ai/agents/html/index.d.ts.map +1 -0
- package/context-dashboard/index.d.ts +7 -3
- package/context-dashboard/index.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-ai-agents-html.mjs +1672 -0
- package/fesm2022/c8y-ngx-components-ai-agents-html.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +19 -5
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-map.mjs +241 -24
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget-ai-config.mjs +2 -1667
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget-ai-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +32 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +13 -13
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/locales/de.po +15 -6
- package/locales/es.po +15 -6
- package/locales/fr.po +15 -6
- package/locales/ja_JP.po +15 -6
- package/locales/ko.po +15 -6
- package/locales/locales.pot +6 -3
- package/locales/nl.po +15 -6
- package/locales/pl.po +15 -6
- package/locales/pt_BR.po +15 -6
- package/locales/zh_CN.po +15 -6
- package/locales/zh_TW.po +15 -6
- package/map/index.d.ts +66 -8
- package/map/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as i2 from '@angular/common';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
4
|
import { Input, Component, signal, computed, ViewChild, Inject, Optional } from '@angular/core';
|
|
5
5
|
import * as i1 from '@c8y/client';
|
|
6
|
-
import * as i2 from '@c8y/ngx-components';
|
|
6
|
+
import * as i2$1 from '@c8y/ngx-components';
|
|
7
7
|
import { C8yTranslateDirective, LoadingComponent, DatePipe, CommonModule as CommonModule$1, FormsModule as FormsModule$1, C8yTranslatePipe, DismissAlertStrategy, DynamicComponentAlert, AssetLinkPipe } from '@c8y/ngx-components';
|
|
8
|
-
import * as i6
|
|
8
|
+
import * as i6 from '@angular/forms';
|
|
9
9
|
import { NgForm, ControlContainer, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
10
10
|
import * as i4$1 from '@c8y/ngx-components/context-dashboard';
|
|
11
11
|
import { gettext } from '@c8y/ngx-components/gettext';
|
|
@@ -46,7 +46,7 @@ class MapEventInfoComponent {
|
|
|
46
46
|
this.loading = false;
|
|
47
47
|
}
|
|
48
48
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MapEventInfoComponent, deps: [{ token: i1.EventService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
49
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: MapEventInfoComponent, isStandalone: true, selector: "c8y-map-event-info", inputs: { asset: "asset" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"text-muted text-10 p-t-4 p-b-4\">\n <span translate>Last position update:</span>\n <br />\n <c8y-loading *ngIf=\"loading\"></c8y-loading>\n <ng-container *ngIf=\"!loading\">\n <i *ngIf=\"!event\" translate>No information found</i>\n <ng-container *ngIf=\"event\">\n <i>{{ event.time | c8yDate }}</i>\n <ng-content></ng-content>\n </ng-container>\n </ng-container>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type:
|
|
49
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: MapEventInfoComponent, isStandalone: true, selector: "c8y-map-event-info", inputs: { asset: "asset" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"text-muted text-10 p-t-4 p-b-4\">\n <span translate>Last position update:</span>\n <br />\n <c8y-loading *ngIf=\"loading\"></c8y-loading>\n <ng-container *ngIf=\"!loading\">\n <i *ngIf=\"!event\" translate>No information found</i>\n <ng-container *ngIf=\"event\">\n <i>{{ event.time | c8yDate }}</i>\n <ng-content></ng-content>\n </ng-container>\n </ng-container>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "pipe", type: DatePipe, name: "c8yDate" }] }); }
|
|
50
50
|
}
|
|
51
51
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MapEventInfoComponent, decorators: [{
|
|
52
52
|
type: Component,
|
|
@@ -242,8 +242,8 @@ class MapWidgetConfigComponent {
|
|
|
242
242
|
});
|
|
243
243
|
this.previewMap.addMarkerToMap(this.centerIcon);
|
|
244
244
|
}
|
|
245
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MapWidgetConfigComponent, deps: [{ token: i4.MapService }, { token: i2.AlertService }, { token: i3.TranslateService }, { token: MAP_DEFAULT_CONFIG }, { token: i4$1.WidgetConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
246
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MapWidgetConfigComponent, isStandalone: true, selector: "c8y-map-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMap", first: true, predicate: MapComponent, descendants: true }, { propertyName: "previewMapSet", first: true, predicate: ["previewMap"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (formConfig) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Map' | translate }}</legend>\n <div class=\"row tight-grid\">\n <div class=\"col-xs-3\">\n <c8y-form-group class=\"m-b-16 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div [ngClass]=\"{ 'col-xs-6': !isPositionedDevice(), 'col-xs-9': isPositionedDevice() }\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"0\"\n max=\"18\"\n step=\"1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n </c8y-range>\n </div>\n </div>\n @if (!isPositionedDevice()) {\n <div class=\"col-xs-3\">\n <c8y-form-group class=\"m-b-16 text-center form-group-sm\">\n <label translate>Fit to bounds</label>\n <div class=\"m-t-4 d-flex j-c-center\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n name=\"autoFitToBounds\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.autoFitToBounds\"\n (ngModelChange)=\"fitToBound()\"\n />\n <span></span>\n </label>\n <button\n class=\"btn-help\"\n aria-label=\"Help content\"\n [popover]=\"\n 'If enabled, the zoom level and center bound is always adjusted to fit all assets within the map view.'\n | translate\n \"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n </c8y-form-group>\n </div>\n }\n </div>\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n @if (canAutoCenter()) {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n } @else {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Fit to assets bounds' | translate\"\n [tooltip]=\"'Fit to assets bounds' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"fitToBounds()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"waypoint-map\"\n ></i>\n </button>\n }\n </div>\n </div>\n\n @if (!formConfig.autoFitToBounds) {\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n }\n </c8y-form-group>\n </fieldset>\n\n @if (isPositionedDevice()) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Follow' | translate }}</legend>\n <div class=\"row tight-grid d-flex a-i-center\">\n <div class=\"col-xs-12\">\n <div class=\"form-group form-group-sm m-b-16\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n </fieldset>\n }\n}\n\n<ng-template #previewMap>\n <div style=\"width: 100%; height: 100%\">\n @if (config.mapConfig) {\n <c8y-map\n [assets]=\"assets()\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6$1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6$1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6$1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule$1 }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i2.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i2.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.RangeDirective, selector: "input[type=\"range\"]" }, { kind: "component", type: i2.RangeComponent, selector: "c8y-range", inputs: ["valueDisplayMode"] }, { kind: "ngmodule", type: IconSelectorModule }, { kind: "component", type: i7.IconSelectorWrapperComponent, selector: "c8y-icon-selector-wrapper", inputs: ["canRemoveIcon", "selectedIcon", "iconSize"], outputs: ["onSelect"] }, { kind: "ngmodule", type: MapModule }, { kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i8.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i9.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
|
|
245
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MapWidgetConfigComponent, deps: [{ token: i4.MapService }, { token: i2$1.AlertService }, { token: i3.TranslateService }, { token: MAP_DEFAULT_CONFIG }, { token: i4$1.WidgetConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
246
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MapWidgetConfigComponent, isStandalone: true, selector: "c8y-map-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMap", first: true, predicate: MapComponent, descendants: true }, { propertyName: "previewMapSet", first: true, predicate: ["previewMap"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (formConfig) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Map' | translate }}</legend>\n <div class=\"row tight-grid\">\n <div class=\"col-xs-3\">\n <c8y-form-group class=\"m-b-16 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div [ngClass]=\"{ 'col-xs-6': !isPositionedDevice(), 'col-xs-9': isPositionedDevice() }\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"0\"\n max=\"18\"\n step=\"1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n </c8y-range>\n </div>\n </div>\n @if (!isPositionedDevice()) {\n <div class=\"col-xs-3\">\n <c8y-form-group class=\"m-b-16 text-center form-group-sm\">\n <label translate>Fit to bounds</label>\n <div class=\"m-t-4 d-flex j-c-center\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n name=\"autoFitToBounds\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.autoFitToBounds\"\n (ngModelChange)=\"fitToBound()\"\n />\n <span></span>\n </label>\n <button\n class=\"btn-help\"\n aria-label=\"Help content\"\n [popover]=\"\n 'If enabled, the zoom level and center bound is always adjusted to fit all assets within the map view.'\n | translate\n \"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n </c8y-form-group>\n </div>\n }\n </div>\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n @if (canAutoCenter()) {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n } @else {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Fit to assets bounds' | translate\"\n [tooltip]=\"'Fit to assets bounds' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"fitToBounds()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"waypoint-map\"\n ></i>\n </button>\n }\n </div>\n </div>\n\n @if (!formConfig.autoFitToBounds) {\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n }\n </c8y-form-group>\n </fieldset>\n\n @if (isPositionedDevice()) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Follow' | translate }}</legend>\n <div class=\"row tight-grid d-flex a-i-center\">\n <div class=\"col-xs-12\">\n <div class=\"form-group form-group-sm m-b-16\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n </fieldset>\n }\n}\n\n<ng-template #previewMap>\n <div style=\"width: 100%; height: 100%\">\n @if (config.mapConfig) {\n <c8y-map\n [assets]=\"assets()\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n }\n </div>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i6.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule$1 }, { kind: "directive", type: i2$1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2$1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i2$1.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i2$1.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "component", type: i2$1.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i2$1.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i2$1.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2$1.RangeDirective, selector: "input[type=\"range\"]" }, { kind: "component", type: i2$1.RangeComponent, selector: "c8y-range", inputs: ["valueDisplayMode"] }, { kind: "ngmodule", type: IconSelectorModule }, { kind: "component", type: i7.IconSelectorWrapperComponent, selector: "c8y-icon-selector-wrapper", inputs: ["canRemoveIcon", "selectedIcon", "iconSize"], outputs: ["onSelect"] }, { kind: "ngmodule", type: MapModule }, { kind: "component", type: i4.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i8.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i9.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "pipe", type: i2$1.C8yTranslatePipe, name: "translate" }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
|
|
247
247
|
}
|
|
248
248
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MapWidgetConfigComponent, decorators: [{
|
|
249
249
|
type: Component,
|
|
@@ -259,7 +259,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
259
259
|
PopoverModule,
|
|
260
260
|
C8yTranslatePipe
|
|
261
261
|
], template: "@if (formConfig) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Map' | translate }}</legend>\n <div class=\"row tight-grid\">\n <div class=\"col-xs-3\">\n <c8y-form-group class=\"m-b-16 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div [ngClass]=\"{ 'col-xs-6': !isPositionedDevice(), 'col-xs-9': isPositionedDevice() }\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"0\"\n max=\"18\"\n step=\"1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n </c8y-range>\n </div>\n </div>\n @if (!isPositionedDevice()) {\n <div class=\"col-xs-3\">\n <c8y-form-group class=\"m-b-16 text-center form-group-sm\">\n <label translate>Fit to bounds</label>\n <div class=\"m-t-4 d-flex j-c-center\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n name=\"autoFitToBounds\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.autoFitToBounds\"\n (ngModelChange)=\"fitToBound()\"\n />\n <span></span>\n </label>\n <button\n class=\"btn-help\"\n aria-label=\"Help content\"\n [popover]=\"\n 'If enabled, the zoom level and center bound is always adjusted to fit all assets within the map view.'\n | translate\n \"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n </c8y-form-group>\n </div>\n }\n </div>\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n @if (canAutoCenter()) {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n } @else {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Fit to assets bounds' | translate\"\n [tooltip]=\"'Fit to assets bounds' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"fitToBounds()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"waypoint-map\"\n ></i>\n </button>\n }\n </div>\n </div>\n\n @if (!formConfig.autoFitToBounds) {\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n }\n </c8y-form-group>\n </fieldset>\n\n @if (isPositionedDevice()) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Follow' | translate }}</legend>\n <div class=\"row tight-grid d-flex a-i-center\">\n <div class=\"col-xs-12\">\n <div class=\"form-group form-group-sm m-b-16\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n </fieldset>\n }\n}\n\n<ng-template #previewMap>\n <div style=\"width: 100%; height: 100%\">\n @if (config.mapConfig) {\n <c8y-map\n [assets]=\"assets()\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n }\n </div>\n</ng-template>\n" }]
|
|
262
|
-
}], ctorParameters: () => [{ type: i4.MapService }, { type: i2.AlertService }, { type: i3.TranslateService }, { type: i10.Observable, decorators: [{
|
|
262
|
+
}], ctorParameters: () => [{ type: i4.MapService }, { type: i2$1.AlertService }, { type: i3.TranslateService }, { type: i10.Observable, decorators: [{
|
|
263
263
|
type: Inject,
|
|
264
264
|
args: [MAP_DEFAULT_CONFIG]
|
|
265
265
|
}] }, { type: i4$1.WidgetConfigService }], propDecorators: { config: [{
|
|
@@ -412,8 +412,8 @@ class MapWidgetComponent {
|
|
|
412
412
|
}
|
|
413
413
|
}
|
|
414
414
|
}
|
|
415
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MapWidgetComponent, deps: [{ token: i2.DashboardChildComponent }, { token: i4$1.ContextDashboardComponent, optional: true }, { token: i1.InventoryService }, { token: i4.MapService }, { token: i2.WidgetsDashboardComponent, optional: true }, { token: i2.DynamicComponentService }, { token: i5.WidgetConfigMigrationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
416
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MapWidgetComponent, isStandalone: true, selector: "c8y-map-widget", inputs: { config: "config" }, viewQueries: [{ propertyName: "clusterMap", first: true, predicate: ClusterMapComponent, descendants: true }], ngImport: i0, template: "@if (mapConfig) {\n <c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n (fitAssetsToBounds)=\"fitToBounds()\"\n [assets]=\"assets\"\n [buttonsConfig]=\"{\n autoRefresh: { show: false },\n refresh: { show: false },\n realtime: { show: false },\n fitToBounds: { show: true }\n }\"\n >\n <c8y-global-context-widget-wrapper\n
|
|
415
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MapWidgetComponent, deps: [{ token: i2$1.DashboardChildComponent }, { token: i4$1.ContextDashboardComponent, optional: true }, { token: i1.InventoryService }, { token: i4.MapService }, { token: i2$1.WidgetsDashboardComponent, optional: true }, { token: i2$1.DynamicComponentService }, { token: i5.WidgetConfigMigrationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
416
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MapWidgetComponent, isStandalone: true, selector: "c8y-map-widget", inputs: { config: "config" }, viewQueries: [{ propertyName: "clusterMap", first: true, predicate: ClusterMapComponent, descendants: true }], ngImport: i0, template: "@if (mapConfig) {\n <c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n (fitAssetsToBounds)=\"fitToBounds()\"\n [assets]=\"assets\"\n [buttonsConfig]=\"{\n autoRefresh: { show: false },\n refresh: { show: false },\n realtime: { show: false },\n fitToBounds: { show: true }\n }\"\n >\n @if (controls) {\n <c8y-global-context-widget-wrapper\n [widgetControls]=\"controls\"\n [config]=\"config\"\n [isLoading]=\"mapWidget.isLoading$ | async\"\n (globalContextChange)=\"onGlobalContext($event)\"\n ></c8y-global-context-widget-wrapper>\n }\n </c8y-map-status>\n\n <c8y-cluster-map\n #mapWidget\n [rootNode]=\"rootNode\"\n [config]=\"mapConfig\"\n [asset]=\"assets\"\n >\n <div\n class=\"map-marker\"\n *c8yMapPopup=\"let context\"\n >\n <a\n class=\"text-truncate deviceLink text-12\"\n routerLink=\"{{ context | assetLink }}\"\n >\n @if (context.name) {\n <strong>{{ context.name }}</strong>\n } @else {\n <strong\n ngNonBindable\n translate\n [translateParams]=\"{ id: context.id }\"\n >\n Device {{ id }}\n </strong>\n }\n </a>\n <c8y-map-event-info [asset]=\"context\">\n @if (!mapConfig.follow) {\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Activate realtime on this asset and follow it if it moves' | translate\"\n type=\"button\"\n (click)=\"startFollow(context)\"\n translate\n >\n Follow\n </button>\n } @else {\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Stop following this asset.' | translate\"\n type=\"button\"\n (click)=\"stopFollow()\"\n translate\n >\n Unfollow\n </button>\n }\n </c8y-map-event-info>\n </div>\n </c8y-cluster-map>\n}\n", dependencies: [{ kind: "component", type: MapEventInfoComponent, selector: "c8y-map-event-info", inputs: ["asset"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: CommonModule$1 }, { kind: "directive", type: i2$1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: FormsModule$1 }, { kind: "ngmodule", type: IconSelectorModule }, { kind: "ngmodule", type: MapModule }, { kind: "component", type: i4.MapStatusComponent, selector: "c8y-map-status", inputs: ["config", "assets", "clusterMap", "buttonsConfig"], outputs: ["configChange", "onUnfollow", "fitAssetsToBounds"] }, { kind: "component", type: i4.ClusterMapComponent, selector: "c8y-cluster-map", inputs: ["config", "rootNode", "asset", "showClusterColor"], outputs: ["mapChange"] }, { kind: "directive", type: i4.MapPopupDirective, selector: "[c8yMapPopup]" }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: GlobalContextWidgetWrapperComponent, selector: "c8y-global-context-widget-wrapper", inputs: ["isLoading", "displayMode", "widgetControls", "controlLinks", "dashboardChildForLegacy", "config", "disableRefreshEmits"], outputs: ["globalContextChange"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i2$1.AssetLinkPipe, name: "assetLink" }] }); }
|
|
417
417
|
}
|
|
418
418
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MapWidgetComponent, decorators: [{
|
|
419
419
|
type: Component,
|
|
@@ -429,12 +429,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
429
429
|
TooltipModule,
|
|
430
430
|
RouterLink,
|
|
431
431
|
GlobalContextWidgetWrapperComponent
|
|
432
|
-
], template: "@if (mapConfig) {\n <c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n (fitAssetsToBounds)=\"fitToBounds()\"\n [assets]=\"assets\"\n [buttonsConfig]=\"{\n autoRefresh: { show: false },\n refresh: { show: false },\n realtime: { show: false },\n fitToBounds: { show: true }\n }\"\n >\n <c8y-global-context-widget-wrapper\n
|
|
433
|
-
}], ctorParameters: () => [{ type: i2.DashboardChildComponent }, { type: i4$1.ContextDashboardComponent, decorators: [{
|
|
432
|
+
], template: "@if (mapConfig) {\n <c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n (fitAssetsToBounds)=\"fitToBounds()\"\n [assets]=\"assets\"\n [buttonsConfig]=\"{\n autoRefresh: { show: false },\n refresh: { show: false },\n realtime: { show: false },\n fitToBounds: { show: true }\n }\"\n >\n @if (controls) {\n <c8y-global-context-widget-wrapper\n [widgetControls]=\"controls\"\n [config]=\"config\"\n [isLoading]=\"mapWidget.isLoading$ | async\"\n (globalContextChange)=\"onGlobalContext($event)\"\n ></c8y-global-context-widget-wrapper>\n }\n </c8y-map-status>\n\n <c8y-cluster-map\n #mapWidget\n [rootNode]=\"rootNode\"\n [config]=\"mapConfig\"\n [asset]=\"assets\"\n >\n <div\n class=\"map-marker\"\n *c8yMapPopup=\"let context\"\n >\n <a\n class=\"text-truncate deviceLink text-12\"\n routerLink=\"{{ context | assetLink }}\"\n >\n @if (context.name) {\n <strong>{{ context.name }}</strong>\n } @else {\n <strong\n ngNonBindable\n translate\n [translateParams]=\"{ id: context.id }\"\n >\n Device {{ id }}\n </strong>\n }\n </a>\n <c8y-map-event-info [asset]=\"context\">\n @if (!mapConfig.follow) {\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Activate realtime on this asset and follow it if it moves' | translate\"\n type=\"button\"\n (click)=\"startFollow(context)\"\n translate\n >\n Follow\n </button>\n } @else {\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Stop following this asset.' | translate\"\n type=\"button\"\n (click)=\"stopFollow()\"\n translate\n >\n Unfollow\n </button>\n }\n </c8y-map-event-info>\n </div>\n </c8y-cluster-map>\n}\n" }]
|
|
433
|
+
}], ctorParameters: () => [{ type: i2$1.DashboardChildComponent }, { type: i4$1.ContextDashboardComponent, decorators: [{
|
|
434
434
|
type: Optional
|
|
435
|
-
}] }, { type: i1.InventoryService }, { type: i4.MapService }, { type: i2.WidgetsDashboardComponent, decorators: [{
|
|
435
|
+
}] }, { type: i1.InventoryService }, { type: i4.MapService }, { type: i2$1.WidgetsDashboardComponent, decorators: [{
|
|
436
436
|
type: Optional
|
|
437
|
-
}] }, { type: i2.DynamicComponentService }, { type: i5.WidgetConfigMigrationService }], propDecorators: { config: [{
|
|
437
|
+
}] }, { type: i2$1.DynamicComponentService }, { type: i5.WidgetConfigMigrationService }], propDecorators: { config: [{
|
|
438
438
|
type: Input
|
|
439
439
|
}], clusterMap: [{
|
|
440
440
|
type: ViewChild,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-widgets-implementations-map.mjs","sources":["../../widgets/implementations/map/map-event-info.component.ts","../../widgets/implementations/map/map-event-info.component.html","../../widgets/implementations/map/map-widget-config.component.ts","../../widgets/implementations/map/map-widget-config.component.html","../../widgets/implementations/map/map-widget.component.ts","../../widgets/implementations/map/map-widget.component.html","../../widgets/implementations/map/c8y-ngx-components-widgets-implementations-map.ts"],"sourcesContent":["import { CommonModule as NgCommonModule } from '@angular/common';\nimport { Component, Input, OnChanges } from '@angular/core';\nimport { EventService, IEvent, IManagedObject } from '@c8y/client';\nimport { C8yTranslateDirective, DatePipe, LoadingComponent } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-map-event-info',\n templateUrl: './map-event-info.component.html',\n standalone: true,\n imports: [NgCommonModule, C8yTranslateDirective, DatePipe, LoadingComponent]\n})\nexport class MapEventInfoComponent implements OnChanges {\n @Input()\n asset: IManagedObject;\n\n loading = true;\n\n event: IEvent;\n\n constructor(private eventService: EventService) {}\n\n async ngOnChanges() {\n this.loading = true;\n const { data } = await this.eventService.list({\n dateFrom: '1970-01-01',\n dateTo: new Date(Date.now()).toISOString(),\n fragmentType: 'c8y_Position',\n pageSize: 1,\n source: this.asset.id\n });\n this.event = data[0];\n this.loading = false;\n }\n}\n","<div class=\"text-muted text-10 p-t-4 p-b-4\">\n <span translate>Last position update:</span>\n <br />\n <c8y-loading *ngIf=\"loading\"></c8y-loading>\n <ng-container *ngIf=\"!loading\">\n <i *ngIf=\"!event\" translate>No information found</i>\n <ng-container *ngIf=\"event\">\n <i>{{ event.time | c8yDate }}</i>\n <ng-content></ng-content>\n </ng-container>\n </ng-container>\n</div>\n","import { CommonModule as NgCommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n signal,\n SimpleChanges,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport {\n ControlContainer,\n NgForm,\n FormsModule as NgFormsModule,\n ReactiveFormsModule\n} from '@angular/forms';\nimport type { IIdentified } from '@c8y/client';\nimport { AlertService, C8yTranslatePipe, CommonModule, FormsModule } from '@c8y/ngx-components';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { GLOBAL_CONTEXT_DISPLAY_MODE, RefreshOption } from '@c8y/ngx-components/global-context';\nimport { IconSelectorModule } from '@c8y/ngx-components/icon-selector';\nimport {\n ClusterMapConfig,\n defaultFitBoundsOptions,\n MAP_DEFAULT_CONFIG,\n MapComponent,\n MapModule,\n MapService,\n PositionManagedObject\n} from '@c8y/ngx-components/map';\nimport type { MapDefaultConfig } from '@c8y/options';\nimport { TranslateService } from '@ngx-translate/core';\nimport type L from 'leaflet';\nimport { isUndefined } from 'lodash';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { fromEvent, Observable, Subject } from 'rxjs';\nimport { combineLatestWith, take, takeUntil } from 'rxjs/operators';\nimport { MapWidgetConfig } from './map-widget.model';\n\n@Component({\n selector: 'c8y-map-widget-config',\n templateUrl: './map-widget-config.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n standalone: true,\n imports: [\n NgCommonModule,\n NgFormsModule,\n CommonModule,\n FormsModule,\n IconSelectorModule,\n MapModule,\n TooltipModule,\n ReactiveFormsModule,\n PopoverModule,\n C8yTranslatePipe\n ]\n})\nexport class MapWidgetConfigComponent implements OnInit, OnChanges, OnDestroy {\n @Input() config: MapWidgetConfig = {\n mapConfig: undefined\n };\n formConfig: ClusterMapConfig;\n\n readonly device = signal<IIdentified | undefined>(undefined);\n readonly assets = signal<PositionManagedObject[]>([]);\n\n readonly canAutoCenter = computed(() => {\n const assetsList = this.assets();\n const deviceValue = this.device();\n\n const isSingleAsset = assetsList?.length === 1;\n const idMatchesDevice = deviceValue?.id === assetsList[0]?.id;\n\n if (isSingleAsset && idMatchesDevice) {\n return this.mapService.hasPosition(assetsList[0]);\n }\n return false;\n });\n\n readonly isPositionedDevice = computed(() => {\n const assetsList = this.assets();\n const deviceValue = this.device();\n\n const isSingleAsset = assetsList?.length === 1;\n const idMatchesDevice = deviceValue?.id === assetsList[0]?.id;\n\n if (isSingleAsset && idMatchesDevice) {\n return this.mapService.isPositionedDevice(assetsList[0]);\n }\n return false;\n });\n\n refreshOption: RefreshOption = 'live';\n\n private destroyed$ = new Subject<void>();\n private leaflet: typeof L;\n private centerIcon: L.Marker;\n // JS precision for floating point number is 15 for 64-bit and because of this provided to leaflet are recalculated\n // to values almost-like provided (e.g. 0 is recalculated to 1.46e-14; for 180 it's 180.00000000000003).\n // To ensure provided value has no floating point error, number needs to be rounded to fixed point 13.\n private readonly FIXED_POINT_DIGITS = 13;\n\n @ViewChild(MapComponent)\n previewMap: MapComponent;\n\n @ViewChild('previewMap')\n set previewMapSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n constructor(\n private mapService: MapService,\n private alertService: AlertService,\n private translateService: TranslateService,\n @Inject(MAP_DEFAULT_CONFIG) private defaultMapConfig: Observable<MapDefaultConfig>,\n private widgetConfigService: WidgetConfigService\n ) {}\n\n ngOnDestroy(): void {\n this.destroyed$.next();\n }\n\n ngOnInit() {\n this.device.set(this.config.device);\n\n this.defaultMapConfig.pipe(takeUntil(this.destroyed$)).subscribe(defaultConfig => {\n this.formConfig = {\n zoomLevel: defaultConfig.zoomLevel,\n center: defaultConfig.center\n };\n this.initForm();\n });\n }\n\n async fitToBound() {\n if (this.formConfig.autoFitToBounds) {\n const bounds = await this.mapService.getAssetsBounds(this.assets());\n this.previewMap.map.fitBounds(bounds, defaultFitBoundsOptions);\n }\n }\n\n async initForm() {\n if (!this.config.mapConfig) {\n this.config.mapConfig = this.formConfig;\n }\n\n this.formConfig = {\n ...this.formConfig,\n ...this.config.mapConfig,\n disablePan: false,\n displayMode: this.config.mapConfig?.displayMode ?? GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD,\n // Keep both in sync\n realtime:\n this.config.mapConfig?.isRealtimeEnabled ?? this.config.mapConfig?.realtime ?? false,\n refreshOption: this.config.mapConfig?.refreshOption,\n refreshInterval: this.config.mapConfig?.refreshInterval ?? 30_000\n };\n\n await this.updateAsset();\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (changes.config) {\n this.device.set(this.config.device);\n\n if (\n changes.config.currentValue !== changes.config.previousValue &&\n !changes.config.firstChange\n ) {\n await this.updateAsset();\n }\n }\n }\n\n previewMapInit(leaflet: typeof L): void {\n this.leaflet = leaflet;\n this.addCenterIcon(this.formConfig.center[0], this.formConfig.center[1]);\n }\n\n onBeforeSave() {\n this.config.mapConfig = this.formConfig;\n return true;\n }\n\n zoomLevelChanged() {\n this.config.mapConfig = {\n ...this.config.mapConfig,\n zoomLevel: this.formConfig.zoomLevel\n };\n }\n\n changeCenter() {\n if (this.centerIcon) {\n this.centerIcon.remove();\n }\n this.config.mapConfig = { ...this.formConfig, center: [...this.formConfig.center] };\n this.addCenterIcon(this.formConfig.center[0], this.formConfig.center[1]);\n }\n\n changeCenterOnEnterKey(event: KeyboardEvent): void {\n event.preventDefault();\n this.changeCenter();\n }\n\n onPreviewZoomStart() {\n this.centerIcon.remove();\n }\n\n onPreviewZoomEnd(event: L.LeafletEvent) {\n this.formConfig.zoomLevel = Math.floor(event.target.getZoom());\n }\n\n onPreviewMapMove(event: L.LeafletEvent) {\n if (this.centerIcon) {\n this.centerIcon.remove();\n }\n const { lat, lng } = event.target.getCenter();\n const fixedLat = +lat.toFixed(this.FIXED_POINT_DIGITS);\n const fixedLng = +lng.toFixed(this.FIXED_POINT_DIGITS);\n this.addCenterIcon(fixedLat, fixedLng);\n this.formConfig.center = [fixedLat, fixedLng];\n }\n\n useOwnPosition() {\n navigator.geolocation.getCurrentPosition(({ coords }) => {\n this.formConfig.center = [coords.latitude, coords.longitude];\n this.changeCenter();\n });\n }\n\n centerToAsset() {\n this.formConfig.center = [\n this.config.device.c8y_Position.lat,\n this.config.device.c8y_Position.lng\n ];\n this.changeCenter();\n }\n\n async fitToBounds() {\n const assetsList = this.assets();\n if (!assetsList?.length || !this.previewMap?.map) {\n return;\n }\n\n const bounds = await this.mapService.getAssetsBounds(assetsList);\n\n // map.fitBounds causes zoom and move events, so get new center and zoom level only when these events are finished\n fromEvent<L.LeafletEvent>(this.previewMap.map, 'moveend')\n .pipe(combineLatestWith(fromEvent<L.LeafletEvent>(this.previewMap.map, 'zoomend')), take(1))\n .subscribe(() => {\n const center = this.previewMap.map.getCenter();\n const zoom = this.previewMap.map.getZoom();\n\n const fixedLat = +center.lat.toFixed(this.FIXED_POINT_DIGITS);\n const fixedLng = +center.lng.toFixed(this.FIXED_POINT_DIGITS);\n this.formConfig.center = [fixedLat, fixedLng];\n this.formConfig.zoomLevel = Math.floor(zoom);\n\n this.changeCenter();\n });\n\n this.previewMap.map.fitBounds(bounds, defaultFitBoundsOptions);\n }\n\n selectIcon(icon: string) {\n this.formConfig.icon = icon;\n this.config.mapConfig.icon = icon;\n this.previewMap.refreshMarkers();\n }\n\n private async updateAsset() {\n const { data, paging } = await this.mapService.getAllPositionMOs(this.device());\n const onlyAssetsWithLatLng = data.filter(\n asset => !isUndefined(asset.c8y_Position?.lat) && !isUndefined(asset.c8y_Position?.lng)\n );\n\n this.assets.set(onlyAssetsWithLatLng);\n\n if (paging.totalPages > 1) {\n this.alertService.danger(\n gettext(\n 'It might be possible that assets are not shown in the preview, as the current selection has more than 500 assets and the preview only supports a maximum of 500 assets.'\n )\n );\n }\n }\n\n private addCenterIcon(lat: number, lng: number) {\n const titleText = this.translateService.instant(gettext('Map center'));\n const icon = this.leaflet.divIcon({\n html: `<i style=\"pointer-events: none\" class=\"c8y-map-marker-icon text-muted dlt-c8y-icon-target icon-2x\" title=\"${titleText}\" />`\n });\n this.centerIcon = this.leaflet.marker([lat, lng], {\n icon\n });\n this.previewMap.addMarkerToMap(this.centerIcon);\n }\n}\n","@if (formConfig) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Map' | translate }}</legend>\n <div class=\"row tight-grid\">\n <div class=\"col-xs-3\">\n <c8y-form-group class=\"m-b-16 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div [ngClass]=\"{ 'col-xs-6': !isPositionedDevice(), 'col-xs-9': isPositionedDevice() }\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"0\"\n max=\"18\"\n step=\"1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n </c8y-range>\n </div>\n </div>\n @if (!isPositionedDevice()) {\n <div class=\"col-xs-3\">\n <c8y-form-group class=\"m-b-16 text-center form-group-sm\">\n <label translate>Fit to bounds</label>\n <div class=\"m-t-4 d-flex j-c-center\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n name=\"autoFitToBounds\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.autoFitToBounds\"\n (ngModelChange)=\"fitToBound()\"\n />\n <span></span>\n </label>\n <button\n class=\"btn-help\"\n aria-label=\"Help content\"\n [popover]=\"\n 'If enabled, the zoom level and center bound is always adjusted to fit all assets within the map view.'\n | translate\n \"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n </c8y-form-group>\n </div>\n }\n </div>\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n @if (canAutoCenter()) {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n } @else {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Fit to assets bounds' | translate\"\n [tooltip]=\"'Fit to assets bounds' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"fitToBounds()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"waypoint-map\"\n ></i>\n </button>\n }\n </div>\n </div>\n\n @if (!formConfig.autoFitToBounds) {\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n }\n </c8y-form-group>\n </fieldset>\n\n @if (isPositionedDevice()) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Follow' | translate }}</legend>\n <div class=\"row tight-grid d-flex a-i-center\">\n <div class=\"col-xs-12\">\n <div class=\"form-group form-group-sm m-b-16\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n </fieldset>\n }\n}\n\n<ng-template #previewMap>\n <div style=\"width: 100%; height: 100%\">\n @if (config.mapConfig) {\n <c8y-map\n [assets]=\"assets()\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n }\n </div>\n</ng-template>\n","import { CommonModule as NgCommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild\n} from '@angular/core';\nimport { FormsModule as NgFormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\nimport { IIdentified, InventoryService } from '@c8y/client';\nimport {\n AssetLinkPipe,\n CommonModule,\n DashboardChildComponent,\n DismissAlertStrategy,\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n DynamicComponentService,\n FormsModule,\n WidgetsDashboardComponent\n} from '@c8y/ngx-components';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GlobalContextWidgetWrapperComponent,\n WidgetConfigMigrationService,\n WidgetControls\n} from '@c8y/ngx-components/global-context';\nimport { IconSelectorModule } from '@c8y/ngx-components/icon-selector';\nimport {\n ClusterMapComponent,\n ClusterMapConfig,\n defaultFitBoundsOptions,\n MapModule,\n MapService,\n PositionManagedObject\n} from '@c8y/ngx-components/map';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { debounce, merge } from 'lodash-es';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { Subject } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport { MapEventInfoComponent } from './map-event-info.component';\nimport { MapWidgetConfig } from './map-widget.model';\n\n@Component({\n selector: 'c8y-map-widget',\n templateUrl: './map-widget.component.html',\n standalone: true,\n imports: [\n MapEventInfoComponent,\n NgCommonModule,\n NgFormsModule,\n CommonModule,\n FormsModule,\n IconSelectorModule,\n MapModule,\n AssetLinkPipe,\n TooltipModule,\n RouterLink,\n GlobalContextWidgetWrapperComponent\n ]\n})\nexport class MapWidgetComponent implements OnInit, OnDestroy, AfterViewInit, DynamicComponent {\n mapConfig: ClusterMapConfig = { center: [0, 0] };\n rootNode: IIdentified;\n @Input() config: MapWidgetConfig;\n\n @ViewChild(ClusterMapComponent)\n clusterMap: ClusterMapComponent;\n alerts: DynamicComponentAlertAggregator;\n assets: PositionManagedObject[];\n\n private TIMEOUT_ERROR_TEXT = gettext(\n 'The request is taking longer than usual. We apologize for the inconvenience.'\n );\n private SERVER_ERROR_TEXT = gettext('Server error occurred.');\n private savedNode: IIdentified;\n private destroy$ = new Subject<void>();\n private resizeObserver: ResizeObserver;\n controls: WidgetControls;\n\n constructor(\n dashboardChild: DashboardChildComponent,\n @Optional() private dashboardContextComponent: ContextDashboardComponent,\n private inventory: InventoryService,\n private mapService: MapService,\n @Optional() private widgetsDashboardComponent: WidgetsDashboardComponent,\n private dynamicComponentService: DynamicComponentService,\n private widgetConfigMigrationService: WidgetConfigMigrationService\n ) {\n this.listenToWidgetResizeEvent(dashboardChild);\n }\n\n async ngOnInit() {\n this.alerts.setAlertGroupDismissStrategy(\n 'warning',\n DismissAlertStrategy.TEMPORARY_OR_PERMANENT\n );\n\n await this.applyDeviceTypeTarget();\n\n if (this.config.device) {\n this.rootNode = this.config.device;\n }\n this.mapConfig = { ...this.config.mapConfig };\n\n // Check for legacy widget BEFORE updateMapConfigRealtime() overwrites it\n const isLegacyWidgetWithRealtime =\n !this.config.hasOwnProperty('displayMode') && this.mapConfig.realtime;\n\n this.updateMapConfigRealtime();\n this.savedNode = this.rootNode;\n await this.updateAssets();\n\n const migratedConfig = this.widgetConfigMigrationService.migrateWidgetConfig(this.config);\n this.config = merge(this.config, migratedConfig);\n\n // For legacy widgets (with realtime), set displayMode to 'view_and_config' to maintain previous behavior to some degree\n // TODO: adjust widgetConfigMigrationService.migrateWidgetConfig or do nothing.\n // Map widget is a special case since it blocks auto-refresh in the config live mode.\n if (isLegacyWidgetWithRealtime) {\n this.config.displayMode = GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG;\n }\n\n if (this.assets.length > 1) {\n this.mapConfig = {\n ...this.mapConfig,\n follow: false\n };\n }\n\n this.controls =\n (await this.dynamicComponentService.getById(defaultWidgetIds.MAP)).data?.widgetControls || {};\n }\n\n ngAfterViewInit(): void {\n this.subscribeToErrorsOccurred();\n\n if (this.widgetsDashboardComponent) {\n const resizeCallback = debounce(() => {\n // initial size of map is assigned when left drawer is closed, but if it is opened after initialization\n // the map size is not updated, so we need to call invalidateSize so that map use the correct size\n this.clusterMap.map?.invalidateSize(false);\n }, 100);\n this.resizeObserver = new ResizeObserver(resizeCallback);\n\n this.resizeObserver.observe(this.widgetsDashboardComponent.nativeElement);\n }\n }\n\n startFollow(context) {\n if (context.id !== this.rootNode?.id) {\n this.rootNode = context;\n }\n\n this.mapConfig = {\n ...this.mapConfig,\n follow: true\n };\n }\n\n stopFollow() {\n this.mapConfig = {\n ...this.mapConfig,\n follow: false\n };\n this.rootNode = this.savedNode;\n }\n\n ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n this.destroy$.next();\n }\n\n async fitToBounds() {\n await this.updateAssets();\n if (this.assets.length === 0 || !this.clusterMap?.map) {\n return;\n }\n\n const bounds = await this.mapService.getAssetsBounds(this.assets);\n\n this.clusterMap.map.fitBounds(bounds, defaultFitBoundsOptions);\n }\n\n async onGlobalContext(event) {\n const { context } = event;\n\n const isRealtime = this.mapConfig.realtime;\n if (!isRealtime && context.isAutoRefreshEnabled) {\n // If follow is enabled, fetch latest position and center map before reload\n if (this.mapConfig.follow && this.config.device?.c8y_Position) {\n await this.updateAssets();\n if (this.assets?.length === 1) {\n // Update clusterMap's asset so marker can be rendered even if cluster query returns 0 positions\n (this.clusterMap as any).assets = this.assets[0];\n this.clusterMap?.moveToPositionOfMo(this.assets[0]);\n // Prevent cluster subscription from re-centering to same position\n const pos = this.assets[0].c8y_Position;\n (this.clusterMap as any).lastFollowedPosition = { lat: pos.lat, lng: pos.lng };\n }\n }\n\n this.clusterMap?.reload();\n }\n }\n\n private async updateAssets() {\n this.assets = (await this.mapService.getAllPositionMOs(this.config.device)).data;\n }\n\n private listenToWidgetResizeEvent(dashboardChild: DashboardChildComponent) {\n dashboardChild.changeEnd\n .pipe(\n filter(child => child.lastChange === 'resize'),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.clusterMap.reset();\n });\n }\n\n private subscribeToErrorsOccurred() {\n this.clusterMap.errorNotifier\n .pipe(filter(Boolean), takeUntil(this.destroy$))\n .subscribe(error => {\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n type: 'warning',\n text:\n error?.name === 'TimeoutError'\n ? this.TIMEOUT_ERROR_TEXT\n : (error?.message ?? this.SERVER_ERROR_TEXT)\n })\n );\n });\n }\n\n private updateMapConfigRealtime() {\n this.mapConfig.realtime = this.config.realtime || false;\n }\n\n private async applyDeviceTypeTarget() {\n const hasDeviceTarget = !!this.config.device; // The map widget supports not selecting any target\n const isDeviceTypeDashboard = !!this.dashboardContextComponent?.dashboard?.deviceType;\n if (isDeviceTypeDashboard && hasDeviceTarget) {\n const context = this.dashboardContextComponent.context;\n if (context?.id) {\n const { id } = context;\n this.config.device = (await this.inventory.detail(id)).data;\n }\n }\n }\n}\n","@if (mapConfig) {\n <c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n (fitAssetsToBounds)=\"fitToBounds()\"\n [assets]=\"assets\"\n [buttonsConfig]=\"{\n autoRefresh: { show: false },\n refresh: { show: false },\n realtime: { show: false },\n fitToBounds: { show: true }\n }\"\n >\n <c8y-global-context-widget-wrapper\n *ngIf=\"controls\"\n [widgetControls]=\"controls\"\n [config]=\"config\"\n [isLoading]=\"mapWidget.isLoading$ | async\"\n (globalContextChange)=\"onGlobalContext($event)\"\n ></c8y-global-context-widget-wrapper>\n </c8y-map-status>\n\n <c8y-cluster-map\n #mapWidget\n [rootNode]=\"rootNode\"\n [config]=\"mapConfig\"\n [asset]=\"assets\"\n >\n <div\n class=\"map-marker\"\n *c8yMapPopup=\"let context\"\n >\n <a\n class=\"text-truncate deviceLink text-12\"\n routerLink=\"{{ context | assetLink }}\"\n >\n <strong>{{ context.name }}</strong>\n </a>\n <c8y-map-event-info [asset]=\"context\">\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Activate realtime on this asset and follow it if it moves' | translate\"\n type=\"button\"\n (click)=\"startFollow(context)\"\n *ngIf=\"!mapConfig.follow\"\n translate\n >\n Follow\n </button>\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Stop following this asset.' | translate\"\n type=\"button\"\n (click)=\"stopFollow()\"\n *ngIf=\"mapConfig.follow\"\n translate\n >\n Unfollow\n </button>\n </c8y-map-event-info>\n </div>\n </c8y-cluster-map>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["NgCommonModule","i4","i5","NgFormsModule","i6","CommonModule","FormsModule","i1","i2","i3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-widgets-implementations-map.mjs","sources":["../../widgets/implementations/map/map-event-info.component.ts","../../widgets/implementations/map/map-event-info.component.html","../../widgets/implementations/map/map-widget-config.component.ts","../../widgets/implementations/map/map-widget-config.component.html","../../widgets/implementations/map/map-widget.component.ts","../../widgets/implementations/map/map-widget.component.html","../../widgets/implementations/map/c8y-ngx-components-widgets-implementations-map.ts"],"sourcesContent":["import { CommonModule as NgCommonModule } from '@angular/common';\nimport { Component, Input, OnChanges } from '@angular/core';\nimport { EventService, IEvent, IManagedObject } from '@c8y/client';\nimport { C8yTranslateDirective, DatePipe, LoadingComponent } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-map-event-info',\n templateUrl: './map-event-info.component.html',\n standalone: true,\n imports: [NgCommonModule, C8yTranslateDirective, DatePipe, LoadingComponent]\n})\nexport class MapEventInfoComponent implements OnChanges {\n @Input()\n asset: IManagedObject;\n\n loading = true;\n\n event: IEvent;\n\n constructor(private eventService: EventService) {}\n\n async ngOnChanges() {\n this.loading = true;\n const { data } = await this.eventService.list({\n dateFrom: '1970-01-01',\n dateTo: new Date(Date.now()).toISOString(),\n fragmentType: 'c8y_Position',\n pageSize: 1,\n source: this.asset.id\n });\n this.event = data[0];\n this.loading = false;\n }\n}\n","<div class=\"text-muted text-10 p-t-4 p-b-4\">\n <span translate>Last position update:</span>\n <br />\n <c8y-loading *ngIf=\"loading\"></c8y-loading>\n <ng-container *ngIf=\"!loading\">\n <i *ngIf=\"!event\" translate>No information found</i>\n <ng-container *ngIf=\"event\">\n <i>{{ event.time | c8yDate }}</i>\n <ng-content></ng-content>\n </ng-container>\n </ng-container>\n</div>\n","import { CommonModule as NgCommonModule } from '@angular/common';\nimport {\n Component,\n computed,\n Inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n signal,\n SimpleChanges,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport {\n ControlContainer,\n NgForm,\n FormsModule as NgFormsModule,\n ReactiveFormsModule\n} from '@angular/forms';\nimport type { IIdentified } from '@c8y/client';\nimport { AlertService, C8yTranslatePipe, CommonModule, FormsModule } from '@c8y/ngx-components';\nimport { WidgetConfigService } from '@c8y/ngx-components/context-dashboard';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { GLOBAL_CONTEXT_DISPLAY_MODE, RefreshOption } from '@c8y/ngx-components/global-context';\nimport { IconSelectorModule } from '@c8y/ngx-components/icon-selector';\nimport {\n ClusterMapConfig,\n defaultFitBoundsOptions,\n MAP_DEFAULT_CONFIG,\n MapComponent,\n MapModule,\n MapService,\n PositionManagedObject\n} from '@c8y/ngx-components/map';\nimport type { MapDefaultConfig } from '@c8y/options';\nimport { TranslateService } from '@ngx-translate/core';\nimport type L from 'leaflet';\nimport { isUndefined } from 'lodash';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { fromEvent, Observable, Subject } from 'rxjs';\nimport { combineLatestWith, take, takeUntil } from 'rxjs/operators';\nimport { MapWidgetConfig } from './map-widget.model';\n\n@Component({\n selector: 'c8y-map-widget-config',\n templateUrl: './map-widget-config.component.html',\n viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n standalone: true,\n imports: [\n NgCommonModule,\n NgFormsModule,\n CommonModule,\n FormsModule,\n IconSelectorModule,\n MapModule,\n TooltipModule,\n ReactiveFormsModule,\n PopoverModule,\n C8yTranslatePipe\n ]\n})\nexport class MapWidgetConfigComponent implements OnInit, OnChanges, OnDestroy {\n @Input() config: MapWidgetConfig = {\n mapConfig: undefined\n };\n formConfig: ClusterMapConfig;\n\n readonly device = signal<IIdentified | undefined>(undefined);\n readonly assets = signal<PositionManagedObject[]>([]);\n\n readonly canAutoCenter = computed(() => {\n const assetsList = this.assets();\n const deviceValue = this.device();\n\n const isSingleAsset = assetsList?.length === 1;\n const idMatchesDevice = deviceValue?.id === assetsList[0]?.id;\n\n if (isSingleAsset && idMatchesDevice) {\n return this.mapService.hasPosition(assetsList[0]);\n }\n return false;\n });\n\n readonly isPositionedDevice = computed(() => {\n const assetsList = this.assets();\n const deviceValue = this.device();\n\n const isSingleAsset = assetsList?.length === 1;\n const idMatchesDevice = deviceValue?.id === assetsList[0]?.id;\n\n if (isSingleAsset && idMatchesDevice) {\n return this.mapService.isPositionedDevice(assetsList[0]);\n }\n return false;\n });\n\n refreshOption: RefreshOption = 'live';\n\n private destroyed$ = new Subject<void>();\n private leaflet: typeof L;\n private centerIcon: L.Marker;\n // JS precision for floating point number is 15 for 64-bit and because of this provided to leaflet are recalculated\n // to values almost-like provided (e.g. 0 is recalculated to 1.46e-14; for 180 it's 180.00000000000003).\n // To ensure provided value has no floating point error, number needs to be rounded to fixed point 13.\n private readonly FIXED_POINT_DIGITS = 13;\n\n @ViewChild(MapComponent)\n previewMap: MapComponent;\n\n @ViewChild('previewMap')\n set previewMapSet(template: TemplateRef<any>) {\n if (template) {\n this.widgetConfigService.setPreview(template);\n return;\n }\n this.widgetConfigService.setPreview(null);\n }\n\n constructor(\n private mapService: MapService,\n private alertService: AlertService,\n private translateService: TranslateService,\n @Inject(MAP_DEFAULT_CONFIG) private defaultMapConfig: Observable<MapDefaultConfig>,\n private widgetConfigService: WidgetConfigService\n ) {}\n\n ngOnDestroy(): void {\n this.destroyed$.next();\n }\n\n ngOnInit() {\n this.device.set(this.config.device);\n\n this.defaultMapConfig.pipe(takeUntil(this.destroyed$)).subscribe(defaultConfig => {\n this.formConfig = {\n zoomLevel: defaultConfig.zoomLevel,\n center: defaultConfig.center\n };\n this.initForm();\n });\n }\n\n async fitToBound() {\n if (this.formConfig.autoFitToBounds) {\n const bounds = await this.mapService.getAssetsBounds(this.assets());\n this.previewMap.map.fitBounds(bounds, defaultFitBoundsOptions);\n }\n }\n\n async initForm() {\n if (!this.config.mapConfig) {\n this.config.mapConfig = this.formConfig;\n }\n\n this.formConfig = {\n ...this.formConfig,\n ...this.config.mapConfig,\n disablePan: false,\n displayMode: this.config.mapConfig?.displayMode ?? GLOBAL_CONTEXT_DISPLAY_MODE.DASHBOARD,\n // Keep both in sync\n realtime:\n this.config.mapConfig?.isRealtimeEnabled ?? this.config.mapConfig?.realtime ?? false,\n refreshOption: this.config.mapConfig?.refreshOption,\n refreshInterval: this.config.mapConfig?.refreshInterval ?? 30_000\n };\n\n await this.updateAsset();\n }\n\n async ngOnChanges(changes: SimpleChanges) {\n if (changes.config) {\n this.device.set(this.config.device);\n\n if (\n changes.config.currentValue !== changes.config.previousValue &&\n !changes.config.firstChange\n ) {\n await this.updateAsset();\n }\n }\n }\n\n previewMapInit(leaflet: typeof L): void {\n this.leaflet = leaflet;\n this.addCenterIcon(this.formConfig.center[0], this.formConfig.center[1]);\n }\n\n onBeforeSave() {\n this.config.mapConfig = this.formConfig;\n return true;\n }\n\n zoomLevelChanged() {\n this.config.mapConfig = {\n ...this.config.mapConfig,\n zoomLevel: this.formConfig.zoomLevel\n };\n }\n\n changeCenter() {\n if (this.centerIcon) {\n this.centerIcon.remove();\n }\n this.config.mapConfig = { ...this.formConfig, center: [...this.formConfig.center] };\n this.addCenterIcon(this.formConfig.center[0], this.formConfig.center[1]);\n }\n\n changeCenterOnEnterKey(event: KeyboardEvent): void {\n event.preventDefault();\n this.changeCenter();\n }\n\n onPreviewZoomStart() {\n this.centerIcon.remove();\n }\n\n onPreviewZoomEnd(event: L.LeafletEvent) {\n this.formConfig.zoomLevel = Math.floor(event.target.getZoom());\n }\n\n onPreviewMapMove(event: L.LeafletEvent) {\n if (this.centerIcon) {\n this.centerIcon.remove();\n }\n const { lat, lng } = event.target.getCenter();\n const fixedLat = +lat.toFixed(this.FIXED_POINT_DIGITS);\n const fixedLng = +lng.toFixed(this.FIXED_POINT_DIGITS);\n this.addCenterIcon(fixedLat, fixedLng);\n this.formConfig.center = [fixedLat, fixedLng];\n }\n\n useOwnPosition() {\n navigator.geolocation.getCurrentPosition(({ coords }) => {\n this.formConfig.center = [coords.latitude, coords.longitude];\n this.changeCenter();\n });\n }\n\n centerToAsset() {\n this.formConfig.center = [\n this.config.device.c8y_Position.lat,\n this.config.device.c8y_Position.lng\n ];\n this.changeCenter();\n }\n\n async fitToBounds() {\n const assetsList = this.assets();\n if (!assetsList?.length || !this.previewMap?.map) {\n return;\n }\n\n const bounds = await this.mapService.getAssetsBounds(assetsList);\n\n // map.fitBounds causes zoom and move events, so get new center and zoom level only when these events are finished\n fromEvent<L.LeafletEvent>(this.previewMap.map, 'moveend')\n .pipe(combineLatestWith(fromEvent<L.LeafletEvent>(this.previewMap.map, 'zoomend')), take(1))\n .subscribe(() => {\n const center = this.previewMap.map.getCenter();\n const zoom = this.previewMap.map.getZoom();\n\n const fixedLat = +center.lat.toFixed(this.FIXED_POINT_DIGITS);\n const fixedLng = +center.lng.toFixed(this.FIXED_POINT_DIGITS);\n this.formConfig.center = [fixedLat, fixedLng];\n this.formConfig.zoomLevel = Math.floor(zoom);\n\n this.changeCenter();\n });\n\n this.previewMap.map.fitBounds(bounds, defaultFitBoundsOptions);\n }\n\n selectIcon(icon: string) {\n this.formConfig.icon = icon;\n this.config.mapConfig.icon = icon;\n this.previewMap.refreshMarkers();\n }\n\n private async updateAsset() {\n const { data, paging } = await this.mapService.getAllPositionMOs(this.device());\n const onlyAssetsWithLatLng = data.filter(\n asset => !isUndefined(asset.c8y_Position?.lat) && !isUndefined(asset.c8y_Position?.lng)\n );\n\n this.assets.set(onlyAssetsWithLatLng);\n\n if (paging.totalPages > 1) {\n this.alertService.danger(\n gettext(\n 'It might be possible that assets are not shown in the preview, as the current selection has more than 500 assets and the preview only supports a maximum of 500 assets.'\n )\n );\n }\n }\n\n private addCenterIcon(lat: number, lng: number) {\n const titleText = this.translateService.instant(gettext('Map center'));\n const icon = this.leaflet.divIcon({\n html: `<i style=\"pointer-events: none\" class=\"c8y-map-marker-icon text-muted dlt-c8y-icon-target icon-2x\" title=\"${titleText}\" />`\n });\n this.centerIcon = this.leaflet.marker([lat, lng], {\n icon\n });\n this.previewMap.addMarkerToMap(this.centerIcon);\n }\n}\n","@if (formConfig) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Map' | translate }}</legend>\n <div class=\"row tight-grid\">\n <div class=\"col-xs-3\">\n <c8y-form-group class=\"m-b-16 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div [ngClass]=\"{ 'col-xs-6': !isPositionedDevice(), 'col-xs-9': isPositionedDevice() }\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"0\"\n max=\"18\"\n step=\"1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n </c8y-range>\n </div>\n </div>\n @if (!isPositionedDevice()) {\n <div class=\"col-xs-3\">\n <c8y-form-group class=\"m-b-16 text-center form-group-sm\">\n <label translate>Fit to bounds</label>\n <div class=\"m-t-4 d-flex j-c-center\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n name=\"autoFitToBounds\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.autoFitToBounds\"\n (ngModelChange)=\"fitToBound()\"\n />\n <span></span>\n </label>\n <button\n class=\"btn-help\"\n aria-label=\"Help content\"\n [popover]=\"\n 'If enabled, the zoom level and center bound is always adjusted to fit all assets within the map view.'\n | translate\n \"\n placement=\"top\"\n triggers=\"focus\"\n container=\"body\"\n type=\"button\"\n ></button>\n </div>\n </c8y-form-group>\n </div>\n }\n </div>\n <c8y-form-group class=\"form-group-sm\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n @if (canAutoCenter()) {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n } @else {\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Fit to assets bounds' | translate\"\n [tooltip]=\"'Fit to assets bounds' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"fitToBounds()\"\n [disabled]=\"!isPositionedDevice() && formConfig.autoFitToBounds\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"waypoint-map\"\n ></i>\n </button>\n }\n </div>\n </div>\n\n @if (!formConfig.autoFitToBounds) {\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n }\n </c8y-form-group>\n </fieldset>\n\n @if (isPositionedDevice()) {\n <fieldset class=\"c8y-fieldset\">\n <legend>{{ 'Follow' | translate }}</legend>\n <div class=\"row tight-grid d-flex a-i-center\">\n <div class=\"col-xs-12\">\n <div class=\"form-group form-group-sm m-b-16\">\n <label class=\"c8y-switch c8y-switch--inline\">\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n </fieldset>\n }\n}\n\n<ng-template #previewMap>\n <div style=\"width: 100%; height: 100%\">\n @if (config.mapConfig) {\n <c8y-map\n [assets]=\"assets()\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n }\n </div>\n</ng-template>\n","import { CommonModule as NgCommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Optional,\n ViewChild\n} from '@angular/core';\nimport { FormsModule as NgFormsModule } from '@angular/forms';\nimport { RouterLink } from '@angular/router';\nimport { IIdentified, InventoryService } from '@c8y/client';\nimport {\n AssetLinkPipe,\n CommonModule,\n DashboardChildComponent,\n DismissAlertStrategy,\n DynamicComponent,\n DynamicComponentAlert,\n DynamicComponentAlertAggregator,\n DynamicComponentService,\n FormsModule,\n WidgetsDashboardComponent\n} from '@c8y/ngx-components';\nimport { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n GLOBAL_CONTEXT_DISPLAY_MODE,\n GlobalContextWidgetWrapperComponent,\n WidgetConfigMigrationService,\n WidgetControls\n} from '@c8y/ngx-components/global-context';\nimport { IconSelectorModule } from '@c8y/ngx-components/icon-selector';\nimport {\n ClusterMapComponent,\n ClusterMapConfig,\n defaultFitBoundsOptions,\n MapModule,\n MapService,\n PositionManagedObject\n} from '@c8y/ngx-components/map';\nimport { defaultWidgetIds } from '@c8y/ngx-components/widgets/definitions';\nimport { debounce, merge } from 'lodash-es';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { Subject } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport { MapEventInfoComponent } from './map-event-info.component';\nimport { MapWidgetConfig } from './map-widget.model';\n\n@Component({\n selector: 'c8y-map-widget',\n templateUrl: './map-widget.component.html',\n standalone: true,\n imports: [\n MapEventInfoComponent,\n NgCommonModule,\n NgFormsModule,\n CommonModule,\n FormsModule,\n IconSelectorModule,\n MapModule,\n AssetLinkPipe,\n TooltipModule,\n RouterLink,\n GlobalContextWidgetWrapperComponent\n ]\n})\nexport class MapWidgetComponent implements OnInit, OnDestroy, AfterViewInit, DynamicComponent {\n mapConfig: ClusterMapConfig = { center: [0, 0] };\n rootNode: IIdentified;\n @Input() config: MapWidgetConfig;\n\n @ViewChild(ClusterMapComponent)\n clusterMap: ClusterMapComponent;\n alerts: DynamicComponentAlertAggregator;\n assets: PositionManagedObject[];\n\n private TIMEOUT_ERROR_TEXT = gettext(\n 'The request is taking longer than usual. We apologize for the inconvenience.'\n );\n private SERVER_ERROR_TEXT = gettext('Server error occurred.');\n private savedNode: IIdentified;\n private destroy$ = new Subject<void>();\n private resizeObserver: ResizeObserver;\n controls: WidgetControls;\n\n constructor(\n dashboardChild: DashboardChildComponent,\n @Optional() private dashboardContextComponent: ContextDashboardComponent,\n private inventory: InventoryService,\n private mapService: MapService,\n @Optional() private widgetsDashboardComponent: WidgetsDashboardComponent,\n private dynamicComponentService: DynamicComponentService,\n private widgetConfigMigrationService: WidgetConfigMigrationService\n ) {\n this.listenToWidgetResizeEvent(dashboardChild);\n }\n\n async ngOnInit() {\n this.alerts.setAlertGroupDismissStrategy(\n 'warning',\n DismissAlertStrategy.TEMPORARY_OR_PERMANENT\n );\n\n await this.applyDeviceTypeTarget();\n\n if (this.config.device) {\n this.rootNode = this.config.device;\n }\n this.mapConfig = { ...this.config.mapConfig };\n\n // Check for legacy widget BEFORE updateMapConfigRealtime() overwrites it\n const isLegacyWidgetWithRealtime =\n !this.config.hasOwnProperty('displayMode') && this.mapConfig.realtime;\n\n this.updateMapConfigRealtime();\n this.savedNode = this.rootNode;\n await this.updateAssets();\n\n const migratedConfig = this.widgetConfigMigrationService.migrateWidgetConfig(this.config);\n this.config = merge(this.config, migratedConfig);\n\n // For legacy widgets (with realtime), set displayMode to 'view_and_config' to maintain previous behavior to some degree\n // TODO: adjust widgetConfigMigrationService.migrateWidgetConfig or do nothing.\n // Map widget is a special case since it blocks auto-refresh in the config live mode.\n if (isLegacyWidgetWithRealtime) {\n this.config.displayMode = GLOBAL_CONTEXT_DISPLAY_MODE.VIEW_AND_CONFIG;\n }\n\n if (this.assets.length > 1) {\n this.mapConfig = {\n ...this.mapConfig,\n follow: false\n };\n }\n\n this.controls =\n (await this.dynamicComponentService.getById(defaultWidgetIds.MAP)).data?.widgetControls || {};\n }\n\n ngAfterViewInit(): void {\n this.subscribeToErrorsOccurred();\n\n if (this.widgetsDashboardComponent) {\n const resizeCallback = debounce(() => {\n // initial size of map is assigned when left drawer is closed, but if it is opened after initialization\n // the map size is not updated, so we need to call invalidateSize so that map use the correct size\n this.clusterMap.map?.invalidateSize(false);\n }, 100);\n this.resizeObserver = new ResizeObserver(resizeCallback);\n\n this.resizeObserver.observe(this.widgetsDashboardComponent.nativeElement);\n }\n }\n\n startFollow(context) {\n if (context.id !== this.rootNode?.id) {\n this.rootNode = context;\n }\n\n this.mapConfig = {\n ...this.mapConfig,\n follow: true\n };\n }\n\n stopFollow() {\n this.mapConfig = {\n ...this.mapConfig,\n follow: false\n };\n this.rootNode = this.savedNode;\n }\n\n ngOnDestroy(): void {\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n this.destroy$.next();\n }\n\n async fitToBounds() {\n await this.updateAssets();\n if (this.assets.length === 0 || !this.clusterMap?.map) {\n return;\n }\n\n const bounds = await this.mapService.getAssetsBounds(this.assets);\n\n this.clusterMap.map.fitBounds(bounds, defaultFitBoundsOptions);\n }\n\n async onGlobalContext(event) {\n const { context } = event;\n\n const isRealtime = this.mapConfig.realtime;\n if (!isRealtime && context.isAutoRefreshEnabled) {\n // If follow is enabled, fetch latest position and center map before reload\n if (this.mapConfig.follow && this.config.device?.c8y_Position) {\n await this.updateAssets();\n if (this.assets?.length === 1) {\n // Update clusterMap's asset so marker can be rendered even if cluster query returns 0 positions\n (this.clusterMap as any).assets = this.assets[0];\n this.clusterMap?.moveToPositionOfMo(this.assets[0]);\n // Prevent cluster subscription from re-centering to same position\n const pos = this.assets[0].c8y_Position;\n (this.clusterMap as any).lastFollowedPosition = { lat: pos.lat, lng: pos.lng };\n }\n }\n\n this.clusterMap?.reload();\n }\n }\n\n private async updateAssets() {\n this.assets = (await this.mapService.getAllPositionMOs(this.config.device)).data;\n }\n\n private listenToWidgetResizeEvent(dashboardChild: DashboardChildComponent) {\n dashboardChild.changeEnd\n .pipe(\n filter(child => child.lastChange === 'resize'),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.clusterMap.reset();\n });\n }\n\n private subscribeToErrorsOccurred() {\n this.clusterMap.errorNotifier\n .pipe(filter(Boolean), takeUntil(this.destroy$))\n .subscribe(error => {\n this.alerts.addAlerts(\n new DynamicComponentAlert({\n type: 'warning',\n text:\n error?.name === 'TimeoutError'\n ? this.TIMEOUT_ERROR_TEXT\n : (error?.message ?? this.SERVER_ERROR_TEXT)\n })\n );\n });\n }\n\n private updateMapConfigRealtime() {\n this.mapConfig.realtime = this.config.realtime || false;\n }\n\n private async applyDeviceTypeTarget() {\n const hasDeviceTarget = !!this.config.device; // The map widget supports not selecting any target\n const isDeviceTypeDashboard = !!this.dashboardContextComponent?.dashboard?.deviceType;\n if (isDeviceTypeDashboard && hasDeviceTarget) {\n const context = this.dashboardContextComponent.context;\n if (context?.id) {\n const { id } = context;\n this.config.device = (await this.inventory.detail(id)).data;\n }\n }\n }\n}\n","@if (mapConfig) {\n <c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n (fitAssetsToBounds)=\"fitToBounds()\"\n [assets]=\"assets\"\n [buttonsConfig]=\"{\n autoRefresh: { show: false },\n refresh: { show: false },\n realtime: { show: false },\n fitToBounds: { show: true }\n }\"\n >\n @if (controls) {\n <c8y-global-context-widget-wrapper\n [widgetControls]=\"controls\"\n [config]=\"config\"\n [isLoading]=\"mapWidget.isLoading$ | async\"\n (globalContextChange)=\"onGlobalContext($event)\"\n ></c8y-global-context-widget-wrapper>\n }\n </c8y-map-status>\n\n <c8y-cluster-map\n #mapWidget\n [rootNode]=\"rootNode\"\n [config]=\"mapConfig\"\n [asset]=\"assets\"\n >\n <div\n class=\"map-marker\"\n *c8yMapPopup=\"let context\"\n >\n <a\n class=\"text-truncate deviceLink text-12\"\n routerLink=\"{{ context | assetLink }}\"\n >\n @if (context.name) {\n <strong>{{ context.name }}</strong>\n } @else {\n <strong\n ngNonBindable\n translate\n [translateParams]=\"{ id: context.id }\"\n >\n Device {{ id }}\n </strong>\n }\n </a>\n <c8y-map-event-info [asset]=\"context\">\n @if (!mapConfig.follow) {\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Activate realtime on this asset and follow it if it moves' | translate\"\n type=\"button\"\n (click)=\"startFollow(context)\"\n translate\n >\n Follow\n </button>\n } @else {\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Stop following this asset.' | translate\"\n type=\"button\"\n (click)=\"stopFollow()\"\n translate\n >\n Unfollow\n </button>\n }\n </c8y-map-event-info>\n </div>\n </c8y-cluster-map>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["NgCommonModule","i4","i5","NgFormsModule","CommonModule","i2","FormsModule","i1","i3","i6"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAWa,qBAAqB,CAAA;AAQhC,IAAA,WAAA,CAAoB,YAA0B,EAAA;QAA1B,IAAA,CAAA,YAAY,GAAZ,YAAY;QAJhC,IAAA,CAAA,OAAO,GAAG,IAAI;IAImC;AAEjD,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AAC5C,YAAA,QAAQ,EAAE,YAAY;YACtB,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE;AAC1C,YAAA,YAAY,EAAE,cAAc;AAC5B,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;AACpB,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;AACpB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;IACtB;+GArBW,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECXlC,4ZAYA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDHYA,YAAc,mIAAE,qBAAqB,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAY,gBAAgB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAA1B,QAAQ,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAE9C,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBANjC,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAElB,IAAI,EAAA,OAAA,EACP,CAACA,YAAc,EAAE,qBAAqB,EAAE,QAAQ,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,4ZAAA,EAAA;;sBAG3E;;;MEmDU,wBAAwB,CAAA;IAgDnC,IACI,aAAa,CAAC,QAA0B,EAAA;QAC1C,IAAI,QAAQ,EAAE;AACZ,YAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC7C;QACF;AACA,QAAA,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC;IAC3C;IAEA,WAAA,CACU,UAAsB,EACtB,YAA0B,EAC1B,gBAAkC,EACN,gBAA8C,EAC1E,mBAAwC,EAAA;QAJxC,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QACY,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAC5C,IAAA,CAAA,mBAAmB,GAAnB,mBAAmB;AA7DpB,QAAA,IAAA,CAAA,MAAM,GAAoB;AACjC,YAAA,SAAS,EAAE;SACZ;AAGQ,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAA0B,SAAS,kDAAC;AACnD,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAA0B,EAAE,kDAAC;AAE5C,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACrC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE;AAChC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE;AAEjC,YAAA,MAAM,aAAa,GAAG,UAAU,EAAE,MAAM,KAAK,CAAC;AAC9C,YAAA,MAAM,eAAe,GAAG,WAAW,EAAE,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE;AAE7D,YAAA,IAAI,aAAa,IAAI,eAAe,EAAE;gBACpC,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACnD;AACA,YAAA,OAAO,KAAK;AACd,QAAA,CAAC,yDAAC;AAEO,QAAA,IAAA,CAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AAC1C,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE;AAChC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE;AAEjC,YAAA,MAAM,aAAa,GAAG,UAAU,EAAE,MAAM,KAAK,CAAC;AAC9C,YAAA,MAAM,eAAe,GAAG,WAAW,EAAE,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE;AAE7D,YAAA,IAAI,aAAa,IAAI,eAAe,EAAE;gBACpC,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1D;AACA,YAAA,OAAO,KAAK;AACd,QAAA,CAAC,8DAAC;QAEF,IAAA,CAAA,aAAa,GAAkB,MAAM;AAE7B,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,OAAO,EAAQ;;;;QAMvB,IAAA,CAAA,kBAAkB,GAAG,EAAE;IAoBrC;IAEH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;IACxB;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AAEnC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,IAAG;YAC/E,IAAI,CAAC,UAAU,GAAG;gBAChB,SAAS,EAAE,aAAa,CAAC,SAAS;gBAClC,MAAM,EAAE,aAAa,CAAC;aACvB;YACD,IAAI,CAAC,QAAQ,EAAE;AACjB,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;AACnC,YAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACnE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,uBAAuB,CAAC;QAChE;IACF;AAEA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU;QACzC;QAEA,IAAI,CAAC,UAAU,GAAG;YAChB,GAAG,IAAI,CAAC,UAAU;AAClB,YAAA,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;AACxB,YAAA,UAAU,EAAE,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,IAAI,2BAA2B,CAAC,SAAS;;AAExF,YAAA,QAAQ,EACN,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,IAAI,KAAK;AACtF,YAAA,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa;YACnD,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,eAAe,IAAI;SAC5D;AAED,QAAA,MAAM,IAAI,CAAC,WAAW,EAAE;IAC1B;IAEA,MAAM,WAAW,CAAC,OAAsB,EAAA;AACtC,QAAA,IAAI,OAAO,CAAC,MAAM,EAAE;YAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAEnC,IACE,OAAO,CAAC,MAAM,CAAC,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,aAAa;AAC5D,gBAAA,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAC3B;AACA,gBAAA,MAAM,IAAI,CAAC,WAAW,EAAE;YAC1B;QACF;IACF;AAEA,IAAA,cAAc,CAAC,OAAiB,EAAA;AAC9B,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO;QACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1E;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU;AACvC,QAAA,OAAO,IAAI;IACb;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG;AACtB,YAAA,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;AACxB,YAAA,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC;SAC5B;IACH;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QAC1B;QACA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;QACnF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1E;AAEA,IAAA,sBAAsB,CAAC,KAAoB,EAAA;QACzC,KAAK,CAAC,cAAc,EAAE;QACtB,IAAI,CAAC,YAAY,EAAE;IACrB;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;IAC1B;AAEA,IAAA,gBAAgB,CAAC,KAAqB,EAAA;AACpC,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAChE;AAEA,IAAA,gBAAgB,CAAC,KAAqB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QAC1B;AACA,QAAA,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE;QAC7C,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC;QACtD,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACtD,QAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACtC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC/C;IAEA,cAAc,GAAA;QACZ,SAAS,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,KAAI;AACtD,YAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC;YAC5D,IAAI,CAAC,YAAY,EAAE;AACrB,QAAA,CAAC,CAAC;IACJ;IAEA,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG;AACnC,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;SACjC;QACD,IAAI,CAAC,YAAY,EAAE;IACrB;AAEA,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE;AAChC,QAAA,IAAI,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;YAChD;QACF;QAEA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC;;QAGhE,SAAS,CAAiB,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS;AACrD,aAAA,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAiB,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;aAC1F,SAAS,CAAC,MAAK;YACd,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE;AAE1C,YAAA,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC;AAC7D,YAAA,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC;YAC7D,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAE5C,IAAI,CAAC,YAAY,EAAE;AACrB,QAAA,CAAC,CAAC;QAEJ,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,uBAAuB,CAAC;IAChE;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;AACrB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI;QAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,GAAG,IAAI;AACjC,QAAA,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE;IAClC;AAEQ,IAAA,MAAM,WAAW,GAAA;AACvB,QAAA,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC/E,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,MAAM,CACtC,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CACxF;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC;AAErC,QAAA,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE;YACzB,IAAI,CAAC,YAAY,CAAC,MAAM,CACtB,OAAO,CACL,yKAAyK,CAC1K,CACF;QACH;IACF;IAEQ,aAAa,CAAC,GAAW,EAAE,GAAW,EAAA;AAC5C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AACtE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAChC,IAAI,EAAE,CAAA,0GAAA,EAA6G,SAAS,CAAA,IAAA;AAC7H,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;YAChD;AACD,SAAA,CAAC;QACF,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;IACjD;AAnPW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,0GA6DzB,kBAAkB,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AA7DjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA6CxB,YAAY,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5GzB,oqNAsMA,2CDnJID,YAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACdC,WAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,iGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,uGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,wIAAA,EAAA,MAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gHAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACbC,cAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZC,aAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAD,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,KAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iCAAA,EAAA,QAAA,EAAA,yCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,cAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,SAAS,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAE,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,WAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,WAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACT,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,kBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,SAAA,EAAA,UAAA,EAAA,qBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,aAAa,sZAXA,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,CAAA,CAAA;;4FAexD,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAlBpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,aAAA,EAElB,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,EAAA,UAAA,EACvD,IAAI,EAAA,OAAA,EACP;wBACPP,YAAc;wBACdG,WAAa;wBACbC,cAAY;wBACZE,aAAW;wBACX,kBAAkB;wBAClB,SAAS;wBACT,aAAa;wBACb,mBAAmB;wBACnB,aAAa;wBACb;AACD,qBAAA,EAAA,QAAA,EAAA,oqNAAA,EAAA;;0BA+DE,MAAM;2BAAC,kBAAkB;;sBA5D3B;;sBA4CA,SAAS;uBAAC,YAAY;;sBAGtB,SAAS;uBAAC,YAAY;;;ME3CZ,kBAAkB,CAAA;AAmB7B,IAAA,WAAA,CACE,cAAuC,EACnB,yBAAoD,EAChE,SAA2B,EAC3B,UAAsB,EACV,yBAAoD,EAChE,uBAAgD,EAChD,4BAA0D,EAAA;QAL9C,IAAA,CAAA,yBAAyB,GAAzB,yBAAyB;QACrC,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,UAAU,GAAV,UAAU;QACE,IAAA,CAAA,yBAAyB,GAAzB,yBAAyB;QACrC,IAAA,CAAA,uBAAuB,GAAvB,uBAAuB;QACvB,IAAA,CAAA,4BAA4B,GAA5B,4BAA4B;QAzBtC,IAAA,CAAA,SAAS,GAAqB,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;AASxC,QAAA,IAAA,CAAA,kBAAkB,GAAG,OAAO,CAClC,8EAA8E,CAC/E;AACO,QAAA,IAAA,CAAA,iBAAiB,GAAG,OAAO,CAAC,wBAAwB,CAAC;AAErD,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAapC,QAAA,IAAI,CAAC,yBAAyB,CAAC,cAAc,CAAC;IAChD;AAEA,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,CAAC,MAAM,CAAC,4BAA4B,CACtC,SAAS,EACT,oBAAoB,CAAC,sBAAsB,CAC5C;AAED,QAAA,MAAM,IAAI,CAAC,qBAAqB,EAAE;AAElC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;QACpC;QACA,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;;AAG7C,QAAA,MAAM,0BAA0B,GAC9B,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ;QAEvE,IAAI,CAAC,uBAAuB,EAAE;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ;AAC9B,QAAA,MAAM,IAAI,CAAC,YAAY,EAAE;AAEzB,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,4BAA4B,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;QACzF,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC;;;;QAKhD,IAAI,0BAA0B,EAAE;YAC9B,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,2BAA2B,CAAC,eAAe;QACvE;QAEA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,IAAI,CAAC,SAAS,GAAG;gBACf,GAAG,IAAI,CAAC,SAAS;AACjB,gBAAA,MAAM,EAAE;aACT;QACH;AAEA,QAAA,IAAI,CAAC,QAAQ;AACX,YAAA,CAAC,MAAM,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,IAAI,EAAE;IACjG;IAEA,eAAe,GAAA;QACb,IAAI,CAAC,yBAAyB,EAAE;AAEhC,QAAA,IAAI,IAAI,CAAC,yBAAyB,EAAE;AAClC,YAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAK;;;gBAGnC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC;YAC5C,CAAC,EAAE,GAAG,CAAC;YACP,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC,cAAc,CAAC;YAExD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,aAAa,CAAC;QAC3E;IACF;AAEA,IAAA,WAAW,CAAC,OAAO,EAAA;QACjB,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE;AACpC,YAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;QACzB;QAEA,IAAI,CAAC,SAAS,GAAG;YACf,GAAG,IAAI,CAAC,SAAS;AACjB,YAAA,MAAM,EAAE;SACT;IACH;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,GAAG;YACf,GAAG,IAAI,CAAC,SAAS;AACjB,YAAA,MAAM,EAAE;SACT;AACD,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS;IAChC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;QAClC;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;IACtB;AAEA,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,MAAM,IAAI,CAAC,YAAY,EAAE;AACzB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;YACrD;QACF;AAEA,QAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;QAEjE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,uBAAuB,CAAC;IAChE;IAEA,MAAM,eAAe,CAAC,KAAK,EAAA;AACzB,QAAA,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK;AAEzB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ;AAC1C,QAAA,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,oBAAoB,EAAE;;AAE/C,YAAA,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE;AAC7D,gBAAA,MAAM,IAAI,CAAC,YAAY,EAAE;gBACzB,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,CAAC,EAAE;;oBAE5B,IAAI,CAAC,UAAkB,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAChD,oBAAA,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;oBAEnD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,YAAY;AACtC,oBAAA,IAAI,CAAC,UAAkB,CAAC,oBAAoB,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;gBAChF;YACF;AAEA,YAAA,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE;QAC3B;IACF;AAEQ,IAAA,MAAM,YAAY,GAAA;QACxB,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI;IAClF;AAEQ,IAAA,yBAAyB,CAAC,cAAuC,EAAA;AACvE,QAAA,cAAc,CAAC;aACZ,IAAI,CACH,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,EAC9C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;aAEzB,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE;AACzB,QAAA,CAAC,CAAC;IACN;IAEQ,yBAAyB,GAAA;QAC/B,IAAI,CAAC,UAAU,CAAC;AACb,aAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC9C,SAAS,CAAC,KAAK,IAAG;AACjB,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CACnB,IAAI,qBAAqB,CAAC;AACxB,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,IAAI,EACF,KAAK,EAAE,IAAI,KAAK;sBACZ,IAAI,CAAC;uBACJ,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,iBAAiB;AAChD,aAAA,CAAC,CACH;AACH,QAAA,CAAC,CAAC;IACN;IAEQ,uBAAuB,GAAA;AAC7B,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,KAAK;IACzD;AAEQ,IAAA,MAAM,qBAAqB,GAAA;QACjC,MAAM,eAAe,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC7C,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,yBAAyB,EAAE,SAAS,EAAE,UAAU;AACrF,QAAA,IAAI,qBAAqB,IAAI,eAAe,EAAE;AAC5C,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,yBAAyB,CAAC,OAAO;AACtD,YAAA,IAAI,OAAO,EAAE,EAAE,EAAE;AACf,gBAAA,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO;AACtB,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI;YAC7D;QACF;IACF;+GAhMW,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAAF,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAAG,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAD,IAAA,CAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAKlB,mBAAmB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzEhC,slEA4EA,4CDrBI,qBAAqB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACrBP,YAAc,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACdG,WAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACbC,cAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,IAAA,CAAA,qBAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZD,aAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAClB,SAAS,8dAET,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,UAAU,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,mCAAmC,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,qBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAG,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAF,IAAA,CAAA,gBAAA,EAAA,IAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAG1B,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAlB9B,SAAS;+BACE,gBAAgB,EAAA,UAAA,EAEd,IAAI,EAAA,OAAA,EACP;wBACP,qBAAqB;wBACrBP,YAAc;wBACdG,WAAa;wBACbC,cAAY;wBACZE,aAAW;wBACX,kBAAkB;wBAClB,SAAS;wBACT,aAAa;wBACb,aAAa;wBACb,UAAU;wBACV;AACD,qBAAA,EAAA,QAAA,EAAA,slEAAA,EAAA;;0BAuBE;;0BAGA;;sBArBF;;sBAEA,SAAS;uBAAC,mBAAmB;;;AEzEhC;;AAEG;;;;"}
|
package/locales/de.po
CHANGED
|
@@ -3538,6 +3538,9 @@ msgstr "Klicken Sie, um Punkte hinzuzufügen und den Bereich festzulegen. Ziehen
|
|
|
3538
3538
|
msgid "Click to change"
|
|
3539
3539
|
msgstr "Zum Ändern klicken"
|
|
3540
3540
|
|
|
3541
|
+
msgid "Click to collapse"
|
|
3542
|
+
msgstr "Zum Einklappen anklicken"
|
|
3543
|
+
|
|
3541
3544
|
msgid "Click to edit"
|
|
3542
3545
|
msgstr "Klicken zum Bearbeiten"
|
|
3543
3546
|
|
|
@@ -6144,6 +6147,9 @@ msgstr "Zeigt eine Liste von Alarmen, gefiltert nach Objekt, Schweregrad, Status
|
|
|
6144
6147
|
msgid "Displays a table of assets with configurable columns and filters."
|
|
6145
6148
|
msgstr "Zeigt eine Tabelle mit Vermögenswerten mit konfigurierbaren Spalten und Filtern an."
|
|
6146
6149
|
|
|
6150
|
+
msgid "Displays a welcome message and quick links for Device Management"
|
|
6151
|
+
msgstr "Zeigt eine Willkommensnachricht und Schnellzugriff-Links für das Device Management an."
|
|
6152
|
+
|
|
6147
6153
|
msgid "Displays a welcome message for Cockpit"
|
|
6148
6154
|
msgstr "Zeigt die Begrüßungsnachricht für die Cockpit-Anwendung an"
|
|
6149
6155
|
|
|
@@ -6162,9 +6168,6 @@ msgstr "Zeigt den Status eines binären Datenpunkts in Echtzeit an."
|
|
|
6162
6168
|
msgid "Displays links to help and service resources."
|
|
6163
6169
|
msgstr "Zeigt Links auf Hilfe- und Service-Dokumente an."
|
|
6164
6170
|
|
|
6165
|
-
msgid "Displays quick links for Device Management"
|
|
6166
|
-
msgstr "Zeigt Quick Links für Device Management an"
|
|
6167
|
-
|
|
6168
6171
|
msgid "Displays the button next to target devices with children. Clicking it displays a list with all\n"
|
|
6169
6172
|
" child devices of the selected target device."
|
|
6170
6173
|
msgstr "Zeigt die Schaltfläche neben Zielgeräten mit Kindgeräten an. Wenn Sie darauf klicken, wird eine Liste mit allen\n"
|
|
@@ -8638,6 +8641,9 @@ msgstr "Gruppe gelöscht."
|
|
|
8638
8641
|
msgid "Group name"
|
|
8639
8642
|
msgstr "Gruppenname"
|
|
8640
8643
|
|
|
8644
|
+
msgid "Group of {{count}} assets"
|
|
8645
|
+
msgstr "Gruppe von {{count}} Assets"
|
|
8646
|
+
|
|
8641
8647
|
msgid "Group or device"
|
|
8642
8648
|
msgstr "Gruppe oder Gerät"
|
|
8643
8649
|
|
|
@@ -16770,6 +16776,9 @@ msgstr "Die Cockpit-Anwendung bietet Ihnen Optionen zur Verwaltung und Überwach
|
|
|
16770
16776
|
msgid "The Device Management application provides functionalities for managing and monitoring devices and enables you to control and troubleshoot devices remotely."
|
|
16771
16777
|
msgstr "Die Device Management-Anwendung bietet Ihnen Funktionen zur Verwaltung und Überwachung von Geräten und aktiviert die Steuerung und Fehlerbehebung von Geräten aus der Ferne."
|
|
16772
16778
|
|
|
16779
|
+
msgid "The Device Management application provides you with options to register, organize, and operate IoT devices from an operational perspective."
|
|
16780
|
+
msgstr "Die Anwendung „Device Management“ bietet Ihnen Optionen zum Registrieren, Organisieren und Betreiben von IoT-Geräten aus betrieblicher Sicht."
|
|
16781
|
+
|
|
16773
16782
|
msgid "The Google fonts URL"
|
|
16774
16783
|
msgstr "Die URL für Schriftarten von Google"
|
|
16775
16784
|
|
|
@@ -18980,6 +18989,9 @@ msgstr "Willkommen im Cockpit-Widget"
|
|
|
18980
18989
|
msgid "Welcome to Cumulocity API Documentation"
|
|
18981
18990
|
msgstr "Willkommen bei der Cumulocity API-Dokumentation"
|
|
18982
18991
|
|
|
18992
|
+
msgid "Welcome to Device Management"
|
|
18993
|
+
msgstr "Willkommen beim Device Management"
|
|
18994
|
+
|
|
18983
18995
|
msgid "Welcome to Device Management widget"
|
|
18984
18996
|
msgstr "Willkommen im Device Management Widget"
|
|
18985
18997
|
|
|
@@ -19721,9 +19733,6 @@ msgstr "Ihre Telefonnummer"
|
|
|
19721
19733
|
msgid "Your rating: {{ starCount }} star(s)"
|
|
19722
19734
|
msgstr "Ihre Bewertung: {{ starCount }} Stern(e)"
|
|
19723
19735
|
|
|
19724
|
-
msgid "Zoom in"
|
|
19725
|
-
msgstr "Vergrößern"
|
|
19726
|
-
|
|
19727
19736
|
msgid "Zoom level"
|
|
19728
19737
|
msgstr "Vergrößerungsstufe"
|
|
19729
19738
|
|
package/locales/es.po
CHANGED
|
@@ -3544,6 +3544,9 @@ msgstr "Haga clic para agregar puntos y definir el área. Arrastre los puntos pa
|
|
|
3544
3544
|
msgid "Click to change"
|
|
3545
3545
|
msgstr "Haga clic para hacer un cambio"
|
|
3546
3546
|
|
|
3547
|
+
msgid "Click to collapse"
|
|
3548
|
+
msgstr "Haga clic para contraer"
|
|
3549
|
+
|
|
3547
3550
|
msgid "Click to edit"
|
|
3548
3551
|
msgstr "Click para editar"
|
|
3549
3552
|
|
|
@@ -6152,6 +6155,9 @@ msgstr "Muestra una lista de alarmas filtradas por objeto, gravedad, estado y fe
|
|
|
6152
6155
|
msgid "Displays a table of assets with configurable columns and filters."
|
|
6153
6156
|
msgstr "Muestra una tabla de activos con columnas y filtros configurables."
|
|
6154
6157
|
|
|
6158
|
+
msgid "Displays a welcome message and quick links for Device Management"
|
|
6159
|
+
msgstr "Muestra un mensaje de bienvenida y enlaces rápidos para la Gestión de dispositivos."
|
|
6160
|
+
|
|
6155
6161
|
msgid "Displays a welcome message for Cockpit"
|
|
6156
6162
|
msgstr "Muestra un mensaje de bienvenida para Cockpit"
|
|
6157
6163
|
|
|
@@ -6170,9 +6176,6 @@ msgstr "Muestra en tiempo real el estado de cualquier punto de datos binarios."
|
|
|
6170
6176
|
msgid "Displays links to help and service resources."
|
|
6171
6177
|
msgstr "Muestra enlaces y recursos de servicio."
|
|
6172
6178
|
|
|
6173
|
-
msgid "Displays quick links for Device Management"
|
|
6174
|
-
msgstr "Muestra enlaces rápidos para la gestión de dispositivos"
|
|
6175
|
-
|
|
6176
6179
|
msgid "Displays the button next to target devices with children. Clicking it displays a list with all\n"
|
|
6177
6180
|
" child devices of the selected target device."
|
|
6178
6181
|
msgstr "Muestra el botón junto a los dispositivos de destino con hijos. Al hacer clic en él, se muestra una lista con todos los\n"
|
|
@@ -8633,6 +8636,9 @@ msgstr "Grupo eliminado."
|
|
|
8633
8636
|
msgid "Group name"
|
|
8634
8637
|
msgstr "Nombre del grupo"
|
|
8635
8638
|
|
|
8639
|
+
msgid "Group of {{count}} assets"
|
|
8640
|
+
msgstr "Grupo de activos de {{count}}"
|
|
8641
|
+
|
|
8636
8642
|
msgid "Group or device"
|
|
8637
8643
|
msgstr "Grupo o dispositivo"
|
|
8638
8644
|
|
|
@@ -16769,6 +16775,9 @@ msgstr "La aplicación Cockpit proporciona opciones para gestionar y supervisar
|
|
|
16769
16775
|
msgid "The Device Management application provides functionalities for managing and monitoring devices and enables you to control and troubleshoot devices remotely."
|
|
16770
16776
|
msgstr "La aplicación Gestión de dispositivos proporciona funciones para gestionar y supervisar dispositivos y permite controlar y solucionar problemas de dispositivos de manera remota."
|
|
16771
16777
|
|
|
16778
|
+
msgid "The Device Management application provides you with options to register, organize, and operate IoT devices from an operational perspective."
|
|
16779
|
+
msgstr "La aplicación de Gestión de dispositivos le ofrece opciones para el registro, la organización y el funcionamiento de dispositivos IoT desde una perspectiva operativa."
|
|
16780
|
+
|
|
16772
16781
|
msgid "The Google fonts URL"
|
|
16773
16782
|
msgstr "La URL de las fuentes de Google"
|
|
16774
16783
|
|
|
@@ -18980,6 +18989,9 @@ msgstr "Bienvenido al Widget Cockpit"
|
|
|
18980
18989
|
msgid "Welcome to Cumulocity API Documentation"
|
|
18981
18990
|
msgstr "Bienvenido a la documentación de la API de Cumulocity."
|
|
18982
18991
|
|
|
18992
|
+
msgid "Welcome to Device Management"
|
|
18993
|
+
msgstr "Bienvenido a la gestión de dispositivos"
|
|
18994
|
+
|
|
18983
18995
|
msgid "Welcome to Device Management widget"
|
|
18984
18996
|
msgstr "Bienvenido al Widget de gestión de dispositivos"
|
|
18985
18997
|
|
|
@@ -19721,9 +19733,6 @@ msgstr "Su número de teléfono"
|
|
|
19721
19733
|
msgid "Your rating: {{ starCount }} star(s)"
|
|
19722
19734
|
msgstr "Tu valoración: {{ starCount }} estrella(s)"
|
|
19723
19735
|
|
|
19724
|
-
msgid "Zoom in"
|
|
19725
|
-
msgstr "Acercar"
|
|
19726
|
-
|
|
19727
19736
|
msgid "Zoom level"
|
|
19728
19737
|
msgstr "Nivel de zoom"
|
|
19729
19738
|
|