You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ga...@apache.org on 2013/05/16 17:44:51 UTC

[2/2] git commit: updated refs/heads/fauxton-view-improvements to 4470dfa

able to save view and regenerate results


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

Branch: refs/heads/fauxton-view-improvements
Commit: 4470dfa154f0343250ce9e5daaf4e2ff8a9d5247
Parents: 82951f5
Author: Garren Smith <ga...@gmail.com>
Authored: Thu May 16 17:42:34 2013 +0200
Committer: Garren Smith <ga...@gmail.com>
Committed: Thu May 16 17:42:34 2013 +0200

----------------------------------------------------------------------
 src/fauxton/app/addons/stats/views.js              |    3 -
 src/fauxton/app/api.js                             |    5 +-
 src/fauxton/app/modules/documents/resources.js     |   51 +++++---
 src/fauxton/app/modules/documents/routes.js        |    7 +-
 src/fauxton/app/modules/documents/views.js         |  104 +++++++++++----
 .../app/templates/documents/view_editor.html       |    6 +-
 6 files changed, 119 insertions(+), 57 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/4470dfa1/src/fauxton/app/addons/stats/views.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/stats/views.js b/src/fauxton/app/addons/stats/views.js
index 9fda708..9dd9cbc 100644
--- a/src/fauxton/app/addons/stats/views.js
+++ b/src/fauxton/app/addons/stats/views.js
@@ -21,7 +21,6 @@ define([
 ],
 
 function(app, FauxtonAPI,Stats) {
-  console.log(arguments);
   Views = {};
 
   datatypeEventer = {};
@@ -69,8 +68,6 @@ function(app, FauxtonAPI,Stats) {
 
         series = _.filter(series, function(d){return d.y > 0;});
         series = _.sortBy(series, function(d){return -d.y;});
-        console.log('series');
-        console.log(series);
 
         nv.addGraph(function() {
             var width = 550,

http://git-wip-us.apache.org/repos/asf/couchdb/blob/4470dfa1/src/fauxton/app/api.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/api.js b/src/fauxton/app/api.js
index 40fb4cd..b3e4399 100644
--- a/src/fauxton/app/api.js
+++ b/src/fauxton/app/api.js
@@ -55,8 +55,9 @@ function(app, Fauxton) {
     }
   });
 
-  FauxtonAPI.navigate = function(url) {
-    Backbone.history.navigate(url, true);
+  FauxtonAPI.navigate = function(url, _opts) {
+    var options = _.extend({trigger: true}, _opts );
+    app.router.navigate(url,options);
   };
 
   FauxtonAPI.addHeaderLink = function(link) {

http://git-wip-us.apache.org/repos/asf/couchdb/blob/4470dfa1/src/fauxton/app/modules/documents/resources.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/modules/documents/resources.js b/src/fauxton/app/modules/documents/resources.js
index d231f67..2bd6ddf 100644
--- a/src/fauxton/app/modules/documents/resources.js
+++ b/src/fauxton/app/modules/documents/resources.js
@@ -13,15 +13,10 @@
 define([
   "app",
 
-  "api",
-
-  // Views
-  "modules/documents/views"
-
-  // Plugins
+  "api"
 ],
 
-function(app, FauxtonAPI, Views) {
+function(app, FauxtonAPI) {
   var Documents = app.module();
 
   Documents.Doc = Backbone.Model.extend({
@@ -64,30 +59,54 @@ function(app, FauxtonAPI, Views) {
     hasViews: function() {
       if (!this.isDdoc()) return false;
       var doc = this.get('doc');
-      return doc && doc.views && _.keys(doc.views).length > 0;
+      if (doc) {
+        return doc && doc.views && _.keys(doc.views).length > 0;
+      }
+
+      var views = this.get('views');
+      return views && _.keys(views).length > 0;
     },
 
     getDdocView: function(view) {
       if (!this.isDdoc() || !this.hasViews()) return false;
 
       var doc = this.get('doc');
-      return doc.views[view];
+      if (doc) {
+        return doc.views[view];
+      }
+
+      return this.get('views')[view];
     },
 
     setDdocView: function (view, map, reduce) {
       if (!this.isDdoc()) return false;
-      var doc = this.get('doc');
+      var views = this.get('views');
 
-      if (!doc.views) { doc.views = {}; }
+      if (reduce) {
+        views[view] = {
+          map: map,
+          reduce: reduce
+        }; 
+      } else {
+        views[view].map = map;
+      }
 
-      doc.views[view] = {
-        map: map,
-        reduce: reduce
-      };
+      this.set({views: views});
 
       return true;
     },
 
+    dDocModel: function () {
+      if (!this.isDdoc()) return false;
+      var doc = this.get('doc');
+
+      if (doc) {
+        return new Documents.Doc(doc, {database: this.database});
+      } 
+
+      return this;
+    },
+
     viewHasReduce: function(viewName) {
       var view = this.getDdocView(viewName);
 
@@ -271,7 +290,5 @@ function(app, FauxtonAPI, Views) {
     }
   });
 
-  Documents.Views = Views;
-
   return Documents;
 });

http://git-wip-us.apache.org/repos/asf/couchdb/blob/4470dfa1/src/fauxton/app/modules/documents/routes.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/modules/documents/routes.js b/src/fauxton/app/modules/documents/routes.js
index 6f16896..79506d9 100644
--- a/src/fauxton/app/modules/documents/routes.js
+++ b/src/fauxton/app/modules/documents/routes.js
@@ -16,7 +16,7 @@ define([
        "api",
 
        // Modules
-       "modules/documents/resources",
+       "modules/documents/views",
        "modules/databases/base"
 ],
 
@@ -32,7 +32,7 @@ function(app, FauxtonAPI, Documents, Databases) {
       var databaseName = options[0], docID = options[1];
 
       this.database = this.database || new Databases.Model({id: databaseName});
-      this.doc = this.doc || new Documents.Doc({
+      this.doc = new Documents.Doc({
         _id: docID
       }, {
         database: this.database
@@ -251,6 +251,7 @@ function(app, FauxtonAPI, Documents, Databases) {
       };
 
       this.setView("#dashboard-content", new Documents.Views.AllDocsList({
+        database: this.data.database,
         collection: this.data.indexedDocs,
         nestedView: Documents.Views.Row,
         viewList: true,
@@ -287,9 +288,7 @@ function(app, FauxtonAPI, Documents, Databases) {
       }));
 
       this.sidebar.setSelectedTab('new-view');
-
     }
-
   });
 
   var ChangesRouteObject = FauxtonAPI.RouteObject.extend({

http://git-wip-us.apache.org/repos/asf/couchdb/blob/4470dfa1/src/fauxton/app/modules/documents/views.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/modules/documents/views.js b/src/fauxton/app/modules/documents/views.js
index 199b551..f5219e8 100644
--- a/src/fauxton/app/modules/documents/views.js
+++ b/src/fauxton/app/modules/documents/views.js
@@ -14,6 +14,8 @@ define([
   "app",
 
   "api",
+ 
+  "modules/documents/resources",
 
   // Libs
   "codemirror",
@@ -22,9 +24,10 @@ define([
   // Plugins
   "plugins/codemirror-javascript",
   "plugins/prettify"
+
 ],
 
-function(app, FauxtonAPI, Codemirror, JSHint) {
+function(app, FauxtonAPI, Documents, Codemirror, JSHint) {
   var Views = {};
 
   Views.Tabs = FauxtonAPI.View.extend({
@@ -287,6 +290,7 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
       this.rows = {};
       this.viewList = !! options.viewList;
       this.params = options.params;
+      this.database = options.database;
       if (options.ddocInfo) {
         this.designDocs = options.ddocInfo.designDocs;
         this.ddocID = options.ddocInfo.id;
@@ -342,13 +346,26 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
       if (this.ddoc) {
         data.ddoc = this.ddoc;
         data.hasReduce = this.ddoc.viewHasReduce(this.collection.view);
+        this.view = this.collection.view;
       }
       return data;
     },
 
+    updateViewOnSave: function(ddoc, view) {
+      this.ddoc = ddoc;
+      this.view = view;
+      this.updateView();
+    },
+
     updateView: function(event) {
-      event.preventDefault();
-      var $form = $(event.currentTarget);
+      var $form;
+
+      if (event && event.preventDefault) { 
+        event.preventDefault();
+        $form = $(event.currentTarget);
+      } else {
+        $form = this.$('.view-query-update');
+      }
 
       // Ignore params without a value
       var params = _.filter($form.serializeArray(), function(param) {
@@ -395,7 +412,22 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
 
       var fragment = window.location.hash.replace(/\?.*$/, '');
       fragment = fragment + '?' + $.param(params);
-      FauxtonAPI.navigate(fragment);
+      FauxtonAPI.navigate(fragment, {trigger: false});
+
+      this.params = app.getParams();
+
+      this.collection = new Documents.IndexCollection(null, {
+        database: this.database,
+        design: this.ddoc.id.replace('_design/',''),
+        view: this.view,
+        params: this.params
+      });
+
+      var that = this;
+      FauxtonAPI.when(this.establish()).then(function () {
+        that.render();
+      });
+
     },
 
     updateFilters: function(event) {
@@ -471,10 +503,12 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
       this.setDdocInfo();
       if (this.viewList) {
         this.viewEditorView = this.insertView("#edit-index-container", new Views.ViewEditor({
-          model: this.ddoc,
+          model: this.ddoc.dDocModel(),
           ddocs: this.designDocs,
           viewCollection: this.collection
         }));
+
+        this.listenTo(this.viewEditorView, 'view_updated', this.updateViewOnSave);
       }
       this.collection.each(function(doc) {
         this.rows[doc.id] = this.insertView("table.all-docs tbody", new this.nestedView({
@@ -668,10 +702,9 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
     initialize: function(options) {
       this.newView = options.newView || false;
       this.ddocs = options.ddocs;
-      console.log('DDOC', this.ddocs);
       this.viewCollection = options.viewCollection;
       if (this.newView) {
-
+        //TODO: CREATE NEW HERE
       } else {
         this.reduceFunStr = this.model.viewHasReduce(this.viewCollection.view);
       } 
@@ -720,34 +753,45 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
     },
 
     saveView: function(event) {
-      var json, notification;
+      var json, notification,
+          that = this;
 
       event.preventDefault();
 
       if (this.hasValidCode()) {
         var mapVal = this.mapEditor.getValue(), 
-            reduceVal = this.reduceEditor.getValue(),
+            reduceVal = "",
             viewName = this.$('#index-name').val(),
             ddocName = this.$('#ddoc :selected').val();
 
+         var reduceOption = this.$('#reduce-function-selector :selected').val();
+
+         if (reduceOption === 'CUSTOM') {
+            reduceVal = this.reduceEditor.getValue();
+         } else if ( reduceOption !== 'NONE') {
+           reduceVal = reduceOption;
+         }
+
          var ddoc = this.ddocs.find(function (ddoc) {
            return ddoc.id === ddocName;
-         });
-         console.log('found ddoc', ddocName, ddoc);
-        /*
+         }).dDocModel();
+
         notification = FauxtonAPI.addNotification({
           msg: "Saving document.",
           selector: "#define-view .errors-container"
         });
-        */
+
         ddoc.setDdocView(viewName, mapVal, reduceVal);
-        FauxtonAPI.addNotification({
-          msg: "Save Functionality Coming Soon",
-          type: "warning",
-          selector: "#define-view .errors-container"
-        });
-        
-        ddoc.save().fail(function(xhr) {
+
+        ddoc.save().then(function () {
+          FauxtonAPI.addNotification({
+            msg: "View has been saved.",
+            type: "success",
+            selector: "#define-view .errors-container"
+          });
+
+          that.trigger('view_updated', ddoc, viewName);
+        }, function(xhr) {
           var responseText = JSON.parse(xhr.responseText).reason;
           notification = FauxtonAPI.addNotification({
             msg: "Save failed: " + responseText,
@@ -817,7 +861,6 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
 
     serialize: function() {
       return {
-        //database: this.model,
         ddocs: this.ddocs,
         ddoc: this.model,
         viewCollection: this.viewCollection,
@@ -846,7 +889,7 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
         matchBrackets: true,
         lineWrapping: true,
         onChange: function() {
-          that.runJSHint("mapEditor");
+          //that.runJSHint("mapEditor");
         },
         extraKeys: {
           "Ctrl-S": function(instance) { that.saveView(); },
@@ -859,7 +902,7 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
         matchBrackets: true,
         lineWrapping: true,
         onChange: function() {
-          that.runJSHint("reduceEditor");
+          //that.runJSHint("reduceEditor");
         },
         extraKeys: {
           "Ctrl-S": function(instance) { that.saveView(); },
@@ -946,7 +989,14 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
       }, this);
     },
 
+    afterRender: function () {
+      if (this.selectedTab) {
+        this.setSelectedTab(this.selectedTab);
+      }
+    },
+
     setSelectedTab: function (selectedTab) {
+      this.selectedTab = selectedTab;
       this.$('li').removeClass('active');
       this.$('#' + selectedTab).parent().addClass('active');
     }
@@ -959,9 +1009,7 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
     template: "templates/documents/changes",
 
     establish: function() {
-      return [
-        this.model.changes.fetch()
-      ];
+      return [ this.model.changes.fetch()];
     },
 
     serialize: function () {
@@ -973,6 +1021,6 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
 
   });
 
-
-  return Views;
+  Documents.Views = Views;
+  return Documents;
 });

http://git-wip-us.apache.org/repos/asf/couchdb/blob/4470dfa1/src/fauxton/app/templates/documents/view_editor.html
----------------------------------------------------------------------
diff --git a/src/fauxton/app/templates/documents/view_editor.html b/src/fauxton/app/templates/documents/view_editor.html
index 6fbc71a..8ee3a4a 100644
--- a/src/fauxton/app/templates/documents/view_editor.html
+++ b/src/fauxton/app/templates/documents/view_editor.html
@@ -54,12 +54,12 @@ the License.
                 <% if (newView) { %>
                   <textarea class="js-editor" id="map-function"><%= langTemplates.map %></textarea>
                 <% } else { %>
-                  <textarea class="js-editor" id="map-function"><%= ddoc.get('doc').views[viewCollection.view].map %></textarea>
+                  <textarea class="js-editor" id="map-function"><%= ddoc.get('views')[viewCollection.view].map %></textarea>
                 <% } %>
               </div>
             </div>
             <div class="control-group">
-              <label class="control-label" for="reduce-function-selector">Reduce function <a target="_couch_docs" href="http://docs.couchdb.org/en/latest/ddocs/#reduce-and-rereduce-functions"><i class="icon-question-sign"></i></a></label>
+              <label class="control-label" for="reduce-function-selector">Reduce function <a target="_couch_docs" href="http://docs.couchdb.org/en/latest/ddocs.html#reduce-and-rereduce-functions"><i class="icon-question-sign"></i></a></label>
               <div class="controls">
                 <select id="reduce-function-selector">
                   <option value="" <%= !reduceFunStr ? 'selected="selected"' : '' %>>None</option>
@@ -77,7 +77,7 @@ the License.
                 <% if (newView) { %>
                   <textarea class="js-editor" id="reduce-function"><%= langTemplates.reduce %></textarea>
                 <% } else { %>
-                  <textarea class="js-editor" id="reduce-function"><%= ddoc.get('doc').views[viewCollection.view].reduce %></textarea>
+                  <textarea class="js-editor" id="reduce-function"><%= ddoc.get('views')[viewCollection.view].reduce %></textarea>
                 <% } %>
               </div>
             </div>