import React, { FC, useState } from 'react'; import { css } from '@emotion/css'; import { parseDuration, durationToMilliseconds, GrafanaTheme2 } from '@grafana/data'; import { Field, InlineLabel, Input, InputControl, useStyles2 } from '@grafana/ui'; import { useFormContext, RegisterOptions } from 'react-hook-form'; import { RuleFormValues } from '../../types/rule-form'; import { positiveDurationValidationPattern, durationValidationPattern } from '../../utils/time'; import { ConditionField } from './ConditionField'; import { GrafanaAlertStatePicker } from './GrafanaAlertStatePicker'; import { RuleEditorSection } from './RuleEditorSection'; import { PreviewRule } from './PreviewRule'; import { GrafanaConditionEvalWarning } from './GrafanaConditionEvalWarning'; import { CollapseToggle } from '../CollapseToggle'; const MIN_TIME_RANGE_STEP_S = 10; // 10 seconds const forValidationOptions: RegisterOptions = { required: { value: true, message: 'Required.', }, pattern: durationValidationPattern, }; const evaluateEveryValidationOptions: RegisterOptions = { required: { value: true, message: 'Required.', }, pattern: positiveDurationValidationPattern, validate: (value: string) => { const duration = parseDuration(value); if (Object.keys(duration).length) { const diff = durationToMilliseconds(duration); if (diff < MIN_TIME_RANGE_STEP_S * 1000) { return `Cannot be less than ${MIN_TIME_RANGE_STEP_S} seconds.`; } if (diff % (MIN_TIME_RANGE_STEP_S * 1000) !== 0) { return `Must be a multiple of ${MIN_TIME_RANGE_STEP_S} seconds.`; } } return true; }, }; export const GrafanaConditionsStep: FC = () => { const styles = useStyles2(getStyles); const [showErrorHandling, setShowErrorHandling] = useState(false); const { register, formState: { errors }, } = useFormContext(); return (
Evaluate every for
setShowErrorHandling(!collapsed)} text="Configure no data and error handling" className={styles.collapseToggle} /> {showErrorHandling && ( <> ( onChange(value?.value)} /> )} name="noDataState" /> ( onChange(value?.value)} /> )} name="execErrState" /> )}
); }; const getStyles = (theme: GrafanaTheme2) => ({ inlineField: css` margin-bottom: 0; `, flexRow: css` display: flex; flex-direction: row; justify-content: flex-start; align-items: flex-start; `, collapseToggle: css` margin: ${theme.spacing(2, 0, 2, -1)}; `, });