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();
+ });
});
});