diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index f67c99cbf8b..65df912bdb0 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -697,7 +697,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea return filter.user_id && filter.is_default; }); if (personal_filter) { - this.custom_filters.enable_filter(personal_filter, true); + this.custom_filters.toggle_filter(personal_filter, true); return; } @@ -705,7 +705,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea return !filter.user_id && filter.is_default; }); if (global_filter) { - this.custom_filters.enable_filter(global_filter, true); + this.custom_filters.toggle_filter(global_filter, true); return; } } @@ -1598,6 +1598,7 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({ get_groupby: function () { return [filter.context]; }, get_domain: function () { return filter.domain; } }, + id: filter['id'], is_custom_filter: true, values: [{label: filter.name, value: null}] }; @@ -1639,10 +1640,18 @@ instance.web.search.CustomFilters = instance.web.search.Input.extend({ } $filter.unbind('click').click(function () { - self.enable_filter(filter); + self.toggle_filter(filter); }); }, - enable_filter: function (filter, preventSearch) { + toggle_filter: function (filter, preventSearch) { + var current = this.view.query.find(function (facet) { + return facet.get('id') === filter.id; + }); + if (current) { + this.view.query.remove(current); + this.$filters[this.key_for(filter)].removeClass('oe_selected'); + return; + } this.view.query.reset([this.facet_for(filter)], { preventSearch: preventSearch || false}); this.$filters[this.key_for(filter)].addClass('oe_selected'); diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js index 5f177c0a363..292954b1992 100644 --- a/addons/web/static/test/search.js +++ b/addons/web/static/test/search.js @@ -1038,6 +1038,44 @@ openerp.testing.section('saved_filters', { "should not be checked anymore"); }); }); + test('toggling', {asserts: 2}, function (instance, $fix, mock) { + var view = makeSearchView(instance); + mock('ir.filters:get_filters', function () { + return [{name: 'filter name', user_id: 42, id: 1}]; + }); + + return view.appendTo($fix) + .done(function () { + var $row = $fix.find('.oe_searchview_custom li:first').click(); + equal(view.query.length, 1, "should have one facet"); + $row.click(); + equal(view.query.length, 0, "should have removed facet"); + }); + }); + test('replacement', {asserts: 4}, function (instance, $fix, mock) { + var view = makeSearchView(instance); + mock('ir.filters:get_filters', function () { + return [ + {name: 'f', user_id: 42, id: 1, context: {'private': 1}}, + {name: 'f', user_id: false, id: 2, context: {'private': 0}} + ]; + }); + return view.appendTo($fix) + .done(function () { + $fix.find('.oe_searchview_custom li:eq(0)').click(); + equal(view.query.length, 1, "should have one facet"); + deepEqual( + view.query.at(0).get('field').get_context(), + {'private': 1}, + "should have selected first filter"); + $fix.find('.oe_searchview_custom li:eq(1)').click(); + equal(view.query.length, 1, "should have one facet"); + deepEqual( + view.query.at(0).get('field').get_context(), + {'private': 0}, + "should have selected second filter"); + }); + }); }); openerp.testing.section('advanced', { dependencies: ['web.search'],