{"version":3,"file":"PanelPlugin.mjs","sources":["../../../src/panel/PanelPlugin.ts"],"sourcesContent":["import { defaultsDeep, set } from 'lodash';\nimport { ComponentClass, ComponentType } from 'react';\n\nimport { FieldConfigOptionsRegistry } from '../field/FieldConfigOptionsRegistry';\nimport { StandardEditorContext } from '../field/standardFieldConfigEditorRegistry';\nimport { PanelModel } from '../types/dashboard';\nimport { FieldConfigProperty, FieldConfigSource } from '../types/fieldOverrides';\nimport {\n  PanelPluginMeta,\n  PanelProps,\n  PanelEditorProps,\n  PanelMigrationHandler,\n  PanelTypeChangedHandler,\n  PanelPluginDataSupport,\n} from '../types/panel';\nimport { GrafanaPlugin } from '../types/plugin';\nimport {\n  getSuggestionHash,\n  PanelPluginVisualizationSuggestion,\n  VisualizationSuggestion,\n  VisualizationSuggestionsSupplierDeprecated,\n  VisualizationSuggestionsSupplier,\n  VisualizationSuggestionsBuilder,\n} from '../types/suggestions';\nimport { FieldConfigEditorBuilder, PanelOptionsEditorBuilder } from '../utils/OptionsUIBuilders';\nimport { deprecationWarning } from '../utils/deprecationWarning';\n\nimport { createFieldConfigRegistry } from './registryFactories';\nimport { PanelDataSummary } from './suggestions/getPanelDataSummary';\n\n/** @beta */\nexport type StandardOptionConfig = {\n  defaultValue?: any;\n  settings?: any;\n  hideFromDefaults?: boolean;\n};\n\n/** @beta */\nexport interface SetFieldConfigOptionsArgs<TFieldConfigOptions = any> {\n  /**\n   * Configuration object of the standard field config properites\n   *\n   * @example\n   * ```typescript\n   * {\n   *   standardOptions: {\n   *     [FieldConfigProperty.Decimals]: {\n   *       defaultValue: 3\n   *     }\n   *   }\n   * }\n   * ```\n   */\n  standardOptions?: Partial<Record<FieldConfigProperty, StandardOptionConfig>>;\n\n  /**\n   * Array of standard field config properties that should not be available in the panel\n   * @example\n   * ```typescript\n   * {\n   *   disableStandardOptions: [FieldConfigProperty.Min, FieldConfigProperty.Max, FieldConfigProperty.Unit]\n   * }\n   * ```\n   */\n  disableStandardOptions?: FieldConfigProperty[];\n\n  /**\n   * Function that allows custom field config properties definition.\n   *\n   * @param builder\n   *\n   * @example\n   * ```typescript\n   * useCustomConfig: builder => {\n   *   builder\n   *    .addNumberInput({\n   *      id: 'shapeBorderWidth',\n   *      name: 'Border width',\n   *      description: 'Border width of the shape',\n   *      settings: {\n   *        min: 1,\n   *        max: 5,\n   *      },\n   *    })\n   *    .addSelect({\n   *      id: 'displayMode',\n   *      name: 'Display mode',\n   *      description: 'How the shape shout be rendered'\n   *      settings: {\n   *      options: [{value: 'fill', label: 'Fill' }, {value: 'transparent', label: 'Transparent }]\n   *    },\n   *  })\n   * }\n   * ```\n   */\n  useCustomConfig?: (builder: FieldConfigEditorBuilder<TFieldConfigOptions>) => void;\n}\n\nexport type PanelOptionsSupplier<TOptions> = (\n  builder: PanelOptionsEditorBuilder<TOptions>,\n  context: StandardEditorContext<TOptions>\n) => void;\n\nexport class PanelPlugin<\n  TOptions = any,\n  TFieldConfigOptions extends object = {},\n> extends GrafanaPlugin<PanelPluginMeta> {\n  private _defaults?: TOptions;\n  private _fieldConfigDefaults: FieldConfigSource<TFieldConfigOptions> = {\n    defaults: {},\n    overrides: [],\n  };\n\n  private _fieldConfigRegistry?: FieldConfigOptionsRegistry;\n  private _initConfigRegistry = () => {\n    return new FieldConfigOptionsRegistry();\n  };\n\n  private optionsSupplier?: PanelOptionsSupplier<TOptions>;\n  private suggestionsSupplier?: VisualizationSuggestionsSupplier<TOptions, TFieldConfigOptions>;\n\n  panel: ComponentType<PanelProps<TOptions>> | null;\n  editor?: ComponentClass<PanelEditorProps<TOptions>>;\n  onPanelMigration?: PanelMigrationHandler<TOptions>;\n  shouldMigrate?: (panel: PanelModel) => boolean;\n  onPanelTypeChanged?: PanelTypeChangedHandler<TOptions>;\n  noPadding?: boolean;\n  dataSupport: PanelPluginDataSupport = {\n    annotations: false,\n    alertStates: false,\n  };\n\n  constructor(panel: ComponentType<PanelProps<TOptions>> | null) {\n    super();\n    this.panel = panel;\n  }\n\n  get defaults() {\n    let result = this._defaults || {};\n\n    if (!this._defaults && this.optionsSupplier) {\n      const builder = new PanelOptionsEditorBuilder<TOptions>();\n      this.optionsSupplier(builder, { data: [] });\n      for (const item of builder.getItems()) {\n        if (item.defaultValue != null) {\n          set(result, item.path, item.defaultValue);\n        }\n      }\n    }\n\n    return result;\n  }\n\n  get fieldConfigDefaults(): FieldConfigSource<TFieldConfigOptions> {\n    const configDefaults = this._fieldConfigDefaults.defaults;\n    configDefaults.custom = {} as TFieldConfigOptions;\n\n    for (const option of this.fieldConfigRegistry.list()) {\n      if (option.defaultValue === undefined) {\n        continue;\n      }\n\n      set(configDefaults, option.id, option.defaultValue);\n    }\n\n    return {\n      defaults: {\n        ...configDefaults,\n      },\n      overrides: this._fieldConfigDefaults.overrides,\n    };\n  }\n\n  /**\n   * @deprecated setDefaults is deprecated in favor of setPanelOptions\n   */\n  setDefaults(defaults: TOptions) {\n    deprecationWarning('PanelPlugin', 'setDefaults', 'setPanelOptions');\n    this._defaults = defaults;\n    return this;\n  }\n\n  get fieldConfigRegistry() {\n    if (!this._fieldConfigRegistry) {\n      this._fieldConfigRegistry = this._initConfigRegistry();\n    }\n\n    return this._fieldConfigRegistry;\n  }\n\n  /**\n   * @deprecated setEditor is deprecated in favor of setPanelOptions\n   */\n  setEditor(editor: ComponentClass<PanelEditorProps<TOptions>>) {\n    deprecationWarning('PanelPlugin', 'setEditor', 'setPanelOptions');\n    this.editor = editor;\n    return this;\n  }\n\n  setNoPadding() {\n    this.noPadding = true;\n    return this;\n  }\n\n  /**\n   * This function is called before the panel first loads if\n   * the current version is different than the version that was saved.\n   *\n   * If shouldMigrate is provided, it will be called regardless of whether\n   * the version has changed, and can explicitly opt into running the\n   * migration handler\n   *\n   * This is a good place to support any changes to the options model\n   */\n  setMigrationHandler(handler: PanelMigrationHandler<TOptions>, shouldMigrate?: (panel: PanelModel) => boolean) {\n    this.onPanelMigration = handler;\n    this.shouldMigrate = shouldMigrate;\n    return this;\n  }\n\n  /**\n   * This function is called when the visualization was changed. This\n   * passes in the panel model for previous visualisation options inspection\n   * and panel model updates.\n   *\n   * This is useful for supporting PanelModel API updates when changing\n   * between Angular and React panels.\n   */\n  setPanelChangeHandler(handler: PanelTypeChangedHandler) {\n    this.onPanelTypeChanged = handler;\n    return this;\n  }\n\n  /**\n   * Enables panel options editor creation\n   *\n   * @example\n   * ```typescript\n   *\n   * import { ShapePanel } from './ShapePanel';\n   *\n   * interface ShapePanelOptions {}\n   *\n   * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n   *   .setPanelOptions(builder => {\n   *     builder\n   *       .addSelect({\n   *         id: 'shape',\n   *         name: 'Shape',\n   *         description: 'Select shape to render'\n   *         settings: {\n   *           options: [\n   *             {value: 'circle', label: 'Circle' },\n   *             {value: 'square', label: 'Square },\n   *             {value: 'triangle', label: 'Triangle }\n   *            ]\n   *         },\n   *       })\n   *   })\n   * ```\n   *\n   * @public\n   **/\n  setPanelOptions(builder: PanelOptionsSupplier<TOptions>) {\n    // builder is applied lazily when options UI is created\n    this.optionsSupplier = builder;\n    return this;\n  }\n\n  /**\n   * This is used while building the panel options editor.\n   *\n   * @internal\n   */\n  getPanelOptionsSupplier(): PanelOptionsSupplier<TOptions> {\n    return this.optionsSupplier ?? (() => {});\n  }\n\n  /**\n   * Tells Grafana if the plugin should subscribe to annotation and alertState results.\n   *\n   * @example\n   * ```typescript\n   *\n   * import { ShapePanel } from './ShapePanel';\n   *\n   * interface ShapePanelOptions {}\n   *\n   * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n   *     .useFieldConfig({})\n   *     ...\n   *     ...\n   *     .setDataSupport({\n   *       annotations: true,\n   *       alertStates: true,\n   *     });\n   * ```\n   *\n   * @public\n   **/\n  setDataSupport(support: Partial<PanelPluginDataSupport>) {\n    this.dataSupport = { ...this.dataSupport, ...support };\n    return this;\n  }\n\n  /**\n   * Allows specifying which standard field config options panel should use and defining default values\n   *\n   * @example\n   * ```typescript\n   *\n   * import { ShapePanel } from './ShapePanel';\n   *\n   * interface ShapePanelOptions {}\n   *\n   * // when plugin should use all standard options\n   * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n   *  .useFieldConfig();\n   *\n   * // when plugin should only display specific standard options\n   * // note, that options will be displayed in the order they are provided\n   * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n   *  .useFieldConfig({\n   *    standardOptions: [FieldConfigProperty.Min, FieldConfigProperty.Max]\n   *   });\n   *\n   * // when standard option's default value needs to be provided\n   * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n   *  .useFieldConfig({\n   *    standardOptions: [FieldConfigProperty.Min, FieldConfigProperty.Max],\n   *    standardOptionsDefaults: {\n   *      [FieldConfigProperty.Min]: 20,\n   *      [FieldConfigProperty.Max]: 100\n   *    }\n   *  });\n   *\n   * // when custom field config options needs to be provided\n   * export const plugin = new PanelPlugin<ShapePanelOptions>(ShapePanel)\n   *  .useFieldConfig({\n   *    useCustomConfig: builder => {\n   *      builder\n   *       .addNumberInput({\n   *         id: 'shapeBorderWidth',\n   *         name: 'Border width',\n   *         description: 'Border width of the shape',\n   *         settings: {\n   *           min: 1,\n   *           max: 5,\n   *         },\n   *       })\n   *       .addSelect({\n   *         id: 'displayMode',\n   *         name: 'Display mode',\n   *         description: 'How the shape shout be rendered'\n   *         settings: {\n   *         options: [{value: 'fill', label: 'Fill' }, {value: 'transparent', label: 'Transparent }]\n   *       },\n   *     })\n   *   },\n   *  });\n   *\n   * ```\n   *\n   * @public\n   */\n  useFieldConfig(config: SetFieldConfigOptionsArgs<TFieldConfigOptions> = {}) {\n    // builder is applied lazily when custom field configs are accessed\n    this._initConfigRegistry = () => createFieldConfigRegistry(config, this.meta.name);\n\n    return this;\n  }\n\n  /**\n   * @deprecated use VisualizationSuggestionsSupplier\n   */\n  setSuggestionsSupplier(supplier: VisualizationSuggestionsSupplierDeprecated): this;\n  /**\n   * @alpha\n   * sets function that can return visualization examples and suggestions.\n   */\n  setSuggestionsSupplier(supplier: VisualizationSuggestionsSupplier<TOptions, TFieldConfigOptions>): this;\n  setSuggestionsSupplier(\n    supplier:\n      | VisualizationSuggestionsSupplier<TOptions, TFieldConfigOptions>\n      | VisualizationSuggestionsSupplierDeprecated\n  ): this {\n    if (typeof supplier !== 'function') {\n      deprecationWarning(\n        'PanelPlugin',\n        'plugin.setSuggestionsSupplier(new Supplier())',\n        'plugin.setSuggestionsSupplier(dataSummary => [...])'\n      );\n      return this;\n    }\n    this.suggestionsSupplier = supplier;\n    return this;\n  }\n\n  /**\n   * @alpha\n   * get suggestions based on the PanelDataSummary\n   */\n  getSuggestions(\n    panelDataSummary: PanelDataSummary\n  ): Array<PanelPluginVisualizationSuggestion<TOptions, TFieldConfigOptions>> | void {\n    const withDefaults = (\n      suggestion: VisualizationSuggestion<TOptions, TFieldConfigOptions>\n    ): Omit<PanelPluginVisualizationSuggestion<TOptions, TFieldConfigOptions>, 'hash'> =>\n      defaultsDeep(suggestion, {\n        pluginId: this.meta.id,\n        name: this.meta.name,\n        options: {},\n        fieldConfig: {\n          defaults: {},\n          overrides: [],\n        },\n      } satisfies Omit<PanelPluginVisualizationSuggestion<TOptions, TFieldConfigOptions>, 'hash'>);\n    return this.suggestionsSupplier?.(panelDataSummary)?.map(\n      (s): PanelPluginVisualizationSuggestion<TOptions, TFieldConfigOptions> => {\n        const suggestionWithDefaults = withDefaults(s);\n        return Object.assign(suggestionWithDefaults, { hash: getSuggestionHash(suggestionWithDefaults) });\n      }\n    );\n  }\n\n  /**\n   * @deprecated use getSuggestions\n   * we have to keep this method intact to support cloud-onboarding plugin.\n   */\n  getSuggestionsSupplier() {\n    const withDefaults = (\n      suggestion: VisualizationSuggestion<TOptions, TFieldConfigOptions>\n    ): Omit<PanelPluginVisualizationSuggestion<TOptions, TFieldConfigOptions>, 'hash'> =>\n      defaultsDeep(suggestion, {\n        pluginId: this.meta.id,\n        name: this.meta.name,\n        options: {},\n        fieldConfig: {\n          defaults: {},\n          overrides: [],\n        },\n      } satisfies Omit<PanelPluginVisualizationSuggestion<TOptions, TFieldConfigOptions>, 'hash'>);\n\n    return {\n      getSuggestionsForData: (builder: VisualizationSuggestionsBuilder) => {\n        deprecationWarning('PanelPlugin', 'getSuggestionsSupplier()', 'getSuggestions(panelDataSummary)');\n        this.suggestionsSupplier?.(builder.dataSummary)?.forEach((s) => {\n          builder.getListAppender(withDefaults(s)).append(s);\n        });\n      },\n    };\n  }\n\n  hasPluginId(pluginId: string) {\n    return this.meta.id === pluginId;\n  }\n}\n"],"names":[],"mappings":"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"}