UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

208 lines (207 loc) 6.5 kB
/** * DevExtreme (esm/__internal/ui/map/m_provider.dynamic.js) * Version: 24.2.7 * Build date: Mon Apr 28 2025 * * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ import Class from "../../../core/class"; import $ from "../../../core/renderer"; import { extend } from "../../../core/utils/extend"; import { each, map } from "../../../core/utils/iterator"; import Provider from "./m_provider"; const MAP_MARKER_CLASS = "dx-map-marker"; class DynamicProvider extends Provider { ctor(map, $container) { this._geocodedLocations = {}; super.ctor(map, $container) } _geocodeLocation(location) { return new Promise((resolve => { const cache = this._geocodedLocations; const cachedLocation = cache[location]; if (cachedLocation) { resolve(cachedLocation) } else { this._geocodeLocationImpl(location).then((geocodedLocation => { cache[location] = geocodedLocation; resolve(geocodedLocation) })) } })) } _renderImpl() { return this._load().then((() => this._init())).then((() => Promise.all([this.updateMapType(), this._areBoundsSet() ? this.updateBounds() : this.updateCenter()]))).then((() => { this._attachHandlers(); return new Promise((resolve => { const timeout = setTimeout((() => { clearTimeout(timeout); resolve() })) })) })) } _load() { if (!this._mapsLoader) { this._mapsLoader = this._loadImpl() } this._markers = []; this._routes = []; return this._mapsLoader } _loadImpl() { Class.abstract() } _init() { Class.abstract() } _attachHandlers() { Class.abstract() } addMarkers(options) { return Promise.all(map(options, (options => this._addMarker(options)))).then((markerObjects => { this._fitBounds(); return [false, map(markerObjects, (markerObject => markerObject.marker))] })) } _addMarker(options) { return this._renderMarker(options).then((markerObject => { this._markers.push(extend({ options: options }, markerObject)); this._fireMarkerAddedAction({ options: options, originalMarker: markerObject.marker }); return markerObject })) } _renderMarker(options) { Class.abstract() } _createIconTemplate(iconSrc) { const $img = $("<img>"); $img.attr("src", iconSrc); $img.attr("alt", "Marker icon"); $img.addClass("dx-map-marker"); return $img[0] } removeMarkers(markersOptionsToRemove) { const that = this; each(markersOptionsToRemove, ((_, markerOptionToRemove) => { that._removeMarker(markerOptionToRemove) })); return Promise.resolve() } _removeMarker(markersOptionToRemove) { const that = this; each(this._markers, ((markerIndex, markerObject) => { if (markerObject.options !== markersOptionToRemove) { return true } that._destroyMarker(markerObject); that._markers.splice(markerIndex, 1); that._fireMarkerRemovedAction({ options: markerObject.options }); return false })) } _destroyMarker(marker) { Class.abstract() } _clearMarkers() { while (this._markers.length > 0) { this._removeMarker(this._markers[0].options) } } addRoutes(options) { return Promise.all(map(options, (options => this._addRoute(options)))).then((routeObjects => { this._fitBounds(); return [false, map(routeObjects, (routeObject => routeObject.instance))] })) } _addRoute(options) { return this._renderRoute(options).then((routeObject => { this._routes.push(extend({ options: options }, routeObject)); this._fireRouteAddedAction({ options: options, originalRoute: routeObject.instance }); return routeObject })) } _renderRoute(options) { Class.abstract() } removeRoutes(options) { const that = this; each(options, ((routeIndex, options) => { that._removeRoute(options) })); return Promise.resolve() } _removeRoute(options) { const that = this; each(this._routes, ((routeIndex, routeObject) => { if (routeObject.options !== options) { return true } that._destroyRoute(routeObject); that._routes.splice(routeIndex, 1); that._fireRouteRemovedAction({ options: options }); return false })) } _destroyRoute(routeObject) { Class.abstract() } _geocodeLocationImpl(location) { Class.abstract() } _clearRoutes() { while (this._routes.length > 0) { this._removeRoute(this._routes[0].options) } } adjustViewport() { return this._fitBounds() } isEventsCanceled(e) { return true } _fitBounds() { Class.abstract() } _updateBounds() { const that = this; this._clearBounds(); if (!this._option("autoAdjust")) { return } each(this._markers, ((_, markerObject) => { that._extendBounds(markerObject.location) })); each(this._routes, ((_, routeObject) => { routeObject.northEast && that._extendBounds(routeObject.northEast); routeObject.southWest && that._extendBounds(routeObject.southWest) })) } _clearBounds() { this._bounds = null } _extendBounds(location) { Class.abstract() } } export default DynamicProvider;