couchdb-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From robertkowal...@apache.org
Subject fauxton commit: updated refs/heads/master to 6fbf911
Date Fri, 30 Sep 2016 08:48:13 GMT
Repository: couchdb-fauxton
Updated Branches:
  refs/heads/master 73a90d213 -> 6fbf911a0


react: breadcrumbs

reactify former "breadcrumb"-area.

PR: #765
PR-URL: https://github.com/apache/couchdb-fauxton/pull/765
Reviewed-By: garren smith <garren.smith@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/commit/6fbf911a
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/tree/6fbf911a
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/diff/6fbf911a

Branch: refs/heads/master
Commit: 6fbf911a0932dd6f8c266ab2bf163267839070d6
Parents: 73a90d2
Author: Robert Kowalski <robertkowalski@apache.org>
Authored: Thu Aug 18 13:36:04 2016 +0200
Committer: Robert Kowalski <robertkowalski@apache.org>
Committed: Fri Sep 30 10:47:37 2016 +0200

----------------------------------------------------------------------
 app/addons/components/actions.js                |   2 +-
 .../components/assets/less/components.less      |   1 -
 .../assets/less/header-breadcrumbs.less         |   3 +
 .../components/assets/less/left-header.less     |  26 -----
 .../components/react-components.react.jsx       |  18 ++--
 app/addons/databases/base.js                    |   2 +-
 .../tests/nightwatch/deletesDatabase.js         |   6 +-
 .../nightwatch/deletesDatabaseSpecialChars.js   |  13 +--
 .../documents/assets/less/doc-editor.less       |   4 -
 app/addons/documents/assets/less/documents.less |   7 +-
 .../documents/assets/less/header-docs-left.less |  78 ++++++++++++++
 .../documents/components/header-docs-left.jsx   |  92 ++++++++++++++++
 .../documents/components/header-docs-right.jsx  |  45 ++++++++
 .../components/rightalldocsheader.react.jsx     |  45 --------
 app/addons/documents/helpers.js                 |   8 +-
 app/addons/documents/routes-documents.js        |   7 +-
 app/addons/documents/routes-index-editor.js     |   2 +-
 app/addons/documents/routes-mango.js            |   2 +-
 app/addons/documents/shared-routes.js           |  17 ++-
 .../tests/nightwatch/deleteDatabaseModal.js     |  14 +--
 .../tests/nightwatch/doubleEmitResults.js       |   1 -
 .../documents/tests/nightwatch/viewCreate.js    |  18 ++--
 .../tests/nightwatch/viewCreateBadView.js       |   8 +-
 .../documents/tests/nightwatch/viewEdit.js      |  49 ++++-----
 app/addons/fauxton/base.js                      |   3 -
 app/addons/fauxton/components.js                | 105 -------------------
 app/addons/fauxton/templates/breadcrumbs.html   |  34 ------
 app/addons/fauxton/templates/header_left.html   |  18 ----
 app/addons/fauxton/tests/breadcrumbsViewSpec.js | 100 ------------------
 app/addons/fauxton/tests/componentsSpec.js      |  35 -------
 app/addons/permissions/routes.js                |   3 -
 app/templates/layouts/with_tabs_sidebar.html    |   2 +-
 assets/less/fauxton.less                        |  96 -----------------
 assets/less/layouts.less                        |  17 ---
 assets/less/templates.less                      |   9 --
 35 files changed, 296 insertions(+), 594 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/components/actions.js
----------------------------------------------------------------------
diff --git a/app/addons/components/actions.js b/app/addons/components/actions.js
index 53ccd15..8fb6593 100644
--- a/app/addons/components/actions.js
+++ b/app/addons/components/actions.js
@@ -43,7 +43,7 @@ function showDeleteDatabaseModal (options) {
 }
 
 function deleteDatabase (dbId) {
-  var url = FauxtonAPI.urls('databaseBaseURL', 'server', dbId, '');
+  const url = FauxtonAPI.urls('databaseBaseURL', 'server', dbId, '');
 
   $.ajax({
     url: url,

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/components/assets/less/components.less
----------------------------------------------------------------------
diff --git a/app/addons/components/assets/less/components.less b/app/addons/components/assets/less/components.less
index ac57783..6df33c8 100644
--- a/app/addons/components/assets/less/components.less
+++ b/app/addons/components/assets/less/components.less
@@ -21,5 +21,4 @@
 @import "badges.less";
 @import "modals.less";
 @import "tab-element.less";
-@import "left-header.less";
 @import "header-breadcrumbs.less";

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/components/assets/less/header-breadcrumbs.less
----------------------------------------------------------------------
diff --git a/app/addons/components/assets/less/header-breadcrumbs.less b/app/addons/components/assets/less/header-breadcrumbs.less
index 37f5bd2..c59fd9a 100644
--- a/app/addons/components/assets/less/header-breadcrumbs.less
+++ b/app/addons/components/assets/less/header-breadcrumbs.less
@@ -10,8 +10,11 @@
 // License for the specific language governing permissions and limitations under
 // the License.
 
+@import "../../../../../assets/less/variables.less";
+
 .faux-header__breadcrumbs {
   .display-flex();
+  height: @collapsedNavWidth;
 }
 
 .faux-header__breadcrumbs-element {

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/components/assets/less/left-header.less
----------------------------------------------------------------------
diff --git a/app/addons/components/assets/less/left-header.less b/app/addons/components/assets/less/left-header.less
deleted file mode 100644
index 16bb8ea..0000000
--- a/app/addons/components/assets/less/left-header.less
+++ /dev/null
@@ -1,26 +0,0 @@
-@import "../../../../../assets/less/variables.less";
-
-.header-left #header-dropdown-menu {
-  top: 0;
-  height: 64px;
-  border-left: 1px solid #cccccc;
-  padding: 20px 0;
-
-  .dropdown {
-    font-size: 20px;
-    .dropdown-toggle {
-      padding: 10px 16px;
-      color: #555555;
-      &:before {
-        width: 10px;
-      }
-      &:hover {
-        color: @red;
-      }
-    }
-  }
-  .dropdown-menu {
-    left: -115px;
-    top: 34px;
-  }
-}

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/components/react-components.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/components/react-components.react.jsx b/app/addons/components/react-components.react.jsx
index d1dcbf1..c45d19d 100644
--- a/app/addons/components/react-components.react.jsx
+++ b/app/addons/components/react-components.react.jsx
@@ -1160,7 +1160,7 @@ const ConfirmButton = React.createClass({
   }
 });
 
-var MenuDropDown = React.createClass({
+const MenuDropDown = React.createClass({
 
   getDefaultProps: function () {
     return {
@@ -1171,9 +1171,9 @@ var MenuDropDown = React.createClass({
   createSectionLinks: function (links) {
     if (!links) { return null; }
 
-    return links.map(function (link, key) {
+    return links.map((link, key) => {
       return this.createEntry(link, key);
-    }.bind(this));
+    });
   },
 
   createEntry: function (link, key) {
@@ -1201,7 +1201,7 @@ var MenuDropDown = React.createClass({
   },
 
   createSection: function () {
-    return this.props.links.map(function (linkSection, key) {
+    return this.props.links.map((linkSection, key) => {
       if (linkSection.title && linkSection.links) {
         return ([
           this.createSectionTitle(linkSection.title),
@@ -1211,7 +1211,7 @@ var MenuDropDown = React.createClass({
 
       return this.createEntry(linkSection, 'el' + key);
 
-    }.bind(this));
+    });
   },
 
   render: function () {
@@ -1489,7 +1489,7 @@ var DeleteDatabaseModal = React.createClass({
   },
 
   onInputChange: function (e) {
-    var val = encodeURIComponent(e.target.value.trim());
+    const val = e.target.value.trim();
 
     this.setState({
       inputValue: val
@@ -1618,12 +1618,6 @@ export default {
   TrayWrapper: TrayWrapper,
   connectToStores: connectToStores,
   ApiBarController: ApiBarController,
-  renderMenuDropDown: function (el, opts) {
-    ReactDOM.render(<MenuDropDown icon="fonticon-vertical-ellipsis" links={opts.links} />, el);
-  },
-  removeMenuDropDown: function (el) {
-    ReactDOM.unmountComponentAtNode(el);
-  },
   DeleteDatabaseModal: DeleteDatabaseModal,
   TabElement: TabElement,
   TabElementWrapper: TabElementWrapper

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/databases/base.js
----------------------------------------------------------------------
diff --git a/app/addons/databases/base.js b/app/addons/databases/base.js
index b31fcc7..0ebb174 100644
--- a/app/addons/databases/base.js
+++ b/app/addons/databases/base.js
@@ -54,7 +54,7 @@ FauxtonAPI.registerUrls('allDBs', {
 
 FauxtonAPI.registerUrls('databaseBaseURL', {
   server: function (database) {
-    return window.location.origin + '/' + database;
+    return window.location.origin + '/' + app.utils.safeURLName(database);
   },
   app: function (database) {
     return '/database/' + database;

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/databases/tests/nightwatch/deletesDatabase.js
----------------------------------------------------------------------
diff --git a/app/addons/databases/tests/nightwatch/deletesDatabase.js b/app/addons/databases/tests/nightwatch/deletesDatabase.js
index f5672b3..23e4094 100644
--- a/app/addons/databases/tests/nightwatch/deletesDatabase.js
+++ b/app/addons/databases/tests/nightwatch/deletesDatabase.js
@@ -22,10 +22,8 @@ module.exports = {
       .createDatabase(newDatabaseName)
       .loginToGUI()
       .url(baseUrl + '/#/database/' + newDatabaseName + '/_all_docs')
-      .waitForElementPresent('#header-dropdown-menu a.dropdown-toggle.icon.fonticon-vertical-ellipsis', waitTime, false)
-      .clickWhenVisible("#header-dropdown-menu a.dropdown-toggle.icon.fonticon-vertical-ellipsis", waitTime, false)
-      .waitForElementPresent('#header-dropdown-menu .fonticon-trash', waitTime, false)
-      .clickWhenVisible('#header-dropdown-menu .fonticon-trash', waitTime, false)
+      .clickWhenVisible('.faux-header__doc-header-dropdown-toggle')
+      .clickWhenVisible('.faux-header__doc-header-dropdown-itemwrapper .fonticon-trash')
       .waitForElementVisible('.delete-db-modal', waitTime, false)
       .clickWhenVisible('.delete-db-modal input[type="text"]', waitTime, false)
       .setValue('.delete-db-modal input[type="text"]', [newDatabaseName, client.Keys.ENTER])

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/databases/tests/nightwatch/deletesDatabaseSpecialChars.js
----------------------------------------------------------------------
diff --git a/app/addons/databases/tests/nightwatch/deletesDatabaseSpecialChars.js b/app/addons/databases/tests/nightwatch/deletesDatabaseSpecialChars.js
index b2ca4c8..ff884d9 100644
--- a/app/addons/databases/tests/nightwatch/deletesDatabaseSpecialChars.js
+++ b/app/addons/databases/tests/nightwatch/deletesDatabaseSpecialChars.js
@@ -11,21 +11,18 @@
 // the License.
 
 
-
 module.exports = {
   'Deletes a database with special chars': function (client) {
-    var waitTime = client.globals.maxWaitTime,
-        newDatabaseName = 'one/two-three/_four', // add any other chars here you want to test
-        baseUrl = client.globals.test_settings.launch_url;
+    const waitTime = client.globals.maxWaitTime;
+    const newDatabaseName = 'one/two-three/_four'; // add any other chars here you want to test
+    const baseUrl = client.globals.test_settings.launch_url;
 
     client
       .createDatabase(newDatabaseName)
       .loginToGUI()
       .url(baseUrl + '/#/database/' + encodeURIComponent(newDatabaseName) + '/_all_docs')
-      .waitForElementPresent('#header-dropdown-menu a.dropdown-toggle.icon.fonticon-vertical-ellipsis', waitTime, false)
-      .clickWhenVisible("#header-dropdown-menu a.dropdown-toggle.icon.fonticon-vertical-ellipsis", waitTime, false)
-      .waitForElementPresent('#header-dropdown-menu .fonticon-trash', waitTime, false)
-      .clickWhenVisible('#header-dropdown-menu .fonticon-trash', waitTime, false)
+      .clickWhenVisible('.faux-header__doc-header-dropdown-toggle')
+      .clickWhenVisible('.faux-header__doc-header-dropdown-itemwrapper .fonticon-trash')
       .waitForElementVisible('.delete-db-modal', waitTime, false)
       .clickWhenVisible('.delete-db-modal input[type="text"]', waitTime, false)
       .setValue('.delete-db-modal input[type="text"]', [newDatabaseName, client.Keys.ENTER])

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/assets/less/doc-editor.less
----------------------------------------------------------------------
diff --git a/app/addons/documents/assets/less/doc-editor.less b/app/addons/documents/assets/less/doc-editor.less
index 9565e14..6c13b5f 100644
--- a/app/addons/documents/assets/less/doc-editor.less
+++ b/app/addons/documents/assets/less/doc-editor.less
@@ -39,10 +39,6 @@
     }
   }
 
-  #breadcrumbs {
-    white-space: nowrap;
-  }
-
   #doc-editor-actions-panel {
     position: absolute;
     top: 64px;

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/assets/less/documents.less
----------------------------------------------------------------------
diff --git a/app/addons/documents/assets/less/documents.less b/app/addons/documents/assets/less/documents.less
index 6938d74..d0ea8fd 100644
--- a/app/addons/documents/assets/less/documents.less
+++ b/app/addons/documents/assets/less/documents.less
@@ -20,7 +20,8 @@
 @import "index-results.less";
 @import "doc-editor.less";
 @import "header.less";
-@import "revision-browser";
+@import "revision-browser.less";
+@import "header-docs-left.less";
 
 
 button.beautify {
@@ -222,3 +223,7 @@ body #dashboard #react-headerbar {
   }
 
 }
+
+.two-pane .faux-header__breadcrumbs {
+  width: 440px;
+}

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/assets/less/header-docs-left.less
----------------------------------------------------------------------
diff --git a/app/addons/documents/assets/less/header-docs-left.less b/app/addons/documents/assets/less/header-docs-left.less
new file mode 100644
index 0000000..fc456b1
--- /dev/null
+++ b/app/addons/documents/assets/less/header-docs-left.less
@@ -0,0 +1,78 @@
+@import "../../../../../assets/less/variables.less";
+
+.faux-header__doc-header-left {
+  top: 0;
+  right: 0;
+  height: @collapsedNavWidth;
+  border-right: 1px solid @grayLight;
+  width: @sidebarWidth + 1px;
+
+  .display-flex();
+  .flex-direction(row);
+}
+
+.faux-header__doc-header-title {
+  height: @collapsedNavWidth;
+  width: 247px;
+  color: #333;
+  font-size: 24px;
+  line-height: 24px;
+  padding: 22px 10px;
+  border-right: 1px solid #ccc;
+}
+
+.faux-header__doc-header-dropdown-toggle {
+  border: none;
+  height: @collapsedNavWidth;
+  right: 0;
+  padding: 10px 16px;
+  width: 43px;
+  background-color: transparent !important;
+  border: none;
+  box-shadow: none !important;
+}
+
+button.faux-header__doc-header-dropdown-toggle:focus {
+  color: #e33f3b;
+  background-color: transparent !important;
+  border: none;
+  box-shadow: none !important;
+}
+
+.faux-header__doc-header-dropdown-toggle:hover {
+  color: #e33f3b;
+  background-color: transparent;
+}
+
+.faux-header__doc-header-dropdown-toggle-icon:before {
+  width: 6px;
+  font-size: 20px;
+  padding-top: 4px;
+}
+
+.faux-header__doc-header-backlink {
+  font-size: 24px;
+  border: none;
+  background-color: transparent;
+  border-right: 1px solid #ccc;
+  width: 40px;
+  padding: 11px;
+}
+
+.faux-header__doc-header-backlink__icon:before {
+  width: 18px;
+}
+
+.faux-header__doc-header-backlink:hover {
+  text-decoration: none;
+}
+
+// override bootstrap styles
+.faux-header__doc-header-dropdown-itemwrapper .faux-header__doc-header-dropdown-item {
+  padding: 10px 15px 10px 12px;
+}
+.faux-header__doc-header-dropdown-itemwrapper .faux-header__doc-header-dropdown-item:hover {
+  background-color: @navBG;
+  color: #fff;
+  cursor: pointer;
+}

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/components/header-docs-left.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/components/header-docs-left.jsx b/app/addons/documents/components/header-docs-left.jsx
new file mode 100644
index 0000000..0db2009
--- /dev/null
+++ b/app/addons/documents/components/header-docs-left.jsx
@@ -0,0 +1,92 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+import React from "react";
+import ReactDOM from "react-dom";
+
+import ReactComponents from "../../components/react-components.react";
+
+import Helpers from "../helpers";
+import FauxtonAPI from '../../../core/api';
+
+
+import { Dropdown, MenuItem } from "react-bootstrap";
+
+const MenuDropDown = ReactComponents.MenuDropDown;
+
+
+function getModififyDbLinks (dbName) {
+  return Helpers.getModifyDatabaseLinks(dbName);
+}
+
+function getAllDatabaseModalLinks (dbName) {
+  const dropdownMenuLinks = Helpers.getNewButtonLinks(dbName);
+  return getModififyDbLinks(dbName).concat(dropdownMenuLinks);
+}
+
+
+function getDropdownItems (items) {
+  return items.map((el, i) => {
+
+    if (el.title && el.links) {
+      const items = el.links.map((subel, i2) => {
+        return <Item onClick={subel.onClick} icon={subel.icon} url={subel.url}>{subel.title}</Item>;
+      });
+
+      return ([
+        <li className="header-label">{el.title}</li>,
+        items
+      ]);
+    }
+
+    return (
+      <Item icon={el.icon} url={el.url} onClick={el.onClick} key={i}>{el.title}</Item>
+    );
+  });
+}
+
+
+const Item = ({url, icon, onClick, children}) => {
+  return (
+    <li role="presentation">
+      <a className="faux-header__doc-header-dropdown-item" onClick={onClick} href={url}>
+        <i className={icon}></i> {children}
+      </a>
+    </li>
+  );
+};
+
+const HeaderDocsLeft = ({dbName}) => {
+  const items = getAllDatabaseModalLinks(dbName);
+  const dropdownItems = getDropdownItems(items);
+
+  return (
+    <div className="faux-header__doc-header-left">
+      <button type="button" className="faux-header__doc-header-backlink" onClick={() => { FauxtonAPI.navigate('#_all_dbs'); }}>
+        <i className="faux-header__doc-header-backlink__icon fonticon fonticon-left-open" />
+      </button>
+      <div className="faux-header__doc-header-title flex-fill">
+        {dbName}
+      </div>
+      <Dropdown id="faux-header__doc-header-left-1">
+        <Dropdown.Toggle noCaret className="faux-header__doc-header-dropdown-toggle">
+          <i className="faux-header__doc-header-dropdown-toggle-icon fonticon-vertical-ellipsis"></i>
+        </Dropdown.Toggle>
+        <Dropdown.Menu className="faux-header__doc-header-dropdown-itemwrapper">
+          {dropdownItems}
+        </Dropdown.Menu>
+      </Dropdown>
+    </div>
+  );
+};
+
+export default HeaderDocsLeft;

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/components/header-docs-right.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/components/header-docs-right.jsx b/app/addons/documents/components/header-docs-right.jsx
new file mode 100644
index 0000000..7ca1900
--- /dev/null
+++ b/app/addons/documents/components/header-docs-right.jsx
@@ -0,0 +1,45 @@
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+import app from '../../../app';
+import FauxtonAPI from '../../../core/api';
+import Components from '../../fauxton/components';
+import Documents from '../resources';
+import Databases from '../../databases/resources';
+import React from 'react';
+import QueryOptions from '../queryoptions/queryoptions.react';
+import QueryActions from '../queryoptions/actions';
+import JumpToDoc from './jumptodoc.react';
+import IndexResultStores from '../index-results/stores';
+import Actions from './actions';
+
+const { indexResultsStore } = IndexResultStores;
+
+const { QueryOptionsController } = QueryOptions;
+
+const RightAllDocsHeader = ({database}) =>
+  <div className="header-right right-db-header flex-layout flex-row">
+
+    <div className="faux-header__searchboxwrapper">
+      <div className="faux-header__searchboxcontainer">
+        <JumpToDoc loadOptions={Actions.fetchAllDocsWithKey(database)} database={database} />
+      </div>
+    </div>
+
+    <QueryOptionsController />
+  </div>;
+
+RightAllDocsHeader.propTypes = {
+  database: React.PropTypes.object.isRequired
+};
+
+export default RightAllDocsHeader;

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/components/rightalldocsheader.react.jsx
----------------------------------------------------------------------
diff --git a/app/addons/documents/components/rightalldocsheader.react.jsx b/app/addons/documents/components/rightalldocsheader.react.jsx
deleted file mode 100644
index 7ca1900..0000000
--- a/app/addons/documents/components/rightalldocsheader.react.jsx
+++ /dev/null
@@ -1,45 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-import app from '../../../app';
-import FauxtonAPI from '../../../core/api';
-import Components from '../../fauxton/components';
-import Documents from '../resources';
-import Databases from '../../databases/resources';
-import React from 'react';
-import QueryOptions from '../queryoptions/queryoptions.react';
-import QueryActions from '../queryoptions/actions';
-import JumpToDoc from './jumptodoc.react';
-import IndexResultStores from '../index-results/stores';
-import Actions from './actions';
-
-const { indexResultsStore } = IndexResultStores;
-
-const { QueryOptionsController } = QueryOptions;
-
-const RightAllDocsHeader = ({database}) =>
-  <div className="header-right right-db-header flex-layout flex-row">
-
-    <div className="faux-header__searchboxwrapper">
-      <div className="faux-header__searchboxcontainer">
-        <JumpToDoc loadOptions={Actions.fetchAllDocsWithKey(database)} database={database} />
-      </div>
-    </div>
-
-    <QueryOptionsController />
-  </div>;
-
-RightAllDocsHeader.propTypes = {
-  database: React.PropTypes.object.isRequired
-};
-
-export default RightAllDocsHeader;

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/helpers.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/helpers.js b/app/addons/documents/helpers.js
index 9bc0e5d..08f7192 100644
--- a/app/addons/documents/helpers.js
+++ b/app/addons/documents/helpers.js
@@ -13,6 +13,8 @@
 import app from "../../app";
 import FauxtonAPI from "../../core/api";
 
+import ReactComponentsActions from "../components/actions";
+
 
 // sequence info is an array in couchdb2 with two indexes. On couch 1.x, it's just a string / number
 function getSeqNum (val) {
@@ -61,7 +63,7 @@ function parseJSON (str) {
   return JSON.parse('"' + str + '"');   // this ensures newlines are converted
 }
 
-function getModifyDatabaseLinks (databaseName, deleteCallback) {
+function getModifyDatabaseLinks (databaseName) {
   return [{
     title: 'Replicate Database',
     icon: 'fonticon-replicate',
@@ -69,9 +71,7 @@ function getModifyDatabaseLinks (databaseName, deleteCallback) {
   }, {
     title: 'Delete',
     icon: 'fonticon-trash',
-    onClick: function () {
-      deleteCallback({showDeleteModal: true, dbId: databaseName});
-    }
+    onClick: ReactComponentsActions.showDeleteDatabaseModal.bind(this, {showDeleteModal: true, dbId: databaseName})
   }];
 }
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/routes-documents.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/routes-documents.js b/app/addons/documents/routes-documents.js
index 469f99f..e95e339 100644
--- a/app/addons/documents/routes-documents.js
+++ b/app/addons/documents/routes-documents.js
@@ -15,7 +15,7 @@ import app from '../../app';
 import FauxtonAPI from '../../core/api';
 import BaseRoute from './shared-routes';
 import Documents from './resources';
-import RightAllDocsHeader from './components/rightalldocsheader.react';
+import RightAllDocsHeader from './components/header-docs-right';
 import Changes from './changes/components.react';
 import ChangesActions from './changes/actions';
 import Databases from '../databases/base';
@@ -94,7 +94,6 @@ var DocumentsRouteObject = BaseRoute.extend({
       designDocSection: 'metadata'
     });
 
-    this.leftheader.updateCrumbs(this.getCrumbs(this.database));
     QueryOptionsActions.hideQueryOptions();
 
     this.apiUrl = [designDocInfo.url('apiurl'), designDocInfo.documentation()];
@@ -114,8 +113,6 @@ var DocumentsRouteObject = BaseRoute.extend({
     this.setComponent('#react-headerbar', ReactHeader.BulkDocumentHeaderController, {showIncludeAllDocs: true});
     this.setComponent('#footer', ReactPagination.Footer);
 
-    this.leftheader.updateCrumbs(this.getCrumbs(this.database));
-
 
     // includes_docs = true if you are visiting the _replicator/_users databases
     if (['_replicator', '_users'].indexOf(databaseName) > -1) {
@@ -184,7 +181,7 @@ var DocumentsRouteObject = BaseRoute.extend({
     this.viewEditor && this.viewEditor.remove();
 
     SidebarActions.selectNavItem('changes');
-    this.leftheader.updateCrumbs(this.getCrumbs(this.database));
+
     QueryOptionsActions.hideQueryOptions();
 
     this.apiUrl = function () {

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/routes-index-editor.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/routes-index-editor.js b/app/addons/documents/routes-index-editor.js
index deb6eeb..8abed44 100644
--- a/app/addons/documents/routes-index-editor.js
+++ b/app/addons/documents/routes-index-editor.js
@@ -26,7 +26,7 @@ import ReactPagination from "./pagination/pagination.react";
 import ReactHeader from "./header/header.react";
 import ReactHeaderActions from "./header/header.actions";
 import SidebarActions from "./sidebar/actions";
-import RightAllDocsHeader from './components/rightalldocsheader.react';
+import RightAllDocsHeader from './components/header-docs-right';
 
 
 var IndexEditorAndResults = BaseRoute.extend({

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/routes-mango.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/routes-mango.js b/app/addons/documents/routes-mango.js
index c9914eb..c1e63da 100644
--- a/app/addons/documents/routes-mango.js
+++ b/app/addons/documents/routes-mango.js
@@ -27,7 +27,7 @@ import MangoActions from "./mango/mango.actions";
 import MangoStores from "./mango/mango.stores";
 import IndexResultsComponents from "./index-results/index-results.components.react";
 import SidebarActions from "./sidebar/actions";
-import RightAllDocsHeader from './components/rightalldocsheader.react';
+import RightAllDocsHeader from './components/header-docs-right';
 
 const MangoIndexEditorAndQueryEditor = FauxtonAPI.RouteObject.extend({
   layout: 'two_pane',

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/shared-routes.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/shared-routes.js b/app/addons/documents/shared-routes.js
index e96b8af..9432330 100644
--- a/app/addons/documents/shared-routes.js
+++ b/app/addons/documents/shared-routes.js
@@ -20,6 +20,7 @@ import IndexResultStores from "./index-results/stores";
 import SidebarComponents from "./sidebar/sidebar.react";
 import SidebarActions from "./sidebar/actions";
 import QueryActions from './queryoptions/actions';
+import HeaderDocsLeft from './components/header-docs-left';
 
 
 // The Documents section is built up a lot of different route object which share code. This contains
@@ -27,7 +28,6 @@ import QueryActions from './queryoptions/actions';
 var BaseRoute = FauxtonAPI.RouteObject.extend({
   layout: 'with_tabs_sidebar',
   selectedHeader: 'Databases',
-  overrideBreadcrumbs: true,
 
   createDesignDocsCollection: function () {
     this.designDocs = new Documents.AllDocs(null, {
@@ -50,11 +50,10 @@ var BaseRoute = FauxtonAPI.RouteObject.extend({
 
   showQueryOptions: function (urlParams, ddoc, viewName) {
     var promise = this.designDocs.fetch({reset: true}),
-    that = this,
-    hasReduceFunction;
+        hasReduceFunction;
 
-    promise.then(function (resp) {
-      var design = _.findWhere(that.designDocs.models, {id: '_design/' + ddoc});
+    promise.then((resp) => {
+      var design = _.findWhere(this.designDocs.models, {id: '_design/' + ddoc});
       !_.isUndefined(hasReduceFunction = design.attributes.doc.views[viewName].reduce);
 
       QueryActions.showQueryOptions();
@@ -69,10 +68,8 @@ var BaseRoute = FauxtonAPI.RouteObject.extend({
   },
 
   addLeftHeader: function () {
-    this.leftheader = this.setView('#breadcrumbs', new Components.LeftHeader({
-      databaseName: this.database.safeID(),
-      crumbs: this.getCrumbs(this.database)
-    }));
+    const dropDownLinks = this.getCrumbs(this.database);
+    this.setComponent('#header-docs-left', HeaderDocsLeft, {dbName: this.database.id, dropDownLinks: dropDownLinks});
   },
 
   addSidebar: function (selectedNavItem) {
@@ -91,7 +88,7 @@ var BaseRoute = FauxtonAPI.RouteObject.extend({
   getCrumbs: function (database) {
     return [
       { "type": "back", "link": FauxtonAPI.urls('allDBs', 'app')},
-      { "name": database.id, className: "lookahead-tray-link" }
+      { "name": database.id }
     ];
   },
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/tests/nightwatch/deleteDatabaseModal.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/tests/nightwatch/deleteDatabaseModal.js b/app/addons/documents/tests/nightwatch/deleteDatabaseModal.js
index 6925887..17a2488 100644
--- a/app/addons/documents/tests/nightwatch/deleteDatabaseModal.js
+++ b/app/addons/documents/tests/nightwatch/deleteDatabaseModal.js
@@ -36,9 +36,10 @@ module.exports = {
     client
       .loginToGUI()
       .url(baseUrl + '/#/database/_replicator/_all_docs')
-      .clickWhenVisible("#header-dropdown-menu a.dropdown-toggle.icon.fonticon-vertical-ellipsis", waitTime, false)
-      .waitForElementPresent("#header-dropdown-menu .fonticon-trash", waitTime, false)
-      .clickWhenVisible('#header-dropdown-menu .fonticon-trash', waitTime, false)
+
+      .clickWhenVisible('.faux-header__doc-header-dropdown-toggle')
+      .clickWhenVisible('.faux-header__doc-header-dropdown-itemwrapper .fonticon-trash')
+
       .waitForElementVisible('.delete-db-modal', waitTime, false)
       .waitForElementVisible('.delete-db-modal input[type="text"]', waitTime, false)
       .assert.elementPresent('.warning')
@@ -53,9 +54,10 @@ module.exports = {
     client
       .loginToGUI()
       .url(baseUrl + '/#/database/' + newDatabaseName + '/_all_docs')
-      .clickWhenVisible('#header-dropdown-menu a.dropdown-toggle.icon.fonticon-vertical-ellipsis', waitTime, false)
-      .waitForElementPresent("#header-dropdown-menu .fonticon-trash", waitTime, false)
-      .clickWhenVisible('#header-dropdown-menu .fonticon-trash', waitTime, false)
+
+      .clickWhenVisible('.faux-header__doc-header-dropdown-toggle')
+      .clickWhenVisible('.faux-header__doc-header-dropdown-itemwrapper .fonticon-trash')
+
       .waitForElementVisible('.delete-db-modal', waitTime, false)
       .waitForElementVisible('.delete-db-modal input[type="text"]', waitTime, false)
       .assert.elementNotPresent('.warning')

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/tests/nightwatch/doubleEmitResults.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/tests/nightwatch/doubleEmitResults.js b/app/addons/documents/tests/nightwatch/doubleEmitResults.js
index e8eeb12..6ac759a 100644
--- a/app/addons/documents/tests/nightwatch/doubleEmitResults.js
+++ b/app/addons/documents/tests/nightwatch/doubleEmitResults.js
@@ -17,7 +17,6 @@ module.exports = {
   'View results with same id are all shown': function (client) {
     var waitTime = client.globals.maxWaitTime;
     var newDatabaseName = client.globals.testDatabaseName;
-    var dropDownElement = '#header-dropdown-menu';
     var baseUrl = client.globals.test_settings.launch_url;
 
     client

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/tests/nightwatch/viewCreate.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/tests/nightwatch/viewCreate.js b/app/addons/documents/tests/nightwatch/viewCreate.js
index 9fd27f9..c142d99 100644
--- a/app/addons/documents/tests/nightwatch/viewCreate.js
+++ b/app/addons/documents/tests/nightwatch/viewCreate.js
@@ -19,7 +19,7 @@ module.exports = {
     const baseUrl = client.globals.test_settings.launch_url;
 
     /*jshint multistr: true */
-    openDifferentDropdownsAndClick(client, '#header-dropdown-menu')
+    openDifferentDropdownsAndClick(client)
       .waitForElementPresent('#new-ddoc', waitTime, false)
       .setValue('#new-ddoc', 'test_design_doc-selenium-0')
       .clearValue('#index-name')
@@ -43,7 +43,7 @@ module.exports = {
     var baseUrl = client.globals.test_settings.launch_url;
 
     /*jshint multistr: true */
-    openDifferentDropdownsAndClick(client, '#header-dropdown-menu')
+    openDifferentDropdownsAndClick(client)
       .waitForElementPresent('#new-ddoc', waitTime, false)
       .setValue('#new-ddoc', 'test_design_doc-selenium-1')
       .clearValue('#index-name')
@@ -67,7 +67,7 @@ module.exports = {
     var baseUrl = client.globals.test_settings.launch_url;
 
     /*jshint multistr: true */
-    openDifferentDropdownsAndClick(client, '#header-dropdown-menu')
+    openDifferentDropdownsAndClick(client)
       .waitForElementPresent('#new-ddoc', waitTime, false)
       .setValue('#new-ddoc', 'test_design_doc-selenium-3')
       .clearValue('#index-name')
@@ -93,7 +93,7 @@ module.exports = {
     var baseUrl = client.globals.test_settings.launch_url;
 
     /*jshint multistr: true */
-    openDifferentDropdownsAndClick(client, '#header-dropdown-menu')
+    openDifferentDropdownsAndClick(client)
       .waitForElementPresent('#new-ddoc', waitTime, false)
       .setValue('#new-ddoc', 'test_design_doc-selenium-2')
       .clearValue('#index-name')
@@ -141,8 +141,7 @@ module.exports = {
   }
 };
 
-function openDifferentDropdownsAndClick (client, dropDownElement) {
-  var modifier = dropDownElement.slice(1);
+function openDifferentDropdownsAndClick (client) {
   var waitTime = client.globals.maxWaitTime;
   var newDatabaseName = client.globals.testDatabaseName;
   var baseUrl = client.globals.test_settings.launch_url;
@@ -151,10 +150,7 @@ function openDifferentDropdownsAndClick (client, dropDownElement) {
     .loginToGUI()
     .populateDatabase(newDatabaseName)
     .url(baseUrl + '/#/database/' + newDatabaseName + '/_all_docs')
-    .waitForElementPresent(dropDownElement, waitTime, false)
-    .waitForElementPresent(dropDownElement + ' a', waitTime, false)
-    .clickWhenVisible(dropDownElement + ' a', waitTime, false)
-    .waitForElementPresent(dropDownElement + ' a[href*="new_view"]', waitTime, false)
-    .clickWhenVisible(dropDownElement + ' a[href*="new_view"]', waitTime, false)
+    .clickWhenVisible('.faux-header__doc-header-dropdown-toggle')
+    .clickWhenVisible('.faux-header__doc-header-dropdown-itemwrapper a[href*="new_view"]')
     .waitForElementPresent('.index-cancel-link', waitTime, false);
 }

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/tests/nightwatch/viewCreateBadView.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/tests/nightwatch/viewCreateBadView.js b/app/addons/documents/tests/nightwatch/viewCreateBadView.js
index 9fff6dd..3057c6d 100644
--- a/app/addons/documents/tests/nightwatch/viewCreateBadView.js
+++ b/app/addons/documents/tests/nightwatch/viewCreateBadView.js
@@ -18,16 +18,14 @@ module.exports = {
     /*jshint multistr: true */
     var waitTime = client.globals.maxWaitTime,
         newDatabaseName = client.globals.testDatabaseName,
-        baseUrl = client.globals.test_settings.launch_url,
-        dropDownElement = '#header-dropdown-menu';
+        baseUrl = client.globals.test_settings.launch_url;
 
     client
       .loginToGUI()
       .populateDatabase(newDatabaseName)
       .url(baseUrl + '/#/database/' + newDatabaseName + '/_all_docs')
-      .waitForElementPresent(dropDownElement, waitTime, false)
-      .clickWhenVisible(dropDownElement + ' a')
-      .clickWhenVisible(dropDownElement + ' a[href*="new_view"]')
+      .clickWhenVisible('.faux-header__doc-header-dropdown-toggle')
+      .clickWhenVisible('.faux-header__doc-header-dropdown-itemwrapper a[href*="new_view"]')
       .waitForElementVisible('#new-ddoc', waitTime, false)
       .setValue('#new-ddoc', 'test_design_doc-selenium-bad-reduce')
       .clearValue('#index-name')

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/documents/tests/nightwatch/viewEdit.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/tests/nightwatch/viewEdit.js b/app/addons/documents/tests/nightwatch/viewEdit.js
index fe8ec18..ffcc42e 100644
--- a/app/addons/documents/tests/nightwatch/viewEdit.js
+++ b/app/addons/documents/tests/nightwatch/viewEdit.js
@@ -28,8 +28,8 @@ module.exports = {
       .waitForElementPresent('.index-cancel-link', waitTime, true)
       .waitForElementNotPresent('.loading-lines', waitTime, true)
       .waitForElementVisible('#index-name', waitTime, true)
-      .waitForElementPresent('.breadcrumb .js-lastelement', waitTime, false)
-      .waitForAttribute('.breadcrumb .js-lastelement', 'textContent', function (docContents) {
+      .waitForElementPresent('.faux-header__doc-header-title', waitTime, false)
+      .waitForAttribute('.faux-header__doc-header-title', 'textContent', function (docContents) {
         var regExp = new RegExp(newDatabaseName);
         return regExp.test(docContents);
       })
@@ -66,8 +66,8 @@ module.exports = {
       .waitForElementPresent('.index-cancel-link', waitTime, true)
       .waitForElementNotPresent('.loading-lines', waitTime, true)
       .waitForElementVisible('#index-name', waitTime, true)
-      .waitForElementPresent('.breadcrumb .js-lastelement', waitTime, false)
-      .waitForAttribute('.breadcrumb .js-lastelement', 'textContent', function (docContents) {
+      .waitForElementPresent('.faux-header__doc-header-title', waitTime, false)
+      .waitForAttribute('.faux-header__doc-header-title', 'textContent', function (docContents) {
         var regExp = new RegExp(newDatabaseName);
         return regExp.test(docContents);
       })
@@ -88,8 +88,8 @@ module.exports = {
       .url(baseUrl + '/#/database/' + newDatabaseName + '/_design/testdesigndoc/_view/stubview')
       .waitForElementNotPresent('.loading-lines', waitTime, false)
       .waitForElementVisible('.prettyprint', waitTime, false)
-      .waitForElementPresent('.breadcrumb .js-lastelement', waitTime, false)
-      .waitForAttribute('.breadcrumb .js-lastelement', 'textContent', function (docContents) {
+      .waitForElementPresent('.faux-header__doc-header-title', waitTime, false)
+      .waitForAttribute('.faux-header__doc-header-title', 'textContent', function (docContents) {
         var regExp = new RegExp(newDatabaseName);
         return regExp.test(docContents);
       })
@@ -103,8 +103,7 @@ module.exports = {
     /*jshint multistr: true */
     var waitTime = client.globals.maxWaitTime,
       newDatabaseName = client.globals.testDatabaseName,
-      baseUrl = client.globals.test_settings.launch_url,
-      dropDownElement = '#header-dropdown-menu';
+      baseUrl = client.globals.test_settings.launch_url;
 
     client
       .deleteDatabase(newDatabaseName)
@@ -114,12 +113,11 @@ module.exports = {
 
       // create the first view
       .url(baseUrl + '/#/database/' + newDatabaseName + '/_all_docs')
-      .waitForElementPresent(dropDownElement, waitTime, false)
-      .clickWhenVisible(dropDownElement + ' a')
-      .clickWhenVisible(dropDownElement + ' a[href*="new_view"]')
+      .clickWhenVisible('.faux-header__doc-header-dropdown-toggle')
+      .clickWhenVisible('.faux-header__doc-header-dropdown-itemwrapper a[href*="new_view"]')
       .waitForElementNotPresent('.loading-lines', waitTime, true)
-      .waitForElementPresent('.breadcrumb .js-lastelement', waitTime, false)
-      .waitForAttribute('.breadcrumb .js-lastelement', 'textContent', function (docContents) {
+      .waitForElementPresent('.faux-header__doc-header-title', waitTime, false)
+      .waitForAttribute('.faux-header__doc-header-title', 'textContent', function (docContents) {
         var regExp = new RegExp(newDatabaseName);
         return regExp.test(docContents);
       })
@@ -141,16 +139,15 @@ module.exports = {
       // create the second view
       .url(baseUrl + '/#/database/' + newDatabaseName + '/_all_docs')
       .waitForElementNotPresent('.global-notification .fonticon-cancel', waitTime, false)
-      .waitForElementPresent(dropDownElement, waitTime, false)
-      .waitForElementPresent(dropDownElement + ' a', waitTime, false)
-      .clickWhenVisible(dropDownElement + ' a')
-      .waitForElementPresent(dropDownElement + ' a[href*="new_view"]', waitTime, false)
-      .clickWhenVisible(dropDownElement + ' a[href*="new_view"]')
+
+      .clickWhenVisible('.faux-header__doc-header-dropdown-toggle')
+      .clickWhenVisible('.faux-header__doc-header-dropdown-itemwrapper a[href*="new_view"]')
+
       .waitForElementPresent('.index-cancel-link', waitTime, false)
       .waitForElementVisible('#new-ddoc', waitTime, false)
       .waitForElementNotPresent('.loading-lines', waitTime, true)
-      .waitForElementPresent('.breadcrumb .js-lastelement', waitTime, false)
-      .waitForAttribute('.breadcrumb .js-lastelement', 'textContent', function (docContents) {
+      .waitForElementPresent('.faux-header__doc-header-title', waitTime, false)
+      .waitForAttribute('.faux-header__doc-header-title', 'textContent', function (docContents) {
         var regExp = new RegExp(newDatabaseName);
         return regExp.test(docContents);
       })
@@ -173,8 +170,8 @@ module.exports = {
 
       .waitForElementNotPresent('.loading-lines', waitTime, true)
       .waitForElementVisible('#save-view', waitTime, false)
-      .waitForElementPresent('.breadcrumb .js-lastelement', waitTime, false)
-      .waitForAttribute('.breadcrumb .js-lastelement', 'textContent', function (docContents) {
+      .waitForElementPresent('.faux-header__doc-header-title', waitTime, false)
+      .waitForAttribute('.faux-header__doc-header-title', 'textContent', function (docContents) {
         var regExp = new RegExp(newDatabaseName);
         return regExp.test(docContents);
       })
@@ -204,16 +201,16 @@ module.exports = {
       // confirm the sidebar shows the testdesigndoc design doc
       .waitForElementVisible('#testdesigndoc', waitTime, true)
 
-      .waitForElementPresent('.breadcrumb .js-lastelement', waitTime, false)
-      .waitForAttribute('.breadcrumb .js-lastelement', 'textContent', function (docContents) {
+      .waitForElementPresent('.faux-header__doc-header-title', waitTime, false)
+      .waitForAttribute('.faux-header__doc-header-title', 'textContent', function (docContents) {
         var regExp = new RegExp(newDatabaseName);
         return regExp.test(docContents);
       })
 
       // now edit the view and move it into a brand new design doc
       .url(baseUrl + '/#/database/' + newDatabaseName + '/_design/testdesigndoc/_view/stubview/edit')
-      .waitForElementPresent('.breadcrumb .js-lastelement', waitTime, false)
-      .waitForAttribute('.breadcrumb .js-lastelement', 'textContent', function (docContents) {
+      .waitForElementPresent('.faux-header__doc-header-title', waitTime, false)
+      .waitForAttribute('.faux-header__doc-header-title', 'textContent', function (docContents) {
         var regExp = new RegExp(newDatabaseName);
         return regExp.test(docContents);
       })

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/fauxton/base.js
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/base.js b/app/addons/fauxton/base.js
index f09c975..d6376bc 100644
--- a/app/addons/fauxton/base.js
+++ b/app/addons/fauxton/base.js
@@ -55,9 +55,6 @@ Fauxton.initialize = function () {
       routeObject.setComponent('#notification-center-btn', NotificationComponents.NotificationCenterButton);
     }
 
-    // XXX React softmigration, remove after full breadcrumb rewrite
-    if (routeObject.overrideBreadcrumbs) { return; }
-
     FauxtonAPI.masterLayout.removeView('#breadcrumbs');
 
     const crumbs = routeObject.get('crumbs');

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/fauxton/components.js
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/components.js b/app/addons/fauxton/components.js
index e42c860..f62afef 100644
--- a/app/addons/fauxton/components.js
+++ b/app/addons/fauxton/components.js
@@ -18,111 +18,6 @@ import Helpers from "../documents/helpers";
 import "velocity-animate/velocity.ui";
 var Components = FauxtonAPI.addon();
 
-// XXX: move to /addons/documents - component is tightly coupled to documents/alldocs
-Components.LeftHeader = FauxtonAPI.View.extend({
-  className: "header-left",
-  template: "addons/fauxton/templates/header_left",
-
-  initialize: function (options) {
-    this.crumbs = options.crumbs || [];
-
-    this.dbName = options.databaseName;
-
-  },
-
-  updateCrumbs: function (crumbs) {
-
-    // if the breadcrumbs haven't changed, don't bother re-rendering the component
-    if (_.isEqual(this.crumbs, crumbs)) {
-      return;
-    }
-
-    this.crumbs = crumbs;
-    this.breadcrumbs && this.breadcrumbs.update(crumbs);
-  },
-
-  unselectLastBreadcrumb: function () {
-    this.breadcrumbs.unselectLastBreadcrumb();
-  },
-
-  beforeRender: function () {
-    this.setUpCrumbs();
-    this.setUpDropDownMenu();
-  },
-
-  setUpCrumbs: function () {
-    this.breadcrumbs = this.insertView("#header-breadcrumbs", new Components.Breadcrumbs({
-      crumbs: this.crumbs
-    }));
-  },
-
-  getModififyDbLinks: function () {
-    var onClickDelete = ComponentsActions.showDeleteDatabaseModal;
-    return Helpers.getModifyDatabaseLinks(this.dbName, onClickDelete);
-  },
-
-  setUpDropDownMenu: function () {
-    var dropdownMenuLinks = Helpers.getNewButtonLinks(this.dbName);
-
-    dropdownMenuLinks = this.getModififyDbLinks().concat(dropdownMenuLinks);
-
-    this.dropdown = this.insertView("#header-dropdown-menu", new Components.MenuDropDownReact({
-      links: dropdownMenuLinks,
-    }));
-  }
-});
-
-Components.MenuDropDownReact = FauxtonAPI.View.extend({
-  initialize: function (options) {
-    this.options = options;
-  },
-
-  afterRender: function () {
-    ReactComponents.renderMenuDropDown(this.el, this.options);
-  },
-
-  cleanup: function () {
-    ReactComponents.removeMenuDropDown(this.el);
-  }
-});
-Components.Breadcrumbs = FauxtonAPI.View.extend({
-  className: "breadcrumb pull-left",
-  tagName: "ul",
-  template: "addons/fauxton/templates/breadcrumbs",
-
-  serialize: function () {
-    var crumbs = _.clone(this.crumbs);
-
-    // helper template function to determine when to insert a delimiter char
-    var nextCrumbHasLabel = function (crumb, index) {
-      var nextHasLabel = crumbs[index + 1].name !== "";
-      return index < crumbs.length && crumb.name && nextHasLabel;
-    };
-
-    return {
-      toggleDisabled: this.toggleDisabled,
-      crumbs: crumbs,
-      nextCrumbHasLabel: nextCrumbHasLabel
-    };
-  },
-
-  unselectLastBreadcrumb: function () {
-    if (this.toggleDisabled) {
-      return;
-    }
-    this.$('.js-enabled').removeClass('js-enabled');
-  },
-
-  update: function (crumbs) {
-    this.crumbs = crumbs;
-    this.render();
-  },
-
-  initialize: function (options) {
-    this.crumbs = options.crumbs;
-    this.toggleDisabled = options.toggleDisabled || false;
-  }
-});
 
 /**
  * Our generic Tray component. All trays should extend this guy - it offers some convenient boilerplate code for

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/fauxton/templates/breadcrumbs.html
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/templates/breadcrumbs.html b/app/addons/fauxton/templates/breadcrumbs.html
deleted file mode 100644
index 1db3971..0000000
--- a/app/addons/fauxton/templates/breadcrumbs.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<%/*
-Licensed under the Apache License, Version 2.0 (the "License"); you may not
-use this file except in compliance with the License. You may obtain a copy of
-the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-License for the specific language governing permissions and limitations under
-the License.
-*/%>
-
-<% _.each(_.initial(crumbs), function (crumb, index) { %>
-
-  <% if (crumb.type === 'back') { %>
-    <li class="pull-left breadcrumb-back-link">
-      <a href="#<%- crumb.link %>" class="fonticon fonticon-left-open"></a>
-    </li>
-  <% } else { %>
-    <li class="pull-left">
-      <a href="#<%- crumb.link %>" class="fonticon <%- crumb.className %>"><%- crumb.name %></a>
-    </li>
-
-    <% if (nextCrumbHasLabel(crumb, index)) { %>
-    <li class="divider fonticon-right-open"></li>
-    <% } %>
-  <% }  %>
-
-<% }); %>
-
-<% var last = _.last(crumbs) || {name: '', className: '', dataEvent: ''} %>
-<li class="js-lastelement active <%- last.className %>" title="<%- last.name %>"><%- last.name %></li>

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/fauxton/templates/header_left.html
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/templates/header_left.html b/app/addons/fauxton/templates/header_left.html
deleted file mode 100644
index 2e76c23..0000000
--- a/app/addons/fauxton/templates/header_left.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!--
-Licensed under the Apache License, Version 2.0 (the "License"); you may not
-use this file except in compliance with the License. You may obtain a copy of
-the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-License for the specific language governing permissions and limitations under
-the License.
--->
-<!--back arrow-->
-<div id="header-breadcrumbs"></div>
-
-<!-- Menu gear-->
-<div id="header-dropdown-menu" class="add-dropdown"></div>

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/fauxton/tests/breadcrumbsViewSpec.js
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/tests/breadcrumbsViewSpec.js b/app/addons/fauxton/tests/breadcrumbsViewSpec.js
deleted file mode 100644
index 43089c1..0000000
--- a/app/addons/fauxton/tests/breadcrumbsViewSpec.js
+++ /dev/null
@@ -1,100 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-
-import app from "../../../app";
-import Components from "../components";
-import testUtils from "../../../../test/mocha/testUtils";
-var assert = testUtils.assert,
-  ViewSandbox = testUtils.ViewSandbox;
-
-describe('Breadcrumbs', function () {
-
-  describe('3 Breadcrumbs', function () {
-    var breadcrumbs, viewSandbox;
-
-    // async setup with done-callback
-    beforeEach(function (done) {
-
-      // initialize a Breadcrumb-View with fake data
-      breadcrumbs = new Components.Breadcrumbs({
-        crumbs: [
-          { link: "/root", name: "root" },
-          { link: "/first", name: "first" },
-          { link: "/second", name: "second" }
-        ]
-      });
-
-      // render in a view-sandbox, which attaches it to the DOM
-      // for us, so we can test it
-      viewSandbox = new ViewSandbox();
-      viewSandbox.renderView(breadcrumbs, done);
-    });
-
-    afterEach(function () {
-      // sync cleanup (done callback not provided)!
-      viewSandbox.remove();
-    });
-
-    // sync test
-    it('should have 2 dividers between 3 breadcrumbs', function () {
-      assert.equal(2, breadcrumbs.$('.divider').length);
-    });
-  });
-
-
-  describe('2 Breadcrumbs, one empty', function () {
-    var breadcrumbs, viewSandbox;
-
-    beforeEach(function (done) {
-      breadcrumbs = new Components.Breadcrumbs({
-        crumbs: [
-          {link: "/root", name: "" },
-          {link: "/root", name: "crumb 2" }
-        ]
-      });
-      viewSandbox = new ViewSandbox();
-      viewSandbox.renderView(breadcrumbs, done);
-    });
-
-    afterEach(function () {
-      viewSandbox.remove();
-    });
-
-    it('should have 0 dividers for 2 breadcrumb when one is empty', function () {
-      assert.equal(0, breadcrumbs.$('.divider').length);
-    });
-  });
-
-
-  describe('1 Breadcrumb', function () {
-    var breadcrumbs, viewSandbox;
-
-    beforeEach(function (done) {
-      breadcrumbs = new Components.Breadcrumbs({
-        crumbs: [
-          {link: "/root", name: "root"}
-        ]
-      });
-      viewSandbox = new ViewSandbox();
-      viewSandbox.renderView(breadcrumbs, done);
-    });
-
-    afterEach(function () {
-      viewSandbox.remove();
-    });
-
-    it('should have 0 dividers for 1 breadcrumb', function () {
-      assert.equal(0, breadcrumbs.$('.divider').length);
-    });
-  });
-
-});

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/fauxton/tests/componentsSpec.js
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/tests/componentsSpec.js b/app/addons/fauxton/tests/componentsSpec.js
deleted file mode 100644
index 572af56..0000000
--- a/app/addons/fauxton/tests/componentsSpec.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// Licensed under the Apache License, Version 2.0 (the "License"); you may not
-// use this file except in compliance with the License. You may obtain a copy of
-// the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-// License for the specific language governing permissions and limitations under
-// the License.
-import testUtils from "../../../../test/mocha/testUtils";
-import FauxtonAPI from "../../../core/api";
-import Components from "../components";
-var assert = testUtils.assert;
-
-describe('DbSearchTypeahead', function () {
-
-  // simple test to confirm that the query part of the URL and the \u9999 search end char
-  // are URL encoded
-  it('should URI encode parts of URL', function () {
-    var dbLimit = 30;
-    var typeahead = new Components.DbSearchTypeahead({
-      dbLimit: dbLimit
-    });
-    var url = typeahead.getURL('querywith[]chars', dbLimit);
-
-    // confirm the [] chars have been encoded
-    assert.isTrue(/%5B%5D/.test(url));
-
-    // confirm the \u9999 char has been encoded
-    assert.isFalse(/\u9999/.test(url));
-    assert.isTrue(/%E9%A6%99/.test(url));
-  });
-});

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/addons/permissions/routes.js
----------------------------------------------------------------------
diff --git a/app/addons/permissions/routes.js b/app/addons/permissions/routes.js
index 0c930bf..35b156a 100644
--- a/app/addons/permissions/routes.js
+++ b/app/addons/permissions/routes.js
@@ -67,9 +67,6 @@ var PermissionsRouteObject = BaseRoute.extend({
   },
 
   cleanup: function () {
-    if (this.leftheader) {
-      this.removeView('#breadcrumbs');
-    }
     this.removeComponent('#sidebar-content');
   }
 });

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/app/templates/layouts/with_tabs_sidebar.html
----------------------------------------------------------------------
diff --git a/app/templates/layouts/with_tabs_sidebar.html b/app/templates/layouts/with_tabs_sidebar.html
index 60c3298..26dc7c9 100644
--- a/app/templates/layouts/with_tabs_sidebar.html
+++ b/app/templates/layouts/with_tabs_sidebar.html
@@ -15,7 +15,7 @@ the License.
 <div id="dashboard" class="with-sidebar">
   <header class="two-panel-header">
     <div class="flex-layout flex-row">
-      <div id="breadcrumbs"></div>
+      <div id="header-docs-left"></div>
       <div class="right-header-wrapper flex-layout flex-row flex-body">
         <div id="react-headerbar" class="flex-body"></div>
         <div id="right-header" class="flex-fill"></div>

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/assets/less/fauxton.less
----------------------------------------------------------------------
diff --git a/assets/less/fauxton.less b/assets/less/fauxton.less
index a620fe8..d368d2f 100644
--- a/assets/less/fauxton.less
+++ b/assets/less/fauxton.less
@@ -355,102 +355,6 @@ table.databases {
   }
 }
 
-body #dashboard .two-panel-header {
-  #breadcrumbs {
-    .flex(0 0 331px);
-  }
-}
-
-.with-sidebar {
-  #breadcrumbs {
-    border-right: 1px solid @grayLight;
-    width: @sidebarWidth + 1px;
-    .active {
-      width: 244px;
-    }
-  }
-}
-
-
-body #dashboard .flex-body#breadcrumbs {
-  overflow: hidden;
-}
-
-#breadcrumbs {
-  height: 64px;
-
-  /* these styles are for the new header*/
-  .header-left{
-    > div{
-      display:inline-block;
-    }
-  }
-
-  .breadcrumb-back-link {
-    border-right: 1px solid #ccc;
-    a {
-      font-size: 20px;
-      margin-top: 1px;
-    }
-  }
-
-  .breadcrumb {
-    margin-bottom: 0;
-    background-color: transparent;
-    padding: 0;
-
-    li {
-      padding: 22px 10px;
-      &:first-child {
-        font-size: 24px;
-        .with-sidebar &,
-        .two-pane & {
-          float: left;
-        }
-        a {
-          float: left;
-        }
-      }
-      color: @breadcrumbText;
-      font-size: 24px;
-      text-shadow: none;
-      &.active{
-        color: #333;
-        overflow: hidden;
-        text-overflow: ellipsis;
-        white-space: nowrap;
-      }
-      &.divider {
-        font-size: 14px;
-        color: #ccc;
-        padding: 20px 0px;
-        width: 10px;
-      }
-      a{
-        text-decoration: none;
-        color: @breadcrumbText;
-      }
-    }
-    .fonticon-right-open {
-      position: absolute;
-
-      &.divider {
-        padding: 23px 0;
-      }
-      +li {
-        text-overflow: inherit;
-        overflow: auto;
-        width: auto;
-        margin-left: 14px;
-      }
-    }
-  }
-}
-
-.header-left{
-  position: relative;
-}
-
 .header-right {
   .well {
     padding: 0;

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/assets/less/layouts.less
----------------------------------------------------------------------
diff --git a/assets/less/layouts.less b/assets/less/layouts.less
index b1cb3f8..72cedfa 100644
--- a/assets/less/layouts.less
+++ b/assets/less/layouts.less
@@ -67,13 +67,6 @@ body #dashboard .flex-fill {
 .one-pane > header {
   width: 100%;
 
-  #breadcrumbs {
-    overflow: hidden;
-
-    /* overrides - can be removed later */
-    float: none;
-  }
-
   #right-header {
     -ms-flex-preferred-size: auto;
     -webkit-flex: 0 0 auto;
@@ -98,10 +91,6 @@ body #dashboard .flex-layout #api-navbar {
 /* temporary wedge. Can be replaced at end */
 .with-sidebar {
 
-  /* temporary wedge. Can be replaced at end */
-  #breadcrumbs {
-    float: left;
-  }
   #api-navbar {
     float: right;
   }
@@ -150,12 +139,6 @@ body #dashboard.two-pane {
   .header-wrapper {
     .flex(0 0 65px);
     position: inherit;
-
-    #breadcrumbs {
-      height: 64px;
-      .flex(0 0 440px);
-      overflow: hidden;
-    }
   }
 }
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/6fbf911a/assets/less/templates.less
----------------------------------------------------------------------
diff --git a/assets/less/templates.less b/assets/less/templates.less
index efe554f..3a431e3 100644
--- a/assets/less/templates.less
+++ b/assets/less/templates.less
@@ -282,16 +282,7 @@
   .box-shadow(-6px 6px 0 0 rgba(0, 0, 0, 0.1));
 }
 
-/*
-
-FIXED HEADER, DASHBOARD & BREADCRUMBS:
 
-one_pane.html
-two_pane.html
-with_sidebar.html
-with_tabs.html
-with_tabs_sidebar.html
- */
 #dashboard {
   position: relative;
   left: @navWidth;


Mime
View raw message