diff --git a/addons/mail/controllers/link_preview.py b/addons/mail/controllers/link_preview.py index 09e919e97f1..b290990433e 100644 --- a/addons/mail/controllers/link_preview.py +++ b/addons/mail/controllers/link_preview.py @@ -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(): diff --git a/addons/mail/static/src/core/common/link_preview_confirm_delete.js b/addons/mail/static/src/core/common/link_preview_confirm_delete.js index 68eeaa36873..134347fd46a 100644 --- a/addons/mail/static/src/core/common/link_preview_confirm_delete.js +++ b/addons/mail/static/src/core/common/link_preview_confirm_delete.js @@ -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(); } diff --git a/addons/mail/static/src/core/common/link_preview_confirm_delete.xml b/addons/mail/static/src/core/common/link_preview_confirm_delete.xml index f84ef9a0324..81634de83d8 100644 --- a/addons/mail/static/src/core/common/link_preview_confirm_delete.xml +++ b/addons/mail/static/src/core/common/link_preview_confirm_delete.xml @@ -5,7 +5,8 @@

Do you really want to delete this preview?

- + + diff --git a/addons/mail/static/tests/helpers/mock_server/controllers/discuss.js b/addons/mail/static/tests/helpers/mock_server/controllers/discuss.js index e0c88039c38..669b04831cc 100644 --- a/addons/mail/static/tests/helpers/mock_server/controllers/discuss.js +++ b/addons/mail/static/tests/helpers/mock_server/controllers/discuss.js @@ -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, } ); } diff --git a/addons/mail/static/tests/helpers/mock_server/models/mail_link_preview.js b/addons/mail/static/tests/helpers/mock_server/models/mail_link_preview.js index caddaca9439..03f4995c8fc 100644 --- a/addons/mail/static/tests/helpers/mock_server/models/mail_link_preview.js +++ b/addons/mail/static/tests/helpers/mock_server/models/mail_link_preview.js @@ -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, diff --git a/addons/mail/static/tests/message/link_preview_test.js b/addons/mail/static/tests/message/link_preview_test.js index 1ed302063a6..f68f3348607 100644 --- a/addons/mail/static/tests/message/link_preview_test.js +++ b/addons/mail/static/tests/message/link_preview_test.js @@ -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 }); +});