import { css } from '@emotion/css'; import { useMemo } from 'react'; import { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data'; import { Icon, Spinner, Stack, Tooltip, useStyles2 } from '@grafana/ui'; import { Trans } from 'app/core/internationalization'; import { CombinedRule } from 'app/types/unified-alerting'; import { PromAlertingRuleState } from 'app/types/unified-alerting-dto'; import { getFirstActiveAt, isAlertingRule, isGrafanaRecordingRule, isRecordingRule } from '../../utils/rules'; import { StateTag } from '../StateTag'; import { AlertStateTag } from './AlertStateTag'; interface Props { rule: CombinedRule; isDeleting: boolean; isCreating: boolean; isPaused?: boolean; } export const RuleState = ({ rule, isDeleting, isCreating, isPaused }: Props) => { const style = useStyles2(getStyle); const { promRule, rulerRule } = rule; // return how long the rule has been in its firing state, if any const RecordingRuleState = () => { if (isPaused && isGrafanaRecordingRule(rulerRule)) { return ( Paused ); } else { return Recording rule; } }; const forTime = useMemo(() => { if ( promRule && isAlertingRule(promRule) && promRule.alerts?.length && promRule.state !== PromAlertingRuleState.Inactive ) { // find earliest alert const firstActiveAt = promRule.activeAt ? new Date(promRule.activeAt) : getFirstActiveAt(promRule); // calculate time elapsed from earliest alert if (firstActiveAt) { return ( for{' '} {intervalToAbbreviatedDurationString( { start: firstActiveAt, end: new Date(), }, false )} ); } } return null; }, [promRule, style]); if (isDeleting) { return ( Deleting ); } else if (isCreating) { return ( Creating ); } else if (promRule && isAlertingRule(promRule)) { return ( {!isPaused && forTime} ); } else if (promRule && isRecordingRule(promRule)) { return ; } return <>n/a; }; const getStyle = (theme: GrafanaTheme2) => ({ for: css({ fontSize: theme.typography.bodySmall.fontSize, color: theme.colors.text.secondary, whiteSpace: 'nowrap', paddingTop: '2px', }), });