mirror of https://github.com/grafana/grafana
Timeseries: add UI to control the span nulls threshold (#32222)
parent
d33a77a67f
commit
ea186947d2
@ -0,0 +1,65 @@ |
|||||||
|
import React from 'react'; |
||||||
|
import { FieldOverrideEditorProps, rangeUtil, SelectableValue } from '@grafana/data'; |
||||||
|
import { HorizontalGroup, Input, RadioButtonGroup } from '@grafana/ui'; |
||||||
|
|
||||||
|
const GAPS_OPTIONS: Array<SelectableValue<boolean | number>> = [ |
||||||
|
{ |
||||||
|
label: 'Never', |
||||||
|
value: false, |
||||||
|
}, |
||||||
|
{ |
||||||
|
label: 'Always', |
||||||
|
value: true, |
||||||
|
}, |
||||||
|
{ |
||||||
|
label: 'Threshold', |
||||||
|
value: 3600000, // 1h
|
||||||
|
}, |
||||||
|
]; |
||||||
|
|
||||||
|
export const SpanNullsEditor: React.FC<FieldOverrideEditorProps<boolean | number, any>> = ({ value, onChange }) => { |
||||||
|
const isThreshold = typeof value === 'number'; |
||||||
|
const formattedTime = isThreshold ? rangeUtil.secondsToHms((value as number) / 1000) : undefined; |
||||||
|
GAPS_OPTIONS[2].value = isThreshold ? (value as number) : 3600000; // 1h
|
||||||
|
|
||||||
|
const checkAndUpdate = (txt: string) => { |
||||||
|
let val: boolean | number = false; |
||||||
|
if (txt) { |
||||||
|
try { |
||||||
|
val = rangeUtil.intervalToSeconds(txt) * 1000; |
||||||
|
} catch (err) { |
||||||
|
console.warn('ERROR', err); |
||||||
|
} |
||||||
|
} |
||||||
|
onChange(val); |
||||||
|
}; |
||||||
|
|
||||||
|
const handleEnterKey = (e: React.KeyboardEvent<HTMLInputElement>) => { |
||||||
|
if (e.key !== 'Enter') { |
||||||
|
return; |
||||||
|
} |
||||||
|
checkAndUpdate((e.target as any).value); |
||||||
|
}; |
||||||
|
|
||||||
|
const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => { |
||||||
|
checkAndUpdate(e.target.value); |
||||||
|
}; |
||||||
|
|
||||||
|
return ( |
||||||
|
<HorizontalGroup> |
||||||
|
<RadioButtonGroup value={value} options={GAPS_OPTIONS} onChange={onChange} /> |
||||||
|
{isThreshold && ( |
||||||
|
<Input |
||||||
|
autoFocus={true} |
||||||
|
placeholder="never" |
||||||
|
width={10} |
||||||
|
defaultValue={formattedTime} |
||||||
|
onKeyDown={handleEnterKey} |
||||||
|
onBlur={handleBlur} |
||||||
|
prefix={<div><</div>} |
||||||
|
spellCheck={false} |
||||||
|
/> |
||||||
|
)} |
||||||
|
</HorizontalGroup> |
||||||
|
); |
||||||
|
}; |
Loading…
Reference in new issue