|
@@ -1,5 +1,5 @@
|
|
|
// Libraries
|
|
// Libraries
|
|
|
-import React, { PureComponent, ChangeEvent } from 'react';
|
|
|
|
|
|
|
+import React, { ChangeEvent, useState, useCallback } from 'react';
|
|
|
|
|
|
|
|
// Components
|
|
// Components
|
|
|
import { FormField } from '../FormField/FormField';
|
|
import { FormField } from '../FormField/FormField';
|
|
@@ -8,7 +8,7 @@ import { UnitPicker } from '../UnitPicker/UnitPicker';
|
|
|
|
|
|
|
|
// Types
|
|
// Types
|
|
|
import { Field } from '../../types/data';
|
|
import { Field } from '../../types/data';
|
|
|
-import { toNumberString, toIntegerOrUndefined } from '../../utils';
|
|
|
|
|
|
|
+import { toIntegerOrUndefined } from '../../utils';
|
|
|
import { SelectOptionItem } from '../Select/Select';
|
|
import { SelectOptionItem } from '../Select/Select';
|
|
|
|
|
|
|
|
import { VAR_SERIES_NAME, VAR_FIELD_NAME, VAR_CALC, VAR_CELL_PREFIX } from '../../utils/fieldDisplay';
|
|
import { VAR_SERIES_NAME, VAR_FIELD_NAME, VAR_CALC, VAR_CELL_PREFIX } from '../../utils/fieldDisplay';
|
|
@@ -21,92 +21,108 @@ export interface Props {
|
|
|
onChange: (value: Partial<Field>, event?: React.SyntheticEvent<HTMLElement>) => void;
|
|
onChange: (value: Partial<Field>, event?: React.SyntheticEvent<HTMLElement>) => void;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-export class FieldPropertiesEditor extends PureComponent<Props> {
|
|
|
|
|
- onTitleChange = (event: ChangeEvent<HTMLInputElement>) =>
|
|
|
|
|
- this.props.onChange({ ...this.props.value, title: event.target.value });
|
|
|
|
|
|
|
+export const FieldPropertiesEditor: React.FC<Props> = ({ value, onChange, showMinMax }) => {
|
|
|
|
|
+ const { unit, title } = value;
|
|
|
|
|
|
|
|
- // @ts-ignore
|
|
|
|
|
- onUnitChange = (unit: SelectOptionItem<string>) => this.props.onChange({ ...this.props.value, unit: unit.value });
|
|
|
|
|
|
|
+ const [decimals, setDecimals] = useState(
|
|
|
|
|
+ value.decimals !== undefined && value.decimals !== null ? value.decimals.toString() : ''
|
|
|
|
|
+ );
|
|
|
|
|
+ const [min, setMin] = useState(value.min !== undefined && value.min !== null ? value.min.toString() : '');
|
|
|
|
|
+ const [max, setMax] = useState(value.max !== undefined && value.max !== null ? value.max.toString() : '');
|
|
|
|
|
|
|
|
- onDecimalChange = (event: ChangeEvent<HTMLInputElement>) => {
|
|
|
|
|
- this.props.onChange({
|
|
|
|
|
- ...this.props.value,
|
|
|
|
|
- decimals: toIntegerOrUndefined(event.target.value),
|
|
|
|
|
- });
|
|
|
|
|
|
|
+ const onTitleChange = (event: ChangeEvent<HTMLInputElement>) => {
|
|
|
|
|
+ onChange({ ...value, title: event.target.value });
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- onMinChange = (event: ChangeEvent<HTMLInputElement>) => {
|
|
|
|
|
- this.props.onChange({
|
|
|
|
|
- ...this.props.value,
|
|
|
|
|
- min: toIntegerOrUndefined(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: SelectOptionItem<string>) => {
|
|
|
|
|
+ onChange({ ...value, unit: unit.value });
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
- onMaxChange = (event: ChangeEvent<HTMLInputElement>) => {
|
|
|
|
|
- this.props.onChange({
|
|
|
|
|
- ...this.props.value,
|
|
|
|
|
- max: toIntegerOrUndefined(event.target.value),
|
|
|
|
|
|
|
+ const commitChanges = useCallback(() => {
|
|
|
|
|
+ onChange({
|
|
|
|
|
+ ...value,
|
|
|
|
|
+ decimals: toIntegerOrUndefined(decimals),
|
|
|
|
|
+ min: toIntegerOrUndefined(min),
|
|
|
|
|
+ max: toIntegerOrUndefined(max),
|
|
|
});
|
|
});
|
|
|
- };
|
|
|
|
|
|
|
+ }, [min, max, decimals]);
|
|
|
|
|
|
|
|
- render() {
|
|
|
|
|
- const { showMinMax } = this.props;
|
|
|
|
|
- const { unit, decimals, min, max } = this.props.value;
|
|
|
|
|
|
|
+ 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"
|
|
|
|
|
+ />
|
|
|
|
|
|
|
|
- const titleTooltip = (
|
|
|
|
|
- <div>
|
|
|
|
|
- Template Variables:
|
|
|
|
|
- <br />
|
|
|
|
|
- {'$' + VAR_SERIES_NAME}
|
|
|
|
|
- <br />
|
|
|
|
|
- {'$' + VAR_FIELD_NAME}
|
|
|
|
|
- <br />
|
|
|
|
|
- {'$' + VAR_CELL_PREFIX + '{N}'} / {'$' + VAR_CALC}
|
|
|
|
|
|
|
+ <div className="gf-form">
|
|
|
|
|
+ <FormLabel width={labelWidth}>Unit</FormLabel>
|
|
|
|
|
+ <UnitPicker defaultValue={unit} onChange={onUnitChange} />
|
|
|
</div>
|
|
</div>
|
|
|
- );
|
|
|
|
|
-
|
|
|
|
|
- return (
|
|
|
|
|
- <>
|
|
|
|
|
- <FormField
|
|
|
|
|
- label="Title"
|
|
|
|
|
- labelWidth={labelWidth}
|
|
|
|
|
- onChange={this.onTitleChange}
|
|
|
|
|
- value={this.props.value.title}
|
|
|
|
|
- tooltip={titleTooltip}
|
|
|
|
|
- placeholder="Auto"
|
|
|
|
|
- />
|
|
|
|
|
-
|
|
|
|
|
- <div className="gf-form">
|
|
|
|
|
- <FormLabel width={labelWidth}>Unit</FormLabel>
|
|
|
|
|
- <UnitPicker defaultValue={unit} onChange={this.onUnitChange} />
|
|
|
|
|
- </div>
|
|
|
|
|
- {showMinMax && (
|
|
|
|
|
- <>
|
|
|
|
|
- <FormField
|
|
|
|
|
- label="Min"
|
|
|
|
|
- labelWidth={labelWidth}
|
|
|
|
|
- onChange={this.onMinChange}
|
|
|
|
|
- value={toNumberString(min)}
|
|
|
|
|
- type="number"
|
|
|
|
|
- />
|
|
|
|
|
- <FormField
|
|
|
|
|
- label="Max"
|
|
|
|
|
- labelWidth={labelWidth}
|
|
|
|
|
- onChange={this.onMaxChange}
|
|
|
|
|
- value={toNumberString(max)}
|
|
|
|
|
- type="number"
|
|
|
|
|
- />
|
|
|
|
|
- </>
|
|
|
|
|
- )}
|
|
|
|
|
- <FormField
|
|
|
|
|
- label="Decimals"
|
|
|
|
|
- labelWidth={labelWidth}
|
|
|
|
|
- placeholder="auto"
|
|
|
|
|
- onChange={this.onDecimalChange}
|
|
|
|
|
- value={toNumberString(decimals)}
|
|
|
|
|
- type="number"
|
|
|
|
|
- />
|
|
|
|
|
- </>
|
|
|
|
|
- );
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ {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"
|
|
|
|
|
+ />
|
|
|
|
|
+ </>
|
|
|
|
|
+ );
|
|
|
|
|
+};
|