From 0d21735a92c8d0b60babaac6d62dbc8eda7c11ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20Lef=C3=A8vre?= Date: Tue, 30 Apr 2019 11:22:32 +0000 Subject: [PATCH] [FIX] web: Send attachment ids on file loaded This commit fixes a bug introduced when migrating from jquery deferred to native JS Promises (ab56e63). Steps to reproduce: 1. Go to the Expense app 2. Create a new expense 3. Click on "Attach Document" and upload a file => crash and infinite loading spinner After loading files, the `attach_document` widget is supposed to call a callback action with attachment ids as argument. Currently, attachement ids are not correclty retrieved. They are retrieved via the `arguments` object but since ab56e63 `arguments` refers to the arguments of the Promise callback function and no longer to the handler function `_onFileLoaded` arguments. closes odoo/odoo#33048 Signed-off-by: VincentSchippefilt --- .../static/src/js/widgets/attach_document.js | 4 +-- addons/web/static/tests/views/form_tests.js | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/widgets/attach_document.js b/addons/web/static/src/js/widgets/attach_document.js index 3175875c151..a4a72a62765 100644 --- a/addons/web/static/src/js/widgets/attach_document.js +++ b/addons/web/static/src/js/widgets/attach_document.js @@ -109,10 +109,10 @@ var AttachDocument = Widget.extend({ */ _onFileLoaded: function () { var self = this; + // the first argument isn't a file but the jQuery.Event + var files = Array.prototype.slice.call(arguments, 1); return new Promise(function (resolve) { if (self.node.attrs.action) { - // the first argument isn't a file but the jQuery.Event - var files = Array.prototype.slice.call(arguments, 1); self._rpc({ model: self.res_model, method: self.node.attrs.action, diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index c01a1c46fb3..f41dbcb7f28 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -6801,6 +6801,32 @@ QUnit.module('Views', { delete widgetRegistry.map.test; }); + QUnit.test('attach document widget calls action with attachment ids', async function (assert) { + assert.expect(1); + + var form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + mockRPC: function (route, args) { + if (args.method === 'my_action') { + assert.deepEqual(args.kwargs.attachment_ids, [5, 2]); + return Promise.resolve(); + } + return this._super.apply(this, arguments); + }, + arch: '
' + + '' + + '', + }); + + var onFileLoadedEventName = form.$('.o_form_binary_form').attr('target') + // trigger _onFileLoaded function + $(window).trigger(onFileLoadedEventName, [{id: 5}, {id:2}]); + + form.destroy(); + }); + QUnit.test('support header button as widgets on form statusbar', async function (assert) { assert.expect(2);