[IMP] mail: allow deletion of all the link preview at once

Before this commit, when a message had many link previews,
deleting all of them required to delete one by one.

This commit improves this aspect by showing a "Delete All"
button in the dialog to delete all link previews at once.

task-3488054

closes odoo/odoo#134301

Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
This commit is contained in:
Didier (did)
2023-09-06 14:42:17 +00:00
committed by Alexandre Kühn
parent 7e8c78a0d7
commit f4ee483fde
6 changed files with 72 additions and 24 deletions
+2 -2
View File
@@ -23,9 +23,9 @@ class LinkPreviewController(http.Controller):
@http.route("/mail/link_preview/delete", methods=["POST"], type="json", auth="public")
@add_guest_to_context
def mail_link_preview_delete(self, link_preview_id):
def mail_link_preview_delete(self, link_preview_ids):
guest = request.env["mail.guest"]._get_guest_from_context()
link_preview_sudo = guest.env["mail.link.preview"].sudo().search([("id", "=", int(link_preview_id))])
link_preview_sudo = guest.env["mail.link.preview"].sudo().search([("id", "in", link_preview_ids)])
if not link_preview_sudo:
return
if not link_preview_sudo.message_id.is_current_user_or_guest_author and not guest.env.user._is_admin():
@@ -1,6 +1,6 @@
/* @odoo-module */
import { Component } from "@odoo/owl";
import { Component, useState } from "@odoo/owl";
import { Dialog } from "@web/core/dialog/dialog";
import { useService } from "@web/core/utils/hooks";
@@ -19,13 +19,27 @@ export class LinkPreviewConfirmDelete extends Component {
setup() {
this.rpc = useService("rpc");
this.store = useState(useService("mail.store"));
}
get message() {
return this.store.Message.get(this.props.linkPreview.message_id);
}
onClickOk() {
this.rpc(
"/mail/link_preview/delete",
{ link_preview_id: this.props.linkPreview.id },
{ shadow: true }
{ link_preview_ids: [this.props.linkPreview.id] },
{ silent: true }
);
this.props.close();
}
onClickDeleteAll() {
this.rpc(
"/mail/link_preview/delete",
{ link_preview_ids: this.message.linkPreviews.map((lp) => lp.id) },
{ silent: true }
);
this.props.close();
}
@@ -5,7 +5,8 @@
<p class="mx-3 mb-3">Do you really want to delete this preview?</p>
<t t-component="props.LinkPreview" linkPreview="props.linkPreview" deletable="false"/>
<t t-set-slot="footer">
<button class="btn btn-primary me-2" t-on-click="onClickOk">Ok</button>
<button class="btn btn-danger me-2" t-on-click="onClickOk">Delete</button>
<button t-if="message.linkPreviews.length > 1" class="btn btn-outline-danger me-2" t-on-click="onClickDeleteAll">Delete all previews</button>
<button class="btn btn-secondary me-2" t-on-click="onClickCancel">Cancel</button>
</t>
</Dialog>
@@ -73,17 +73,19 @@ patch(MockServer.prototype, {
return this._mockRouteMailLinkPreview(args.message_id, args.clear);
}
if (route === "/mail/link_preview/delete") {
const [linkPreview] = this.pyEnv["mail.link.preview"].searchRead([
["id", "=", args.link_preview_id],
const linkPreviews = this.pyEnv["mail.link.preview"].searchRead([
["id", "in", args.link_preview_ids],
]);
this.pyEnv["bus.bus"]._sendone(
this._mockMailMessage__busNotificationTarget(linkPreview.message_id[0]),
"mail.link.preview/delete",
{
id: linkPreview.id,
message_id: linkPreview.message_id[0],
}
);
for (const linkPreview of linkPreviews) {
this.pyEnv["bus.bus"]._sendone(
this._mockMailMessage__busNotificationTarget(linkPreview.message_id[0]),
"mail.link.preview/delete",
{
id: linkPreview.id,
message_id: linkPreview.message_id[0],
}
);
}
return args;
}
if (route === "/mail/load_message_failures") {
@@ -287,11 +289,11 @@ patch(MockServer.prototype, {
["message_id", "=", message_id],
]);
this.pyEnv["bus.bus"]._sendone(
this._mockMailMessage__busNotificationTarget(linkPreview.message_id[0]),
this._mockMailMessage__busNotificationTarget(linkPreview.message_id),
"mail.link.preview/delete",
{
id: linkPreview.id,
message_id: linkPreview.message_id[0],
message_id: linkPreview.message_id,
}
);
}
@@ -13,7 +13,7 @@ patch(MockServer.prototype, {
_mockMailLinkPreviewFormat(linkPreview) {
return {
id: linkPreview.id,
message_id: linkPreview.message_id[0],
message_id: linkPreview.message_id[0] || linkPreview.message_id,
image_mimetype: linkPreview.image_mimetype,
og_description: linkPreview.og_description,
og_image: linkPreview.og_image,
@@ -165,7 +165,7 @@ QUnit.test("Remove link preview Gif", async () => {
openDiscuss(channelId);
await click(".o-mail-LinkPreviewImage button[aria-label='Remove']");
await contains("p", { text: "Do you really want to delete this preview?" });
await click(".modal-footer button", { text: "Ok" });
await click(".modal-footer button", { text: "Delete" });
await contains(".o-mail-LinkPreviewImage", { count: 0 });
});
@@ -189,7 +189,7 @@ QUnit.test("Remove link preview card", async () => {
openDiscuss(channelId);
await click(".o-mail-LinkPreviewCard button[aria-label='Remove']");
await contains("p", { text: "Do you really want to delete this preview?" });
await click(".modal-footer button", { text: "Ok" });
await click(".modal-footer button", { text: "Delete" });
await contains(".o-mail-LinkPreviewCard", { count: 0 });
});
@@ -214,7 +214,7 @@ QUnit.test("Remove link preview video", async () => {
openDiscuss(channelId);
await click(".o-mail-LinkPreviewVideo button[aria-label='Remove']");
await contains("p", { text: "Do you really want to delete this preview?" });
await click(".modal-footer button", { text: "Ok" });
await click(".modal-footer button", { text: "Delete" });
await contains(".o-mail-LinkPreviewVideo", { count: 0 });
});
@@ -237,7 +237,7 @@ QUnit.test("Remove link preview image", async () => {
openDiscuss(channelId);
await click(".o-mail-LinkPreviewImage button[aria-label='Remove']");
await contains("p", { text: "Do you really want to delete this preview?" });
await click(".modal-footer button", { text: "Ok" });
await click(".modal-footer button", { text: "Delete" });
await contains(".o-mail-LinkPreviewImage", { count: 0 });
});
@@ -260,7 +260,7 @@ QUnit.test("No crash on receiving link preview of non-known message", async (ass
openDiscuss();
env.services.rpc("/mail/link_preview", { message_id: messageId });
assert.ok(true);
env.services.rpc("/mail/link_preview/delete", { link_preview_id: linkPreviewId });
env.services.rpc("/mail/link_preview/delete", { link_preview_ids: [linkPreviewId] });
assert.ok(true);
});
@@ -344,3 +344,34 @@ QUnit.test("Sending message with link preview URL should show a link preview car
await click("button:not([disabled])", { text: "Send" });
await contains(".o-mail-LinkPreviewCard");
});
QUnit.test("Delete all link previews at once", async () => {
const pyEnv = await startServer();
const linkPreviewIds = pyEnv["mail.link.preview"].create([
{
og_description: "Description",
og_title: "Article title 1",
og_type: "article",
source_url: "https://www.odoo.com",
},
{
image_mimetype: "image/jpg",
source_url:
"https://upload.wikimedia.org/wikipedia/commons/thumb/4/41/Siberischer_tiger_de_edit02.jpg/290px-Siberischer_tiger_de_edit02.jpg",
},
]);
const channelId = pyEnv["discuss.channel"].create({ name: "wololo" });
pyEnv["mail.message"].create({
body: "not empty",
link_preview_ids: linkPreviewIds,
message_type: "comment",
model: "discuss.channel",
res_id: channelId,
});
const { openDiscuss } = await start();
openDiscuss(channelId);
await click(".o-mail-LinkPreviewCard button[aria-label='Remove']");
await click(".modal-footer button", { text: "Delete all previews" });
await contains(".o-mail-LinkPreviewCard", { count: 0 });
await contains(".o-mail-LinkPreviewImage", { count: 0 });
});