devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
187 lines (186 loc) • 6.37 kB
JavaScript
/**
* DevExtreme (esm/ui/map/provider.dynamic.js)
* Version: 21.1.4
* Build date: Mon Jun 21 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import Promise from "../../core/polyfills/promise";
import {
extend
} from "../../core/utils/extend";
import {
each,
map
} from "../../core/utils/iterator";
import Provider from "./provider";
var abstract = Provider.abstract;
var DynamicProvider = Provider.inherit({
_geocodeLocation: function(location) {
return new Promise(function(resolve) {
var cache = this._geocodedLocations;
var cachedLocation = cache[location];
if (cachedLocation) {
resolve(cachedLocation)
} else {
this._geocodeLocationImpl(location).then((function(geocodedLocation) {
cache[location] = geocodedLocation;
resolve(geocodedLocation)
}))
}
}.bind(this))
},
_renderImpl: function() {
return this._load().then(function() {
return this._init()
}.bind(this)).then(function() {
return Promise.all([this.updateMapType(), this._areBoundsSet() ? this.updateBounds() : this.updateCenter()])
}.bind(this)).then(function() {
this._attachHandlers();
return new Promise((function(resolve) {
var timeout = setTimeout((function() {
clearTimeout(timeout);
resolve()
}))
}))
}.bind(this))
},
_load: function() {
if (!this._mapsLoader) {
this._mapsLoader = this._loadImpl()
}
this._markers = [];
this._routes = [];
return this._mapsLoader
},
_loadImpl: abstract,
_init: abstract,
_attachHandlers: abstract,
addMarkers: function(options) {
return Promise.all(map(options, function(options) {
return this._addMarker(options)
}.bind(this))).then(function(markerObjects) {
this._fitBounds();
return [false, map(markerObjects, (function(markerObject) {
return markerObject.marker
}))]
}.bind(this))
},
_addMarker: function(options) {
return this._renderMarker(options).then(function(markerObject) {
this._markers.push(extend({
options: options
}, markerObject));
this._fireMarkerAddedAction({
options: options,
originalMarker: markerObject.marker
});
return markerObject
}.bind(this))
},
_renderMarker: abstract,
removeMarkers: function(markersOptionsToRemove) {
var that = this;
each(markersOptionsToRemove, (function(_, markerOptionToRemove) {
that._removeMarker(markerOptionToRemove)
}));
return Promise.resolve()
},
_removeMarker: function(markersOptionToRemove) {
var that = this;
each(this._markers, (function(markerIndex, markerObject) {
if (markerObject.options !== markersOptionToRemove) {
return true
}
that._destroyMarker(markerObject);
that._markers.splice(markerIndex, 1);
that._fireMarkerRemovedAction({
options: markerObject.options
});
return false
}))
},
_destroyMarker: abstract,
_clearMarkers: function() {
while (this._markers.length > 0) {
this._removeMarker(this._markers[0].options)
}
},
addRoutes: function(options) {
return Promise.all(map(options, function(options) {
return this._addRoute(options)
}.bind(this))).then(function(routeObjects) {
this._fitBounds();
return [false, map(routeObjects, (function(routeObject) {
return routeObject.instance
}))]
}.bind(this))
},
_addRoute: function(options) {
return this._renderRoute(options).then(function(routeObject) {
this._routes.push(extend({
options: options
}, routeObject));
this._fireRouteAddedAction({
options: options,
originalRoute: routeObject.instance
});
return routeObject
}.bind(this))
},
_renderRoute: abstract,
removeRoutes: function(options) {
var that = this;
each(options, (function(routeIndex, options) {
that._removeRoute(options)
}));
return Promise.resolve()
},
_removeRoute: function(options) {
var that = this;
each(this._routes, (function(routeIndex, routeObject) {
if (routeObject.options !== options) {
return true
}
that._destroyRoute(routeObject);
that._routes.splice(routeIndex, 1);
that._fireRouteRemovedAction({
options: options
});
return false
}))
},
_destroyRoute: abstract,
_clearRoutes: function() {
while (this._routes.length > 0) {
this._removeRoute(this._routes[0].options)
}
},
adjustViewport: function() {
return this._fitBounds()
},
isEventsCanceled: function() {
return true
},
_fitBounds: abstract,
_updateBounds: function() {
var that = this;
this._clearBounds();
if (!this._option("autoAdjust")) {
return
}
each(this._markers, (function(_, markerObject) {
that._extendBounds(markerObject.location)
}));
each(this._routes, (function(_, routeObject) {
routeObject.northEast && that._extendBounds(routeObject.northEast);
routeObject.southWest && that._extendBounds(routeObject.southWest)
}))
},
_clearBounds: function() {
this._bounds = null
},
_extendBounds: abstract
});
export default DynamicProvider;