From 05d34d4f6366d42e228cce29149c70024f865604 Mon Sep 17 00:00:00 2001 From: Aaron Bohy <aab@odoo.com> Date: Wed, 17 Feb 2021 09:27:48 +0000 Subject: [PATCH] [FIX] web: correctly close confirm dialog Let's assume the following scenario: - have an action in target new (e.g. a form view) - in the dialog, have an action/object button with confirm attribute - when clicking on that button, a confirm dialog opens - if validated, the following action returned by the server is again an action in target new Before this commit, the confirm dialog remained in the DOM. This issue occurred because it's parent wasn't correctly set (wrong use of `this`), so when the first dialog was destroyed, the confirm dialog wasn't automatically destroyed in turn. OPW~2440712 closes odoo/odoo#66340 X-original-commit: 2016fe31af970976775c9df160a31abfbec742ba Signed-off-by: Jorge Pinna Puissant (jpp) <jpp@odoo.com> --- .../src/js/views/form/form_controller.js | 2 +- .../tests/chrome/action_manager_tests.js | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) 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 fc1e269d9846..a047c1dce77a 100644 --- a/addons/web/static/src/js/views/form/form_controller.js +++ b/addons/web/static/src/js/views/form/form_controller.js @@ -574,7 +574,7 @@ var FormController = BasicController.extend({ var attrs = ev.data.attrs; if (attrs.confirm) { def = new Promise(function (resolve, reject) { - Dialog.confirm(this, attrs.confirm, { + Dialog.confirm(self, attrs.confirm, { confirm_callback: saveAndExecuteAction, }).on("closed", null, resolve); }); diff --git a/addons/web/static/tests/chrome/action_manager_tests.js b/addons/web/static/tests/chrome/action_manager_tests.js index 8f8b3eb2b222..a8f245102eb6 100644 --- a/addons/web/static/tests/chrome/action_manager_tests.js +++ b/addons/web/static/tests/chrome/action_manager_tests.js @@ -3890,6 +3890,57 @@ QUnit.module('ActionManager', { actionManager.destroy(); }); + QUnit.test('can execute act_window actions in target="new"', async function (assert) { + assert.expect(5); + + this.actions.push({ + id: 999, + name: 'A window action', + res_model: 'partner', + target: 'new', + type: 'ir.actions.act_window', + views: [[999, 'form']], + }); + this.archs['partner,999,form'] = ` + <form> + <button name="method" string="Call method" type="object" confirm="Are you sure?"/> + </form>`; + this.archs['partner,1000,form'] = `<form>Another action</form>`; + + const actionManager = await createActionManager({ + actions: this.actions, + archs: this.archs, + data: this.data, + mockRPC: function (route, args) { + if (args.method === 'method') { + return Promise.resolve({ + id: 1000, + name: 'Another window action', + res_model: 'partner', + target: 'new', + type: 'ir.actions.act_window', + views: [[1000, 'form']], + }); + } + return this._super.apply(this, arguments); + }, + }); + await actionManager.doAction(999); + + assert.containsOnce(document.body, '.modal button[name=method]'); + + await testUtils.dom.click($('.modal button[name=method]')); + + assert.containsN(document.body, '.modal', 2); + assert.strictEqual($('.modal:last .modal-body').text(), 'Are you sure?'); + + await testUtils.dom.click($('.modal:last .modal-footer .btn-primary')); + assert.containsOnce(document.body, '.modal'); + assert.strictEqual($('.modal:last .modal-body').text().trim(), 'Another action'); + + actionManager.destroy(); + }); + QUnit.test('on_attach_callback is called for actions in target="new"', async function (assert) { assert.expect(4); -- GitLab