From 93f0dcae78b5a3f74af440f6de109364d738f92e Mon Sep 17 00:00:00 2001 From: kielni Date: Thu, 6 Feb 2014 13:48:30 -0800 Subject: [PATCH] pager: changing from: value updates to: but keeps size; changing to: value updates size and from: --- src/widget.pager.js | 19 +++++++++++------- test/widget.pager.test.js | 42 +++++++++++++++++++++++++++++++++------ 2 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/widget.pager.js b/src/widget.pager.js index 05e79237..fa112f4a 100644 --- a/src/widget.pager.js +++ b/src/widget.pager.js @@ -30,11 +30,16 @@ my.Pager = Backbone.View.extend({ }, onFormSubmit: function(e) { e.preventDefault(); - var newFrom = parseInt(this.$el.find('input[name="from"]').val()); - newFrom = Math.min(this.model.recordCount, Math.max(newFrom, 1))-1; - var newSize = parseInt(this.$el.find('input[name="to"]').val()) - newFrom; - newSize = Math.min(Math.max(newSize, 1), this.model.recordCount); - this.model.queryState.set({size: newSize, from: newFrom}); + // filter is 0-based; form is 1-based + var formFrom = parseInt(this.$el.find('input[name="from"]').val())-1; + var formTo = parseInt(this.$el.find('input[name="to"]').val())-1; + var maxRecord = this.model.recordCount-1; + if (this.model.queryState.get('from') != formFrom) { // changed from; update from + this.model.queryState.set({from: Math.min(maxRecord, Math.max(formFrom, 0))}); + } else if (this.model.queryState.get('to') != formTo) { // change to; update size + var to = Math.min(maxRecord, Math.max(formTo, 0)); + this.model.queryState.set({size: Math.min(maxRecord+1, Math.max(to-formFrom+1, 1))}); + } }, onPaginationUpdate: function(e) { e.preventDefault(); @@ -44,10 +49,10 @@ my.Pager = Backbone.View.extend({ var size = this.model.queryState.get('size'); var updateQuery = false; if ($el.parent().hasClass('prev')) { - newFrom = Math.max(currFrom - Math.max(0, size), 1)-1; + newFrom = Math.max(currFrom - Math.max(0, size), 0); updateQuery = newFrom != currFrom; } else { - newFrom = Math.max(currFrom + size, 1); + newFrom = Math.max(currFrom + size, 0); updateQuery = (newFrom < this.model.recordCount); } if (updateQuery) { diff --git a/test/widget.pager.test.js b/test/widget.pager.test.js index 4274fede..03f967b5 100644 --- a/test/widget.pager.test.js +++ b/test/widget.pager.test.js @@ -42,6 +42,37 @@ test('basics', function () { view.remove(); }); +test('change inputs', function () { + var dataset = Fixture.getDataset(); + var size = parseInt(dataset.recordCount/3); + dataset.queryState.set({ size : size }, { silent : true }); + var view = new recline.View.Pager({ + model: dataset + }); + $('.fixtures').append(view.el); + var toSelector = 'input[name=to]'; + var fromSelector = 'input[name=from]'; + + // change from: update to, keep size + var fromVal = size; + $(fromSelector).val(fromVal).change(); + equal($(fromSelector).val(), fromVal); + // UI is 1-based but model is zero-based + equal(dataset.queryState.get('from'), fromVal-1); + equal($(toSelector).val(), fromVal+(size-1)); + + // change to: update from, change size + var toVal = dataset.recordCount; + $(toSelector).val(toVal).change(); + equal($(toSelector).val(), toVal); + equal($(fromSelector).val(), fromVal); + // UI is 1-based but model is zero-based + equal(dataset.queryState.get('from'), fromVal-1); + notEqual(dataset.queryState.get('size'), size); + + view.remove(); +}); + test('bounds checking', function () { var dataset = Fixture.getDataset(); var size = dataset.recordCount/2 + 1; @@ -62,10 +93,9 @@ test('bounds checking', function () { // enter size-1 in from: reloads size-1 - size var fromVal = size-1; - var toVal = parseInt($(toSelector).val()); $(fromSelector).val(fromVal).change(); equal($(fromSelector).val(), fromVal); - equal($(toSelector).val(), toVal); + equal($(toSelector).val(), fromVal+(size-1)); // UI is 1-based but model is zero-based equal(dataset.queryState.get('from'), fromVal-1); @@ -80,17 +110,17 @@ test('bounds checking', function () { // click next on end -> nothing happens var queryCalls = querySpy.callCount; fromVal = parseInt($(fromSelector).val()); - toVal = parseInt($(toSelector).val()); + var toVal = parseInt($(toSelector).val()); view.$el.find('.next a').click(); equal(querySpy.callCount, queryCalls); equal($(fromSelector).val(), fromVal); equal($(toSelector).val(), toVal); - // reset from to 1 - // type value past the end in to: 1-recordCount + // reset from=1 fromVal = 1; + $(fromSelector).val(fromVal).change(); + // type value past the end in to: 1-recordCount toVal = dataset.recordCount + 10; - $(fromSelector).val(fromVal); $(toSelector).val(toVal).change(); equal($(fromSelector).val(), 1); equal($(toSelector).val(), dataset.recordCount);