add changes feed to database

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

Branch: refs/heads/fauxton
Commit: 6001be116437a65e0c39c3bae0dd302816ddabf5
Parents: 2c48183
Author: Garren Smith <garren.sm...@gmail.com>
Authored: Tue Feb 5 14:56:58 2013 +0200
Committer: Garren Smith <garren.sm...@gmail.com>
Committed: Tue Feb 5 14:56:58 2013 +0200

----------------------------------------------------------------------
 src/fauxton/TODO.md                                |    2 +-
 src/fauxton/app/modules/databases/resources.js     |   31 +++++++
 src/fauxton/app/modules/documents/routes.js        |   69 +++++++++++----
 src/fauxton/app/modules/documents/views.js         |   34 +++++++
 src/fauxton/app/templates/documents/changes.html   |   16 ++++
 src/fauxton/app/templates/documents/tabs.html      |    3 +-
 src/fauxton/app/templates/layouts/with_tabs.html   |   13 +++
 .../app/templates/layouts/with_tabs_sidebar.html   |    2 +-
 8 files changed, 150 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb/blob/6001be11/src/fauxton/TODO.md
----------------------------------------------------------------------
diff --git a/src/fauxton/TODO.md b/src/fauxton/TODO.md
index 31127e0..b929e05 100644
--- a/src/fauxton/TODO.md
+++ b/src/fauxton/TODO.md
@@ -11,7 +11,7 @@ In no particular order
 - [ ] show design docs only
 - [ ] fix delete doc button UI bug
 - [ ] delete multiple docs via _bulk_docs
-- [ ] show change events in database view
+- [x] show change events in database view
 - [ ] pouchdb addon
 - [ ] bespoke bootstrap style
 - [ ] responsive interface

http://git-wip-us.apache.org/repos/asf/couchdb/blob/6001be11/src/fauxton/app/modules/databases/resources.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/modules/databases/resources.js 
b/src/fauxton/app/modules/databases/resources.js
index 76f8c6e..73af4f7 100644
--- a/src/fauxton/app/modules/databases/resources.js
+++ b/src/fauxton/app/modules/databases/resources.js
@@ -39,6 +39,37 @@ function(app, FauxtonAPI, Documents) {
       } else {
         return app.host + "/" + this.id;
       }
+    },
+
+    buildChanges: function (params) {
+      this.changes = new Databases.Changes({
+        database: this,
+        params: params
+      });
+
+      return this.changes;
+    }
+  });
+
+  Databases.Changes = Backbone.Collection.extend({
+
+    initialize: function(options) {
+      this.database = options.database;
+      this.params = options.params;
+    },
+
+    url: function () {
+      var query = "";
+      if (this.params) {
+        query = "?" + $.param(this.params);
+      }
+
+      return app.host + '/' + this.database.id + '/_changes' + query;
+    },
+
+    parse: function (resp) {
+      this.last_seq = resp.last_seq;
+      return resp.results;
     }
   });
 

http://git-wip-us.apache.org/repos/asf/couchdb/blob/6001be11/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 d851caf..dfa208f 100644
--- a/src/fauxton/app/modules/documents/routes.js
+++ b/src/fauxton/app/modules/documents/routes.js
@@ -1,11 +1,11 @@
 define([
-  "app",
+       "app",
 
-  "api",
+       "api",
 
-  // Modules
-  "modules/documents/resources",
-  "modules/databases/base"
+       // Modules
+       "modules/documents/resources",
+       "modules/databases/base"
 ],
 
 function(app, FauxtonAPI, Documents, Databases) {
@@ -25,8 +25,8 @@ function(app, FauxtonAPI, Documents, Databases) {
     data.designDocs = new Documents.AllDocs(null, {
       database: data.database,
       params: {startkey: '"_design"',
-               endkey: '"_design1"',
-               include_docs: true}
+        endkey: '"_design1"',
+        include_docs: true}
     });
 
     var options = app.getParams();
@@ -73,8 +73,8 @@ function(app, FauxtonAPI, Documents, Databases) {
     data.designDocs = new Documents.AllDocs(null, {
       database: data.database,
       params: {startkey: '"_design"',
-               endkey: '"_design1"',
-               include_docs: true}
+        endkey: '"_design1"',
+        include_docs: true}
     });
 
     var options = app.getParams();
@@ -120,8 +120,8 @@ function(app, FauxtonAPI, Documents, Databases) {
       data.designDocs = new Documents.AllDocs(null, {
         database: data.database,
         params: {startkey: '"_design"',
-                 endkey: '"_design1"',
-                 include_docs: true}
+          endkey: '"_design1"',
+          include_docs: true}
       });
 
       var options = app.getParams();
@@ -182,8 +182,8 @@ function(app, FauxtonAPI, Documents, Databases) {
       data.designDocs = new Documents.AllDocs(null, {
         database: data.database,
         params: {startkey: '"_design"',
-                 endkey: '"_design1"',
-                 include_docs: true}
+          endkey: '"_design1"',
+          include_docs: true}
       });
 
       var options = app.getParams();
@@ -222,8 +222,8 @@ function(app, FauxtonAPI, Documents, Databases) {
       data.designDocs = new Documents.AllDocs(null, {
         database: data.database,
         params: {startkey: '"_design"',
-                 endkey: '"_design1"',
-                 include_docs: true}
+          endkey: '"_design1"',
+          include_docs: true}
       });
 
       var options = app.getParams();
@@ -259,6 +259,41 @@ function(app, FauxtonAPI, Documents, Databases) {
       };
     },
 
+    "database/:database/_changes(:params)": function(databaseName, params) {
+      var data = {
+        database: new Databases.Model({id:databaseName})
+      };
+
+      var options = app.getParams();
+      data.database.buildChanges(options);
+
+      return {
+        layout: "with_tabs",
+
+        data: data,
+
+        crumbs: [
+          {"name": "Databases", "link": "/_all_dbs"},
+          {"name": data.database.id, "link": 
Databases.databaseUrl(data.database)},
+          {"name": "_changes", "link": "/_changes"}
+        ],
+
+        views: {
+          "#dashboard-content": new Documents.Views.Changes({
+            collection: data.database.changes
+          }),
+
+          "#tabs": new Documents.Views.Tabs({
+            collection: data.designDocs,
+            database: data.database,
+            active_id: 'changes'
+          })
+        },
+
+        apiUrl: data.database.changes.url()
+      };
+    },
+
     "database/:database/new": newDocCodeEditorCallback,
 
     // TODO: fix optional search params
@@ -283,8 +318,8 @@ function(app, FauxtonAPI, Documents, Databases) {
       data.designDocs = new Documents.AllDocs(null, {
         database: data.database,
         params: {startkey: '"_design"',
-                 endkey: '"_design1"',
-                 include_docs: true}
+          endkey: '"_design1"',
+          include_docs: true}
       });
 
       var ddocInfo = {

http://git-wip-us.apache.org/repos/asf/couchdb/blob/6001be11/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 556a5cf..0d6eb7e 100644
--- a/src/fauxton/app/modules/documents/views.js
+++ b/src/fauxton/app/modules/documents/views.js
@@ -20,12 +20,21 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
     initialize: function(options){
       this.collection = options.collection;
       this.database = options.database;
+      this.active_id = options.active_id;
     },
 
     events: {
       "click #delete-database": "delete_database"
     },
 
+    serialize: function () {
+      return {
+        // TODO make this not hard coded here
+        changes_url: '#database/'+ this.database.id + 
'/_changes?descending=true&limit=100',
+        db_url: '#database/'+ this.database.id + '/_all_docs?limit=100'
+      };
+    },
+
     beforeRender: function(manage) {
       this.insertView("#search", new Views.SearchBox({
         collection: this.collection,
@@ -33,6 +42,13 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
       }));
     },
 
+    afterRender: function () {
+      if (this.active_id) {
+        this.$('.active').removeClass('active');
+        this.$('#'+this.active_id).addClass('active');
+      }
+    },
+
     delete_database: function (event) {
       event.preventDefault();
 
@@ -662,5 +678,23 @@ function(app, FauxtonAPI, Codemirror, JSHint) {
 
   Views.Indexed = FauxtonAPI.View.extend({});
 
+  Views.Changes = FauxtonAPI.View.extend({
+    template: "templates/documents/changes",
+
+    establish: function() {
+      return [
+        this.collection.fetch()
+      ];
+    },
+
+    serialize: function () {
+      return {
+        changes: this.collection.toJSON()
+      };
+    }
+
+  });
+
+
   return Views;
 });

http://git-wip-us.apache.org/repos/asf/couchdb/blob/6001be11/src/fauxton/app/templates/documents/changes.html
----------------------------------------------------------------------
diff --git a/src/fauxton/app/templates/documents/changes.html 
b/src/fauxton/app/templates/documents/changes.html
new file mode 100644
index 0000000..9cdb30a
--- /dev/null
+++ b/src/fauxton/app/templates/documents/changes.html
@@ -0,0 +1,16 @@
+<table class="table">
+  <thead>
+    <th> seq </th>
+    <th> id </th>
+    <th changes </th>
+  </thead>
+  <tbody>
+  <% _.each(changes, function (change) { %>
+  <tr>
+    <td> <%= change.seq %> </td>
+    <td> <%= change.id %> </td>
+    <td> <%= JSON.stringify(change.changes) %> </td>
+  </tr>
+  <% }); %>
+  </tbody>
+</table>

http://git-wip-us.apache.org/repos/asf/couchdb/blob/6001be11/src/fauxton/app/templates/documents/tabs.html
----------------------------------------------------------------------
diff --git a/src/fauxton/app/templates/documents/tabs.html 
b/src/fauxton/app/templates/documents/tabs.html
index d0231e0..f302019 100644
--- a/src/fauxton/app/templates/documents/tabs.html
+++ b/src/fauxton/app/templates/documents/tabs.html
@@ -1,7 +1,8 @@
 <ul class="nav nav-tabs">
-  <li class="active"><a href="#">Docs</a></li>
+  <li class="active"><a href="<%= db_url %>">Docs</a></li>
   <li><a href="#">Permissions</a></li>
   <li><a href="#">Stats</a></li>
+  <li id="changes"><a  href="<%= changes_url %>">Changes</a></li>
   <div id="search" class="navbar-search span4 nav pull-right input-prepend" 
style="height:20px;"></div>
   <!-- TODO: put this styling into less -->
   <ul class="nav pull-right" style="margin:5px 10px 0px 10px;">

http://git-wip-us.apache.org/repos/asf/couchdb/blob/6001be11/src/fauxton/app/templates/layouts/with_tabs.html
----------------------------------------------------------------------
diff --git a/src/fauxton/app/templates/layouts/with_tabs.html 
b/src/fauxton/app/templates/layouts/with_tabs.html
new file mode 100644
index 0000000..f9c289a
--- /dev/null
+++ b/src/fauxton/app/templates/layouts/with_tabs.html
@@ -0,0 +1,13 @@
+<div id="primary-navbar"></div>
+<div id="dashboard" class="container">
+
+<div class="row-fluid">
+  <div id="breadcrumbs" class="row-fluid"></div>
+  <div id="tabs" class="row-fluid"></div>
+
+  <div class="row-fluid">
+    <div id="dashboard-content" class="list span12"></div>
+  </div>
+</div>
+
+<div id="api-navbar"></div>

http://git-wip-us.apache.org/repos/asf/couchdb/blob/6001be11/src/fauxton/app/templates/layouts/with_tabs_sidebar.html
----------------------------------------------------------------------
diff --git a/src/fauxton/app/templates/layouts/with_tabs_sidebar.html 
b/src/fauxton/app/templates/layouts/with_tabs_sidebar.html
index 7e90427..e6ba655 100644
--- a/src/fauxton/app/templates/layouts/with_tabs_sidebar.html
+++ b/src/fauxton/app/templates/layouts/with_tabs_sidebar.html
@@ -11,4 +11,4 @@
   </div>
 </div>
 
-<div id="api-navbar"></div>
\ No newline at end of file
+<div id="api-navbar"></div>

Reply via email to