diff --git a/public/app/features/connections/hooks/useDataSourceSettingsNav.ts b/public/app/features/connections/hooks/useDataSourceSettingsNav.ts index 72c4a09059a..707db68d9b7 100644 --- a/public/app/features/connections/hooks/useDataSourceSettingsNav.ts +++ b/public/app/features/connections/hooks/useDataSourceSettingsNav.ts @@ -52,6 +52,18 @@ export function useDataSourceSettingsNav(pageIdParam?: string) { pageNav = getNavModel(navIndex, navIndexId, getDataSourceLoadingNav('settings')); } + if (!datasource.uid) { + const node: NavModelItem = { + text: t('connections.use-data-source-settings-nav.node.subTitle.data-source-error', 'Data Source Error'), + icon: 'exclamation-triangle', + }; + + pageNav = { + node: node, + main: node, + }; + } + if (plugin) { pageNav = getNavModel( navIndex, @@ -64,8 +76,8 @@ export function useDataSourceSettingsNav(pageIdParam?: string) { ...pageNav.main, dataSourcePluginName: datasourcePlugin?.name || plugin?.meta.name || '', active: true, - text: datasource.name, - subTitle: `Type: ${dataSourceMeta.name}`, + text: datasource.name || '', + subTitle: dataSourceMeta.name ? `Type: ${dataSourceMeta.name}` : '', children: (pageNav.main.children || []).map((navModelItem) => ({ ...navModelItem, url: navModelItem.url?.replace('datasources/edit/', '/connections/datasources/edit/'), diff --git a/public/app/features/datasources/components/DataSourceLoadError.tsx b/public/app/features/datasources/components/DataSourceLoadError.tsx index bbe41e93b69..10dee3f85b6 100644 --- a/public/app/features/datasources/components/DataSourceLoadError.tsx +++ b/public/app/features/datasources/components/DataSourceLoadError.tsx @@ -1,5 +1,5 @@ -import { Trans } from '@grafana/i18n'; -import { Button } from '@grafana/ui'; +import { t, Trans } from '@grafana/i18n'; +import { Button, EmptyState } from '@grafana/ui'; import { DataSourceRights } from '../types'; @@ -8,9 +8,10 @@ import { DataSourceReadOnlyMessage } from './DataSourceReadOnlyMessage'; export type Props = { dataSourceRights: DataSourceRights; onDelete: () => void; + notFound: boolean; }; -export function DataSourceLoadError({ dataSourceRights, onDelete }: Props) { +export function DataSourceLoadError({ dataSourceRights, onDelete, notFound }: Props) { const { readOnly, hasDeleteRights } = dataSourceRights; const canDelete = !readOnly && hasDeleteRights; const navigateBack = () => window.history.back(); @@ -20,6 +21,12 @@ export function DataSourceLoadError({ dataSourceRights, onDelete }: Props) { {readOnly && }
+ {notFound && ( + + )} {canDelete && (