{"version":3,"file":"c8y-ngx-components-map.mjs","sources":["../../map/map.model.ts","../../map/map.service.ts","../../map/cluster-map.ts","../../map/map-popup.directive.ts","../../map/map.component.ts","../../map/map.component.html","../../map/cluster-map.component.ts","../../map/cluster-map.component.html","../../map/map-status.component.ts","../../map/map-status.component.html","../../map/map.module.ts","../../map/c8y-ngx-components-map.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { IEvent, IManagedObject } from '@c8y/client';\nimport type { MapDefaultConfig, MapTileLayer } from '@c8y/options';\nimport type * as L from 'leaflet';\nimport { Observable } from 'rxjs';\nimport { GlobalAutoRefreshWidgetConfig } from '@c8y/ngx-components';\n\nexport function getC8yMarker(marker: L.Marker, asset?: PositionManagedObject, event?: IEvent) {\n  (marker as C8yMarker).asset = asset;\n  (marker as C8yMarker).event = event;\n  return marker as C8yMarker;\n}\n\nexport const MAP_TILE_LAYER = new InjectionToken<Observable<MapTileLayer[]>>('MAP_TILE_LAYER');\n\ntype RequireOnlyOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> &\n  { [K in Keys]-?: Required<Pick<T, K>> & Partial<Record<Exclude<Keys, K>, undefined>> }[Keys];\n\ninterface C8yMarkerAttr {\n  asset: PositionManagedObject;\n  event: IEvent;\n}\n\nexport type C8yMarkerAttributes = keyof C8yMarkerAttr;\n\nexport type C8yMarker = L.Marker & RequireOnlyOne<C8yMarkerAttr, 'asset' | 'event'>;\n\nexport enum ClusterSize {\n  NONE = 0,\n  FOUR = 1,\n  SIXTEEN = 2\n}\n\nexport enum MapTenantOptionKeys {\n  CONFIG = 'map-config',\n  LAYERS = 'map-layers'\n}\n\nexport interface PositionManagedObject extends IManagedObject {\n  c8y_Position: {\n    lat: number;\n    lng: number;\n    alt?: number;\n  };\n\n  c8y_ActiveAlarmsStatus?: {\n    minor: number;\n    major: number;\n    warning: number;\n    critical: number;\n  };\n\n  icon?: {\n    name: string;\n  };\n}\n\nexport type ClusterMapConfig = MapConfig & {\n  center: [number, number];\n  refreshInterval?: number | null;\n};\n\nexport type MapConfig = MapDefaultConfig & {\n  follow?: boolean;\n  realtime?: boolean;\n  icon?: string;\n  color?: string;\n  disableZoom?: boolean;\n  disablePan?: boolean;\n  bounds?: L.LatLngBounds;\n  fitBoundsOptions?: L.FitBoundsOptions;\n} & GlobalAutoRefreshWidgetConfig;\n\nexport const MAP_DEFAULT_CONFIG = new InjectionToken<Observable<MapDefaultConfig>>(\n  'MAP_DEFAULT_CONFIG'\n);\n\nexport const defaultLayer: MapTileLayer = {\n  layerUrl: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n  label: 'OpenStreetMap',\n  priority: 1000,\n  options: {\n    maxZoom: 18,\n    minZoom: 2,\n    attribution:\n      '&copy;<a href=\"http://www.openstreetmap.org/copyright\" rel=\"noreferrer nofollow\">OpenStreetMap</a>',\n    noWrap: false\n  }\n};\n\nexport const defaultMapConfig: MapDefaultConfig = {\n  center: [51.23544, 6.79599], // Düsseldorf\n  zoomLevel: 2\n};\n\nexport type MapStatusButtonsConfig = Record<'realtime', { show: boolean; disabled?: boolean }>;\n","import { Injectable } from '@angular/core';\nimport { IManagedObject, InventoryService, IResultList, Paging } from '@c8y/client';\nimport { OptionsService, ServiceRegistry } from '@c8y/ngx-components';\nimport type { MapDefaultConfig, MapTileLayer } from '@c8y/options';\nimport type * as L from 'leaflet';\nimport { latLng, latLngBounds } from 'leaflet';\nimport { get } from 'lodash-es';\nimport { combineLatest, defer, Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport {\n  ClusterSize,\n  defaultLayer,\n  defaultMapConfig,\n  MapTenantOptionKeys,\n  PositionManagedObject\n} from './map.model';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class MapService {\n  /**\n   * Returns asset icon status for highest alarm severity found in device object.\n   * @param device Device that contains alarms information.\n   * @returns Status string according to alarm severity\n   */\n  static getStatus(device: PositionManagedObject) {\n    if (!device.c8y_ActiveAlarmsStatus) {\n      return 'text-muted';\n    }\n    if (device.c8y_ActiveAlarmsStatus.critical) {\n      return 'status critical';\n    }\n    if (device.c8y_ActiveAlarmsStatus.major) {\n      return 'status major';\n    }\n    if (device.c8y_ActiveAlarmsStatus.minor) {\n      return 'status minor';\n    }\n    if (device.c8y_ActiveAlarmsStatus.warning) {\n      return 'status warning';\n    }\n    return 'text-muted';\n  }\n  /**\n   * The devices that are maximal displayed in one cluster.\n   */\n  MAX_DEVICE_PER_CLUSTER = 200;\n  /**\n   * The count until the cluster is sized. There are a maximum of\n   * three clusters: 1, 4 or 16.\n   */\n  CLUSTER_LEVEL_THRESHOLD = 500;\n\n  /**\n   * @ignore: Only DI.\n   */\n  constructor(\n    private inventory: InventoryService,\n    private options: OptionsService,\n    private serviceRegistry: ServiceRegistry\n  ) {}\n\n  /**\n   * Returns the leaflet instance used by the cumulocity core.\n   */\n  async getLeaflet() {\n    const originalLeflet = window.L;\n    const c8yLeafletInstance = (await import('leaflet')).default;\n    c8yLeafletInstance.noConflict();\n    window.L = originalLeflet;\n    return c8yLeafletInstance;\n  }\n\n  /**\n   * Verifies if a given managed object is a device with a position fragment.\n   * @param mo The given managed object.\n   */\n  isPositionedDevice(mo: IManagedObject) {\n    return !!(mo?.c8y_IsDevice && this.hasPosition(mo));\n  }\n\n  /**\n   * Verifies if a given managed object has a position fragment.\n   * @param mo The given managed object.\n   */\n  hasPosition(mo: IManagedObject) {\n    return mo?.c8y_Position;\n  }\n\n  getMapTileLayerProviders(): CumulocityServiceRegistry.MapTileLayerProvider[] {\n    const layerProviders = this.serviceRegistry.get('mapTileLayerHook');\n\n    return layerProviders;\n  }\n\n  getMapTileLayersFromHookedProviders$(\n    layerProviders: CumulocityServiceRegistry.MapTileLayerProvider[]\n  ): Observable<MapTileLayer[]> {\n    if (!layerProviders.length) {\n      return of([]);\n    }\n    const layers = combineLatest(layerProviders.map(provider => provider.getMapTileLayers$()));\n    return layers.pipe(map(layers => layers.flat()));\n  }\n\n  /**\n   * Returns the layers available in this application.\n   * Layers are taken from plugins installed to this application.\n   * In case none of the plugins override the default layers, the default layers are also considered.\n   * @returns The layers.\n   */\n  getMapTileLayers$(): Observable<MapTileLayer[]> {\n    return defer(() => {\n      const layerProviders = this.getMapTileLayerProviders();\n      const overridesDefaultLayer = layerProviders.some(provider =>\n        provider.overridesDefaultLayer?.()\n      );\n      const layersFromProviders = defer(() =>\n        this.getMapTileLayersFromHookedProviders$(layerProviders)\n      );\n      if (overridesDefaultLayer) {\n        return layersFromProviders;\n      }\n\n      return combineLatest([this.getDefaultLayers(), layersFromProviders]).pipe(\n        map(layers => {\n          return layers.flat();\n        })\n      );\n    });\n  }\n\n  /**\n   * Returns the layers configured in the current platform via tenant options.\n   * @returns The layers. If not set in tenant options the default layers.\n   */\n  getDefaultLayers(): Observable<MapTileLayer[]> {\n    return this.getMapOption<MapTileLayer[]>(\n      MapTenantOptionKeys.LAYERS,\n      this.options.mapLayers || [defaultLayer]\n    );\n  }\n\n  /**\n   * Returns the map configuration configured on the tenant.\n   * @returns The configuration. If not set in tenant options the default configuration.\n   */\n  getDefaultConfig(): Observable<MapDefaultConfig> {\n    return this.getMapOption<MapDefaultConfig>(\n      MapTenantOptionKeys.CONFIG,\n      this.options.mapConfig || defaultMapConfig\n    );\n  }\n\n  /**\n   * Counts all managed objects in a given bound with a c8y_Position fragment.\n   * @param bound The lat lng bound to request the managed objects for.\n   * @param byGroupIdMO The group managed object of which direct children should be searched for.\n   * @returns The number of all position managed objects in the given bound (and group).\n   */\n  async getPositionMOsFromBoundCount(\n    bound: L.LatLngBounds,\n    byGroupIdMO?: IManagedObject\n  ): Promise<number> {\n    return this.getPositionMOsFromBound(bound, byGroupIdMO, true) as Promise<number>;\n  }\n\n  /**\n   * Returns all managed objects with a c8y_Position fragment in a certain boundary.\n   * @param bound The lat lng bound to request the managed objects for.\n   * @returns All position managed objects in the given bound.\n   */\n  async getPositionMOsFromBound(bound: L.LatLngBounds): Promise<PositionManagedObject[]>;\n  /**\n   * Returns all managed objects with a c8y_Position fragment in a certain boundary that belongs to a certain group.\n   * @param bound The lat lng bound to request the managed objects for.\n   * @param byGroupIdMO The group managed object of which direct children should be searched for.\n   * @returns All position managed objects in the given bound that are children of the given group.\n   */\n  async getPositionMOsFromBound(\n    bound: L.LatLngBounds,\n    byGroupIdMO: IManagedObject\n  ): Promise<PositionManagedObject[]>;\n  /**\n   * Counts the managed objects in a certain boundary belonging to a group.\n   * @param bound The lat lng bound to request the managed objects for.\n   * @param byGroupIdMO The group managed object of which direct children should be searched for.\n   * @return The count of the managed objects.\n   */\n  async getPositionMOsFromBound(\n    bound: L.LatLngBounds,\n    byGroupIdMO: IManagedObject,\n    count: true\n  ): Promise<number>;\n  async getPositionMOsFromBound(\n    bound: L.LatLngBounds,\n    byGroupIdMO?: IManagedObject,\n    count = false\n  ): Promise<PositionManagedObject[] | number> {\n    const { lat: latMin, lng: lngMinRaw } = bound.getSouthWest();\n    const { lat: latMax, lng: lngMaxRaw } = bound.getNorthEast();\n\n    const lngMin = lngMaxRaw - lngMinRaw > 360 ? -180 : this.normalizeLongitude(lngMinRaw);\n    const lngMax = lngMaxRaw - lngMinRaw > 360 ? 180 : this.normalizeLongitude(lngMaxRaw);\n\n    const byGroupIdFilter = byGroupIdMO\n      ? `(bygroupid(${byGroupIdMO.id}) or id eq '${byGroupIdMO.id}') and `\n      : '';\n    let boundFilter = `$filter=${byGroupIdFilter}has(c8y_Position) and c8y_Position.lat gt ${latMin}d and c8y_Position.lat lt ${latMax}d`;\n\n    if (lngMin < lngMax) {\n      boundFilter = `${boundFilter} and c8y_Position.lng gt ${lngMin}d and c8y_Position.lng lt ${lngMax}d`;\n    } else {\n      boundFilter = `${boundFilter} and (c8y_Position.lng gt ${lngMin}d or c8y_Position.lng lt ${lngMax}d)`;\n    }\n\n    const { paging, data } = await this.inventory.list({\n      pageSize: count ? 1 : this.MAX_DEVICE_PER_CLUSTER,\n      withTotalPages: count,\n      query: boundFilter\n    });\n    if (count) {\n      return paging.totalPages;\n    }\n    return data.map((pmo: PositionManagedObject) =>\n      bound.contains(latLng(pmo.c8y_Position.lat, pmo.c8y_Position.lng))\n        ? pmo\n        : this.denormalizePMO(pmo, bound)\n    ) as PositionManagedObject[];\n  }\n\n  /**\n   * Returns all devices with c8y_Position.\n   */\n  async getPositionDevices(): Promise<PositionManagedObject[]>;\n  /**\n   * Returns all devices with c8y_Position.\n   * @param pageSize The page size to return.\n   */\n  async getPositionDevices(pageSize: number): Promise<PositionManagedObject[]>;\n  /**\n   * Returns all devices with c8y_Position.\n   * @param pageSize The page size to return.\n   * @param count Counting is disabled\n   */\n  async getPositionDevices(pageSize: number, count: false): Promise<PositionManagedObject[]>;\n  /**\n   * Returns the number of all devices with c8y_Position.\n   * @param pageSize The page size to return.\n   * @param count Counting is enabled\n   */\n  async getPositionDevices(pageSize: number, count: true): Promise<number>;\n  /**\n   * Returns all devices with c8y_Position.\n   * @param pageSize The page size to return.\n   * @param count Switches to counting only.\n   * @returns All devices or the device count with a c8y_Position fragment.\n   */\n  async getPositionDevices(\n    pageSize = this.MAX_DEVICE_PER_CLUSTER,\n    count?: boolean\n  ): Promise<number | PositionManagedObject[]> {\n    const { paging, data } = await this.inventory.list({\n      pageSize: count ? 1 : pageSize,\n      withTotalPages: !!count,\n      query: '$filter=has(c8y_Position) and has(c8y_IsDevice)'\n    });\n    if (count) {\n      return paging.totalPages;\n    }\n    return data as PositionManagedObject[];\n  }\n\n  /**\n   * Returns all managed object with a c8y_Position fragment.\n   * @param byGroupIdMO The group managed object of which direct children should be searched for.\n   * @param pageSize Defines how many results should be returned.\n   * @returns The managed objects with position.\n   */\n  async getAllPositionMOs(\n    byGroupIdMO?: IManagedObject,\n    pageSize = 500\n  ): Promise<IResultList<PositionManagedObject>> {\n    const filter: { pageSize: number; withTotalPages: boolean; query: string } = {\n      pageSize,\n      withTotalPages: true,\n      query: 'has(c8y_Position)'\n    };\n\n    if (byGroupIdMO) {\n      filter.query = `$filter=(bygroupid(${byGroupIdMO.id}) or id eq '${byGroupIdMO.id}') and has(c8y_Position)`;\n    }\n\n    const { paging, data, res } = await this.inventory.list(filter);\n\n    return {\n      res,\n      paging: paging as Paging<PositionManagedObject>,\n      data: data as PositionManagedObject[]\n    };\n  }\n\n  /**\n   * Determines a rectangular geographical area based on the positions of all devices.\n   *\n   * @returns A [[LatLngBounds]] object fitting all devices' geo positions.\n   */\n  async getAllDevicesBounds(): Promise<L.LatLngBounds> {\n    const filter = (coord: 'lat' | 'lng', order: 'asc' | 'desc') => ({\n      pageSize: 1,\n      q: `$filter=has(c8y_Position) $orderby=c8y_Position.${coord} ${order}`\n    });\n\n    const filterReverse = (op: 'lt' | 'gt', order: 'asc' | 'desc') => ({\n      pageSize: 1,\n      q: `$filter=has(c8y_Position) and c8y_Position.lng ${op} 0d $orderby=c8y_Position.lng ${order}`\n    });\n\n    const [latMin, latMax, lngMin, lngMax, lngRevMin, lngRevMax] = await Promise.all([\n      this.inventory.list(filter('lat', 'asc')),\n      this.inventory.list(filter('lat', 'desc')),\n      this.inventory.list(filter('lng', 'asc')),\n      this.inventory.list(filter('lng', 'desc')),\n      this.inventory.list(filterReverse('gt', 'asc')),\n      this.inventory.list(filterReverse('lt', 'desc'))\n    ]).then(result => result.map(r => get(r.data, '[0].c8y_Position')));\n\n    const shiftWorld = (lngRevMin?.lng ?? 0) - (lngRevMax?.lng ?? 0) > 180;\n\n    return latLngBounds(\n      latLng(latMin?.lat, shiftWorld ? lngRevMin?.lng : lngMin?.lng),\n      latLng(latMax?.lat, shiftWorld ? lngRevMax?.lng + 360 : lngMax?.lng)\n    );\n  }\n\n  /**\n   * Returns the cluster size for clustered maps. Counting the position MOs in a bounding\n   * and if it reach a threshold, returning a [[ClusterSize]].\n   * @param bound The bounding to check for cluster size.\n   * @returns The cluster size, can be NONE, FOUR or SIXTEEN.\n   */\n  async getClusterSize(bound: L.LatLngBounds) {\n    const count = await this.getPositionMOsFromBoundCount(bound);\n    let clusterSize = ClusterSize.NONE;\n    if (count > this.CLUSTER_LEVEL_THRESHOLD) {\n      clusterSize = ClusterSize.SIXTEEN;\n    } else if (count > this.MAX_DEVICE_PER_CLUSTER) {\n      clusterSize = ClusterSize.FOUR;\n    }\n    return clusterSize;\n  }\n\n  private getMapOption<T>(key: MapTenantOptionKeys, defaultValue: T) {\n    return defer(() =>\n      this.options.getTenantOption<T | string>('configuration', key, defaultValue)\n    ).pipe(\n      map(config => {\n        if (typeof config === 'string') {\n          console.error(\n            `The tenant option for maps 'configuration.${key}' is not a valid JSON structure.`\n          );\n          return defaultValue;\n        }\n        return config;\n      })\n    );\n  }\n\n  /**\n   * Shifts longitudes received from Leaflet.js in the [-180 - k*360; 180 + k*360] rangewhen\n   * `noWrap` is enabled to the [-180; 180] range expected for values of the c8y_Position fragment.\n   *\n   * @param lng Longitude to shift.\n   * @returns  Longitude value in the [-180; 180] range\n   */\n  private normalizeLongitude(lng: number): number {\n    return ((((lng + 180) % 360) + 360) % 360) - 180;\n  }\n\n  /**\n   * Shifts longitudes in the [-180; 180] range expected for values of the c8y_Position fragment\n   * the the [-180 - k*360; 180 + k*360] range expected from Leaflet.js when `noWrap` is enabled.\n   *\n   * The method naively adds/subtracts 360 degrees to the original value until the position fits in the expected bounds.\n   *\n   * @param pmo A managed object with a `c8y_Position` fragment\n   * @param bounds The bounds where the position should fit\n   * @returns A managed object whose `c8y_Position`'s `lng` values has been shifted to fit in bounds\n   */\n  private denormalizePMO(\n    pmo: PositionManagedObject,\n    bounds: L.LatLngBounds\n  ): PositionManagedObject {\n    let { lng } = pmo.c8y_Position;\n    const shiftFactor = lng > bounds.getEast() ? -1 : 1;\n\n    while (!bounds.contains(latLng(pmo.c8y_Position.lat, lng))) {\n      lng += shiftFactor * 360;\n    }\n\n    pmo.c8y_Position.lng = lng;\n    return pmo;\n  }\n}\n","import { IterableChangeRecord, IterableDiffer, IterableDiffers } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport type * as L from 'leaflet';\nimport { gettext } from '@c8y/ngx-components';\nimport { C8yMarker, PositionManagedObject } from './map.model';\nimport { MapService } from './map.service';\n\nexport class ClusterMap {\n  markers: C8yMarker[] = [];\n  positions: PositionManagedObject[] = [];\n\n  set clusterMarker(item: L.Layer) {\n    this.removeClusterToBigMarker();\n    this._clusterMarker = item;\n  }\n\n  get clusterMarker() {\n    return this._clusterMarker;\n  }\n\n  set rect(item: L.Rectangle) {\n    if (this._rect) {\n      this._rect.remove();\n    }\n    this._rect = item;\n  }\n\n  get rect() {\n    return this._rect;\n  }\n\n  private _clusterMarker: L.Layer;\n  private _rect: L.Rectangle;\n  private iterableDiffer: IterableDiffer<PositionManagedObject> | null;\n\n  constructor(\n    private iterable: IterableDiffers,\n    private addAssetCallback: (asset: PositionManagedObject) => C8yMarker,\n    private translateService: TranslateService\n  ) {\n    this.iterableDiffer = this.iterable.find(this.positions).create(this.trackBy);\n  }\n\n  render(map: L.Map) {\n    if (this._rect) {\n      this._rect.addTo(map);\n    }\n    this.updateChanges(map);\n    if (this._clusterMarker) {\n      this._clusterMarker.addTo(map);\n    }\n  }\n\n  clear(map: L.Map) {\n    this.removeClusterToBigMarker();\n    this._rect.remove();\n    this.positions = [];\n    this.updateChanges(map);\n  }\n\n  removeClusterToBigMarker() {\n    if (this._clusterMarker) {\n      this._clusterMarker.remove();\n      this._clusterMarker = null;\n    }\n  }\n\n  addMarkerToMap(device: PositionManagedObject, map: L.Map) {\n    const marker = this.addAssetCallback(device);\n    this.markers.push(marker);\n    marker.addTo(map);\n  }\n\n  setClusterToBigMarker(map: L.Map, count, leaflet: typeof L) {\n    const bound = this.rect.getBounds();\n    const text = this.translateService.instant(gettext('Zoom in'));\n    const divMarker = leaflet.divIcon({\n      html: `<div class=\"c8y-map-marker-count\" data-count=\"${count}\" title=\"${text}\"></div>`\n    });\n    const labelIcon = leaflet.marker(bound.getCenter(), {\n      icon: divMarker\n    });\n    labelIcon.addTo(map);\n    labelIcon.on('click', () => {\n      map.fitBounds(bound);\n    });\n    this.clusterMarker = labelIcon;\n  }\n\n  private updateChanges(map: L.Map) {\n    const changes = this.iterableDiffer.diff(this.positions);\n    if (changes) {\n      changes.forEachRemovedItem((record: IterableChangeRecord<PositionManagedObject>) => {\n        this.removeMarkerFromMap(record.item);\n      });\n\n      changes.forEachAddedItem((record: IterableChangeRecord<PositionManagedObject>) => {\n        this.addMarkerToMap(record.item, map);\n      });\n    }\n  }\n\n  private trackBy(index: number, item: PositionManagedObject) {\n    const trackItems = [\n      item.id,\n      item.c8y_Position.lat,\n      item.c8y_Position.lng,\n      MapService.getStatus(item)\n    ];\n    return trackItems.join('');\n  }\n\n  private removeMarkerFromMap(device: PositionManagedObject) {\n    const markers = this.markers.filter((marker: C8yMarker) => marker.asset?.id === device.id);\n    markers.forEach(marker => marker.remove());\n  }\n}\n","import { Directive, ElementRef, TemplateRef, ViewContainerRef } from '@angular/core';\n\n@Directive({\n  selector: '[c8yMapPopup]'\n})\nexport class MapPopupDirective {\n  constructor(\n    public template: TemplateRef<unknown>,\n    public elementRef: ElementRef,\n    public viewContainer: ViewContainerRef\n  ) {}\n}\n","import {\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  Inject,\n  Input,\n  Output,\n  SimpleChange,\n  SimpleChanges,\n  ViewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IEvent } from '@c8y/client';\nimport {\n  DatePipe,\n  GeoService,\n  gettext,\n  ManagedObjectRealtimeService,\n  sortByPriority,\n  WidgetGlobalAutoRefreshService\n} from '@c8y/ngx-components';\nimport type { MapDefaultConfig, MapTileLayer } from '@c8y/options';\nimport { TranslateService } from '@ngx-translate/core';\nimport type * as L from 'leaflet';\nimport { every, flatten, isEmpty, isNull, isUndefined, remove } from 'lodash-es';\nimport {\n  BehaviorSubject,\n  combineLatest,\n  fromEvent,\n  NEVER,\n  Observable,\n  Subject,\n  Subscription\n} from 'rxjs';\nimport { filter, first, map, scan, switchMap, takeUntil } from 'rxjs/operators';\nimport { MapPopupDirective } from './map-popup.directive';\nimport {\n  C8yMarker,\n  C8yMarkerAttributes,\n  getC8yMarker,\n  MAP_DEFAULT_CONFIG,\n  MAP_TILE_LAYER,\n  MapConfig,\n  PositionManagedObject\n} from './map.model';\nimport { MapService } from './map.service';\n\n@Component({\n  selector: 'c8y-map',\n  templateUrl: './map.component.html',\n  providers: [ManagedObjectRealtimeService]\n})\nexport class MapComponent {\n  /**\n   * The leaflet map object.\n   */\n  map: L.Map;\n  /**\n   * The markers placed on the map.\n   */\n  markers: Array<C8yMarker | L.Marker> = [];\n  /**\n   * The leaflet representation used.\n   */\n  leaflet: typeof L;\n  /**\n   * Tells if the map was already initialized.\n   */\n  isInit = false;\n\n  @ViewChild('map')\n  mapElement: ElementRef;\n\n  @ContentChild(MapPopupDirective)\n  popup: MapPopupDirective;\n\n  @Input()\n  config: MapConfig = {};\n\n  @Input()\n  assets: PositionManagedObject | PositionManagedObject[];\n\n  @Input()\n  polyline$: Observable<L.LatLngExpression[] | L.LatLngExpression[][]> = NEVER;\n\n  @Input()\n  polylineOptions: L.PolylineOptions;\n\n  @Output()\n  onRealtimeUpdate = new EventEmitter<PositionManagedObject>();\n\n  @Output()\n  onMove: Observable<L.LeafletEvent>;\n\n  @Output()\n  onMoveEnd: Observable<L.LeafletEvent>;\n\n  @Output()\n  onZoomStart: Observable<L.LeafletEvent>;\n\n  @Output()\n  onZoomEnd: Observable<L.LeafletEvent>;\n\n  @Output()\n  onMap = new BehaviorSubject<L.Map | null>(null);\n\n  @Output()\n  onInit = new EventEmitter<typeof L>();\n\n  protected realtimeSubscription: Subscription;\n  protected unsubscribeTrigger$ = new Subject<void>();\n  protected destroy$ = new Subject<void>();\n\n  private markerTitle = gettext('Marker at position {{lat}}, {{lng}}');\n\n  constructor(\n    protected moRealtimeService: ManagedObjectRealtimeService,\n    protected mapService: MapService,\n    @Inject(MAP_TILE_LAYER) protected layers$: Observable<MapTileLayer[]>,\n    @Inject(MAP_DEFAULT_CONFIG)\n    protected defaultConfig$: Observable<MapDefaultConfig>,\n    protected translateService: TranslateService,\n    protected geo: GeoService,\n    protected datePipe: DatePipe,\n    protected widgetGlobalAutoRefreshService: WidgetGlobalAutoRefreshService\n  ) {\n    this.initOutputs();\n  }\n\n  startRealtime() {\n    if (!this.assets || (Array.isArray(this.assets) && this.assets.length > 1)) {\n      this.config.realtime = false;\n      this.stopRealtime();\n      return;\n    }\n    const asset = Array.isArray(this.assets) ? this.assets[0] : this.assets;\n    this.realtimeSubscription = this.moRealtimeService\n      .onUpdate$(asset)\n      .subscribe((asset: PositionManagedObject) => {\n        const marker = this.findMarker(asset.id);\n        const icon = this.getAssetIcon(asset);\n        marker.setIcon(icon);\n        marker.setLatLng(this.geo.getLatLong(asset));\n        if (Array.isArray(this.assets)) {\n          this.assets[0] = asset;\n        } else {\n          this.assets = asset;\n        }\n        this.moveToPositionOfMo(asset);\n        this.onRealtimeUpdate.emit(asset);\n      });\n  }\n\n  moveToPositionOfMo(positions: PositionManagedObject | PositionManagedObject[]) {\n    const position = Array.isArray(positions) ? positions[0] : positions;\n    if (this.config.follow) {\n      this.map.setView([position.c8y_Position.lat, position.c8y_Position.lng]);\n    }\n  }\n\n  stopRealtime() {\n    if (this.realtimeSubscription) {\n      this.realtimeSubscription.unsubscribe();\n    }\n  }\n\n  findMarker(moOrId: string | IEvent | PositionManagedObject) {\n    const getId = moOrId => (typeof moOrId === 'string' ? moOrId : moOrId?.id);\n    return this.markers.find(\n      (marker: C8yMarker) =>\n        marker.asset?.id === getId(moOrId) || marker.event?.id === getId(moOrId)\n    );\n  }\n\n  addMarkerToMap(marker: C8yMarker | L.Marker) {\n    this.markers.push(marker);\n    marker.addTo(this.map);\n  }\n\n  getAssetMarker(asset: PositionManagedObject) {\n    if (!asset) {\n      return;\n    }\n\n    const icon = this.getAssetIcon(asset);\n    const { lat, lng } = asset.c8y_Position;\n    const leafletMarker = this.leaflet.marker(this.geo.getLatLong(asset), {\n      icon,\n      title: this.translateService.instant(this.markerTitle, { lat, lng })\n    });\n    const marker = getC8yMarker(leafletMarker, asset);\n    this.bindPopup(marker, asset);\n\n    return marker;\n  }\n\n  getTrackingMarker(event: IEvent) {\n    if (!event) {\n      return;\n    }\n\n    const icon = this.getTrackingIcon();\n    const { lat, lng } = event.c8y_Position;\n    const leafletMarker = this.leaflet.marker(this.geo.getLatLong(event), {\n      icon,\n      title: this.translateService.instant(this.markerTitle, { lat, lng })\n    });\n    const marker = getC8yMarker(leafletMarker, null, event);\n    this.bindPopup(marker, event);\n\n    return marker;\n  }\n\n  getAssetIcon(asset: PositionManagedObject) {\n    const assetTypeIcon = this.config.icon || asset.icon?.name;\n    const status = MapService.getStatus(asset);\n    const color = this.config.color ? `style='color: ${this.config.color};'` : '';\n    const icon = this.leaflet.divIcon({\n      html: `<div class=\"dlt-c8y-icon-marker icon-3x ${status}\" ${color}><i class=\"dlt-c8y-icon-${\n        assetTypeIcon || 'data-transfer'\n      }\" /></div>`,\n      className: 'c8y-map-marker-icon',\n      // iconAnchor is used to set the marker accurately on click\n      iconAnchor: [8, 8]\n    });\n    return icon;\n  }\n\n  getTrackingIcon() {\n    const icon = this.leaflet.divIcon({\n      html: `<div class=\"dlt-c8y-icon-marker icon-3x text-muted\"></div>`,\n      className: 'c8y-map-marker-icon',\n      // iconAnchor is used to set the marker accurately on click\n      iconAnchor: [8, 8]\n    });\n    return icon;\n  }\n\n  removeMarker(marker: C8yMarker | L.Marker) {\n    if (marker) {\n      marker.remove();\n      remove(this.markers, m => m === marker);\n    }\n  }\n\n  clearMarkers(fragment?: C8yMarkerAttributes) {\n    const matchingMarkers = marker => !fragment || !!marker[fragment];\n    this.markers.filter(matchingMarkers).forEach(marker => marker.remove());\n    this.markers = this.markers.filter(marker => !matchingMarkers(marker));\n  }\n\n  refreshMarkers() {\n    this.clearMarkers();\n    let assets: PositionManagedObject[] = [];\n    if (!isUndefined(this.assets)) {\n      assets = Array.isArray(this.assets) ? this.assets : [this.assets];\n    }\n    assets.forEach(asset => {\n      const marker = this.getAssetMarker(asset);\n      this.addMarkerToMap(marker);\n    });\n    if (!this.config.center) {\n      this.zoomToBound(assets);\n    }\n    this.toggleControls();\n  }\n\n  center() {\n    this.map?.setView(this.config.center);\n  }\n\n  refresh() {\n    if (this.isInit) {\n      this.refreshMarkers();\n    }\n  }\n\n  protected async ngAfterViewInit() {\n    this.leaflet = await this.mapService.getLeaflet();\n    const initialized$ = combineLatest([this.layers$, this.defaultConfig$]).pipe(\n      first(),\n      takeUntil(this.unsubscribeTrigger$)\n    );\n\n    initialized$.subscribe(([layers, defaultConfig]) => {\n      this.initMap(layers, defaultConfig);\n      this.refreshMarkers();\n    });\n\n    combineLatest([this.polyline$, initialized$])\n      .pipe(\n        map(([expressions]) => this.leaflet.polyline(expressions, this.polylineOptions)),\n        scan((oldPolyline, newPolyline) => {\n          if (!!oldPolyline) {\n            this.map.removeLayer(oldPolyline);\n          }\n          if (!!newPolyline) {\n            newPolyline.addTo(this.map);\n            this.fitBounds(newPolyline.getBounds());\n          }\n\n          return newPolyline;\n        }, null),\n        takeUntil(this.unsubscribeTrigger$)\n      )\n      .subscribe();\n  }\n\n  protected ngOnChanges(changes: SimpleChanges): void {\n    if (!this.map) {\n      return;\n    }\n    if (changes.assets?.currentValue && !changes.assets?.firstChange) {\n      this.refreshMarkers();\n    }\n\n    if (changes.config?.currentValue && !changes.config?.firstChange) {\n      this.changeConfig(changes.config);\n    }\n  }\n\n  protected ngOnDestroy(): void {\n    this.unsubscribeAllListeners();\n    this.destroy$.next();\n    this.destroy$.complete();\n  }\n\n  protected unsubscribeAllListeners() {\n    this.unsubscribeTrigger$.next();\n    this.stopRealtime();\n  }\n\n  protected initOutputs() {\n    const getMapEventObservable = eventName => {\n      return this.onMap.pipe(\n        filter(map => !!map),\n        switchMap(map => fromEvent<L.LeafletEvent>(map, eventName)),\n        takeUntilDestroyed()\n      );\n    };\n    const dragStart$ = getMapEventObservable('dragstart');\n    const move$ = getMapEventObservable('move');\n    const dragEnd$ = getMapEventObservable('dragend');\n\n    this.onMove = dragStart$.pipe(\n      switchMap(() => move$.pipe(takeUntil(dragEnd$))),\n      takeUntil(this.unsubscribeTrigger$)\n    );\n\n    this.onMoveEnd = getMapEventObservable('moveend');\n\n    this.onZoomEnd = getMapEventObservable('zoomend');\n\n    this.onZoomStart = getMapEventObservable('zoomstart');\n  }\n\n  protected initMap(layers: MapTileLayer[], defaultConfig: MapConfig): void {\n    const defaultOptions = {\n      center: this.config.center || defaultConfig.center,\n      zoomSnap: 0,\n      zoom: this.config.zoomLevel || defaultConfig.zoomLevel,\n      worldCopyJump: true\n    };\n\n    if (this.map) {\n      this.map.remove();\n    }\n    this.map = this.leaflet.map(this.mapElement.nativeElement, defaultOptions);\n\n    this.map.attributionControl.setPrefix('');\n\n    this.fitBounds(this.config.bounds);\n\n    this.addLayers(layers);\n\n    this.handleMobile();\n\n    this.onMap.next(this.map);\n\n    if (this.config.realtime) {\n      this.startRealtime();\n    }\n\n    this.isInit = true;\n    this.onInit.emit(this.leaflet);\n  }\n\n  protected handleMobile() {\n    // adding event listener to do mobile 2 finger scrolling\n    if (this.leaflet.Browser.mobile) {\n      const touchMsg = this.translateService.instant(gettext('Use two fingers to move the map.'));\n      this.map.dragging.disable();\n      const container = this.map.getContainer();\n      container.setAttribute('data-touch-warning-content', touchMsg);\n      container.addEventListener('touchstart', event => this.handleTouch(event));\n      container.addEventListener('touchmove', event => this.handleTouch(event));\n      container.addEventListener('touchend', event => this.handleTouch(event));\n      container.addEventListener('touchcancel', event => this.handleTouch(event));\n      container.addEventListener('click', event => this.handleTouch(event));\n    }\n  }\n\n  protected addLayers(layers: MapTileLayer[]) {\n    const flattenLayers: MapTileLayer[] = flatten(layers);\n    const baseLayers: L.Control.LayersObject = {};\n    const overlays: L.Control.LayersObject = {};\n    let firstLayer = true;\n    for (const layer of sortByPriority(flattenLayers)) {\n      const objectToAddTo = layer.isOverlay ? overlays : baseLayers;\n      if (objectToAddTo[layer.label]) {\n        continue;\n      }\n\n      const tiles = this.leaflet.tileLayer(layer.layerUrl, layer.options);\n      if (!layer.isOverlay && firstLayer) {\n        firstLayer = false;\n        tiles.addTo(this.map);\n      }\n      objectToAddTo[layer.label] = tiles;\n    }\n    if (flattenLayers.length > 1) {\n      this.leaflet.control.layers(baseLayers, overlays, { position: 'bottomleft' }).addTo(this.map);\n    }\n  }\n\n  protected changeConfig(change: SimpleChange) {\n    if (this.hasChanged(change, 'zoomLevel')) {\n      this.map.setZoom(this.config.zoomLevel);\n    }\n\n    if (this.hasChanged(change, 'center') && every(change.currentValue.center, p => !isNull(p))) {\n      this.map.setView(change.currentValue.center);\n    }\n\n    if (this.hasChanged(change, 'icon') || this.hasChanged(change, 'color')) {\n      this.refreshMarkers();\n    }\n\n    if (this.hasChanged(change, 'realtime') && change.currentValue.realtime) {\n      this.startRealtime();\n    }\n\n    if (change.currentValue.realtime === false) {\n      this.stopRealtime();\n    }\n\n    if (this.hasChanged(change, 'follow')) {\n      this.moveToPositionOfMo(this.assets);\n    }\n\n    if (this.hasChanged(change, 'disablePan') || this.hasChanged(change, 'disableZoom')) {\n      this.toggleControls();\n    }\n  }\n\n  protected hasChanged(change: SimpleChange, prop: keyof MapConfig) {\n    return change.currentValue[prop] !== change.previousValue[prop];\n  }\n\n  protected toggleControls() {\n    if (this.config.disableZoom) {\n      this.map.removeControl(this.map.zoomControl);\n      this.map.scrollWheelZoom.disable();\n    } else {\n      this.map.addControl(this.map.zoomControl);\n      this.map.scrollWheelZoom.enable();\n    }\n    if (this.config.disablePan) {\n      this.map.dragging.disable();\n    } else {\n      this.map.dragging.enable();\n    }\n  }\n\n  private handleTouch(e: Event) {\n    // Disregard touch events on the minimap if present\n    const ignoreList = [\n      'leaflet-control-minimap',\n      'leaflet-interactive',\n      'leaflet-popup-content',\n      'leaflet-popup-content-wrapper',\n      'leaflet-popup-close-button',\n      'leaflet-control-zoom-in',\n      'leaflet-control-zoom-out'\n    ];\n\n    let ignoreElement = false;\n    for (let i = 0; i < ignoreList.length; i++) {\n      if (this.leaflet.DomUtil.hasClass(e.target as HTMLElement, ignoreList[i])) {\n        ignoreElement = true;\n      }\n    }\n\n    const container = this.map.getContainer();\n    if (ignoreElement) {\n      if (\n        this.leaflet.DomUtil.hasClass(e.target as HTMLElement, 'leaflet-interactive') &&\n        e.type === 'touchmove' &&\n        (e as TouchEvent).touches.length === 1\n      ) {\n        this.leaflet.DomUtil.addClass(container, 'touch-warning');\n        this.map.dragging.disable();\n      } else {\n        this.leaflet.DomUtil.removeClass(container, 'touch-warning');\n      }\n      return;\n    }\n\n    if (e.type !== 'touchmove' && e.type !== 'touchstart') {\n      this.leaflet.DomUtil.removeClass(container, 'touch-warning');\n      return;\n    }\n    if ((e as TouchEvent).touches.length === 1) {\n      this.leaflet.DomUtil.addClass(container, 'touch-warning');\n      this.map.dragging.disable();\n    } else {\n      this.map.dragging.enable();\n      this.leaflet.DomUtil.removeClass(container, 'touch-warning');\n    }\n  }\n\n  private zoomToBound(assets: PositionManagedObject[]) {\n    if (isEmpty(assets)) return;\n\n    const bounds: [number, number][] = assets.map(asset => [\n      asset.c8y_Position.lat,\n      asset.c8y_Position.lng\n    ]);\n    if (assets.length > 1) {\n      this.map.flyToBounds(bounds, { animate: false });\n      return;\n    }\n    this.map.flyTo(\n      [assets[0].c8y_Position.lat, assets[0].c8y_Position.lng],\n      this.map.options.zoom,\n      {\n        animate: false\n      }\n    );\n  }\n\n  private fitBounds(bounds: L.LatLngBounds) {\n    if (bounds?.isValid()) {\n      this.map.fitBounds(bounds, this.config.fitBoundsOptions);\n    }\n  }\n\n  private bindPopup(marker: C8yMarker, context: PositionManagedObject | IEvent) {\n    if (this.popup) {\n      marker.on('click', () => {\n        this.popup.viewContainer.clear();\n        const view = this.popup.viewContainer.createEmbeddedView(this.popup.template, {\n          $implicit: context\n        });\n        view.detectChanges();\n        marker\n          .unbindPopup()\n          .bindPopup(this.popup.elementRef.nativeElement.previousSibling, {\n            offset: [-3, -40],\n            maxWidth: 140,\n            autoPan: true,\n            closeButton: false\n          })\n          .openPopup();\n      });\n    }\n  }\n}\n","<div class=\"c8y-map\">\n  <div #map></div>\n</div>\n<ng-content></ng-content>\n","import {\n  Component,\n  EventEmitter,\n  Inject,\n  Input,\n  IterableDiffers,\n  Output,\n  SimpleChange,\n  SimpleChanges\n} from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport type { MapDefaultConfig, MapTileLayer } from '@c8y/options';\nimport {\n  ColorService,\n  CountdownIntervalComponent,\n  DatePipe,\n  GeoService,\n  ManagedObjectRealtimeService,\n  WidgetGlobalAutoRefreshService,\n  globalAutoRefreshLoading,\n  DynamicComponent,\n  DynamicComponentAlertAggregator\n} from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport type * as L from 'leaflet';\nimport {\n  BehaviorSubject,\n  EMPTY,\n  Observable,\n  combineLatest,\n  from,\n  fromEvent,\n  merge,\n  of\n} from 'rxjs';\nimport {\n  catchError,\n  debounceTime,\n  mergeMap,\n  skip,\n  switchMap,\n  takeUntil,\n  tap\n} from 'rxjs/operators';\nimport { ClusterMap } from './cluster-map';\nimport { MapComponent } from './map.component';\nimport {\n  ClusterMapConfig,\n  ClusterSize,\n  MAP_DEFAULT_CONFIG,\n  MAP_TILE_LAYER,\n  PositionManagedObject\n} from './map.model';\nimport { MapService } from './map.service';\n\n@Component({\n  selector: 'c8y-cluster-map',\n  templateUrl: './cluster-map.component.html',\n  providers: [ManagedObjectRealtimeService]\n})\nexport class ClusterMapComponent extends MapComponent implements DynamicComponent {\n  isLoading$ = new BehaviorSubject(false);\n  countdownIntervalComp: CountdownIntervalComponent;\n\n  @Input()\n  config: ClusterMapConfig;\n\n  @Input()\n  rootNode: IManagedObject;\n\n  @Input('asset')\n  assets: PositionManagedObject;\n\n  @Input()\n  showClusterColor = false;\n\n  @Output()\n  mapChange = new EventEmitter<L.LeafletEvent>();\n\n  alerts: DynamicComponentAlertAggregator;\n\n  errorNotifier = new BehaviorSubject(null);\n  private reloadTrigger$ = new BehaviorSubject(false);\n  private clusters: ClusterMap[] = [];\n  private readonly EVENT_THROTTLE_TIME = 750;\n\n  constructor(\n    protected moRealtimeService: ManagedObjectRealtimeService,\n    protected mapService: MapService,\n    @Inject(MAP_TILE_LAYER) protected layers$: Observable<MapTileLayer[]>,\n    @Inject(MAP_DEFAULT_CONFIG)\n    protected defaultConfig$: Observable<MapDefaultConfig>,\n    protected translateService: TranslateService,\n    protected widgetGlobalAutoRefreshService: WidgetGlobalAutoRefreshService,\n    private iterable: IterableDiffers,\n    private colorService: ColorService,\n    geo: GeoService,\n    datePipe: DatePipe\n  ) {\n    super(\n      moRealtimeService,\n      mapService,\n      layers$,\n      defaultConfig$,\n      translateService,\n      geo,\n      datePipe,\n      widgetGlobalAutoRefreshService\n    );\n  }\n\n  async ngOnChanges(changes: SimpleChanges) {\n    if (changes.config?.firstChange) {\n      return;\n    }\n\n    if (changes.rootNode?.previousValue !== changes.rootNode?.currentValue) {\n      this.changeRootNode(changes.rootNode.currentValue);\n    }\n\n    if (changes.config?.currentValue) {\n      this.changeConfig(changes.config);\n    }\n  }\n\n  changeConfig(change: SimpleChange) {\n    // on following, cancel reload to avoid stale state\n    if (change.currentValue.follow === true) {\n      this.cancelReload();\n      this.isLoading$.next(false);\n    }\n\n    if (change.currentValue.refreshInterval !== change.previousValue.refreshInterval) {\n      this.reload();\n    }\n    super.changeConfig(change);\n  }\n\n  async ngAfterViewInit() {\n    if (!this.leaflet) {\n      this.leaflet = await this.mapService.getLeaflet();\n    }\n\n    if (this.config.widgetInstanceGlobalAutoRefreshContext) {\n      this.handleGlobalRefreshLoading();\n    }\n    combineLatest([this.layers$, this.defaultConfig$])\n      .pipe(takeUntil(this.unsubscribeTrigger$))\n      .subscribe(([layers, defaultConfig]) => {\n        this.initMap(layers, defaultConfig);\n        this.changeRootNode(this.rootNode);\n        this.changeConfig(new SimpleChange({}, this.config, false));\n      });\n  }\n\n  async reset() {\n    this.ngOnDestroy();\n    await this.ngAfterViewInit();\n  }\n\n  reload() {\n    this.reloadTrigger$.next(true);\n  }\n\n  cancelReload() {\n    this.reloadTrigger$.next(false);\n  }\n\n  listenToClusterAndIntervalChanges() {\n    const countdownEnded$ = this.config.widgetInstanceGlobalAutoRefreshContext\n      ? this.widgetGlobalAutoRefreshService.countdownActions.countdownEnded$.pipe(\n          takeUntil(this.destroy$)\n        )\n      : this.countdownIntervalComp\n        ? this.countdownIntervalComp.countdownEnded.pipe(takeUntil(this.unsubscribeTrigger$))\n        : EMPTY;\n\n    const mapChange$ = this.getMapChangeObservable();\n    merge(this.reloadTrigger$, mapChange$, countdownEnded$)\n      .pipe(\n        tap(value => {\n          if (this.config.widgetInstanceGlobalAutoRefreshContext) {\n            !this.isLeafletEventInterface(value) && this.isLoading$.next(true);\n            return;\n          }\n          this.isLoading$.next(true);\n          this.countdownIntervalComp?.stop(true);\n        }),\n        switchMap(value =>\n          value === false\n            ? of([])\n            : from(this.mapService.getClusterSize(this.map.getBounds())).pipe(\n                mergeMap((clusterSize: ClusterSize) =>\n                  this.getClusterRects(clusterSize, this.map.getBounds())\n                ),\n                mergeMap(rects => this.createOrUpdateCluster(rects)),\n                catchError(error => {\n                  this.errorNotifier.next(error);\n\n                  return of([]);\n                })\n              )\n        ),\n        takeUntil(this.unsubscribeTrigger$)\n      )\n      .subscribe((clusters: ClusterMap[]) => {\n        clusters.forEach(cluster => cluster.render(this.map));\n        this.isLoading$.next(false);\n        if (this.config.widgetInstanceGlobalAutoRefreshContext) {\n          return;\n        }\n        this.countdownIntervalComp?.start();\n      });\n  }\n\n  listenToClusterMapChanges() {\n    this.getMapChangeObservable().subscribe();\n  }\n\n  refreshMarkers() {\n    if (this.assets) {\n      super.refreshMarkers();\n      return;\n    }\n    this.clusters.forEach(cluster => {\n      cluster.clear(this.map);\n    });\n    this.reload();\n  }\n\n  private changeRootNode(mo: IManagedObject) {\n    this.unsubscribeAllListeners();\n    this.clearMarkers();\n    this.clearClusters();\n\n    const isPositionDevice = mo?.c8y_Position && mo?.c8y_IsDevice;\n    if (isPositionDevice) {\n      this.assets = mo as PositionManagedObject;\n      this.refreshMarkers();\n      this.listenToClusterMapChanges();\n    } else {\n      this.assets = null;\n      this.listenToClusterAndIntervalChanges();\n      this.reload();\n    }\n  }\n\n  private async getClusterRects(\n    levelThreshold: ClusterSize = ClusterSize.FOUR,\n    viewBounds: L.LatLngBounds,\n    level = 0\n  ): Promise<L.Rectangle[]> {\n    let rects = [];\n\n    if (levelThreshold === ClusterSize.NONE) {\n      const rect = await this.getRect(viewBounds);\n      rects.push(rect);\n      return rects;\n    }\n\n    if (level >= levelThreshold) {\n      return rects;\n    }\n    level++;\n\n    const { lat: x1, lng: y1 } = viewBounds.getSouthWest();\n    const { lat: x2, lng: y2 } = viewBounds.getNorthEast();\n    const newX2 = (x1 + x2) / 2;\n    const newY2 = (y1 + y2) / 2;\n\n    const bounds: [[number, number], [number, number]][] = [\n      [\n        [x1, y1],\n        [newX2, newY2]\n      ],\n      [\n        [newX2, newY2],\n        [x2, y2]\n      ],\n      [\n        [x1, newY2],\n        [newX2, y2]\n      ],\n      [\n        [newX2, y1],\n        [x2, newY2]\n      ]\n    ];\n    for (const bound of bounds) {\n      const latLngBound = this.leaflet.latLngBounds(bound);\n      const rect = await this.getRect(latLngBound);\n      rects = [...rects, ...(await this.getClusterRects(levelThreshold, latLngBound, level))];\n\n      if (level === levelThreshold) {\n        rects.push(rect);\n      }\n    }\n\n    return rects;\n  }\n\n  private async getRect(latLngBound: L.LatLngBounds) {\n    let color = 'none';\n    if (this.showClusterColor) {\n      color = await this.colorService.generateColor(latLngBound.toBBoxString());\n    }\n    const rect = this.leaflet.rectangle(latLngBound, {\n      color,\n      weight: color === 'none' ? 0 : 1,\n      interactive: false\n    });\n    return rect;\n  }\n\n  private clearClusters() {\n    this.clusters.forEach(cluster => {\n      cluster.clear(this.map);\n    });\n    this.clusters = [];\n  }\n\n  private async updateCluster(cluster: ClusterMap) {\n    const clusterCount = await this.mapService.getPositionMOsFromBoundCount(\n      cluster.rect.getBounds(),\n      this.rootNode\n    );\n    if (clusterCount > this.mapService.MAX_DEVICE_PER_CLUSTER) {\n      cluster.setClusterToBigMarker(this.map, clusterCount, this.leaflet);\n      cluster.positions = [];\n      return cluster;\n    }\n\n    cluster.removeClusterToBigMarker();\n    cluster.positions = await this.mapService.getPositionMOsFromBound(\n      cluster.rect.getBounds(),\n      this.rootNode\n    );\n    return cluster;\n  }\n\n  private createOrUpdateCluster(rects: L.Rectangle<unknown>[]) {\n    const isNew = rects.length !== this.clusters.length;\n    if (isNew) {\n      this.clearClusters();\n    }\n    const updatePromise = rects.map((rect, index) => {\n      if (isNew) {\n        const cluster = new ClusterMap(\n          this.iterable,\n          asset => this.getAssetMarker(asset),\n          this.translateService\n        );\n        this.clusters.push(cluster);\n      }\n      this.clusters[index].rect = rect;\n      return this.updateCluster(this.clusters[index]);\n    });\n\n    return Promise.all(updatePromise);\n  }\n\n  private getMapChangeObservable() {\n    return merge(\n      fromEvent<L.LeafletEvent>(this.map, 'move'),\n      fromEvent<L.LeafletEvent>(this.map, 'moveend')\n    ).pipe(\n      debounceTime(this.EVENT_THROTTLE_TIME),\n      tap(event => this.mapChange.emit(event)),\n      takeUntil(this.unsubscribeTrigger$)\n    );\n  }\n\n  private isLeafletEventInterface(\n    LeafletEventObject: L.LeafletEvent | boolean | void\n  ): LeafletEventObject is L.LeafletEvent {\n    return (LeafletEventObject as L.LeafletEvent)?.type !== undefined;\n  }\n\n  private handleGlobalRefreshLoading(): void {\n    this.isLoading$\n      .pipe(\n        skip(1),\n        globalAutoRefreshLoading(this.widgetGlobalAutoRefreshService),\n        takeUntil(this.destroy$)\n      )\n      .subscribe();\n\n    this.destroy$.subscribe({\n      complete: () =>\n        this.isLoading$.value && this.widgetGlobalAutoRefreshService.decrementLoading()\n    });\n  }\n}\n","<div class=\"c8y-map\">\n  <div #map></div>\n</div>\n<ng-content></ng-content>\n","import { Component, EventEmitter, Input, Output, SimpleChanges, ViewChild } from '@angular/core';\nimport { CountdownIntervalComponent } from '@c8y/ngx-components';\nimport { cloneDeep } from 'lodash-es';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ClusterMapComponent } from './cluster-map.component';\nimport { ClusterMapConfig, MapStatusButtonsConfig } from './map.model';\n\n@Component({\n  selector: 'c8y-map-status',\n  templateUrl: './map-status.component.html'\n})\nexport class MapStatusComponent {\n  @Input()\n  config: ClusterMapConfig;\n\n  @Output()\n  configChange = new EventEmitter<ClusterMapConfig>();\n\n  @Output()\n  onUnfollow = new EventEmitter<ClusterMapConfig>();\n\n  @Input()\n  clusterMap: ClusterMapComponent;\n\n  @Input() buttonsConfig: Partial<MapStatusButtonsConfig> = {};\n\n  centerMapButtonDisabled = true;\n  @ViewChild(CountdownIntervalComponent) countdownIntervalComp: CountdownIntervalComponent;\n\n  initConfig: ClusterMapConfig;\n  refreshPaused = false;\n  private destroy$ = new Subject<void>();\n\n  ngOnInit(): void {\n    this.initConfig = cloneDeep(this.config);\n    this.buttonsConfig = Object.assign(this.defaultButtonsConfig(), this.buttonsConfig);\n  }\n\n  ngAfterViewInit(): void {\n    if (!this.config.widgetInstanceGlobalAutoRefreshContext) {\n      this.clusterMap.countdownIntervalComp = this.countdownIntervalComp;\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.clusterMap?.previousValue !== changes.clusterMap?.currentValue) {\n      this.checkIfMapIsAlreadyCentered();\n    }\n  }\n\n  center() {\n    this.clusterMap.center();\n  }\n\n  reload() {\n    this.clusterMap.reload();\n  }\n\n  cancelReload() {\n    this.clusterMap.cancelReload();\n  }\n\n  toggleRealtime() {\n    this.config = {\n      ...this.config,\n      realtime: !this.config.realtime\n    };\n    this.configChange.emit(this.config);\n  }\n\n  toggleAutoRefresh($event: MouseEvent) {\n    $event.preventDefault();\n    $event.stopPropagation();\n    this.refreshPaused = !this.refreshPaused;\n    if (this.refreshPaused) {\n      this.countdownIntervalComp.stop(true);\n    } else {\n      this.countdownIntervalComp.start();\n    }\n  }\n\n  unfollow() {\n    this.config = {\n      ...this.clusterMap.config,\n      follow: false\n    };\n    this.configChange.emit(this.config);\n    this.onUnfollow.emit(this.config);\n  }\n\n  follow() {\n    this.config = {\n      ...this.config,\n      follow: true\n    };\n    this.configChange.emit(this.config);\n  }\n\n  ngOnDestroy(): void {\n    this.destroy$.next();\n  }\n\n  private checkIfMapIsAlreadyCentered() {\n    this.clusterMap.mapChange.pipe(takeUntil(this.destroy$)).subscribe((event: L.LeafletEvent) => {\n      if (this.config?.center && event.sourceTarget?.getBounds) {\n        const bounds: L.LatLngBounds = event.sourceTarget.getBounds();\n        this.centerMapButtonDisabled = this.shouldDisableCenterButton(bounds);\n      }\n    });\n  }\n\n  /**\n   * Checks if Center button should be disabled according to provided bounds.\n   * Provided bounds contain coordinates of current map rectangle corners.\n   * Center button should be disabled if distance between center coordinates (from config) and center of current bounds\n   * is less than 1/4 of bounds dimensions.\n   * To achieve it we just need to check if center coordinates (from config) are contained in the boundaries of\n   * current bounds shrunk by 25%.\n   * @param bounds Current map view boundaries.\n   * @returns True if distance between config center and current boundaries center is bigger than 1/4 of boundaries dimensions\n   */\n  private shouldDisableCenterButton(bounds: L.LatLngBounds): boolean {\n    const shrunkBounds = bounds.pad(-0.25);\n    return shrunkBounds.contains(this.config.center);\n  }\n\n  private defaultButtonsConfig(): MapStatusButtonsConfig {\n    return {\n      realtime: { show: this.config.realtime || this.clusterMap.config.follow, disabled: false }\n    };\n  }\n}\n","<div class=\"c8y-map-status\">\n  <div class=\"leaflet-touch\">\n    <div\n      class=\"leaflet-bar\"\n      role=\"group\"\n    >\n      <button\n        class=\"c8y-realtime\"\n        title=\"{{ 'Realtime' | translate }}\"\n        type=\"button\"\n        *ngIf=\"buttonsConfig.realtime.show\"\n        (click)=\"toggleRealtime()\"\n        [disabled]=\"buttonsConfig.realtime.disabled\"\n      >\n        <span\n          class=\"c8y-pulse\"\n          [ngClass]=\"{\n            active: clusterMap?.config.realtime,\n            inactive: !clusterMap?.config.realtime\n          }\"\n        ></span>\n      </button>\n\n      <label\n        class=\"toggle-countdown vertical\"\n        [attr.aria-label]=\"\n          refreshPaused ? ('Enable auto refresh' | translate) : ('Disable auto refresh' | translate)\n        \"\n        [tooltip]=\"\n          refreshPaused ? ('Enable auto refresh' | translate) : ('Disable auto refresh' | translate)\n        \"\n        placement=\"left\"\n        *ngIf=\"\n          !config.widgetInstanceGlobalAutoRefreshContext &&\n          clusterMap?.config.refreshInterval &&\n          !clusterMap?.config.follow\n        \"\n        [adaptivePosition]=\"false\"\n        [container]=\"'body'\"\n        [delay]=\"1000\"\n      >\n        <input\n          type=\"checkbox\"\n          (click)=\"toggleAutoRefresh($event)\"\n        />\n        <c8y-countdown-interval\n          [hidden]=\"refreshPaused\"\n          [countdownInterval]=\"clusterMap?.config.refreshInterval\"\n        ></c8y-countdown-interval>\n        <i\n          c8yIcon=\"pause\"\n          *ngIf=\"refreshPaused\"\n        ></i>\n      </label>\n\n      <button\n        title=\"{{ 'Cancel reload' | translate }}\"\n        type=\"button\"\n        *ngIf=\"(clusterMap?.isLoading$ | async) && !config.widgetInstanceGlobalAutoRefreshContext\"\n        (click)=\"cancelReload()\"\n      >\n        <i\n          class=\"icon-spin\"\n          c8yIcon=\"refresh\"\n        ></i>\n      </button>\n      <button\n        [title]=\"'Reload' | translate\"\n        type=\"button\"\n        *ngIf=\"\n          !clusterMap?.config.realtime &&\n          !clusterMap?.assets &&\n          !(clusterMap?.isLoading$ | async) &&\n          !config.widgetInstanceGlobalAutoRefreshContext\n        \"\n        (click)=\"reload()\"\n      >\n        <i c8yIcon=\"refresh\"></i>\n      </button>\n      <button\n        title=\"{{ 'Center map' | translate }}\"\n        type=\"button\"\n        (click)=\"center()\"\n        [disabled]=\"centerMapButtonDisabled || clusterMap?.config.follow\"\n      >\n        <i c8yIcon=\"target1\"></i>\n      </button>\n      <button\n        title=\"{{ 'Unfollow' | translate }}\"\n        type=\"button\"\n        *ngIf=\"clusterMap?.config.follow\"\n        (click)=\"unfollow()\"\n      >\n        <i c8yIcon=\"marker-off\"></i>\n      </button>\n\n      <button\n        title=\"{{ 'Follow' | translate }}\"\n        type=\"button\"\n        *ngIf=\"initConfig.follow && !clusterMap?.config.follow\"\n        (click)=\"follow()\"\n      >\n        <i c8yIcon=\"marker\"></i>\n      </button>\n    </div>\n  </div>\n</div>\n","import { CommonModule as NgCommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule as NgFormsModule } from '@angular/forms';\nimport { CommonModule, CoreModule, FormsModule, RealtimeModule } from '@c8y/ngx-components';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { ClusterMapComponent } from './cluster-map.component';\nimport { MapPopupDirective } from './map-popup.directive';\nimport { MapStatusComponent } from './map-status.component';\nimport { MapComponent } from './map.component';\nimport { MAP_DEFAULT_CONFIG, MAP_TILE_LAYER } from './map.model';\nimport { MapService } from './map.service';\n\n@NgModule({\n  declarations: [MapComponent, MapStatusComponent, ClusterMapComponent, MapPopupDirective],\n  imports: [\n    NgCommonModule,\n    NgFormsModule,\n    CommonModule,\n    FormsModule,\n    RealtimeModule,\n    CoreModule,\n    TooltipModule\n  ],\n  exports: [MapComponent, MapStatusComponent, ClusterMapComponent, MapPopupDirective],\n  providers: [\n    {\n      provide: MAP_TILE_LAYER,\n      useFactory: (mapService: MapService) => {\n        return mapService.getMapTileLayers$();\n      },\n      deps: [MapService]\n    },\n    {\n      provide: MAP_DEFAULT_CONFIG,\n      useFactory: (mapService: MapService) => {\n        return mapService.getDefaultConfig();\n      },\n      deps: [MapService]\n    }\n  ]\n})\nexport class MapModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i1","i2.MapService","i3","NgCommonModule","NgFormsModule","CommonModule","FormsModule"],"mappings":"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"}