[FIX] mail: upload file on draft record

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) <seb@odoo.com>
Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
This commit is contained in:
Alexandre Kühn
2023-03-02 16:01:14 +01:00
parent a1187c5140
commit 76d339a266
3 changed files with 63 additions and 7 deletions
+10 -4
View File
@@ -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: [
{
@@ -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;
}
}
@@ -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": `
<form string="Partners">
<sheet>
<field name="name"/>
</sheet>
<div class="oe_chatter">
<field name="message_ids"/>
</div>
</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);