UNPKG

kibana-123

Version:

Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic

220 lines (178 loc) 6.32 kB
import uiModules from 'ui/modules'; import _ from 'lodash'; import marked from 'marked'; import url from 'url'; import uiRoutes from 'ui/routes'; import { modifyUrl } from 'ui/url'; marked.setOptions({ gfm: true, // Github-flavored markdown sanitize: true // Sanitize HTML tags }); /** * Reloads the setting for each route, * This is to ensure, that if the license changed during the lifecycle of the application, * we get an update. * tilemapSettings itself will take care that the manifest-service is not queried when not necessary. */ uiRoutes.afterSetupWork(function (tilemapSettings) { return tilemapSettings.loadSettings(); }); 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)) ); /** * Unescape a url template that was escaped by encodeURI() so leaflet * will be able to correctly locate the varables in the template * @param {String} url * @return {String} */ const unescapeTemplateVars = url => { const ENCODED_TEMPLATE_VARS_RE = /%7B(\w+?)%7D/g; return url.replace(ENCODED_TEMPLATE_VARS_RE, (total, varName) => `{${varName}}`); }; class TilemapSettings { constructor() { this._queryParams = { my_app_version: kbnVersion }; this._error = null; //initialize settings with the default of the configuration this._url = tilemapsConfig.deprecated.config.url; this._tmsOptions = optionsFromConfig; this._invalidateSettings(); } _invalidateSettings() { this._settingsInitialized = false; this._loadSettings = _.once(async() => { if (tilemapsConfig.deprecated.isOverridden) {//if settings are overridden, we will use those. this._settingsInitialized = true; } if (this._settingsInitialized) { return true; } return this._getTileServiceManifest(tilemapsConfig.manifestServiceUrl, this._queryParams) .then(response => { const service = _.get(response, 'data.services[0]'); if (!service) { throw new Error('Manifest response does not include sufficient service data.'); } this._error = null; this._tmsOptions = { attribution: $sanitize(marked(service.attribution)), minZoom: service.minZoom, maxZoom: service.maxZoom, subdomains: service.subdomains || [] }; this._url = unescapeTemplateVars(extendUrl(service.url, { query: this._queryParams })); this._settingsInitialized = true; }) .catch(e => { this._settingsInitialized = true; if (!e) { e = new Error('Unkown error'); } if (!(e instanceof Error)) { e = new Error(e.data || `status ${e.statusText || e.status}`); } this._error = new Error(`Could not retrieve manifest from the tile service: ${e.message}`); }) .then(() => { return true; }); }); } /** * Must be called before getUrl/getTMSOptions/getMapOptions can be called. */ loadSettings() { return this._loadSettings(); } /** * Add optional query-parameters for the request. * These are only applied when requesting dfrom the manifest. * * @param additionalQueryParams */ addQueryParams(additionalQueryParams) { //check if there are any changes in the settings. let changes = false; for (const key in additionalQueryParams) { if (additionalQueryParams.hasOwnProperty(key)) { if (additionalQueryParams[key] !== this._queryParams[key]) { changes = true; break; } } } if (changes) { this._queryParams = _.assign({}, this._queryParams, additionalQueryParams); this._invalidateSettings(); } } /** * Get the url of the default TMS * @return {string} */ getUrl() { if (!this._settingsInitialized) { throw new Error('Cannot retrieve url before calling .loadSettings first'); } return this._url; } /** * Get the options of the default TMS * @return {{}} */ getTMSOptions() { if (!this._settingsInitialized) { throw new Error('Cannot retrieve options before calling .loadSettings first'); } return this._tmsOptions; } /** * @return {{maxZoom: (*|number), minZoom: (*|number)}} */ getMinMaxZoom(isWMSEnabled) { //for backward compatibilty, we preserve the 1-18 setting. https://git.io/vMn5o if (isWMSEnabled) { return { minZoom: 1, maxZoom: 18 }; } //Otherwise, we use the settings from the yml. //note that it is no longer possible to only override the zoom-settings, since all options are read from the manifest //by default. //For a custom configuration, users will need to override tilemap.url as well. return { minZoom: this._tmsOptions.minZoom, maxZoom: this._tmsOptions.maxZoom }; } /** * Checks if there was an error during initialization of the parameters */ hasError() { return this._error !== null; } getError() { return this._error; } /** * Make this a method to allow for overrides by test code */ _getTileServiceManifest(manifestUrl) { return $http({ url: extendUrl(manifestUrl, { query: this._queryParams }), method: 'GET' }); } } return new TilemapSettings(); });