You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by de...@apache.org on 2014/08/06 21:31:33 UTC

[26/26] fauxton commit: updated refs/heads/secondary-indexes to 7a446d8

Left header is now a reusable component
Header stuff
placeholder graphic
Messed up folders
Fix design doc selector


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

Branch: refs/heads/secondary-indexes
Commit: 7a446d864065043d8b0c444087e79e13bae7b776
Parents: 6e343fa
Author: deathbearbrown <de...@gmail.com>
Authored: Wed Aug 6 15:25:15 2014 -0400
Committer: deathbearbrown <de...@gmail.com>
Committed: Wed Aug 6 15:31:04 2014 -0400

----------------------------------------------------------------------
 app/addons/documents/assets/less/documents.less |   1 -
 app/addons/documents/assets/less/headers.less   |   6 +-
 app/addons/documents/views-sidebar.js           |   2 +-
 app/addons/fauxton/components.js                |  53 ++++-
 app/addons/fauxton/templates/header_left.html   |  17 ++
 .../assets/less/new-index-placeholder.less      |   2 +-
 app/addons/indexes/less/indexes.less            |  13 --
 .../indexes/less/new-index-placeholder.less     |   3 -
 app/addons/indexes/routes-list.js               |  65 ++++--
 app/addons/indexes/routes-show.js               |  69 ++++--
 app/addons/indexes/routes-viewindexes.js        |  75 ++++--
 .../indexes/templates/design_doc_selector.html  |  44 ++--
 app/addons/indexes/templates/header_left.html   |  17 --
 app/addons/indexes/templates/header_right.html  |   6 +-
 app/addons/indexes/templates/index_header.html  |  28 ---
 .../indexes/templates/preview_screen.html       |   2 +
 app/addons/indexes/views.js                     | 227 +++++++++----------
 assets/less/fauxton.less                        |   1 +
 assets/less/headers.less                        | 116 ++++++++++
 assets/less/templates.less                      | 100 --------
 20 files changed, 484 insertions(+), 363 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/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 26e3ffa..5a39fab 100644
--- a/app/addons/documents/assets/less/documents.less
+++ b/app/addons/documents/assets/less/documents.less
@@ -17,7 +17,6 @@
 @import "advancedOptions.less";
 @import "changes.less";
 @import "sidenav.less";
-@import "headers.less";
 
 tr.all-docs-item {
   border: none;

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/documents/assets/less/headers.less
----------------------------------------------------------------------
diff --git a/app/addons/documents/assets/less/headers.less b/app/addons/documents/assets/less/headers.less
index 3df552c..31faef1 100644
--- a/app/addons/documents/assets/less/headers.less
+++ b/app/addons/documents/assets/less/headers.less
@@ -1,7 +1,3 @@
-.header-left {
-  width: 300px;
-  float: left;
-}
 .header-right {
   .searchbox-container {
     position: relative;
@@ -22,4 +18,4 @@
       color: #999;
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/documents/views-sidebar.js
----------------------------------------------------------------------
diff --git a/app/addons/documents/views-sidebar.js b/app/addons/documents/views-sidebar.js
index 7ebe99a..72a383f 100644
--- a/app/addons/documents/views-sidebar.js
+++ b/app/addons/documents/views-sidebar.js
@@ -175,7 +175,7 @@ function(app, FauxtonAPI, Components, Documents, Databases) {
 
         menuLinks.push({
           title: link.title,
-          url: "#" + database.url('app') + "/_design/" + docSafe + "/" + link.url,
+          url: "#" + database.url('app')+ "/" + link.url + "/" + docSafe,
           icon: 'fonticon-plus-circled'
         });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/fauxton/components.js
----------------------------------------------------------------------
diff --git a/app/addons/fauxton/components.js b/app/addons/fauxton/components.js
index c92a7ce..0ef9503 100644
--- a/app/addons/fauxton/components.js
+++ b/app/addons/fauxton/components.js
@@ -35,6 +35,40 @@ function(app, FauxtonAPI, ace, spin, ZeroClipboard) {
   var Components = FauxtonAPI.addon();
 
 
+  //setting up the left header with the backbutton used in Views and All docs
+  Components.LeftHeader = FauxtonAPI.View.extend({
+    className: "header-left",
+    template: "addons/fauxton/templates/header_left",
+    initialize:function(options){
+      this.dropdownMenuLinks = options.dropdownMenu;
+      this.crumbs = options.crumbs || [];
+    },
+    updateCrumbs: function(crumbs){
+      this.breadcrumbs.update(crumbs);
+    },
+    updateDropdown: function(menuLinks){
+      this.dropdown.update(menuLinks);
+    },
+    beforeRender: function(){
+      this.setUpCrumbs();
+      this.setUpDropDownMenu();
+    },
+    setUpCrumbs: function(){
+      this.breadcrumbs = this.insertView("#header-breadcrumbs", new Components.Breadcrumbs({
+        crumbs: this.crumbs
+      }));
+    },
+    setUpDropDownMenu: function(){
+      if (this.dropdownMenuLinks){
+        this.dropdown = this.insertView("#header-dropdown-menu", new Components.MenuDropDown({
+          icon: 'fonticon-cog',
+          links: this.dropdownMenuLinks,
+        }));
+      }
+    }
+  });
+
+
   Components.Breadcrumbs = FauxtonAPI.View.extend({
     className: "breadcrumb pull-left",
     tagName: "ul",
@@ -45,7 +79,10 @@ function(app, FauxtonAPI, ace, spin, ZeroClipboard) {
         crumbs: crumbs
       };
     },
-
+    update: function(crumbs) {
+      this.crumbs = crumbs;
+      this.render();
+    },
     initialize: function(options) {
       this.crumbs = options.crumbs;
     }
@@ -53,14 +90,16 @@ function(app, FauxtonAPI, ace, spin, ZeroClipboard) {
 
   Components.ApiBar = FauxtonAPI.View.extend({
     template: "addons/fauxton/templates/api_bar",
-    endpoint: '_all_docs',
-
-    documentation: 'docs',
-
     events:  {
       "click .api-url-btn" : "toggleAPIbar"
     },
 
+    initialize: function(options){
+      var _options = options || {};
+      this.endpoint = _options.endpoint || '_all_docs';
+      this.documentation = _options.documentation || 'docs';
+    },
+
     toggleAPIbar: function(e){
       var $currentTarget = $(e.currentTarget).find('span');
       if ($currentTarget.hasClass("fonticon-plus")){
@@ -703,6 +742,10 @@ function(app, FauxtonAPI, ace, spin, ZeroClipboard) {
       this.links = options.links;
       this.icon = options.icon || "fonticon-plus-circled2";
     },
+    update: function(links){
+      this.links = links;
+      this.render();
+    },
     serialize: function(){
       return {
         links: this.links,

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/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
new file mode 100644
index 0000000..13bea60
--- /dev/null
+++ b/app/addons/fauxton/templates/header_left.html
@@ -0,0 +1,17 @@
+<!--
+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"></div>

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/assets/less/new-index-placeholder.less
----------------------------------------------------------------------
diff --git a/app/addons/indexes/assets/less/new-index-placeholder.less b/app/addons/indexes/assets/less/new-index-placeholder.less
index 6336771..ade1d3a 100644
--- a/app/addons/indexes/assets/less/new-index-placeholder.less
+++ b/app/addons/indexes/assets/less/new-index-placeholder.less
@@ -12,7 +12,7 @@
 .watermark-logo {
   background: transparent url('../img/couchWatermark.png') no-repeat 50% 50%;
   min-height: 400px;
-  padding-top: 80%;
+  padding-top: 60%;
   text-align: center;
   h3 {
     border-bottom: 1px solid #ccc;

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/less/indexes.less
----------------------------------------------------------------------
diff --git a/app/addons/indexes/less/indexes.less b/app/addons/indexes/less/indexes.less
deleted file mode 100644
index d526ee9..0000000
--- a/app/addons/indexes/less/indexes.less
+++ /dev/null
@@ -1,13 +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 "new-index-placeholder.less";

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/less/new-index-placeholder.less
----------------------------------------------------------------------
diff --git a/app/addons/indexes/less/new-index-placeholder.less b/app/addons/indexes/less/new-index-placeholder.less
deleted file mode 100644
index 3f5db0e..0000000
--- a/app/addons/indexes/less/new-index-placeholder.less
+++ /dev/null
@@ -1,3 +0,0 @@
-.watermark-logo {
-  background: transparent url(../img/couchWatermark.png') no-repeat 0 0;
-}

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/routes-list.js
----------------------------------------------------------------------
diff --git a/app/addons/indexes/routes-list.js b/app/addons/indexes/routes-list.js
index 1245c24..437cef6 100644
--- a/app/addons/indexes/routes-list.js
+++ b/app/addons/indexes/routes-list.js
@@ -16,10 +16,11 @@ define([
   "addons/indexes/views",
   "addons/documents/views",
   "addons/indexes/resources",
-  "addons/indexes/routes-core"
+  "addons/indexes/routes-core",
+  "addons/fauxton/components"
 ],
 
-function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
+function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore, Components) {
 
   var ListIndexes = RouteCore.extend({
     routes: {
@@ -39,6 +40,9 @@ function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
     newListsEditor: function (database, designDoc) {
       var params = app.getParams();
 
+      /* --------------------------------------------------
+        Insert View Editor for new list
+      ----------------------------------------------------*/
       this.setView("#left-content", new Views.ListEditor({
         model: this.data.database,
         currentddoc: designDoc ? "_design/"+designDoc : "",
@@ -47,23 +51,56 @@ function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
         database: this.data.database,
         newView: true
       }));
-
+      /* --------------------------------------------------
+        Insert Preview Screen View
+      ----------------------------------------------------*/
       this.setView("#right-content", new Views.PreviewScreen({}));
-      this.crumbs = function () {
-        return [
-          {"name": "Create List Index", "link": Databases.databaseUrl(this.data.database)},
-        ];
-      };
+
+      /* --------------------------------------------------
+        Set up & Insert breadcrumb header
+      ----------------------------------------------------*/
+      var crumbs = [
+        {"name": "", "className": "fonticon-left-open", "link": Databases.databaseUrl(this.data.database)},
+        {"name": "Create a List Index", "link": Databases.databaseUrl(this.data.database)}
+      ];
+      this.leftheader = this.setView("#breadcrumbs", new Components.LeftHeader({
+        crumbs: crumbs
+      }));
     },
-    tempFn:  function(databaseName, ddoc, fn){
+    tempFn:  function(databaseName, ddoc, view){
+      /* --------------------------------------------------
+        Set up breadcrumb header
+      ----------------------------------------------------*/
+      var crumbs = [
+        {"name": "", "className": "fonticon-left-open", "link": Databases.databaseUrl(this.data.database)},
+        {"name": view, "link": Databases.databaseUrl(this.data.database)}
+      ];
+
+      var dropdown = [{
+        links: [{
+          title: 'Duplicate Index',
+          icon: 'fonticon-documents'
+        },{
+          title: 'Delete',
+          icon: 'fonticon-trash'
+        }]
+      }];
+
+      this.leftheader = this.setView("#breadcrumbs", new Components.LeftHeader({
+        crumbs: crumbs,
+        dropdownMenu: dropdown
+      }));
+
+
+      /* --------------------------------------------------
+        Insert List Editor
+      ----------------------------------------------------*/
       this.setView("#left-content", new Views.ListEditor({}));
 
+      /* --------------------------------------------------
+        Insert Preview Screen View
+      ----------------------------------------------------*/
       this.setView("#right-content", new Views.PreviewScreen({}));
-      this.crumbs = function () {
-        return [
-          {"name": this.data.database.id, "link": Databases.databaseUrl(this.data.database)},
-        ];
-      };
     }
   });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/routes-show.js
----------------------------------------------------------------------
diff --git a/app/addons/indexes/routes-show.js b/app/addons/indexes/routes-show.js
index 10a3a56..73f52d1 100644
--- a/app/addons/indexes/routes-show.js
+++ b/app/addons/indexes/routes-show.js
@@ -16,10 +16,11 @@ define([
   "addons/indexes/views",
   "addons/documents/views",
   "addons/indexes/resources",
-  "addons/indexes/routes-core"
+  "addons/indexes/routes-core",
+   "addons/fauxton/components"
 ],
 
-function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
+function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore, Components) {
 
   var ShowIndexes = RouteCore.extend({
     routes: {
@@ -33,7 +34,9 @@ function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
 
     newShowEditor: function (database, designDoc) {
       var params = app.getParams();
-
+      /* --------------------------------------------------
+        Insert View Editor for new view
+      ----------------------------------------------------*/
       this.setView("#left-content", new Views.ShowEditor({
         model: this.data.database,
         currentddoc: designDoc ? "_design/"+designDoc : "",
@@ -43,28 +46,56 @@ function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
         newView: true
       }));
 
+      /* --------------------------------------------------
+        Insert Preview Screen View
+      ----------------------------------------------------*/
       this.setView("#right-content", new Views.PreviewScreen({}));
-      this.crumbs = function () {
-        return [
-          {"name": "Create Show Index", "link": Databases.databaseUrl(this.data.database)},
-        ];
-      };
-    },
 
-    apiUrl: function() {
-      //TODO: Hook up proper API urls
-      return '';
+      /* --------------------------------------------------
+        Set up & Insert breadcrumb header
+      ----------------------------------------------------*/
+      var crumbs = [
+        {"name": "", "className": "fonticon-left-open", "link": Databases.databaseUrl(this.data.database)},
+        {"name": "Create a Show Index", "link": Databases.databaseUrl(this.data.database)}
+      ];
+      this.leftheader = this.setView("#breadcrumbs", new Components.LeftHeader({
+        crumbs: crumbs
+      }));
     },
+    tempFn:  function(databaseName, ddoc, view){
+      /* --------------------------------------------------
+        Set up breadcrumb header
+      ----------------------------------------------------*/
+      var crumbs = [
+        {"name": "", "className": "fonticon-left-open", "link": Databases.databaseUrl(this.data.database)},
+        {"name": view, "link": Databases.databaseUrl(this.data.database)}
+      ];
+
+      var dropdown = [{
+        links: [{
+          title: 'Duplicate Index',
+          icon: 'fonticon-documents'
+        },{
+          title: 'Delete',
+          icon: 'fonticon-trash'
+        }]
+      }];
+
+      this.leftheader = this.setView("#breadcrumbs", new Components.LeftHeader({
+        crumbs: crumbs,
+        dropdownMenu: dropdown
+      }));
+
 
-    tempFn:  function(databaseName, ddoc, fn){
-      this.setView("#left-content", new Views.ShowEditor({}));
+      /* --------------------------------------------------
+        Insert Show Editor
+      ----------------------------------------------------*/
+      this.setView("#left-content", new Views.ListEditor({}));
 
+      /* --------------------------------------------------
+        Insert Preview Screen View
+      ----------------------------------------------------*/
       this.setView("#right-content", new Views.PreviewScreen({}));
-      this.crumbs = function () {
-        return [
-          {"name": this.data.database.id, "link": Databases.databaseUrl(this.data.database)},
-        ];
-      };
     }
   });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/routes-viewindexes.js
----------------------------------------------------------------------
diff --git a/app/addons/indexes/routes-viewindexes.js b/app/addons/indexes/routes-viewindexes.js
index de53981..7330d04 100644
--- a/app/addons/indexes/routes-viewindexes.js
+++ b/app/addons/indexes/routes-viewindexes.js
@@ -16,10 +16,11 @@ define([
   "addons/indexes/views",
   "addons/documents/views",
   "addons/indexes/resources",
-  "addons/indexes/routes-core"
+  "addons/indexes/routes-core",
+  "addons/fauxton/components"
 ],
 
-function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
+function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore, Components) {
 
   var ViewIndexes = RouteCore.extend({
     routes: {
@@ -33,10 +34,19 @@ function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
 
     newViewEditor: function (database, designDoc) {
       var params = app.getParams();
+      /* --------------------------------------------------
+        remove right header
+      ----------------------------------------------------*/
       this.rightheader && this.rightheader.remove();
 
+      /* --------------------------------------------------
+        Insert Preview Screen View
+      ----------------------------------------------------*/
       this.setView("#right-content", new Views.PreviewScreen({}));
 
+      /* --------------------------------------------------
+        Insert View Editor for new view
+      ----------------------------------------------------*/
       this.viewEditor = this.setView("#left-content", new Views.ViewEditor({
         model: this.data.database,
         currentddoc: designDoc ? "_design/"+designDoc : "",
@@ -46,9 +56,15 @@ function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
         newView: true
       }));
 
-      this.leftheader = this.setView("#breadcrumbs", new Views.LeftHeader({
-        title:"Create a View Index",
-        database: this.data.database
+      /* --------------------------------------------------
+        Set up & Insert breadcrumb header
+      ----------------------------------------------------*/
+      var crumbs = [
+        {"name": "", "className": "fonticon-left-open", "link": Databases.databaseUrl(this.data.database)},
+        {"name": "Create a View Index", "link": Databases.databaseUrl(this.data.database)}
+      ];
+      this.leftheader = this.setView("#breadcrumbs", new Components.LeftHeader({
+        crumbs: crumbs
       }));
 
     },
@@ -60,15 +76,32 @@ function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
           decodeDdoc = decodeURIComponent(ddoc);
           view = view.replace(/\?.*$/,'');
 
-      this.leftheader = this.setView("#breadcrumbs", new Views.LeftHeader({
-        title: view,
-        database: this.data.database
-      }));
+      /* --------------------------------------------------
+        Set up breadcrumb header
+      ----------------------------------------------------*/
+      var crumbs = [
+        {"name": "", "className": "fonticon-left-open", "link": Databases.databaseUrl(this.data.database)},
+        {"name": view, "link": Databases.databaseUrl(this.data.database)}
+      ];
+
+      var dropdown = [{
+        links: [{
+          title: 'Duplicate Index',
+          icon: 'fonticon-documents'
+        },{
+          title: 'Delete',
+          icon: 'fonticon-trash'
+        }]
+      }];
 
-      this.rightheader = this.setView("#api-bar", new Views.RightHeader({
-        database: this.data.database
+      this.leftheader = this.setView("#breadcrumbs", new Components.LeftHeader({
+        crumbs: crumbs,
+        dropdownMenu: dropdown
       }));
 
+      /* --------------------------------------------------
+        Set up Index Collection
+      ----------------------------------------------------*/
       this.data.indexedDocs = new Resources.IndexCollection(null, {
         database: this.data.database,
         design: decodeDdoc,
@@ -79,6 +112,21 @@ function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
         }
       });
 
+
+      /* --------------------------------------------------
+        Set up right header
+      ----------------------------------------------------*/
+
+      this.rightheader = this.setView("#api-navbar", new Views.RightHeader({
+        database: this.data.database,
+        model: this.data.database,
+        endpoint: this.data.indexedDocs.urlRef("apiurl", urlParams),
+        documentation: "docs"
+      }));
+
+      /* --------------------------------------------------
+        Insert View Editor
+      ----------------------------------------------------*/
       this.viewEditor = this.setView("#left-content", new Views.ViewEditor({
         model: this.data.database,
         ddocs: this.data.designDocs,
@@ -89,6 +137,9 @@ function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
         ddocInfo: this.ddocInfo(decodeDdoc, this.data.designDocs, view)
       }));
 
+      /* --------------------------------------------------
+        Insert Docs returned from view
+      ----------------------------------------------------*/
       this.documentsView = this.createViewDocumentsView({
         designDoc: decodeDdoc,
         docParams: docParams,
@@ -98,8 +149,6 @@ function (app, FauxtonAPI, Databases, Views, Documents, Resources, RouteCore) {
         designDocs: this.data.designDocs,
         view: view
       });
-
-      this.apiUrl = [this.data.indexedDocs.urlRef("apiurl", urlParams), "docs"];
     }
   });
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/templates/design_doc_selector.html
----------------------------------------------------------------------
diff --git a/app/addons/indexes/templates/design_doc_selector.html b/app/addons/indexes/templates/design_doc_selector.html
index 98abc46..7d58116 100644
--- a/app/addons/indexes/templates/design_doc_selector.html
+++ b/app/addons/indexes/templates/design_doc_selector.html
@@ -11,28 +11,26 @@ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 License for the specific language governing permissions and limitations under
 the License.
 -->
-<div class="span3">
-  <label for="ddoc">Save to Design Document <a class="help-link" href="<%-getDocUrl('design_doc')%>" target="_blank"><i class="icon-question-sign"></i></a></label>
-  <select id="ddoc">
-    <optgroup label="Select a document">
-      <option value="new-doc">New document</option>
+<label for="ddoc">Save to Design Document <a class="help-link" data-bypass="true" href="<%-getDocUrl('design_doc')%>" target="_blank"><i class="icon-question-sign"></i></a></label>
+<div class="row-fluid new-ddoc">
+  <div class="select-wrapper span5">
+    <select id="ddoc">
+      <optgroup label="Select a document">
+        <option value="new-doc">New document</option>
 
-      <% ddocs.each(function(ddoc) { %>
-      <%= ddoc.id %>
-      <%= ddocName %>
-      <% if (ddoc.id === ddocName) { %>
-      <option selected="selected" value="<%- ddoc.id %>"><%- ddoc.id %></option>
-      <% } else { %>
-      <option value="<%- ddoc.id %>"><%- ddoc.id %></option>
-      <% } %>
-      <% }); %>
-    </optgroup>
-  </select>
-</div>
-
-<div id="new-ddoc-section" class="span5" style="display:none">
-  <label class="control-label" for="new-ddoc"> _design/ </label>
-  <div class="controls">
-    <input type="text" id="new-ddoc" placeholder="newDesignDoc" />
+        <% ddocs.each(function(ddoc) { %>
+        <%= ddoc.id %>
+        <%= ddocName %>
+        <% if (ddoc.id === ddocName) { %>
+        <option selected="selected" value="<%- ddoc.id %>"><%- ddoc.id %></option>
+        <% } else { %>
+        <option value="<%- ddoc.id %>"><%- ddoc.id %></option>
+        <% } %>
+        <% }); %>
+      </optgroup>
+    </select>
+    <i></i>
   </div>
-</div>
\ No newline at end of file
+
+  <input type="text" id="new-ddoc" class="span7" style="display:none" placeholder="Enter a design doc name" />
+</div>

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/templates/header_left.html
----------------------------------------------------------------------
diff --git a/app/addons/indexes/templates/header_left.html b/app/addons/indexes/templates/header_left.html
deleted file mode 100644
index 13bea60..0000000
--- a/app/addons/indexes/templates/header_left.html
+++ /dev/null
@@ -1,17 +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"></div>

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/templates/header_right.html
----------------------------------------------------------------------
diff --git a/app/addons/indexes/templates/header_right.html b/app/addons/indexes/templates/header_right.html
index 90828d2..8279bf6 100644
--- a/app/addons/indexes/templates/header_right.html
+++ b/app/addons/indexes/templates/header_right.html
@@ -11,8 +11,12 @@ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 License for the specific language governing permissions and limitations under
 the License.
 -->
-
   <!-- Query Options-->
+  <div id="header-select-all">
+    <span class="toggle-select-menu icon fonticon-ok-circled">Select</span>
+  </div>
+  <!-- Query Options-->
+  <div id="header-query-options"></div>
   <!--right margin for api bar-->
   <div id="header-api-bar"></div>
 

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/templates/index_header.html
----------------------------------------------------------------------
diff --git a/app/addons/indexes/templates/index_header.html b/app/addons/indexes/templates/index_header.html
deleted file mode 100644
index ac8ac56..0000000
--- a/app/addons/indexes/templates/index_header.html
+++ /dev/null
@@ -1,28 +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.
--->
-
-<div class="header-left">
-<!--back arrow-->
-
-<!--title-->
-
-<!-- Menu gear-->
-
-</div>
-
-
-<div class="header-right">
-  <!-- Query Options-->
-  <!--right margin for api bar-->
-</div>

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/templates/preview_screen.html
----------------------------------------------------------------------
diff --git a/app/addons/indexes/templates/preview_screen.html b/app/addons/indexes/templates/preview_screen.html
index 1fcf6d9..a7de45b 100644
--- a/app/addons/indexes/templates/preview_screen.html
+++ b/app/addons/indexes/templates/preview_screen.html
@@ -13,4 +13,6 @@ the License.
 -->
 
 <h3>No Index Created Yet!</h3>
+<!--
 <p> Run <a href="#/preview" class="btn btn-success save"> Preview</a> To query result</p>
+-->

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/app/addons/indexes/views.js
----------------------------------------------------------------------
diff --git a/app/addons/indexes/views.js b/app/addons/indexes/views.js
index 80e6a40..bfe209e 100644
--- a/app/addons/indexes/views.js
+++ b/app/addons/indexes/views.js
@@ -34,41 +34,6 @@ function(app, FauxtonAPI, Components, Documents, Databases, pouchdb,
 
   var Views = {};
 
-//left header
-  Views.LeftHeader = FauxtonAPI.View.extend({
-    className: "header-left",
-    template: "addons/indexes/templates/header_left",
-    initialize:function(options){
-      this.database = options.database;
-      this.title = options.title;
-    },
-    beforeRender: function(){
-      var crumbs = [
-        {"name": "", "className": "fonticon-left-open", "link": Databases.databaseUrl(this.database)},
-        {"name": this.title, "link": Databases.databaseUrl(this.database)}
-      ];
-      this.insertView("#header-breadcrumbs", new Components.Breadcrumbs({
-        crumbs: crumbs
-      }));
-      this.dropDownMenu();
-    },
-    dropDownMenu: function(){
-      var newLinks = [{
-        links: [{
-          title: 'Table',
-          icon: 'fonticon-table'
-        },{
-          title: 'JSON',
-          icon: 'fonticon-json'
-        }]
-      }];
-
-      this.insertView("#header-dropdown-menu", new Components.MenuDropDown({
-        icon: 'fonticon-cog',
-        links: newLinks,
-      }));
-    }
-  });
 
 //right header
   Views.RightHeader = FauxtonAPI.View.extend({
@@ -77,9 +42,116 @@ function(app, FauxtonAPI, Components, Documents, Databases, pouchdb,
     initialize:function(options){
       this.database = options.database;
       this.title = options.title;
+      this.api = options.api;
+      this.endpoint = options.endpoint;
+      this.documentation = options.documentation;
+      this.eventer = _.extend({}, Backbone.Events);
+    },
+    updateApiUrl: function(api){
+      //this will update the api bar when the route changes
+      //you can find the method that updates it in components.js Components.ApiBar()
+      this.apiBar && this.apiBar.update(api);
     },
     beforeRender: function(){
-      this.insertView(".header-api-bar", new Components.ApiBar({}));
+
+      this.apiBar = this.insertView("#header-api-bar", new Components.ApiBar({
+        endpoint: this.endpoint,
+        documentation: this.documentation
+      }));
+
+      this.advancedOptions = this.insertView('#header-query-options', new QueryOptions.AdvancedOptions({
+        updateViewFn: this.updateView,
+        previewFn: this.previewView,
+        database: this.database,
+        viewName: this.viewName,
+        ddocName: this.model.id,
+        hasReduce: this.hasReduce(),
+        eventer: this.eventer,
+        showStale: true
+      }));
+    },
+    hasReduce: function(){
+
+    },
+    updateView: function(event, paramInfo) {
+       event.preventDefault();
+
+       var errorParams = paramInfo.errorParams,
+           params = paramInfo.params;
+
+       if (_.any(errorParams)) {
+         _.map(errorParams, function(param) {
+
+           // TODO: Where to add this error?
+           // bootstrap wants the error on a control-group div, but we're not using that
+           //$('form.view-query-update input[name='+param+'], form.view-query-update select[name='+param+']').addClass('error');
+           return FauxtonAPI.addNotification({
+             msg: "JSON Parse Error on field: "+param.name,
+             type: "error",
+             selector: ".advanced-options .errors-container",
+             clear: true
+           });
+         });
+         FauxtonAPI.addNotification({
+           msg: "Make sure that strings are properly quoted and any other values are valid JSON structures",
+           type: "warning",
+           selector: ".advanced-options .errors-container",
+           clear: true
+         });
+
+         return false;
+      }
+
+       var fragment = window.location.hash.replace(/\?.*$/, '');
+       if (!_.isEmpty(params)) {
+        fragment = fragment + '?' + $.param(params);
+       }
+
+       FauxtonAPI.navigate(fragment, {trigger: false});
+       FauxtonAPI.triggerRouteEvent('updateAllDocs', {ddoc: this.ddocID, view: this.viewName});
+    },
+
+
+    previewView: function(event, paramsInfo) {
+      event.preventDefault();
+      var that = this,
+      mapVal = this.mapVal(),
+      reduceVal = this.reduceVal(),
+      paramsArr = [];
+
+      if (paramsInfo && paramsInfo.params) {
+        paramsArr = paramsInfo.params;
+      }
+
+      var params = _.reduce(paramsArr, function (params, param) {
+        params[param.name] = param.value;
+        return params;
+      }, {reduce: false});
+
+      FauxtonAPI.addNotification({
+        msg: "<strong>Warning!</strong> Preview executes the Map/Reduce functions in your browser, and may behave differently from CouchDB.",
+        type: "warning",
+        selector: ".advanced-options .errors-container",
+        fade: true,
+        escape: false // beware of possible XSS when the message changes
+      });
+
+      var promise = FauxtonAPI.Deferred();
+
+      if (!this.database.allDocs || this.database.allDocs.params.include_docs !== true) {
+        this.database.buildAllDocs({limit: Databases.DocLimit.toString(), include_docs: true});
+        promise = this.database.allDocs.fetch();
+       } else {
+        promise.resolve();
+       }
+
+      promise.then(function () {
+        params.docs = that.database.allDocs.map(function (model) { return model.get('doc');});
+        var queryPromise = pouchdb.runViewQuery({map: mapVal, reduce: reduceVal}, params);
+        queryPromise.then(function (results) {
+          FauxtonAPI.triggerRouteEvent('updatePreviewDocs', {rows: results.rows, ddoc: that.getCurrentDesignDoc().id, view: that.viewName});
+        });
+      });
     }
   });
 
@@ -396,89 +468,6 @@ function(app, FauxtonAPI, Components, Documents, Databases, pouchdb,
       FauxtonAPI.triggerRouteEvent('updateAllDocs', {ddoc: ddocName, view: viewName});
     },
 
-    updateView: function(event, paramInfo) {
-       event.preventDefault();
-
-       if (this.newView) { return alert('Please save this new view before querying it.'); }
-
-       var errorParams = paramInfo.errorParams,
-           params = paramInfo.params;
-
-       if (_.any(errorParams)) {
-         _.map(errorParams, function(param) {
-
-           // TODO: Where to add this error?
-           // bootstrap wants the error on a control-group div, but we're not using that
-           //$('form.view-query-update input[name='+param+'], form.view-query-update select[name='+param+']').addClass('error');
-           return FauxtonAPI.addNotification({
-             msg: "JSON Parse Error on field: "+param.name,
-             type: "error",
-             selector: ".advanced-options .errors-container",
-             clear: true
-           });
-         });
-         FauxtonAPI.addNotification({
-           msg: "Make sure that strings are properly quoted and any other values are valid JSON structures",
-           type: "warning",
-           selector: ".advanced-options .errors-container",
-           clear: true
-         });
-
-         return false;
-      }
-
-       var fragment = window.location.hash.replace(/\?.*$/, '');
-       if (!_.isEmpty(params)) {
-        fragment = fragment + '?' + $.param(params);
-       }
-
-       FauxtonAPI.navigate(fragment, {trigger: false});
-       FauxtonAPI.triggerRouteEvent('updateAllDocs', {ddoc: this.ddocID, view: this.viewName});
-    },
-
-
-    previewView: function(event, paramsInfo) {
-      event.preventDefault();
-      var that = this,
-      mapVal = this.mapVal(),
-      reduceVal = this.reduceVal(),
-      paramsArr = [];
-
-      if (paramsInfo && paramsInfo.params) {
-        paramsArr = paramsInfo.params;
-      }
-
-      var params = _.reduce(paramsArr, function (params, param) {
-        params[param.name] = param.value;
-        return params;
-      }, {reduce: false});
-
-      FauxtonAPI.addNotification({
-        msg: "<strong>Warning!</strong> Preview executes the Map/Reduce functions in your browser, and may behave differently from CouchDB.",
-        type: "warning",
-        selector: ".advanced-options .errors-container",
-        fade: true,
-        escape: false // beware of possible XSS when the message changes
-      });
-
-      var promise = FauxtonAPI.Deferred();
-
-      if (!this.database.allDocs || this.database.allDocs.params.include_docs !== true) {
-        this.database.buildAllDocs({limit: Databases.DocLimit.toString(), include_docs: true});
-        promise = this.database.allDocs.fetch();
-       } else {
-        promise.resolve();
-       }
-
-      promise.then(function () {
-        params.docs = that.database.allDocs.map(function (model) { return model.get('doc');});
-        var queryPromise = pouchdb.runViewQuery({map: mapVal, reduce: reduceVal}, params);
-        queryPromise.then(function (results) {
-          FauxtonAPI.triggerRouteEvent('updatePreviewDocs', {rows: results.rows, ddoc: that.getCurrentDesignDoc().id, view: that.viewName});
-        });
-      });
-    },
-
     getCurrentDesignDoc: function () {
       return this.designDocSelector.getCurrentDesignDoc();
     },

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/assets/less/fauxton.less
----------------------------------------------------------------------
diff --git a/assets/less/fauxton.less b/assets/less/fauxton.less
index 31678a3..6467923 100644
--- a/assets/less/fauxton.less
+++ b/assets/less/fauxton.less
@@ -23,6 +23,7 @@
 @import "prettyprint.less";
 @import "icons.less";
 @import "templates.less";
+@import "headers.less";
 @import "formstyles.less";
 /**
  * HTML-wide overrides

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/assets/less/headers.less
----------------------------------------------------------------------
diff --git a/assets/less/headers.less b/assets/less/headers.less
new file mode 100644
index 0000000..c80a88f
--- /dev/null
+++ b/assets/less/headers.less
@@ -0,0 +1,116 @@
+.fixed-header{
+  height: 60px;
+  background-color: @breadcrumbBG;
+  position: fixed;
+  top: 0;
+  right: 0;
+  left: @navWidth;
+  .closeMenu & {
+    left: @collapsedNavWidth;
+  }
+  z-index: 100;
+  .two-pane & {
+    border: none;
+  }
+  .two-pane &,
+  .with-sidebar & {
+    #api-navbar{
+      > div {
+        .bottom-shadow-border;
+        height: 60px;
+      }
+      .left-shadow-border;
+    }
+    #breadcrumbs{
+      .bottom-shadow-border;
+    }
+  }
+  .one-pane & {
+    #breadcrumbs{
+      width: 90%;
+    }
+    position: relative;
+    border: none;
+    .box-shadow(none);
+    left: auto;
+  }
+  /* these styles are for the new header*/
+  > div {
+    display:inline-block;
+    vertical-align: top;
+  }
+}
+
+#api-navbar{
+  height: 60px;
+  position: relative;
+  /* these styles are for the new header*/
+  .right-header{
+  }
+}
+
+#breadcrumbs {
+  height: 60px;
+  &.sidebar{
+    width: @sidebarWidth - 4;
+  }
+  /* these styles are for the new header*/
+  .header-left{
+    > div{
+      display:inline-block;
+    }
+  }
+  .breadcrumb {
+    margin-bottom: 0;
+    background-color: transparent;
+    padding: 0;
+    li {
+      padding:15px 10px;
+      height: 60px;
+      vertical-align: top;
+      &:first-child {
+        font-size: 30px;
+        .with-sidebar &,
+        .two-pane & {
+          padding:20px 10px;
+          font-size: 19px;
+          border-right: 1px solid #ccc;
+        }
+      }
+      color: @breadcrumbText;
+      font-size: 18px;
+      text-shadow: none;
+      &.active{
+        color: #333;
+      }
+      a{
+        text-decoration: none;
+        color: @breadcrumbText;
+      }
+    }
+  }
+}
+
+.header-left{
+  position: relative;
+  #header-dropdown-menu {
+    position: absolute;
+    right: 0;
+    top: 0;
+    a {
+      text-decoration: none;
+    }
+    .dropdown {
+      border-left: 1px solid #ccc;
+      padding: 20px;
+    }
+    .dropdown-menu {
+      left: -105px;
+      top: 56px;
+    }
+  }
+}
+
+
+
+

http://git-wip-us.apache.org/repos/asf/couchdb-fauxton/blob/7a446d86/assets/less/templates.less
----------------------------------------------------------------------
diff --git a/assets/less/templates.less b/assets/less/templates.less
index a6f1a78..5c877b4 100644
--- a/assets/less/templates.less
+++ b/assets/less/templates.less
@@ -297,104 +297,6 @@
   }
 }
 
-.fixed-header{
-  height: 60px;
-  background-color: @breadcrumbBG;
-  position: fixed;
-  top: 0;
-  right: 0;
-  left: @navWidth;
-  .closeMenu & {
-    left: @collapsedNavWidth;
-  }
-  z-index: 100;
-  .two-pane & {
-    border: none;
-  }
-  .two-pane &,
-  .with-sidebar & {
-    #api-navbar{
-      > div {
-        .bottom-shadow-border;
-        height: 60px;
-      }
-      .left-shadow-border;
-    }
-    #breadcrumbs{
-      .bottom-shadow-border;
-    }
-  }
-  .one-pane & {
-    #breadcrumbs{
-      width: 90%;
-    }
-    position: relative;
-    border: none;
-    .box-shadow(none);
-    left: auto;
-  }
-  /* these styles are for the new header*/
-  > div {
-    display:inline-block;
-    vertical-align: top;
-  }
-}
-
-#api-navbar{
-  height: 60px;
-  position: relative;
-  /* these styles are for the new header*/
-  .right-header{
-  }
-}
-
-#breadcrumbs {
-  height: 60px;
-  &.sidebar{
-    width: @sidebarWidth - 4;
-  }
-  /* these styles are for the new header*/
-  .header-left{
-    > div{
-      display:inline-block;
-    }
-  }
-  .breadcrumb {
-    margin-bottom: 0;
-    background-color: transparent;
-    padding: 0;
-    li {
-      padding:15px 10px;
-      height: 60px;
-      vertical-align: top;
-      &:first-child {
-        font-size: 30px;
-        .with-sidebar &,
-        .two-pane & {
-          padding:20px 10px;
-          font-size: 19px;
-          border-right: 1px solid #ccc;
-        }
-      }
-      color: @breadcrumbText;
-      font-size: 18px;
-      text-shadow: none;
-      &.active{
-        color: #333;
-      }
-      a{
-        text-decoration: none;
-        color: @breadcrumbText;
-      }
-    }
-  }
-}
-
-
-
-
-
-
 
 
 /* SIDEBAR-CONTENT & DASHBOARD-CONTENT LAYOUTS:
@@ -449,8 +351,6 @@
   }
 }
 
-
-
 #dashboard-content{
   &.row-fluid,
   &.window-resizeable{