import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { config } from '@grafana/runtime'; import { SceneComponentProps, SceneObjectBase, SceneObjectRef, SceneObjectState, VizPanel } from '@grafana/scenes'; import { Alert, LoadingPlaceholder, Tab, useStyles2 } from '@grafana/ui'; import { contextSrv } from 'app/core/core'; import { Trans } from 'app/core/internationalization'; import { RulesTable } from 'app/features/alerting/unified/components/rules/RulesTable'; import { usePanelCombinedRules } from 'app/features/alerting/unified/hooks/usePanelCombinedRules'; import { getRulesPermissions } from 'app/features/alerting/unified/utils/access-control'; import { stringifyErrorLike } from 'app/features/alerting/unified/utils/misc'; import { getDashboardSceneFor, getPanelIdForVizPanel } from '../../utils/utils'; import { ScenesNewRuleFromPanelButton } from './NewAlertRuleButton'; import { PanelDataPaneTab, PanelDataTabHeaderProps, TabId } from './types'; export interface PanelDataAlertingTabState extends SceneObjectState { panelRef: SceneObjectRef; } export class PanelDataAlertingTab extends SceneObjectBase implements PanelDataPaneTab { static Component = PanelDataAlertingTabRendered; public tabId = TabId.Alert; public renderTab(props: PanelDataTabHeaderProps) { return ; } public getTabLabel() { return 'Alert'; } public getDashboardUID() { const dashboard = this.getDashboard(); return dashboard.state.uid!; } public getDashboard() { return getDashboardSceneFor(this); } public getLegacyPanelId() { return getPanelIdForVizPanel(this.state.panelRef.resolve()); } public getCanCreateRules() { const rulesPermissions = getRulesPermissions('grafana'); return ( config.unifiedAlerting && this.getDashboard().state.meta.canSave && contextSrv.hasPermission(rulesPermissions.create) ); } } export function PanelDataAlertingTabRendered({ model }: SceneComponentProps) { const styles = useStyles2(getStyles); const { errors, loading, rules } = usePanelCombinedRules({ dashboardUID: model.getDashboardUID(), panelId: model.getLegacyPanelId(), }); const alert = errors.length ? ( {errors.map((error, index) => (
Failed to load Grafana rules state: {stringifyErrorLike(error)}
))}
) : null; if (loading && !rules.length) { return ( <> {alert} ); } const panel = model.state.panelRef.resolve(); const canCreateRules = model.getCanCreateRules(); if (rules.length) { return ( <> {canCreateRules && } ); } const isNew = !Boolean(model.getDashboardUID()); const dashboard = model.getDashboard(); return (
{!isNew && ( <>

There are no alert rules linked to this panel.

{canCreateRules && } )} {isNew && !!dashboard.state.meta.canSave && ( Dashboard must be saved before alerts can be added. )}
); } const getStyles = (theme: GrafanaTheme2) => ({ newButton: css({ marginTop: theme.spacing(3), }), noRulesWrapper: css({ margin: theme.spacing(2), backgroundColor: theme.colors.background.secondary, padding: theme.spacing(3), }), }); interface PanelDataAlertingTabHeaderProps extends PanelDataTabHeaderProps { model: PanelDataAlertingTab; } function AlertingTab(props: PanelDataAlertingTabHeaderProps) { const { model } = props; const { rules } = usePanelCombinedRules({ dashboardUID: model.getDashboardUID(), panelId: model.getLegacyPanelId(), poll: false, }); return ( ); }