Browse Source

Panels: Support angular -> react migration via PanelMigrationHandler

Torkel Ödegaard 6 years ago
parent
commit
e03c7bf1a3

+ 8 - 2
packages/grafana-ui/src/types/panel.ts

@@ -21,10 +21,16 @@ export interface PanelEditorProps<T = any> {
   onOptionsChange: (options: T) => void;
 }
 
+export interface PanelModel<TOptions = any> {
+  id: number;
+  options: TOptions;
+  pluginVersion?: string;
+}
+
 /**
- * Called when a panel is first loaded with existing options
+ * Called when a panel is first loaded with current panel model
  */
-export type PanelMigrationHandler<TOptions = any> = (exiting: any, oldVersion?: string) => Partial<TOptions>;
+export type PanelMigrationHandler<TOptions = any> = (panel: PanelModel<TOptions>) => Partial<TOptions>;
 
 /**
  * Called before a panel is initalized

+ 1 - 1
public/app/features/dashboard/state/PanelModel.ts

@@ -250,7 +250,7 @@ export class PanelModel {
     const { reactPanel } = plugin.exports;
 
     if (reactPanel && reactPanel.onPanelMigration) {
-      this.options = reactPanel.onPanelMigration(this.options, this.pluginVersion);
+      this.options = reactPanel.onPanelMigration(this);
       this.pluginVersion = plugin.info ? plugin.info.version : '1.0.0';
     }
   }

+ 3 - 4
public/app/plugins/panel/singlestat2/module.tsx

@@ -1,4 +1,4 @@
-import { ReactPanelPlugin, getStatsCalculators } from '@grafana/ui';
+import { ReactPanelPlugin, getStatsCalculators, PanelModel } from '@grafana/ui';
 import { SingleStatOptions, defaults, SingleStatBaseOptions } from './types';
 import { SingleStatPanel } from './SingleStatPanel';
 import cloneDeep from 'lodash/cloneDeep';
@@ -21,12 +21,11 @@ export const singleStatBaseOptionsCheck = (
   return options;
 };
 
-export const singleStatMigrationCheck = (exiting: any, oldVersion?: string) => {
-  const options = exiting as Partial<SingleStatOptions>;
+export const singleStatMigrationCheck = (panel: PanelModel<SingleStatOptions>) => {
+  const options = panel.options;
   if (options.valueOptions) {
     // 6.1 renamed some stats, This makes sure they are up to date
     // avg -> mean, current -> last, total -> sum
-
     const { valueOptions } = options;
     if (valueOptions && valueOptions.stat) {
       valueOptions.stat = getStatsCalculators([valueOptions.stat]).map(s => s.id)[0];