diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js index c8fea641fe6..be36a2e49ce 100644 --- a/addons/web/static/src/js/views/form/form_controller.js +++ b/addons/web/static/src/js/views/form/form_controller.js @@ -513,6 +513,7 @@ var FormController = BasicController.extend({ * @param {OdooEvent} event */ _onOpenOne2ManyRecord: function (event) { + event.stopPropagation(); var data = event.data; var record; if (data.id) { diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index 2c6d01fab6b..0091ea3e6e6 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -3540,5 +3540,77 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.test('check interactions between multiple FormViewDialogs', function (assert) { + assert.expect(7); + + this.data.product.fields.product_ids = { + string: "one2many product", type: "one2many", relation: "product", + }; + + this.data.partner.records[0].product_id = 37; + + var form = createView({ + View: FormView, + model: 'partner', + res_id: 1, + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '
', + archs: { + 'product,false,form': + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '
', + 'product,false,list': '' + }, + mockRPC: function (route, args) { + if (route === '/web/dataset/call_kw/product/get_formview_id') { + return $.when(false); + } else if (args.method === 'write') { + assert.strictEqual(args.model, 'product', + "should write on product model"); + assert.strictEqual(args.args[1].product_ids[0][2].display_name, 'xtv', + "display_name of the new object should be xtv"); + } + return this._super.apply(this, arguments); + }, + }); + + form.$buttons.find('.o_form_button_edit').click(); + // Open first dialog + form.$('.o_external_button').click(); + assert.strictEqual($('.modal').length, 1, + "One FormViewDialog should be opened"); + var $firstModal = $('.modal'); + assert.strictEqual($firstModal.find('.o_form_input').val(), 'xphone', + "display_name should be correctly displayed"); + + // Open second dialog + $firstModal.find('.o_form_field_x2many_list_row_add a').click(); + assert.strictEqual($('.modal').length, 2, + "two FormViewDialogs should be opened"); + var $secondModal = $('.modal:nth(1)'); + // Add new value + $secondModal.find('.o_form_input').val('xtv').trigger('input'); + $secondModal.find('.modal-footer button:first').click(); // Save & close + assert.strictEqual($('.modal').length, 1, + "last opened dialog should be closed"); + + // Check that data in first dialog is correctly updated + assert.strictEqual($firstModal.find('tr.o_data_row td').text(), 'xtv', + "should have added a line with xtv as new record"); + $firstModal.find('.modal-footer button:first').click(); // Save & close + form.destroy(); + }); }); });