[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:
committed by
Adrien Dieudonne
parent
a4f34c6480
commit
60d3fc736c
@@ -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();
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user