From f6f342e50b004759237c6d013f9765dad0f8ce3b Mon Sep 17 00:00:00 2001 From: Adrien Dieudonne Date: Wed, 26 Apr 2017 10:00:05 +0200 Subject: [PATCH] [FIX] web: FormController: prevent opening multiple form dialogs Before this commit, the form dialog was open twice when you tried to add a new record on a one2many if you were already in a modal. The event wasn't stopped, so the first form dialog was correcly rendered but the second one tried to load the same form view on a wrong model. --- .../src/js/views/form/form_controller.js | 1 + addons/web/static/tests/views/form_tests.js | 72 +++++++++++++++++++ 2 files changed, 73 insertions(+) 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(); + }); }); });