This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch 
fix/issue-32835-suggested-open-pr-test-first-v3
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 7cd415c4af4267fc40767254c1d9f0403434aca3
Author: rusackas <[email protected]>
AuthorDate: Tue Jul 28 03:25:37 2026 -0700

    fix(chart): stop duplicate metrics when switching between Waterfall and 
other chart types
    
    The Waterfall control panel never drained the shared standardized-controls
    metric/column queue on viz-type switch (no formDataOverrides), so metrics
    picked up when entering Waterfall stayed queued and got re-applied on top
    of the original ones when switching back to a multi-metric chart (e.g.
    Line), producing duplicate measures. Add the same formDataOverrides
    pattern used by the other single-metric echarts charts (Pie, Gauge,
    Sunburst, etc.) so Waterfall shifts exactly one metric and pops all
    columns from the queue.
    
    Fixes #32835
    
    Co-Authored-By: Claude Sonnet 5 <[email protected]>
---
 .../src/Waterfall/controlPanel.tsx                 |  6 +++
 .../test/Waterfall/controlPanel.test.ts            | 62 ++++++++++++++++++++++
 2 files changed, 68 insertions(+)

diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/Waterfall/controlPanel.tsx 
b/superset-frontend/plugins/plugin-chart-echarts/src/Waterfall/controlPanel.tsx
index 0826b9e1472..c73aaa794a9 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/Waterfall/controlPanel.tsx
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/Waterfall/controlPanel.tsx
@@ -23,6 +23,7 @@ import {
   D3_TIME_FORMAT_DOCS,
   DEFAULT_TIME_FORMAT,
   formatSelectOptions,
+  getStandardizedControls,
   sharedControls,
 } from '@superset-ui/chart-controls';
 import { showValueControl } from '../controls';
@@ -245,6 +246,11 @@ const config: ControlPanelConfig = {
       multi: false,
     },
   },
+  formDataOverrides: formData => ({
+    ...formData,
+    metric: getStandardizedControls().shiftMetric(),
+    groupby: getStandardizedControls().popAllColumns(),
+  }),
 };
 
 export default config;
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/test/Waterfall/controlPanel.test.ts
 
b/superset-frontend/plugins/plugin-chart-echarts/test/Waterfall/controlPanel.test.ts
new file mode 100644
index 00000000000..7f3f6b803cb
--- /dev/null
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/test/Waterfall/controlPanel.test.ts
@@ -0,0 +1,62 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { SqlaFormData } from '@superset-ui/core';
+
+// Mock getStandardizedControls so we can assert the Waterfall control panel
+// actually consumes (shifts/pops) the queued metrics and columns instead of
+// leaving them for the next viz-type switch to pick up again. Regression
+// test for https://github.com/apache/superset/issues/32835, where switching
+// away from and back to another chart type (e.g. Line) produced duplicate
+// metrics because Waterfall never drained the shared standardized-controls
+// queue.
+const mockShiftMetric = jest.fn(() => 'shiftedMetric');
+const mockPopAllColumns = jest.fn(() => ['poppedColumn']);
+
+jest.mock('@superset-ui/chart-controls', () => {
+  const actual = jest.requireActual('@superset-ui/chart-controls');
+  return {
+    ...actual,
+    getStandardizedControls: jest.fn(() => ({
+      shiftMetric: mockShiftMetric,
+      popAllColumns: mockPopAllColumns,
+    })),
+  };
+});
+
+// eslint-disable-next-line import/first
+import controlPanel from '../../src/Waterfall/controlPanel';
+
+test('formDataOverrides consumes a single metric and all columns from 
getStandardizedControls', () => {
+  expect(controlPanel.formDataOverrides).toBeDefined();
+
+  const dummyFormData = { someProp: 'test' } as unknown as SqlaFormData;
+  const newFormData = controlPanel.formDataOverrides!(dummyFormData);
+
+  // original properties are preserved
+  expect(newFormData.someProp).toBe('test');
+
+  // only a single metric is taken (Waterfall only supports one metric),
+  // leaving any remaining queued metrics for the next viz-type switch
+  expect(newFormData.metric).toBe('shiftedMetric');
+  expect(mockShiftMetric).toHaveBeenCalled();
+
+  // all queued columns are consumed for the (single) groupby control
+  expect(newFormData.groupby).toEqual(['poppedColumn']);
+  expect(mockPopAllColumns).toHaveBeenCalled();
+});

Reply via email to