diff --git a/e2e/support/helpers/e2e-ui-elements-helpers.js b/e2e/support/helpers/e2e-ui-elements-helpers.js index 0f1cd27ce6bac61111d22102acf1ea08bdfe3ac1..9b095a78ca8add20dd29091b4ac482fce4185cef 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 f51985409c81ec98e67064cf4e3a8ba0eb71f449..cc44cb9e65a25565866d6ce18f1a2b8e7b300443 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 81ec30fc809139f5754fb609162942663ee8970f..44598a51fa800b5bed1ddfa8e15e0b56bb3fb092 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 15fb00f3d8d34e02a622345d9dcf1874f05ba24b..5a29be5da8518d21e79029373c6fcaaf905c85a4 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 2af77050d60af5eb70eb12a489da44db2371ed8b..5895f5ce80530d9d6ee3b2f300aa7b4aa64a2741 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(