import * as React from 'react'; import { CoreApp, SelectableValue } from '@grafana/data'; import { Trans, t } from '@grafana/i18n'; import { Alert, InlineField, InlineFieldRow, Input, Select, TextLink } from '@grafana/ui'; import { ExpressionQuery, ExpressionQuerySettings, ReducerMode, reducerModes, reducerTypes } from '../types'; interface Props { app?: CoreApp; labelWidth?: number | 'auto'; refIds: Array>; query: ExpressionQuery; onChange: (query: ExpressionQuery) => void; } export const Reduce = ({ labelWidth = 'auto', onChange, app, refIds, query }: Props) => { const reducer = reducerTypes.find((o) => o.value === query.reducer); const onRefIdChange = (value: SelectableValue) => { onChange({ ...query, expression: value.value }); }; const onSelectReducer = (value: SelectableValue) => { onChange({ ...query, reducer: value.value }); }; const onSettingsChanged = (settings: ExpressionQuerySettings) => { onChange({ ...query, settings: settings }); }; const onModeChanged = (value: SelectableValue) => { let newSettings: ExpressionQuerySettings; switch (value.value) { case ReducerMode.Strict: newSettings = { mode: ReducerMode.Strict }; break; case ReducerMode.ReplaceNonNumbers: let replaceWithNumber = 0; if (query.settings?.mode === ReducerMode.ReplaceNonNumbers) { replaceWithNumber = query.settings?.replaceWithValue ?? 0; } newSettings = { mode: ReducerMode.ReplaceNonNumbers, replaceWithValue: replaceWithNumber, }; break; default: newSettings = { mode: value.value, }; } onSettingsChanged(newSettings); }; const onReplaceWithChanged = (e: React.FormEvent) => { const value = e.currentTarget.valueAsNumber; onSettingsChanged({ mode: ReducerMode.ReplaceNonNumbers, replaceWithValue: value ?? 0 }); }; const mode = query.settings?.mode ?? ReducerMode.Strict; const replaceWithNumber = () => { if (mode !== ReducerMode.ReplaceNonNumbers) { return; } return ( ); }; // for Alerting we really don't want to add additional confusing messages that would be unhelpful to the majority of our users const strictModeNotification = () => { const isWithinAlerting = app === CoreApp.UnifiedAlerting; if (mode !== ReducerMode.Strict || isWithinAlerting) { return null; } return ( When Reduce Strict mode is used, the fill(null) function (InfluxQL) will result in{' '} NaN.{' '} See the documentation for more details. ); }; return ( <> {strictModeNotification()}