grafana/public/app/plugins/panel/geomap/migrations.ts
2021-07-12 20:47:39 -07:00

109 lines
2.9 KiB
TypeScript

import { FieldConfigSource, PanelTypeChangedHandler, Threshold, ThresholdsMode } from '@grafana/data';
import { GeomapPanelOptions } from './types';
import { MapCenterID } from './view';
/**
* This is called when the panel changes from another panel
*/
export const mapPanelChangedHandler: PanelTypeChangedHandler = (panel, prevPluginId, prevOptions, prevFieldConfig) => {
// Changing from angular/worldmap panel to react/openlayers
if (prevPluginId === 'grafana-worldmap-panel' && prevOptions.angular) {
const { fieldConfig, options } = worldmapToGeomapOptions({
...prevOptions.angular,
fieldConfig: prevFieldConfig,
});
panel.fieldConfig = fieldConfig; // Mutates the incoming panel
return options;
}
return {};
};
export function worldmapToGeomapOptions(angular: any): { fieldConfig: FieldConfigSource; options: GeomapPanelOptions } {
const fieldConfig: FieldConfigSource = {
defaults: {},
overrides: [],
};
const options: GeomapPanelOptions = {
view: {
center: {
id: MapCenterID.Zero,
},
},
controls: {
showZoom: true,
showLegend: Boolean(angular.showLegend),
mouseWheelZoom: Boolean(angular.mouseWheelZoom),
},
basemap: {
type: 'default', // was carto
},
layers: [
// TODO? depends on current configs
],
fieldMapping: {
metricField: '',
geohashField: '',
latitudeField: '',
longitudeField: '',
},
};
let v = asNumber(angular.decimals);
if (v) {
fieldConfig.defaults.decimals = v;
}
// Convert thresholds and color values
if (angular.thresholds && angular.colors) {
const levels = angular.thresholds.split(',').map((strVale: string) => {
return Number(strVale.trim());
});
// One more color than threshold
const thresholds: Threshold[] = [];
for (const color of angular.colors) {
const idx = thresholds.length - 1;
if (idx >= 0) {
thresholds.push({ value: levels[idx], color });
} else {
thresholds.push({ value: -Infinity, color });
}
}
fieldConfig.defaults.thresholds = {
mode: ThresholdsMode.Absolute,
steps: thresholds,
};
}
v = asNumber(angular.initialZoom);
if (v) {
options.view.zoom = v;
}
// mapCenter: 'Europe',
// mapCenterLatitude: 46,
// mapCenterLongitude: 14,
//
// Map center (from worldmap)
const mapCenters: any = {
'(0°, 0°)': MapCenterID.Zero,
'North America': 'north-america',
Europe: 'europe',
'West Asia': 'west-asia',
'SE Asia': 'se-asia',
'Last GeoHash': MapCenterID.LastPoint,
};
options.view.center.id = mapCenters[angular.mapCenter as any];
options.view.center.lat = asNumber(angular.mapCenterLatitude);
options.view.center.lon = asNumber(angular.mapCenterLongitude);
return { fieldConfig, options };
}
function asNumber(v: any): number | undefined {
const num = +v;
return isNaN(num) ? undefined : num;
}