diff --git a/addons/web/static/src/js/views/basic/basic_controller.js b/addons/web/static/src/js/views/basic/basic_controller.js index b58a4154e1f..2f61fcb4bf6 100644 --- a/addons/web/static/src/js/views/basic/basic_controller.js +++ b/addons/web/static/src/js/views/basic/basic_controller.js @@ -344,7 +344,11 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { const message = ids.length > 1 ? _t("Are you sure you want to delete these records?") : _t("Are you sure you want to delete this record?"); - Dialog.confirm(this, message, { confirm_callback: doIt }); + let dialog; + const confirmCallback = () => { + doIt().guardedCatch(() => dialog.destroy()); + }; + dialog = Dialog.confirm(this, message, { confirm_callback: confirmCallback }); } else { doIt(); } diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index 6312e4b8692..d82d03bab3b 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -3350,6 +3350,37 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test('deleting record which throws UserError should close confirmation dialog', async function (assert) { + assert.expect(3); + + const list = await createView({ + View: ListView, + model: 'foo', + data: this.data, + viewOptions: {hasActionMenus: true}, + arch: '', + mockRPC: function (route, args) { + if (args.method === 'unlink') { + return Promise.reject({ message: "Odoo Server Error" }); + } + return this._super(...arguments); + }, + }); + + await testUtils.dom.click(list.$('tbody td.o_list_record_selector:first input')); + + assert.containsOnce(list.el, 'div.o_control_panel .o_cp_action_menus'); + + await cpHelpers.toggleActionMenu(list); + await cpHelpers.toggleMenuItem(list, "Delete"); + assert.containsOnce(document.body, '.modal', 'should have open the confirmation dialog'); + + await testUtils.dom.click($('body .modal button span:contains(Ok)')); + assert.containsNone(document.body, ".modal", "confirmation dialog should be closed"); + + list.destroy(); + }); + QUnit.test('delete all records matching the domain', async function (assert) { assert.expect(6);