{"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            [iconSize]=\"16\"\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":"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"}