From 94c027efdd9cf180f4ebcf7faadae2af6645d191 Mon Sep 17 00:00:00 2001 From: Mathieu Duckerts-Antoine Date: Wed, 4 Jul 2018 11:40:40 +0200 Subject: [PATCH] [FIX] web: manage correctly deletion of facets This commit fixes many synchronization problems between search view bar and the filters and groupby menus. --- .../src/js/views/search/groupby_menu.js | 7 +- .../static/src/js/views/search/search_view.js | 81 ++++++++++--------- .../static/tests/views/search_view_tests.js | 43 ++++++++++ 3 files changed, 89 insertions(+), 42 deletions(-) diff --git a/addons/web/static/src/js/views/search/groupby_menu.js b/addons/web/static/src/js/views/search/groupby_menu.js index 4e3c4eb573d..32aaea64c4d 100644 --- a/addons/web/static/src/js/views/search/groupby_menu.js +++ b/addons/web/static/src/js/views/search/groupby_menu.js @@ -126,7 +126,7 @@ var GroupByMenu = DropdownMenu.extend({ itemId: groupbyName, description: field.string, fieldName: fieldName, - groupId: this.groupId, + groupId: _.uniqueId('__group__'), isActive: true, }; var eventData = _.clone(groupby); @@ -153,11 +153,6 @@ var GroupByMenu = DropdownMenu.extend({ item.options = this.intervalOptions; item.defaultOptionId = item.defaultOptionId || this.defaultOptionId; } - // the idea is that we have only one group in the groupby menu - // like in the search view. - if (!this.groupId) { - this.groupId = item.groupId; - } // super has to be called here because we need to add options to groupby // before to call it since some keys in a groupby are initialized using // the keys 'options' and 'defaultOptionId' diff --git a/addons/web/static/src/js/views/search/search_view.js b/addons/web/static/src/js/views/search/search_view.js index e307ca2a240..fe2ee0b47d7 100644 --- a/addons/web/static/src/js/views/search/search_view.js +++ b/addons/web/static/src/js/views/search/search_view.js @@ -578,32 +578,35 @@ var SearchView = Widget.extend({ this.query.each(function (facet) { + var values = facet.get('values'); if (facet.attributes.cat === "groupByCategory") { - selectedGroupIds.groupByCategory = selectedGroupIds.groupByCategory.concat( - _.compact( - _.uniq( - _.map(facet.attributes.values, function (value) { - var groupby = value.value; - var groupbyDescription = _.findWhere(self.groupbysMapping, {groupby: groupby}); - if (groupbyDescription) { - return groupbyDescription.groupId; - } - }) - ) + selectedGroupIds.groupByCategory = _.uniq( + values.reduce( + function (acc, value) { + var groupby = value.value; + var description = _.findWhere(self.groupbysMapping, {groupby: groupby}); + if (description) { + acc.push(description.groupId); + } + return acc; + }, + [] ) ); } if (facet.attributes.cat === "filterCategory") { selectedGroupIds.filterCategory = selectedGroupIds.filterCategory.concat( _.uniq( - _.compact( - _.map(facet.attributes.values, function (value) { + values.reduce( + function (acc, value) { var filter = value.value; - var filterDescription = _.findWhere(self.filtersMapping, {filter: filter}); - if (filterDescription) { - return filterDescription.groupId; + var description = _.findWhere(self.filtersMapping, {filter: filter}); + if (description) { + acc.push(description.groupId); } - }) + return acc; + }, + [] ) ) ); @@ -869,39 +872,45 @@ var SearchView = Widget.extend({ return fv; }, /** - * @private + * This function ask the groupby menu to deactive all groupbys if no + * groupby is used. + * * @param {string[]]} selectedGroupIds */ _unsetUnusedGroupbys: function (selectedGroupIds) { - var groupIds = this.selectedGroupIds.groupByCategory.reduce( - function (acc, id) { - if (!_.contains(selectedGroupIds, id)) { - acc.push(id); + var groupIds = this.groupsMapping.reduce( + function (acc, triple) { + if (triple.category === 'Group By') { + acc.push(triple.groupId); } return acc; }, [] ); this.selectedGroupIds.groupByCategory = selectedGroupIds; - this.groupby_menu.unsetGroups(groupIds); + if (selectedGroupIds.length === 0) { + this.groupby_menu.unsetGroups(groupIds); + } }, /** * @private * @param {string[]]} selectedGroupIds */ - _unsetUnusedFilters: function (selectedGroupIds) { - var groupIds = this.selectedGroupIds.filterCategory.reduce( - function (acc, id) { - if (!_.contains(selectedGroupIds, id)) { - acc.push(id); - } - return acc; - }, - [] - ); - this.selectedGroupIds.filterCategory = selectedGroupIds; - this.filters_menu.unsetGroups(groupIds); - }, + _unsetUnusedFilters: function (selectedGroupIds) { + var groupIds = this.groupsMapping.reduce( + function (acc, triple) { + if (triple.category === 'Filters') { + if (!_.contains(selectedGroupIds, triple.groupId)) { + acc.push(triple.groupId); + } + } + return acc; + }, + [] + ); + this.selectedGroupIds.filterCategory = selectedGroupIds; + this.filters_menu.unsetGroups(groupIds); + }, //-------------------------------------------------------------------------- // Handlers diff --git a/addons/web/static/tests/views/search_view_tests.js b/addons/web/static/tests/views/search_view_tests.js index 75ba0e13e68..c64125e1599 100644 --- a/addons/web/static/tests/views/search_view_tests.js +++ b/addons/web/static/tests/views/search_view_tests.js @@ -76,6 +76,13 @@ QUnit.module('Search View', { type: 'ir.actions.act_window', views: [[2, 'list']], search_view_id: [5, 'search'], + }, { + id: 7, + name: 'Partners Action 7', + res_model: 'partner', + type: 'ir.actions.act_window', + views: [[2, 'list']], + search_view_id: [6, 'search'], }, ]; @@ -135,6 +142,11 @@ QUnit.module('Search View', { '' + '' + '', + 'partner,6,search': ''+ + '' + + '' + + '' + + '', }; }, }, function () { @@ -286,6 +298,37 @@ QUnit.module('Search View', { assert.strictEqual($('.o_content tr.o_group_header').length, 4); actionManager.destroy(); }); + + QUnit.test('a separator in groupbys does not cause problems', function (assert) { + assert.expect(6); + + var actionManager = createActionManager({ + actions: this.actions, + archs: this.archs, + data: this.data, + }); + + actionManager.doAction(7); + // open menu 'Group By' + $('span.fa-bars').click(); + // open options menu + $('.o_group_by_menu .o_menu_item a:first').click(); + // activate groupby with 'day' option + $('.o_group_by_menu .o_menu_item .o_item_option[data-option_id="day"]').click(); + // activate the second groupby + $('.o_group_by_menu .o_menu_item > a').eq(1).click(); + assert.strictEqual($('.o_group_by_menu .o_menu_item').length, 2); + assert.ok($('.o_group_by_menu .o_menu_item').hasClass('selected')); + // deactivate second groupby + $('.o_group_by_menu .o_menu_item > a').eq(1).click(); + assert.ok($('.o_group_by_menu .o_menu_item').eq(0).hasClass('selected')); + assert.ok(!$('.o_group_by_menu .o_menu_item').eq(1).hasClass('selected')); + // remove facet + $('.o_facet_remove').click(); + assert.ok(!$('.o_group_by_menu .o_menu_item').eq(0).hasClass('selected')); + assert.ok(!$('.o_group_by_menu .o_menu_item').eq(1).hasClass('selected')); + actionManager.destroy(); + }); QUnit.module('Filters Menu');