From fa710c66e10a0708ef1ce356d55e301b011ee11e Mon Sep 17 00:00:00 2001
From: Tom Robinson <tlrobinson@gmail.com>
Date: Tue, 27 Dec 2016 15:18:57 -0800
Subject: [PATCH] Move Undo out of /questions. Show collection name/link when
 unarchiving

---
 frontend/src/metabase/App.jsx                 |  4 +++-
 .../containers/UndoListing.css                | 14 ++++-------
 .../containers/UndoListing.jsx                | 14 +++++++----
 frontend/src/metabase/css/core/flex.css       |  2 +-
 .../metabase/questions/containers/Archive.jsx |  2 +-
 .../questions/containers/EntityList.jsx       |  2 --
 frontend/src/metabase/questions/questions.js  | 24 +++++++++++++++----
 frontend/src/metabase/questions/selectors.js  |  2 --
 frontend/src/metabase/reducers.js             |  4 ++--
 .../src/metabase/{questions => redux}/undo.js |  2 +-
 frontend/src/metabase/selectors/undo.js       |  2 ++
 11 files changed, 43 insertions(+), 29 deletions(-)
 rename frontend/src/metabase/{questions => }/containers/UndoListing.css (79%)
 rename frontend/src/metabase/{questions => }/containers/UndoListing.jsx (79%)
 rename frontend/src/metabase/{questions => redux}/undo.js (97%)
 create mode 100644 frontend/src/metabase/selectors/undo.js

diff --git a/frontend/src/metabase/App.jsx b/frontend/src/metabase/App.jsx
index d80a693f399..3c28474c21b 100644
--- a/frontend/src/metabase/App.jsx
+++ b/frontend/src/metabase/App.jsx
@@ -2,6 +2,8 @@ import React, { Component, PropTypes } from "react";
 
 import Navbar from "metabase/nav/containers/Navbar.jsx";
 
+import UndoListing from "metabase/containers/UndoListing";
+
 export default class App extends Component {
     render() {
         const { children, location } = this.props;
@@ -9,8 +11,8 @@ export default class App extends Component {
             <div className="spread flex flex-column">
                 <Navbar location={location} className="flex-no-shrink" />
                 {children}
+                <UndoListing />
             </div>
         )
     }
 }
-
diff --git a/frontend/src/metabase/questions/containers/UndoListing.css b/frontend/src/metabase/containers/UndoListing.css
similarity index 79%
rename from frontend/src/metabase/questions/containers/UndoListing.css
rename to frontend/src/metabase/containers/UndoListing.css
index f32245dd586..3be2dae68c2 100644
--- a/frontend/src/metabase/questions/containers/UndoListing.css
+++ b/frontend/src/metabase/containers/UndoListing.css
@@ -1,5 +1,3 @@
-@import '../Questions.css';
-
 :local(.listing) {
     composes: m2 from "style";
     composes: fixed left bottom from "style";
@@ -8,23 +6,21 @@
 
 :local(.undo) {
     composes: mt2 p2 from "style";
-    composes: bordered from "style";
-    composes: rounded from "style";
-    composes: shadowed from "style";
-    composes: relative from "style";
+    composes: bordered rounded shadowed from "style";
     composes: bg-white from "style";
+    composes: relative from "style";
+    composes: flex align-center from "style";
     width: 320px;
 }
 
 :local(.actions) {
-    composes: flex align-center from "style";
-    composes: float-right from "style";
+    composes: flex align-center flex-align-right from "style";
 }
 
 :local(.undoButton) {
     composes: mx2 from "style";
     composes: text-uppercase text-bold from "style";
-    color: var(--blue-color);
+    color: var(--brand-color);
 }
 :local(.dismissButton) {
     composes: cursor-pointer from "style";
diff --git a/frontend/src/metabase/questions/containers/UndoListing.jsx b/frontend/src/metabase/containers/UndoListing.jsx
similarity index 79%
rename from frontend/src/metabase/questions/containers/UndoListing.jsx
rename to frontend/src/metabase/containers/UndoListing.jsx
index b9cc4c543c0..65e1723b40e 100644
--- a/frontend/src/metabase/questions/containers/UndoListing.jsx
+++ b/frontend/src/metabase/containers/UndoListing.jsx
@@ -1,11 +1,12 @@
 /* eslint "react/prop-types": "warn" */
 import React, { Component, PropTypes } from "react";
+import { Link } from "react-router";
 import { connect } from "react-redux";
 
 import S from "./UndoListing.css";
 
-import { dismissUndo, performUndo } from "../undo";
-import { getUndos } from "../selectors";
+import { dismissUndo, performUndo } from "metabase/redux/undo";
+import { getUndos } from "metabase/selectors/undo";
 
 import Icon from "metabase/components/Icon";
 import BodyComponent from "metabase/components/BodyComponent";
@@ -43,11 +44,14 @@ export default class UndoListing extends Component {
                 >
                 { undos.map(undo =>
                     <li key={undo._domId} className={S.undo}>
-                        <span className={S.message}>{typeof undo.message === "function" ? undo.message(undo) : undo.message}</span>
-                        <span className={S.actions}>
+                        <div className={S.message}>
+                            {typeof undo.message === "function" ? undo.message(undo) : undo.message}
+                        </div>
+
+                        <div className={S.actions}>
                             <a className={S.undoButton} onClick={() => performUndo(undo.id)}>Undo</a>
                             <Icon className={S.dismissButton} name="close" onClick={() => dismissUndo(undo.id)} />
-                        </span>
+                        </div>
                     </li>
                 )}
                 </ReactCSSTransitionGroup>
diff --git a/frontend/src/metabase/css/core/flex.css b/frontend/src/metabase/css/core/flex.css
index 9c555afb311..9ad2d5853c9 100644
--- a/frontend/src/metabase/css/core/flex.css
+++ b/frontend/src/metabase/css/core/flex.css
@@ -40,7 +40,7 @@
     align-items: flex-end;
 }
 
-.align-self-end {
+.align-self-end, :local(.align-self-end) {
     align-self: flex-end;
 }
 
diff --git a/frontend/src/metabase/questions/containers/Archive.jsx b/frontend/src/metabase/questions/containers/Archive.jsx
index 91f6ccd5248..d820b9b6aed 100644
--- a/frontend/src/metabase/questions/containers/Archive.jsx
+++ b/frontend/src/metabase/questions/containers/Archive.jsx
@@ -58,7 +58,7 @@ export default class Archive extends Component {
                             }} />
                         : item.type === "card" ?
                             <ArchivedItem name={item.name} type="card" icon={visualizations.get(item.display).iconName} isAdmin={isAdmin} onUnarchive={async () => {
-                                await this.props.setArchived(item.id, false);
+                                await this.props.setArchived(item.id, false, true);
                                 this.loadEntities();
                             }} />
                         :
diff --git a/frontend/src/metabase/questions/containers/EntityList.jsx b/frontend/src/metabase/questions/containers/EntityList.jsx
index 72e4b850a8b..ea4986b7726 100644
--- a/frontend/src/metabase/questions/containers/EntityList.jsx
+++ b/frontend/src/metabase/questions/containers/EntityList.jsx
@@ -13,7 +13,6 @@ import S from "../components/List.css";
 import List from "../components/List";
 import SearchHeader from "../components/SearchHeader";
 import ActionHeader from "../components/ActionHeader";
-import UndoListing from "./UndoListing";
 
 import _ from "underscore";
 
@@ -225,7 +224,6 @@ export default class EntityList extends Component {
                     }
                     </LoadingAndErrorWrapper>
                 </div>
-                <UndoListing />
             </div>
         );
     }
diff --git a/frontend/src/metabase/questions/questions.js b/frontend/src/metabase/questions/questions.js
index 82df012d1da..23f86b1b7db 100644
--- a/frontend/src/metabase/questions/questions.js
+++ b/frontend/src/metabase/questions/questions.js
@@ -7,11 +7,13 @@ import _ from "underscore";
 
 import { inflect } from "metabase/lib/formatting";
 import MetabaseAnalytics from "metabase/lib/analytics";
+import Urls from "metabase/lib/urls";
+
+import { push, replace } from "react-router-redux";
 import { setRequestState } from "metabase/redux/requests";
+import { addUndo } from "metabase/redux/undo";
 
 import { getVisibleEntities, getSelectedEntities } from "./selectors";
-import { addUndo } from "./undo";
-import { push, replace } from "react-router-redux";
 
 import { SET_COLLECTION_ARCHIVED } from "./collections";
 
@@ -69,11 +71,22 @@ export const setFavorited = createThunkAction(SET_FAVORITED, (cardId, favorited)
     }
 });
 
-function createUndo(type, actions) {
+import React from "react";
+import { Link } from "react-router";
+
+function createUndo(type, actions, collection) {
     return {
         type: type,
         count: actions.length,
-        message: (undo) => undo.count + " " + inflect(null, undo.count, "question was", "questions were") + " " + type,
+        message: (undo) =>
+            <div className="flex flex-column">
+                <div>
+                    { undo.count + " " + inflect(null, undo.count, "question was", "questions were") + " " + type }
+                    { undo.count === 1 && collection &&
+                        <span> to the <Link className="link" to={Urls.collection(collection)}>{collection.name}</Link> collection.</span>
+                    }
+                </div>
+            </div>,
         actions: actions
     };
 }
@@ -101,7 +114,8 @@ export const setArchived = createThunkAction(SET_ARCHIVED, (cardId, archived, un
             if (undoable) {
                 dispatch(addUndo(createUndo(
                     archived ? "archived" : "unarchived",
-                    [setArchived(cardId, !archived)]
+                    [setArchived(cardId, !archived)],
+                    !archived && card.collection
                 )));
                 MetabaseAnalytics.trackEvent("Questions", archived ? "Archive" : "Unarchive");
             }
diff --git a/frontend/src/metabase/questions/selectors.js b/frontend/src/metabase/questions/selectors.js
index 36a79552617..8710ce228e1 100644
--- a/frontend/src/metabase/questions/selectors.js
+++ b/frontend/src/metabase/questions/selectors.js
@@ -202,5 +202,3 @@ export const getSectionName = createSelector(
         return "";
     }
 );
-
-export const getUndos = (state, props) => state.undo;
diff --git a/frontend/src/metabase/reducers.js b/frontend/src/metabase/reducers.js
index 77c3457ef8c..0cd9ca0a5ee 100644
--- a/frontend/src/metabase/reducers.js
+++ b/frontend/src/metabase/reducers.js
@@ -6,6 +6,7 @@ import auth from "metabase/auth/auth";
 /* ducks */
 import metadata from "metabase/redux/metadata";
 import requests from "metabase/redux/requests";
+import undo from "metabase/redux/undo";
 
 /* admin */
 import settings from "metabase/admin/settings/settings";
@@ -22,7 +23,6 @@ import * as home from "metabase/home/reducers";
 import questions from "metabase/questions/questions";
 import labels from "metabase/questions/labels";
 import collections from "metabase/questions/collections";
-import undo from "metabase/questions/undo";
 import * as qb from "metabase/query_builder/reducers";
 
 /* data reference */
@@ -44,6 +44,7 @@ const reducers = {
     currentUser,
     metadata,
     requests,
+    undo,
 
     // main app reducers
     dashboard,
@@ -53,7 +54,6 @@ const reducers = {
     questions,
     collections,
     labels,
-    undo,
     reference,
     setup: combineReducers(setup),
     user: combineReducers(user),
diff --git a/frontend/src/metabase/questions/undo.js b/frontend/src/metabase/redux/undo.js
similarity index 97%
rename from frontend/src/metabase/questions/undo.js
rename to frontend/src/metabase/redux/undo.js
index 9d50538ac09..a96d9f3a396 100644
--- a/frontend/src/metabase/questions/undo.js
+++ b/frontend/src/metabase/redux/undo.js
@@ -14,7 +14,7 @@ let nextUndoId = 0;
 export const addUndo = createThunkAction(ADD_UNDO, (undo) => {
     return (dispatch, getState) => {
         let id = nextUndoId++;
-        setTimeout(() => dispatch(dismissUndo(id, false)), 5000);
+        // setTimeout(() => dispatch(dismissUndo(id, false)), 5000);
         return { ...undo, id, _domId: id };
     };
 });
diff --git a/frontend/src/metabase/selectors/undo.js b/frontend/src/metabase/selectors/undo.js
new file mode 100644
index 00000000000..852127bf143
--- /dev/null
+++ b/frontend/src/metabase/selectors/undo.js
@@ -0,0 +1,2 @@
+
+export const getUndos = (state, props) => state.undo;
-- 
GitLab