From 8d7f175310b3f327bd6f0e6a9acba901dcf16a4e Mon Sep 17 00:00:00 2001
From: Cal Herries <39073188+calherries@users.noreply.github.com>
Date: Fri, 21 Oct 2022 18:06:48 +0100
Subject: [PATCH] Fix back navigation (#26049)

---
 .../metabase/query_builder/actions/native.js  | 20 +++++++++++++++++--
 .../SidebarHeader/SidebarHeader.tsx           |  6 +++++-
 .../src/metabase/query_builder/reducers.js    | 13 +++---------
 .../scenarios/native/data_ref.cy.spec.js      | 10 ++++++++++
 4 files changed, 36 insertions(+), 13 deletions(-)

diff --git a/frontend/src/metabase/query_builder/actions/native.js b/frontend/src/metabase/query_builder/actions/native.js
index b1c62b2a12c..270587cd3b2 100644
--- a/frontend/src/metabase/query_builder/actions/native.js
+++ b/frontend/src/metabase/query_builder/actions/native.js
@@ -13,6 +13,7 @@ import {
   getTemplateTagParameters,
 } from "metabase-lib/lib/parameters/utils/template-tags";
 import {
+  getDataReferenceStack,
   getNativeEditorCursorOffset,
   getNativeEditorSelectedText,
   getQuestion,
@@ -27,12 +28,27 @@ export const toggleDataReference = createAction(TOGGLE_DATA_REFERENCE, () => {
   MetabaseAnalytics.trackStructEvent("QueryBuilder", "Toggle Data Reference");
 });
 
+export const SET_DATA_REFERENCE_STACK = "metabase/qb/SET_DATA_REFERENCE_STACK";
+export const setDataReferenceStack = createAction(SET_DATA_REFERENCE_STACK);
+
 export const POP_DATA_REFERENCE_STACK = "metabase/qb/POP_DATA_REFERENCE_STACK";
-export const popDataReferenceStack = createAction(POP_DATA_REFERENCE_STACK);
+export const popDataReferenceStack = createThunkAction(
+  POP_DATA_REFERENCE_STACK,
+  () => (dispatch, getState) => {
+    const stack = getDataReferenceStack(getState());
+    dispatch(setDataReferenceStack(stack.slice(0, -1)));
+  },
+);
 
 export const PUSH_DATA_REFERENCE_STACK =
   "metabase/qb/PUSH_DATA_REFERENCE_STACK";
-export const pushDataReferenceStack = createAction(PUSH_DATA_REFERENCE_STACK);
+export const pushDataReferenceStack = createThunkAction(
+  PUSH_DATA_REFERENCE_STACK,
+  item => (dispatch, getState) => {
+    const stack = getDataReferenceStack(getState());
+    dispatch(setDataReferenceStack(stack.concat([item])));
+  },
+);
 
 export const OPEN_DATA_REFERENCE_AT_QUESTION =
   "metabase/qb/OPEN_DATA_REFERENCE_AT_QUESTION";
diff --git a/frontend/src/metabase/query_builder/components/SidebarHeader/SidebarHeader.tsx b/frontend/src/metabase/query_builder/components/SidebarHeader/SidebarHeader.tsx
index 78856feb093..107885b6be8 100644
--- a/frontend/src/metabase/query_builder/components/SidebarHeader/SidebarHeader.tsx
+++ b/frontend/src/metabase/query_builder/components/SidebarHeader/SidebarHeader.tsx
@@ -43,7 +43,11 @@ function SidebarHeader({ className, title, icon, onBack, onClose }: Props) {
 
   return (
     <HeaderRoot className={className}>
-      <HeaderTitleContainer variant={headerVariant} onClick={onBack}>
+      <HeaderTitleContainer
+        variant={headerVariant}
+        onClick={onBack}
+        data-testid="sidebar-header-title"
+      >
         {onBack && <HeaderIcon name="chevronleft" />}
         {icon && <HeaderIcon name={icon} />}
         {hasDefaultBackButton ? t`Back` : title}
diff --git a/frontend/src/metabase/query_builder/reducers.js b/frontend/src/metabase/query_builder/reducers.js
index 7906ced9cd2..a984f7e1221 100644
--- a/frontend/src/metabase/query_builder/reducers.js
+++ b/frontend/src/metabase/query_builder/reducers.js
@@ -6,8 +6,7 @@ import Utils from "metabase/lib/utils";
 import {
   RESET_QB,
   INITIALIZE_QB,
-  POP_DATA_REFERENCE_STACK,
-  PUSH_DATA_REFERENCE_STACK,
+  SET_DATA_REFERENCE_STACK,
   OPEN_DATA_REFERENCE_AT_QUESTION,
   TOGGLE_DATA_REFERENCE,
   TOGGLE_TEMPLATE_TAGS_EDITOR,
@@ -161,16 +160,10 @@ export const uiControls = handleActions(
         isShowingDataReference: !state.isShowingDataReference,
       }),
     },
-    [POP_DATA_REFERENCE_STACK]: {
+    [SET_DATA_REFERENCE_STACK]: {
       next: (state, { payload }) => ({
         ...state,
-        dataReferenceStack: state.dataReferenceStack.slice(0, -1),
-      }),
-    },
-    [PUSH_DATA_REFERENCE_STACK]: {
-      next: (state, { payload }) => ({
-        ...state,
-        dataReferenceStack: (state.dataReferenceStack || []).concat([payload]),
+        dataReferenceStack: payload,
       }),
     },
     [OPEN_DATA_REFERENCE_AT_QUESTION]: {
diff --git a/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js b/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js
index 8792490e338..864be043f66 100644
--- a/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js
+++ b/frontend/test/metabase/scenarios/native/data_ref.cy.spec.js
@@ -9,6 +9,9 @@ describe("scenarios > native question > data reference sidebar", () => {
   it("should show tables", () => {
     openNativeEditor();
     cy.icon("reference").click();
+    cy.get("[data-testid='sidebar-header-title']").findByText(
+      "Sample Database",
+    );
     cy.findByText("ORDERS").click();
     cy.findByText(
       "Confirmed Sample Company orders for a product, from a user.",
@@ -16,6 +19,13 @@ describe("scenarios > native question > data reference sidebar", () => {
     cy.findByText("9 columns");
     cy.findByText("QUANTITY").click();
     cy.findByText("Number of products bought.");
+    // clicking the title should navigate back
+    cy.findByText("QUANTITY").click();
+    cy.findByText("ORDERS").click();
+    cy.get("[data-testid='sidebar-header-title']")
+      .findByText("Sample Database")
+      .click();
+    cy.findByText("Data Reference");
   });
 
   it("should show models", () => {
-- 
GitLab