diff --git a/public/app/features/dashboard-scene/panel-edit/PanelEditControls.tsx b/public/app/features/dashboard-scene/panel-edit/PanelEditControls.tsx index 6a2478a0ac2..81796cd7bdd 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelEditControls.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelEditControls.tsx @@ -13,7 +13,7 @@ export interface Props { export function PanelEditControls({ panelEditor }: Props) { const vizManager = panelEditor.state.vizManager; const { panel, tableView } = vizManager.useState(); - const skipDataQuery = config.panels[panel.state.pluginId].skipDataQuery; + const skipDataQuery = config.panels[panel.state.pluginId]?.skipDataQuery; return ( <> diff --git a/public/app/features/dashboard-scene/panel-edit/PanelEditor.tsx b/public/app/features/dashboard-scene/panel-edit/PanelEditor.tsx index c72f1253413..bc2e1d7ba16 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelEditor.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelEditor.tsx @@ -64,7 +64,7 @@ export class PanelEditor extends SceneObjectBase { } private _initDataPane(pluginId: string) { - const skipDataQuery = config.panels[pluginId].skipDataQuery; + const skipDataQuery = config.panels[pluginId]?.skipDataQuery; if (skipDataQuery && this.state.dataPane) { locationService.partial({ tab: null }, true); diff --git a/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.tsx b/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.tsx index 5071652c660..a5b67dcf473 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.tsx @@ -1,11 +1,12 @@ import { css } from '@emotion/css'; import React, { useMemo } from 'react'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2, PanelPluginMeta } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { SceneComponentProps, SceneObjectBase, SceneObjectState, sceneGraph } from '@grafana/scenes'; import { FilterInput, Stack, ToolbarButton, useStyles2 } from '@grafana/ui'; import { OptionFilter } from 'app/features/dashboard/components/PanelEditor/OptionsPaneOptions'; +import { getPanelPluginNotFound } from 'app/features/panel/components/PanelPluginError'; import { getAllPanelPluginMeta } from 'app/features/panel/state/util'; import { PanelEditor } from './PanelEditor'; @@ -108,7 +109,15 @@ interface VisualizationButtonProps { export function VisualizationButton({ pluginId, onOpen }: VisualizationButtonProps) { const styles = useStyles2(getVizButtonStyles); - const pluginMeta = useMemo(() => getAllPanelPluginMeta().filter((p) => p.id === pluginId)[0], [pluginId]); + let pluginMeta: PanelPluginMeta | undefined = useMemo( + () => getAllPanelPluginMeta().filter((p) => p.id === pluginId)[0], + [pluginId] + ); + + if (!pluginMeta) { + const notFound = getPanelPluginNotFound(`Panel plugin not found (${pluginId})`, true); + pluginMeta = notFound.meta; + } return (