import { css } from '@emotion/css'; import { GrafanaTheme2, urlUtil } from '@grafana/data'; import { Button, ConfirmModal, HorizontalGroup, LinkButton, useStyles2 } from '@grafana/ui'; import { contextSrv } from 'app/core/services/context_srv'; import { CombinedRule, RulesSource } from 'app/types/unified-alerting'; import React, { FC, useState } from 'react'; import { useDispatch } from 'react-redux'; import { useLocation } from 'react-router-dom'; import { useIsRuleEditable } from '../../hooks/useIsRuleEditable'; import { deleteRuleAction } from '../../state/actions'; import { Annotation } from '../../utils/constants'; import { getRulesSourceName, isCloudRulesSource } from '../../utils/datasource'; import { createExploreLink } from '../../utils/misc'; import { getRuleIdentifier, stringifyRuleIdentifier } from '../../utils/rules'; interface Props { rule: CombinedRule; rulesSource: RulesSource; } export const RuleDetailsActionButtons: FC = ({ rule, rulesSource }) => { const dispatch = useDispatch(); const location = useLocation(); const style = useStyles2(getStyles); const { namespace, group, rulerRule } = rule; const [ruleToDelete, setRuleToDelete] = useState(); const leftButtons: JSX.Element[] = []; const rightButtons: JSX.Element[] = []; const { isEditable } = useIsRuleEditable(rulerRule); const deleteRule = () => { if (ruleToDelete && ruleToDelete.rulerRule) { dispatch( deleteRuleAction( getRuleIdentifier( getRulesSourceName(ruleToDelete.namespace.rulesSource), ruleToDelete.namespace.name, ruleToDelete.group.name, ruleToDelete.rulerRule ) ) ); setRuleToDelete(undefined); } }; // explore does not support grafana rule queries atm if (isCloudRulesSource(rulesSource) && contextSrv.isEditor) { leftButtons.push( See graph ); } if (rule.annotations[Annotation.runbookURL]) { leftButtons.push( View runbook ); } if (rule.annotations[Annotation.dashboardUID]) { const dashboardUID = rule.annotations[Annotation.dashboardUID]; if (dashboardUID) { leftButtons.push( Go to dashboard ); const panelId = rule.annotations[Annotation.panelID]; if (panelId) { leftButtons.push( Go to panel ); } } } if (isEditable && rulerRule) { const editURL = urlUtil.renderUrl( `/alerting/${encodeURIComponent( stringifyRuleIdentifier( getRuleIdentifier(getRulesSourceName(rulesSource), namespace.name, group.name, rulerRule) ) )}/edit`, { returnTo: location.pathname + location.search, } ); rightButtons.push( Edit , ); } if (leftButtons.length || rightButtons.length) { return ( <>
{leftButtons.length ? leftButtons :
} {rightButtons.length ? rightButtons :
}
{!!ruleToDelete && ( setRuleToDelete(undefined)} /> )} ); } return null; }; export const getStyles = (theme: GrafanaTheme2) => ({ wrapper: css` padding: ${theme.spacing(2)} 0; display: flex; flex-direction: row; justify-content: space-between; border-bottom: solid 1px ${theme.colors.border.medium}; `, button: css` height: 24px; font-size: ${theme.typography.size.sm}; `, });