From e264eca71ae102026016cea1b88b5f7cf0b6587d Mon Sep 17 00:00:00 2001 From: shreya thakrar Date: Tue, 28 May 2019 05:59:33 +0000 Subject: [PATCH] [IMP] web: searchpanel: use child_of operator for categories When a category value is selected, we search for records matching this category OR one of its children categories task-1974632 closes: #33701 Signed-off-by: Aaron Bohy (aab) Co-authored-by: Aaron Bohy --- .../src/js/views/kanban/search_panel.js | 4 +++- .../web/static/tests/helpers/mock_server.js | 18 ++++++++++++++ .../static/tests/views/search_panel_tests.js | 24 +++++++++---------- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/addons/web/static/src/js/views/kanban/search_panel.js b/addons/web/static/src/js/views/kanban/search_panel.js index 730c9b83ae2..536409ba199 100644 --- a/addons/web/static/src/js/views/kanban/search_panel.js +++ b/addons/web/static/src/js/views/kanban/search_panel.js @@ -320,7 +320,9 @@ var SearchPanel = Widget.extend({ function categoryToDomain(domain, categoryId) { var category = self.categories[categoryId]; if (category.activeValueId) { - domain.push([category.fieldName, '=', category.activeValueId]); + var field = self.fields[category.fieldName]; + var op = field.type === 'many2one' ? 'child_of' : '='; + domain.push([category.fieldName, op, category.activeValueId]); } return domain; } diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js index b1427ecb6f4..41ae61c44f8 100644 --- a/addons/web/static/tests/helpers/mock_server.js +++ b/addons/web/static/tests/helpers/mock_server.js @@ -382,6 +382,24 @@ var MockServer = Class.extend({ } if (domain.length) { + // 'child_of' operator isn't supported by domain.js, so we replace + // in by the 'in' operator (with the ids of children) + domain = domain.map(function (criterion) { + if (criterion[1] === 'child_of') { + var oldLength = 0; + var childIDs = [criterion[2]]; + while (childIDs.length > oldLength) { + oldLength = childIDs.length; + _.each(records, function (r) { + if (childIDs.indexOf(r.parent_id) >= 0) { + childIDs.push(r.id); + } + }); + } + criterion = [criterion[0], 'in', childIDs]; + } + return criterion; + }); records = _.filter(records, function (record) { var fieldValues = _.mapObject(record, function (value) { return value instanceof Array ? value[0] : value; diff --git a/addons/web/static/tests/views/search_panel_tests.js b/addons/web/static/tests/views/search_panel_tests.js index 4b3517e4cc5..9cb66724e78 100644 --- a/addons/web/static/tests/views/search_panel_tests.js +++ b/addons/web/static/tests/views/search_panel_tests.js @@ -298,8 +298,8 @@ QUnit.module('Views', { assert.verifySteps([ '[["bar","=",true]]', - '[["bar","=",true],["company_id","=",3]]', - '[["bar","=",true],["company_id","=",5]]', + '[["bar","=",true],["company_id","child_of",3]]', + '[["bar","=",true],["company_id","child_of",5]]', '[["bar","=",true]]', ]); @@ -399,7 +399,7 @@ QUnit.module('Views', { '', mockRPC: function (route, args) { if (route === '/web/dataset/search_read') { - assert.deepEqual(args.domain, [['company_id', '=', expectedActiveId]]); + assert.deepEqual(args.domain, [['company_id', 'child_of', expectedActiveId]]); } return this._super.apply(this, arguments); }, @@ -523,9 +523,9 @@ QUnit.module('Views', { assert.verifySteps([ '[["bar","=",true]]', - '[["bar","=",true],["company_id","=",3]]', - '[["bar","=",true],["company_id","=",3],["state","=","abc"]]', - '[["bar","=",true],["company_id","=",3],["state","=","ghi"]]', + '[["bar","=",true],["company_id","child_of",3]]', + '[["bar","=",true],["company_id","child_of",3],["state","=","abc"]]', + '[["bar","=",true],["company_id","child_of",3],["state","=","ghi"]]', '[["bar","=",true],["state","=","ghi"]]', '[["bar","=",true]]', ]); @@ -610,8 +610,8 @@ QUnit.module('Views', { assert.verifySteps([ '[]', - '[["company_id","=",40]]', - '[["company_id","=",5]]', + '[["company_id","child_of",40]]', + '[["company_id","child_of",5]]', ]); kanban.destroy(); @@ -772,8 +772,8 @@ QUnit.module('Views', { assert.verifySteps([ '[["bar","=",true]]', - '[["bar","=",true],["company_id","=",3]]', - '[["bar","=",true],["company_id","=",5]]', + '[["bar","=",true],["company_id","child_of",3]]', + '[["bar","=",true],["company_id","child_of",5]]', ]); kanban.destroy(); @@ -1438,9 +1438,9 @@ QUnit.module('Views', { assert.verifySteps([ '[]', // category_domain (All) '[["category_id","=",false]]', // comodel_domain (All) - '[["category_id","=",6]]', // category_domain ('gold') + '[["category_id","child_of",6]]', // category_domain ('gold') '[["category_id","=",6]]', // comodel_domain ('gold') - '[["category_id","=",7]]', // category_domain ('silver') + '[["category_id","child_of",7]]', // category_domain ('silver') '[["category_id","=",7]]', // comodel_domain ('silver') '[]', // category_domain (All) '[["category_id","=",false]]', // comodel_domain (All)