@react-google-maps/marker-clusterer 2.5.0 → 2.6.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"umd.min.js","sources":["../src/ClusterIcon.tsx","../src/Cluster.tsx","../src/Clusterer.tsx"],"sourcesContent":["/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\n\nimport { ClusterIconStyle, ClusterIconInfo } from './types'\n\nexport class ClusterIcon {\n cluster: Cluster\n className: string\n styles: ClusterIconStyle[]\n center: google.maps.LatLng | undefined\n div: HTMLDivElement | null\n sums: ClusterIconInfo | null\n visible: boolean\n url: string\n height: number\n width: number\n anchorText: number[]\n anchorIcon: number[]\n textColor: string\n textSize: number\n textDecoration: string\n fontWeight: string\n fontStyle: string\n fontFamily: string\n backgroundPosition: string\n\n boundsChangedListener: google.maps.MapsEventListener | null\n\n constructor(cluster: Cluster, styles: ClusterIconStyle[]) {\n cluster.getClusterer().extend(ClusterIcon, google.maps.OverlayView)\n this.cluster = cluster\n this.className = this.cluster.getClusterer().getClusterClass()\n this.styles = styles\n this.center = undefined\n this.div = null\n this.sums = null\n this.visible = false\n this.boundsChangedListener = null\n this.url = ''\n this.height = 0\n this.width = 0\n this.anchorText = [0, 0]\n this.anchorIcon = [0, 0]\n this.textColor = 'black'\n this.textSize = 11\n this.textDecoration = 'none'\n this.fontWeight = 'bold'\n this.fontStyle = 'normal'\n this.fontFamily = 'Arial,sans-serif'\n this.backgroundPosition = '0 0'\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.setMap(cluster.getMap()) // Note: this causes onAdd to be called\n }\n\n onAdd() {\n let cMouseDownInCluster: boolean\n let cDraggingMapByCluster: boolean\n\n this.div = document.createElement('div')\n this.div.className = this.className\n if (this.visible) {\n this.show()\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getPanes().overlayMouseTarget.appendChild(this.div)\n\n // Fix for Issue 157\n this.boundsChangedListener = google.maps.event.addListener(\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap(),\n 'boundschanged',\n function boundsChanged() {\n cDraggingMapByCluster = cMouseDownInCluster\n }\n )\n\n google.maps.event.addDomListener(this.div, 'mousedown', function onMouseDown() {\n cMouseDownInCluster = true\n cDraggingMapByCluster = false\n })\n\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n google.maps.event.addDomListener(\n this.div,\n 'click',\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n (event: Event) => {\n cMouseDownInCluster = false\n\n if (!cDraggingMapByCluster) {\n const markerClusterer = this.cluster.getClusterer()\n\n /**\n * This event is fired when a cluster marker is clicked.\n * @name MarkerClusterer#click\n * @param {Cluster} c The cluster that was clicked.\n * @event\n */\n google.maps.event.trigger(markerClusterer, 'click', this.cluster)\n google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster) // deprecated name\n\n // The default click handler follows. Disable it by setting\n // the zoomOnClick property to false.\n if (markerClusterer.getZoomOnClick()) {\n // Zoom into the cluster.\n const maxZoom = markerClusterer.getMaxZoom()\n\n const bounds = this.cluster.getBounds()\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n markerClusterer.getMap().fitBounds(bounds)\n\n // There is a fix for Issue 170 here:\n setTimeout(function timeout() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n markerClusterer.getMap().fitBounds(bounds)\n\n // Don't zoom beyond the max zoom level\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n if (maxZoom !== null && markerClusterer.getMap().getZoom() > maxZoom) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n markerClusterer.getMap().setZoom(maxZoom + 1)\n }\n }, 100)\n }\n\n // Prevent event propagation to the map:\n event.cancelBubble = true\n\n if (event.stopPropagation) {\n event.stopPropagation()\n }\n }\n }\n )\n\n google.maps.event.addDomListener(\n this.div,\n 'mouseover',\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n () => {\n /**\n * This event is fired when the mouse moves over a cluster marker.\n * @name MarkerClusterer#mouseover\n * @param {Cluster} c The cluster that the mouse moved over.\n * @event\n */\n google.maps.event.trigger(this.cluster.getClusterer(), 'mouseover', this.cluster)\n }\n )\n\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n google.maps.event.addDomListener(\n this.div,\n 'mouseout',\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n () => {\n /**\n * This event is fired when the mouse moves out of a cluster marker.\n * @name MarkerClusterer#mouseout\n * @param {Cluster} c The cluster that the mouse moved out of.\n * @event\n */\n google.maps.event.trigger(this.cluster.getClusterer(), 'mouseout', this.cluster)\n }\n )\n }\n\n onRemove() {\n if (this.div && this.div.parentNode) {\n this.hide()\n\n if (this.boundsChangedListener !== null) {\n google.maps.event.removeListener(this.boundsChangedListener)\n }\n\n google.maps.event.clearInstanceListeners(this.div)\n\n this.div.parentNode.removeChild(this.div)\n\n this.div = null\n }\n }\n\n draw() {\n if (this.visible && this.div !== null && this.center) {\n const { x, y } = this.getPosFromLatLng(this.center)\n\n this.div.style.top = y + 'px'\n this.div.style.left = x + 'px'\n }\n }\n\n hide() {\n if (this.div) {\n this.div.style.display = 'none'\n }\n\n this.visible = false\n }\n\n show() {\n if (this.div && this.center) {\n let img = '',\n divTitle = ''\n\n // NOTE: values must be specified in px units\n const bp = this.backgroundPosition.split(' ')\n\n const spriteH = parseInt(bp[0].replace(/^\\s+|\\s+$/g, ''), 10)\n\n const spriteV = parseInt(bp[1].replace(/^\\s+|\\s+$/g, ''), 10)\n\n const pos = this.getPosFromLatLng(this.center)\n\n if (this.sums === null || typeof this.sums.title === 'undefined' || this.sums.title === '') {\n divTitle = this.cluster.getClusterer().getTitle()\n } else {\n divTitle = this.sums.title\n }\n\n this.div.style.cssText = this.createCss(pos)\n\n img =\n \"<img alt='\" +\n divTitle +\n \"' src='\" +\n this.url +\n \"' style='position: absolute; top: \" +\n spriteV +\n 'px; left: ' +\n spriteH +\n 'px; '\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n //@ts-ignore\n if (!this.cluster.getClusterer().enableRetinaIcons) {\n img +=\n 'clip: rect(' +\n -1 * spriteV +\n 'px, ' +\n (-1 * spriteH + this.width) +\n 'px, ' +\n (-1 * spriteV + this.height) +\n 'px, ' +\n -1 * spriteH +\n 'px);'\n }\n\n img += \"'>\"\n\n this.div.innerHTML =\n img +\n \"<div style='\" +\n 'position: absolute;' +\n 'top: ' +\n this.anchorText[0] +\n 'px;' +\n 'left: ' +\n this.anchorText[1] +\n 'px;' +\n 'color: ' +\n this.textColor +\n ';' +\n 'font-size: ' +\n this.textSize +\n 'px;' +\n 'font-family: ' +\n this.fontFamily +\n ';' +\n 'font-weight: ' +\n this.fontWeight +\n ';' +\n 'font-style: ' +\n this.fontStyle +\n ';' +\n 'text-decoration: ' +\n this.textDecoration +\n ';' +\n 'text-align: center;' +\n 'width: ' +\n this.width +\n 'px;' +\n 'line-height:' +\n this.height +\n 'px;' +\n \"'>\" +\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.sums.text +\n '</div>'\n\n this.div.title = divTitle\n\n this.div.style.display = ''\n }\n\n this.visible = true\n }\n\n useStyle(sums: ClusterIconInfo) {\n this.sums = sums\n\n const style = this.styles[Math.min(this.styles.length - 1, Math.max(0, sums.index - 1))]\n\n this.url = style.url\n this.height = style.height\n this.width = style.width\n\n if (style.className)\n this.className = `${this.className} ${style.className}`\n\n this.anchorText = style.anchorText || [0, 0]\n this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2]\n\n this.textColor = style.textColor || 'black'\n\n this.textSize = style.textSize || 11\n\n this.textDecoration = style.textDecoration || 'none'\n\n this.fontWeight = style.fontWeight || 'bold'\n\n this.fontStyle = style.fontStyle || 'normal'\n\n this.fontFamily = style.fontFamily || 'Arial,sans-serif'\n\n this.backgroundPosition = style.backgroundPosition || '0 0'\n }\n\n setCenter(center: google.maps.LatLng) {\n this.center = center\n }\n\n createCss(pos: google.maps.Point): string {\n const style = []\n\n style.push('cursor: pointer;')\n\n style.push('position: absolute; top: ' + pos.y + 'px; left: ' + pos.x + 'px;')\n\n style.push('width: ' + this.width + 'px; height: ' + this.height + 'px;')\n\n return style.join('')\n }\n\n getPosFromLatLng(latlng: google.maps.LatLng): google.maps.Point {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n const pos = this.getProjection().fromLatLngToDivPixel(latlng)\n\n pos.x -= this.anchorIcon[1]\n\n pos.y -= this.anchorIcon[0]\n\n // pos.x = pos.x\n\n // pos.y = pos.y\n\n return pos\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Clusterer } from './Clusterer'\n\nimport { ClusterIcon } from './ClusterIcon'\n\nimport { MarkerExtended } from './types'\n\nexport class Cluster {\n markerClusterer: Clusterer\n map: google.maps.Map | google.maps.StreetViewPanorama\n gridSize: number\n minClusterSize: number\n averageCenter: boolean\n markers: MarkerExtended[]\n center: google.maps.LatLng | undefined\n bounds: google.maps.LatLngBounds | null\n clusterIcon: ClusterIcon\n\n constructor(markerClusterer: Clusterer) {\n this.markerClusterer = markerClusterer\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.map = this.markerClusterer.getMap()\n\n this.gridSize = this.markerClusterer.getGridSize()\n\n this.minClusterSize = this.markerClusterer.getMinimumClusterSize()\n\n this.averageCenter = this.markerClusterer.getAverageCenter()\n\n this.markers = []\n\n this.center = undefined\n\n this.bounds = null\n\n this.clusterIcon = new ClusterIcon(this, this.markerClusterer.getStyles())\n }\n\n getSize(): number {\n return this.markers.length\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getCenter(): google.maps.LatLng | undefined {\n return this.center\n }\n\n getMap(): google.maps.Map | google.maps.StreetViewPanorama {\n return this.map\n }\n\n getClusterer(): Clusterer {\n return this.markerClusterer\n }\n\n getBounds(): google.maps.LatLngBounds {\n const bounds = new google.maps.LatLngBounds(this.center, this.center)\n\n const markers = this.getMarkers()\n\n for (let i = 0; i < markers.length; i++) {\n const position = markers[i].getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n return bounds\n }\n\n remove() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.clusterIcon.setMap(null)\n\n this.markers = []\n\n // @ts-ignore\n delete this.markers\n }\n\n addMarker(marker: MarkerExtended): boolean {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false\n }\n\n if (!this.center) {\n const position = marker.getPosition()\n\n if (position) {\n this.center = position\n\n this.calculateBounds()\n }\n } else {\n if (this.averageCenter) {\n const position = marker.getPosition()\n\n if (position) {\n const length = this.markers.length + 1\n\n this.center = new google.maps.LatLng(\n (this.center.lat() * (length - 1) + position.lat()) / length,\n (this.center.lng() * (length - 1) + position.lng()) / length\n )\n\n this.calculateBounds()\n }\n }\n }\n\n marker.isAdded = true\n\n this.markers.push(marker)\n\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n // Zoomed in past max zoom, so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount < this.minClusterSize) {\n // Min cluster size not reached so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount === this.minClusterSize) {\n // Hide the markers that were showing.\n for (let i = 0; i < mCount; i++) {\n this.markers[i].setMap(null)\n }\n } else {\n marker.setMap(null)\n }\n\n return true\n }\n\n isMarkerInClusterBounds(marker: MarkerExtended): boolean {\n if (this.bounds !== null) {\n const position = marker.getPosition()\n\n if (position) {\n return this.bounds.contains(position)\n }\n }\n\n return false\n }\n\n calculateBounds() {\n this.bounds = this.markerClusterer.getExtendedBounds(\n new google.maps.LatLngBounds(this.center, this.center)\n )\n }\n\n updateIcon() {\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n this.clusterIcon.hide()\n\n return\n }\n\n if (mCount < this.minClusterSize) {\n // Min cluster size not yet reached.\n this.clusterIcon.hide()\n\n return\n }\n\n if (this.center) {\n this.clusterIcon.setCenter(this.center)\n }\n\n this.clusterIcon.useStyle(\n this.markerClusterer.getCalculator()(this.markers, this.markerClusterer.getStyles().length)\n )\n\n this.clusterIcon.show()\n }\n\n isMarkerAlreadyAdded(marker: MarkerExtended): boolean {\n if (this.markers.includes) {\n return this.markers.includes(marker)\n } else {\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n return true\n }\n }\n }\n\n return false\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\n\nimport {\n MarkerExtended,\n ClustererOptions,\n ClusterIconStyle,\n TCalculator,\n ClusterIconInfo,\n} from './types'\n\n/**\n * Supports up to 9007199254740991 (Number.MAX_SAFE_INTEGER) markers\n * which is not a problem as max array length is 4294967296 (2**32)\n */\nconst CALCULATOR = function CALCULATOR(\n markers: MarkerExtended[],\n numStyles: number\n): ClusterIconInfo {\n const count = markers.length\n\n const numberOfDigits = count.toString().length\n\n const index = Math.min(numberOfDigits, numStyles)\n\n return {\n text: count.toString(),\n index: index,\n title: '',\n }\n}\n\nconst BATCH_SIZE = 2000\n\nconst BATCH_SIZE_IE = 500\n\nconst IMAGE_PATH =\n 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'\n\nconst IMAGE_EXTENSION = 'png'\n\nconst IMAGE_SIZES = [53, 56, 66, 78, 90]\n\nconst CLUSTERER_CLASS = 'cluster'\n\nexport class Clusterer {\n markers: MarkerExtended[]\n clusters: Cluster[]\n listeners: google.maps.MapsEventListener[]\n activeMap: google.maps.Map | google.maps.StreetViewPanorama | null\n ready: boolean\n gridSize: number\n minClusterSize: number\n maxZoom: number | null\n styles: ClusterIconStyle[]\n title: string\n zoomOnClick: boolean\n averageCenter: boolean\n ignoreHidden: boolean\n enableRetinaIcons: boolean\n imagePath: string\n imageExtension: string\n imageSizes: number[]\n calculator: TCalculator\n batchSize: number\n batchSizeIE: number\n clusterClass: string\n timerRefStatic: number | null\n\n constructor(\n map: google.maps.Map,\n optMarkers: MarkerExtended[] = [],\n optOptions: ClustererOptions = {}\n ) {\n this.extend(Clusterer, google.maps.OverlayView)\n\n this.markers = []\n this.clusters = []\n this.listeners = []\n this.activeMap = null\n this.ready = false\n this.gridSize = optOptions.gridSize || 60\n this.minClusterSize = optOptions.minimumClusterSize || 2\n this.maxZoom = optOptions.maxZoom || null\n this.styles = optOptions.styles || []\n\n this.title = optOptions.title || ''\n\n this.zoomOnClick = true\n\n if (optOptions.zoomOnClick !== undefined) {\n this.zoomOnClick = optOptions.zoomOnClick\n }\n\n this.averageCenter = false\n\n if (optOptions.averageCenter !== undefined) {\n this.averageCenter = optOptions.averageCenter\n }\n\n this.ignoreHidden = false\n\n if (optOptions.ignoreHidden !== undefined) {\n this.ignoreHidden = optOptions.ignoreHidden\n }\n\n this.enableRetinaIcons = false\n\n if (optOptions.enableRetinaIcons !== undefined) {\n this.enableRetinaIcons = optOptions.enableRetinaIcons\n }\n this.imagePath = optOptions.imagePath || IMAGE_PATH\n\n this.imageExtension = optOptions.imageExtension || IMAGE_EXTENSION\n\n this.imageSizes = optOptions.imageSizes || IMAGE_SIZES\n\n this.calculator = optOptions.calculator || CALCULATOR\n\n this.batchSize = optOptions.batchSize || BATCH_SIZE\n\n this.batchSizeIE = optOptions.batchSizeIE || BATCH_SIZE_IE\n\n this.clusterClass = optOptions.clusterClass || CLUSTERER_CLASS\n\n if (navigator.userAgent.toLowerCase().indexOf('msie') !== -1) {\n // Try to avoid IE timeout when processing a huge number of markers:\n this.batchSize = this.batchSizeIE\n }\n\n this.timerRefStatic = null\n\n this.setupStyles()\n\n this.addMarkers(optMarkers, true)\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.setMap(map) // Note: this causes onAdd to be called\n }\n\n onAdd() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.activeMap = this.getMap()\n\n this.ready = true\n\n this.repaint()\n\n // Add the map event listeners\n this.listeners = [\n google.maps.event.addListener(\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap(),\n 'zoom_changed',\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n () => {\n this.resetViewport(false)\n // Workaround for this Google bug: when map is at level 0 and \"-\" of\n // zoom slider is clicked, a \"zoom_changed\" event is fired even though\n // the map doesn't zoom out any further. In this situation, no \"idle\"\n // event is triggered so the cluster markers that have been removed\n // do not get redrawn. Same goes for a zoom in at maxZoom.\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap().getZoom() === (this.get('minZoom') || 0) ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap().getZoom() === this.get('maxZoom')\n ) {\n google.maps.event.trigger(this, 'idle')\n }\n }\n ),\n google.maps.event.addListener(\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap(),\n 'idle',\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n () => {\n this.redraw()\n }\n ),\n ]\n }\n\n // eslint-disable-next-line @getify/proper-arrows/this\n onRemove() {\n // Put all the managed markers back on the map:\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].getMap() !== this.activeMap) {\n this.markers[i].setMap(this.activeMap)\n }\n }\n\n // Remove all clusters:\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Remove map event listeners:\n for (let i = 0; i < this.listeners.length; i++) {\n google.maps.event.removeListener(this.listeners[i])\n }\n\n this.listeners = []\n\n this.activeMap = null\n\n this.ready = false\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n draw() {}\n\n setupStyles() {\n if (this.styles.length > 0) {\n return\n }\n\n for (let i = 0; i < this.imageSizes.length; i++) {\n this.styles.push({\n url: this.imagePath + (i + 1) + '.' + this.imageExtension,\n height: this.imageSizes[i],\n width: this.imageSizes[i],\n })\n }\n }\n\n fitMapToMarkers() {\n const markers = this.getMarkers()\n\n const bounds = new google.maps.LatLngBounds()\n\n for (let i = 0; i < markers.length; i++) {\n const position = markers[i].getPosition()\n if (position) {\n bounds.extend(position)\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap().fitBounds(bounds)\n }\n\n getGridSize(): number {\n return this.gridSize\n }\n\n setGridSize(gridSize: number) {\n this.gridSize = gridSize\n }\n\n getMinimumClusterSize(): number {\n return this.minClusterSize\n }\n\n setMinimumClusterSize(minimumClusterSize: number) {\n this.minClusterSize = minimumClusterSize\n }\n\n getMaxZoom(): number | null {\n return this.maxZoom\n }\n\n setMaxZoom(maxZoom: number) {\n this.maxZoom = maxZoom\n }\n\n getStyles(): ClusterIconStyle[] {\n return this.styles\n }\n\n setStyles(styles: ClusterIconStyle[]) {\n this.styles = styles\n }\n\n getTitle(): string {\n return this.title\n }\n\n setTitle(title: string) {\n this.title = title\n }\n\n getZoomOnClick(): boolean {\n return this.zoomOnClick\n }\n\n setZoomOnClick(zoomOnClick: boolean) {\n this.zoomOnClick = zoomOnClick\n }\n\n getAverageCenter(): boolean {\n return this.averageCenter\n }\n\n setAverageCenter(averageCenter: boolean) {\n this.averageCenter = averageCenter\n }\n\n getIgnoreHidden(): boolean {\n return this.ignoreHidden\n }\n\n setIgnoreHidden(ignoreHidden: boolean) {\n this.ignoreHidden = ignoreHidden\n }\n\n getEnableRetinaIcons(): boolean {\n return this.enableRetinaIcons\n }\n\n setEnableRetinaIcons(enableRetinaIcons: boolean) {\n this.enableRetinaIcons = enableRetinaIcons\n }\n\n getImageExtension(): string {\n return this.imageExtension\n }\n\n setImageExtension(imageExtension: string) {\n this.imageExtension = imageExtension\n }\n\n getImagePath(): string {\n return this.imagePath\n }\n\n setImagePath(imagePath: string) {\n this.imagePath = imagePath\n }\n\n getImageSizes(): number[] {\n return this.imageSizes\n }\n\n setImageSizes(imageSizes: number[]) {\n this.imageSizes = imageSizes\n }\n\n getCalculator(): TCalculator {\n return this.calculator\n }\n\n setCalculator(calculator: TCalculator) {\n this.calculator = calculator\n }\n\n getBatchSizeIE(): number {\n return this.batchSizeIE\n }\n\n setBatchSizeIE(batchSizeIE: number) {\n this.batchSizeIE = batchSizeIE\n }\n\n getClusterClass(): string {\n return this.clusterClass\n }\n\n setClusterClass(clusterClass: string) {\n this.clusterClass = clusterClass\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getTotalMarkers(): number {\n return this.markers.length\n }\n\n getClusters(): Cluster[] {\n return this.clusters\n }\n\n getTotalClusters(): number {\n return this.clusters.length\n }\n\n addMarker(marker: MarkerExtended, optNoDraw: boolean) {\n this.pushMarkerTo(marker)\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n addMarkers(markers: MarkerExtended[], optNoDraw: boolean) {\n for (const key in markers) {\n if (markers.hasOwnProperty(key)) {\n this.pushMarkerTo(markers[key])\n }\n }\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n pushMarkerTo(marker: MarkerExtended) {\n // If the marker is draggable add a listener so we can update the clusters on the dragend:\n if (marker.getDraggable()) {\n // eslint-disable-next-line @getify/proper-arrows/name, @getify/proper-arrows/this\n google.maps.event.addListener(marker, 'dragend', () => {\n if (this.ready) {\n marker.isAdded = false\n\n this.repaint()\n }\n })\n }\n\n marker.isAdded = false\n\n this.markers.push(marker)\n }\n\n removeMarker_(marker: MarkerExtended): boolean {\n let index = -1\n\n if (this.markers.indexOf) {\n index = this.markers.indexOf(marker)\n } else {\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n index = i\n\n break\n }\n }\n }\n\n if (index === -1) {\n // Marker is not in our list of markers, so do nothing:\n return false\n }\n\n marker.setMap(null)\n\n this.markers.splice(index, 1) // Remove the marker from the list of managed markers\n\n return true\n }\n\n removeMarker(marker: MarkerExtended, optNoDraw: boolean): boolean {\n const removed = this.removeMarker_(marker)\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n removeMarkers(markers: MarkerExtended[], optNoDraw: boolean): boolean {\n let removed = false\n\n for (let i = 0; i < markers.length; i++) {\n removed = removed || this.removeMarker_(markers[i])\n }\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n clearMarkers() {\n this.resetViewport(true)\n\n this.markers = []\n }\n\n repaint() {\n const oldClusters = this.clusters.slice()\n\n this.clusters = []\n\n this.resetViewport(false)\n\n this.redraw()\n\n // Remove the old clusters.\n // Do it in a timeout to prevent blinking effect.\n setTimeout(function timeout() {\n for (let i = 0; i < oldClusters.length; i++) {\n oldClusters[i].remove()\n }\n }, 0)\n }\n\n getExtendedBounds(bounds: google.maps.LatLngBounds): google.maps.LatLngBounds {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n const projection = this.getProjection()\n // Convert the points to pixels and the extend out by the grid size.\n const trPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng())\n )\n\n trPix.x += this.gridSize\n trPix.y -= this.gridSize\n\n const blPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng())\n )\n\n blPix.x -= this.gridSize\n blPix.y += this.gridSize\n\n // Extend the bounds to contain the new bounds.\n bounds.extend(\n // Convert the pixel points back to LatLng nw\n projection.fromDivPixelToLatLng(trPix)\n )\n\n bounds.extend(\n // Convert the pixel points back to LatLng sw\n projection.fromDivPixelToLatLng(blPix)\n )\n\n return bounds\n }\n\n redraw() {\n // Redraws all the clusters.\n this.createClusters(0)\n }\n\n resetViewport(optHide: boolean) {\n // Remove all the clusters\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Reset the markers to not be added and to be removed from the map.\n for (let i = 0; i < this.markers.length; i++) {\n const marker = this.markers[i]\n\n marker.isAdded = false\n\n if (optHide) {\n marker.setMap(null)\n }\n }\n }\n\n distanceBetweenPoints(p1: google.maps.LatLng, p2: google.maps.LatLng): number {\n const R = 6371 // Radius of the Earth in km\n\n const dLat = ((p2.lat() - p1.lat()) * Math.PI) / 180\n const dLon = ((p2.lng() - p1.lng()) * Math.PI) / 180\n\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos((p1.lat() * Math.PI) / 180) *\n Math.cos((p2.lat() * Math.PI) / 180) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2)\n\n return R * (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)))\n }\n\n isMarkerInBounds(marker: MarkerExtended, bounds: google.maps.LatLngBounds): boolean {\n const position = marker.getPosition()\n\n if (position) {\n return bounds.contains(position)\n }\n\n return false\n }\n\n addToClosestCluster(marker: MarkerExtended) {\n let cluster\n\n let distance = 40000 // Some large number\n\n let clusterToAddTo = null\n\n for (let i = 0; i < this.clusters.length; i++) {\n cluster = this.clusters[i]\n\n const center = cluster.getCenter()\n\n const position = marker.getPosition()\n\n if (center && position) {\n const d = this.distanceBetweenPoints(center, position)\n\n if (d < distance) {\n distance = d\n\n clusterToAddTo = cluster\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker)\n } else {\n cluster = new Cluster(this)\n\n cluster.addMarker(marker)\n\n this.clusters.push(cluster)\n }\n }\n\n createClusters(iFirst: number) {\n if (!this.ready) {\n return\n }\n\n // Cancel previous batch processing if we're working on the first batch:\n if (iFirst === 0) {\n /**\n * This event is fired when the <code>Clusterer</code> begins\n * clustering markers.\n * @name Clusterer#clusteringbegin\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringbegin', this)\n\n if (this.timerRefStatic !== null) {\n window.clearTimeout(this.timerRefStatic)\n\n // @ts-ignore\n delete this.timerRefStatic\n }\n }\n\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n //\n // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:\n const mapBounds =\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap().getZoom() > 3\n ? new google.maps.LatLngBounds(\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap()\n .getBounds()\n .getSouthWest(),\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap()\n .getBounds()\n .getNorthEast()\n )\n : new google.maps.LatLngBounds(\n new google.maps.LatLng(85.02070771743472, -178.48388434375),\n new google.maps.LatLng(-85.08136444384544, 178.00048865625)\n )\n\n const bounds = this.getExtendedBounds(mapBounds)\n\n const iLast = Math.min(iFirst + this.batchSize, this.markers.length)\n\n for (let i = iFirst; i < iLast; i++) {\n const marker = this.markers[i]\n\n if (!marker.isAdded && this.isMarkerInBounds(marker, bounds)) {\n if (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible())) {\n this.addToClosestCluster(marker)\n }\n }\n }\n\n if (iLast < this.markers.length) {\n this.timerRefStatic = window.setTimeout(\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n () => {\n this.createClusters(iLast)\n },\n 0\n )\n } else {\n this.timerRefStatic = null\n\n /**\n * This event is fired when the <code>Clusterer</code> stops\n * clustering markers.\n * @name Clusterer#clusteringend\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringend', this)\n\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].updateIcon()\n }\n }\n }\n\n extend(obj1: any, obj2: any): any {\n return function applyExtend(object: any) {\n // eslint-disable-next-line guard-for-in\n for (const property in object.prototype) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.prototype[property] = object.prototype[property]\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n return this\n }.apply(obj1, [obj2])\n }\n}\n"],"names":["cluster","styles","getClusterer","extend","ClusterIcon","google","maps","OverlayView","this","className","getClusterClass","center","undefined","div","sums","visible","boundsChangedListener","url","height","width","anchorText","anchorIcon","textColor","textSize","textDecoration","fontWeight","fontStyle","fontFamily","backgroundPosition","setMap","getMap","cMouseDownInCluster","cDraggingMapByCluster","document","createElement","show","getPanes","overlayMouseTarget","appendChild","event","addListener","addDomListener","markerClusterer_1","_this","trigger","getZoomOnClick","maxZoom_1","getMaxZoom","bounds_1","getBounds","fitBounds","setTimeout","getZoom","setZoom","cancelBubble","stopPropagation","parentNode","hide","removeListener","clearInstanceListeners","removeChild","_a","getPosFromLatLng","x","y","style","top","left","display","img","divTitle","bp","split","spriteH","parseInt","replace","spriteV","pos","title","getTitle","cssText","createCss","enableRetinaIcons","innerHTML","text","Math","min","length","max","index","push","join","latlng","getProjection","fromLatLngToDivPixel","markerClusterer","map","gridSize","getGridSize","minClusterSize","getMinimumClusterSize","averageCenter","getAverageCenter","markers","bounds","clusterIcon","getStyles","Cluster","LatLngBounds","getMarkers","i","position","getPosition","marker","isMarkerAlreadyAdded","length_1","LatLng","lat","lng","calculateBounds","isAdded","mCount","maxZoom","zoom","contains","getExtendedBounds","setCenter","useStyle","getCalculator","includes","CALCULATOR","numStyles","count","numberOfDigits","toString","IMAGE_SIZES","optMarkers","optOptions","Clusterer","clusters","listeners","activeMap","ready","minimumClusterSize","zoomOnClick","ignoreHidden","imagePath","imageExtension","imageSizes","calculator","batchSize","batchSizeIE","clusterClass","navigator","userAgent","toLowerCase","indexOf","timerRefStatic","setupStyles","addMarkers","repaint","resetViewport","get","redraw","remove","optNoDraw","pushMarkerTo","key","hasOwnProperty","getDraggable","splice","removed","removeMarker_","oldClusters","slice","projection","trPix","getNorthEast","blPix","getSouthWest","fromDivPixelToLatLng","createClusters","optHide","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","distance","clusterToAddTo","getCenter","d","distanceBetweenPoints","isMarkerInClusterBounds","addMarker","iFirst","window","clearTimeout","mapBounds","iLast","isMarkerInBounds","getVisible","addToClosestCluster","updateIcon","obj1","obj2","object","property","prototype","apply"],"mappings":"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"}
1
+ {"version":3,"file":"umd.min.js","sources":["../src/ClusterIcon.tsx","../src/Cluster.tsx","../src/Clusterer.tsx"],"sourcesContent":["/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\n\nimport { ClusterIconStyle, ClusterIconInfo } from './types'\n\nexport class ClusterIcon {\n cluster: Cluster\n className: string\n clusterClassName: string\n styles: ClusterIconStyle[]\n center: google.maps.LatLng | undefined\n div: HTMLDivElement | null\n sums: ClusterIconInfo | null\n visible: boolean\n url: string\n height: number\n width: number\n anchorText: number[]\n anchorIcon: number[]\n textColor: string\n textSize: number\n textDecoration: string\n fontWeight: string\n fontStyle: string\n fontFamily: string\n backgroundPosition: string\n\n boundsChangedListener: google.maps.MapsEventListener | null\n\n constructor(cluster: Cluster, styles: ClusterIconStyle[]) {\n cluster.getClusterer().extend(ClusterIcon, google.maps.OverlayView)\n this.cluster = cluster\n this.clusterClassName = this.cluster.getClusterer().getClusterClass()\n this.className = this.clusterClassName\n this.styles = styles\n this.center = undefined\n this.div = null\n this.sums = null\n this.visible = false\n this.boundsChangedListener = null\n this.url = ''\n this.height = 0\n this.width = 0\n this.anchorText = [0, 0]\n this.anchorIcon = [0, 0]\n this.textColor = 'black'\n this.textSize = 11\n this.textDecoration = 'none'\n this.fontWeight = 'bold'\n this.fontStyle = 'normal'\n this.fontFamily = 'Arial,sans-serif'\n this.backgroundPosition = '0 0'\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.setMap(cluster.getMap()) // Note: this causes onAdd to be called\n }\n\n onAdd() {\n let cMouseDownInCluster: boolean\n let cDraggingMapByCluster: boolean\n\n this.div = document.createElement('div')\n this.div.className = this.className\n if (this.visible) {\n this.show()\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getPanes().overlayMouseTarget.appendChild(this.div)\n\n // Fix for Issue 157\n this.boundsChangedListener = google.maps.event.addListener(\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap(),\n 'boundschanged',\n function boundsChanged() {\n cDraggingMapByCluster = cMouseDownInCluster\n }\n )\n\n google.maps.event.addDomListener(this.div, 'mousedown', function onMouseDown() {\n cMouseDownInCluster = true\n cDraggingMapByCluster = false\n })\n\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n google.maps.event.addDomListener(\n this.div,\n 'click',\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n (event: Event) => {\n cMouseDownInCluster = false\n\n if (!cDraggingMapByCluster) {\n const markerClusterer = this.cluster.getClusterer()\n\n /**\n * This event is fired when a cluster marker is clicked.\n * @name MarkerClusterer#click\n * @param {Cluster} c The cluster that was clicked.\n * @event\n */\n google.maps.event.trigger(markerClusterer, 'click', this.cluster)\n google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster) // deprecated name\n\n // The default click handler follows. Disable it by setting\n // the zoomOnClick property to false.\n if (markerClusterer.getZoomOnClick()) {\n // Zoom into the cluster.\n const maxZoom = markerClusterer.getMaxZoom()\n\n const bounds = this.cluster.getBounds()\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n markerClusterer.getMap().fitBounds(bounds)\n\n // There is a fix for Issue 170 here:\n setTimeout(function timeout() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n markerClusterer.getMap().fitBounds(bounds)\n\n // Don't zoom beyond the max zoom level\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n if (maxZoom !== null && markerClusterer.getMap().getZoom() > maxZoom) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n markerClusterer.getMap().setZoom(maxZoom + 1)\n }\n }, 100)\n }\n\n // Prevent event propagation to the map:\n event.cancelBubble = true\n\n if (event.stopPropagation) {\n event.stopPropagation()\n }\n }\n }\n )\n\n google.maps.event.addDomListener(\n this.div,\n 'mouseover',\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n () => {\n /**\n * This event is fired when the mouse moves over a cluster marker.\n * @name MarkerClusterer#mouseover\n * @param {Cluster} c The cluster that the mouse moved over.\n * @event\n */\n google.maps.event.trigger(this.cluster.getClusterer(), 'mouseover', this.cluster)\n }\n )\n\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n google.maps.event.addDomListener(\n this.div,\n 'mouseout',\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n () => {\n /**\n * This event is fired when the mouse moves out of a cluster marker.\n * @name MarkerClusterer#mouseout\n * @param {Cluster} c The cluster that the mouse moved out of.\n * @event\n */\n google.maps.event.trigger(this.cluster.getClusterer(), 'mouseout', this.cluster)\n }\n )\n }\n\n onRemove() {\n if (this.div && this.div.parentNode) {\n this.hide()\n\n if (this.boundsChangedListener !== null) {\n google.maps.event.removeListener(this.boundsChangedListener)\n }\n\n google.maps.event.clearInstanceListeners(this.div)\n\n this.div.parentNode.removeChild(this.div)\n\n this.div = null\n }\n }\n\n draw() {\n if (this.visible && this.div !== null && this.center) {\n const { x, y } = this.getPosFromLatLng(this.center)\n\n this.div.style.top = y + 'px'\n this.div.style.left = x + 'px'\n }\n }\n\n hide() {\n if (this.div) {\n this.div.style.display = 'none'\n }\n\n this.visible = false\n }\n\n show() {\n if (this.div && this.center) {\n let img = '',\n divTitle = ''\n\n // NOTE: values must be specified in px units\n const bp = this.backgroundPosition.split(' ')\n\n const spriteH = parseInt(bp[0].replace(/^\\s+|\\s+$/g, ''), 10)\n\n const spriteV = parseInt(bp[1].replace(/^\\s+|\\s+$/g, ''), 10)\n\n const pos = this.getPosFromLatLng(this.center)\n\n if (this.sums === null || typeof this.sums.title === 'undefined' || this.sums.title === '') {\n divTitle = this.cluster.getClusterer().getTitle()\n } else {\n divTitle = this.sums.title\n }\n\n this.div.style.cssText = this.createCss(pos)\n\n img =\n \"<img alt='\" +\n divTitle +\n \"' src='\" +\n this.url +\n \"' style='position: absolute; top: \" +\n spriteV +\n 'px; left: ' +\n spriteH +\n 'px; '\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n //@ts-ignore\n if (!this.cluster.getClusterer().enableRetinaIcons) {\n img +=\n 'clip: rect(' +\n -1 * spriteV +\n 'px, ' +\n (-1 * spriteH + this.width) +\n 'px, ' +\n (-1 * spriteV + this.height) +\n 'px, ' +\n -1 * spriteH +\n 'px);'\n }\n\n img += \"'>\"\n\n this.div.innerHTML =\n img +\n \"<div style='\" +\n 'position: absolute;' +\n 'top: ' +\n this.anchorText[0] +\n 'px;' +\n 'left: ' +\n this.anchorText[1] +\n 'px;' +\n 'color: ' +\n this.textColor +\n ';' +\n 'font-size: ' +\n this.textSize +\n 'px;' +\n 'font-family: ' +\n this.fontFamily +\n ';' +\n 'font-weight: ' +\n this.fontWeight +\n ';' +\n 'font-style: ' +\n this.fontStyle +\n ';' +\n 'text-decoration: ' +\n this.textDecoration +\n ';' +\n 'text-align: center;' +\n 'width: ' +\n this.width +\n 'px;' +\n 'line-height:' +\n this.height +\n 'px;' +\n \"'>\" +\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.sums.text +\n '</div>'\n\n this.div.title = divTitle\n\n this.div.style.display = ''\n }\n\n this.visible = true\n }\n\n useStyle(sums: ClusterIconInfo) {\n this.sums = sums\n const styles = this.cluster.getClusterer().getStyles()\n const style = styles[Math.min(styles.length - 1, Math.max(0, sums.index - 1))]\n\n this.url = style.url\n this.height = style.height\n this.width = style.width\n\n if (style.className) this.className = `${this.clusterClassName} ${style.className}`\n\n this.anchorText = style.anchorText || [0, 0]\n this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2]\n\n this.textColor = style.textColor || 'black'\n\n this.textSize = style.textSize || 11\n\n this.textDecoration = style.textDecoration || 'none'\n\n this.fontWeight = style.fontWeight || 'bold'\n\n this.fontStyle = style.fontStyle || 'normal'\n\n this.fontFamily = style.fontFamily || 'Arial,sans-serif'\n\n this.backgroundPosition = style.backgroundPosition || '0 0'\n }\n\n setCenter(center: google.maps.LatLng) {\n this.center = center\n }\n\n createCss(pos: google.maps.Point): string {\n const style = []\n\n style.push('cursor: pointer;')\n\n style.push('position: absolute; top: ' + pos.y + 'px; left: ' + pos.x + 'px;')\n\n style.push('width: ' + this.width + 'px; height: ' + this.height + 'px;')\n\n return style.join('')\n }\n\n getPosFromLatLng(latlng: google.maps.LatLng): google.maps.Point {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n const pos = this.getProjection().fromLatLngToDivPixel(latlng)\n\n pos.x -= this.anchorIcon[1]\n\n pos.y -= this.anchorIcon[0]\n\n // pos.x = pos.x\n\n // pos.y = pos.y\n\n return pos\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Clusterer } from './Clusterer'\n\nimport { ClusterIcon } from './ClusterIcon'\n\nimport { MarkerExtended } from './types'\n\nexport class Cluster {\n markerClusterer: Clusterer\n map: google.maps.Map | google.maps.StreetViewPanorama\n gridSize: number\n minClusterSize: number\n averageCenter: boolean\n markers: MarkerExtended[]\n center: google.maps.LatLng | undefined\n bounds: google.maps.LatLngBounds | null\n clusterIcon: ClusterIcon\n\n constructor(markerClusterer: Clusterer) {\n this.markerClusterer = markerClusterer\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.map = this.markerClusterer.getMap()\n\n this.gridSize = this.markerClusterer.getGridSize()\n\n this.minClusterSize = this.markerClusterer.getMinimumClusterSize()\n\n this.averageCenter = this.markerClusterer.getAverageCenter()\n\n this.markers = []\n\n this.center = undefined\n\n this.bounds = null\n\n this.clusterIcon = new ClusterIcon(this, this.markerClusterer.getStyles())\n }\n\n getSize(): number {\n return this.markers.length\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getCenter(): google.maps.LatLng | undefined {\n return this.center\n }\n\n getMap(): google.maps.Map | google.maps.StreetViewPanorama {\n return this.map\n }\n\n getClusterer(): Clusterer {\n return this.markerClusterer\n }\n\n getBounds(): google.maps.LatLngBounds {\n const bounds = new google.maps.LatLngBounds(this.center, this.center)\n\n const markers = this.getMarkers()\n\n for (let i = 0; i < markers.length; i++) {\n const position = markers[i].getPosition()\n\n if (position) {\n bounds.extend(position)\n }\n }\n\n return bounds\n }\n\n remove() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.clusterIcon.setMap(null)\n\n this.markers = []\n\n // @ts-ignore\n delete this.markers\n }\n\n addMarker(marker: MarkerExtended): boolean {\n if (this.isMarkerAlreadyAdded(marker)) {\n return false\n }\n\n if (!this.center) {\n const position = marker.getPosition()\n\n if (position) {\n this.center = position\n\n this.calculateBounds()\n }\n } else {\n if (this.averageCenter) {\n const position = marker.getPosition()\n\n if (position) {\n const length = this.markers.length + 1\n\n this.center = new google.maps.LatLng(\n (this.center.lat() * (length - 1) + position.lat()) / length,\n (this.center.lng() * (length - 1) + position.lng()) / length\n )\n\n this.calculateBounds()\n }\n }\n }\n\n marker.isAdded = true\n\n this.markers.push(marker)\n\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n // Zoomed in past max zoom, so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount < this.minClusterSize) {\n // Min cluster size not reached so show the marker.\n if (marker.getMap() !== this.map) {\n marker.setMap(this.map)\n }\n } else if (mCount === this.minClusterSize) {\n // Hide the markers that were showing.\n for (let i = 0; i < mCount; i++) {\n this.markers[i].setMap(null)\n }\n } else {\n marker.setMap(null)\n }\n\n return true\n }\n\n isMarkerInClusterBounds(marker: MarkerExtended): boolean {\n if (this.bounds !== null) {\n const position = marker.getPosition()\n\n if (position) {\n return this.bounds.contains(position)\n }\n }\n\n return false\n }\n\n calculateBounds() {\n this.bounds = this.markerClusterer.getExtendedBounds(\n new google.maps.LatLngBounds(this.center, this.center)\n )\n }\n\n updateIcon() {\n const mCount = this.markers.length\n\n const maxZoom = this.markerClusterer.getMaxZoom()\n\n const zoom = this.map.getZoom()\n\n if (maxZoom !== null && typeof zoom !== 'undefined' && zoom > maxZoom) {\n this.clusterIcon.hide()\n\n return\n }\n\n if (mCount < this.minClusterSize) {\n // Min cluster size not yet reached.\n this.clusterIcon.hide()\n\n return\n }\n\n if (this.center) {\n this.clusterIcon.setCenter(this.center)\n }\n\n this.clusterIcon.useStyle(\n this.markerClusterer.getCalculator()(this.markers, this.markerClusterer.getStyles().length)\n )\n\n this.clusterIcon.show()\n }\n\n isMarkerAlreadyAdded(marker: MarkerExtended): boolean {\n if (this.markers.includes) {\n return this.markers.includes(marker)\n } else {\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n return true\n }\n }\n }\n\n return false\n }\n}\n","/* global google */\n/* eslint-disable filenames/match-regex */\nimport { Cluster } from './Cluster'\n\nimport {\n MarkerExtended,\n ClustererOptions,\n ClusterIconStyle,\n TCalculator,\n ClusterIconInfo,\n} from './types'\n\n/**\n * Supports up to 9007199254740991 (Number.MAX_SAFE_INTEGER) markers\n * which is not a problem as max array length is 4294967296 (2**32)\n */\nconst CALCULATOR = function CALCULATOR(\n markers: MarkerExtended[],\n numStyles: number\n): ClusterIconInfo {\n const count = markers.length\n\n const numberOfDigits = count.toString().length\n\n const index = Math.min(numberOfDigits, numStyles)\n\n return {\n text: count.toString(),\n index: index,\n title: '',\n }\n}\n\nconst BATCH_SIZE = 2000\n\nconst BATCH_SIZE_IE = 500\n\nconst IMAGE_PATH =\n 'https://developers.google.com/maps/documentation/javascript/examples/markerclusterer/m'\n\nconst IMAGE_EXTENSION = 'png'\n\nconst IMAGE_SIZES = [53, 56, 66, 78, 90]\n\nconst CLUSTERER_CLASS = 'cluster'\n\nexport class Clusterer {\n markers: MarkerExtended[]\n clusters: Cluster[]\n listeners: google.maps.MapsEventListener[]\n activeMap: google.maps.Map | google.maps.StreetViewPanorama | null\n ready: boolean\n gridSize: number\n minClusterSize: number\n maxZoom: number | null\n styles: ClusterIconStyle[]\n title: string\n zoomOnClick: boolean\n averageCenter: boolean\n ignoreHidden: boolean\n enableRetinaIcons: boolean\n imagePath: string\n imageExtension: string\n imageSizes: number[]\n calculator: TCalculator\n batchSize: number\n batchSizeIE: number\n clusterClass: string\n timerRefStatic: number | null\n\n constructor(\n map: google.maps.Map,\n optMarkers: MarkerExtended[] = [],\n optOptions: ClustererOptions = {}\n ) {\n this.extend(Clusterer, google.maps.OverlayView)\n\n this.markers = []\n this.clusters = []\n this.listeners = []\n this.activeMap = null\n this.ready = false\n this.gridSize = optOptions.gridSize || 60\n this.minClusterSize = optOptions.minimumClusterSize || 2\n this.maxZoom = optOptions.maxZoom || null\n this.styles = optOptions.styles || []\n\n this.title = optOptions.title || ''\n\n this.zoomOnClick = true\n\n if (optOptions.zoomOnClick !== undefined) {\n this.zoomOnClick = optOptions.zoomOnClick\n }\n\n this.averageCenter = false\n\n if (optOptions.averageCenter !== undefined) {\n this.averageCenter = optOptions.averageCenter\n }\n\n this.ignoreHidden = false\n\n if (optOptions.ignoreHidden !== undefined) {\n this.ignoreHidden = optOptions.ignoreHidden\n }\n\n this.enableRetinaIcons = false\n\n if (optOptions.enableRetinaIcons !== undefined) {\n this.enableRetinaIcons = optOptions.enableRetinaIcons\n }\n this.imagePath = optOptions.imagePath || IMAGE_PATH\n\n this.imageExtension = optOptions.imageExtension || IMAGE_EXTENSION\n\n this.imageSizes = optOptions.imageSizes || IMAGE_SIZES\n\n this.calculator = optOptions.calculator || CALCULATOR\n\n this.batchSize = optOptions.batchSize || BATCH_SIZE\n\n this.batchSizeIE = optOptions.batchSizeIE || BATCH_SIZE_IE\n\n this.clusterClass = optOptions.clusterClass || CLUSTERER_CLASS\n\n if (navigator.userAgent.toLowerCase().indexOf('msie') !== -1) {\n // Try to avoid IE timeout when processing a huge number of markers:\n this.batchSize = this.batchSizeIE\n }\n\n this.timerRefStatic = null\n\n this.setupStyles()\n\n this.addMarkers(optMarkers, true)\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.setMap(map) // Note: this causes onAdd to be called\n }\n\n onAdd() {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.activeMap = this.getMap()\n\n this.ready = true\n\n this.repaint()\n\n // Add the map event listeners\n this.listeners = [\n google.maps.event.addListener(\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap(),\n 'zoom_changed',\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n () => {\n this.resetViewport(false)\n // Workaround for this Google bug: when map is at level 0 and \"-\" of\n // zoom slider is clicked, a \"zoom_changed\" event is fired even though\n // the map doesn't zoom out any further. In this situation, no \"idle\"\n // event is triggered so the cluster markers that have been removed\n // do not get redrawn. Same goes for a zoom in at maxZoom.\n if (\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap().getZoom() === (this.get('minZoom') || 0) ||\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap().getZoom() === this.get('maxZoom')\n ) {\n google.maps.event.trigger(this, 'idle')\n }\n }\n ),\n google.maps.event.addListener(\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap(),\n 'idle',\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n () => {\n this.redraw()\n }\n ),\n ]\n }\n\n // eslint-disable-next-line @getify/proper-arrows/this\n onRemove() {\n // Put all the managed markers back on the map:\n for (let i = 0; i < this.markers.length; i++) {\n if (this.markers[i].getMap() !== this.activeMap) {\n this.markers[i].setMap(this.activeMap)\n }\n }\n\n // Remove all clusters:\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Remove map event listeners:\n for (let i = 0; i < this.listeners.length; i++) {\n google.maps.event.removeListener(this.listeners[i])\n }\n\n this.listeners = []\n\n this.activeMap = null\n\n this.ready = false\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n draw() {}\n\n setupStyles() {\n if (this.styles.length > 0) {\n return\n }\n\n for (let i = 0; i < this.imageSizes.length; i++) {\n this.styles.push({\n url: this.imagePath + (i + 1) + '.' + this.imageExtension,\n height: this.imageSizes[i],\n width: this.imageSizes[i],\n })\n }\n }\n\n fitMapToMarkers() {\n const markers = this.getMarkers()\n\n const bounds = new google.maps.LatLngBounds()\n\n for (let i = 0; i < markers.length; i++) {\n const position = markers[i].getPosition()\n if (position) {\n bounds.extend(position)\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap().fitBounds(bounds)\n }\n\n getGridSize(): number {\n return this.gridSize\n }\n\n setGridSize(gridSize: number) {\n this.gridSize = gridSize\n }\n\n getMinimumClusterSize(): number {\n return this.minClusterSize\n }\n\n setMinimumClusterSize(minimumClusterSize: number) {\n this.minClusterSize = minimumClusterSize\n }\n\n getMaxZoom(): number | null {\n return this.maxZoom\n }\n\n setMaxZoom(maxZoom: number) {\n this.maxZoom = maxZoom\n }\n\n getStyles(): ClusterIconStyle[] {\n return this.styles\n }\n\n setStyles(styles: ClusterIconStyle[]) {\n this.styles = styles\n }\n\n getTitle(): string {\n return this.title\n }\n\n setTitle(title: string) {\n this.title = title\n }\n\n getZoomOnClick(): boolean {\n return this.zoomOnClick\n }\n\n setZoomOnClick(zoomOnClick: boolean) {\n this.zoomOnClick = zoomOnClick\n }\n\n getAverageCenter(): boolean {\n return this.averageCenter\n }\n\n setAverageCenter(averageCenter: boolean) {\n this.averageCenter = averageCenter\n }\n\n getIgnoreHidden(): boolean {\n return this.ignoreHidden\n }\n\n setIgnoreHidden(ignoreHidden: boolean) {\n this.ignoreHidden = ignoreHidden\n }\n\n getEnableRetinaIcons(): boolean {\n return this.enableRetinaIcons\n }\n\n setEnableRetinaIcons(enableRetinaIcons: boolean) {\n this.enableRetinaIcons = enableRetinaIcons\n }\n\n getImageExtension(): string {\n return this.imageExtension\n }\n\n setImageExtension(imageExtension: string) {\n this.imageExtension = imageExtension\n }\n\n getImagePath(): string {\n return this.imagePath\n }\n\n setImagePath(imagePath: string) {\n this.imagePath = imagePath\n }\n\n getImageSizes(): number[] {\n return this.imageSizes\n }\n\n setImageSizes(imageSizes: number[]) {\n this.imageSizes = imageSizes\n }\n\n getCalculator(): TCalculator {\n return this.calculator\n }\n\n setCalculator(calculator: TCalculator) {\n this.calculator = calculator\n }\n\n getBatchSizeIE(): number {\n return this.batchSizeIE\n }\n\n setBatchSizeIE(batchSizeIE: number) {\n this.batchSizeIE = batchSizeIE\n }\n\n getClusterClass(): string {\n return this.clusterClass\n }\n\n setClusterClass(clusterClass: string) {\n this.clusterClass = clusterClass\n }\n\n getMarkers(): MarkerExtended[] {\n return this.markers\n }\n\n getTotalMarkers(): number {\n return this.markers.length\n }\n\n getClusters(): Cluster[] {\n return this.clusters\n }\n\n getTotalClusters(): number {\n return this.clusters.length\n }\n\n addMarker(marker: MarkerExtended, optNoDraw: boolean) {\n this.pushMarkerTo(marker)\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n addMarkers(markers: MarkerExtended[], optNoDraw: boolean) {\n for (const key in markers) {\n if (markers.hasOwnProperty(key)) {\n this.pushMarkerTo(markers[key])\n }\n }\n\n if (!optNoDraw) {\n this.redraw()\n }\n }\n\n pushMarkerTo(marker: MarkerExtended) {\n // If the marker is draggable add a listener so we can update the clusters on the dragend:\n if (marker.getDraggable()) {\n // eslint-disable-next-line @getify/proper-arrows/name, @getify/proper-arrows/this\n google.maps.event.addListener(marker, 'dragend', () => {\n if (this.ready) {\n marker.isAdded = false\n\n this.repaint()\n }\n })\n }\n\n marker.isAdded = false\n\n this.markers.push(marker)\n }\n\n removeMarker_(marker: MarkerExtended): boolean {\n let index = -1\n\n if (this.markers.indexOf) {\n index = this.markers.indexOf(marker)\n } else {\n for (let i = 0; i < this.markers.length; i++) {\n if (marker === this.markers[i]) {\n index = i\n\n break\n }\n }\n }\n\n if (index === -1) {\n // Marker is not in our list of markers, so do nothing:\n return false\n }\n\n marker.setMap(null)\n\n this.markers.splice(index, 1) // Remove the marker from the list of managed markers\n\n return true\n }\n\n removeMarker(marker: MarkerExtended, optNoDraw: boolean): boolean {\n const removed = this.removeMarker_(marker)\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n removeMarkers(markers: MarkerExtended[], optNoDraw: boolean): boolean {\n let removed = false\n\n for (let i = 0; i < markers.length; i++) {\n removed = removed || this.removeMarker_(markers[i])\n }\n\n if (!optNoDraw && removed) {\n this.repaint()\n }\n\n return removed\n }\n\n clearMarkers() {\n this.resetViewport(true)\n\n this.markers = []\n }\n\n repaint() {\n const oldClusters = this.clusters.slice()\n\n this.clusters = []\n\n this.resetViewport(false)\n\n this.redraw()\n\n // Remove the old clusters.\n // Do it in a timeout to prevent blinking effect.\n setTimeout(function timeout() {\n for (let i = 0; i < oldClusters.length; i++) {\n oldClusters[i].remove()\n }\n }, 0)\n }\n\n getExtendedBounds(bounds: google.maps.LatLngBounds): google.maps.LatLngBounds {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n const projection = this.getProjection()\n // Convert the points to pixels and the extend out by the grid size.\n const trPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getNorthEast().lat(), bounds.getNorthEast().lng())\n )\n\n trPix.x += this.gridSize\n trPix.y -= this.gridSize\n\n const blPix = projection.fromLatLngToDivPixel(\n // Turn the bounds into latlng.\n new google.maps.LatLng(bounds.getSouthWest().lat(), bounds.getSouthWest().lng())\n )\n\n blPix.x -= this.gridSize\n blPix.y += this.gridSize\n\n // Extend the bounds to contain the new bounds.\n bounds.extend(\n // Convert the pixel points back to LatLng nw\n projection.fromDivPixelToLatLng(trPix)\n )\n\n bounds.extend(\n // Convert the pixel points back to LatLng sw\n projection.fromDivPixelToLatLng(blPix)\n )\n\n return bounds\n }\n\n redraw() {\n // Redraws all the clusters.\n this.createClusters(0)\n }\n\n resetViewport(optHide: boolean) {\n // Remove all the clusters\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].remove()\n }\n\n this.clusters = []\n\n // Reset the markers to not be added and to be removed from the map.\n for (let i = 0; i < this.markers.length; i++) {\n const marker = this.markers[i]\n\n marker.isAdded = false\n\n if (optHide) {\n marker.setMap(null)\n }\n }\n }\n\n distanceBetweenPoints(p1: google.maps.LatLng, p2: google.maps.LatLng): number {\n const R = 6371 // Radius of the Earth in km\n\n const dLat = ((p2.lat() - p1.lat()) * Math.PI) / 180\n const dLon = ((p2.lng() - p1.lng()) * Math.PI) / 180\n\n const a =\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\n Math.cos((p1.lat() * Math.PI) / 180) *\n Math.cos((p2.lat() * Math.PI) / 180) *\n Math.sin(dLon / 2) *\n Math.sin(dLon / 2)\n\n return R * (2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)))\n }\n\n isMarkerInBounds(marker: MarkerExtended, bounds: google.maps.LatLngBounds): boolean {\n const position = marker.getPosition()\n\n if (position) {\n return bounds.contains(position)\n }\n\n return false\n }\n\n addToClosestCluster(marker: MarkerExtended) {\n let cluster\n\n let distance = 40000 // Some large number\n\n let clusterToAddTo = null\n\n for (let i = 0; i < this.clusters.length; i++) {\n cluster = this.clusters[i]\n\n const center = cluster.getCenter()\n\n const position = marker.getPosition()\n\n if (center && position) {\n const d = this.distanceBetweenPoints(center, position)\n\n if (d < distance) {\n distance = d\n\n clusterToAddTo = cluster\n }\n }\n }\n\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\n clusterToAddTo.addMarker(marker)\n } else {\n cluster = new Cluster(this)\n\n cluster.addMarker(marker)\n\n this.clusters.push(cluster)\n }\n }\n\n createClusters(iFirst: number) {\n if (!this.ready) {\n return\n }\n\n // Cancel previous batch processing if we're working on the first batch:\n if (iFirst === 0) {\n /**\n * This event is fired when the <code>Clusterer</code> begins\n * clustering markers.\n * @name Clusterer#clusteringbegin\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringbegin', this)\n\n if (this.timerRefStatic !== null) {\n window.clearTimeout(this.timerRefStatic)\n\n // @ts-ignore\n delete this.timerRefStatic\n }\n }\n\n // Get our current map view bounds.\n // Create a new bounds object so we don't affect the map.\n //\n // See Comments 9 & 11 on Issue 3651 relating to this workaround for a Google Maps bug:\n const mapBounds =\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap().getZoom() > 3\n ? new google.maps.LatLngBounds(\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap()\n .getBounds()\n .getSouthWest(),\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.getMap()\n .getBounds()\n .getNorthEast()\n )\n : new google.maps.LatLngBounds(\n new google.maps.LatLng(85.02070771743472, -178.48388434375),\n new google.maps.LatLng(-85.08136444384544, 178.00048865625)\n )\n\n const bounds = this.getExtendedBounds(mapBounds)\n\n const iLast = Math.min(iFirst + this.batchSize, this.markers.length)\n\n for (let i = iFirst; i < iLast; i++) {\n const marker = this.markers[i]\n\n if (!marker.isAdded && this.isMarkerInBounds(marker, bounds)) {\n if (!this.ignoreHidden || (this.ignoreHidden && marker.getVisible())) {\n this.addToClosestCluster(marker)\n }\n }\n }\n\n if (iLast < this.markers.length) {\n this.timerRefStatic = window.setTimeout(\n // eslint-disable-next-line @getify/proper-arrows/this, @getify/proper-arrows/name\n () => {\n this.createClusters(iLast)\n },\n 0\n )\n } else {\n this.timerRefStatic = null\n\n /**\n * This event is fired when the <code>Clusterer</code> stops\n * clustering markers.\n * @name Clusterer#clusteringend\n * @param {Clusterer} mc The Clusterer whose markers are being clustered.\n * @event\n */\n google.maps.event.trigger(this, 'clusteringend', this)\n\n for (let i = 0; i < this.clusters.length; i++) {\n this.clusters[i].updateIcon()\n }\n }\n }\n\n extend(obj1: any, obj2: any): any {\n return function applyExtend(object: any) {\n // eslint-disable-next-line guard-for-in\n for (const property in object.prototype) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n this.prototype[property] = object.prototype[property]\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-ignore\n // @ts-ignore\n return this\n }.apply(obj1, [obj2])\n }\n}\n"],"names":["cluster","styles","getClusterer","extend","ClusterIcon","google","maps","OverlayView","this","clusterClassName","getClusterClass","className","center","undefined","div","sums","visible","boundsChangedListener","url","height","width","anchorText","anchorIcon","textColor","textSize","textDecoration","fontWeight","fontStyle","fontFamily","backgroundPosition","setMap","getMap","cMouseDownInCluster","cDraggingMapByCluster","document","createElement","show","getPanes","overlayMouseTarget","appendChild","event","addListener","addDomListener","markerClusterer_1","_this","trigger","getZoomOnClick","maxZoom_1","getMaxZoom","bounds_1","getBounds","fitBounds","setTimeout","getZoom","setZoom","cancelBubble","stopPropagation","parentNode","hide","removeListener","clearInstanceListeners","removeChild","_a","getPosFromLatLng","x","y","style","top","left","display","img","divTitle","bp","split","spriteH","parseInt","replace","spriteV","pos","title","getTitle","cssText","createCss","enableRetinaIcons","innerHTML","text","getStyles","Math","min","length","max","index","push","join","latlng","getProjection","fromLatLngToDivPixel","markerClusterer","map","gridSize","getGridSize","minClusterSize","getMinimumClusterSize","averageCenter","getAverageCenter","markers","bounds","clusterIcon","Cluster","LatLngBounds","getMarkers","i","position","getPosition","marker","isMarkerAlreadyAdded","length_1","LatLng","lat","lng","calculateBounds","isAdded","mCount","maxZoom","zoom","contains","getExtendedBounds","setCenter","useStyle","getCalculator","includes","CALCULATOR","numStyles","count","numberOfDigits","toString","IMAGE_SIZES","optMarkers","optOptions","Clusterer","clusters","listeners","activeMap","ready","minimumClusterSize","zoomOnClick","ignoreHidden","imagePath","imageExtension","imageSizes","calculator","batchSize","batchSizeIE","clusterClass","navigator","userAgent","toLowerCase","indexOf","timerRefStatic","setupStyles","addMarkers","repaint","resetViewport","get","redraw","remove","optNoDraw","pushMarkerTo","key","hasOwnProperty","getDraggable","splice","removed","removeMarker_","oldClusters","slice","projection","trPix","getNorthEast","blPix","getSouthWest","fromDivPixelToLatLng","createClusters","optHide","p1","p2","dLat","PI","dLon","a","sin","cos","atan2","sqrt","distance","clusterToAddTo","getCenter","d","distanceBetweenPoints","isMarkerInClusterBounds","addMarker","iFirst","window","clearTimeout","mapBounds","iLast","isMarkerInBounds","getVisible","addToClosestCluster","updateIcon","obj1","obj2","object","property","prototype","apply"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@react-google-maps/marker-clusterer",
3
3
  "sideEffects": false,
4
- "version": "2.5.0",
4
+ "version": "2.6.0",
5
5
  "description": "Marker Clusterer for React.js Google Maps API",
6
6
  "license": "MIT",
7
7
  "author": {
@@ -54,15 +54,14 @@
54
54
  "dependencies": {},
55
55
  "devDependencies": {
56
56
  "@getify/eslint-plugin-proper-arrows": "11.0.3",
57
- "@rollup/plugin-commonjs": "20.0.0",
58
- "@rollup/plugin-node-resolve": "13.0.4",
59
- "@rollup/plugin-typescript": "8.2.5",
57
+ "@rollup/plugin-commonjs": "21.0.1",
58
+ "@rollup/plugin-node-resolve": "13.0.6",
59
+ "@rollup/plugin-typescript": "8.3.0",
60
60
  "@types/babel-types": "7.0.11",
61
- "@types/google.maps": "3.45.6",
62
- "@types/jest": "27.0.1",
63
- "@types/react-dom": "17.0.9",
64
- "@typescript-eslint/eslint-plugin": "4.31.1",
65
- "@typescript-eslint/parser": "4.31.1",
61
+ "@types/google.maps": "3.46.1",
62
+ "@types/jest": "27.0.2",
63
+ "@typescript-eslint/eslint-plugin": "5.3.1",
64
+ "@typescript-eslint/parser": "5.3.1",
66
65
  "eslint": "7.32.0",
67
66
  "eslint-config-standard": "16.0.3",
68
67
  "eslint-config-standard-react": "11.0.1",
@@ -70,30 +69,30 @@
70
69
  "eslint-plugin-ascii": "1.0.0",
71
70
  "eslint-plugin-babel": "5.3.1",
72
71
  "eslint-plugin-filenames": "1.3.2",
73
- "eslint-plugin-html": "6.1.2",
74
- "eslint-plugin-import": "2.24.2",
72
+ "eslint-plugin-html": "6.2.0",
73
+ "eslint-plugin-import": "2.25.2",
75
74
  "eslint-plugin-json": "3.1.0",
76
75
  "eslint-plugin-jsx-a11y": "6.4.1",
77
76
  "eslint-plugin-no-inferred-method-name": "2.0.0",
78
77
  "eslint-plugin-node": "11.1.0",
79
78
  "eslint-plugin-optimize-regex": "1.2.1",
80
- "eslint-plugin-promise": "5.1.0",
81
- "eslint-plugin-react": "7.25.3",
79
+ "eslint-plugin-promise": "5.1.1",
80
+ "eslint-plugin-react": "7.26.1",
82
81
  "eslint-plugin-react-functional-set-state": "1.2.1",
83
82
  "eslint-plugin-react-hooks": "4.2.0",
84
83
  "eslint-plugin-react-perf": "3.3.0",
85
84
  "eslint-plugin-standard": "5.0.0",
86
85
  "eslint-plugin-you-dont-need-lodash-underscore": "6.12.0",
87
- "jest": "27.2.0",
88
- "jest-cli": "27.2.0",
86
+ "jest": "27.3.1",
87
+ "jest-cli": "27.3.1",
89
88
  "react": "17.0.2",
90
89
  "react-dom": "17.0.2",
91
90
  "rimraf": "3.0.2",
92
- "rollup": "2.56.3",
93
- "rollup-plugin-dts": "4.0.0",
91
+ "rollup": "2.59.0",
92
+ "rollup-plugin-dts": "4.0.1",
94
93
  "rollup-plugin-terser": "7.0.2",
95
- "ts-jest": "27.0.5",
96
- "typescript": "4.4.3"
94
+ "ts-jest": "27.0.7",
95
+ "typescript": "4.4.4"
97
96
  },
98
97
  "gitHead": "80167ddcc3d8e356dbf0b0c3a6292c6a3a989f83"
99
98
  }
@@ -7,6 +7,7 @@ import { ClusterIconStyle, ClusterIconInfo } from './types'
7
7
  export class ClusterIcon {
8
8
  cluster: Cluster
9
9
  className: string
10
+ clusterClassName: string
10
11
  styles: ClusterIconStyle[]
11
12
  center: google.maps.LatLng | undefined
12
13
  div: HTMLDivElement | null
@@ -30,7 +31,8 @@ export class ClusterIcon {
30
31
  constructor(cluster: Cluster, styles: ClusterIconStyle[]) {
31
32
  cluster.getClusterer().extend(ClusterIcon, google.maps.OverlayView)
32
33
  this.cluster = cluster
33
- this.className = this.cluster.getClusterer().getClusterClass()
34
+ this.clusterClassName = this.cluster.getClusterer().getClusterClass()
35
+ this.className = this.clusterClassName
34
36
  this.styles = styles
35
37
  this.center = undefined
36
38
  this.div = null
@@ -309,15 +311,14 @@ export class ClusterIcon {
309
311
 
310
312
  useStyle(sums: ClusterIconInfo) {
311
313
  this.sums = sums
312
-
313
- const style = this.styles[Math.min(this.styles.length - 1, Math.max(0, sums.index - 1))]
314
+ const styles = this.cluster.getClusterer().getStyles()
315
+ const style = styles[Math.min(styles.length - 1, Math.max(0, sums.index - 1))]
314
316
 
315
317
  this.url = style.url
316
318
  this.height = style.height
317
319
  this.width = style.width
318
320
 
319
- if (style.className)
320
- this.className = `${this.className} ${style.className}`
321
+ if (style.className) this.className = `${this.clusterClassName} ${style.className}`
321
322
 
322
323
  this.anchorText = style.anchorText || [0, 0]
323
324
  this.anchorIcon = style.anchorIcon || [this.height / 2, this.width / 2]