From fb0ecd79193678888b09e1ad58ea445ed160cefc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Atte=20Kein=C3=A4nen?= <atte.keinanen@gmail.com>
Date: Tue, 9 May 2017 11:19:18 -0700
Subject: [PATCH] Use hash parameter from query string, remove it after use [ci
 e2e]

---
 .../containers/AddToDashSelectDashModal.jsx      |  2 +-
 .../dashboard/containers/DashboardApp.jsx        | 16 +++++++++++++---
 .../metabase/dashboard/hoc/DashboardControls.jsx | 10 +++++++++-
 .../test/e2e/query_builder/query_builder.spec.js |  2 +-
 4 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/frontend/src/metabase/containers/AddToDashSelectDashModal.jsx b/frontend/src/metabase/containers/AddToDashSelectDashModal.jsx
index 182384687bf..31df0ab2ccf 100644
--- a/frontend/src/metabase/containers/AddToDashSelectDashModal.jsx
+++ b/frontend/src/metabase/containers/AddToDashSelectDashModal.jsx
@@ -45,7 +45,7 @@ export default class AddToDashSelectDashModal extends Component {
 
     addToDashboard = (dashboard: Dashboard) => {
         // we send the user over to the chosen dashboard in edit mode with the current card added
-        this.props.onChangeLocation(Urls.dashboard(dashboard.id)+"?add="+this.props.card.id);
+        this.props.onChangeLocation(Urls.dashboard(dashboard.id)+"#add="+this.props.card.id);
     }
 
     createDashboard = async(newDashboard: Dashboard) => {
diff --git a/frontend/src/metabase/dashboard/containers/DashboardApp.jsx b/frontend/src/metabase/dashboard/containers/DashboardApp.jsx
index 1475e94908f..6b25d1ab2f1 100644
--- a/frontend/src/metabase/dashboard/containers/DashboardApp.jsx
+++ b/frontend/src/metabase/dashboard/containers/DashboardApp.jsx
@@ -16,6 +16,7 @@ import { getUserIsAdmin } from "metabase/selectors/user";
 
 import * as dashboardActions from "../dashboard";
 import {archiveDashboard} from "metabase/dashboards/dashboards"
+import {parseHashOptions} from "metabase/lib/browser";
 
 const mapStateToProps = (state, props) => {
   return {
@@ -34,8 +35,6 @@ const mapStateToProps = (state, props) => {
       editingParameter:     getEditingParameter(state, props),
       parameters:           getParameters(state, props),
       parameterValues:      getParameterValues(state, props),
-      addCardOnLoad:        props.location.query.add ? parseInt(props.location.query.add) : null,
-
       metadata:             getMetadata(state)
   }
 }
@@ -51,7 +50,18 @@ const mapDispatchToProps = {
 @connect(mapStateToProps, mapDispatchToProps)
 @title(({ dashboard }) => dashboard && dashboard.name)
 export default class DashboardApp extends Component {
+    state = {
+        addCardOnLoad: null
+    }
+
+    componentWillMount() {
+        let options = parseHashOptions(window.location.hash);
+        if (options.add) {
+            this.setState({addCardOnLoad: parseInt(options.add)})
+        }
+    }
+
     render() {
-        return <Dashboard {...this.props} />;
+        return <Dashboard addCardOnLoad={this.state.addCardOnLoad} {...this.props} />;
     }
 }
diff --git a/frontend/src/metabase/dashboard/hoc/DashboardControls.jsx b/frontend/src/metabase/dashboard/hoc/DashboardControls.jsx
index 3651bfac14a..3f2946ea9c7 100644
--- a/frontend/src/metabase/dashboard/hoc/DashboardControls.jsx
+++ b/frontend/src/metabase/dashboard/hoc/DashboardControls.jsx
@@ -86,6 +86,7 @@ export default (ComposedComponent: ReactClass<any>) =>
             };
 
             updateDashboardParams = () => {
+                // should I do it here?
                 let options = parseHashOptions(window.location.hash);
                 const setValue = (name, value) => {
                     if (value) {
@@ -97,8 +98,14 @@ export default (ComposedComponent: ReactClass<any>) =>
                 setValue("refresh", this.state.refreshPeriod);
                 setValue("fullscreen", this.state.isFullscreen);
                 setValue("theme", this.state.isNightMode ? "night" : null);
+
                 delete options.night; // DEPRECATED: options.night
 
+                // Delete the "add card to dashboard" parameter if it's present because we don't
+                // want to add the card again on page refresh. The `add` parameter is already handled in
+                // DashboardApp before this method is called.
+                delete options.add;
+
                 let hash = stringifyHashOptions(options);
                 hash = hash ? "#" + hash : "";
 
@@ -106,7 +113,7 @@ export default (ComposedComponent: ReactClass<any>) =>
                 if (hash !== location.hash) {
                     replace({
                         pathname: location.pathname,
-                        earch: location.search,
+                        search: location.search,
                         hash
                     });
                 }
@@ -199,6 +206,7 @@ export default (ComposedComponent: ReactClass<any>) =>
                         onNightModeChange={this.setNightMode}
                         onFullscreenChange={this.setFullscreen}
                         onRefreshPeriodChange={this.setRefreshPeriod}
+                        addDashboardOnLoad={this.addDashboardOnLoad}
                     />
                 );
             }
diff --git a/frontend/test/e2e/query_builder/query_builder.spec.js b/frontend/test/e2e/query_builder/query_builder.spec.js
index 616170c39c1..4a223757fcb 100644
--- a/frontend/test/e2e/query_builder/query_builder.spec.js
+++ b/frontend/test/e2e/query_builder/query_builder.spec.js
@@ -63,7 +63,7 @@ describeE2E("query_builder", () => {
             await d.select("#CreateDashboardModal .Button.Button--primary").wait().click().waitRemoved(); // wait for the modal to be removed
             incrementDashboardCount();
 
-            await d.waitUrl(getLatestDashboardUrl() + "?add=" + cardId);
+            await d.waitUrl(getLatestDashboardUrl() + "#add=" + cardId);
 
             // save dashboard
             await d.select(".EditHeader .Button.Button--primary").wait().click();
-- 
GitLab