@ng-maps/core
Version:
**@ng-maps/core** is a simple, modular and tree-shakable library for displaying google-maps inside an angular application
92 lines • 11 kB
JavaScript
import { Directive, Input, Self, } from '@angular/core';
import { Subscription } from 'rxjs';
import { distinctUntilChanged } from 'rxjs/operators';
import { FitBoundsAccessor, FitBoundsService, } from '../services/fit-bounds';
import * as i0 from "@angular/core";
import * as i1 from "../services/fit-bounds";
/**
* Adds the given directive to the auto fit bounds feature when the value is true.
* To make it work with you custom AGM component, you also have to implement the {@link FitBoundsAccessor} abstract class.
*
* @example
* <map-marker [mapFitBounds]="true"></map-marker>
*/
export class NgMapsFitBoundsDirective {
constructor(_fitBoundsAccessor, _fitBoundsService) {
this._fitBoundsAccessor = _fitBoundsAccessor;
this._fitBoundsService = _fitBoundsService;
/**
* If the value is true, the element gets added to the bounds of the map.
* Default: true.
*/
this.mapFitBounds = true;
this._latestFitBoundsDetails = null;
this.subscription = new Subscription();
}
/**
* @internal
*/
ngOnChanges(changes) {
this._updateBounds();
}
/**
* @internal
*/
ngOnInit() {
this.subscription.add(this._fitBoundsAccessor
.getFitBoundsDetails$()
.pipe(distinctUntilChanged((x, y) => x.latLng.lat === y.latLng.lat && x.latLng.lng === y.latLng.lng))
.subscribe({
next: (details) => this._updateBounds(details),
complete: () => this._updateBounds(),
}));
}
/**
* Either the location changed, or visible status changed.
* Possible state changes are
* invisible -> visible
* visible -> invisible
* visible -> visible (new location)
*/
_updateBounds(newFitBoundsDetails) {
// either visibility will change, or location, so remove the old one anyway
if (this._latestFitBoundsDetails) {
this._fitBoundsService.removeFromBounds(this._latestFitBoundsDetails.latLng);
// don't set latestFitBoundsDetails to null, because we can toggle visibility from
// true -> false -> true, in which case we still need old value cached here
}
if (newFitBoundsDetails) {
this._latestFitBoundsDetails = newFitBoundsDetails;
}
if (this._latestFitBoundsDetails) {
if (this.mapFitBounds === true) {
this._fitBoundsService.addToBounds(this._latestFitBoundsDetails.latLng);
}
else {
this._fitBoundsService.removeFromBounds(this._latestFitBoundsDetails.latLng);
}
}
}
/**
* @internal
*/
ngOnDestroy() {
this.subscription.unsubscribe();
if (this._latestFitBoundsDetails !== null) {
this._fitBoundsService.removeFromBounds(this._latestFitBoundsDetails.latLng);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: NgMapsFitBoundsDirective, deps: [{ token: i1.FitBoundsAccessor, self: true }, { token: i1.FitBoundsService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.8", type: NgMapsFitBoundsDirective, selector: "[mapFitBounds]", inputs: { mapFitBounds: "mapFitBounds" }, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: NgMapsFitBoundsDirective, decorators: [{
type: Directive,
args: [{
selector: '[mapFitBounds]',
}]
}], ctorParameters: () => [{ type: i1.FitBoundsAccessor, decorators: [{
type: Self
}] }, { type: i1.FitBoundsService }], propDecorators: { mapFitBounds: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml0LWJvdW5kcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL2RpcmVjdGl2ZXMvZml0LWJvdW5kcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFJTCxJQUFJLEdBRUwsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RCxPQUFPLEVBQ0wsaUJBQWlCLEVBRWpCLGdCQUFnQixHQUNqQixNQUFNLHdCQUF3QixDQUFDOzs7QUFFaEM7Ozs7OztHQU1HO0FBSUgsTUFBTSxPQUFPLHdCQUF3QjtJQVVuQyxZQUMyQixrQkFBcUMsRUFDN0MsaUJBQW1DO1FBRDNCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBbUI7UUFDN0Msc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFrQjtRQVh0RDs7O1dBR0c7UUFDYSxpQkFBWSxHQUFZLElBQUksQ0FBQztRQUVyQyw0QkFBdUIsR0FBNEIsSUFBSSxDQUFDO1FBQ3hELGlCQUFZLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7SUFLckQsQ0FBQztJQUVKOztPQUVHO0lBQ0ksV0FBVyxDQUFDLE9BQXNCO1FBQ3ZDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQ25CLElBQUksQ0FBQyxrQkFBa0I7YUFDcEIsb0JBQW9CLEVBQUU7YUFDdEIsSUFBSSxDQUNILG9CQUFvQixDQUNsQixDQUFDLENBQW1CLEVBQUUsQ0FBbUIsRUFBRSxFQUFFLENBQzNDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUNqRSxDQUNGO2FBQ0EsU0FBUyxDQUFDO1lBQ1QsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUM5QyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtTQUNyQyxDQUFDLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxhQUFhLENBQUMsbUJBQXNDO1FBQzFELDJFQUEyRTtRQUMzRSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FDckMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FDcEMsQ0FBQztZQUNGLGtGQUFrRjtZQUNsRiwyRUFBMkU7UUFDN0UsQ0FBQztRQUVELElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsbUJBQW1CLENBQUM7UUFDckQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDakMsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxRSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUNyQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUNwQyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixDQUNyQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUNwQyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7OEdBbkZVLHdCQUF3QjtrR0FBeEIsd0JBQXdCOzsyRkFBeEIsd0JBQXdCO2tCQUhwQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCOzswQkFZSSxJQUFJO3dFQU5TLFlBQVk7c0JBQTNCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBTZWxmLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIEZpdEJvdW5kc0FjY2Vzc29yLFxuICBGaXRCb3VuZHNEZXRhaWxzLFxuICBGaXRCb3VuZHNTZXJ2aWNlLFxufSBmcm9tICcuLi9zZXJ2aWNlcy9maXQtYm91bmRzJztcblxuLyoqXG4gKiBBZGRzIHRoZSBnaXZlbiBkaXJlY3RpdmUgdG8gdGhlIGF1dG8gZml0IGJvdW5kcyBmZWF0dXJlIHdoZW4gdGhlIHZhbHVlIGlzIHRydWUuXG4gKiBUbyBtYWtlIGl0IHdvcmsgd2l0aCB5b3UgY3VzdG9tIEFHTSBjb21wb25lbnQsIHlvdSBhbHNvIGhhdmUgdG8gaW1wbGVtZW50IHRoZSB7QGxpbmsgRml0Qm91bmRzQWNjZXNzb3J9IGFic3RyYWN0IGNsYXNzLlxuICpcbiAqIEBleGFtcGxlXG4gKiA8bWFwLW1hcmtlciBbbWFwRml0Qm91bmRzXT1cInRydWVcIj48L21hcC1tYXJrZXI+XG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1ttYXBGaXRCb3VuZHNdJyxcbn0pXG5leHBvcnQgY2xhc3MgTmdNYXBzRml0Qm91bmRzRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBJZiB0aGUgdmFsdWUgaXMgdHJ1ZSwgdGhlIGVsZW1lbnQgZ2V0cyBhZGRlZCB0byB0aGUgYm91bmRzIG9mIHRoZSBtYXAuXG4gICAqIERlZmF1bHQ6IHRydWUuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgbWFwRml0Qm91bmRzOiBib29sZWFuID0gdHJ1ZTtcblxuICBwcml2YXRlIF9sYXRlc3RGaXRCb3VuZHNEZXRhaWxzOiBGaXRCb3VuZHNEZXRhaWxzIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQFNlbGYoKSBwcml2YXRlIHJlYWRvbmx5IF9maXRCb3VuZHNBY2Nlc3NvcjogRml0Qm91bmRzQWNjZXNzb3IsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZml0Qm91bmRzU2VydmljZTogRml0Qm91bmRzU2VydmljZSxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgdGhpcy5fdXBkYXRlQm91bmRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy5fZml0Qm91bmRzQWNjZXNzb3JcbiAgICAgICAgLmdldEZpdEJvdW5kc0RldGFpbHMkKClcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoXG4gICAgICAgICAgICAoeDogRml0Qm91bmRzRGV0YWlscywgeTogRml0Qm91bmRzRGV0YWlscykgPT5cbiAgICAgICAgICAgICAgeC5sYXRMbmcubGF0ID09PSB5LmxhdExuZy5sYXQgJiYgeC5sYXRMbmcubG5nID09PSB5LmxhdExuZy5sbmcsXG4gICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoZGV0YWlscykgPT4gdGhpcy5fdXBkYXRlQm91bmRzKGRldGFpbHMpLFxuICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB0aGlzLl91cGRhdGVCb3VuZHMoKSxcbiAgICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFaXRoZXIgdGhlIGxvY2F0aW9uIGNoYW5nZWQsIG9yIHZpc2libGUgc3RhdHVzIGNoYW5nZWQuXG4gICAqIFBvc3NpYmxlIHN0YXRlIGNoYW5nZXMgYXJlXG4gICAqIGludmlzaWJsZSAtPiB2aXNpYmxlXG4gICAqIHZpc2libGUgLT4gaW52aXNpYmxlXG4gICAqIHZpc2libGUgLT4gdmlzaWJsZSAobmV3IGxvY2F0aW9uKVxuICAgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlQm91bmRzKG5ld0ZpdEJvdW5kc0RldGFpbHM/OiBGaXRCb3VuZHNEZXRhaWxzKSB7XG4gICAgLy8gZWl0aGVyIHZpc2liaWxpdHkgd2lsbCBjaGFuZ2UsIG9yIGxvY2F0aW9uLCBzbyByZW1vdmUgdGhlIG9sZCBvbmUgYW55d2F5XG4gICAgaWYgKHRoaXMuX2xhdGVzdEZpdEJvdW5kc0RldGFpbHMpIHtcbiAgICAgIHRoaXMuX2ZpdEJvdW5kc1NlcnZpY2UucmVtb3ZlRnJvbUJvdW5kcyhcbiAgICAgICAgdGhpcy5fbGF0ZXN0Rml0Qm91bmRzRGV0YWlscy5sYXRMbmcsXG4gICAgICApO1xuICAgICAgLy8gZG9uJ3Qgc2V0IGxhdGVzdEZpdEJvdW5kc0RldGFpbHMgdG8gbnVsbCwgYmVjYXVzZSB3ZSBjYW4gdG9nZ2xlIHZpc2liaWxpdHkgZnJvbVxuICAgICAgLy8gdHJ1ZSAtPiBmYWxzZSAtPiB0cnVlLCBpbiB3aGljaCBjYXNlIHdlIHN0aWxsIG5lZWQgb2xkIHZhbHVlIGNhY2hlZCBoZXJlXG4gICAgfVxuXG4gICAgaWYgKG5ld0ZpdEJvdW5kc0RldGFpbHMpIHtcbiAgICAgIHRoaXMuX2xhdGVzdEZpdEJvdW5kc0RldGFpbHMgPSBuZXdGaXRCb3VuZHNEZXRhaWxzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGF0ZXN0Rml0Qm91bmRzRGV0YWlscykge1xuICAgICAgaWYgKHRoaXMubWFwRml0Qm91bmRzID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX2ZpdEJvdW5kc1NlcnZpY2UuYWRkVG9Cb3VuZHModGhpcy5fbGF0ZXN0Rml0Qm91bmRzRGV0YWlscy5sYXRMbmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZml0Qm91bmRzU2VydmljZS5yZW1vdmVGcm9tQm91bmRzKFxuICAgICAgICAgIHRoaXMuX2xhdGVzdEZpdEJvdW5kc0RldGFpbHMubGF0TG5nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIGlmICh0aGlzLl9sYXRlc3RGaXRCb3VuZHNEZXRhaWxzICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9maXRCb3VuZHNTZXJ2aWNlLnJlbW92ZUZyb21Cb3VuZHMoXG4gICAgICAgIHRoaXMuX2xhdGVzdEZpdEJvdW5kc0RldGFpbHMubGF0TG5nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==