import React, { FC, useState } from 'react'; import { css } from '@emotion/css'; import { GrafanaTheme, parseDuration, durationToMilliseconds } from '@grafana/data'; import { Field, InlineLabel, Input, InputControl, Switch, useStyles } 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'; 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 = useStyles(getStyles); const [showErrorHandling, setShowErrorHandling] = useState(false); const { register, formState: { errors }, } = useFormContext(); return (
Evaluate every for
setShowErrorHandling(!showErrorHandling)} /> {showErrorHandling && ( <> ( onChange(value?.value)} /> )} name="noDataState" /> ( onChange(value?.value)} /> )} name="execErrState" /> )}
); }; const getStyles = (theme: GrafanaTheme) => ({ inlineField: css` margin-bottom: 0; `, flexRow: css` display: flex; flex-direction: row; justify-content: flex-start; align-items: flex-start; `, switchField: css` display: inline-flex; flex-direction: row-reverse; margin-top: ${theme.spacing.md}; & > div:first-child { margin-left: ${theme.spacing.sm}; } `, });