mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
109 lines
2.9 KiB
TypeScript
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;
|
|
}
|