{"version":3,"file":"ng-maps-marker-clusterer.mjs","sources":["../../../../libs/marker-clusterer/src/lib/services/managers/cluster-manager.ts","../../../../libs/marker-clusterer/src/lib/directives/marker-cluster.ts","../../../../libs/marker-clusterer/src/lib/marker-clusterer.module.ts","../../../../libs/marker-clusterer/src/public-api.ts","../../../../libs/marker-clusterer/src/ng-maps-marker-clusterer.ts"],"sourcesContent":["import { Injectable, NgZone } from '@angular/core';\nimport {\n  MarkerClusterer,\n  MarkerClustererOptions,\n} from '@googlemaps/markerclusterer';\nimport { Observable, Observer } from 'rxjs';\n\nimport {\n  MapsApiWrapper,\n  NgMapsMarkerComponent,\n  NgMapsViewComponent,\n} from '@ng-maps/core';\nimport { GoogleMapsMarkerManager } from '@ng-maps/google';\n\nimport { MarkerClusterComponent } from '../../directives/marker-cluster';\n\n@Injectable({\n  providedIn: NgMapsViewComponent,\n})\nexport class ClusterManager extends GoogleMapsMarkerManager {\n  private _clustererInstance: Promise<MarkerClusterer>;\n  private _resolver?: (value?: any) => void;\n  constructor(_mapsWrapper: MapsApiWrapper, _zone: NgZone) {\n    super(_mapsWrapper, _zone);\n    this._clustererInstance = new Promise<MarkerClusterer>((resolver) => {\n      this._resolver = resolver;\n    });\n  }\n\n  public async createCluster(options: MarkerClustererOptions): Promise<void> {\n    const map = await this._mapsWrapper.getNativeMap();\n    if (this._resolver) {\n      this._resolver(\n        new MarkerClusterer({\n          map,\n          markers: [...this._markers.values()],\n          ...options,\n        }),\n      );\n    }\n  }\n\n  /**\n   * @todo fix commented options\n   * @param marker\n   */\n  public override async addMarker(\n    marker: NgMapsMarkerComponent,\n  ): Promise<void> {\n    if (\n      typeof marker.latitude !== 'number' ||\n      typeof marker.longitude !== 'number'\n    ) {\n      return;\n    }\n\n    const cluster: MarkerClusterer = await this._clustererInstance;\n    const markers = await this._mapsWrapper.createMarker(\n      {\n        lat: marker.latitude,\n        lng: marker.longitude,\n      },\n      // TODO typings\n      {\n        label: marker.label,\n        draggable: marker.draggable,\n        icon: marker.icon ?? marker.iconUrl,\n        opacity: marker.opacity,\n        visible: marker.visible,\n        zIndex: marker.zIndex,\n        title: marker.title,\n        clickable: marker.clickable,\n      } as any,\n      false,\n    );\n    cluster.addMarker(markers);\n    this._markers.set(marker, markers);\n  }\n\n  public override async deleteMarker(\n    marker: NgMapsMarkerComponent,\n  ): Promise<void> {\n    const m = this._markers.get(marker);\n    if (m == null) {\n      // marker already deleted\n      return Promise.resolve();\n    }\n    this._zone.run(() => {\n      m.setMap(null);\n      this._clustererInstance.then((cluster) => {\n        cluster.removeMarker(m);\n        this._markers.delete(marker);\n      });\n    });\n  }\n\n  public clearMarkers(): Promise<void> {\n    return this._clustererInstance.then((cluster) => {\n      cluster.clearMarkers();\n    });\n  }\n\n  public createClusterEventObservable<T>(\n    eventName: string,\n    marker: MarkerClusterComponent,\n  ): Observable<T> {\n    return new Observable<T>((observer: Observer<T>) => {\n      this._clustererInstance.then((m: MarkerClusterer) => {\n        m.addListener(eventName, (e: T) =>\n          this._zone.run(() => observer.next(e)),\n        );\n      });\n    });\n  }\n}\n","import {\n  Directive,\n  EventEmitter,\n  Input,\n  OnChanges,\n  OnDestroy,\n  OnInit,\n  Output,\n  SimpleChanges,\n} from '@angular/core';\nimport { Algorithm, Cluster, Renderer } from '@googlemaps/markerclusterer';\n\nimport { InfoWindowManager, MarkerManager } from '@ng-maps/core';\nimport { GoogleInfoWindowManager } from '@ng-maps/google';\n\nimport { ClusterManager } from '../services/managers/cluster-manager';\n\n/**\n * MarkerClusterComponent clusters map marker if they are near together\n */\n@Directive({\n  // eslint-disable-next-line @angular-eslint/directive-selector\n  selector: 'map-marker-cluster',\n  providers: [\n    ClusterManager,\n    { provide: MarkerManager, useExisting: ClusterManager },\n    { provide: InfoWindowManager, useClass: GoogleInfoWindowManager },\n  ],\n  standalone: false,\n})\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport class MarkerClusterComponent implements OnDestroy, OnChanges, OnInit {\n  /**\n   * see {@link https://googlemaps.github.io/js-markerclusterer/interfaces/Algorithm.html}\n   */\n  @Input() public algorithm?: Algorithm;\n  /**\n   * see {@link https://googlemaps.github.io/js-markerclusterer/interfaces/Renderer.html}\n   */\n  @Input() public renderer?: Renderer;\n\n  @Output()\n  public clusterClick: EventEmitter<{\n    event: google.maps.MapMouseEvent;\n    cluster: Cluster;\n    map: google.maps.Map;\n  }> = new EventEmitter<{\n    event: google.maps.MapMouseEvent;\n    cluster: Cluster;\n    map: google.maps.Map;\n  }>();\n  constructor(private _clusterManager: ClusterManager) {}\n\n  /** @internal */\n  public ngOnDestroy() {\n    this._clusterManager.clearMarkers();\n  }\n\n  /** @internal */\n  public ngOnChanges(changes: SimpleChanges) {\n    if (changes['algorithm'] || changes['renderer']) {\n      this.updateClusterManager();\n    }\n  }\n\n  /** @internal */\n  public ngOnInit() {\n    this.updateClusterManager();\n  }\n\n  private updateClusterManager() {\n    this._clusterManager.createCluster({\n      algorithm: this.algorithm,\n      renderer: this.renderer,\n      onClusterClick: (\n        event: google.maps.MapMouseEvent,\n        cluster: Cluster,\n        map: google.maps.Map,\n      ) => this.clusterClick.emit({ event, cluster, map }),\n    });\n  }\n}\n","import { NgModule } from '@angular/core';\n\nimport { NgMapsCoreModule } from '@ng-maps/core';\n\nimport { MarkerClusterComponent } from './directives/marker-cluster';\n\n@NgModule({\n  imports: [NgMapsCoreModule],\n  declarations: [MarkerClusterComponent],\n  exports: [MarkerClusterComponent],\n})\nexport class NgMapsMarkerClustererModule {}\n","/*\n * Public API Surface of js-marker-clusterer\n */\n\nexport * from './lib/directives';\nexport * from './lib/services';\nexport * from './lib/marker-clusterer.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.ClusterManager"],"mappings":"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"}