[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
This commit is contained in:
Pierre Paridans
2018-10-23 16:58:58 +00:00
committed by Adrien Dieudonne
parent a4f34c6480
commit 60d3fc736c
2 changed files with 45 additions and 1 deletions
@@ -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 = $('<a/>')["html"](item.label);
@@ -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();
});
});
});
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:
'<form>' +
'<field name="name"/>' +
'<field name="parent_id" widget="res_partner_many2one"/>' +
'</form>',
}).then(function (form) {
var $input = form.$('.o_field_many2one[name="parent_id"] input:visible');
assert.strictEqual($input.length, 1, "there should be an <input/> 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();
});
});
});
});