diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.test.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.test.tsx
index 81b44058fda..b8175a171a9 100644
--- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.test.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.test.tsx
@@ -82,5 +82,28 @@ describe('MultiFilters', () => {
'my-key': ['my-value1', 'my-value2'],
});
});
+
+ describe('when editing an existing filter item key', () => {
+ it('it should change the key and call onChange', async () => {
+ const filters = { 'my-key': ['my-value'] };
+ const onChange = jest.fn();
+ render();
+
+ const filterItemElement = screen.getByTestId('cloudwatch-multifilter-item');
+ expect(filterItemElement).toBeInTheDocument();
+ expect(within(filterItemElement).getByDisplayValue('my-key')).toBeInTheDocument();
+ expect(within(filterItemElement).getByDisplayValue('my-value')).toBeInTheDocument();
+
+ const keyElement = screen.getByTestId('cloudwatch-multifilter-item-key');
+ expect(keyElement).toBeInTheDocument();
+ userEvent.type(keyElement!, '2');
+ fireEvent.blur(keyElement!);
+
+ expect(within(filterItemElement).getByDisplayValue('my-key2')).toBeInTheDocument();
+ expect(onChange).toHaveBeenCalledWith({
+ 'my-key2': ['my-value'],
+ });
+ });
+ });
});
});
diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.tsx
index 4ac614445b0..8e9637f8f8d 100644
--- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilter.tsx
@@ -7,6 +7,7 @@ import { MultiFilterItem } from './MultiFilterItem';
export interface Props {
filters?: MultiFilters;
onChange: (filters: MultiFilters) => void;
+ keyPlaceholder?: string;
}
export interface MultiFilterCondition {
@@ -28,7 +29,7 @@ const filterConditionsToMultiFilters = (filters: MultiFilterCondition[]) => {
return res;
};
-export const MultiFilter: React.FC = ({ filters, onChange }) => {
+export const MultiFilter: React.FC = ({ filters, onChange, keyPlaceholder }) => {
const [items, setItems] = useState([]);
useEffect(() => setItems(filters ? multiFiltersToFilterConditions(filters) : []), [filters]);
const onFiltersChange = (newItems: Array>) => {
@@ -42,13 +43,23 @@ export const MultiFilter: React.FC = ({ filters, onChange }) => {
}
};
- return ;
+ return ;
};
-function renderFilter(
- item: MultiFilterCondition,
- onChange: (item: MultiFilterCondition) => void,
- onDelete: () => void
-) {
- return onChange(item)} onDelete={onDelete} />;
+function makeRenderFilter(keyPlaceholder?: string) {
+ function renderFilter(
+ item: MultiFilterCondition,
+ onChange: (item: MultiFilterCondition) => void,
+ onDelete: () => void
+ ) {
+ return (
+ onChange(item)}
+ onDelete={onDelete}
+ keyPlaceholder={keyPlaceholder}
+ />
+ );
+ }
+ return renderFilter;
}
diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilterItem.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilterItem.tsx
index 9d4f9f4f9ec..8eb34996eeb 100644
--- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilterItem.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/MultiFilterItem.tsx
@@ -9,9 +9,10 @@ export interface Props {
filter: MultiFilterCondition;
onChange: (value: MultiFilterCondition) => void;
onDelete: () => void;
+ keyPlaceholder?: string;
}
-export const MultiFilterItem: FunctionComponent = ({ filter, onChange, onDelete }) => {
+export const MultiFilterItem: FunctionComponent = ({ filter, onChange, onDelete, keyPlaceholder }) => {
const [localKey, setLocalKey] = useState(filter.key || '');
const [localValue, setLocalValue] = useState(filter.value?.join(', ') || '');
const theme = useTheme2();
@@ -24,11 +25,11 @@ export const MultiFilterItem: FunctionComponent = ({ filter, onChange, on
data-testid="cloudwatch-multifilter-item-key"
aria-label="Filter key"
value={localKey}
- placeholder="key"
+ placeholder={keyPlaceholder ?? 'key'}
onChange={(e) => setLocalKey(e.currentTarget.value)}
onBlur={() => {
if (localKey && localKey !== filter.key) {
- onChange({ key: localKey, value: undefined });
+ onChange({ ...filter, key: localKey });
}
}}
/>
@@ -42,7 +43,7 @@ export const MultiFilterItem: FunctionComponent = ({ filter, onChange, on
placeholder="value1, value2,..."
onChange={(e) => setLocalValue(e.currentTarget.value)}
onBlur={() => {
- const newValues = localValue.replace(' ', '').split(',');
+ const newValues = localValue.split(',').map((v) => v.trim());
if (localValue && newValues !== filter.value) {
onChange({ ...filter, value: newValues });
}
diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx
index 95b42c1b37c..b69362e8ed6 100644
--- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx
+++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx
@@ -171,13 +171,14 @@ export const VariableQueryEditor = ({ query, datasource, onChange }: Props) => {
{
onChange({ ...parsedQuery, ec2Filters: filters });
}}
+ keyPlaceholder="filter/tag"
/>
>
@@ -196,6 +197,7 @@ export const VariableQueryEditor = ({ query, datasource, onChange }: Props) => {
onChange={(filters) => {
onChange({ ...parsedQuery, tags: filters });
}}
+ keyPlaceholder="tag"
/>
>