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 2014/03/03 17:58:43 UTC
[31/34] couchdb commit: updated refs/heads/paginate-api-options to
b63c791
Improvements around parameter parsing
Project: http://git-wip-us.apache.org/repos/asf/couchdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb/commit/8a27510e
Tree: http://git-wip-us.apache.org/repos/asf/couchdb/tree/8a27510e
Diff: http://git-wip-us.apache.org/repos/asf/couchdb/diff/8a27510e
Branch: refs/heads/paginate-api-options
Commit: 8a27510e0ca8b3a9964df1232697a231c4d799af
Parents: 0901b9b
Author: Garren Smith <ga...@gmail.com>
Authored: Fri Feb 21 15:50:24 2014 +0200
Committer: Garren Smith <ga...@gmail.com>
Committed: Mon Mar 3 11:18:43 2014 +0200
----------------------------------------------------------------------
src/fauxton/app/addons/documents/resources.js | 34 +++++++++-------------
src/fauxton/app/addons/documents/routes.js | 23 +++++++++++++--
src/fauxton/app/addons/documents/views.js | 9 +++++-
src/fauxton/app/addons/fauxton/components.js | 18 ++++++++----
4 files changed, 54 insertions(+), 30 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/couchdb/blob/8a27510e/src/fauxton/app/addons/documents/resources.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/documents/resources.js b/src/fauxton/app/addons/documents/resources.js
index 69c9e1a..fd1a558 100644
--- a/src/fauxton/app/addons/documents/resources.js
+++ b/src/fauxton/app/addons/documents/resources.js
@@ -26,22 +26,21 @@ function(app, FauxtonAPI) {
key;
if (currentParams.keys) {
- throw "Cannot paginate _all_docs with keys";
+ throw "Cannot paginate when keys is specfied";
}
if (_.isUndefined(doc)) {
throw "Require docs to paginate";
}
- var params = _.reduce(['reduce', 'keys', 'key', 'endkey', 'descending', 'inclusive_end'], function (params, key) {
- if (_.has(currentParams, key)) {
- params[key] = currentParams[key];
- }
- return params;
- }, defaultParams);
+
+ // defaultParams should always override the user-specified parameters
+ _.extend(currentParams, defaultParams);
lastId = doc.id || doc._id;
+ // If we are paginating on a view, we need to set a ``key`` and a ``docId``
+ // and expect that they are different values.
if (isView) {
key = doc.key;
docId = lastId;
@@ -49,29 +48,24 @@ function(app, FauxtonAPI) {
docId = key = lastId;
}
- if (isView && !currentParams.keys) {
- params.startkey_docid = docId;
- params.startkey = key;
+ // Set parameters to paginate
+ if (isView) {
+ currentParams.startkey_docid = docId;
+ currentParams.startkey = key;
} else if (currentParams.startkey) {
- params.startkey = key;
+ currentParams.startkey = key;
} else {
- params.startkey_docid = docId;
+ currentParams.startkey_docid = docId;
}
- _.each(['startkey', 'endkey', 'key'], function (key) {
- if (_.has(params, key)) {
- params[key] = JSON.stringify(params[key]);
- }
- });
-
- return params;
+ return currentParams;
},
next: function (docs, currentParams, perPage, _isAllDocs) {
var params = {limit: perPage, skip: 1},
doc = _.last(docs);
- return this.calculate(doc, params, currentParams, _isAllDocs);
+ return this.calculate(doc, params, currentParams, _isAllDocs);
},
previous: function (docs, currentParams, perPage, _isAllDocs) {
http://git-wip-us.apache.org/repos/asf/couchdb/blob/8a27510e/src/fauxton/app/addons/documents/routes.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/documents/routes.js b/src/fauxton/app/addons/documents/routes.js
index ffe0b87..2d2b24b 100644
--- a/src/fauxton/app/addons/documents/routes.js
+++ b/src/fauxton/app/addons/documents/routes.js
@@ -375,34 +375,51 @@ function(app, FauxtonAPI, Documents, Databases) {
},
perPageChange: function (perPage) {
- console.log('pp', perPage);
this.perPage = perPage;
- this.documentsView.collection.updateLimit(perPage);
+ this.documentsView.updatePerPage(perPage);
this.documentsView.forceRender();
},
paginate: function (options) {
var params = {},
urlParams = app.getParams(),
+ currentPage = options.currentPage,
collection = this.documentsView.collection;
this.documentsView.forceRender();
var rawCollection = collection.map(function (item) { return item.toJSON(); });
+ collection.reverse = false;
+
+ _.each(collection.params, function (val, key) {
+ collection.params[key] = JSON.parse(val);
+ });
+
+ _.each(urlParams, function (val, key) {
+ urlParams[key] = JSON.parse(val);
+ });
+
if (options.direction === 'next') {
- collection.reverse = false;
params = Documents.paginate.next(rawCollection,
collection.params,
options.perPage,
!!collection.isAllDocs);
} else {
+ if (currentPage <= 1) {
+ params = _.clone(urlParams);
+ params.limit = collection.params.limit;
+ } else {
collection.reverse = true;
params = Documents.paginate.previous(rawCollection,
collection.params,
options.perPage,
!!collection.isAllDocs);
+ }
}
params.limit = options.perPage;
+ _.each(params, function (val, key) {
+ params[key] = JSON.stringify(val);
+ });
collection.updateParams(params);
},
http://git-wip-us.apache.org/repos/asf/couchdb/blob/8a27510e/src/fauxton/app/addons/documents/views.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/documents/views.js b/src/fauxton/app/addons/documents/views.js
index f80d07e..f222b93 100644
--- a/src/fauxton/app/addons/documents/views.js
+++ b/src/fauxton/app/addons/documents/views.js
@@ -439,7 +439,6 @@ function(app, FauxtonAPI, Components, Documents, Databases, pouchdb, resizeColum
serialize: function () {
var totalRows = 0,
updateSeq = false,
- recordStart = 0,
pageStart = 0,
pageEnd = 20;
@@ -738,6 +737,14 @@ function(app, FauxtonAPI, Components, Documents, Databases, pouchdb, resizeColum
perPage: function () {
return this.allDocsNumber.perPage();
+ },
+
+ updatePerPage: function (newPerPage) {
+ if (this.collection.reverse) {
+ delete this.collection.params.descending
+ this.collection.reverse = false;
+ }
+ this.collection.updateLimit(newPerPage);
}
});
http://git-wip-us.apache.org/repos/asf/couchdb/blob/8a27510e/src/fauxton/app/addons/fauxton/components.js
----------------------------------------------------------------------
diff --git a/src/fauxton/app/addons/fauxton/components.js b/src/fauxton/app/addons/fauxton/components.js
index 278831e..01ee4a9 100644
--- a/src/fauxton/app/addons/fauxton/components.js
+++ b/src/fauxton/app/addons/fauxton/components.js
@@ -80,6 +80,7 @@ function(app, FauxtonAPI, ace, spin) {
this._pageNumber = [];
this._pageStart = 1;
this.enabled = true;
+ this.currentPage = 1;
},
canShowPreviousfn: function () {
@@ -119,6 +120,7 @@ function(app, FauxtonAPI, ace, spin) {
FauxtonAPI.triggerRouteEvent('paginate', {
direction: 'previous',
perPage: this.perPage,
+ currentPage: this.currentPage
});
},
@@ -142,7 +144,8 @@ function(app, FauxtonAPI, ace, spin) {
FauxtonAPI.triggerRouteEvent('paginate', {
direction: 'next',
- perPage: this.documentsLeftToFetch()
+ perPage: this.documentsLeftToFetch(),
+ currentPage: this.currentPage
});
},
@@ -154,8 +157,10 @@ function(app, FauxtonAPI, ace, spin) {
};
},
- updatePerPage: function (perPage) {
- this.perPage = perPage;
+ updatePerPage: function (newPerPage) {
+ var docsView = this.page() + newPerPage;
+ this.currentPage = Math.ceil(docsView / newPerPage);
+ this.perPage = newPerPage;
},
page: function () {
@@ -163,6 +168,7 @@ function(app, FauxtonAPI, ace, spin) {
},
incPageNumber: function () {
+ this.currentPage = this.currentPage + 1;
this._pageNumber.push({perPage: this.perPage});
this._pageStart = this._pageStart + this.perPage;
},
@@ -174,11 +180,11 @@ function(app, FauxtonAPI, ace, spin) {
},
decPageNumber: function () {
+ this.currentPage = this.currentPage - 1;
this._pageNumber.pop();
var val = this._pageStart - this.perPage;
if (val < 1) {
- this._pageStart = 1;
- return;
+ val = 1;
}
this._pageStart = val;
@@ -203,7 +209,7 @@ function(app, FauxtonAPI, ace, spin) {
setCollection: function (collection) {
this.collection = collection;
this.setDefaults();
- }
+ },
});