@c8y/ngx-components 1021.75.8 → 1021.76.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.
Files changed (39) hide show
  1. package/branding/shared/supports-branding.service.d.ts.map +1 -1
  2. package/core/dashboard/widgets-dashboard.component.d.ts +4 -2
  3. package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
  4. package/core/navigator/navigator-bottom/navigator-bottom.service.d.ts +3 -1
  5. package/core/navigator/navigator-bottom/navigator-bottom.service.d.ts.map +1 -1
  6. package/esm2022/branding/shared/supports-branding.service.mjs +6 -3
  7. package/esm2022/core/dashboard/widgets-dashboard.component.mjs +9 -5
  8. package/esm2022/core/navigator/navigator-bottom/navigator-bottom.service.mjs +13 -6
  9. package/esm2022/device-map/device-map.component.mjs +2 -2
  10. package/esm2022/map/cluster-map.component.mjs +6 -3
  11. package/esm2022/map/map-status.component.mjs +23 -5
  12. package/esm2022/map/map.model.mjs +5 -2
  13. package/esm2022/map/map.service.mjs +17 -1
  14. package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +25 -6
  15. package/esm2022/widgets/implementations/map/map-widget.component.mjs +40 -11
  16. package/fesm2022/c8y-ngx-components-branding-shared.mjs +5 -2
  17. package/fesm2022/c8y-ngx-components-branding-shared.mjs.map +1 -1
  18. package/fesm2022/c8y-ngx-components-device-map.mjs +1 -1
  19. package/fesm2022/c8y-ngx-components-device-map.mjs.map +1 -1
  20. package/fesm2022/c8y-ngx-components-map.mjs +47 -7
  21. package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
  22. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +67 -19
  23. package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
  24. package/fesm2022/c8y-ngx-components.mjs +17 -8
  25. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  26. package/locales/locales.pot +3 -0
  27. package/map/cluster-map.component.d.ts +2 -1
  28. package/map/cluster-map.component.d.ts.map +1 -1
  29. package/map/map-status.component.d.ts +7 -2
  30. package/map/map-status.component.d.ts.map +1 -1
  31. package/map/map.model.d.ts +1 -0
  32. package/map/map.model.d.ts.map +1 -1
  33. package/map/map.service.d.ts +1 -0
  34. package/map/map.service.d.ts.map +1 -1
  35. package/package.json +1 -1
  36. package/widgets/implementations/map/map-widget-config.component.d.ts +1 -0
  37. package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
  38. package/widgets/implementations/map/map-widget.component.d.ts +10 -4
  39. package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"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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"}
1
+ {"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: 0,\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 const defaultFitBoundsOptions: L.FitBoundsOptions = {\n padding: [50, 50]\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 async getAssetsBounds(assets: PositionManagedObject[]): Promise<L.LatLngBounds | undefined> {\n const leaflet = await this.getLeaflet();\n const bounds = leaflet.latLngBounds([]);\n let hasValidPositions = false;\n assets.forEach(asset => {\n const position = asset.c8y_Position;\n if (position && typeof position.lat === 'number' && typeof position.lng === 'number') {\n bounds.extend([position.lat, position.lng]);\n hasValidPositions = true;\n }\n });\n if (!hasValidPositions || !bounds.isValid()) {\n return;\n }\n return bounds;\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 ElementRef,\n EventEmitter,\n Inject,\n Input,\n IterableDiffers,\n Output,\n SimpleChange,\n SimpleChanges,\n ViewChild\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 @ViewChild('map')\n mapElement: ElementRef;\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, PositionManagedObject } 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 @Input() assets: PositionManagedObject[];\n\n @Output()\n configChange = new EventEmitter<ClusterMapConfig>();\n\n @Output()\n onUnfollow = new EventEmitter<ClusterMapConfig>();\n\n @Output() fitAssetsToBounds = new EventEmitter<void>();\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 fitToBoundsButtonDisabled: boolean;\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 fitToBounds() {\n this.fitToBoundsButtonDisabled = true;\n this.fitAssetsToBounds.emit();\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 (event.sourceTarget?.getBounds) {\n const bounds: L.LatLngBounds = event.sourceTarget.getBounds();\n this.fitToBoundsButtonDisabled = this.shouldDisableFitToBoundsButton(bounds);\n if (this.config?.center) {\n this.centerMapButtonDisabled = this.shouldDisableCenterButton(bounds);\n }\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 shouldDisableFitToBoundsButton(bounds: L.LatLngBounds): boolean {\n if (!this.assets) {\n return true;\n }\n return this.assets.every(({ c8y_Position }) =>\n bounds.contains([c8y_Position.lat, c8y_Position.lng])\n );\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=\"{{ 'Fit to assets bounds' | translate }}\"\n type=\"button\"\n (click)=\"fitToBounds()\"\n [disabled]=\"fitToBoundsButtonDisabled || clusterMap?.config.follow\"\n >\n <i c8yIcon=\"waypoint-map\"></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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"}