| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- // Libraries
- import React, { ChangeEvent, useState, useCallback } from 'react';
- // Components
- import { FormField } from '../FormField/FormField';
- import { FormLabel } from '../FormLabel/FormLabel';
- import { UnitPicker } from '../UnitPicker/UnitPicker';
- // Types
- import { toIntegerOrUndefined, Field, SelectableValue, toFloatOrUndefined, toNumberString } from '@grafana/data';
- import { VAR_SERIES_NAME, VAR_FIELD_NAME, VAR_CALC, VAR_CELL_PREFIX } from '../../utils/fieldDisplay';
- const labelWidth = 6;
- export interface Props {
- showMinMax: boolean;
- value: Partial<Field>;
- onChange: (value: Partial<Field>, event?: React.SyntheticEvent<HTMLElement>) => void;
- }
- export const FieldPropertiesEditor: React.FC<Props> = ({ value, onChange, showMinMax }) => {
- const { unit, title } = value;
- const [decimals, setDecimals] = useState(
- value.decimals !== undefined && value.decimals !== null ? value.decimals.toString() : ''
- );
- const [min, setMin] = useState(toNumberString(value.min));
- const [max, setMax] = useState(toNumberString(value.max));
- const onTitleChange = (event: ChangeEvent<HTMLInputElement>) => {
- onChange({ ...value, title: event.target.value });
- };
- const onDecimalChange = useCallback(
- (event: ChangeEvent<HTMLInputElement>) => {
- setDecimals(event.target.value);
- },
- [value.decimals, onChange]
- );
- const onMinChange = useCallback(
- (event: ChangeEvent<HTMLInputElement>) => {
- setMin(event.target.value);
- },
- [value.min, onChange]
- );
- const onMaxChange = useCallback(
- (event: ChangeEvent<HTMLInputElement>) => {
- setMax(event.target.value);
- },
- [value.max, onChange]
- );
- const onUnitChange = (unit: SelectableValue<string>) => {
- onChange({ ...value, unit: unit.value });
- };
- const commitChanges = useCallback(() => {
- onChange({
- ...value,
- decimals: toIntegerOrUndefined(decimals),
- min: toFloatOrUndefined(min),
- max: toFloatOrUndefined(max),
- });
- }, [min, max, decimals]);
- const titleTooltip = (
- <div>
- Template Variables:
- <br />
- {'$' + VAR_SERIES_NAME}
- <br />
- {'$' + VAR_FIELD_NAME}
- <br />
- {'$' + VAR_CELL_PREFIX + '{N}'} / {'$' + VAR_CALC}
- </div>
- );
- return (
- <>
- <FormField
- label="Title"
- labelWidth={labelWidth}
- onChange={onTitleChange}
- value={title}
- tooltip={titleTooltip}
- placeholder="Auto"
- />
- <div className="gf-form">
- <FormLabel width={labelWidth}>Unit</FormLabel>
- <UnitPicker defaultValue={unit} onChange={onUnitChange} />
- </div>
- {showMinMax && (
- <>
- <FormField
- label="Min"
- labelWidth={labelWidth}
- onChange={onMinChange}
- onBlur={commitChanges}
- value={min}
- type="number"
- />
- <FormField
- label="Max"
- labelWidth={labelWidth}
- onChange={onMaxChange}
- onBlur={commitChanges}
- value={max}
- type="number"
- />
- </>
- )}
- <FormField
- label="Decimals"
- labelWidth={labelWidth}
- placeholder="auto"
- onChange={onDecimalChange}
- onBlur={commitChanges}
- value={decimals}
- type="number"
- />
- </>
- );
- };
|