diff --git a/README.md b/README.md index aea8464b..3791de5b 100755 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ Possible breaking changes * Require new underscore.deferred vendor library for all use (jQuery no longer required if just using recline.dataset.js) * View.el is now the raw DOM element. If you want a jQuery-wrapped version, use view.$el. #350 * Upgraded timelinejs lib - #316 +* Pager widget now takes Dataset object rather than QueryState object #386 ### v0.5 - July 5th 2012 (first public release) diff --git a/dist/recline.js b/dist/recline.js index c24de482..a89f3e19 100644 --- a/dist/recline.js +++ b/dist/recline.js @@ -3674,14 +3674,16 @@ my.SlickGrid = Backbone.View.extend({ model.set(v); }); this._slickHandler.subscribe(this.grid.onClick,function(e, args){ + //try catch , because this fail in qunit , but no + //error on browser. + try{e.preventDefault()}catch(e){} if (args.cell == 0 && self.state.get("gridOptions").enabledDelRow == true){ // We need to delete the associated model var model = data.getModel(args.row); model.destroy() } - }) ; - - var columnpicker = new Slick.Controls.ColumnPicker(columns, this.grid, + }) ; + var columnpicker = new Slick.Controls.ColumnPicker(columns, this.grid, _.extend(options,{state:this.state})); if (self.visible){ @@ -4408,11 +4410,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(); @@ -4422,10 +4429,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/src/view.slickgrid.js b/src/view.slickgrid.js index cd4f3ce1..e1c83cc5 100644 --- a/src/view.slickgrid.js +++ b/src/view.slickgrid.js @@ -313,14 +313,16 @@ my.SlickGrid = Backbone.View.extend({ model.set(v); }); this._slickHandler.subscribe(this.grid.onClick,function(e, args){ + //try catch , because this fail in qunit , but no + //error on browser. + try{e.preventDefault()}catch(e){} if (args.cell == 0 && self.state.get("gridOptions").enabledDelRow == true){ // We need to delete the associated model var model = data.getModel(args.row); model.destroy() } - }) ; - - var columnpicker = new Slick.Controls.ColumnPicker(columns, this.grid, + }) ; + var columnpicker = new Slick.Controls.ColumnPicker(columns, this.grid, _.extend(options,{state:this.state})); if (self.visible){ 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);