import { css, cx } from '@emotion/css'; import React, { HTMLAttributes } from 'react'; import { DataSourceSettings as DataSourceSettingsType, GrafanaTheme2 } from '@grafana/data'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors'; import { TestingStatus, config } from '@grafana/runtime'; import { AlertVariant, Alert, useTheme2, Link } from '@grafana/ui'; import { contextSrv } from '../../../core/core'; import { AccessControlAction } from '../../../types'; import { trackCreateDashboardClicked } from '../tracking'; export type Props = { testingStatus?: TestingStatus; exploreUrl: string; dataSource: DataSourceSettingsType; }; interface AlertMessageProps extends HTMLAttributes { title: string; severity?: AlertVariant; exploreUrl: string; dataSourceId: string; onDashboardLinkClicked: () => void; } const getStyles = (theme: GrafanaTheme2, hasTitle: boolean) => { return { content: css` color: ${theme.colors.text.secondary}; padding-top: ${hasTitle ? theme.spacing(1) : 0}; max-height: 50vh; overflow-y: auto; `, disabled: css` pointer-events: none; color: ${theme.colors.text.secondary}; `, }; }; const AlertSuccessMessage = ({ title, exploreUrl, dataSourceId, onDashboardLinkClicked }: AlertMessageProps) => { const theme = useTheme2(); const hasTitle = Boolean(title); const styles = getStyles(theme, hasTitle); const canExploreDataSources = contextSrv.hasPermission(AccessControlAction.DataSourcesExplore); return (
Next, you can start to visualize data by{' '} building a dashboard , or by querying data in the{' '} Explore view .
); }; AlertSuccessMessage.displayName = 'AlertSuccessMessage'; const alertVariants = new Set(['success', 'info', 'warning', 'error']); const isAlertVariant = (str: string): str is AlertVariant => alertVariants.has(str as AlertVariant); const getAlertVariant = (status: string): AlertVariant => { if (status.toLowerCase() === 'ok') { return 'success'; } return isAlertVariant(status) ? status : 'info'; }; export function DataSourceTestingStatus({ testingStatus, exploreUrl, dataSource }: Props) { const severity = getAlertVariant(testingStatus?.status ?? 'error'); const message = testingStatus?.message; const detailsMessage = testingStatus?.details?.message; const detailsVerboseMessage = testingStatus?.details?.verboseMessage; const onDashboardLinkClicked = () => { trackCreateDashboardClicked({ grafana_version: config.buildInfo.version, datasource_uid: dataSource.uid, plugin_name: dataSource.typeName, path: location.pathname, }); }; if (message) { return (
{testingStatus?.details && ( <> {detailsMessage} {severity === 'success' ? ( ) : null} {detailsVerboseMessage ? (
{String(detailsVerboseMessage)}
) : null} )}
); } return null; }