[FIX] web: show warning on create onchange

When you create a new record, you will have in this order:

- default_get
- onchange (can trigger a warning)
- _pushController => close all dialogs since ea2207afea

This is an issue since the possible warning is directly hidden to the
user.

Without the change, the added test failed with:

 Warning modal should be opened
 "executing a window action with onchange warning do not hide it":
 Found 0 elements to click on, instead of 1

opw-2342273
opw-2374051
closes #61732

closes odoo/odoo#63415

X-original-commit: ff61ab121e3fb3c0c9b269c0dc9a65b3f1c8e664
Signed-off-by: Nicolas Lempereur (nle) <nle@odoo.com>
This commit is contained in:
Nicolas Lempereur
2020-12-15 18:21:14 +00:00
parent 9622ffe442
commit fef9634dfb
3 changed files with 54 additions and 0 deletions
@@ -48,6 +48,7 @@ var CrashManagerDialog = Dialog.extend({
this._super.apply(this, [parent, options]);
this.message = error.message;
this.traceback = error.traceback;
core.bus.off('close_dialogs', this);
},
});
@@ -15,6 +15,7 @@ var RamStorage = require('web.RamStorage');
var ReportService = require('web.ReportService');
var SessionStorageService = require('web.SessionStorageService');
var testUtils = require('web.test_utils');
var WarningDialog = require('web.CrashManager').WarningDialog;
var Widget = require('web.Widget');
var createActionManager = testUtils.createActionManager;
@@ -587,6 +588,57 @@ QUnit.module('ActionManager', {
actionManager.destroy();
});
QUnit.test('executing a window action with onchange warning does not hide it', async function (assert) {
assert.expect(2);
this.archs['partner,false,form'] = `
<form>
<field name="foo"/>
</form>`;
var actionManager = await createActionManager({
actions: this.actions,
archs: this.archs,
data: this.data,
mockRPC: function (route, args) {
if (args.method === 'onchange') {
return Promise.resolve({
value: {},
warning: {
title: "Warning",
message: "Everything is alright",
type: 'dialog',
},
});
}
return this._super.apply(this, arguments);
},
intercepts: {
warning: function (event) {
new WarningDialog(actionManager, {
title: event.data.title,
}, event.data).open();
},
},
});
await actionManager.doAction(3);
await testUtils.dom.click(actionManager.$('.o_list_button_add'));
assert.containsOnce(
$,
'.modal.o_technical_modal.show',
"Warning modal should be opened");
await testUtils.dom.click($('.modal.o_technical_modal.show button.close'));
assert.containsNone(
$,
'.modal.o_technical_modal.show',
"Warning modal should be closed");
actionManager.destroy();
});
QUnit.module('Push State');
QUnit.test('properly push state', async function (assert) {
@@ -123,6 +123,7 @@ odoo.define('web.test_utils', async function (require) {
// to load xml files that are normally lazy loaded by specific widgets).
await Promise.all([
session.is_bound,
ajax.loadXML('/web/static/src/xml/crash_manager.xml', core.qweb),
ajax.loadXML('/web/static/src/xml/debug.xml', core.qweb),
ajax.loadXML('/web/static/src/xml/dialog.xml', core.qweb),
ajax.loadXML('/web/static/src/xml/translation_dialog.xml', core.qweb),