diff options
| author | David Monjoie <dmo@odoo.com> | 2019-06-03 12:50:56 +0000 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2019-12-17 07:21:39 +0000 |
| commit | bce6aa351b3acb9f5eac2eca52a20e313641e747 (patch) | |
| tree | ef7a869642830b9d4d62350f1c0b4c5596b67911 /addons/web/static/tests/views/view_dialogs_tests.js | |
| parent | b0d2cd0041ab755cbbff543cc2cabf17d3183003 (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.js | 44 |
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(); + }); + }); }); |
