(false);
@@ -159,7 +157,12 @@ export function PanelDataTransformationsTabRendered({ model }: SceneComponentPro
return (
<>
-
+
{transformationsDrawer}
>
);
@@ -169,9 +172,10 @@ interface TransformationEditorProps {
transformations: DataTransformerConfig[];
model: PanelDataTransformationsTab;
data: PanelData;
+ selectedIdx?: number;
}
-function TransformationsEditor({ transformations, model, data }: TransformationEditorProps) {
+function TransformationsEditor({ transformations, model, data, selectedIdx }: TransformationEditorProps) {
const transformationEditorRows = transformations.map((t, i) => ({ id: `${i} - ${t.id}`, transformation: t }));
const styles = useStyles2(getStyles);
@@ -211,6 +215,7 @@ function TransformationsEditor({ transformations, model, data }: TransformationE
}}
configs={transformationEditorRows}
data={data}
+ selectedIdx={selectedIdx}
>
{provided.placeholder}
diff --git a/public/app/features/dashboard-scene/panel-edit/PanelDataPane/QueryTransformCard.tsx b/public/app/features/dashboard-scene/panel-edit/PanelDataPane/QueryTransformCard.tsx
index cc371d91272..c5e433c8e0a 100644
--- a/public/app/features/dashboard-scene/panel-edit/PanelDataPane/QueryTransformCard.tsx
+++ b/public/app/features/dashboard-scene/panel-edit/PanelDataPane/QueryTransformCard.tsx
@@ -8,6 +8,8 @@ import { getDataSourceSrv } from '@grafana/runtime';
import { SceneDataQuery } from '@grafana/scenes';
import { Icon, IconButton, Stack, useStyles2 } from '@grafana/ui';
+import { queryItemId, transformItemId } from './utils';
+
interface QueryTransformCardProps {
item: SceneDataQuery | DataTransformerConfig;
type: 'query' | 'transform' | 'expression';
@@ -69,7 +71,7 @@ export const QueryTransformCard = memo(
onClick={onClick}
onKeyDown={handleKeyDown}
data-testid={`${type}-card-${index}`}
- data-card-id={'refId' in item ? item.refId : `transform-${index}`}
+ data-card-id={'refId' in item ? queryItemId(item) : transformItemId(index)}
>
{/* Header with type and action icons */}
+ isExpressionQuery(query) ? `expression-${query.refId}` : `query-${query.refId}`;
+export const transformItemId = (index: number) => `transform-${index}`;
+
+export const isDataTransformerConfig = (
+ t: DataTransformerConfig | CustomTransformerDefinition
+): t is DataTransformerConfig => t !== null && typeof t === 'object' && 'id' in t && typeof t.id === 'string';
diff --git a/public/app/features/dashboard/components/TransformationsEditor/TransformationOperationRows.tsx b/public/app/features/dashboard/components/TransformationsEditor/TransformationOperationRows.tsx
index 142f32aaf8e..6b839708fc5 100644
--- a/public/app/features/dashboard/components/TransformationsEditor/TransformationOperationRows.tsx
+++ b/public/app/features/dashboard/components/TransformationsEditor/TransformationOperationRows.tsx
@@ -1,3 +1,5 @@
+import { memo } from 'react';
+
import { DataTransformerConfig, standardTransformersRegistry } from '@grafana/data';
import { TransformationOperationRow } from './TransformationOperationRow';
@@ -9,36 +11,56 @@ interface TransformationOperationRowsProps {
configs: TransformationsEditorTransformation[];
onRemove: (index: number) => void;
onChange: (index: number, config: DataTransformerConfig) => void;
+ selectedIdx?: number;
}
-export const TransformationOperationRows = ({
- data,
- onChange,
- onRemove,
- configs,
-}: TransformationOperationRowsProps) => {
- return (
- <>
- {configs.map((t, i) => {
- const uiConfig = standardTransformersRegistry.getIfExists(t.transformation.id);
+export const TransformationOperationRows = memo(
+ ({ data, onChange, onRemove, configs, selectedIdx }: TransformationOperationRowsProps) => {
+ if (selectedIdx != null) {
+ const t = configs[selectedIdx];
+ if (!t) {
+ return null;
+ }
- if (!uiConfig) {
- return null;
- }
+ const uiConfig = standardTransformersRegistry.getIfExists(t.transformation.id);
+ if (!uiConfig) {
+ return null;
+ }
- return (
-
- );
- })}
- >
- );
-};
+ return (
+
+ );
+ }
+
+ return configs.map((t, i) => {
+ const uiConfig = standardTransformersRegistry.getIfExists(t.transformation.id);
+ if (!uiConfig) {
+ return null;
+ }
+
+ return (
+
+ );
+ });
+ }
+);
+
+TransformationOperationRows.displayName = 'TransformationOperationRows';