From ff1c307b5972bdab3c4402db75f65c524104bf0a Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Mon, 1 Feb 2021 15:06:53 +0000 Subject: [PATCH] [FIX] web: Many2ManyTags: no crash when focusing out Commit [1] improves the focusout case of the Many2One field: if the user typed something in the input that matches some records (i.e. if there are records in the suggestion dropdown), the first one is automatically set. The Many2ManyTags field internally uses a FieldMany2One. However, the same scenario inside a Many2ManyTags crashed. The reason is that we sent the wrong value in this case (an id, instead of an object). [1] https://github.com/odoo/odoo/commit/1d4d2a6 closes odoo/odoo#65386 X-original-commit: e3cf207ecaae2785f7d0e8e3afa0fe45c9d6b88d Signed-off-by: Lucas Perais (lpe) Signed-off-by: Aaron Bohy (aab) --- .../static/src/js/fields/relational_fields.js | 2 +- .../tests/fields/relational_fields_tests.js | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index c68ac1bd64c..12a249ce605 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -770,7 +770,7 @@ var FieldMany2One = AbstractField.extend({ } const firstValue = this.suggestions.find(s => s.id); if (firstValue) { - this.reinitialize(firstValue.id); + this.reinitialize({ id: firstValue.id, display_name: firstValue.name }); } else if (this.can_create) { new M2ODialog(this, this.string, this.$input.val()).open(); } diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index cf09b08dd45..737e48f76e3 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -2036,6 +2036,30 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test("select a many2many value by focusing out", async function (assert) { + assert.expect(4); + + const form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: `
`, + }); + + assert.containsNone(form, '.o_field_many2manytags .badge'); + + form.$('.o_field_many2manytags input').focus().val('go').trigger('input').trigger('keyup'); + await testUtils.nextTick(); + form.$('.o_field_many2manytags input').trigger('blur'); + await testUtils.nextTick(); + + assert.containsNone(document.body, '.modal'); + assert.containsOnce(form, '.o_field_many2manytags .badge'); + assert.strictEqual(form.$('.o_field_many2manytags .badge').text().trim(), 'gold'); + + form.destroy(); + }); + QUnit.module('FieldRadio'); QUnit.test('fieldradio widget on a many2one in a new record', async function (assert) {