From 774ca5571af1457446ee0ce72d1da2593b810b15 Mon Sep 17 00:00:00 2001 From: Jorge Pinna Puissant Date: Mon, 7 Jun 2021 14:17:13 +0000 Subject: [PATCH] [FIX] web: close, already closed dialog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this commit, when trying to close an already closed dialog, an error is raised. closes odoo-dev/odoo#928 Signed-off-by: Géry Debongnie (ged) --- .../src/core/dialog/dialog_container.js | 10 ++++--- .../static/tests/core/dialog_service_tests.js | 30 +++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/core/dialog/dialog_container.js b/addons/web/static/src/core/dialog/dialog_container.js index 5c1681af7b7..6b3e1bd0dc2 100644 --- a/addons/web/static/src/core/dialog/dialog_container.js +++ b/addons/web/static/src/core/dialog/dialog_container.js @@ -31,11 +31,13 @@ export class DialogContainer extends Component { } closeDialog(id) { - if (this.dialogs[id].options && this.dialogs[id].options.onCloseCallback) { - this.dialogs[id].options.onCloseCallback(); + if (this.dialogs[id]) { + if (this.dialogs[id].options && this.dialogs[id].options.onCloseCallback) { + this.dialogs[id].options.onCloseCallback(); + } + delete this.dialogs[id]; + this.render(); } - delete this.dialogs[id]; - this.render(); } errorCallBack(id) { diff --git a/addons/web/static/tests/core/dialog_service_tests.js b/addons/web/static/tests/core/dialog_service_tests.js index c067ee7d319..431c5955aca 100644 --- a/addons/web/static/tests/core/dialog_service_tests.js +++ b/addons/web/static/tests/core/dialog_service_tests.js @@ -72,6 +72,36 @@ QUnit.test("Simple rendering with a single dialog", async (assert) => { assert.containsNone(target, ".o_dialog_manager portal"); assert.containsNone(target, ".o_dialog_container .o_dialog"); }); + +QUnit.test("Simple rendering and close a single dialog", async (assert) => { + assert.expect(9); + + class CustomDialog extends Dialog {} + CustomDialog.title = "Welcome"; + + pseudoWebClient = await mount(PseudoWebClient, { env, target }); + assert.containsOnce(target, ".o_dialog_manager"); + assert.containsNone(target, ".o_dialog_manager portal"); + assert.containsNone(target, ".o_dialog_container .o_dialog"); + + const dialogId = env.services.dialog.open(CustomDialog); + await nextTick(); + assert.containsOnce(target, ".o_dialog_manager portal"); + assert.containsOnce(target, ".o_dialog_container .o_dialog"); + assert.strictEqual(target.querySelector("header .modal-title").textContent, "Welcome"); + + env.services.dialog.close(dialogId); + await nextTick(); + assert.containsOnce(target, ".o_dialog_manager"); + assert.containsNone(target, ".o_dialog_manager portal"); + assert.containsNone(target, ".o_dialog_container .o_dialog"); + + // Call a second time, the close on the dialog. + // As the dialog is already close, this call is just ignored. No error should be raised. + env.services.dialog.close(dialogId); + await nextTick(); +}); + QUnit.test("rendering with two dialogs", async (assert) => { assert.expect(12); class CustomDialog extends Dialog {