From 4bda20292603d4aff80bfc52dcc23e7f53830f2d Mon Sep 17 00:00:00 2001
From: Alexander Polyankin <alexander.polyankin@metabase.com>
Date: Mon, 24 Jun 2024 09:08:32 -0400
Subject: [PATCH] Fix new column shortcuts overwriting viz settings (#44582)

---
 .../helpers/e2e-ui-elements-helpers.js        |  4 ++
 .../reproductions-3.cy.spec.js                | 51 +++++++++++++++++++
 .../CombineColumnsAction.tsx                  |  7 ++-
 .../CompareAggregationsAction.tsx             |  7 ++-
 .../ExtractColumnAction.tsx                   |  8 +--
 5 files changed, 70 insertions(+), 7 deletions(-)

diff --git a/e2e/support/helpers/e2e-ui-elements-helpers.js b/e2e/support/helpers/e2e-ui-elements-helpers.js
index 0f1cd27ce6b..9b095a78ca8 100644
--- a/e2e/support/helpers/e2e-ui-elements-helpers.js
+++ b/e2e/support/helpers/e2e-ui-elements-helpers.js
@@ -171,6 +171,10 @@ export const queryBuilderHeader = () => {
   return cy.findByTestId("qb-header");
 };
 
+export const queryBuilderFooter = () => {
+  return cy.findByTestId("view-footer");
+};
+
 export const closeQuestionActions = () => {
   queryBuilderHeader().click();
 };
diff --git a/e2e/test/scenarios/question-reproductions/reproductions-3.cy.spec.js b/e2e/test/scenarios/question-reproductions/reproductions-3.cy.spec.js
index f51985409c8..cc44cb9e65a 100644
--- a/e2e/test/scenarios/question-reproductions/reproductions-3.cy.spec.js
+++ b/e2e/test/scenarios/question-reproductions/reproductions-3.cy.spec.js
@@ -31,6 +31,7 @@ import {
   newButton,
   appBar,
   openProductsTable,
+  queryBuilderFooter,
 } from "e2e/support/helpers";
 
 const { ORDERS, ORDERS_ID, PRODUCTS } = SAMPLE_DATABASE;
@@ -861,3 +862,53 @@ describe("issue 44532", () => {
     });
   });
 });
+
+describe("issue 43294", () => {
+  const questionDetails = {
+    display: "line",
+    query: {
+      "source-table": ORDERS_ID,
+      aggregation: [["count"]],
+      breakout: [["field", ORDERS.CREATED_AT, { "temporal-unit": "month" }]],
+    },
+    visualization_settings: {
+      "graph.metrics": ["count"],
+      "graph.dimensions": ["CREATED_AT"],
+    },
+  };
+
+  beforeEach(() => {
+    restore();
+    cy.signInAsNormalUser();
+  });
+
+  it("should not overwrite viz settings with click actions in raw data mode (metabase#43294)", () => {
+    createQuestion(questionDetails, { visitQuestion: true });
+    queryBuilderFooter().findByLabelText("Switch to data").click();
+
+    cy.log("compare action");
+    cy.button("Add column").click();
+    popover().findByText("Compare “Count” to previous months").click();
+    popover().button("Done").click();
+
+    cy.log("extract action");
+    cy.button("Add column").click();
+    popover().findByText("Extract part of column").click();
+    popover().within(() => {
+      cy.findByText("Created At: Month").click();
+      cy.findByText("Year").click();
+    });
+
+    cy.log("combine action");
+    cy.button("Add column").click();
+    popover().findByText("Combine columns").click();
+    popover().button("Done").click();
+
+    cy.log("check visualization");
+    queryBuilderFooter().findByLabelText("Switch to visualization").click();
+    echartsContainer().within(() => {
+      cy.findByText("Count").should("be.visible");
+      cy.findByText("Created At").should("be.visible");
+    });
+  });
+});
diff --git a/frontend/src/metabase/visualizations/click-actions/actions/CombineColumnsAction/CombineColumnsAction.tsx b/frontend/src/metabase/visualizations/click-actions/actions/CombineColumnsAction/CombineColumnsAction.tsx
index 81ec30fc809..44598a51fa8 100644
--- a/frontend/src/metabase/visualizations/click-actions/actions/CombineColumnsAction/CombineColumnsAction.tsx
+++ b/frontend/src/metabase/visualizations/click-actions/actions/CombineColumnsAction/CombineColumnsAction.tsx
@@ -1,12 +1,14 @@
 import { t } from "ttag";
 
-import { useDispatch } from "metabase/lib/redux";
+import { useDispatch, useSelector } from "metabase/lib/redux";
+import { checkNotNull } from "metabase/lib/types";
 import { setUIControls } from "metabase/query_builder/actions";
 import { trackColumnCombineViaPlusModal } from "metabase/query_builder/analytics";
 import {
   CombineColumns,
   hasCombinations,
 } from "metabase/query_builder/components/expressions/CombineColumns";
+import { getQuestion } from "metabase/query_builder/selectors";
 import type { LegacyDrill } from "metabase/visualizations/types";
 import type { ClickActionPopoverProps } from "metabase/visualizations/types/click-actions";
 import * as Lib from "metabase-lib";
@@ -29,11 +31,12 @@ export const CombineColumnsAction: LegacyDrill = ({ question, clicked }) => {
     onChangeCardAndRun,
     onClose,
   }: ClickActionPopoverProps) => {
+    const currentQuestion = useSelector(getQuestion);
     const dispatch = useDispatch();
 
     function handleSubmit(name: string, clause: Lib.ExpressionClause) {
       const newQuery = Lib.expression(query, stageIndex, name, clause);
-      const nextQuestion = question.setQuery(newQuery);
+      const nextQuestion = checkNotNull(currentQuestion).setQuery(newQuery);
       const nextCard = nextQuestion.card();
 
       trackColumnCombineViaPlusModal(newQuery, nextQuestion);
diff --git a/frontend/src/metabase/visualizations/click-actions/actions/CompareAggregationsAction/CompareAggregationsAction.tsx b/frontend/src/metabase/visualizations/click-actions/actions/CompareAggregationsAction/CompareAggregationsAction.tsx
index 15fb00f3d8d..5a29be5da85 100644
--- a/frontend/src/metabase/visualizations/click-actions/actions/CompareAggregationsAction/CompareAggregationsAction.tsx
+++ b/frontend/src/metabase/visualizations/click-actions/actions/CompareAggregationsAction/CompareAggregationsAction.tsx
@@ -1,11 +1,13 @@
 import { t } from "ttag";
 
-import { useDispatch } from "metabase/lib/redux";
+import { useDispatch, useSelector } from "metabase/lib/redux";
+import { checkNotNull } from "metabase/lib/types";
 import { setUIControls } from "metabase/query_builder/actions";
 import {
   CompareAggregations,
   getOffsetPeriod,
 } from "metabase/query_builder/components/CompareAggregations";
+import { getQuestion } from "metabase/query_builder/selectors";
 import { trackColumnCompareViaPlusModal } from "metabase/querying/analytics";
 import type { LegacyDrill } from "metabase/visualizations/types";
 import type { ClickActionPopoverProps } from "metabase/visualizations/types/click-actions";
@@ -39,6 +41,7 @@ export const CompareAggregationsAction: LegacyDrill = ({
     onChangeCardAndRun,
     onClose,
   }: ClickActionPopoverProps) => {
+    const currentQuestion = useSelector(getQuestion);
     const dispatch = useDispatch();
 
     function handleSubmit(aggregations: Lib.ExpressionClause[]) {
@@ -47,7 +50,7 @@ export const CompareAggregationsAction: LegacyDrill = ({
         query,
       );
 
-      const nextQuestion = question.setQuery(nextQuery);
+      const nextQuestion = checkNotNull(currentQuestion).setQuery(nextQuery);
       const nextCard = nextQuestion.card();
 
       trackColumnCompareViaPlusModal(
diff --git a/frontend/src/metabase/visualizations/click-actions/actions/ExtractColumnAction/ExtractColumnAction.tsx b/frontend/src/metabase/visualizations/click-actions/actions/ExtractColumnAction/ExtractColumnAction.tsx
index 2af77050d60..5895f5ce805 100644
--- a/frontend/src/metabase/visualizations/click-actions/actions/ExtractColumnAction/ExtractColumnAction.tsx
+++ b/frontend/src/metabase/visualizations/click-actions/actions/ExtractColumnAction/ExtractColumnAction.tsx
@@ -1,12 +1,14 @@
 import { t } from "ttag";
 
-import { useDispatch } from "metabase/lib/redux";
+import { useDispatch, useSelector } from "metabase/lib/redux";
+import { checkNotNull } from "metabase/lib/types";
 import { setUIControls } from "metabase/query_builder/actions";
 import { trackColumnExtractViaPlusModal } from "metabase/query_builder/analytics";
 import {
   ExtractColumn,
   hasExtractions,
 } from "metabase/query_builder/components/expressions/ExtractColumn";
+import { getQuestion } from "metabase/query_builder/selectors";
 import { rem, Box } from "metabase/ui";
 import type { LegacyDrill } from "metabase/visualizations/types";
 import type { ClickActionPopoverProps } from "metabase/visualizations/types/click-actions";
@@ -31,6 +33,7 @@ export const ExtractColumnAction: LegacyDrill = ({ question, clicked }) => {
     onChangeCardAndRun,
     onClose,
   }: ClickActionPopoverProps) => {
+    const currentQuestion = useSelector(getQuestion);
     const dispatch = useDispatch();
 
     function handleSubmit(
@@ -39,8 +42,7 @@ export const ExtractColumnAction: LegacyDrill = ({ question, clicked }) => {
       extraction: Lib.ColumnExtraction,
     ) {
       const newQuery = Lib.extract(query, stageIndex, extraction);
-
-      const nextQuestion = question.setQuery(newQuery);
+      const nextQuestion = checkNotNull(currentQuestion).setQuery(newQuery);
       const nextCard = nextQuestion.card();
 
       trackColumnExtractViaPlusModal(
-- 
GitLab