FieldPropertiesEditor.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // Libraries
  2. import React, { ChangeEvent, useState, useCallback } from 'react';
  3. // Components
  4. import { FormField } from '../FormField/FormField';
  5. import { FormLabel } from '../FormLabel/FormLabel';
  6. import { UnitPicker } from '../UnitPicker/UnitPicker';
  7. // Types
  8. import { toIntegerOrUndefined, Field, SelectableValue, toFloatOrUndefined, toNumberString } from '@grafana/data';
  9. import { VAR_SERIES_NAME, VAR_FIELD_NAME, VAR_CALC, VAR_CELL_PREFIX } from '../../utils/fieldDisplay';
  10. const labelWidth = 6;
  11. export interface Props {
  12. showMinMax: boolean;
  13. value: Partial<Field>;
  14. onChange: (value: Partial<Field>, event?: React.SyntheticEvent<HTMLElement>) => void;
  15. }
  16. export const FieldPropertiesEditor: React.FC<Props> = ({ value, onChange, showMinMax }) => {
  17. const { unit, title } = value;
  18. const [decimals, setDecimals] = useState(
  19. value.decimals !== undefined && value.decimals !== null ? value.decimals.toString() : ''
  20. );
  21. const [min, setMin] = useState(toNumberString(value.min));
  22. const [max, setMax] = useState(toNumberString(value.max));
  23. const onTitleChange = (event: ChangeEvent<HTMLInputElement>) => {
  24. onChange({ ...value, title: event.target.value });
  25. };
  26. const onDecimalChange = useCallback(
  27. (event: ChangeEvent<HTMLInputElement>) => {
  28. setDecimals(event.target.value);
  29. },
  30. [value.decimals, onChange]
  31. );
  32. const onMinChange = useCallback(
  33. (event: ChangeEvent<HTMLInputElement>) => {
  34. setMin(event.target.value);
  35. },
  36. [value.min, onChange]
  37. );
  38. const onMaxChange = useCallback(
  39. (event: ChangeEvent<HTMLInputElement>) => {
  40. setMax(event.target.value);
  41. },
  42. [value.max, onChange]
  43. );
  44. const onUnitChange = (unit: SelectableValue<string>) => {
  45. onChange({ ...value, unit: unit.value });
  46. };
  47. const commitChanges = useCallback(() => {
  48. onChange({
  49. ...value,
  50. decimals: toIntegerOrUndefined(decimals),
  51. min: toFloatOrUndefined(min),
  52. max: toFloatOrUndefined(max),
  53. });
  54. }, [min, max, decimals]);
  55. const titleTooltip = (
  56. <div>
  57. Template Variables:
  58. <br />
  59. {'$' + VAR_SERIES_NAME}
  60. <br />
  61. {'$' + VAR_FIELD_NAME}
  62. <br />
  63. {'$' + VAR_CELL_PREFIX + '{N}'} / {'$' + VAR_CALC}
  64. </div>
  65. );
  66. return (
  67. <>
  68. <FormField
  69. label="Title"
  70. labelWidth={labelWidth}
  71. onChange={onTitleChange}
  72. value={title}
  73. tooltip={titleTooltip}
  74. placeholder="Auto"
  75. />
  76. <div className="gf-form">
  77. <FormLabel width={labelWidth}>Unit</FormLabel>
  78. <UnitPicker defaultValue={unit} onChange={onUnitChange} />
  79. </div>
  80. {showMinMax && (
  81. <>
  82. <FormField
  83. label="Min"
  84. labelWidth={labelWidth}
  85. onChange={onMinChange}
  86. onBlur={commitChanges}
  87. value={min}
  88. type="number"
  89. />
  90. <FormField
  91. label="Max"
  92. labelWidth={labelWidth}
  93. onChange={onMaxChange}
  94. onBlur={commitChanges}
  95. value={max}
  96. type="number"
  97. />
  98. </>
  99. )}
  100. <FormField
  101. label="Decimals"
  102. labelWidth={labelWidth}
  103. placeholder="auto"
  104. onChange={onDecimalChange}
  105. onBlur={commitChanges}
  106. value={decimals}
  107. type="number"
  108. />
  109. </>
  110. );
  111. };