@c8y/ngx-components 1023.57.0 → 1023.58.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ai/agents/html/index.d.ts +6 -0
- package/ai/agents/html/index.d.ts.map +1 -0
- package/context-dashboard/index.d.ts +7 -3
- package/context-dashboard/index.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-ai-agents-html.mjs +1672 -0
- package/fesm2022/c8y-ngx-components-ai-agents-html.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +19 -5
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-map.mjs +241 -24
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget-ai-config.mjs +2 -1667
- package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget-ai-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +32 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +13 -13
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/locales/de.po +15 -6
- package/locales/es.po +15 -6
- package/locales/fr.po +15 -6
- package/locales/ja_JP.po +15 -6
- package/locales/ko.po +15 -6
- package/locales/locales.pot +6 -3
- package/locales/nl.po +15 -6
- package/locales/pl.po +15 -6
- package/locales/pt_BR.po +15 -6
- package/locales/zh_CN.po +15 -6
- package/locales/zh_TW.po +15 -6
- package/map/index.d.ts +66 -8
- package/map/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -1
|
@@ -1 +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, QueriesUtil } 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';\nimport { GlobalContextDisplayMode } from '@c8y/ngx-components/global-context';\n\n/**\n * Utility function to assign asset and event information to a Leaflet marker.\n * @param marker The Leaflet marker instance.\n * @param asset The managed object representing the asset (optional).\n * @param event The event associated with the marker (optional).\n * @returns The marker with asset and/or event information attached.\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\n/**\n * Injection token for providing map tile layers as an observable.\n */\nexport const MAP_TILE_LAYER = new InjectionToken<Observable<MapTileLayer[]>>('MAP_TILE_LAYER');\n\n/**\n * Utility type to require only one of the specified keys in a type.\n * @ignore\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\n/**\n * Attributes that can be attached to a Cumulocity marker.\n */\ninterface C8yMarkerAttr {\n asset: PositionManagedObject;\n event: IEvent;\n}\n\n/**\n * Type representing the attribute keys for a Cumulocity marker.\n */\nexport type C8yMarkerAttributes = keyof C8yMarkerAttr;\n\n/**\n * Leaflet marker extended with either asset or event information.\n */\nexport type C8yMarker = L.Marker & RequireOnlyOne<C8yMarkerAttr, 'asset' | 'event'>;\n\n/**\n * Enum for supported cluster sizes on the map.\n */\nexport enum ClusterSize {\n /** No clustering. */\n NONE = 0,\n /** Cluster of 4. */\n FOUR = 1,\n /** Cluster of 16. */\n SIXTEEN = 2\n}\n\n/**\n * Enum for map tenant option keys used in configuration.\n */\nexport enum MapTenantOptionKeys {\n /** Map configuration key. */\n CONFIG = 'map-config',\n /** Map layers key. */\n LAYERS = 'map-layers'\n}\n\n/**\n * Managed object with position and optional alarm status and icon for map display.\n */\nexport interface PositionManagedObject extends IManagedObject {\n /**\n * Position information (latitude, longitude, optional altitude).\n */\n c8y_Position: {\n lat: number;\n lng: number;\n alt?: number;\n };\n\n /**\n * Optional active alarms status for the asset.\n */\n c8y_ActiveAlarmsStatus?: {\n minor: number;\n major: number;\n warning: number;\n critical: number;\n };\n\n /**\n * Optional icon information for the asset.\n */\n icon?: {\n name: string;\n };\n}\n\n/**\n * Configuration for the cluster map, including center and refresh interval.\n */\nexport type ClusterMapConfig = MapConfig & {\n /**\n * Center coordinates of the map [latitude, longitude].\n */\n center: [number, number];\n isRealtimeEnabled?: boolean;\n isAutoRefreshEnabled?: boolean;\n /**\n * Optional refresh interval in milliseconds (null for no auto-refresh).\n */\n refreshInterval?: number | null;\n /** If set to true, the map will automatically fit to bounds on initialization. */\n autoFitToBounds?: boolean;\n};\n\n/**\n * General map configuration, including options for following, real-time, icon, color, zoom, pan, and bounds.\n */\nexport type MapConfig = MapDefaultConfig & {\n /** Whether the map should follow the selected asset. */\n follow?: boolean;\n /** Whether the map should update in real-time. */\n realtime?: boolean;\n /** Optional icon name for the map. */\n icon?: string;\n /** Optional color for the map or marker. */\n color?: string;\n /** Disable zoom controls. */\n disableZoom?: boolean;\n /** Disable pan controls. */\n disablePan?: boolean;\n /** Optional map bounds. */\n bounds?: L.LatLngBounds;\n /** Optional fit bounds options. */\n fitBoundsOptions?: L.FitBoundsOptions;\n refreshOption?: 'live' | 'history';\n displayMode?: GlobalContextDisplayMode;\n} & GlobalAutoRefreshWidgetConfig;\n\n/**\n * Injection token for providing the default map configuration as an observable.\n */\nexport const MAP_DEFAULT_CONFIG = new InjectionToken<Observable<MapDefaultConfig>>(\n 'MAP_DEFAULT_CONFIG'\n);\n\n/**\n * Default map tile layer configuration (OpenStreetMap).\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 '©<a href=\"http://www.openstreetmap.org/copyright\" rel=\"noreferrer nofollow\">OpenStreetMap</a>',\n noWrap: false\n }\n};\n\n/**\n * Default map configuration (centered on Düsseldorf, zoom level 2).\n */\nexport const defaultMapConfig: MapDefaultConfig = {\n center: [51.23544, 6.79599], // Düsseldorf\n zoomLevel: 2\n};\n\n/**\n * Default options for fitting map bounds (padding).\n */\nexport const defaultFitBoundsOptions: L.FitBoundsOptions = {\n padding: [50, 50]\n};\n\n/**\n * Configuration for the status buttons shown on the map UI.\n */\nexport type MapStatusButtonsConfig = {\n autoRefresh: { show: boolean; disabled?: boolean };\n refresh: { show: boolean; disabled?: boolean };\n /** Real-time button configuration. */\n realtime: { show: boolean; disabled?: boolean };\n /** Fit to bounds button configuration. */\n fitToBounds: { show: boolean; disabled?: boolean };\n /** Center button configuration. */\n center: { show: boolean; disabled?: boolean };\n};\n\n/**\n * Extension of QueriesUtil to use decimal literals instead of float literals.\n * Used for queries involving longitude and latitude to avoid precision issues.\n */\nexport class QueriesUtilDecimalExtension extends QueriesUtil {\n override useAsFloat(operand: string | number) {\n operand = this.quoteString(operand);\n if (typeof operand === 'number') {\n return `${operand}d`;\n }\n return operand;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n IIdentified,\n IManagedObject,\n InventoryService,\n IResultList,\n Paging,\n QueriesUtil\n} from '@c8y/client';\nimport { FeatureCacheService, 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, firstValueFrom, Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport {\n ClusterSize,\n defaultLayer,\n defaultMapConfig,\n MapTenantOptionKeys,\n PositionManagedObject,\n QueriesUtilDecimalExtension\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 private queriesUtil = new QueriesUtil();\n\n /**\n * @ignore: Only DI.\n */\n constructor(\n private inventory: InventoryService,\n private options: OptionsService,\n private serviceRegistry: ServiceRegistry,\n private featureCacheService: FeatureCacheService\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: IIdentified) {\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: IIdentified) {\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 isInHierarchyOfMO 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 isInHierarchyOfMO?: IManagedObject\n ): Promise<number> {\n return this.getPositionMOsFromBound(bound, isInHierarchyOfMO, 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 isInHierarchyOfMO 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 isInHierarchyOfMO: 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 isInHierarchyOfMO 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 isInHierarchyOfMO: IManagedObject,\n count: true\n ): Promise<number>;\n async getPositionMOsFromBound(\n bound: L.LatLngBounds,\n isInHierarchyOfMO?: 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 filterObjWithCoordinates = {\n __and: [\n ...(isInHierarchyOfMO\n ? [\n {\n __or: [\n { id: isInHierarchyOfMO.id },\n await this.childrenOfGroupFilter(isInHierarchyOfMO)\n ]\n }\n ]\n : []),\n {\n __has: 'c8y_Position'\n },\n {\n ['c8y_Position.lat']: {\n __gt: latMin\n }\n },\n {\n ['c8y_Position.lat']: {\n __lt: latMax\n }\n },\n {\n [lngMin < lngMax ? '__and' : '__or']: [\n {\n ['c8y_Position.lng']: {\n __gt: lngMin\n }\n },\n {\n ['c8y_Position.lng']: {\n __lt: lngMax\n }\n }\n ]\n }\n ]\n };\n\n const query = this.queriesUtil.buildQuery(filterObjWithCoordinates);\n\n const { paging, data } = await this.inventory.list({\n pageSize: count ? 1 : this.MAX_DEVICE_PER_CLUSTER,\n withTotalPages: count,\n query\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 query = this.queriesUtil.buildQuery({\n __and: [{ __has: 'c8y_Position' }, { __has: 'c8y_IsDevice' }]\n });\n const { paging, data } = await this.inventory.list({\n pageSize: count ? 1 : pageSize,\n withTotalPages: !!count,\n query\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 isInHierarchyOfMO 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 isInHierarchyOfMO?: IIdentified,\n pageSize = 500\n ): Promise<IResultList<PositionManagedObject>> {\n const childrenFilter = isInHierarchyOfMO\n ? await this.childrenOfGroupFilter(isInHierarchyOfMO)\n : undefined;\n\n const orValue = childrenFilter ? [{ id: isInHierarchyOfMO.id }, childrenFilter] : undefined;\n\n const queryObj = {\n __filter: {\n __and: [{ __has: 'c8y_Position' }],\n ...(orValue ? { __or: orValue } : {})\n }\n };\n\n const query = this.queriesUtil.buildQuery(queryObj);\n const filter: { pageSize: number; withTotalPages: boolean; query: string } = {\n pageSize,\n withTotalPages: true,\n query\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 * Gets the bounds of all assets, optionally within a group.\n * @param isInHierarchyOfMO Is inhierachy of managed object to limit the assets to a group.\n * @returns The bounds of all assets.\n */\n async getAllBounds(isInHierarchyOfMO?: IIdentified): Promise<L.LatLngBounds> {\n return this.getBounds('query', isInHierarchyOfMO);\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 return this.getBounds('q');\n }\n\n /**\n * Calculates the bounding box that contains all given assets.\n * @param assets The assets to calculate the bounds for.\n * @returns The calculated bounds or undefined if no valid positions are found.\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 private async childrenOfGroupFilter(mo: IIdentified) {\n try {\n const useInHierarchyOf = await firstValueFrom(\n this.featureCacheService.getFeatureState('ui.map.isinhierarchyof')\n );\n\n if (useInHierarchyOf) {\n return { __isinhierarchyof: mo.id };\n }\n } catch (e) {\n console.warn('Error while determining isinhierarchyof feature toggle state:', e);\n }\n\n return { __bygroupid: mo.id };\n }\n\n /**\n * Internal method to calculate bounds based on position coordinates.\n * @param queryName The query parameter name to use ('q' or 'query'). Use q to limit to devices only.\n * @param isInHierarchyOfMO Optional managed object to limit the assets to a group.\n * @returns The calculated bounds\n */\n private async getBounds(\n queryName: 'q' | 'query',\n isInHierarchyOfMO?: IIdentified\n ): Promise<L.LatLngBounds> {\n const childrenFilter = isInHierarchyOfMO\n ? await this.childrenOfGroupFilter(isInHierarchyOfMO)\n : undefined;\n const filter = (coord: 'lat' | 'lng', order: 'asc' | 'desc') => ({\n pageSize: 1,\n [queryName]: new QueriesUtil().buildQuery({\n __filter: {\n __and: [\n childrenFilter,\n {\n __has: 'c8y_Position'\n }\n ].filter(Boolean)\n },\n __orderby: [\n {\n [`c8y_Position.${coord}`]: order === 'asc' ? 1 : -1\n }\n ]\n })\n });\n\n const filterReverse = (op: 'lt' | 'gt', order: 'asc' | 'desc') => ({\n pageSize: 1,\n [queryName]: new QueriesUtilDecimalExtension().buildQuery({\n __filter: {\n __and: [\n childrenFilter,\n {\n __has: 'c8y_Position',\n [`c8y_Position.lng`]: {\n [`__${op}`]: 0\n }\n }\n ].filter(Boolean)\n },\n __orderby: [\n {\n [`c8y_Position.lng`]: order === 'asc' ? 1 : -1\n }\n ]\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","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/gettext';\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({ selector: '[c8yMapPopup]' })\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 { gettext } from '@c8y/ngx-components/gettext';\nimport {\n DatePipe,\n GeoService,\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 instance.\n */\n map: L.Map;\n /**\n * The markers currently placed on the map.\n */\n markers: Array<C8yMarker | L.Marker> = [];\n /**\n * The leaflet library reference used for map operations.\n */\n leaflet: typeof L;\n /**\n * Indicates if the map was already initialized.\n */\n isInit = false;\n\n /**\n * Reference to the map DOM element.\n */\n @ViewChild('map')\n mapElement: ElementRef;\n\n /**\n * Reference to the custom popup directive for map markers.\n */\n @ContentChild(MapPopupDirective)\n popup: MapPopupDirective;\n\n /**\n * Map configuration object (center, zoom, icon, color, etc).\n */\n @Input()\n config: MapConfig = {};\n\n /**\n * Asset(s) to display as markers on the map.\n */\n @Input()\n assets: PositionManagedObject | PositionManagedObject[];\n\n /**\n * Observable for polyline coordinates to display on the map.\n */\n @Input()\n polyline$: Observable<L.LatLngExpression[] | L.LatLngExpression[][]> = NEVER;\n\n /**\n * Polyline display options for the map.\n */\n @Input()\n polylineOptions: L.PolylineOptions;\n\n /**\n * Emits when a tracked asset is updated in real-time.\n */\n @Output()\n onRealtimeUpdate = new EventEmitter<PositionManagedObject>();\n\n /**\n * Emits observable of map drag/move events.\n */\n @Output()\n onMove: Observable<L.LeafletEvent>;\n\n /**\n * Emits observable of map move end events.\n */\n @Output()\n onMoveEnd: Observable<L.LeafletEvent>;\n\n /**\n * Emits observable of map zoom start events.\n */\n @Output()\n onZoomStart: Observable<L.LeafletEvent>;\n\n /**\n * Emits observable of map zoom end events.\n */\n @Output()\n onZoomEnd: Observable<L.LeafletEvent>;\n\n /**\n * Emits the Leaflet map instance when available.\n */\n @Output()\n onMap = new BehaviorSubject<L.Map | null>(null);\n\n /**\n * Emits when the map and Leaflet library are initialized.\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 /**\n * Starts real-time updates for a single asset on the map.\n * Updates marker position and icon as new data arrives.\n */\n startRealtime() {\n if (this.realtimeSubscription) {\n return;\n }\n\n if (this.assets === null || (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\n if (!marker) {\n return;\n }\n\n const icon = this.getAssetIcon(asset);\n const newLatLng = this.geo.getLatLong(asset);\n\n marker.setIcon(icon);\n marker.setLatLng(newLatLng);\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 /**\n * Moves the map view to the position of the given asset(s) if follow is enabled.\n * @param positions The asset or array of assets to center the map on.\n */\n moveToPositionOfMo(positions: PositionManagedObject | PositionManagedObject[]) {\n if (!positions || !this.map) {\n return;\n }\n const position = Array.isArray(positions) ? positions[0] : positions;\n if (!position?.c8y_Position) {\n return;\n }\n if (this.config.follow) {\n this.map.setView([position.c8y_Position.lat, position.c8y_Position.lng]);\n }\n }\n\n /**\n * Stops real-time updates for the asset.\n */\n stopRealtime() {\n if (this.realtimeSubscription) {\n this.realtimeSubscription.unsubscribe();\n this.realtimeSubscription = null;\n }\n }\n\n /**\n * Finds a marker on the map by asset, event, or ID.\n * @param moOrId Asset, event, or string ID to search for.\n * @returns The found marker or undefined.\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 /**\n * Adds a marker to the map and internal marker list.\n * @param marker The marker to add.\n */\n addMarkerToMap(marker: C8yMarker | L.Marker) {\n this.markers.push(marker);\n marker.addTo(this.map);\n }\n\n /**\n * Creates and returns a marker for the given asset, including icon and popup.\n * @param asset The asset to create a marker for.\n * @returns The created marker.\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 /**\n * Creates and returns a marker for a tracking event, including icon and popup.\n * @param event The event to create a marker for.\n * @returns The created marker.\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 /**\n * Returns a Leaflet icon for the given asset, using config or asset icon and color.\n * @param asset The asset to get the icon for.\n * @returns The Leaflet icon.\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 /**\n * Returns a Leaflet icon for a tracking event.\n * @returns The Leaflet icon.\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 /**\n * Removes a marker from the map and internal marker list.\n * @param marker The marker to remove.\n */\n removeMarker(marker: C8yMarker | L.Marker) {\n if (marker) {\n marker.remove();\n remove(this.markers, m => m === marker);\n }\n }\n\n /**\n * Removes all markers from the map, optionally filtered by marker attribute.\n * @param fragment Optional marker attribute to filter by.\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 /**\n * Refreshes all markers on the map based on the current assets.\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\n if (!this.config.center) {\n this.zoomToBound(assets);\n }\n this.toggleControls();\n }\n\n /**\n * Centers the map on the configured center coordinates.\n */\n center() {\n this.map?.setView(this.config.center);\n }\n\n /**\n * Refreshes the map and markers if the map is initialized.\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, 'bounds')) {\n this.fitBounds(change.currentValue.bounds);\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 {\n ColorService,\n CountdownIntervalComponent,\n DatePipe,\n DynamicComponent,\n DynamicComponentAlertAggregator,\n GeoService,\n ManagedObjectRealtimeService,\n WidgetGlobalAutoRefreshService,\n globalAutoRefreshLoading\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 { BehaviorSubject, Observable, combineLatest, from, fromEvent, merge, of } from 'rxjs';\nimport {\n catchError,\n debounceTime,\n filter,\n mergeMap,\n skip,\n switchMap,\n take,\n takeUntil,\n tap\n} from 'rxjs/operators';\nimport { ClusterMap } from './cluster-map';\nimport { MapComponent } from './map.component';\nimport {\n ClusterMapConfig,\n ClusterSize,\n defaultFitBoundsOptions,\n MAP_DEFAULT_CONFIG,\n MAP_TILE_LAYER,\n PositionManagedObject\n} from './map.model';\nimport { MapService } from './map.service';\n\n/**\n * Smart map component for that clusters devices together when there are too many to display individually.\n * Unlike the basic map, this component loads device data dynamically and manages cluster rendering and updates.\n * Extends the base MapComponent with clustering, dynamic data loading, and advanced refresh logic.\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 /** Emits true while the map is loading or refreshing clusters. */\n isLoading$ = new BehaviorSubject(false);\n /** @ignore */\n countdownIntervalComp: CountdownIntervalComponent;\n\n /**\n * Cluster map configuration, including clustering thresholds and refresh intervals.\n */\n @Input()\n config: ClusterMapConfig;\n\n /**\n * The root managed object (e.g., group or device) for which to load and cluster data.\n */\n @Input()\n rootNode: IManagedObject;\n\n /**\n * Single asset to display (if not clustering). Used for following a specific device.\n * If provided, clusters will not be used, and the asset will be displayed individually.\n * If not provided, the component will cluster devices based on the root node.\n */\n @Input('asset')\n assets: PositionManagedObject;\n\n /**\n * Whether to show a color overlay for each cluster rectangle. This can be useful for debugging or visualizing clusters.\n */\n @Input()\n showClusterColor = false;\n\n /**\n * Emits Leaflet map change events (move, moveend) for external listeners.\n */\n @Output()\n mapChange = new EventEmitter<L.LeafletEvent>();\n\n /** Reference to the map element in the template. */\n @ViewChild('map')\n mapElement: ElementRef;\n\n /** Aggregator for dynamic component alerts. */\n alerts: DynamicComponentAlertAggregator;\n\n /** @ignore */\n errorNotifier = new BehaviorSubject(null);\n\n /**\n * Indicates if the map was manually changed by the user (e.g., panned or zoomed).\n */\n isDirty = false;\n private reloadTrigger$ = new BehaviorSubject(false);\n private clusters: ClusterMap[] = [];\n private readonly EVENT_THROTTLE_TIME = 750;\n /** Tracks the last followed position to prevent unnecessary map movements. */\n private lastFollowedPosition: { lat: number; lng: number } | null = null;\n /** Flag to skip first map movement after switching from realtime (prevents jump to stale cluster data). */\n private skipNextFollowMove = false;\n\n /**\n * Constructs the ClusterMapComponent, injecting required services and initializing the base map.\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 /**\n * @ignore\n */\n async ngOnChanges(changes: SimpleChanges) {\n if (changes.config?.firstChange || !this.map) {\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 /**\n * Handles changes to the map configuration using a state machine approach.\n * @param change The config change object.\n */\n changeConfig(change: SimpleChange) {\n if (!this.map) return;\n\n const prevState = this.getMapState(change.previousValue);\n const currState = this.getMapState(change.currentValue);\n\n if (prevState !== currState) {\n this.handleStateTransition(prevState, currState);\n }\n\n this.handleFollowChanges(change);\n this.handleRefreshIntervalChanges(change);\n\n super.changeConfig(change);\n }\n\n /**\n * @ignore\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 /**\n * Resets the map and clusters, re-initializing the component.\n */\n async reset() {\n this.ngOnDestroy();\n await this.ngAfterViewInit();\n }\n\n /**\n * Triggers a reload of cluster data.\n */\n reload() {\n this.reloadTrigger$.next(true);\n }\n\n /**\n * Cancels an ongoing reload operation.\n */\n cancelReload() {\n this.reloadTrigger$.next(false);\n }\n\n /**\n * Subscribes to cluster and interval changes, updating clusters as needed.\n * Handles auto-refresh and global refresh loading.\n */\n listenToClusterAndIntervalChanges() {\n const mapChange$ = this.getMapChangeObservable();\n merge(this.reloadTrigger$, mapChange$)\n .pipe(\n tap(() => {\n this.isLoading$.next(true);\n }),\n filter(value => {\n if (value === false) {\n this.isLoading$.next(false);\n return false;\n }\n\n const isMapChangeEvent = typeof value !== 'boolean';\n const shouldSkip = isMapChangeEvent && this.config.follow;\n if (shouldSkip) {\n this.isLoading$.next(false);\n }\n return !shouldSkip;\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 // Don't render clusters if in realtime mode (single asset with markers)\n if (this.config.realtime && this.assets) {\n this.isLoading$.next(false);\n return;\n }\n\n // If follow mode with asset but cluster has no positions, render marker from asset\n const hasNoClusterPositions = clusters.length === 1 && clusters[0].positions?.length === 0;\n if (this.config.follow && this.assets && hasNoClusterPositions) {\n this.refreshMarkers();\n }\n\n clusters.forEach(cluster => cluster.render(this.map));\n\n if (clusters.length === 1 && clusters[0].positions?.length === 1 && this.config.follow) {\n const position = clusters[0].positions[0];\n const newPos = { lat: position.c8y_Position.lat, lng: position.c8y_Position.lng };\n\n if (this.skipNextFollowMove) {\n this.skipNextFollowMove = false;\n this.lastFollowedPosition = newPos;\n } else {\n // Only move map if position changed significantly (tolerance: 0.00001 degrees ≈ 1 meter)\n const hasSignificantChange =\n !this.lastFollowedPosition ||\n Math.abs(this.lastFollowedPosition.lat - newPos.lat) > 0.00001 ||\n Math.abs(this.lastFollowedPosition.lng - newPos.lng) > 0.00001;\n\n if (hasSignificantChange) {\n this.lastFollowedPosition = newPos;\n this.moveToPositionOfMo(position);\n }\n }\n }\n this.isLoading$.next(false);\n });\n }\n\n /**\n * Subscribes to map change events for cluster updates.\n */\n listenToClusterMapChanges() {\n this.getMapChangeObservable().subscribe();\n }\n\n /**\n * Refreshes markers or clusters, depending on whether a single asset or clusters are shown.\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 /**\n * Overrides base startRealtime to ensure assets and markers are set for single device realtime mode.\n * Also switches from cluster subscription to marker-only mode.\n */\n override startRealtime() {\n // Ensure assets is set for realtime mode\n if (!this.assets) {\n // Try to use current position from clusters if available (prevents jumping to old position)\n const hasClusterWithPosition =\n this.clusters?.length === 1 && this.clusters[0].positions?.length === 1;\n\n if (hasClusterWithPosition) {\n this.assets = this.clusters[0].positions[0];\n } else if (this.rootNode?.c8y_Position && this.rootNode?.c8y_IsDevice) {\n this.assets = this.rootNode as PositionManagedObject;\n }\n }\n\n // Switch from cluster mode to single asset mode\n if (this.map && this.clusters?.length > 0) {\n this.unsubscribeAllListeners();\n this.clearClusters();\n }\n\n // Ensure markers exist BEFORE starting realtime (so updates can find them)\n if (this.map && this.assets && (!this.markers || this.markers.length === 0)) {\n this.refreshMarkers();\n }\n\n // Call parent startRealtime to start realtime subscription\n super.startRealtime();\n }\n\n /**\n * Determines the current map state based on config.\n */\n private getMapState(config: any): 'realtime' | 'paused' | 'auto-refresh' | 'initial' {\n if (!config) return 'initial';\n\n const isRealtime = config.realtime === true;\n const isAutoRefreshEnabled = config.isAutoRefreshEnabled ?? true;\n\n if (isRealtime && isAutoRefreshEnabled) {\n return 'realtime';\n } else if (!isRealtime && !isAutoRefreshEnabled) {\n return 'paused';\n } else {\n return 'auto-refresh';\n }\n }\n\n /**\n * Handles state transitions using a clear state machine pattern.\n */\n private handleStateTransition(\n from: 'realtime' | 'paused' | 'auto-refresh' | 'initial',\n to: 'realtime' | 'paused' | 'auto-refresh' | 'initial'\n ) {\n const transition = `${from}->${to}`;\n\n switch (transition) {\n case 'realtime->paused':\n this.transitionRealtimeToPaused();\n break;\n case 'realtime->auto-refresh':\n this.transitionRealtimeToAutoRefresh();\n break;\n case 'paused->realtime':\n this.transitionPausedToRealtime();\n break;\n case 'paused->auto-refresh':\n this.transitionPausedToAutoRefresh();\n break;\n case 'auto-refresh->realtime':\n this.transitionAutoRefreshToRealtime();\n break;\n case 'auto-refresh->paused':\n this.transitionAutoRefreshToPaused();\n break;\n case 'initial->realtime':\n case 'initial->auto-refresh':\n case 'initial->paused':\n break;\n default:\n // No action needed for unhandled transitions\n }\n }\n\n /** Realtime → Paused: Keep markers, stop subscriptions */\n private transitionRealtimeToPaused() {\n this.unsubscribeAllListeners();\n }\n\n /** Realtime → Auto-refresh: Switch to cluster mode */\n private transitionRealtimeToAutoRefresh() {\n this.unsubscribeAllListeners();\n\n // Preserve marker position to prevent jump\n this.preserveMarkerPosition();\n\n this.clearMarkers();\n this.assets = null;\n this.listenToClusterAndIntervalChanges();\n }\n\n /** Paused → Realtime: Resume with existing markers */\n private transitionPausedToRealtime() {\n this.cancelReload();\n this.isLoading$.next(false);\n this.unsubscribeAllListeners();\n\n // If assets are null (paused from cluster mode), set up for realtime\n if (!this.assets && this.rootNode) {\n this.changeRootNode(this.rootNode);\n return; // changeRootNode handles the rest\n }\n\n // Keep this.assets (already has current position)\n this.clearClusters();\n this.listenToClusterMapChanges();\n }\n\n /** Paused → Auto-refresh: Switch to cluster mode */\n private transitionPausedToAutoRefresh() {\n this.unsubscribeAllListeners();\n\n // Preserve marker position to prevent jump\n this.preserveMarkerPosition();\n\n this.clearMarkers();\n this.assets = null;\n this.listenToClusterAndIntervalChanges();\n }\n\n /** Auto-refresh → Realtime: Use cluster position, switch to marker mode */\n private transitionAutoRefreshToRealtime() {\n this.cancelReload();\n this.isLoading$.next(false);\n this.unsubscribeAllListeners();\n\n // Use current cluster position if available\n const hasClusterWithPosition =\n this.clusters?.length === 1 && this.clusters[0].positions?.length === 1;\n\n if (hasClusterWithPosition) {\n this.assets = this.clusters[0].positions[0];\n } else if (this.rootNode?.c8y_Position && this.rootNode?.c8y_IsDevice) {\n this.assets = this.rootNode as PositionManagedObject;\n }\n\n this.clearClusters();\n this.listenToClusterMapChanges();\n }\n\n /** Auto-refresh → Paused: Keep clusters visible, stop listeners, preserve position */\n private transitionAutoRefreshToPaused() {\n this.cancelReload();\n this.isLoading$.next(false);\n this.unsubscribeAllListeners();\n\n // Extract and preserve position from cluster for later use\n const hasClusterWithPosition =\n this.clusters?.length === 1 && this.clusters[0].positions?.length === 1;\n\n if (hasClusterWithPosition) {\n const position = this.clusters[0].positions[0];\n this.assets = position; // Store for later use when resuming to realtime\n }\n }\n\n /** Helper to preserve marker position before transitions */\n private preserveMarkerPosition() {\n if (this.markers?.length === 1 && this.markers[0] && this.config.follow) {\n const marker = this.markers[0] as any;\n const latLng = marker.getLatLng();\n this.lastFollowedPosition = { lat: latLng.lat, lng: latLng.lng };\n this.skipNextFollowMove = true;\n }\n }\n\n /** Handle follow mode changes */\n private handleFollowChanges(change: SimpleChange) {\n const followChangedToTrue =\n change.previousValue?.follow === false && change.currentValue?.follow === true;\n if (followChangedToTrue) {\n this.cancelReload();\n this.isLoading$.next(false);\n }\n\n const followChangedToFalse =\n change.previousValue?.follow === true && change.currentValue?.follow === false;\n if (followChangedToFalse) {\n this.lastFollowedPosition = null;\n }\n }\n\n /** Handle refresh interval changes */\n private handleRefreshIntervalChanges(change: SimpleChange) {\n if (change.currentValue?.refreshInterval !== change.previousValue?.refreshInterval) {\n this.reload();\n }\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 && this.config.realtime) {\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\n cluster.positions = await this.mapService.getPositionMOsFromBound(\n cluster.rect.getBounds(),\n this.rootNode\n );\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 // Set isDirty flag on user interactions\n merge(\n fromEvent<L.LeafletEvent>(this.map, 'mousedown'),\n fromEvent<MouseEvent>(this.mapElement?.nativeElement, 'wheel'),\n fromEvent<L.LeafletEvent>(this.map, 'touchstart')\n )\n .pipe(take(1), takeUntil(this.unsubscribeTrigger$))\n .subscribe(() => {\n this.isDirty = true;\n });\n let skipMoveEvent = false;\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 switchMap(async event => {\n // If the map wasn't changed by user and we have autoFitToBounds, fit the bounds\n // Skip this event and let the fitBounds-triggered event be processed instead\n if (this.config.autoFitToBounds && !this.isDirty && !skipMoveEvent) {\n const bounds = await this.mapService.getAllBounds(this.rootNode);\n skipMoveEvent = true;\n this.map.fitBounds(bounds, this.config.fitBoundsOptions || defaultFitBoundsOptions);\n return null; // Skip current event\n }\n\n skipMoveEvent = false;\n return event;\n }),\n filter(event => event !== null),\n tap(event => {\n this.mapChange.emit(event);\n }),\n takeUntil(this.unsubscribeTrigger$)\n );\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, IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\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';\nimport { NgClass, AsyncPipe } from '@angular/common';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n/**\n * Component to display controls and status information for a map rendered on an IoT Dashboard.\n * Provides UI for centering, fitting bounds, toggling real-time updates, auto-refresh, and following assets.\n */\n@Component({\n selector: 'c8y-map-status',\n templateUrl: './map-status.component.html',\n imports: [\n NgClass,\n TooltipDirective,\n CountdownIntervalComponent,\n IconDirective,\n AsyncPipe,\n C8yTranslatePipe\n ]\n})\nexport class MapStatusComponent {\n /**\n * Map configuration object, including center, refresh interval, and other map options.\n */\n @Input()\n config: ClusterMapConfig;\n\n /**\n * List of managed objects with position information to be displayed on the map.\n */\n @Input() assets: PositionManagedObject[];\n\n /**\n * Emits when the map configuration changes (e.g., toggling real-time, follow, etc.).\n */\n @Output()\n configChange = new EventEmitter<ClusterMapConfig>();\n\n /**\n * Emits when the user unfollows an asset on the map.\n */\n @Output()\n onUnfollow = new EventEmitter<ClusterMapConfig>();\n\n /**\n * Emits when the user requests to fit all assets within the map bounds.\n */\n @Output() fitAssetsToBounds = new EventEmitter<void>();\n\n /**\n * Reference to the ClusterMapComponent instance rendered in the view.\n */\n @Input()\n clusterMap: ClusterMapComponent;\n\n /**\n * Configuration for which map status buttons are shown/enabled.\n * By default the \"center\" button is shown and realtime is disabled.\n * See {@link MapStatusButtonsConfig} for available options.\n */\n @Input() buttonsConfig: Partial<MapStatusButtonsConfig> = {};\n\n /**\n * @ignore\n */\n @ViewChild(CountdownIntervalComponent) countdownIntervalComp: CountdownIntervalComponent;\n\n /**\n * @ignore\n */\n initConfig: ClusterMapConfig;\n\n /**\n * @ignore\n */\n refreshPaused = false;\n\n /**\n * @ignore\n */\n autoRefreshPausedLabel = gettext('Auto refresh paused');\n\n /**\n * @ignore\n */\n autoRefreshEnabledLabel = gettext('Auto refresh enabled');\n\n private destroy$ = new Subject<void>();\n\n /**\n * @ignore\n */\n ngOnInit(): void {\n this.initConfig = cloneDeep(this.config);\n this.buttonsConfig = Object.assign(this.defaultButtonsConfig(), this.buttonsConfig);\n }\n\n /**\n * @ignore\n */\n ngAfterViewInit(): void {\n if (\n !this.config.widgetInstanceGlobalAutoRefreshContext &&\n this.buttonsConfig.autoRefresh.show\n ) {\n this.clusterMap.countdownIntervalComp = this.countdownIntervalComp;\n }\n }\n\n /**\n * @ignore\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.clusterMap?.previousValue !== changes.clusterMap?.currentValue) {\n this.checkIfMapIsAlreadyCentered();\n }\n }\n\n /**\n * Centers the map on the configured center coordinates.\n */\n center() {\n this.clusterMap.center();\n }\n\n /**\n * Emits an event to fit all assets within the map bounds and disables the button until the next change.\n */\n fitToBounds() {\n this.buttonsConfig.fitToBounds.disabled = true;\n this.fitAssetsToBounds.emit();\n }\n\n /**\n * Reloads the map data.\n */\n reload() {\n this.clusterMap.reload();\n }\n\n /**\n * Cancels the map reload operation.\n */\n cancelReload() {\n this.clusterMap.cancelReload();\n }\n\n /**\n * Toggles real-time updates for the map.\n */\n toggleRealtime() {\n this.config = {\n ...this.config,\n realtime: !this.config.realtime\n };\n this.configChange.emit(this.config);\n }\n\n /**\n * Toggles the auto-refresh state for the map, pausing or resuming the countdown.\n * @param $event Mouse event to prevent default and stop propagation.\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 /**\n * Disables following an asset on the map and emits the change.\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 /**\n * Enables following an asset on the map and emits the change.\n */\n follow() {\n this.config = {\n ...this.config,\n follow: true\n };\n this.configChange.emit(this.config);\n }\n\n /**\n * @ignore\n */\n ngOnDestroy(): void {\n this.destroy$.next();\n }\n\n /**\n * Subscribes to map changes and updates button states based on map bounds and center.\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.buttonsConfig.fitToBounds.disabled = this.shouldDisableFitToBoundsButton(bounds);\n if (this.config?.center) {\n this.buttonsConfig.center.disabled = 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 /**\n * Checks if Fit to Bounds button should be disabled based on whether all assets are within the current bounds.\n * @param bounds Current map view boundaries.\n * @returns True if all assets are already within bounds, false otherwise.\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 /**\n * Returns the default configuration for map status buttons.\n * @returns Default MapStatusButtonsConfig object.\n */\n private defaultButtonsConfig(): MapStatusButtonsConfig {\n return {\n realtime: { show: this.config.realtime || this.clusterMap.config.follow, disabled: false },\n autoRefresh: { show: true, disabled: false },\n refresh: { show: true, disabled: false },\n fitToBounds: { show: false, disabled: false },\n center: { show: true, 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 @if (buttonsConfig.realtime.show) {\n <button\n class=\"c8y-realtime\"\n title=\"{{ 'Realtime' | translate }}\"\n type=\"button\"\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 @if (\n buttonsConfig.autoRefresh.show &&\n !config.widgetInstanceGlobalAutoRefreshContext &&\n clusterMap?.config.refreshInterval &&\n !clusterMap?.config.follow\n ) {\n <label\n class=\"toggle-countdown vertical\"\n [attr.aria-label]=\"\n (refreshPaused ? autoRefreshPausedLabel : autoRefreshEnabledLabel) | translate\n \"\n [tooltip]=\"(refreshPaused ? autoRefreshPausedLabel : autoRefreshEnabledLabel) | translate\"\n placement=\"left\"\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 @if (refreshPaused) {\n <i c8yIcon=\"pause\"></i>\n }\n </label>\n }\n @if (\n buttonsConfig.refresh.show &&\n (clusterMap?.isLoading$ | async) &&\n !config.widgetInstanceGlobalAutoRefreshContext\n ) {\n <button\n title=\"{{ 'Cancel reload' | translate }}\"\n type=\"button\"\n (click)=\"cancelReload()\"\n >\n <i\n class=\"icon-spin\"\n c8yIcon=\"refresh\"\n ></i>\n </button>\n }\n @if (\n buttonsConfig.refresh.show &&\n !clusterMap?.config.realtime &&\n !clusterMap?.assets &&\n !(clusterMap?.isLoading$ | async) &&\n !config.widgetInstanceGlobalAutoRefreshContext\n ) {\n <button\n [title]=\"'Reload' | translate\"\n type=\"button\"\n (click)=\"reload()\"\n >\n <i c8yIcon=\"refresh\"></i>\n </button>\n }\n <ng-content></ng-content>\n @if (buttonsConfig.center.show) {\n <button\n title=\"{{ 'Center map' | translate }}\"\n type=\"button\"\n (click)=\"center()\"\n [disabled]=\"buttonsConfig.center.disabled || clusterMap?.config.follow\"\n >\n <i c8yIcon=\"target1\"></i>\n </button>\n }\n @if (buttonsConfig.fitToBounds.show) {\n <button\n title=\"{{ 'Fit to assets bounds' | translate }}\"\n type=\"button\"\n (click)=\"fitToBounds()\"\n [disabled]=\"buttonsConfig.fitToBounds.disabled || clusterMap?.config.follow\"\n >\n <i c8yIcon=\"waypoint-map\"></i>\n </button>\n }\n @if (clusterMap?.config.follow) {\n <button\n title=\"{{ 'Unfollow' | translate }}\"\n type=\"button\"\n (click)=\"unfollow()\"\n >\n <i c8yIcon=\"marker-off\"></i>\n </button>\n }\n @if (initConfig.follow && !clusterMap?.config.follow) {\n <button\n title=\"{{ 'Follow' | translate }}\"\n type=\"button\"\n (click)=\"follow()\"\n >\n <i c8yIcon=\"marker\"></i>\n </button>\n }\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 imports: [\n NgCommonModule,\n NgFormsModule,\n CommonModule,\n FormsModule,\n RealtimeModule,\n CoreModule,\n TooltipModule,\n MapComponent,\n MapStatusComponent,\n ClusterMapComponent,\n MapPopupDirective\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","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, QueriesUtil } 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';\nimport { GlobalContextDisplayMode } from '@c8y/ngx-components/global-context';\n\n/**\n * Utility function to assign asset and event information to a Leaflet marker.\n * @param marker The Leaflet marker instance.\n * @param asset The managed object representing the asset (optional).\n * @param event The event associated with the marker (optional).\n * @returns The marker with asset and/or event information attached.\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\n/**\n * Injection token for providing map tile layers as an observable.\n */\nexport const MAP_TILE_LAYER = new InjectionToken<Observable<MapTileLayer[]>>('MAP_TILE_LAYER');\n\n/**\n * Utility type to require only one of the specified keys in a type.\n * @ignore\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\n/**\n * Attributes that can be attached to a Cumulocity marker.\n */\ninterface C8yMarkerAttr {\n asset: PositionManagedObject;\n event: IEvent;\n}\n\n/**\n * Type representing the attribute keys for a Cumulocity marker.\n */\nexport type C8yMarkerAttributes = keyof C8yMarkerAttr;\n\n/**\n * Leaflet marker extended with either asset or event information.\n */\nexport type C8yMarker = L.Marker & RequireOnlyOne<C8yMarkerAttr, 'asset' | 'event'>;\n\n/**\n * Enum for supported cluster sizes on the map.\n */\nexport enum ClusterSize {\n /** No clustering. */\n NONE = 0,\n /** Cluster of 4. */\n FOUR = 1,\n /** Cluster of 16. */\n SIXTEEN = 2\n}\n\n/**\n * Enum for map tenant option keys used in configuration.\n */\nexport enum MapTenantOptionKeys {\n /** Map configuration key. */\n CONFIG = 'map-config',\n /** Map layers key. */\n LAYERS = 'map-layers'\n}\n\n/**\n * Managed object with position and optional alarm status and icon for map display.\n */\nexport interface PositionManagedObject extends IManagedObject {\n /**\n * Position information (latitude, longitude, optional altitude).\n */\n c8y_Position: {\n lat: number;\n lng: number;\n alt?: number;\n };\n\n /**\n * Optional active alarms status for the asset.\n */\n c8y_ActiveAlarmsStatus?: {\n minor: number;\n major: number;\n warning: number;\n critical: number;\n };\n\n /**\n * Optional icon information for the asset.\n */\n icon?: {\n name: string;\n };\n}\n\nexport interface GroupedPositionManagedObject {\n items: PositionManagedObject[];\n}\n/**\n * Configuration for the cluster map, including center and refresh interval.\n */\nexport type ClusterMapConfig = MapConfig & {\n /**\n * Center coordinates of the map [latitude, longitude].\n */\n center: [number, number];\n isRealtimeEnabled?: boolean;\n isAutoRefreshEnabled?: boolean;\n /**\n * Optional refresh interval in milliseconds (null for no auto-refresh).\n */\n refreshInterval?: number | null;\n /** If set to true, the map will automatically fit to bounds on initialization. */\n autoFitToBounds?: boolean;\n};\n\n/**\n * General map configuration, including options for following, real-time, icon, color, zoom, pan, and bounds.\n */\nexport type MapConfig = MapDefaultConfig & {\n /** Whether the map should follow the selected asset. */\n follow?: boolean;\n /** Whether the map should update in real-time. */\n realtime?: boolean;\n /** Optional icon name for the map. */\n icon?: string;\n /** Optional color for the map or marker. */\n color?: string;\n /** Disable zoom controls. */\n disableZoom?: boolean;\n /** Disable pan controls. */\n disablePan?: boolean;\n /** Optional map bounds. */\n bounds?: L.LatLngBounds;\n /** Optional fit bounds options. */\n fitBoundsOptions?: L.FitBoundsOptions;\n refreshOption?: 'live' | 'history';\n displayMode?: GlobalContextDisplayMode;\n} & GlobalAutoRefreshWidgetConfig;\n\n/**\n * Injection token for providing the default map configuration as an observable.\n */\nexport const MAP_DEFAULT_CONFIG = new InjectionToken<Observable<MapDefaultConfig>>(\n 'MAP_DEFAULT_CONFIG'\n);\n\n/**\n * Default map tile layer configuration (OpenStreetMap).\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 '©<a href=\"http://www.openstreetmap.org/copyright\" rel=\"noreferrer nofollow\">OpenStreetMap</a>',\n noWrap: false\n }\n};\n\n/**\n * Default map configuration (centered on Düsseldorf, zoom level 2).\n */\nexport const defaultMapConfig: MapDefaultConfig = {\n center: [51.23544, 6.79599], // Düsseldorf\n zoomLevel: 2\n};\n\n/**\n * Default options for fitting map bounds (padding).\n */\nexport const defaultFitBoundsOptions: L.FitBoundsOptions = {\n padding: [50, 50]\n};\n\n/**\n * Configuration for the status buttons shown on the map UI.\n */\nexport type MapStatusButtonsConfig = {\n autoRefresh: { show: boolean; disabled?: boolean };\n refresh: { show: boolean; disabled?: boolean };\n /** Real-time button configuration. */\n realtime: { show: boolean; disabled?: boolean };\n /** Fit to bounds button configuration. */\n fitToBounds: { show: boolean; disabled?: boolean };\n /** Center button configuration. */\n center: { show: boolean; disabled?: boolean };\n};\n\n/**\n * Extension of QueriesUtil to use decimal literals instead of float literals.\n * Used for queries involving longitude and latitude to avoid precision issues.\n */\nexport class QueriesUtilDecimalExtension extends QueriesUtil {\n override useAsFloat(operand: string | number) {\n operand = this.quoteString(operand);\n if (typeof operand === 'number') {\n return `${operand}d`;\n }\n return operand;\n }\n}\n","import { Injectable } from '@angular/core';\nimport {\n IIdentified,\n IManagedObject,\n InventoryService,\n IResultList,\n Paging,\n QueriesUtil\n} from '@c8y/client';\nimport { FeatureCacheService, 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, firstValueFrom, Observable, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport {\n ClusterSize,\n defaultLayer,\n defaultMapConfig,\n GroupedPositionManagedObject,\n MapTenantOptionKeys,\n PositionManagedObject,\n QueriesUtilDecimalExtension\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 /**\n * Returns the status of a group (highest severity among its devices).\n * @param group The group of devices.\n * @returns The status string representing the highest severity in the group.\n */\n static getGroupStatus(group: GroupedPositionManagedObject) {\n let mostCriticalStatus = 'text-muted';\n let highestSeverity = 0;\n\n for (const device of group.items) {\n const status = this.getStatus(device);\n const severity = this.getStatusSeverity(status);\n\n if (severity > highestSeverity) {\n highestSeverity = severity;\n mostCriticalStatus = status;\n\n if (severity === 4) {\n return status; // Critical is highest, return immediately\n }\n }\n }\n\n return mostCriticalStatus;\n }\n\n /**\n * Maps status strings to severity levels for comparison.\n * @param status The status string.\n * @returns Numeric severity level (higher = more severe).\n */\n private static getStatusSeverity(status: string): number {\n const severityMap: Record<string, number> = {\n 'status critical': 4,\n 'status major': 3,\n 'status minor': 2,\n 'status warning': 1,\n 'text-muted': 0\n };\n return severityMap[status] ?? 0;\n }\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 private queriesUtil = new QueriesUtil();\n\n /**\n * @ignore: Only DI.\n */\n constructor(\n private inventory: InventoryService,\n private options: OptionsService,\n private serviceRegistry: ServiceRegistry,\n private featureCacheService: FeatureCacheService\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: IIdentified) {\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: IIdentified) {\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 isInHierarchyOfMO 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 isInHierarchyOfMO?: IManagedObject\n ): Promise<number> {\n return this.getPositionMOsFromBound(bound, isInHierarchyOfMO, 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 isInHierarchyOfMO 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 isInHierarchyOfMO: 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 isInHierarchyOfMO 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 isInHierarchyOfMO: IManagedObject,\n count: true\n ): Promise<number>;\n async getPositionMOsFromBound(\n bound: L.LatLngBounds,\n isInHierarchyOfMO?: 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 filterObjWithCoordinates = {\n __and: [\n ...(isInHierarchyOfMO\n ? [\n {\n __or: [\n { id: isInHierarchyOfMO.id },\n await this.childrenOfGroupFilter(isInHierarchyOfMO)\n ]\n }\n ]\n : []),\n {\n __has: 'c8y_Position'\n },\n {\n ['c8y_Position.lat']: {\n __gt: latMin\n }\n },\n {\n ['c8y_Position.lat']: {\n __lt: latMax\n }\n },\n {\n [lngMin < lngMax ? '__and' : '__or']: [\n {\n ['c8y_Position.lng']: {\n __gt: lngMin\n }\n },\n {\n ['c8y_Position.lng']: {\n __lt: lngMax\n }\n }\n ]\n }\n ]\n };\n\n const query = this.queriesUtil.buildQuery(filterObjWithCoordinates);\n\n const { paging, data } = await this.inventory.list({\n pageSize: count ? 1 : this.MAX_DEVICE_PER_CLUSTER,\n withTotalPages: count,\n query\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 query = this.queriesUtil.buildQuery({\n __and: [{ __has: 'c8y_Position' }, { __has: 'c8y_IsDevice' }]\n });\n const { paging, data } = await this.inventory.list({\n pageSize: count ? 1 : pageSize,\n withTotalPages: !!count,\n query\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 isInHierarchyOfMO 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 isInHierarchyOfMO?: IIdentified,\n pageSize = 500\n ): Promise<IResultList<PositionManagedObject>> {\n const childrenFilter = isInHierarchyOfMO\n ? await this.childrenOfGroupFilter(isInHierarchyOfMO)\n : undefined;\n\n const orValue = childrenFilter ? [{ id: isInHierarchyOfMO.id }, childrenFilter] : undefined;\n\n const queryObj = {\n __filter: {\n __and: [{ __has: 'c8y_Position' }],\n ...(orValue ? { __or: orValue } : {})\n }\n };\n\n const query = this.queriesUtil.buildQuery(queryObj);\n const filter: { pageSize: number; withTotalPages: boolean; query: string } = {\n pageSize,\n withTotalPages: true,\n query\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 * Gets the bounds of all assets, optionally within a group.\n * @param isInHierarchyOfMO Is inhierachy of managed object to limit the assets to a group.\n * @returns The bounds of all assets.\n */\n async getAllBounds(isInHierarchyOfMO?: IIdentified): Promise<L.LatLngBounds> {\n return this.getBounds('query', isInHierarchyOfMO);\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 return this.getBounds('q');\n }\n\n /**\n * Calculates the bounding box that contains all given assets.\n * @param assets The assets to calculate the bounds for.\n * @returns The calculated bounds or undefined if no valid positions are found.\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 private async childrenOfGroupFilter(mo: IIdentified) {\n try {\n const useInHierarchyOf = await firstValueFrom(\n this.featureCacheService.getFeatureState('ui.map.isinhierarchyof')\n );\n\n if (useInHierarchyOf) {\n return { __isinhierarchyof: mo.id };\n }\n } catch (e) {\n console.warn('Error while determining isinhierarchyof feature toggle state:', e);\n }\n\n return { __bygroupid: mo.id };\n }\n\n /**\n * Internal method to calculate bounds based on position coordinates.\n * @param queryName The query parameter name to use ('q' or 'query'). Use q to limit to devices only.\n * @param isInHierarchyOfMO Optional managed object to limit the assets to a group.\n * @returns The calculated bounds\n */\n private async getBounds(\n queryName: 'q' | 'query',\n isInHierarchyOfMO?: IIdentified\n ): Promise<L.LatLngBounds> {\n const childrenFilter = isInHierarchyOfMO\n ? await this.childrenOfGroupFilter(isInHierarchyOfMO)\n : undefined;\n const filter = (coord: 'lat' | 'lng', order: 'asc' | 'desc') => ({\n pageSize: 1,\n [queryName]: new QueriesUtil().buildQuery({\n __filter: {\n __and: [\n childrenFilter,\n {\n __has: 'c8y_Position'\n }\n ].filter(Boolean)\n },\n __orderby: [\n {\n [`c8y_Position.${coord}`]: order === 'asc' ? 1 : -1\n }\n ]\n })\n });\n\n const filterReverse = (op: 'lt' | 'gt', order: 'asc' | 'desc') => ({\n pageSize: 1,\n [queryName]: new QueriesUtilDecimalExtension().buildQuery({\n __filter: {\n __and: [\n childrenFilter,\n {\n __has: 'c8y_Position',\n [`c8y_Position.lng`]: {\n [`__${op}`]: 0\n }\n }\n ].filter(Boolean)\n },\n __orderby: [\n {\n [`c8y_Position.lng`]: order === 'asc' ? 1 : -1\n }\n ]\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","import { IterableChangeRecord, IterableDiffer, IterableDiffers } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport type * as L from 'leaflet';\nimport { C8yMarker, GroupedPositionManagedObject } from './map.model';\nimport { MapService } from './map.service';\n\nexport class ClusterMap {\n markers: C8yMarker[] = [];\n positions: GroupedPositionManagedObject[] = [];\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<GroupedPositionManagedObject> | null;\n\n constructor(\n private iterable: IterableDiffers,\n private addAssetCallback: (asset: GroupedPositionManagedObject) => 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: GroupedPositionManagedObject, 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 divMarker = leaflet.divIcon({\n html: `<div><div class=\"popover top show\"><span class=\"popover-content p-l-0 p-t-0 p-b-0 p-r-4 d-flex a-i-center\"><i class=\"dlt-c8y-icon-marker\"></i><span class=\"text-12 text-nowrap\">${count}</span></span><span class=\"arrow\" style=\"translate: -50% 0\"></span></div></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<GroupedPositionManagedObject>) => {\n this.removeMarkerFromMap(record.item);\n });\n\n changes.forEachAddedItem((record: IterableChangeRecord<GroupedPositionManagedObject>) => {\n this.addMarkerToMap(record.item, map);\n });\n }\n }\n\n private trackBy(index: number, item: GroupedPositionManagedObject) {\n const trackItems = item.items.map(i => [\n i.id,\n i.c8y_Position.lat,\n i.c8y_Position.lng,\n MapService.getStatus(i)\n ]);\n return trackItems.join('');\n }\n\n private removeMarkerFromMap(group: GroupedPositionManagedObject) {\n group.items.forEach(device => {\n const markers = this.markers.filter((marker: C8yMarker) => marker.asset?.id === device.id);\n markers.forEach(marker => marker.remove());\n });\n }\n}\n","import { Directive, ElementRef, TemplateRef, ViewContainerRef } from '@angular/core';\n\n@Directive({ selector: '[c8yMapPopup]' })\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 { gettext } from '@c8y/ngx-components/gettext';\nimport {\n DatePipe,\n GeoService,\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 GroupedPositionManagedObject,\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 instance.\n */\n map: L.Map;\n /**\n * The markers currently placed on the map.\n */\n markers: Array<C8yMarker | L.Marker> = [];\n /**\n * The leaflet library reference used for map operations.\n */\n leaflet: typeof L;\n /**\n * Indicates if the map was already initialized.\n */\n isInit = false;\n\n /**\n * Reference to the map DOM element.\n */\n @ViewChild('map')\n mapElement: ElementRef;\n\n /**\n * Reference to the custom popup directive for map markers.\n */\n @ContentChild(MapPopupDirective)\n popup: MapPopupDirective;\n\n /**\n * Map configuration object (center, zoom, icon, color, etc).\n */\n @Input()\n config: MapConfig = {};\n\n /**\n * Asset(s) to display as markers on the map.\n */\n @Input()\n assets: PositionManagedObject | PositionManagedObject[];\n\n /**\n * Observable for polyline coordinates to display on the map.\n */\n @Input()\n polyline$: Observable<L.LatLngExpression[] | L.LatLngExpression[][]> = NEVER;\n\n /**\n * Polyline display options for the map.\n */\n @Input()\n polylineOptions: L.PolylineOptions;\n\n /**\n * Emits when a tracked asset is updated in real-time.\n */\n @Output()\n onRealtimeUpdate = new EventEmitter<PositionManagedObject>();\n\n /**\n * Emits observable of map drag/move events.\n */\n @Output()\n onMove: Observable<L.LeafletEvent>;\n\n /**\n * Emits observable of map move end events.\n */\n @Output()\n onMoveEnd: Observable<L.LeafletEvent>;\n\n /**\n * Emits observable of map zoom start events.\n */\n @Output()\n onZoomStart: Observable<L.LeafletEvent>;\n\n /**\n * Emits observable of map zoom end events.\n */\n @Output()\n onZoomEnd: Observable<L.LeafletEvent>;\n\n /**\n * Emits the Leaflet map instance when available.\n */\n @Output()\n onMap = new BehaviorSubject<L.Map | null>(null);\n\n /**\n * Emits when the map and Leaflet library are initialized.\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 private markerGroupTitle = gettext('Group of {{count}} assets');\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 /**\n * Starts real-time updates for a single asset on the map.\n * Updates marker position and icon as new data arrives.\n */\n startRealtime() {\n if (this.realtimeSubscription) {\n return;\n }\n\n if (this.assets === null || (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\n if (!marker) {\n return;\n }\n\n const icon = this.getAssetIcon(asset);\n const newLatLng = this.geo.getLatLong(asset);\n\n marker.setIcon(icon);\n marker.setLatLng(newLatLng);\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 /**\n * Moves the map view to the position of the given asset(s) if follow is enabled.\n * @param positions The asset or array of assets to center the map on.\n */\n moveToPositionOfMo(positions: PositionManagedObject | PositionManagedObject[]) {\n if (!positions || !this.map) {\n return;\n }\n const position = Array.isArray(positions) ? positions[0] : positions;\n if (!position?.c8y_Position) {\n return;\n }\n if (this.config.follow) {\n this.map.setView([position.c8y_Position.lat, position.c8y_Position.lng]);\n }\n }\n\n /**\n * Stops real-time updates for the asset.\n */\n stopRealtime() {\n if (this.realtimeSubscription) {\n this.realtimeSubscription.unsubscribe();\n this.realtimeSubscription = null;\n }\n }\n\n /**\n * Finds a marker on the map by asset, event, or ID. (only if it is a C8yMarker)\n * @param moOrId Asset, event, or string ID to search for.\n * @returns The found marker or undefined.\n */\n findMarker(moOrId: string | IEvent | PositionManagedObject): C8yMarker | undefined {\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 ) as C8yMarker | undefined;\n }\n\n /**\n * Adds a marker to the map and internal marker list.\n * @param marker The marker to add.\n */\n addMarkerToMap(marker: C8yMarker | L.Marker) {\n this.markers.push(marker);\n marker.addTo(this.map);\n }\n\n /**\n * Creates and returns a marker for the given asset, including icon and popup.\n * @param asset The asset to create a marker for.\n * @returns The created marker.\n */\n getAssetMarker(asset: GroupedPositionManagedObject) {\n if (!asset || asset.items.length === 0) {\n return;\n }\n\n if (asset.items.length === 1) {\n return this.getAssetMarkerSingle(asset.items[0]);\n } else {\n return this.getGroupedMarker(asset);\n }\n }\n\n /**\n * Creates and returns a marker for a single asset, including icon and popup.\n * @param asset The asset to create a marker for.\n * @returns The created marker.\n */\n getAssetMarkerSingle(asset: PositionManagedObject) {\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 /**\n * Returns a marker with popup for a group of assets (clustered).\n * @param group The asset group.\n * @returns A marker for a group of assets (clustered).\n */\n getGroupedMarker(group: GroupedPositionManagedObject) {\n const latLngs = group.items.map(item =>\n this.leaflet.latLng(item.c8y_Position.lat, item.c8y_Position.lng)\n );\n const bounds = this.leaflet.latLngBounds(latLngs);\n const center = bounds.getCenter();\n\n const icon = this.getGroupAssetIcon(group);\n const leafletMarker = this.leaflet.marker(center, {\n icon,\n title: this.translateService.instant(this.markerGroupTitle, { count: group.items.length })\n });\n const asset = group.items[0];\n const marker = getC8yMarker(leafletMarker, asset);\n\n marker.on('click', () => {\n this.map.fitBounds(bounds, { padding: [50, 50] });\n // Check if all markers are at the same position (within a small threshold)\n const areAllSamePosition = latLngs.every(\n ll => Math.abs(ll.lat - center.lat) < 0.0001 && Math.abs(ll.lng - center.lng) < 0.0001\n );\n\n // If all markers are at the same position and zoom is low, create spider layout\n if (areAllSamePosition && this.map && this.map.getZoom() >= 10) {\n this.createSpiderMarkers(group, center, marker);\n }\n });\n\n return marker;\n }\n\n /**\n * Creates spider markers for a group of assets at the same position.\n * @param group The group of assets to create spider markers for.\n * @param center The center position of the group.\n * @param originalMarker The marker which was replaced by spider markers.\n */\n createSpiderMarkers(\n group: GroupedPositionManagedObject,\n center: L.LatLng,\n originalMarker: C8yMarker\n ): void {\n const markerGroup = this.leaflet.featureGroup();\n const items = group.items;\n const count = items.length;\n const radius = 0.0002; // Adjust based on your needs\n const angleStep = (2 * Math.PI) / count;\n\n originalMarker.setOpacity(0); // Hide the original marker\n\n items.forEach((item, index) => {\n const angle = angleStep * index;\n const offsetLat = center.lat + radius * Math.cos(angle);\n const offsetLng = center.lng + radius * Math.sin(angle);\n const markerPos = this.leaflet.latLng(offsetLat, offsetLng);\n\n // Create spider leg (line from center to marker)\n const polyline = this.leaflet.polyline([center, markerPos], {\n color: '#666',\n weight: 2,\n opacity: 1\n });\n polyline.addTo(markerGroup);\n\n // Create individual marker\n const icon = this.getAssetIcon(item, [6, -12]);\n const leafletMarker = this.leaflet.marker(markerPos, {\n icon,\n title: this.translateService.instant(this.markerTitle, {\n lat: item.c8y_Position.lat,\n lng: item.c8y_Position.lng\n })\n });\n const marker = getC8yMarker(leafletMarker, item);\n this.bindPopup(marker, item, new this.leaflet.Point(-2, -20));\n marker.addTo(markerGroup);\n });\n\n // Create red center dot\n const centerIcon = this.leaflet.divIcon({\n html: '<div style=\"background-color: red; width: 12px; height: 12px; border-radius: 50%; border: 2px solid white;\"></div>',\n className: 'spider-center-marker',\n iconSize: [12, 12],\n iconAnchor: [6, 6]\n });\n const centerMarker = this.leaflet.marker(center, {\n icon: centerIcon,\n title: this.translateService.instant(gettext('Click to collapse'))\n });\n\n const restoreOriginalMarker = () => {\n this.map.off('zoomstart', restoreOriginalMarker);\n this.map.off('movestart', restoreOriginalMarker);\n markerGroup.remove();\n originalMarker.setOpacity(1);\n };\n // Add click handler to collapse spider and remove it\n // if user navigates away\n centerMarker.on('click', restoreOriginalMarker);\n this.map.on('zoomstart', restoreOriginalMarker);\n this.map.on('movestart', restoreOriginalMarker);\n\n centerMarker.addTo(markerGroup);\n markerGroup.addTo(this.map);\n }\n\n /**\n * The icon for a group of assets (clustered).\n * It shows the count and is colored based on the highest severity status in the group.\n * @param group The group of assets.\n * @returns The marker icon for the group.\n */\n getGroupAssetIcon(group: GroupedPositionManagedObject) {\n const status = MapService.getGroupStatus(group);\n const color = this.config.color ? `style='color: ${this.config.color};'` : '';\n const moreThan99 = group.items.length > 99 ? 'more-than-99' : '';\n const icon = this.leaflet.divIcon({\n html: `<div><div class=\"popover top show\"><span class=\"popover-content p-l-0 p-t-0 p-b-0 p-r-4 d-flex a-i-center\"><i class=\"dlt-c8y-icon-marker ${status}\" ${color}></i><span class=\"text-12 text-nowrap ${moreThan99}\">${group.items.length > 99 ? '99+' : group.items.length}</span></span><span class=\"arrow\" style=\"translate: -50% 0\"></span></div></div>`,\n className: 'c8y-map-marker-icon',\n iconAnchor: [21, 40]\n });\n return icon;\n }\n\n /**\n * Creates and returns a marker for a tracking event, including icon and popup.\n * @param event The event to create a marker for.\n * @returns The created marker.\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 /**\n * Returns a Leaflet icon for the given asset, using config or asset icon and color.\n * @param asset The asset to get the icon for.\n * @param anchor The icon anchor point.\n * @returns The Leaflet icon.\n */\n getAssetIcon(asset: PositionManagedObject, anchor: [number, number] = [8, 8]) {\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: anchor\n });\n return icon;\n }\n\n /**\n * Returns a Leaflet icon for a tracking event.\n * @returns The Leaflet icon.\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 /**\n * Removes a marker from the map and internal marker list.\n * @param marker The marker to remove.\n */\n removeMarker(marker: C8yMarker | L.Marker) {\n if (marker) {\n marker.remove();\n remove(this.markers, m => m === marker);\n }\n }\n\n /**\n * Removes all markers from the map, optionally filtered by marker attribute.\n * @param fragment Optional marker attribute to filter by.\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 /**\n * Refreshes all markers on the map based on the current assets.\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\n assets.forEach(asset => {\n const marker = this.getAssetMarkerSingle(asset);\n this.addMarkerToMap(marker);\n });\n\n if (!this.config.center) {\n this.zoomToBound(assets);\n }\n this.toggleControls();\n }\n\n /**\n * Centers the map on the configured center coordinates.\n */\n center() {\n this.map?.setView(this.config.center);\n }\n\n /**\n * Refreshes the map and markers if the map is initialized.\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, 'bounds')) {\n this.fitBounds(change.currentValue.bounds);\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(\n marker: C8yMarker,\n context: PositionManagedObject | IEvent,\n offset: L.Point = new this.leaflet.Point(-3, -40)\n ) {\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,\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 {\n ColorService,\n CountdownIntervalComponent,\n DatePipe,\n DynamicComponent,\n DynamicComponentAlertAggregator,\n GeoService,\n ManagedObjectRealtimeService,\n WidgetGlobalAutoRefreshService,\n globalAutoRefreshLoading\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 { BehaviorSubject, Observable, combineLatest, from, fromEvent, merge, of } from 'rxjs';\nimport {\n catchError,\n debounceTime,\n filter,\n mergeMap,\n skip,\n switchMap,\n take,\n takeUntil,\n tap\n} from 'rxjs/operators';\nimport { ClusterMap } from './cluster-map';\nimport { MapComponent } from './map.component';\nimport {\n ClusterMapConfig,\n ClusterSize,\n defaultFitBoundsOptions,\n MAP_DEFAULT_CONFIG,\n MAP_TILE_LAYER,\n PositionManagedObject,\n GroupedPositionManagedObject\n} from './map.model';\nimport { MapService } from './map.service';\n\n/**\n * Smart map component for that clusters devices together when there are too many to display individually.\n * Unlike the basic map, this component loads device data dynamically and manages cluster rendering and updates.\n * Extends the base MapComponent with clustering, dynamic data loading, and advanced refresh logic.\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 /** Emits true while the map is loading or refreshing clusters. */\n isLoading$ = new BehaviorSubject(false);\n /** @ignore */\n countdownIntervalComp: CountdownIntervalComponent;\n\n /**\n * Cluster map configuration, including clustering thresholds and refresh intervals.\n */\n @Input()\n config: ClusterMapConfig;\n\n /**\n * The root managed object (e.g., group or device) for which to load and cluster data.\n */\n @Input()\n rootNode: IManagedObject;\n\n /**\n * Single asset to display (if not clustering). Used for following a specific device.\n * If provided, clusters will not be used, and the asset will be displayed individually.\n * If not provided, the component will cluster devices based on the root node.\n */\n @Input('asset')\n assets: PositionManagedObject;\n\n /**\n * Whether to show a color overlay for each cluster rectangle. This can be useful for debugging or visualizing clusters.\n */\n @Input()\n showClusterColor = false;\n\n /**\n * Emits Leaflet map change events (move, moveend) for external listeners.\n */\n @Output()\n mapChange = new EventEmitter<L.LeafletEvent>();\n\n /** Reference to the map element in the template. */\n @ViewChild('map')\n mapElement: ElementRef;\n\n /** Aggregator for dynamic component alerts. */\n alerts: DynamicComponentAlertAggregator;\n\n /** @ignore */\n errorNotifier = new BehaviorSubject(null);\n\n /**\n * Indicates if the map was manually changed by the user (e.g., panned or zoomed).\n */\n isDirty = false;\n private reloadTrigger$ = new BehaviorSubject(false);\n private clusters: ClusterMap[] = [];\n private readonly EVENT_THROTTLE_TIME = 750;\n /** Tracks the last followed position to prevent unnecessary map movements. */\n private lastFollowedPosition: { lat: number; lng: number } | null = null;\n /** Flag to skip first map movement after switching from realtime (prevents jump to stale cluster data). */\n private skipNextFollowMove = false;\n\n /**\n * Constructs the ClusterMapComponent, injecting required services and initializing the base map.\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 /**\n * @ignore\n */\n async ngOnChanges(changes: SimpleChanges) {\n if (changes.config?.firstChange || !this.map) {\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 /**\n * Handles changes to the map configuration using a state machine approach.\n * @param change The config change object.\n */\n changeConfig(change: SimpleChange) {\n if (!this.map) return;\n\n const prevState = this.getMapState(change.previousValue);\n const currState = this.getMapState(change.currentValue);\n\n if (prevState !== currState) {\n this.handleStateTransition(prevState, currState);\n }\n\n this.handleFollowChanges(change);\n this.handleRefreshIntervalChanges(change);\n\n super.changeConfig(change);\n }\n\n /**\n * @ignore\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 /**\n * Resets the map and clusters, re-initializing the component.\n */\n async reset() {\n this.ngOnDestroy();\n await this.ngAfterViewInit();\n }\n\n /**\n * Triggers a reload of cluster data.\n */\n reload() {\n this.reloadTrigger$.next(true);\n }\n\n /**\n * Cancels an ongoing reload operation.\n */\n cancelReload() {\n this.reloadTrigger$.next(false);\n }\n\n /**\n * Subscribes to cluster and interval changes, updating clusters as needed.\n * Handles auto-refresh and global refresh loading.\n */\n listenToClusterAndIntervalChanges() {\n const mapChange$ = this.getMapChangeObservable();\n merge(this.reloadTrigger$, mapChange$)\n .pipe(\n tap(() => {\n this.isLoading$.next(true);\n }),\n filter(value => {\n if (value === false) {\n this.isLoading$.next(false);\n return false;\n }\n\n const isMapChangeEvent = typeof value !== 'boolean';\n const shouldSkip = isMapChangeEvent && this.config.follow;\n if (shouldSkip) {\n this.isLoading$.next(false);\n }\n return !shouldSkip;\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 // Don't render clusters if in realtime mode (single asset with markers)\n if (this.config.realtime && this.assets) {\n this.isLoading$.next(false);\n return;\n }\n\n // If follow mode with asset but cluster has no positions, render marker from asset\n const hasNoClusterPositions = clusters.length === 1 && clusters[0].positions?.length === 0;\n if (this.config.follow && this.assets && hasNoClusterPositions) {\n this.refreshMarkers();\n }\n\n clusters.forEach(cluster => cluster.render(this.map));\n\n if (clusters.length === 1 && clusters[0].positions?.length === 1 && this.config.follow) {\n const position = clusters[0].positions[0].items[0];\n const newPos = { lat: position.c8y_Position.lat, lng: position.c8y_Position.lng };\n\n if (this.skipNextFollowMove) {\n this.skipNextFollowMove = false;\n this.lastFollowedPosition = newPos;\n } else {\n // Only move map if position changed significantly (tolerance: 0.00001 degrees ≈ 1 meter)\n const hasSignificantChange =\n !this.lastFollowedPosition ||\n Math.abs(this.lastFollowedPosition.lat - newPos.lat) > 0.00001 ||\n Math.abs(this.lastFollowedPosition.lng - newPos.lng) > 0.00001;\n\n if (hasSignificantChange) {\n this.lastFollowedPosition = newPos;\n this.moveToPositionOfMo(position);\n }\n }\n }\n this.isLoading$.next(false);\n });\n }\n\n /**\n * Subscribes to map change events for cluster updates.\n */\n listenToClusterMapChanges() {\n this.getMapChangeObservable().subscribe();\n }\n\n /**\n * Refreshes markers or clusters, depending on whether a single asset or clusters are shown.\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 /**\n * Overrides base startRealtime to ensure assets and markers are set for single device realtime mode.\n * Also switches from cluster subscription to marker-only mode.\n */\n override startRealtime() {\n // Ensure assets is set for realtime mode\n if (!this.assets) {\n // Try to use current position from clusters if available (prevents jumping to old position)\n const hasClusterWithPosition =\n this.clusters?.length === 1 && this.clusters[0].positions?.length === 1;\n\n if (hasClusterWithPosition) {\n this.assets = this.clusters[0].positions[0].items[0];\n } else if (this.rootNode?.c8y_Position && this.rootNode?.c8y_IsDevice) {\n this.assets = this.rootNode as PositionManagedObject;\n }\n }\n\n // Switch from cluster mode to single asset mode\n if (this.map && this.clusters?.length > 0) {\n this.unsubscribeAllListeners();\n this.clearClusters();\n }\n\n // Ensure markers exist BEFORE starting realtime (so updates can find them)\n if (this.map && this.assets && (!this.markers || this.markers.length === 0)) {\n this.refreshMarkers();\n }\n\n // Call parent startRealtime to start realtime subscription\n super.startRealtime();\n }\n\n /**\n * Determines the current map state based on config.\n */\n private getMapState(config: any): 'realtime' | 'paused' | 'auto-refresh' | 'initial' {\n if (!config) return 'initial';\n\n const isRealtime = config.realtime === true;\n const isAutoRefreshEnabled = config.isAutoRefreshEnabled ?? true;\n\n if (isRealtime && isAutoRefreshEnabled) {\n return 'realtime';\n } else if (!isRealtime && !isAutoRefreshEnabled) {\n return 'paused';\n } else {\n return 'auto-refresh';\n }\n }\n\n /**\n * Handles state transitions using a clear state machine pattern.\n */\n private handleStateTransition(\n from: 'realtime' | 'paused' | 'auto-refresh' | 'initial',\n to: 'realtime' | 'paused' | 'auto-refresh' | 'initial'\n ) {\n const transition = `${from}->${to}`;\n\n switch (transition) {\n case 'realtime->paused':\n this.transitionRealtimeToPaused();\n break;\n case 'realtime->auto-refresh':\n this.transitionRealtimeToAutoRefresh();\n break;\n case 'paused->realtime':\n this.transitionPausedToRealtime();\n break;\n case 'paused->auto-refresh':\n this.transitionPausedToAutoRefresh();\n break;\n case 'auto-refresh->realtime':\n this.transitionAutoRefreshToRealtime();\n break;\n case 'auto-refresh->paused':\n this.transitionAutoRefreshToPaused();\n break;\n case 'initial->realtime':\n case 'initial->auto-refresh':\n case 'initial->paused':\n break;\n default:\n // No action needed for unhandled transitions\n }\n }\n\n /** Realtime → Paused: Keep markers, stop subscriptions */\n private transitionRealtimeToPaused() {\n this.unsubscribeAllListeners();\n }\n\n /** Realtime → Auto-refresh: Switch to cluster mode */\n private transitionRealtimeToAutoRefresh() {\n this.unsubscribeAllListeners();\n\n // Preserve marker position to prevent jump\n this.preserveMarkerPosition();\n\n this.clearMarkers();\n this.assets = null;\n this.listenToClusterAndIntervalChanges();\n }\n\n /** Paused → Realtime: Resume with existing markers */\n private transitionPausedToRealtime() {\n this.cancelReload();\n this.isLoading$.next(false);\n this.unsubscribeAllListeners();\n\n // If assets are null (paused from cluster mode), set up for realtime\n if (!this.assets && this.rootNode) {\n this.changeRootNode(this.rootNode);\n return; // changeRootNode handles the rest\n }\n\n // Keep this.assets (already has current position)\n this.clearClusters();\n this.listenToClusterMapChanges();\n }\n\n /** Paused → Auto-refresh: Switch to cluster mode */\n private transitionPausedToAutoRefresh() {\n this.unsubscribeAllListeners();\n\n // Preserve marker position to prevent jump\n this.preserveMarkerPosition();\n\n this.clearMarkers();\n this.assets = null;\n this.listenToClusterAndIntervalChanges();\n }\n\n /** Auto-refresh → Realtime: Use cluster position, switch to marker mode */\n private transitionAutoRefreshToRealtime() {\n this.cancelReload();\n this.isLoading$.next(false);\n this.unsubscribeAllListeners();\n\n // Use current cluster position if available\n const hasClusterWithPosition =\n this.clusters?.length === 1 && this.clusters[0].positions?.length === 1;\n\n if (hasClusterWithPosition) {\n this.assets = this.clusters[0].positions[0].items[0];\n } else if (this.rootNode?.c8y_Position && this.rootNode?.c8y_IsDevice) {\n this.assets = this.rootNode as PositionManagedObject;\n }\n\n this.clearClusters();\n this.listenToClusterMapChanges();\n }\n\n /** Auto-refresh → Paused: Keep clusters visible, stop listeners, preserve position */\n private transitionAutoRefreshToPaused() {\n this.cancelReload();\n this.isLoading$.next(false);\n this.unsubscribeAllListeners();\n\n // Extract and preserve position from cluster for later use\n const hasClusterWithPosition =\n this.clusters?.length === 1 && this.clusters[0].positions?.length === 1;\n\n if (hasClusterWithPosition) {\n const position = this.clusters[0].positions[0].items[0];\n this.assets = position; // Store for later use when resuming to realtime\n }\n }\n\n /** Helper to preserve marker position before transitions */\n private preserveMarkerPosition() {\n if (this.markers?.length === 1 && this.markers[0] && this.config.follow) {\n const marker = this.markers[0] as any;\n const latLng = marker.getLatLng();\n this.lastFollowedPosition = { lat: latLng.lat, lng: latLng.lng };\n this.skipNextFollowMove = true;\n }\n }\n\n /** Handle follow mode changes */\n private handleFollowChanges(change: SimpleChange) {\n const followChangedToTrue =\n change.previousValue?.follow === false && change.currentValue?.follow === true;\n if (followChangedToTrue) {\n this.cancelReload();\n this.isLoading$.next(false);\n }\n\n const followChangedToFalse =\n change.previousValue?.follow === true && change.currentValue?.follow === false;\n if (followChangedToFalse) {\n this.lastFollowedPosition = null;\n }\n }\n\n /** Handle refresh interval changes */\n private handleRefreshIntervalChanges(change: SimpleChange) {\n if (change.currentValue?.refreshInterval !== change.previousValue?.refreshInterval) {\n this.reload();\n }\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 && this.config.realtime) {\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\n const positionMOs = await this.mapService.getPositionMOsFromBound(\n cluster.rect.getBounds(),\n this.rootNode\n );\n\n const NEARBY_GROUPING_THRESHOLD_PX = 25;\n const groupedPositions = this.groupNearbyAssets(positionMOs, NEARBY_GROUPING_THRESHOLD_PX);\n cluster.positions = groupedPositions;\n\n return cluster;\n }\n\n /**\n * Groups nearby assets based on pixel distance threshold.\n * @param assets Array of assets to group.\n * @param thresholdPixels Distance threshold in pixels.\n * @returns Array of asset groups.\n */\n private groupNearbyAssets(\n assets: PositionManagedObject[],\n thresholdPixels: number\n ): GroupedPositionManagedObject[] {\n // Get current zoom level and adjust threshold accordingly\n const currentZoom = this.map.getZoom();\n const zoomThreshold = 15; // Zoom level above which grouping is disabled\n const zoomFactor = 1 - currentZoom / zoomThreshold;\n const NEARBY_GROUPING_MIN_ZOOM_FACTOR = 0.3;\n const adjustedThreshold =\n thresholdPixels * Math.max(NEARBY_GROUPING_MIN_ZOOM_FACTOR, zoomFactor);\n\n // Sort assets by latitude first, then longitude for efficient proximity checks\n const sortedAssets = [...assets].sort((a, b) => {\n const latDiff = a.c8y_Position.lat - b.c8y_Position.lat;\n return latDiff !== 0 ? latDiff : a.c8y_Position.lng - b.c8y_Position.lng;\n });\n\n const groups: GroupedPositionManagedObject[] = [];\n const processed = new Set<string>();\n\n sortedAssets.forEach(asset => {\n if (processed.has(asset.id)) {\n return;\n }\n const group: PositionManagedObject[] = [asset];\n processed.add(asset.id);\n sortedAssets.forEach(otherAsset => {\n if (processed.has(otherAsset.id)) {\n return;\n }\n const isClose = group.some(groupAsset =>\n this.areMarkersClose(groupAsset, otherAsset, adjustedThreshold)\n );\n\n if (isClose) {\n group.push(otherAsset);\n processed.add(otherAsset.id);\n }\n });\n groups.push({ items: group });\n });\n\n return groups;\n }\n\n /**\n * Checks if two assets are within the specified pixel distance.\n * @param asset1 First asset.\n * @param asset2 Second asset.\n * @param thresholdPixels Distance threshold in pixels.\n * @returns True if assets are close, false otherwise.\n */\n private areMarkersClose(\n asset1: PositionManagedObject,\n asset2: PositionManagedObject,\n thresholdPixels: number\n ): boolean {\n const latLng1 = this.leaflet.latLng(asset1.c8y_Position.lat, asset1.c8y_Position.lng);\n const latLng2 = this.leaflet.latLng(asset2.c8y_Position.lat, asset2.c8y_Position.lng);\n\n const point1 = this.map.latLngToContainerPoint(latLng1);\n const point2 = this.map.latLngToContainerPoint(latLng2);\n\n const distance = point1.distanceTo(point2);\n return distance <= thresholdPixels;\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 // Set isDirty flag on user interactions\n merge(\n fromEvent<L.LeafletEvent>(this.map, 'mousedown'),\n fromEvent<MouseEvent>(this.mapElement?.nativeElement, 'wheel'),\n fromEvent<L.LeafletEvent>(this.map, 'touchstart')\n )\n .pipe(take(1), takeUntil(this.unsubscribeTrigger$))\n .subscribe(() => {\n this.isDirty = true;\n });\n let skipMoveEvent = false;\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 switchMap(async event => {\n // If the map wasn't changed by user and we have autoFitToBounds, fit the bounds\n // Skip this event and let the fitBounds-triggered event be processed instead\n if (this.config.autoFitToBounds && !this.isDirty && !skipMoveEvent) {\n const bounds = await this.mapService.getAllBounds(this.rootNode);\n skipMoveEvent = true;\n this.map.fitBounds(bounds, this.config.fitBoundsOptions || defaultFitBoundsOptions);\n return null; // Skip current event\n }\n\n skipMoveEvent = false;\n return event;\n }),\n filter(event => event !== null),\n tap(event => {\n this.mapChange.emit(event);\n }),\n takeUntil(this.unsubscribeTrigger$)\n );\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, IconDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\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';\nimport { NgClass, AsyncPipe } from '@angular/common';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n/**\n * Component to display controls and status information for a map rendered on an IoT Dashboard.\n * Provides UI for centering, fitting bounds, toggling real-time updates, auto-refresh, and following assets.\n */\n@Component({\n selector: 'c8y-map-status',\n templateUrl: './map-status.component.html',\n imports: [\n NgClass,\n TooltipDirective,\n CountdownIntervalComponent,\n IconDirective,\n AsyncPipe,\n C8yTranslatePipe\n ]\n})\nexport class MapStatusComponent {\n /**\n * Map configuration object, including center, refresh interval, and other map options.\n */\n @Input()\n config: ClusterMapConfig;\n\n /**\n * List of managed objects with position information to be displayed on the map.\n */\n @Input() assets: PositionManagedObject[];\n\n /**\n * Emits when the map configuration changes (e.g., toggling real-time, follow, etc.).\n */\n @Output()\n configChange = new EventEmitter<ClusterMapConfig>();\n\n /**\n * Emits when the user unfollows an asset on the map.\n */\n @Output()\n onUnfollow = new EventEmitter<ClusterMapConfig>();\n\n /**\n * Emits when the user requests to fit all assets within the map bounds.\n */\n @Output() fitAssetsToBounds = new EventEmitter<void>();\n\n /**\n * Reference to the ClusterMapComponent instance rendered in the view.\n */\n @Input()\n clusterMap: ClusterMapComponent;\n\n /**\n * Configuration for which map status buttons are shown/enabled.\n * By default the \"center\" button is shown and realtime is disabled.\n * See {@link MapStatusButtonsConfig} for available options.\n */\n @Input() buttonsConfig: Partial<MapStatusButtonsConfig> = {};\n\n /**\n * @ignore\n */\n @ViewChild(CountdownIntervalComponent) countdownIntervalComp: CountdownIntervalComponent;\n\n /**\n * @ignore\n */\n initConfig: ClusterMapConfig;\n\n /**\n * @ignore\n */\n refreshPaused = false;\n\n /**\n * @ignore\n */\n autoRefreshPausedLabel = gettext('Auto refresh paused');\n\n /**\n * @ignore\n */\n autoRefreshEnabledLabel = gettext('Auto refresh enabled');\n\n private destroy$ = new Subject<void>();\n\n /**\n * @ignore\n */\n ngOnInit(): void {\n this.initConfig = cloneDeep(this.config);\n this.buttonsConfig = Object.assign(this.defaultButtonsConfig(), this.buttonsConfig);\n }\n\n /**\n * @ignore\n */\n ngAfterViewInit(): void {\n if (\n !this.config.widgetInstanceGlobalAutoRefreshContext &&\n this.buttonsConfig.autoRefresh.show\n ) {\n this.clusterMap.countdownIntervalComp = this.countdownIntervalComp;\n }\n }\n\n /**\n * @ignore\n */\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.clusterMap?.previousValue !== changes.clusterMap?.currentValue) {\n this.checkIfMapIsAlreadyCentered();\n }\n }\n\n /**\n * Centers the map on the configured center coordinates.\n */\n center() {\n this.clusterMap.center();\n }\n\n /**\n * Emits an event to fit all assets within the map bounds and disables the button until the next change.\n */\n fitToBounds() {\n this.buttonsConfig.fitToBounds.disabled = true;\n this.fitAssetsToBounds.emit();\n }\n\n /**\n * Reloads the map data.\n */\n reload() {\n this.clusterMap.reload();\n }\n\n /**\n * Cancels the map reload operation.\n */\n cancelReload() {\n this.clusterMap.cancelReload();\n }\n\n /**\n * Toggles real-time updates for the map.\n */\n toggleRealtime() {\n this.config = {\n ...this.config,\n realtime: !this.config.realtime\n };\n this.configChange.emit(this.config);\n }\n\n /**\n * Toggles the auto-refresh state for the map, pausing or resuming the countdown.\n * @param $event Mouse event to prevent default and stop propagation.\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 /**\n * Disables following an asset on the map and emits the change.\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 /**\n * Enables following an asset on the map and emits the change.\n */\n follow() {\n this.config = {\n ...this.config,\n follow: true\n };\n this.configChange.emit(this.config);\n }\n\n /**\n * @ignore\n */\n ngOnDestroy(): void {\n this.destroy$.next();\n }\n\n /**\n * Subscribes to map changes and updates button states based on map bounds and center.\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.buttonsConfig.fitToBounds.disabled = this.shouldDisableFitToBoundsButton(bounds);\n if (this.config?.center) {\n this.buttonsConfig.center.disabled = 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 /**\n * Checks if Fit to Bounds button should be disabled based on whether all assets are within the current bounds.\n * @param bounds Current map view boundaries.\n * @returns True if all assets are already within bounds, false otherwise.\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 /**\n * Returns the default configuration for map status buttons.\n * @returns Default MapStatusButtonsConfig object.\n */\n private defaultButtonsConfig(): MapStatusButtonsConfig {\n return {\n realtime: { show: this.config.realtime || this.clusterMap.config.follow, disabled: false },\n autoRefresh: { show: true, disabled: false },\n refresh: { show: true, disabled: false },\n fitToBounds: { show: false, disabled: false },\n center: { show: true, 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 @if (buttonsConfig.realtime.show) {\n <button\n class=\"c8y-realtime\"\n title=\"{{ 'Realtime' | translate }}\"\n type=\"button\"\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 @if (\n buttonsConfig.autoRefresh.show &&\n !config.widgetInstanceGlobalAutoRefreshContext &&\n clusterMap?.config.refreshInterval &&\n !clusterMap?.config.follow\n ) {\n <label\n class=\"toggle-countdown vertical\"\n [attr.aria-label]=\"\n (refreshPaused ? autoRefreshPausedLabel : autoRefreshEnabledLabel) | translate\n \"\n [tooltip]=\"(refreshPaused ? autoRefreshPausedLabel : autoRefreshEnabledLabel) | translate\"\n placement=\"left\"\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 @if (refreshPaused) {\n <i c8yIcon=\"pause\"></i>\n }\n </label>\n }\n @if (\n buttonsConfig.refresh.show &&\n (clusterMap?.isLoading$ | async) &&\n !config.widgetInstanceGlobalAutoRefreshContext\n ) {\n <button\n title=\"{{ 'Cancel reload' | translate }}\"\n type=\"button\"\n (click)=\"cancelReload()\"\n >\n <i\n class=\"icon-spin\"\n c8yIcon=\"refresh\"\n ></i>\n </button>\n }\n @if (\n buttonsConfig.refresh.show &&\n !clusterMap?.config.realtime &&\n !clusterMap?.assets &&\n !(clusterMap?.isLoading$ | async) &&\n !config.widgetInstanceGlobalAutoRefreshContext\n ) {\n <button\n [title]=\"'Reload' | translate\"\n type=\"button\"\n (click)=\"reload()\"\n >\n <i c8yIcon=\"refresh\"></i>\n </button>\n }\n <ng-content></ng-content>\n @if (buttonsConfig.center.show) {\n <button\n title=\"{{ 'Center map' | translate }}\"\n type=\"button\"\n (click)=\"center()\"\n [disabled]=\"buttonsConfig.center.disabled || clusterMap?.config.follow\"\n >\n <i c8yIcon=\"target1\"></i>\n </button>\n }\n @if (buttonsConfig.fitToBounds.show) {\n <button\n title=\"{{ 'Fit to assets bounds' | translate }}\"\n type=\"button\"\n (click)=\"fitToBounds()\"\n [disabled]=\"buttonsConfig.fitToBounds.disabled || clusterMap?.config.follow\"\n >\n <i c8yIcon=\"waypoint-map\"></i>\n </button>\n }\n @if (clusterMap?.config.follow) {\n <button\n title=\"{{ 'Unfollow' | translate }}\"\n type=\"button\"\n (click)=\"unfollow()\"\n >\n <i c8yIcon=\"marker-off\"></i>\n </button>\n }\n @if (initConfig.follow && !clusterMap?.config.follow) {\n <button\n title=\"{{ 'Follow' | translate }}\"\n type=\"button\"\n (click)=\"follow()\"\n >\n <i c8yIcon=\"marker\"></i>\n </button>\n }\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 imports: [\n NgCommonModule,\n NgFormsModule,\n CommonModule,\n FormsModule,\n RealtimeModule,\n CoreModule,\n TooltipModule,\n MapComponent,\n MapStatusComponent,\n ClusterMapComponent,\n MapPopupDirective\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","NgCommonModule","NgFormsModule","CommonModule","FormsModule"],"mappings":"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"}
|