diff --git a/src/model.js b/src/model.js index bd6b3799..84d0b14f 100644 --- a/src/model.js +++ b/src/model.js @@ -495,7 +495,11 @@ my.Query = Backbone.Model.extend({ var ourfilter = JSON.parse(JSON.stringify(filter)); // not fully specified so use template and over-write if (_.keys(filter).length <= 3) { - ourfilter = _.extend(this._filterTemplates[filter.type], ourfilter); + ourfilter = _.extend( + // crude deep copy + JSON.parse(JSON.stringify(this._filterTemplates[filter.type])), + ourfilter + ); } var filters = this.get('filters'); filters.push(ourfilter); diff --git a/test/model.test.js b/test/model.test.js index e6fb843a..8f7dd909 100644 --- a/test/model.test.js +++ b/test/model.test.js @@ -320,6 +320,9 @@ test('Query.addFilter', function () { }; deepEqual(query.get('filters')[0], exp); + query.addFilter({type: 'term', field: 'abc'}); + deepEqual(query.get('filters')[0], exp); + query.addFilter({type: 'geo_distance', field: 'xyz'}); var exp = { distance: 10, @@ -331,7 +334,7 @@ test('Query.addFilter', function () { field: 'xyz', type: 'geo_distance' }; - deepEqual(exp, query.get('filters')[1]); + deepEqual(exp, query.get('filters')[2]); }); })(this.jQuery); diff --git a/test/widget.filtereditor.test.js b/test/widget.filtereditor.test.js index 3df630ff..c1acbbff 100644 --- a/test/widget.filtereditor.test.js +++ b/test/widget.filtereditor.test.js @@ -40,6 +40,7 @@ test('basics', function () { $editForm.find('.filter-range input').first().val('2'); $editForm.find('.filter-range input').last().val('4'); $editForm.submit(); + equal(dataset.queryState.attributes.filters[0].term, 'UK'); equal(dataset.queryState.attributes.filters[1].start, 2); equal(dataset.records.length, 2); @@ -59,6 +60,33 @@ test('basics', function () { view.remove(); }); +test('add 2 filters of same type', function () { + var dataset = Fixture.getDataset(); + var view = new recline.View.FilterEditor({ + model: dataset + }); + $('.fixtures').append(view.el); + + // add 2 term filters + var $addForm = view.el.find('form.js-add'); + view.el.find('.js-add-filter').click(); + $addForm.find('select.fields').val('country'); + $addForm.submit(); + + var $addForm = view.el.find('form.js-add'); + view.el.find('.js-add-filter').click(); + $addForm.find('select.fields').val('id'); + $addForm.submit(); + + var fields = []; + view.el.find('form.js-edit .filter-term input').each(function(idx, item) { + fields.push($(item).attr('data-filter-field')); + }); + deepEqual(fields, ['country', 'id']); + + view.remove(); +}); + test('geo_distance', function () { var dataset = Fixture.getDataset(); var view = new recline.View.FilterEditor({