ng-agm-core-lib
Version:
Angular components for Google Maps
744 lines • 85.9 kB
JavaScript
import { isPlatformServer } from '@angular/common';
import { Component, ContentChildren, Directive, EventEmitter, Inject, Input, Output, PLATFORM_ID } from '@angular/core';
import { FitBoundsService } from '../services/fit-bounds';
import { GoogleMapsAPIWrapper } from '../services/google-maps-api-wrapper';
import { CircleManager } from '../services/managers/circle-manager';
import { InfoWindowManager } from '../services/managers/info-window-manager';
import { LayerManager } from '../services/managers/layer-manager';
import { MarkerManager } from '../services/managers/marker-manager';
import { PolygonManager } from '../services/managers/polygon-manager';
import { PolylineManager } from '../services/managers/polyline-manager';
import { RectangleManager } from '../services/managers/rectangle-manager';
import { DataLayerManager } from './../services/managers/data-layer-manager';
import { KmlLayerManager } from './../services/managers/kml-layer-manager';
import * as i0 from "@angular/core";
import * as i1 from "../services/google-maps-api-wrapper";
import * as i2 from "../services/fit-bounds";
export class AgmMapControl {
position;
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmMapControl, deps: [], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AgmMapControl, inputs: { position: "position" }, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmMapControl, decorators: [{
type: Directive
}], propDecorators: { position: [{
type: Input
}] } });
export class AgmFullscreenControl extends AgmMapControl {
getOptions() {
return {
fullscreenControl: true,
fullscreenControlOptions: {
position: this.position && google.maps.ControlPosition[this.position],
},
};
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmFullscreenControl, deps: null, target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AgmFullscreenControl, selector: "agm-map agm-fullscreen-control", providers: [{ provide: AgmMapControl, useExisting: AgmFullscreenControl }], usesInheritance: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmFullscreenControl, decorators: [{
type: Directive,
args: [{
selector: 'agm-map agm-fullscreen-control',
providers: [{ provide: AgmMapControl, useExisting: AgmFullscreenControl }],
}]
}] });
export class AgmMapTypeControl extends AgmMapControl {
mapTypeIds;
style;
getOptions() {
return {
mapTypeControl: true,
mapTypeControlOptions: {
position: this.position && google.maps.ControlPosition[this.position],
style: this.style && google.maps.MapTypeControlStyle[this.style],
mapTypeIds: this.mapTypeIds && this.mapTypeIds.map(mapTypeId => google.maps.MapTypeId[mapTypeId]),
},
};
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmMapTypeControl, deps: null, target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AgmMapTypeControl, selector: "agm-map agm-map-type-control", inputs: { mapTypeIds: "mapTypeIds", style: "style" }, providers: [{ provide: AgmMapControl, useExisting: AgmMapTypeControl }], usesInheritance: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmMapTypeControl, decorators: [{
type: Directive,
args: [{
selector: 'agm-map agm-map-type-control',
providers: [{ provide: AgmMapControl, useExisting: AgmMapTypeControl }],
}]
}], propDecorators: { mapTypeIds: [{
type: Input
}], style: [{
type: Input
}] } });
export class AgmPanControl extends AgmMapControl {
getOptions() {
return {
panControl: true,
panControlOptions: {
position: this.position && google.maps.ControlPosition[this.position],
},
};
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmPanControl, deps: null, target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AgmPanControl, selector: "agm-map agm-pan-control", providers: [{ provide: AgmMapControl, useExisting: AgmPanControl }], usesInheritance: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmPanControl, decorators: [{
type: Directive,
args: [{
selector: 'agm-map agm-pan-control',
providers: [{ provide: AgmMapControl, useExisting: AgmPanControl }],
}]
}] });
export class AgmRotateControl extends AgmMapControl {
getOptions() {
return {
rotateControl: true,
rotateControlOptions: {
position: this.position && google.maps.ControlPosition[this.position],
},
};
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmRotateControl, deps: null, target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AgmRotateControl, selector: "agm-map agm-rotate-control", providers: [{ provide: AgmMapControl, useExisting: AgmRotateControl }], usesInheritance: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmRotateControl, decorators: [{
type: Directive,
args: [{
selector: 'agm-map agm-rotate-control',
providers: [{ provide: AgmMapControl, useExisting: AgmRotateControl }],
}]
}] });
export class AgmScaleControl extends AgmMapControl {
getOptions() {
return {
scaleControl: true,
};
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmScaleControl, deps: null, target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AgmScaleControl, selector: "agm-map agm-scale-control", providers: [{ provide: AgmMapControl, useExisting: AgmScaleControl }], usesInheritance: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmScaleControl, decorators: [{
type: Directive,
args: [{
selector: 'agm-map agm-scale-control',
providers: [{ provide: AgmMapControl, useExisting: AgmScaleControl }],
}]
}] });
export class AgmStreetViewControl extends AgmMapControl {
getOptions() {
return {
streetViewControl: true,
streetViewControlOptions: {
position: this.position && google.maps.ControlPosition[this.position],
},
};
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmStreetViewControl, deps: null, target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AgmStreetViewControl, selector: "agm-map agm-street-view-control", providers: [{ provide: AgmMapControl, useExisting: AgmStreetViewControl }], usesInheritance: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmStreetViewControl, decorators: [{
type: Directive,
args: [{
selector: 'agm-map agm-street-view-control',
providers: [{ provide: AgmMapControl, useExisting: AgmStreetViewControl }],
}]
}] });
export class AgmZoomControl extends AgmMapControl {
style;
getOptions() {
return {
zoomControl: true,
zoomControlOptions: {
position: this.position && google.maps.ControlPosition[this.position],
style: this.style && google.maps.ZoomControlStyle[this.style],
},
};
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmZoomControl, deps: null, target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AgmZoomControl, selector: "agm-map agm-zoom-control", inputs: { style: "style" }, providers: [{ provide: AgmMapControl, useExisting: AgmZoomControl }], usesInheritance: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmZoomControl, decorators: [{
type: Directive,
args: [{
selector: 'agm-map agm-zoom-control',
providers: [{ provide: AgmMapControl, useExisting: AgmZoomControl }],
}]
}], propDecorators: { style: [{
type: Input
}] } });
/**
* AgmMap renders a Google Map.
* **Important note**: To be able see a map in the browser, you have to define a height for the
* element `agm-map`.
*
* ### Example
* ```typescript
* import { Component } from '@angular/core';
*
* @Component({
* selector: 'my-map-cmp',
* styles: [`
* agm-map {
* height: 300px;
* }
* `],
* template: `
* <agm-map [latitude]="lat" [longitude]="lng" [zoom]="zoom">
* </agm-map>
* `
* })
* ```
*/
export class AgmMap {
_elem;
_mapsWrapper;
_platformId;
_fitBoundsService;
_zone;
/**
* The longitude that defines the center of the map.
*/
longitude = 0;
/**
* The latitude that defines the center of the map.
*/
latitude = 0;
/**
* The zoom level of the map. The default zoom level is 8.
*/
zoom = 8;
/**
* The minimal zoom level of the map allowed. When not provided, no restrictions to the zoom level
* are enforced.
*/
minZoom;
/**
* The maximal zoom level of the map allowed. When not provided, no restrictions to the zoom level
* are enforced.
*/
maxZoom;
/**
* The control size for the default map controls. Only governs the controls made by the Maps API itself
*/
controlSize;
/**
* Enables/disables if map is draggable.
*/
// tslint:disable-next-line:no-input-rename
draggable = true;
/**
* Enables/disables zoom and center on double click. Enabled by default.
*/
disableDoubleClickZoom = false;
/**
* Enables/disables all default UI of the Google map. Please note: When the map is created, this
* value cannot get updated.
*/
disableDefaultUI = false;
/**
* If false, disables scrollwheel zooming on the map. The scrollwheel is enabled by default.
*/
scrollwheel = true;
/**
* Color used for the background of the Map div. This color will be visible when tiles have not
* yet loaded as the user pans. This option can only be set when the map is initialized.
*/
backgroundColor;
/**
* The name or url of the cursor to display when mousing over a draggable map. This property uses
* the css * cursor attribute to change the icon. As with the css property, you must specify at
* least one fallback cursor that is not a URL. For example:
* [draggableCursor]="'url(http://www.example.com/icon.png), auto;'"
*/
draggableCursor;
/**
* The name or url of the cursor to display when the map is being dragged. This property uses the
* css cursor attribute to change the icon. As with the css property, you must specify at least
* one fallback cursor that is not a URL. For example:
* [draggingCursor]="'url(http://www.example.com/icon.png), auto;'"
*/
draggingCursor;
/**
* If false, prevents the map from being controlled by the keyboard. Keyboard shortcuts are
* enabled by default.
*/
keyboardShortcuts = true;
/**
* Styles to apply to each of the default map types. Note that for Satellite/Hybrid and Terrain
* modes, these styles will only apply to labels and geometry.
*/
styles = [];
/**
* When true and the latitude and/or longitude values changes, the Google Maps panTo method is
* used to
* center the map. See: https://developers.google.com/maps/documentation/javascript/reference#Map
*/
usePanning = false;
/**
* Sets the viewport to contain the given bounds.
* If this option to `true`, the bounds get automatically computed from all elements that use the {@link AgmFitBounds} directive.
*/
fitBounds = false;
/**
* Padding amount for the bounds.
*/
fitBoundsPadding;
/**
* The map mapTypeId. Defaults to 'roadmap'.
*/
mapTypeId = 'ROADMAP';
/**
* When false, map icons are not clickable. A map icon represents a point of interest,
* also known as a POI. By default map icons are clickable.
*/
clickableIcons = true;
/**
* A map icon represents a point of interest, also known as a POI.
* When map icons are clickable by default, an info window is displayed.
* When this property is set to false, the info window will not be shown but the click event
* will still fire
*/
showDefaultInfoWindow = true;
/**
* This setting controls how gestures on the map are handled.
* Allowed values:
* - 'cooperative' (Two-finger touch gestures pan and zoom the map. One-finger touch gestures are not handled by the map.)
* - 'greedy' (All touch gestures pan or zoom the map.)
* - 'none' (The map cannot be panned or zoomed by user gestures.)
* - 'auto' [default] (Gesture handling is either cooperative or greedy, depending on whether the page is scrollable or not.
*/
gestureHandling = 'auto';
/**
* Controls the automatic switching behavior for the angle of incidence of
* the map. The only allowed values are 0 and 45. The value 0 causes the map
* to always use a 0° overhead view regardless of the zoom level and
* viewport. The value 45 causes the tilt angle to automatically switch to
* 45 whenever 45° imagery is available for the current zoom level and
* viewport, and switch back to 0 whenever 45° imagery is not available
* (this is the default behavior). 45° imagery is only available for
* satellite and hybrid map types, within some locations, and at some zoom
* levels. Note: getTilt returns the current tilt angle, not the value
* specified by this option. Because getTilt and this option refer to
* different things, do not bind() the tilt property; doing so may yield
* unpredictable effects. (Default of AGM is 0 (disabled). Enable it with value 45.)
*/
tilt = 0;
/**
* Options for restricting the bounds of the map.
* User cannot pan or zoom away from restricted area.
*/
restriction;
/**
* Map option attributes that can change over time
*/
static _mapOptionsAttributes = [
'disableDoubleClickZoom', 'scrollwheel', 'draggable', 'draggableCursor', 'draggingCursor',
'keyboardShortcuts', 'styles', 'zoom', 'minZoom', 'maxZoom', 'mapTypeId', 'clickableIcons',
'gestureHandling', 'tilt', 'restriction',
];
_observableSubscriptions = [];
_fitBoundsSubscription;
/**
* This event emitter gets emitted when the user clicks on the map (but not when they click on a
* marker or infoWindow).
*/
// tslint:disable-next-line: max-line-length
mapClick = new EventEmitter();
/**
* This event emitter gets emitted when the user right-clicks on the map (but not when they click
* on a marker or infoWindow).
*/
mapRightClick = new EventEmitter();
/**
* This event emitter gets emitted when the user double-clicks on the map (but not when they click
* on a marker or infoWindow).
*/
mapDblClick = new EventEmitter();
/**
* This event emitter is fired when the map center changes.
*/
centerChange = new EventEmitter();
/**
* This event is fired when the viewport bounds have changed.
*/
boundsChange = new EventEmitter();
/**
* This event is fired when the mapTypeId property changes.
*/
mapTypeIdChange = new EventEmitter();
/**
* This event is fired when the map becomes idle after panning or zooming.
*/
idle = new EventEmitter();
/**
* This event is fired when the zoom level has changed.
*/
zoomChange = new EventEmitter();
/**
* This event is fired when the google map is fully initialized.
* You get the google.maps.Map instance as a result of this EventEmitter.
*/
mapReady = new EventEmitter();
/**
* This event is fired when the visible tiles have finished loading.
*/
tilesLoaded = new EventEmitter();
mapControls;
constructor(_elem, _mapsWrapper,
// tslint:disable-next-line: ban-types
_platformId, _fitBoundsService, _zone) {
this._elem = _elem;
this._mapsWrapper = _mapsWrapper;
this._platformId = _platformId;
this._fitBoundsService = _fitBoundsService;
this._zone = _zone;
}
/** @internal */
ngAfterContentInit() {
if (isPlatformServer(this._platformId)) {
// The code is running on the server, do nothing
return;
}
// todo: this should be solved with a new component and a viewChild decorator
const container = this._elem.nativeElement.querySelector('.agm-map-container-inner');
this._initMapInstance(container);
}
_initMapInstance(el) {
this._mapsWrapper.createMap(el, {
center: { lat: this.latitude || 0, lng: this.longitude || 0 },
zoom: this.zoom,
minZoom: this.minZoom,
maxZoom: this.maxZoom,
controlSize: this.controlSize,
disableDefaultUI: this.disableDefaultUI,
disableDoubleClickZoom: this.disableDoubleClickZoom,
scrollwheel: this.scrollwheel,
backgroundColor: this.backgroundColor,
draggable: this.draggable,
draggableCursor: this.draggableCursor,
draggingCursor: this.draggingCursor,
keyboardShortcuts: this.keyboardShortcuts,
styles: this.styles,
mapTypeId: this.mapTypeId.toLocaleLowerCase(),
clickableIcons: this.clickableIcons,
gestureHandling: this.gestureHandling,
tilt: this.tilt,
restriction: this.restriction,
})
.then(() => this._mapsWrapper.getNativeMap())
.then(map => this.mapReady.emit(map));
// register event listeners
this._handleMapCenterChange();
this._handleMapZoomChange();
this._handleMapMouseEvents();
this._handleBoundsChange();
this._handleMapTypeIdChange();
this._handleTilesLoadedEvent();
this._handleIdleEvent();
this._handleControlChange();
}
/** @internal */
ngOnDestroy() {
// unsubscribe all registered observable subscriptions
this._observableSubscriptions.forEach((s) => s.unsubscribe());
// remove all listeners from the map instance
this._mapsWrapper.clearInstanceListeners();
if (this._fitBoundsSubscription) {
this._fitBoundsSubscription.unsubscribe();
}
}
/* @internal */
ngOnChanges(changes) {
this._updateMapOptionsChanges(changes);
this._updatePosition(changes);
}
_updateMapOptionsChanges(changes) {
const options = {};
const optionKeys = Object.keys(changes).filter(k => AgmMap._mapOptionsAttributes.indexOf(k) !== -1);
optionKeys.forEach((k) => { options[k] = changes[k].currentValue; });
this._mapsWrapper.setMapOptions(options);
}
/**
* Triggers a resize event on the google map instance.
* When recenter is true, the of the google map gets called with the current lat/lng values or fitBounds value to recenter the map.
* Returns a promise that gets resolved after the event was triggered.
*/
triggerResize(recenter = true) {
// Note: When we would trigger the resize event and show the map in the same turn (which is a
// common case for triggering a resize event), then the resize event would not
// work (to show the map), so we trigger the event in a timeout.
return new Promise((resolve) => {
setTimeout(() => {
return this._mapsWrapper.triggerMapEvent('resize').then(() => {
if (recenter) {
this.fitBounds != null ? this._fitBounds() : this._setCenter();
}
resolve();
});
});
});
}
_updatePosition(changes) {
// tslint:disable: no-string-literal
if (changes['latitude'] == null && changes['longitude'] == null &&
!changes['fitBounds']) {
// no position update needed
return;
}
// tslint:enable: no-string-literal
// we prefer fitBounds in changes
if ('fitBounds' in changes) {
this._fitBounds();
return;
}
if (typeof this.latitude !== 'number' || typeof this.longitude !== 'number') {
return;
}
this._setCenter();
}
_setCenter() {
const newCenter = {
lat: this.latitude,
lng: this.longitude,
};
if (this.usePanning) {
this._mapsWrapper.panTo(newCenter);
}
else {
this._mapsWrapper.setCenter(newCenter);
}
}
_fitBounds() {
switch (this.fitBounds) {
case true:
this._subscribeToFitBoundsUpdates();
break;
case false:
if (this._fitBoundsSubscription) {
this._fitBoundsSubscription.unsubscribe();
}
break;
default:
if (this._fitBoundsSubscription) {
this._fitBoundsSubscription.unsubscribe();
}
this._updateBounds(this.fitBounds, this.fitBoundsPadding);
}
}
_subscribeToFitBoundsUpdates() {
this._zone.runOutsideAngular(() => {
this._fitBoundsSubscription = this._fitBoundsService.getBounds$().subscribe(b => {
this._zone.run(() => this._updateBounds(b, this.fitBoundsPadding));
});
});
}
_updateBounds(bounds, padding) {
if (!bounds) {
return;
}
if (this._isLatLngBoundsLiteral(bounds) && typeof google !== 'undefined' && google && google.maps && google.maps.LatLngBounds) {
const newBounds = new google.maps.LatLngBounds();
newBounds.union(bounds);
bounds = newBounds;
}
if (this.usePanning) {
this._mapsWrapper.panToBounds(bounds, padding);
return;
}
this._mapsWrapper.fitBounds(bounds, padding);
}
_isLatLngBoundsLiteral(bounds) {
return bounds != null && bounds.extend === undefined;
}
_handleMapCenterChange() {
const s = this._mapsWrapper.subscribeToMapEvent('center_changed').subscribe(() => {
this._mapsWrapper.getCenter().then((center) => {
this.latitude = center.lat();
this.longitude = center.lng();
this.centerChange.emit({ lat: this.latitude, lng: this.longitude });
});
});
this._observableSubscriptions.push(s);
}
_handleBoundsChange() {
const s = this._mapsWrapper.subscribeToMapEvent('bounds_changed').subscribe(() => {
this._mapsWrapper.getBounds().then((bounds) => { this.boundsChange.emit(bounds); });
});
this._observableSubscriptions.push(s);
}
_handleMapTypeIdChange() {
const s = this._mapsWrapper.subscribeToMapEvent('maptypeid_changed').subscribe(() => {
this._mapsWrapper.getMapTypeId().then((mapTypeId) => { this.mapTypeIdChange.emit(mapTypeId); });
});
this._observableSubscriptions.push(s);
}
_handleMapZoomChange() {
const s = this._mapsWrapper.subscribeToMapEvent('zoom_changed').subscribe(() => {
this._mapsWrapper.getZoom().then((z) => {
this.zoom = z;
this.zoomChange.emit(z);
});
});
this._observableSubscriptions.push(s);
}
_handleIdleEvent() {
const s = this._mapsWrapper.subscribeToMapEvent('idle').subscribe(() => { this.idle.emit(void 0); });
this._observableSubscriptions.push(s);
}
_handleTilesLoadedEvent() {
const s = this._mapsWrapper.subscribeToMapEvent('tilesloaded').subscribe(() => this.tilesLoaded.emit(void 0));
this._observableSubscriptions.push(s);
}
_handleMapMouseEvents() {
const events = [
{ name: 'click', emitter: this.mapClick },
{ name: 'rightclick', emitter: this.mapRightClick },
{ name: 'dblclick', emitter: this.mapDblClick },
];
events.forEach(e => {
const s = this._mapsWrapper.subscribeToMapEvent(e.name).subscribe(([event]) => {
// the placeId will be undefined in case the event was not an IconMouseEvent (google types)
if (event.placeId && !this.showDefaultInfoWindow) {
event.stop();
}
e.emitter.emit(event);
});
this._observableSubscriptions.push(s);
});
}
_handleControlChange() {
this._setControls();
this.mapControls.changes.subscribe(() => this._setControls());
}
_setControls() {
const controlOptions = {
fullscreenControl: !this.disableDefaultUI,
mapTypeControl: false,
panControl: false,
rotateControl: false,
scaleControl: false,
streetViewControl: !this.disableDefaultUI,
zoomControl: !this.disableDefaultUI,
};
this.mapControls.forEach(control => Object.assign(controlOptions, control.getOptions()));
this._mapsWrapper.setMapOptions(controlOptions);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmMap, deps: [{ token: i0.ElementRef }, { token: i1.GoogleMapsAPIWrapper }, { token: PLATFORM_ID }, { token: i2.FitBoundsService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AgmMap, selector: "agm-map", inputs: { longitude: "longitude", latitude: "latitude", zoom: "zoom", minZoom: "minZoom", maxZoom: "maxZoom", controlSize: "controlSize", draggable: ["mapDraggable", "draggable"], disableDoubleClickZoom: "disableDoubleClickZoom", disableDefaultUI: "disableDefaultUI", scrollwheel: "scrollwheel", backgroundColor: "backgroundColor", draggableCursor: "draggableCursor", draggingCursor: "draggingCursor", keyboardShortcuts: "keyboardShortcuts", styles: "styles", usePanning: "usePanning", fitBounds: "fitBounds", fitBoundsPadding: "fitBoundsPadding", mapTypeId: "mapTypeId", clickableIcons: "clickableIcons", showDefaultInfoWindow: "showDefaultInfoWindow", gestureHandling: "gestureHandling", tilt: "tilt", restriction: "restriction" }, outputs: { mapClick: "mapClick", mapRightClick: "mapRightClick", mapDblClick: "mapDblClick", centerChange: "centerChange", boundsChange: "boundsChange", mapTypeIdChange: "mapTypeIdChange", idle: "idle", zoomChange: "zoomChange", mapReady: "mapReady", tilesLoaded: "tilesLoaded" }, providers: [
CircleManager,
DataLayerManager,
DataLayerManager,
FitBoundsService,
GoogleMapsAPIWrapper,
InfoWindowManager,
KmlLayerManager,
LayerManager,
MarkerManager,
PolygonManager,
PolylineManager,
RectangleManager,
], queries: [{ propertyName: "mapControls", predicate: AgmMapControl }], usesOnChanges: true, ngImport: i0, template: `
<div class='agm-map-container-inner sebm-google-map-container-inner'></div>
<div class='agm-map-content'>
<ng-content></ng-content>
</div>
`, isInline: true, styles: [".agm-map-container-inner{width:inherit;height:inherit}.agm-map-content{display:none}\n"] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgmMap, decorators: [{
type: Component,
args: [{ selector: 'agm-map', providers: [
CircleManager,
DataLayerManager,
DataLayerManager,
FitBoundsService,
GoogleMapsAPIWrapper,
InfoWindowManager,
KmlLayerManager,
LayerManager,
MarkerManager,
PolygonManager,
PolylineManager,
RectangleManager,
], template: `
<div class='agm-map-container-inner sebm-google-map-container-inner'></div>
<div class='agm-map-content'>
<ng-content></ng-content>
</div>
`, styles: [".agm-map-container-inner{width:inherit;height:inherit}.agm-map-content{display:none}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.GoogleMapsAPIWrapper }, { type: Object, decorators: [{
type: Inject,
args: [PLATFORM_ID]
}] }, { type: i2.FitBoundsService }, { type: i0.NgZone }], propDecorators: { longitude: [{
type: Input
}], latitude: [{
type: Input
}], zoom: [{
type: Input
}], minZoom: [{
type: Input
}], maxZoom: [{
type: Input
}], controlSize: [{
type: Input
}], draggable: [{
type: Input,
args: ['mapDraggable']
}], disableDoubleClickZoom: [{
type: Input
}], disableDefaultUI: [{
type: Input
}], scrollwheel: [{
type: Input
}], backgroundColor: [{
type: Input
}], draggableCursor: [{
type: Input
}], draggingCursor: [{
type: Input
}], keyboardShortcuts: [{
type: Input
}], styles: [{
type: Input
}], usePanning: [{
type: Input
}], fitBounds: [{
type: Input
}], fitBoundsPadding: [{
type: Input
}], mapTypeId: [{
type: Input
}], clickableIcons: [{
type: Input
}], showDefaultInfoWindow: [{
type: Input
}], gestureHandling: [{
type: Input
}], tilt: [{
type: Input
}], restriction: [{
type: Input
}], mapClick: [{
type: Output
}], mapRightClick: [{
type: Output
}], mapDblClick: [{
type: Output
}], centerChange: [{
type: Output
}], boundsChange: [{
type: Output
}], mapTypeIdChange: [{
type: Output
}], idle: [{
type: Output
}], zoomChange: [{
type: Output
}], mapReady: [{
type: Output
}], tilesLoaded: [{
type: Output
}], mapControls: [{
type: ContentChildren,
args: [AgmMapControl]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvbGliL2RpcmVjdGl2ZXMvbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBb0IsU0FBUyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBRSxXQUFXLEVBQTRCLE1BQU0sZUFBZSxDQUFDO0FBRzlNLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7O0FBSzNFLE1BQU0sT0FBZ0IsYUFBYTtJQUN4QixRQUFRLENBQWtCO3dHQURmLGFBQWE7NEZBQWIsYUFBYTs7NEZBQWIsYUFBYTtrQkFEbEMsU0FBUzs4QkFFQyxRQUFRO3NCQUFoQixLQUFLOztBQVFSLE1BQU0s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