From a1e98eb38fe0d7399e4ed11b4db24c7e14fb1a96 Mon Sep 17 00:00:00 2001
From: Gustavo Saiani <gus@metabase.com>
Date: Tue, 11 Oct 2022 11:23:55 -0300
Subject: [PATCH] Adapt cancel button for new model pages (#25862)

---
 .../metabase/query_builder/actions/models.js  |  5 ++++
 .../DatasetEditor/DatasetEditor.jsx           | 29 +++++++++++++++----
 .../scenarios/models/create.cy.spec.js        | 17 +++++++++--
 3 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/frontend/src/metabase/query_builder/actions/models.js b/frontend/src/metabase/query_builder/actions/models.js
index 73ec6f11918..dd7d7304ab7 100644
--- a/frontend/src/metabase/query_builder/actions/models.js
+++ b/frontend/src/metabase/query_builder/actions/models.js
@@ -1,4 +1,5 @@
 import { createAction } from "redux-actions";
+import { push } from "react-router-redux";
 import { merge } from "icepick";
 import { t } from "ttag";
 
@@ -19,6 +20,10 @@ export const setDatasetEditorTab = datasetEditorTab => dispatch => {
   dispatch(runDirtyQuestionQuery());
 };
 
+export const onCancelCreateNewModel = () => async dispatch => {
+  await dispatch(push("/"));
+};
+
 export const CANCEL_DATASET_CHANGES = "metabase/qb/CANCEL_DATASET_CHANGES";
 export const onCancelDatasetChanges = () => (dispatch, getState) => {
   const cardBeforeChanges = getOriginalCard(getState());
diff --git a/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx b/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx
index 6cc2c8f15a1..72298f8ce4b 100644
--- a/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx
+++ b/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx
@@ -8,6 +8,7 @@ import { merge } from "icepick";
 import ActionButton from "metabase/components/ActionButton";
 import Button from "metabase/core/components/Button";
 import DebouncedFrame from "metabase/components/DebouncedFrame";
+import Confirm from "metabase/components/Confirm";
 
 import QueryVisualization from "metabase/query_builder/components/QueryVisualization";
 import ViewSidebar from "metabase/query_builder/components/view/ViewSidebar";
@@ -59,6 +60,7 @@ const propTypes = {
   setDatasetEditorTab: PropTypes.func.isRequired,
   setFieldMetadata: PropTypes.func.isRequired,
   onSave: PropTypes.func.isRequired,
+  onCancelCreateNewModel: PropTypes.func.isRequired,
   onCancelDatasetChanges: PropTypes.func.isRequired,
   handleResize: PropTypes.func.isRequired,
   runQuestionQuery: PropTypes.func.isRequired,
@@ -176,6 +178,7 @@ function DatasetEditor(props) {
     setDatasetEditorTab,
     setFieldMetadata,
     onCancelDatasetChanges,
+    onCancelCreateNewModel,
     onSave,
     handleResize,
     onOpenModal,
@@ -305,7 +308,11 @@ function DatasetEditor(props) {
     [initialEditorHeight, setDatasetEditorTab],
   );
 
-  const handleCancel = useCallback(() => {
+  const handleCancelCreate = useCallback(() => {
+    onCancelCreateNewModel();
+  }, [onCancelCreateNewModel]);
+
+  const handleCancelEdit = useCallback(() => {
     onCancelDatasetChanges();
     setQueryBuilderMode("view");
   }, [setQueryBuilderMode, onCancelDatasetChanges]);
@@ -423,11 +430,21 @@ function DatasetEditor(props) {
           />
         }
         buttons={[
-          <Button
-            key="cancel"
-            onClick={handleCancel}
-            small
-          >{t`Cancel`}</Button>,
+          dataset.isSaved() ? (
+            <Button
+              key="cancel"
+              small
+              onClick={handleCancelEdit}
+            >{t`Cancel`}</Button>
+          ) : (
+            <Confirm
+              key="cancel"
+              action={handleCancelCreate}
+              title={t`Cancel creating model`}
+            >
+              <Button small>{t`Cancel`}</Button>
+            </Confirm>
+          ),
           <ActionButton
             key="save"
             disabled={!canSaveChanges}
diff --git a/frontend/test/metabase/scenarios/models/create.cy.spec.js b/frontend/test/metabase/scenarios/models/create.cy.spec.js
index 58eb415ed21..dcac6a4467d 100644
--- a/frontend/test/metabase/scenarios/models/create.cy.spec.js
+++ b/frontend/test/metabase/scenarios/models/create.cy.spec.js
@@ -10,9 +10,14 @@ describe("scenarios > models > create", () => {
   it("creates a native query model via the New button", () => {
     cy.visit("/");
 
-    cy.findByText("New").click();
-    cy.findByText("Model").click();
-    cy.findByText("Use a native query").click();
+    goFromHomePageToNewNativeQueryModelPage();
+
+    // Cancel creation with confirmation modal
+    cy.findByText("Cancel").click();
+    cy.findByText("Yes").click();
+
+    // Now we will create a model
+    goFromHomePageToNewNativeQueryModelPage();
 
     cy.get(".ace_editor").should("be.visible").type("select * from ORDERS");
 
@@ -25,3 +30,9 @@ describe("scenarios > models > create", () => {
     cy.findByText("Saved");
   });
 });
+
+function goFromHomePageToNewNativeQueryModelPage() {
+  cy.findByText("New").click();
+  cy.findByText("Model").click();
+  cy.findByText("Use a native query").click();
+}
-- 
GitLab