From 1496da036be044cc38d10844d96fbbb0ee270a6e Mon Sep 17 00:00:00 2001
From: Marcus Andersson
Date: Tue, 7 Apr 2020 19:54:06 +0200
Subject: [PATCH] PanelEdit: made the transformers tab re-render on changes
(#23384)
* fixed so the transformers UI is less buggy.
* changed so we don't mutate state.
---
.../TransformationsEditor.tsx | 79 +++++++++----------
.../features/dashboard/state/PanelModel.ts | 1 +
2 files changed, 40 insertions(+), 40 deletions(-)
diff --git a/public/app/features/dashboard/components/TransformationsEditor/TransformationsEditor.tsx b/public/app/features/dashboard/components/TransformationsEditor/TransformationsEditor.tsx
index eec37d925fe..077f41ae15e 100644
--- a/public/app/features/dashboard/components/TransformationsEditor/TransformationsEditor.tsx
+++ b/public/app/features/dashboard/components/TransformationsEditor/TransformationsEditor.tsx
@@ -1,7 +1,7 @@
import { css } from 'emotion';
import React from 'react';
import { transformersUIRegistry } from '@grafana/ui/src/components/TransformersUI/transformers';
-import { DataTransformerID, DataTransformerConfig, DataFrame, transformDataFrame } from '@grafana/data';
+import { DataTransformerConfig, DataFrame, transformDataFrame, SelectableValue } from '@grafana/data';
import { Button, Select } from '@grafana/ui';
import { TransformationRow } from './TransformationRow';
@@ -12,45 +12,41 @@ interface Props {
}
interface State {
- updateCounter: number;
+ addingTransformation: boolean;
}
export class TransformationsEditor extends React.PureComponent {
- state = { updateCounter: 0 };
+ state = { addingTransformation: false };
- onTransformationAdd = () => {
+ onTransformationAdd = (selectable: SelectableValue) => {
const { transformations, onChange } = this.props;
onChange([
...transformations,
{
- id: DataTransformerID.noop,
+ id: selectable.value as string,
options: {},
},
]);
- this.setState({ updateCounter: this.state.updateCounter + 1 });
+ this.setState({ addingTransformation: false });
};
onTransformationChange = (idx: number, config: DataTransformerConfig) => {
const { transformations, onChange } = this.props;
- transformations[idx] = config;
- onChange(transformations);
- this.setState({ updateCounter: this.state.updateCounter + 1 });
+ const next = Array.from(transformations);
+ next[idx] = config;
+ onChange(next);
};
onTransformationRemove = (idx: number) => {
const { transformations, onChange } = this.props;
- transformations.splice(idx, 1);
- onChange(transformations);
- this.setState({ updateCounter: this.state.updateCounter + 1 });
+ const next = Array.from(transformations);
+ next.splice(idx, 1);
+ onChange(next);
};
- renderTransformationEditors = () => {
- const { transformations, dataFrames } = this.props;
- const hasTransformations = transformations.length > 0;
- const preTransformData = dataFrames;
-
- if (!hasTransformations) {
- return undefined;
+ renderTransformationSelector = () => {
+ if (!this.state.addingTransformation) {
+ return null;
}
const availableTransformers = transformersUIRegistry.list().map(t => {
@@ -60,30 +56,32 @@ export class TransformationsEditor extends React.PureComponent {
};
});
+ return (
+
+
+
+ );
+ };
+
+ renderTransformationEditors = () => {
+ const { transformations, dataFrames } = this.props;
+ const preTransformData = dataFrames;
+
return (
<>
{transformations.map((t, i) => {
- let editor, input;
- if (t.id === DataTransformerID.noop) {
- return (
-
{this.renderTransformationEditors()}
-