diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index ec64eb9b7ad..8b9d7812ca7 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -992,7 +992,7 @@ var BasicModel = AbstractModel.extend({ }); record._changes[name] = rec.id; } - } else if (field.type === 'one2many') { + } else if (field.type === 'one2many' || field.type === 'many2many') { record._changes = record._changes || {}; var listId = record._changes[name] || record.data[name]; var list = self.localData[listId]; diff --git a/addons/web/static/test/views/form_tests.js b/addons/web/static/test/views/form_tests.js index 1295282732c..b3a8652ab30 100644 --- a/addons/web/static/test/views/form_tests.js +++ b/addons/web/static/test/views/form_tests.js @@ -1731,4 +1731,46 @@ QUnit.module('Views', { form.destroy(); }); -});}); + QUnit.test('properly apply onchange on many2many fields', function (assert) { + assert.expect(3); + + this.data.partner.onchanges = { + foo: function (obj) { + obj.timmy = [ + [5], + [1, 12, {display_name: "gold"}], + ]; + }, + }; + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
', + res_id: 2, + }); + + assert.strictEqual(form.$('.o_form_field_many2many .o_data_row').length, 0, + "there should be no many2many record linked at first"); + + // switch to edit mode + form.$buttons.find('.o_form_button_edit').click(); + form.$('.o_form_input').val('let us trigger an onchange').trigger('input'); + assert.strictEqual(form.$('.o_form_field_many2many .o_data_row').length, 1, + "there should be one linked record"); + assert.strictEqual(form.$('.o_form_field_many2many .o_data_row td:first').text(), 'gold', + "the 'display_name' of the many2many record should be correctly displayed"); + + form.destroy(); + }); + +}); + +});