summaryrefslogtreecommitdiff
path: root/addons/web/static/tests/views/view_dialogs_tests.js
diff options
context:
space:
mode:
authorDavid Monjoie <dmo@odoo.com>2019-06-03 12:50:56 +0000
committerAaron Bohy <aab@odoo.com>2019-12-17 07:21:39 +0000
commitbce6aa351b3acb9f5eac2eca52a20e313641e747 (patch)
treeef7a869642830b9d4d62350f1c0b4c5596b67911 /addons/web/static/tests/views/view_dialogs_tests.js
parentb0d2cd0041ab755cbbff543cc2cabf17d3183003 (diff)
[IMP] web: rejected click handlers should not close the dialog
Prior to this commit, there was no clean way to have a button triggering asynchronous work (like asking user for confirmaton for example) and close or not close the modal according to the user choice. Your options were: 1. Swallow the pill and just accept that the modal will close even if the user chose not to undertake the action. 2. Set the `close` parameter of the button to false and handle the conditional closing by yourself from outside the dialog. This commit introduces a way to tell the form view dialog that the action has not been processed correctly and that the modal should not be closed by returning a rejected promise. Prior behavior can still be obtained (close no matter the result) by having the handler not returning a promise at all. closes odoo/odoo#33837 Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
Diffstat (limited to 'addons/web/static/tests/views/view_dialogs_tests.js')
-rw-r--r--addons/web/static/tests/views/view_dialogs_tests.js44
1 files changed, 44 insertions, 0 deletions
diff --git a/addons/web/static/tests/views/view_dialogs_tests.js b/addons/web/static/tests/views/view_dialogs_tests.js
index 1086d157475..4e205c420a1 100644
--- a/addons/web/static/tests/views/view_dialogs_tests.js
+++ b/addons/web/static/tests/views/view_dialogs_tests.js
@@ -547,6 +547,50 @@ QUnit.module('Views', {
form.destroy();
});
+
+ QUnit.test('formviewdialog is not closed when button handlers return a rejected promise', async function (assert) {
+ assert.expect(3);
+
+ this.data.partner.fields.poney_ids = { string: "Poneys", type: "one2many", relation: 'partner' };
+ this.data.partner.records[0].poney_ids = [];
+ var reject = true;
+
+ var parent = createParent({
+ data: this.data,
+ archs: {
+ 'partner,false,form':
+ '<form string="Partner">' +
+ '<field name="poney_ids"><tree><field name="display_name"/></tree></field>' +
+ '</form>',
+ },
+ });
+
+ new dialogs.FormViewDialog(parent, {
+ res_model: 'partner',
+ res_id: 1,
+ buttons: [{
+ text: 'Click me !',
+ classes: "btn-secondary o_form_button_magic",
+ close: true,
+ click: function () {
+ return reject ? Promise.reject() : Promise.resolve();
+ },
+ }],
+ }).open();
+
+ await testUtils.nextTick();
+ assert.strictEqual($('.modal').length, 1, "should have a modal displayed");
+
+ await testUtils.dom.click($('.modal .o_form_button_magic'));
+ assert.strictEqual($('.modal').length, 1, "modal should still be opened");
+
+ reject = false;
+ await testUtils.dom.click($('.modal .o_form_button_magic'));
+ assert.strictEqual($('.modal').length, 0, "modal should be closed");
+
+ parent.destroy();
+ });
+
});
});