From 76d339a2665de078d73bf17374a3c5c5a62ca5c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20K=C3=BChn?= Date: Tue, 28 Feb 2023 14:47:19 +0000 Subject: [PATCH] [FIX] mail: upload file on draft record MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When uploading a file on a draft record, it crashed. This happens because the file upload was applied on record while still in "draft". This fixes the issue by awaiting chatter is saved, to proceed with the file uploading. opw-3204555 closes odoo/odoo#114106 X-original-commit: 45bcd91026b93997e7ba2509c5c4176db269c3c6 Signed-off-by: Sébastien Theys (seb) Signed-off-by: Alexandre Kühn (aku) --- addons/mail/static/src/models/chatter.js | 14 +++++-- .../mail/static/src/models/drop_zone_view.js | 14 ++++++- .../widgets/form_renderer_tests.js | 42 ++++++++++++++++++- 3 files changed, 63 insertions(+), 7 deletions(-) diff --git a/addons/mail/static/src/models/chatter.js b/addons/mail/static/src/models/chatter.js index 1a9f1b713d4..ff2c6844756 100644 --- a/addons/mail/static/src/models/chatter.js +++ b/addons/mail/static/src/models/chatter.js @@ -338,11 +338,16 @@ Model({ }, }); this.createNewRecordDeferred.resolve(); - this.update({ - createNewRecordComposerData: clear(), - createNewRecordDeferred: clear(), - }); } + if (this.createNewRecordFiles) { + const files = this.createNewRecordFiles; + this.fileUploader.uploadFiles(files); + } + this.update({ + createNewRecordComposerData: clear(), + createNewRecordDeferred: clear(), + createNewRecordFiles: clear(), + }); }, /** * @private @@ -615,6 +620,7 @@ Model({ webRecord: attr(), createNewRecordComposerData: attr(), createNewRecordDeferred: attr(), + createNewRecordFiles: attr(), }, onChanges: [ { diff --git a/addons/mail/static/src/models/drop_zone_view.js b/addons/mail/static/src/models/drop_zone_view.js index cf6c9d36fc3..7ef1ef4523b 100644 --- a/addons/mail/static/src/models/drop_zone_view.js +++ b/addons/mail/static/src/models/drop_zone_view.js @@ -61,12 +61,22 @@ Model({ ev.preventDefault(); this.update({ isDraggingInside: false }); if (this._isDragSourceExternalFile(ev.dataTransfer)) { + const files = ev.dataTransfer.files; if (this.chatterOwner) { - await this.chatterOwner.fileUploader.uploadFiles(ev.dataTransfer.files); + const chatter = this.chatterOwner; + if (chatter.isTemporary) { + const saved = await chatter.doSaveRecord(); + if (!saved) { + return; + } + chatter.update({ createNewRecordFiles: files }); + return; + } + await chatter.fileUploader.uploadFiles(files); return; } if (this.composerViewOwner) { - await this.composerViewOwner.fileUploader.uploadFiles(ev.dataTransfer.files); + await this.composerViewOwner.fileUploader.uploadFiles(files); return; } } diff --git a/addons/mail/static/tests/qunit_suite_tests/widgets/form_renderer_tests.js b/addons/mail/static/tests/qunit_suite_tests/widgets/form_renderer_tests.js index 0fa81761b74..944c1af7d30 100644 --- a/addons/mail/static/tests/qunit_suite_tests/widgets/form_renderer_tests.js +++ b/addons/mail/static/tests/qunit_suite_tests/widgets/form_renderer_tests.js @@ -4,13 +4,17 @@ import { makeDeferred } from "@mail/utils/deferred"; import { patchUiSize, SIZES } from "@mail/../tests/helpers/patch_ui_size"; import { afterNextRender, + dragenterFiles, + dropFiles, isScrolledToBottom, nextAnimationFrame, start, startServer, } from "@mail/../tests/helpers/test_utils"; -import { dom, makeTestPromise } from "web.test_utils"; +import { dom, file, makeTestPromise } from "web.test_utils"; + +const { createFile } = file; const { triggerEvent } = dom; @@ -318,6 +322,42 @@ QUnit.module("mail", {}, function () { assert.containsOnce(document.body, ".o_Chatter_thread", "there should be a thread"); }); + QUnit.test("upload attachment on draft record", async function (assert) { + const views = { + "res.partner,false,form": ` +
+ + + +
+ +
+
`, + }; + const { openView } = await start({ serverData: { views } }); + await openView({ + res_model: "res.partner", + views: [[false, "form"]], + }); + const file = await createFile({ + content: "hello, world", + contentType: "text/plain", + name: "text.txt", + }); + assert.containsNone( + document.body, + ".o_ChatterTopbar_buttonToggleAttachments:contains(1)" + ); + await afterNextRender(() => dragenterFiles(document.querySelector(".o_Chatter"))); + await afterNextRender(() => + dropFiles(document.querySelector(".o_Chatter_dropZone"), [file]) + ); + assert.containsOnce( + document.body, + ".o_ChatterTopbar_buttonToggleAttachments:contains(1)" + ); + }); + QUnit.test("basic chatter rendering without activities", async function (assert) { assert.expect(6);