[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#66597

X-original-commit: 98f9cb4f692a15494cd8ef298673fe1c949c423c
Signed-off-by: Jorge Pinna Puissant (jpp) <jpp@odoo.com>
This commit is contained in:
Aaron Bohy
2021-02-22 12:13:22 +00:00
committed by Jorge Pinna Puissant
parent 7c9c9e391a
commit c14622fcd3
2 changed files with 53 additions and 1 deletions
@@ -513,7 +513,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);
});
@@ -4031,6 +4031,58 @@ QUnit.module('ActionManager', {
assert.strictEqual($(".modal").length, 1, "It should display a modal");
await testUtils.dom.click(`button[name="some_method"]`);
assert.strictEqual($(".modal").length, 0, "It should have closed the modal");
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();
});