{
container?: HTMLElement | null;
/**
- * memoized function so it will not recompute
- * and return previous value
+ * memoized function so it will not recompute and return previous value
* unless one of
* - preTransformProps
- * - transformProps
- * - postTransformProps
* - chartProps
* is changed.
*/
- processChartProps = createSelector(
+ preSelector = createSelector(
[
(input: {
chartProps: ChartProps;
preTransformProps?: PreTransformProps;
- transformProps?: TransformProps;
- postTransformProps?: PostTransformProps;
}) => input.chartProps,
input => input.preTransformProps,
+ ],
+ (chartProps, pre = IDENTITY) => pre(chartProps),
+ );
+
+ /**
+ * memoized function so it will not recompute and return previous value
+ * unless one of the input arguments have changed.
+ */
+ transformSelector = createSelector(
+ [
+ (input: { chartProps: ChartProps; transformProps?: TransformProps }) =>
+ input.chartProps,
input => input.transformProps,
+ ],
+ (preprocessedChartProps, transform = IDENTITY) =>
+ transform(preprocessedChartProps),
+ );
+
+ /**
+ * memoized function so it will not recompute and return previous value
+ * unless one of the input arguments have changed.
+ */
+ postSelector = createSelector(
+ [
+ (input: {
+ chartProps: ChartProps;
+ postTransformProps?: PostTransformProps;
+ }) => input.chartProps,
input => input.postTransformProps,
],
- (chartProps, pre = IDENTITY, transform = IDENTITY, post = IDENTITY) =>
- post(transform(pre(chartProps))),
+ (transformedChartProps, post = IDENTITY) => post(transformedChartProps),
);
+ /**
+ * Using each memoized function to retrieve the computed chartProps
+ */
+ processChartProps = ({
+ chartProps,
+ preTransformProps,
+ transformProps,
+ postTransformProps,
+ }: {
+ chartProps: ChartProps;
+ preTransformProps?: PreTransformProps;
+ transformProps?: TransformProps;
+ postTransformProps?: PostTransformProps;
+ }) =>
+ this.postSelector({
+ chartProps: this.transformSelector({
+ chartProps: this.preSelector({ chartProps, preTransformProps }),
+ transformProps,
+ }),
+ postTransformProps,
+ });
+
/**
* memoized function so it will not recompute
* and return previous value
diff --git a/superset-frontend/src/components/Chart/ChartRenderer.jsx b/superset-frontend/src/components/Chart/ChartRenderer.jsx
index c3e2f3a8e0ee..d10d7b0439a9 100644
--- a/superset-frontend/src/components/Chart/ChartRenderer.jsx
+++ b/superset-frontend/src/components/Chart/ChartRenderer.jsx
@@ -182,6 +182,7 @@ class ChartRenderer extends Component {
this.props.formData.subcategories ||
nextProps.cacheBusterProp !== this.props.cacheBusterProp ||
nextProps.emitCrossFilters !== this.props.emitCrossFilters ||
+ nextProps.postTransformProps !== this.props.postTransformProps ||
hasMatrixifyChanges()
);
}
diff --git a/superset-frontend/src/components/Chart/ChartRenderer.test.jsx b/superset-frontend/src/components/Chart/ChartRenderer.test.jsx
index 90442564b596..c5734fdcce05 100644
--- a/superset-frontend/src/components/Chart/ChartRenderer.test.jsx
+++ b/superset-frontend/src/components/Chart/ChartRenderer.test.jsx
@@ -27,8 +27,10 @@ import { ChartSource } from 'src/types/ChartSource';
jest.mock('@superset-ui/core', () => ({
...jest.requireActual('@superset-ui/core'),
- SuperChart: ({ formData }) => (
- {JSON.stringify(formData)}
+ SuperChart: ({ postTransformProps = x => x, ...props }) => (
+
+ {JSON.stringify(postTransformProps(props).formData)}
+
),
}));
@@ -119,6 +121,23 @@ test('should detect changes in matrixify properties', () => {
});
});
+test('should detect changes in postTransformProps', () => {
+ const postTransformProps = jest.fn(x => x);
+ const initialProps = {
+ ...requiredProps,
+ queriesResponse: [{ data: 'initial' }],
+ chartStatus: 'success',
+ };
+ const { rerender } = render();
+ const updatedProps = {
+ ...initialProps,
+ postTransformProps,
+ };
+ expect(postTransformProps).toHaveBeenCalledTimes(0);
+ rerender();
+ expect(postTransformProps).toHaveBeenCalledTimes(1);
+});
+
test('should identify matrixify property changes correctly', () => {
// Test that formData with different matrixify properties triggers updates
const initialProps = {