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