diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 196fdcac0cd..c0542585f40 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -1270,6 +1270,7 @@ instance.web.search.DateTimeField = instance.web.search.DateField.extend(/** @le } }); instance.web.search.ManyToOneField = instance.web.search.CharField.extend({ + default_operator: {}, init: function (view_section, field, view) { this._super(view_section, field, view); this.model = new instance.web.Model(this.attrs.relation); @@ -1302,6 +1303,15 @@ instance.web.search.ManyToOneField = instance.web.search.CharField.extend({ if (_(names).isEmpty()) { return null; } return facet_from(self, names[0]); }) + }, + value_from: function (facetValue) { + return facetValue.get('label'); + }, + make_domain: function (name, operator, facetValue) { + if (operator === this.default_operator) { + return [[name, '=', facetValue.get('value')]]; + } + return this._super(name, operator, facetValue); } }); diff --git a/addons/web/static/test/search.js b/addons/web/static/test/search.js index 682cf27a7ab..9b0205c462a 100644 --- a/addons/web/static/test/search.js +++ b/addons/web/static/test/search.js @@ -833,6 +833,53 @@ $(document).ready(function () { self: "great" }, "evaluation context should hold facet value as self"); }); + test("M2O default", function () { + var f = new instance.web.search.ManyToOneField( + {}, {name: 'foo'}, {inputs: []}); + var facet = new instance.web.search.Facet({ + field: f, + values: [{label: "Foo", value: 42}] + }); + + deepEqual(f.get_domain(facet), [['foo', '=', 42]], + "m2o should use identity if default domain"); + }); + test("M2O custom operator", function () { + var f = new instance.web.search.ManyToOneField( + {attrs: {operator: 'boos'}}, {name: 'foo'}, {inputs: []}); + var facet = new instance.web.search.Facet({ + field: f, + values: [{label: "Foo", value: 42}] + }); + + deepEqual(f.get_domain(facet), [['foo', 'boos', 'Foo']], + "m2o should use label with custom operators"); + }); + test("M2O custom domain & context", function () { + var f = new instance.web.search.ManyToOneField({attrs: { + context: "{'whee': self}", + filter_domain: "[['filter', 'is', self]]" + }}, {name: 'foo'}, {inputs: []}); + var facet = new instance.web.search.Facet({ + field: f, + values: [{label: "Foo", value: 42}] + }); + + var domain = f.get_domain(facet); + deepEqual(domain.__domains, [ + "[['filter', 'is', self]]" + ]); + deepEqual(domain.get_eval_context(), { + self: "Foo" + }, "custom domain's self should be label"); + var context = f.get_context(facet); + deepEqual(context.__contexts, [ + "{'whee': self}" + ]); + deepEqual(context.get_eval_context(), { + self: "Foo" + }, "custom context's self should be label"); + }); module('drawer', { setup: function () {