diff --git a/src/model.js b/src/model.js index 5649b1d8..c18aa2fb 100644 --- a/src/model.js +++ b/src/model.js @@ -510,6 +510,23 @@ my.Query = Backbone.Model.extend({ filters.push(ourfilter); this.trigger('change:filters:new-blank'); }, + replaceFilter: function(filter) { + // delete filter on the same field, then add + var filters = this.get('filters'); + var idx = -1; + _.each(this.get('filters'), function(filter, key, list) { + if (filter.field == filter.field) { + idx = key; + } + }); + // trigger just one event (change:filters:new-blank) instead of one for remove and + // one for add + if (idx >= 0) { + filters.splice(idx, 1); + this.set({filters: filters}); + } + this.addFilter(filter); + }, updateFilter: function(index, value) { }, // ### removeFilter diff --git a/test/model.test.js b/test/model.test.js index 00797ef0..506ef2bd 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -374,4 +374,24 @@ test('Query.addFilter', function () { deepEqual(exp, query.get('filters')[2]); }); +test('Query.replaceFilter', function () { + var query = new recline.Model.Query(); + query.addFilter({type: 'term', field: 'xyz'}); + var exp = { + field: 'xyz', + type: 'term', + term: '' + }; + deepEqual(query.get('filters')[0], exp); + + query.replaceFilter({type: 'term', field: 'abc'}); + exp = { + field: 'abc', + type: 'term', + term: '' + }; + deepEqual(query.get('filters')[0], exp); + +}); + })(this.jQuery);