From 0a34b51055b670e0d581e7179550d8b648b6b7bb Mon Sep 17 00:00:00 2001 From: Nathan Marrs Date: Tue, 30 Jul 2024 17:15:44 -0600 Subject: [PATCH] Transformation: Add variable support for filter by value regex matcher (#90926) * add support for template vars in filter by value transformation for regex matcher * less code is more code * add test to confirm interpolation works for regex * suggestions input for regex editor --------- Co-authored-by: Adela Almasan --- .../transformers/filterByValue.test.ts | 45 +++++++++++++++++++ .../transformers/filterByValue.ts | 3 -- .../ValueMatchers/RegexMatcherEditor.tsx | 34 +++++++++++++- 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts b/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts index 92cad2a1986..05517cf70c4 100644 --- a/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts +++ b/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts @@ -305,6 +305,51 @@ describe('FilterByValue transformer', () => { }); }); + it('should interpolate dashboard variables for regex matcher', async () => { + mockTransformationsVariableSupport.mockReturnValue(true); + + const regex: MatcherConfig> = { + id: ValueMatcherID.regex, + options: { value: '.*thiswillinterpolateto6' }, + }; + + const cfg: DataTransformerConfig = { + id: DataTransformerID.filterByValue, + options: { + type: FilterByValueType.include, + match: FilterByValueMatch.all, + filters: [ + { + fieldName: 'numbers', + config: regex, + }, + ], + }, + }; + + const ctxmock = { interpolate: jest.fn(() => '6') }; + + await expect(transformDataFrame([cfg], [seriesAWithSingleField], ctxmock)).toEmitValuesWith((received) => { + const processed = received[0]; + + expect(processed.length).toEqual(1); + expect(processed[0].fields).toEqual([ + { + name: 'time', + type: FieldType.time, + values: [6000], + state: {}, + }, + { + name: 'numbers', + type: FieldType.number, + values: [6], + state: {}, + }, + ]); + }); + }); + it('should not interpolate dashboard variables when feature toggle is off', async () => { mockTransformationsVariableSupport.mockReturnValue(false); diff --git a/packages/grafana-data/src/transformations/transformers/filterByValue.ts b/packages/grafana-data/src/transformations/transformers/filterByValue.ts index 5630a767bbd..285a0aa293c 100644 --- a/packages/grafana-data/src/transformations/transformers/filterByValue.ts +++ b/packages/grafana-data/src/transformations/transformers/filterByValue.ts @@ -77,9 +77,6 @@ export const filterByValueTransformer: DataTransformerInfo { + return { value: v.name, label: v.label || v.name, origin: VariableOrigin.Template }; + }); + const onChangeValue = useCallback( (event: React.FormEvent) => { setInvalid(!validator(event.currentTarget.value)); @@ -21,6 +30,17 @@ export function regexMatcherEditor( [setInvalid, validator] ); + const onChangeVariableValue = useCallback( + (value: string) => { + setInvalid(!validator(value)); + onChange({ + ...options, + value, + }); + }, + [setInvalid, validator, onChange, options] + ); + const onChangeOptions = useCallback( (event: React.FocusEvent) => { if (isInvalid) { @@ -37,6 +57,18 @@ export function regexMatcherEditor( [options, onChange, isInvalid, field, converter] ); + if (cfg.featureToggles.transformationsVariableSupport) { + return ( + + ); + } + return (