Add context to transformation editor (#76317)

* Add context to editor so field calculation does not return undefined variable and shows on next transform

* fix bug where default alias would get interpolated
This commit is contained in:
Victor Marin 2023-10-12 08:43:32 +03:00 committed by GitHub
parent 65a94d9e75
commit 4dfffa3c32
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 4 deletions

View File

@ -315,7 +315,11 @@ export function getNameFromOptions(options: CalculateFieldTransformerOptions) {
}
case CalculateFieldMode.BinaryOperation: {
const { binary } = options;
return `${binary?.left ?? ''} ${binary?.operator ?? ''} ${binary?.right ?? ''}`;
const alias = `${binary?.left ?? ''} ${binary?.operator ?? ''} ${binary?.right ?? ''}`;
//Remove $ signs as they will be interpolated and cause issues. Variables can still be used
//in alias but shouldn't in the autogenerated name
return alias.replace(/\$/g, '');
}
case CalculateFieldMode.ReduceRow:
{

View File

@ -9,8 +9,10 @@ import {
transformDataFrame,
TransformerRegistryItem,
getFrameMatchers,
DataTransformContext,
} from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
import { getTemplateSrv } from '@grafana/runtime';
import { Icon, JSONFormatter, useStyles2 } from '@grafana/ui';
import { TransformationsEditorTransformation } from './types';
@ -42,14 +44,19 @@ export const TransformationEditor = ({
const matcher = config.filter?.options ? getFrameMatchers(config.filter) : undefined;
const inputTransforms = configs.slice(0, index).map((t) => t.transformation);
const outputTransforms = configs.slice(index, index + 1).map((t) => t.transformation);
const inputSubscription = transformDataFrame(inputTransforms, data).subscribe((v) => {
const ctx: DataTransformContext = {
interpolate: (v: string) => getTemplateSrv().replace(v),
};
const inputSubscription = transformDataFrame(inputTransforms, data, ctx).subscribe((v) => {
if (matcher) {
v = data.filter((v) => matcher(v));
}
setInput(v);
});
const outputSubscription = transformDataFrame(inputTransforms, data)
.pipe(mergeMap((before) => transformDataFrame(outputTransforms, before)))
const outputSubscription = transformDataFrame(inputTransforms, data, ctx)
.pipe(mergeMap((before) => transformDataFrame(outputTransforms, before, ctx)))
.subscribe(setOutput);
return function unsubscribe() {