From 82177c094e40967c3e3f7ae8262d0e23b29c92d7 Mon Sep 17 00:00:00 2001 From: Court Ewing Date: Wed, 20 Jul 2016 16:56:11 -0400 Subject: [PATCH] Backport PR #7724 --------- **Commit 1:** [viz] Allow for configurable map urls * Original sha: 58844a0296e8f802e99f973e963e26e2fdf3799c * Authored by Jonathan Budzenski on 2016-07-12T21:29:00Z **Commit 2:** Adds every config option from Leaflet * Original sha: 0b9388ce830af359ff73894189b4dda40b0dfbcd * Authored by Chris Earle on 2016-07-13T00:31:04Z * Committed by Jonathan Budzenski on 2016-07-13T01:55:01Z **Commit 3:** Removed confusing config options * Original sha: b1f8ac8afe2ec8947cc40db14f80ea8d17272b13 * Authored by Chris Earle on 2016-07-13T01:07:01Z * Committed by Jonathan Budzenski on 2016-07-13T01:55:01Z **Commit 4:** [vis] Don't rewrite markdown * Original sha: c670a1c415002e8ef5e6910e3c53cfa8c14fcf97 * Authored by Jonathan Budzenski on 2016-07-13T02:52:39Z **Commit 5:** [config] Update default tile link * Original sha: 7c8ec7560c991e730aa34ad9ee647195fc78bf66 * Authored by Jonathan Budzenski on 2016-07-13T02:55:16Z **Commit 6:** Change bounds from object to GeoJSON (long, lat) array style * Original sha: 6d8f803f2b33b74fb157236bffa7948e34663625 * Authored by Chris Earle on 2016-07-13T02:58:07Z **Commit 7:** [config] Set max zoom to 7 * Original sha: b7629490ad8c1667c0c84d2fec4622404dcba2e7 * Authored by Jonathan Budzenski on 2016-07-13T03:07:47Z **Commit 8:** [tests] Cleanup schema data * Original sha: c3d203f07b187e84ab6c884a8e789de524972720 * Authored by Jonathan Budzenski on 2016-07-13T04:04:04Z **Commit 9:** [vis] Bound tilemap zoom * Original sha: 3c1339e17c31ad9d10d94be3452ff9ea43dd6cb4 * Authored by Jonathan Budzenski on 2016-07-13T15:25:16Z **Commit 10:** Round out support for the initial Elastic Tile Service Correct links, legacy config handling, and wms server conditionals. * Original sha: 41fbb060c426c79c4198d00c8cee60aa0795c4be * Authored by Court Ewing on 2016-07-15T20:50:47Z **Commit 11:** Made minZoom in test fixture consistent with reality * Original sha: 6494caa789d8b7069a82b376f586d7560ef03993 * Authored by Court Ewing on 2016-07-15T21:11:36Z **Commit 12:** Correctly check for enabled wms to determine zoom Without this defensive check, a JS console error is thrown whenever wms is not configured for a map visualization. * Original sha: c74041cadbc56c706dfc8021f0316d4807cc614f * Authored by Court Ewing on 2016-07-15T21:15:10Z **Commit 13:** Remove duplicate wms conditional in tilemap createmap This separation made sense in the original implementation, but it is not necessary in this version. * Original sha: ca5a96838b0679df4697847cc085f5bc858092d1 * Authored by Court Ewing on 2016-07-15T21:35:21Z **Commit 14:** Remove optional joi references in tilemap config In joi, configurations are optional by default, so there's no need to be explicit here. * Original sha: 2feac112f389974afb6830d10a02df228e8b0429 * Authored by Court Ewing on 2016-07-19T17:34:38Z **Commit 15:** Re-disable scroll wheel zoom on maps Enabling scroll wheel search does not seem necessary in the context of this overall bug fix. * Original sha: 2862f94cda962bb78b6c31f11a745b664d758fd7 * Authored by Court Ewing on 2016-07-19T17:39:40Z --- src/cli/serve/read_yaml_config.js | 5 +++ src/plugins/kibana/index.js | 3 +- src/plugins/testsBundle/testsEntryTemplate.js | 10 +++++- src/server/config/schema.js | 17 ++++++++++ src/ui/public/vislib/styles/_tilemap.less | 4 +++ src/ui/public/vislib/visualizations/_map.js | 34 +++++++++++++------ 6 files changed, 60 insertions(+), 13 deletions(-) diff --git a/src/cli/serve/read_yaml_config.js b/src/cli/serve/read_yaml_config.js index 3387b20c2aa80..adfe4027d1036 100644 --- a/src/cli/serve/read_yaml_config.js +++ b/src/cli/serve/read_yaml_config.js @@ -32,6 +32,11 @@ let legacySettingMap = { request_timeout: 'elasticsearch.requestTimeout', shard_timeout: 'elasticsearch.shardTimeout', startup_timeout: 'elasticsearch.startupTimeout', + tilemap_url: 'tilemap.url', + tilemap_min_zoom: 'tilemap.options.minZoom', + tilemap_max_zoom: 'tilemap.options.maxZoom', + tilemap_attribution: 'tilemap.options.attribution', + tilemap_subdomains: 'tilemap.options.subdomains', verify_ssl: 'elasticsearch.ssl.verify', }; diff --git a/src/plugins/kibana/index.js b/src/plugins/kibana/index.js index 358c04c9b5f3f..4f89aec013366 100644 --- a/src/plugins/kibana/index.js +++ b/src/plugins/kibana/index.js @@ -38,7 +38,8 @@ module.exports = function (kibana) { let config = server.config(); return { - kbnDefaultAppId: config.get('kibana.defaultAppId') + kbnDefaultAppId: config.get('kibana.defaultAppId'), + tilemap: config.get('tilemap') }; } }, diff --git a/src/plugins/testsBundle/testsEntryTemplate.js b/src/plugins/testsBundle/testsEntryTemplate.js index 61127f4bfc48f..002bb15d433a0 100644 --- a/src/plugins/testsBundle/testsEntryTemplate.js +++ b/src/plugins/testsBundle/testsEntryTemplate.js @@ -27,7 +27,15 @@ window.__KBN__ = { kbnIndex: '.kibana', esShardTimeout: 1500, esApiVersion: '2.0', - esRequestTimeout: '300000' + esRequestTimeout: '300000', + tilemap: { + url: 'https://tiles.elastic.co/v1/default/{z}/{x}/{y}.png?my_app_name=kibana&my_app_version=1.2.3&elastic_tile_service_tos=agree', + options: { + minZoom: 1, + maxZoom: 7, + attribution: '© [Elastic Tile Service](https://www.elastic.co/elastic_tile_service)' + } + } } }; diff --git a/src/server/config/schema.js b/src/server/config/schema.js index daaa8a1da2853..5741b6e0a0fbb 100644 --- a/src/server/config/schema.js +++ b/src/server/config/schema.js @@ -8,6 +8,8 @@ let fromRoot = utils('fromRoot'); const randomBytes = require('crypto').randomBytes; const getData = require('../path').getData; +import pkg from '../../../src/utils/packageJson'; + module.exports = () => Joi.object({ pkg: Joi.object({ version: Joi.string().default(Joi.ref('$version')), @@ -119,6 +121,21 @@ module.exports = () => Joi.object({ status: Joi.object({ allowAnonymous: Joi.boolean().default(false) + }).default(), + + tilemap: Joi.object({ + url: Joi.string().default(`https://tiles.elastic.co/v1/default/{z}/{x}/{y}.png?my_app_name=kibana&my_app_version=${pkg.version}&elastic_tile_service_tos=agree`), + options: Joi.object({ + attribution: Joi.string().default('© [Elastic Tile Service](https://www.elastic.co/elastic-tile-service)'), + minZoom: Joi.number().min(1, 'Must not be less than 1').default(1), + maxZoom: Joi.number().default(7), + tileSize: Joi.number(), + subdomains: Joi.array().items(Joi.string()).single(), + errorTileUrl: Joi.string().uri(), + tms: Joi.boolean(), + reuseTiles: Joi.boolean(), + bounds: Joi.array().items(Joi.array().items(Joi.number()).min(2).required()).min(2) + }).default() }).default() }).default(); diff --git a/src/ui/public/vislib/styles/_tilemap.less b/src/ui/public/vislib/styles/_tilemap.less index 2fd7d98e709a9..6d4d513660a54 100644 --- a/src/ui/public/vislib/styles/_tilemap.less +++ b/src/ui/public/vislib/styles/_tilemap.less @@ -158,6 +158,10 @@ .leaflet-control-attribution { background-color: @tilemap-leaflet-footer-bg !important; color: @tilemap-leaflet-footer-color !important; + + p { + display: inline; + } } .leaflet-left { diff --git a/src/ui/public/vislib/visualizations/_map.js b/src/ui/public/vislib/visualizations/_map.js index 5fa0b78ad05f0..30f6d92496f21 100644 --- a/src/ui/public/vislib/visualizations/_map.js +++ b/src/ui/public/vislib/visualizations/_map.js @@ -1,21 +1,24 @@ define(function (require) { - return function MapFactory(Private) { + return function MapFactory(Private, tilemap) { let _ = require('lodash'); let $ = require('jquery'); let L = require('leaflet'); + let marked = require('marked'); + marked.setOptions({ + gfm: true, // Github-flavored markdown + sanitize: true // Sanitize HTML tags + }); let defaultMapZoom = 2; let defaultMapCenter = [15, 5]; let defaultMarkerType = 'Scaled Circle Markers'; + let tilemapOptions = tilemap.options; + let attribution = marked(tilemapOptions.attribution); + let mapTiles = { - url: 'https://otile{s}-s.mqcdn.com/tiles/1.0.0/map/{z}/{x}/{y}.jpeg', - options: { - attribution: 'Tiles by MapQuest — ' + - 'Map data © OpenStreetMap contributors, ' + - 'CC-BY-SA', - subdomains: '1234' - } + url: tilemap.url, + options: _.assign({}, tilemapOptions, { attribution }) }; let markerTypes = { @@ -47,8 +50,8 @@ define(function (require) { this._attr = params.attr || {}; let mapOptions = { - minZoom: 1, - maxZoom: 18, + minZoom: tilemapOptions.minZoom, + maxZoom: tilemapOptions.maxZoom, noWrap: true, maxBounds: L.latLngBounds([-90, -220], [90, 220]), scrollWheelZoom: false, @@ -261,9 +264,18 @@ define(function (require) { TileMapMap.prototype._createMap = function (mapOptions) { if (this.map) this.destroy(); + if (this._attr.wms && this._attr.wms.enabled) { + _.assign(mapOptions, { + minZoom: 1, + maxZoom: 18 + }); + } + + const savedZoom = _.get(this._geoJson, 'properties.zoom'); + // get center and zoom from mapdata, or use defaults this._mapCenter = _.get(this._geoJson, 'properties.center') || defaultMapCenter; - this._mapZoom = _.get(this._geoJson, 'properties.zoom') || defaultMapZoom; + this._mapZoom = Math.max(Math.min(savedZoom || defaultMapZoom, mapOptions.maxZoom), mapOptions.minZoom); // add map tiles layer, using the mapTiles object settings if (this._attr.wms && this._attr.wms.enabled) {