From e604e69d937b7c958a6be310651f12375afb701f Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Wed, 21 Jul 2021 13:48:20 -0700 Subject: [PATCH] Geomap: default basemap config cleanup (#37069) --- conf/defaults.ini | 6 ++-- conf/sample.ini | 12 +++++-- docs/sources/administration/configuration.md | 18 +++++----- packages/grafana-runtime/src/config.ts | 2 +- pkg/api/frontendsettings.go | 9 +++-- pkg/setting/setting.go | 19 ++++++----- .../app/plugins/panel/geomap/GeomapPanel.tsx | 10 +++--- .../panel/geomap/editor/BaseLayerEditor.tsx | 6 +++- .../panel/geomap/editor/LayerEditor.tsx | 5 ++- .../panel/geomap/layers/basemaps/default.ts | 30 ----------------- .../panel/geomap/layers/basemaps/index.ts | 8 ----- .../plugins/panel/geomap/layers/registry.ts | 33 +++++++++++++++++-- public/app/plugins/panel/geomap/module.tsx | 25 +++++--------- 13 files changed, 91 insertions(+), 92 deletions(-) delete mode 100644 public/app/plugins/panel/geomap/layers/basemaps/default.ts diff --git a/conf/defaults.ini b/conf/defaults.ini index 02cf623ec45..c801f997c1b 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -1013,8 +1013,8 @@ default_timezone = browser enabled = true [geomap] -# Set the default base layer in GeoMaps plugin -default_baselayer = +# Set the JSON configuration for the default basemap +default_baselayer_config = # Enable or disable loading other base map layers -disable_custom_baselayers = false +enable_custom_baselayers = true diff --git a/conf/sample.ini b/conf/sample.ini index ca48ae27a99..fa5123a2de8 100644 --- a/conf/sample.ini +++ b/conf/sample.ini @@ -993,8 +993,14 @@ ;enabled = true [geomap] -# Set the default base layer in GeoMaps plugin -;default_baselayer = +# Set the JSON configuration for the default basemap +;default_baselayer_config = `{ + "type": "xyz", + "config": { + "attribution": "Open street map", + "url": "https://tile.openstreetmap.org/{z}/{x}/{y}.png" + } +}` # Enable or disable loading other base map layers -;disable_custom_baselayers = false +;enable_custom_baselayers = true diff --git a/docs/sources/administration/configuration.md b/docs/sources/administration/configuration.md index 9b9ab0b9452..27ebf32c7e6 100644 --- a/docs/sources/administration/configuration.md +++ b/docs/sources/administration/configuration.md @@ -1677,21 +1677,21 @@ Set this to `false` to disable expressions and hide them in the Grafana UI. Defa This section controls the defaults settings for Geomap Plugin. -### default_baselayer +### default_baselayer_config The json config used to define the default base map. Four base map options to choose from are `carto`, `esriXYZTiles`, `xyzTiles`, `standard`. For example, to set cartoDB light as the default base layer: ```ini -geomap_default_baselayer = `{ - "type": "carto", - "config": { - "theme": "light", - "showLabels": true - } - }` +default_baselayer_config = `{ + "type": "xyz", + "config": { + "attribution": "Open street map", + "url": "https://tile.openstreetmap.org/{z}/{x}/{y}.png" + } +}` ``` -### disable_custom_baselayers +### enable_custom_baselayers Set this to `true` to disable loading other custom base maps and hide them in the Grafana UI. Default is `false`. \ No newline at end of file diff --git a/packages/grafana-runtime/src/config.ts b/packages/grafana-runtime/src/config.ts index 4a5151589ab..014fccb77ea 100644 --- a/packages/grafana-runtime/src/config.ts +++ b/packages/grafana-runtime/src/config.ts @@ -88,7 +88,7 @@ export class GrafanaBootConfig implements GrafanaConfig { caching = { enabled: false, }; - geomapDefaultBaseLayer?: MapLayerOptions; + geomapDefaultBaseLayerConfig?: MapLayerOptions; geomapDisableCustomBaseLayer?: boolean; constructor(options: GrafanaBootConfig) { diff --git a/pkg/api/frontendsettings.go b/pkg/api/frontendsettings.go index 084fc567843..4738157ffef 100644 --- a/pkg/api/frontendsettings.go +++ b/pkg/api/frontendsettings.go @@ -259,8 +259,13 @@ func (hs *HTTPServer) getFrontendSettingsMap(c *models.ReqContext) (map[string]i "caching": map[string]bool{ "enabled": hs.Cfg.SectionWithEnvOverrides("caching").Key("enabled").MustBool(true), }, - "geomapDefaultBaseLayer": hs.Cfg.DefaultBaseLayer, - "geomapDisableCustomBaseLayer": hs.Cfg.DisableCustomBaseLayers, + } + + if hs.Cfg.GeomapDefaultBaseLayerConfig != nil { + jsonObj["geomapDefaultBaseLayerConfig"] = hs.Cfg.GeomapDefaultBaseLayerConfig + } + if !hs.Cfg.GeomapEnableCustomBaseLayers { + jsonObj["geomapDisableCustomBaseLayer"] = true } return jsonObj, nil diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go index 13cce7cba71..6474ee3d6b5 100644 --- a/pkg/setting/setting.go +++ b/pkg/setting/setting.go @@ -402,9 +402,9 @@ type Cfg struct { // Grafana.com URL GrafanaComURL string - // Geomap plugin tile server - DefaultBaseLayer map[string]interface{} - DisableCustomBaseLayers bool + // Geomap base layer config + GeomapDefaultBaseLayerConfig map[string]interface{} + GeomapEnableCustomBaseLayers bool } // IsLiveConfigEnabled returns true if live should be able to save configs to SQL tables @@ -972,16 +972,17 @@ func (cfg *Cfg) Load(args *CommandLineArgs) error { } geomapSection := iniFile.Section("geomap") - basemapJSON := valueAsString(geomapSection, "default_baselayer", "") - cfg.DefaultBaseLayer = make(map[string]interface{}) + basemapJSON := valueAsString(geomapSection, "default_baselayer_config", "") if basemapJSON != "" { - err = json.Unmarshal([]byte(basemapJSON), &cfg.DefaultBaseLayer) + layer := make(map[string]interface{}) + err = json.Unmarshal([]byte(basemapJSON), &layer) if err != nil { - cfg.Logger.Error(fmt.Sprintf("Error parsing JSON string: %s", err)) - cfg.DefaultBaseLayer = nil + cfg.Logger.Error("Error reading json from default_baselayer_config", "error", err) + } else { + cfg.GeomapDefaultBaseLayerConfig = layer } } - cfg.DisableCustomBaseLayers = geomapSection.Key("disable_custom_baselayers").MustBool(false) + cfg.GeomapEnableCustomBaseLayers = geomapSection.Key("enable_custom_baselayers").MustBool(true) cfg.readDateFormats() cfg.readSentryConfig() diff --git a/public/app/plugins/panel/geomap/GeomapPanel.tsx b/public/app/plugins/panel/geomap/GeomapPanel.tsx index 3f45586da2f..6ec95e41018 100644 --- a/public/app/plugins/panel/geomap/GeomapPanel.tsx +++ b/public/app/plugins/panel/geomap/GeomapPanel.tsx @@ -1,5 +1,5 @@ import React, { Component } from 'react'; -import { geomapLayerRegistry } from './layers/registry'; +import { DEFAULT_BASEMAP_CONFIG, geomapLayerRegistry, defaultBaseLayer } from './layers/registry'; import { Map, View } from 'ol'; import Attribution from 'ol/control/Attribution'; import Zoom from 'ol/control/Zoom'; @@ -12,7 +12,6 @@ import { PanelData, MapLayerHandler, MapLayerOptions, PanelProps, GrafanaTheme } import { config } from '@grafana/runtime'; import { ControlsOptions, GeomapPanelOptions, MapViewConfig } from './types'; -import { defaultGrafanaThemedMap } from './layers/basemaps'; import { centerPointRegistry, MapCenterID } from './view'; import { fromLonLat } from 'ol/proj'; import { Coordinate } from 'ol/coordinate'; @@ -153,10 +152,11 @@ export class GeomapPanel extends Component { if (!this.map) { return; } - if (!cfg) { - cfg = { type: defaultGrafanaThemedMap.id }; + + if (!cfg?.type || config.geomapDisableCustomBaseLayer) { + cfg = DEFAULT_BASEMAP_CONFIG; } - const item = geomapLayerRegistry.getIfExists(cfg.type) ?? defaultGrafanaThemedMap; + const item = geomapLayerRegistry.getIfExists(cfg.type) ?? defaultBaseLayer; const layer = item.create(this.map, cfg, config.theme2).init(); if (this.basemap) { this.map.removeLayer(this.basemap); diff --git a/public/app/plugins/panel/geomap/editor/BaseLayerEditor.tsx b/public/app/plugins/panel/geomap/editor/BaseLayerEditor.tsx index 42f8c8530c1..ff2038dcb13 100644 --- a/public/app/plugins/panel/geomap/editor/BaseLayerEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/BaseLayerEditor.tsx @@ -2,7 +2,7 @@ import React, { FC } from 'react'; import { StandardEditorProps, MapLayerOptions, MapLayerRegistryItem, PluginState } from '@grafana/data'; import { GeomapPanelOptions } from '../types'; import { LayerEditor } from './LayerEditor'; -import { hasAlphaPanels } from 'app/core/config'; +import { config, hasAlphaPanels } from 'app/core/config'; function baseMapFilter(layer: MapLayerRegistryItem): boolean { if (!layer.isBaseMap) { @@ -19,5 +19,9 @@ export const BaseLayerEditor: FC { + if (config.geomapDisableCustomBaseLayer) { + return
The base layer is configured by the server admin.
; + } + return ; }; diff --git a/public/app/plugins/panel/geomap/editor/LayerEditor.tsx b/public/app/plugins/panel/geomap/editor/LayerEditor.tsx index af0b2cac32e..46fd9d776f6 100644 --- a/public/app/plugins/panel/geomap/editor/LayerEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/LayerEditor.tsx @@ -10,8 +10,7 @@ import { FieldType, Field, } from '@grafana/data'; -import { geomapLayerRegistry } from '../layers/registry'; -import { defaultGrafanaThemedMap } from '../layers/basemaps'; +import { DEFAULT_BASEMAP_CONFIG, geomapLayerRegistry } from '../layers/registry'; import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor'; import { setOptionImmutably } from 'app/features/dashboard/components/PanelEditor/utils'; import { fillOptionsPaneItems } from 'app/features/dashboard/components/PanelEditor/getVizualizationOptions'; @@ -29,7 +28,7 @@ export const LayerEditor: FC = ({ options, onChange, data, fil return geomapLayerRegistry.selectOptions( options?.type // the selected value ? [options.type] // as an array - : [defaultGrafanaThemedMap.id], + : [DEFAULT_BASEMAP_CONFIG.type], filter ); }, [options?.type, filter]); diff --git a/public/app/plugins/panel/geomap/layers/basemaps/default.ts b/public/app/plugins/panel/geomap/layers/basemaps/default.ts deleted file mode 100644 index df526932ae8..00000000000 --- a/public/app/plugins/panel/geomap/layers/basemaps/default.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { MapLayerRegistryItem, MapLayerOptions, GrafanaTheme2 } from '@grafana/data'; -import Map from 'ol/Map'; -import { carto } from './carto'; -import { esriXYZTiles } from './esri'; -import { xyzTiles } from './generic'; -import { standard } from './osm'; -import { config } from 'app/core/config'; - -// Array of base map options to search through -const baseLayers = [carto, esriXYZTiles, xyzTiles, standard]; - -// Default base layer depending on the server setting -export const defaultBaseLayer: MapLayerRegistryItem = { - id: 'default', - name: 'Default base layer', - isBaseMap: true, - - create: (map: Map, options: MapLayerOptions, theme: GrafanaTheme2) => { - // Use Carto as the default base layer if not set from server - let layer: any = carto; - if (config.geomapDefaultBaseLayer && config.geomapDefaultBaseLayer.type) { - options = config.geomapDefaultBaseLayer; // options from server - layer = baseLayers.find((baseLayer) => baseLayer.id === options.type); - if (!layer) { - throw new Error('Invalid default base map type'); - } - } - return layer.create(map, options, theme); - }, -}; diff --git a/public/app/plugins/panel/geomap/layers/basemaps/index.ts b/public/app/plugins/panel/geomap/layers/basemaps/index.ts index f34b69051aa..bed65e126f5 100644 --- a/public/app/plugins/panel/geomap/layers/basemaps/index.ts +++ b/public/app/plugins/panel/geomap/layers/basemaps/index.ts @@ -2,19 +2,11 @@ import { cartoLayers } from './carto'; import { esriLayers } from './esri'; import { genericLayers } from './generic'; import { osmLayers } from './osm'; -import { defaultBaseLayer } from './default'; - -export const defaultGrafanaThemedMap = { - ...defaultBaseLayer, - id: 'default', - name: 'Default base layer', -}; /** * Registry for layer handlers */ export const basemapLayers = [ - defaultGrafanaThemedMap, ...osmLayers, ...cartoLayers, ...esriLayers, // keep formatting diff --git a/public/app/plugins/panel/geomap/layers/registry.ts b/public/app/plugins/panel/geomap/layers/registry.ts index bb79974ddbe..6dc22bd92b9 100644 --- a/public/app/plugins/panel/geomap/layers/registry.ts +++ b/public/app/plugins/panel/geomap/layers/registry.ts @@ -1,12 +1,41 @@ -import { MapLayerRegistryItem, Registry } from '@grafana/data'; - +import { MapLayerRegistryItem, Registry, MapLayerOptions, GrafanaTheme2 } from '@grafana/data'; +import Map from 'ol/Map'; +import { carto } from './basemaps/carto'; +import { config } from 'app/core/config'; import { basemapLayers } from './basemaps'; import { dataLayers } from './data'; +export const DEFAULT_BASEMAP_CONFIG: MapLayerOptions = { + type: 'default', + config: {}, +}; + +// Default base layer depending on the server setting +export const defaultBaseLayer: MapLayerRegistryItem = { + id: DEFAULT_BASEMAP_CONFIG.type, + name: 'Default base layer', + isBaseMap: true, + + create: (map: Map, options: MapLayerOptions, theme: GrafanaTheme2) => { + const serverLayerType = config?.geomapDefaultBaseLayerConfig?.type; + if (serverLayerType) { + const layer = geomapLayerRegistry.getIfExists(serverLayerType); + if (!layer) { + throw new Error('Invalid basemap configuraiton on server'); + } + return layer.create(map, config.geomapDefaultBaseLayerConfig!, theme); + } + + // For now use carto as our default basemap + return carto.create(map, options, theme); + }, +}; + /** * Registry for layer handlers */ export const geomapLayerRegistry = new Registry>(() => [ + defaultBaseLayer, ...basemapLayers, // simple basemaps ...dataLayers, // Layers with update functions ]); diff --git a/public/app/plugins/panel/geomap/module.tsx b/public/app/plugins/panel/geomap/module.tsx index b64880087d5..b58f11d8593 100644 --- a/public/app/plugins/panel/geomap/module.tsx +++ b/public/app/plugins/panel/geomap/module.tsx @@ -5,9 +5,8 @@ import { GeomapPanel } from './GeomapPanel'; import { MapViewEditor } from './editor/MapViewEditor'; import { defaultView, GeomapPanelOptions } from './types'; import { mapPanelChangedHandler } from './migrations'; -import { defaultGrafanaThemedMap } from './layers/basemaps'; import { defaultMarkersConfig } from './layers/data/markersLayer'; -import { config } from 'app/core/config'; +import { DEFAULT_BASEMAP_CONFIG } from './layers/registry'; export const plugin = new PanelPlugin(GeomapPanel) .setNoPadding() @@ -33,20 +32,14 @@ export const plugin = new PanelPlugin(GeomapPanel) defaultValue: defaultView.shared, }); - // Nested - if (!config.geomapDisableCustomBaseLayer) { - builder.addCustomEditor({ - category: ['Base Layer'], - id: 'basemap', - path: 'basemap', - name: 'Base Layer', - editor: BaseLayerEditor, - defaultValue: { - type: defaultGrafanaThemedMap.id, - config: defaultGrafanaThemedMap.defaultOptions, - }, - }); - } + builder.addCustomEditor({ + category: ['Base Layer'], + id: 'basemap', + path: 'basemap', + name: 'Base Layer', + editor: BaseLayerEditor, + defaultValue: DEFAULT_BASEMAP_CONFIG, + }); builder.addCustomEditor({ category: ['Data Layer'],