From 3f7ae250c715f546d07d4bd6b6c5ffb5cbb808f9 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 16 Jul 2015 00:06:05 -0700 Subject: [PATCH] AsPageableMixin to make backbone.pageable to stay on same page during fetch Closes #670 --- src/UI/Activity/Queue/QueueCollection.js | 4 ++- src/UI/Mixins/AsPageableCollection.js | 45 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/UI/Mixins/AsPageableCollection.js diff --git a/src/UI/Activity/Queue/QueueCollection.js b/src/UI/Activity/Queue/QueueCollection.js index 068e09f1e..d53eb511a 100644 --- a/src/UI/Activity/Queue/QueueCollection.js +++ b/src/UI/Activity/Queue/QueueCollection.js @@ -1,8 +1,10 @@ var _ = require('underscore'); var PageableCollection = require('backbone.pageable'); +//var PageableCollection = require('../../Shared/Grid/SonarrPageableCollection'); var QueueModel = require('./QueueModel'); var FormatHelpers = require('../../Shared/FormatHelpers'); var AsSortedCollection = require('../../Mixins/AsSortedCollection'); +var AsPageableCollection = require('../../Mixins/AsPageableCollection'); var moment = require('moment'); require('../../Mixins/backbone.signalr.mixin'); @@ -64,9 +66,9 @@ var QueueCollection = PageableCollection.extend({ }); QueueCollection = AsSortedCollection.call(QueueCollection); +QueueCollection = AsPageableCollection.call(QueueCollection); var collection = new QueueCollection().bindSignalR(); collection.fetch(); - module.exports = collection; \ No newline at end of file diff --git a/src/UI/Mixins/AsPageableCollection.js b/src/UI/Mixins/AsPageableCollection.js new file mode 100644 index 000000000..fea44968b --- /dev/null +++ b/src/UI/Mixins/AsPageableCollection.js @@ -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; +};