From 60d3fc736c8e990f83c075695ee4035485eb93b8 Mon Sep 17 00:00:00 2001 From: Pierre Paridans Date: Mon, 22 Oct 2018 09:10:01 +0000 Subject: [PATCH] [FIX] partner_autocomplete: autocomplete not defined in mobile Bugfix to prevent traceback in mobile apps due to override of Many2one widget with native implementation. Happens in every form view containing a partner field. Implemented as defensive programming. The goal of the included test is to prevent a silent error for the webclient. It doesn't test the actual behavior in mobile (where there is no DOM for Many2one). Task #1896641 closes odoo/odoo#27967 --- .../src/js/partner_autocomplete_many2one.js | 5 +++ .../tests/partner_autocomplete_tests.js | 41 ++++++++++++++++++- 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/addons/partner_autocomplete/static/src/js/partner_autocomplete_many2one.js b/addons/partner_autocomplete/static/src/js/partner_autocomplete_many2one.js index 6abf1751461..059629010b8 100644 --- a/addons/partner_autocomplete/static/src/js/partner_autocomplete_many2one.js +++ b/addons/partner_autocomplete/static/src/js/partner_autocomplete_many2one.js @@ -65,6 +65,11 @@ var PartnerField = FieldMany2One.extend({ */ _modifyAutompleteRendering: function (){ var api = this.$input.data('ui-autocomplete'); + // FIXME: bugfix to prevent traceback in mobile apps due to override + // of Many2one widget with native implementation. + if (!api) { + return; + } api._renderItem = function(ul, item){ ul.addClass('o_partner_autocomplete_dropdown'); var $a = $('')["html"](item.label); diff --git a/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js b/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js index 5eebcf85ce0..9a49acd846f 100644 --- a/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js +++ b/addons/partner_autocomplete/static/tests/partner_autocomplete_tests.js @@ -2,9 +2,11 @@ odoo.define('partner_autocomplete.tests', function (require) { "use strict"; var FormView = require('web.FormView'); + var concurrency = require('web.concurrency'); var testUtils = require("web.test_utils"); var AutocompleteCore = require('partner.autocomplete.core'); var AutocompleteField = require('partner.autocomplete.fieldchar'); + var PartnerField = require('partner.autocomplete.many2one'); var createView = testUtils.createAsyncView; @@ -100,6 +102,7 @@ odoo.define('partner_autocomplete.tests', function (require) { searchable: true }, name: {string: "Name", type: "char", searchable: true}, + parent_id: {string: "Company", type: "many2one", relation: "res.partner"}, website: {string: "Website", type: "char", searchable: true}, image: {string: "Image", type: "binary", searchable: true}, email: {string: "Email", type: "char", searchable: true}, @@ -332,4 +335,40 @@ odoo.define('partner_autocomplete.tests', function (require) { done(); }); }); -}); \ No newline at end of file + + QUnit.test("Partner autocomplete : render Many2one", function (assert) { + var done = assert.async(); + assert.expect(3); + + var M2O_DELAY = PartnerField.prototype.AUTOCOMPLETE_DELAY; + PartnerField.prototype.AUTOCOMPLETE_DELAY = 0; + + createView({ + View: FormView, + model: 'res.partner', + data: this.data, + arch: + '
' + + '' + + '' + + '', + }).then(function (form) { + var $input = form.$('.o_field_many2one[name="parent_id"] input:visible'); + assert.strictEqual($input.length, 1, "there should be an for the Many2one"); + + $input.val('odoo').trigger('input'); + + concurrency.delay(0).then(function () { + var $dropdown = $input.autocomplete('widget'); + assert.strictEqual($dropdown.length, 1, "there should be an opened dropdown"); + assert.ok($dropdown.is('.o_partner_autocomplete_dropdown'), + "there should be a partner_autocomplete"); + + PartnerField.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY; + form.destroy(); + + done(); + }); + }); + }); +});