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