import './RuleOptions.styles.scss'; import { Checkbox, Collapse, Form, InputNumber, InputNumberProps, Select, SelectProps, Space, Typography, } from 'antd'; import { DefaultOptionType } from 'antd/es/select'; import { getCategoryByOptionId, getCategorySelectOptionByName, } from 'container/NewWidget/RightContainer/alertFomatCategories'; import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder'; import { useTranslation } from 'react-i18next'; import { AlertDef, defaultAlgorithm, defaultCompareOp, defaultEvalWindow, defaultFrequency, defaultMatchType, defaultSeasonality, } from 'types/api/alerts/def'; import { EQueryType } from 'types/common/dashboard'; import { popupContainer } from 'utils/selectPopupContainer'; import { AlertDetectionTypes } from '.'; import { FormContainer, InlineSelect, StepHeading, VerticalLine, } from './styles'; function RuleOptions({ alertDef, setAlertDef, queryCategory, queryOptions, }: RuleOptionsProps): JSX.Element { // init namespace for translations const { t } = useTranslation('alerts'); const { currentQuery } = useQueryBuilder(); const { ruleType } = alertDef; const handleMatchOptChange = (value: string | unknown): void => { const m = (value as string) || alertDef.condition?.matchType; setAlertDef({ ...alertDef, condition: { ...alertDef.condition, matchType: m, }, }); }; const onChangeSelectedQueryName = (value: string | unknown): void => { if (typeof value !== 'string') return; setAlertDef({ ...alertDef, condition: { ...alertDef.condition, selectedQueryName: value, }, }); }; const renderCompareOps = (): JSX.Element => ( { const newOp = (value as string) || ''; setAlertDef({ ...alertDef, condition: { ...alertDef.condition, op: newOp, }, }); }} > {t('option_above')} {t('option_below')} {/* hide equal and not eqaul in case of analmoy based alert */} {ruleType !== 'anomaly_rule' && ( <> {t('option_equal')} {t('option_notequal')} )} {/* the value 5 and 6 are reserved for above or equal and below or equal */} {ruleType === 'anomaly_rule' && ( {t('option_above_below')} )} ); const renderMatchOpts = (): JSX.Element => ( handleMatchOptChange(value)} > {t('option_atleastonce')} {t('option_allthetimes')} {ruleType !== 'anomaly_rule' && ( <> {t('option_onaverage')} {t('option_intotal')} {t('option_last')} )} ); const onChangeEvalWindow = (value: string | unknown): void => { const ew = (value as string) || alertDef.evalWindow; setAlertDef({ ...alertDef, evalWindow: ew, }); }; const onChangeAlgorithm = (value: string | unknown): void => { const alg = (value as string) || alertDef.condition.algorithm; setAlertDef({ ...alertDef, condition: { ...alertDef.condition, algorithm: alg, }, }); }; const onChangeSeasonality = (value: string | unknown): void => { const seasonality = (value as string) || alertDef.condition.seasonality; setAlertDef({ ...alertDef, condition: { ...alertDef.condition, seasonality, }, }); }; const onChangeDeviation = (value: number): void => { const target = value || alertDef.condition.target || 3; setAlertDef({ ...alertDef, condition: { ...alertDef.condition, target: Number(target) }, }); }; const renderEvalWindows = (): JSX.Element => ( {t('option_5min')} {t('option_10min')} {t('option_15min')} {t('option_60min')} {t('option_4hours')} {t('option_24hours')} ); const renderPromEvalWindows = (): JSX.Element => ( {t('option_5min')} {t('option_10min')} {t('option_15min')} ); const renderAlgorithms = (): JSX.Element => ( Standard ); const renderDeviationOpts = (): JSX.Element => ( { if (typeof value === 'number') { onChangeDeviation(value); } }} > 1 2 3 4 5 6 7 ); const renderSeasonality = (): JSX.Element => ( Hourly Daily Weekly ); const renderThresholdRuleOpts = (): JSX.Element => ( {t('text_condition1')} is {renderCompareOps()} {t('text_condition2')} {renderMatchOpts()}{' '} {t('text_condition3')} {renderEvalWindows()} ); const renderPromRuleOptions = (): JSX.Element => ( {t('text_condition1')} is {renderCompareOps()} {t('text_condition2')} {renderMatchOpts()} {t('text_condition3')} {renderPromEvalWindows()} ); const onChange: InputNumberProps['onChange'] = (value): void => { setAlertDef({ ...alertDef, condition: { ...alertDef.condition, op: alertDef.condition?.op || defaultCompareOp, matchType: alertDef.condition?.matchType || defaultMatchType, target: Number(value) || 0, }, }); }; const onChangeAlertUnit: SelectProps['onChange'] = (value) => { setAlertDef({ ...alertDef, condition: { ...alertDef.condition, targetUnit: value as string, }, }); }; const onChangeFrequency = (value: string | unknown): void => { const freq = (value as string) || alertDef.frequency; setAlertDef({ ...alertDef, frequency: freq, }); }; const renderAnomalyRuleOpts = (): JSX.Element => ( {t('text_condition1_anomaly')} {t('text_condition3')} {renderEvalWindows()} is {renderDeviationOpts()} deviations {renderCompareOps()} the predicted data {renderMatchOpts()} using the {renderAlgorithms()} algorithm with {renderSeasonality()}{' '} seasonality ); const renderFrequency = (): JSX.Element => ( {t('option_1min')} {t('option_5min')} {t('option_10min')} {t('option_15min')} {t('option_30min')} {t('option_60min')} {t('option_3hours')} {t('option_6hours')} {t('option_12hours')} {t('option_24hours')} ); const selectedCategory = getCategoryByOptionId(currentQuery?.unit || ''); const categorySelectOptions = getCategorySelectOptionByName( selectedCategory?.name, ); return ( <> {t('alert_form_step3')} {queryCategory === EQueryType.PROM && renderPromRuleOptions()} {queryCategory !== EQueryType.PROM && ruleType === AlertDetectionTypes.ANOMALY_DETECTION_ALERT && ( <>{renderAnomalyRuleOpts()} )} {queryCategory !== EQueryType.PROM && ruleType === AlertDetectionTypes.THRESHOLD_ALERT && renderThresholdRuleOpts()} {ruleType !== AlertDetectionTypes.ANOMALY_DETECTION_ALERT && ( e.currentTarget.blur()} />