import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { Alert, LoadingPlaceholder, ScrollContainer, useStyles2 } from '@grafana/ui'; import { Trans } from 'app/core/internationalization'; import { contextSrv } from 'app/core/services/context_srv'; import { DashboardModel } from 'app/features/dashboard/state/DashboardModel'; import { PanelModel } from 'app/features/dashboard/state/PanelModel'; import { NewRuleFromPanelButton } from './components/panel-alerts-tab/NewRuleFromPanelButton'; import { RulesTable } from './components/rules/RulesTable'; import { usePanelCombinedRules } from './hooks/usePanelCombinedRules'; import { getRulesPermissions } from './utils/access-control'; import { stringifyErrorLike } from './utils/misc'; interface Props { dashboard: DashboardModel; panel: PanelModel; } export const PanelAlertTabContent = ({ dashboard, panel }: Props) => { const styles = useStyles2(getStyles); const { errors, loading, rules } = usePanelCombinedRules({ dashboardUID: dashboard.uid, panelId: panel.id, poll: true, }); const permissions = getRulesPermissions('grafana'); const canCreateRules = contextSrv.hasPermission(permissions.create); const alert = errors.length ? ( {errors.map((error, index) => (
Failed to load Grafana rules state: {stringifyErrorLike(error)}
))}
) : null; if (loading && !rules.length) { return (
{alert}
); } if (rules.length) { return (
{alert} {!!dashboard.meta.canSave && canCreateRules && ( )}
); } const isNew = !Boolean(dashboard.uid); return (
{alert} {!isNew && ( <>

There are no alert rules linked to this panel.

{!!dashboard.meta.canSave && canCreateRules && } )} {isNew && !!dashboard.meta.canSave && ( Dashboard must be saved before alerts can be added. )}
); }; const getStyles = (theme: GrafanaTheme2) => ({ newButton: css({ marginTop: theme.spacing(3), }), innerWrapper: css({ padding: theme.spacing(2), }), noRulesWrapper: css({ margin: theme.spacing(2), backgroundColor: theme.colors.background.secondary, padding: theme.spacing(3), }), });