diff --git a/packages/grafana-ui/src/components/OptionsUI/mappings.tsx b/packages/grafana-ui/src/components/OptionsUI/mappings.tsx
index 55a1a674be8..a84408efe25 100644
--- a/packages/grafana-ui/src/components/OptionsUI/mappings.tsx
+++ b/packages/grafana-ui/src/components/OptionsUI/mappings.tsx
@@ -17,6 +17,6 @@ export class ValueMappingsValueEditor extends React.PureComponent<
value = [];
}
- return ;
+ return ;
}
}
diff --git a/packages/grafana-ui/src/components/ValueMappingsEditor/MappingRow.tsx b/packages/grafana-ui/src/components/ValueMappingsEditor/MappingRow.tsx
index aa835f34b10..acc3e79fda3 100644
--- a/packages/grafana-ui/src/components/ValueMappingsEditor/MappingRow.tsx
+++ b/packages/grafana-ui/src/components/ValueMappingsEditor/MappingRow.tsx
@@ -7,8 +7,8 @@ import { MappingType, RangeMap, SelectableValue, ValueMap, ValueMapping } from '
export interface Props {
valueMapping: ValueMapping;
- updateValueMapping: (valueMapping: ValueMapping) => void;
- removeValueMapping: () => void;
+ onUpdate: (value: ValueMapping) => void;
+ onRemove: () => void;
}
const MAPPING_OPTIONS: Array> = [
@@ -16,27 +16,27 @@ const MAPPING_OPTIONS: Array> = [
{ value: MappingType.RangeToText, label: 'Range' },
];
-export const MappingRow: React.FC = ({ valueMapping, updateValueMapping, removeValueMapping }) => {
+export const MappingRow: React.FC = ({ valueMapping, onUpdate, onRemove }) => {
const { type } = valueMapping;
const onMappingValueChange = (value: string) => {
- updateValueMapping({ ...valueMapping, value: value });
+ onUpdate({ ...valueMapping, value: value });
};
const onMappingFromChange = (value: string) => {
- updateValueMapping({ ...valueMapping, from: value });
+ onUpdate({ ...valueMapping, from: value });
};
const onMappingToChange = (value: string) => {
- updateValueMapping({ ...valueMapping, to: value });
+ onUpdate({ ...valueMapping, to: value });
};
const onMappingTextChange = (value: string) => {
- updateValueMapping({ ...valueMapping, text: value });
+ onUpdate({ ...valueMapping, text: value });
};
const onMappingTypeChange = (mappingType: MappingType) => {
- updateValueMapping({ ...valueMapping, type: mappingType });
+ onUpdate({ ...valueMapping, type: mappingType });
};
const onKeyDown = (handler: (value: string) => void) => (e: React.KeyboardEvent) => {
@@ -103,7 +103,7 @@ export const MappingRow: React.FC = ({ valueMapping, updateValueMapping,
const label = (
-
+
);
return (
diff --git a/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.story.tsx b/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.story.tsx
index e2a9e0140ad..dda84c86840 100644
--- a/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.story.tsx
+++ b/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.story.tsx
@@ -8,5 +8,5 @@ export default {
};
export const basic = () => {
- return ;
+ return ;
};
diff --git a/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.test.tsx b/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.test.tsx
index 56bcf01153d..b3c23eb2c91 100644
--- a/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.test.tsx
+++ b/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.test.tsx
@@ -11,7 +11,7 @@ const setup = (spy?: any, propOverrides?: object) => {
spy(mappings);
}
},
- valueMappings: [
+ value: [
{ id: 1, type: MappingType.ValueToText, value: '20', text: 'Ok' },
{ id: 2, type: MappingType.RangeToText, from: '21', to: '30', text: 'Meh' },
],
@@ -64,11 +64,11 @@ describe('Next id to add', () => {
]);
});
- it('should default to 0', () => {
+ it('should default to id 1', () => {
const onChangeSpy = jest.fn();
- const wrapper = setup(onChangeSpy, { valueMappings: [] });
+ const wrapper = setup(onChangeSpy, { value: [] });
const add = wrapper.find('*[aria-label="ValueMappingsEditor add mapping button"]');
add.at(0).simulate('click');
- expect(onChangeSpy).toBeCalledWith([{ id: 0, type: MappingType.ValueToText, from: '', to: '', text: '' }]);
+ expect(onChangeSpy).toBeCalledWith([{ id: 1, type: MappingType.ValueToText, from: '', to: '', text: '' }]);
});
});
diff --git a/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.tsx b/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.tsx
index d1fc93f8217..85f2b90ca83 100644
--- a/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.tsx
+++ b/packages/grafana-ui/src/components/ValueMappingsEditor/ValueMappingsEditor.tsx
@@ -4,65 +4,48 @@ import { Button } from '../Button/Button';
import { MappingRow } from './MappingRow';
export interface Props {
- valueMappings?: ValueMapping[];
+ value: ValueMapping[];
onChange: (valueMappings: ValueMapping[]) => void;
}
-export const ValueMappingsEditor: React.FC = ({ valueMappings, onChange, children }) => {
+export const ValueMappingsEditor: React.FC = ({ value, onChange, children }) => {
const onAdd = () => {
- let update = valueMappings;
const defaultMapping = {
type: MappingType.ValueToText,
from: '',
to: '',
text: '',
};
- const id = update && update.length > 0 ? Math.max(...update.map(v => v.id)) + 1 : 0;
- if (update) {
- update.push({
+ const id = Math.max(...value.map(v => v.id), 0) + 1;
+
+ onChange([
+ ...value,
+ {
id,
...defaultMapping,
- });
- } else {
- update = [
- {
- id,
- ...defaultMapping,
- },
- ];
- }
-
- onChange(update);
+ },
+ ]);
};
const onRemove = (index: number) => {
- const update = valueMappings;
- update!.splice(index, 1);
- onChange(update!);
+ onChange(value.filter((_, i) => i !== index));
};
- const onMappingChange = (index: number, value: ValueMapping) => {
- const update = valueMappings;
- update![index] = value;
- onChange(update!);
+ const onMappingChange = (update: ValueMapping) => {
+ onChange(value.map(item => (item.id === update.id ? update : item)));
};
return (
<>
- {valueMappings && valueMappings.length > 0 && (
- <>
- {valueMappings.length > 0 &&
- valueMappings.map((valueMapping, index) => (
- onMappingChange(index, value)}
- removeValueMapping={() => onRemove(index)}
- />
- ))}
- >
- )}
+ {value.map((valueMapping, index) => (
+ onRemove(index)}
+ />
+ ))}