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);