AsPageableMixin to make backbone.pageable to stay on same page during fetch

Closes #670
This commit is contained in:
Mark McDowall 2015-07-16 00:06:05 -07:00
parent 645c9c25d1
commit 3f7ae250c7
2 changed files with 48 additions and 1 deletions

View File

@ -1,8 +1,10 @@
var _ = require('underscore'); var _ = require('underscore');
var PageableCollection = require('backbone.pageable'); var PageableCollection = require('backbone.pageable');
//var PageableCollection = require('../../Shared/Grid/SonarrPageableCollection');
var QueueModel = require('./QueueModel'); var QueueModel = require('./QueueModel');
var FormatHelpers = require('../../Shared/FormatHelpers'); var FormatHelpers = require('../../Shared/FormatHelpers');
var AsSortedCollection = require('../../Mixins/AsSortedCollection'); var AsSortedCollection = require('../../Mixins/AsSortedCollection');
var AsPageableCollection = require('../../Mixins/AsPageableCollection');
var moment = require('moment'); var moment = require('moment');
require('../../Mixins/backbone.signalr.mixin'); require('../../Mixins/backbone.signalr.mixin');
@ -64,9 +66,9 @@ var QueueCollection = PageableCollection.extend({
}); });
QueueCollection = AsSortedCollection.call(QueueCollection); QueueCollection = AsSortedCollection.call(QueueCollection);
QueueCollection = AsPageableCollection.call(QueueCollection);
var collection = new QueueCollection().bindSignalR(); var collection = new QueueCollection().bindSignalR();
collection.fetch(); collection.fetch();
module.exports = collection; module.exports = collection;

View File

@ -0,0 +1,45 @@
var _ = require('underscore');
module.exports = function() {
var originalMakeCollectionEventHandler = this.prototype._makeCollectionEventHandler;
this.prototype._makeCollectionEventHandler = function (pageCollection, fullCollection) {
var self = this;
this.pageCollection = pageCollection;
this.fullCollection = fullCollection;
var eventHandler = originalMakeCollectionEventHandler.apply(this, arguments);
return _.wrap(eventHandler, _.bind(self._resetEventHandler, self));
};
this.prototype._resetEventHandler = function (originalEventHandler, event, model, collection, options) {
if (event === 'reset') {
var currentPage = this.state.currentPage;
var pageSize = this.state.pageSize;
originalEventHandler.apply(this, [].slice.call(arguments, 1));
var totalPages = Math.ceil(this.state.totalRecords / pageSize);
var newPage = Math.min(currentPage, totalPages);
if (newPage !== this.state.currentPage) {
this.state.currentPage = newPage;
// If backbone pageable fixes their reset bug
// (they reset the page number, but not the range),
// we'll want to do this for all resets where the page number changed
if (currentPage !== newPage) {
var pageStart = (newPage - 1) * pageSize;
var pageEnd = pageStart + pageSize;
this.pageCollection.reset(this.fullCollection.models.slice(pageStart, pageEnd),
_.extend({}, options, { parse : false }));
}
}
} else {
originalEventHandler.call(this, [].slice.call(arguments, 1));
}
};
return this;
};