diff --git a/src/ui/public/vis_maps/kibana_map.js b/src/ui/public/vis_maps/kibana_map.js index 37afd0d5082d6..a1b40fa9541b8 100644 --- a/src/ui/public/vis_maps/kibana_map.js +++ b/src/ui/public/vis_maps/kibana_map.js @@ -293,6 +293,10 @@ export class KibanaMap extends EventEmitter { return this._leafletMap.getZoom(); } + getMaxZoomLevel() { + return this._leafletMap.getMaxZoom(); + } + getAutoPrecision() { return zoomToPrecision(this._leafletMap.getZoom(), 12, this._leafletMap.getMaxZoom()); } diff --git a/src/ui/public/vis_maps/lib/tilemap_settings.js b/src/ui/public/vis_maps/lib/tilemap_settings.js index 56665405f6aa0..54571ecc0d3a5 100644 --- a/src/ui/public/vis_maps/lib/tilemap_settings.js +++ b/src/ui/public/vis_maps/lib/tilemap_settings.js @@ -12,7 +12,6 @@ uiModules.get('kibana') .service('tilemapSettings', function ($http, tilemapsConfig, $sanitize, kbnVersion) { const attributionFromConfig = $sanitize(marked(tilemapsConfig.deprecated.config.options.attribution || '')); const optionsFromConfig = _.assign({}, tilemapsConfig.deprecated.config.options, { attribution: attributionFromConfig }); - const extendUrl = (url, props) => ( modifyUrl(url, parsed => _.merge(parsed, props)) ); diff --git a/src/ui/public/vis_maps/maps_renderbot.js b/src/ui/public/vis_maps/maps_renderbot.js index 598c5b2000896..05d0fc59dd60f 100644 --- a/src/ui/public/vis_maps/maps_renderbot.js +++ b/src/ui/public/vis_maps/maps_renderbot.js @@ -24,6 +24,7 @@ module.exports = function MapsRenderbotFactory(Private, $injector, tilemapSettin this._buildChartData = buildChartData.bind(this); this._geohashLayer = null; this._kibanaMap = null; + this._$container = $el; this._kibanaMapReady = this._makeKibanaMap($el); this._baseLayerDirty = true; @@ -39,7 +40,7 @@ module.exports = function MapsRenderbotFactory(Private, $injector, tilemapSettin }); } - async _makeKibanaMap($el) { + async _makeKibanaMap() { if (!tilemapSettings.isInitialized()) { await tilemapSettings.loadSettings(); @@ -51,8 +52,11 @@ module.exports = function MapsRenderbotFactory(Private, $injector, tilemapSettin notify.warning(tilemapSettings.getError().message); } - const containerElement = $($el)[0]; - const options = _.clone(tilemapSettings.getMinMaxZoom(false)); + if (this._kibanaMap) { + this._kibanaMap.destroy(); + } + const containerElement = $(this._$container)[0]; + const options = _.clone(this._getMinMaxZoom()); const uiState = this.vis.getUiState(); const zoomFromUiState = parseInt(uiState.get('mapZoom')); const centerFromUIState = uiState.get('mapCenter'); @@ -101,6 +105,11 @@ module.exports = function MapsRenderbotFactory(Private, $injector, tilemapSettin }); } + _getMinMaxZoom() { + const mapParams = this._getMapsParams(); + return tilemapSettings.getMinMaxZoom(mapParams.wms.enabled); + } + _recreateGeohashLayer() { if (this._geohashLayer) { this._kibanaMap.removeLayer(this._geohashLayer); @@ -143,10 +152,17 @@ module.exports = function MapsRenderbotFactory(Private, $injector, tilemapSettin updateParams() { this._paramsDirty = true; - this._kibanaMapReady.then(() => { + this._kibanaMapReady.then(async() => { const mapParams = this._getMapsParams(); + const { minZoom, maxZoom } = this._getMinMaxZoom(); + if (mapParams.wms.enabled) { - const { minZoom, maxZoom } = tilemapSettings.getMinMaxZoom(true); + + if (maxZoom > this._kibanaMap.getMaxZoomLevel()) { + this._geohashLayer = null; + this._kibanaMapReady = this._makeKibanaMap(); + } + this._kibanaMap.setBaseLayer({ baseLayerType: 'wms', options: { @@ -157,6 +173,13 @@ module.exports = function MapsRenderbotFactory(Private, $injector, tilemapSettin } }); } else { + + if (maxZoom < this._kibanaMap.getMaxZoomLevel()) { + this._geohashLayer = null; + this._kibanaMapReady = this._makeKibanaMap(); + this._kibanaMap.setZoomLevel(maxZoom); + } + if (!tilemapSettings.hasError()) { const url = tilemapSettings.getUrl(); const options = tilemapSettings.getTMSOptions(); diff --git a/test/functional/apps/visualize/_tile_map.js b/test/functional/apps/visualize/_tile_map.js index 3a7bcda578ba0..46dd32ff22cae 100644 --- a/test/functional/apps/visualize/_tile_map.js +++ b/test/functional/apps/visualize/_tile_map.js @@ -305,6 +305,42 @@ export default function ({ getService, getPageObjects }) { }); }); }); + + it('wms switch should change allow to zoom in further', function () { + + return PageObjects.visualize.collapseChart() + .then(function () { + return PageObjects.visualize.clickOptions(); + }) + .then(function () { + return PageObjects.visualize.selectWMS(); + }) + .then(function () { + return PageObjects.visualize.clickGo(); + }) + .then(function () { + return PageObjects.header.waitUntilLoadingHasFinished(); + }) + .then(function () { + return PageObjects.common.sleep(2000); + }) + .then(function () { + return PageObjects.visualize.getMapZoomInEnabled(); + }) + .then(function (enabled) {//should be able to zoom in again + expect(enabled).to.be(true); + }) + .then(function () { + return PageObjects.visualize.clickMapZoomIn(); + }) + .then(function () { + return PageObjects.visualize.getMapZoomInEnabled(); + }) + .then(function (enabled) {//should be able to zoom in again + expect(enabled).to.be(true); + }); + + }); }); }); } diff --git a/test/functional/page_objects/visualize_page.js b/test/functional/page_objects/visualize_page.js index e18dc027b19b2..6abd86e1381ec 100644 --- a/test/functional/page_objects/visualize_page.js +++ b/test/functional/page_objects/visualize_page.js @@ -325,6 +325,21 @@ export function VisualizePageProvider({ getService, getPageObjects }) { }); } + clickOptions() { + return remote + .setFindTimeout(defaultFindTimeout) + .findByPartialLinkText('Options') + .click(); + } + + selectWMS() { + return remote + .setFindTimeout(defaultFindTimeout) + .findByCssSelector('input[name="wms.enabled"]') + .click(); + } + + saveVisualization(vizName) { return testSubjects.click('visualizeSaveButton') .then(() => {