diff --git a/addons/mail/__manifest__.py b/addons/mail/__manifest__.py index d3e5c815451..a9b70d82eb1 100644 --- a/addons/mail/__manifest__.py +++ b/addons/mail/__manifest__.py @@ -130,6 +130,9 @@ For more specific needs, you may also assign custom-defined actions ('remove', 'mail/static/src/public/**/*'), ('remove', 'mail/static/src/**/*.dark.scss'), ('remove', 'mail/static/src/emoji_picker/emoji_data.js'), + # discuss (loaded last to fix dependencies) + ('remove', 'mail/static/src/discuss/**/*'), + 'mail/static/src/discuss/**/*', ], "web.dark_mode_assets_backend": [ 'mail/static/src/**/*.dark.scss', @@ -184,6 +187,10 @@ For more specific needs, you may also assign custom-defined actions ('remove', 'mail/static/src/web/**/*'), ('remove', 'mail/static/src/emoji_picker/emoji_data.js'), ('remove', 'mail/static/src/**/*.dark.scss'), + # discuss (loaded last to fix dependencies) + ('remove', 'mail/static/src/discuss/**/*'), + 'mail/static/src/discuss/**/*', + ('remove', 'mail/static/src/discuss/web/**/*'), ] }, 'license': 'LGPL-3', diff --git a/addons/mail/static/src/discuss_app/channel_invitation.js b/addons/mail/static/src/discuss/channel_invitation.js similarity index 95% rename from addons/mail/static/src/discuss_app/channel_invitation.js rename to addons/mail/static/src/discuss/channel_invitation.js index 6833ca115a2..4f206b40849 100644 --- a/addons/mail/static/src/discuss_app/channel_invitation.js +++ b/addons/mail/static/src/discuss/channel_invitation.js @@ -2,14 +2,15 @@ import { Component, useRef, useState, onMounted, onWillStart } from "@odoo/owl"; import { useMessaging, useStore } from "@mail/core/messaging_hook"; -import { ImStatus } from "./im_status"; +import { ImStatus } from "@mail/discuss_app/im_status"; import { _t } from "@web/core/l10n/translation"; import { useService } from "@web/core/utils/hooks"; export class ChannelInvitation extends Component { static components = { ImStatus }; - static props = ["thread", "close?", "chatState?"]; + static defaultProps = { hasSizeConstraints: false }; + static props = ["hasSizeConstraints?", "thread", "close?", "chatState?"]; static template = "discuss.ChannelInvitation"; setup() { diff --git a/addons/mail/static/src/discuss_app/channel_invitation.scss b/addons/mail/static/src/discuss/channel_invitation.scss similarity index 56% rename from addons/mail/static/src/discuss_app/channel_invitation.scss rename to addons/mail/static/src/discuss/channel_invitation.scss index a12ca007b7f..63137575cab 100644 --- a/addons/mail/static/src/discuss_app/channel_invitation.scss +++ b/addons/mail/static/src/discuss/channel_invitation.scss @@ -1,13 +1,13 @@ -.o-mail-ChannelInvitation { +.o-discuss-ChannelInvitation-has-size-constraints { width: Min(95vw, 400px); max-height: Min(calc(100vh - 140px), 530px); } -.o-mail-ChannelInvitation-selectedList { +.o-discuss-ChannelInvitation-selectedList { max-height: 100px; } -.o-mail-ChannelInvitation-avatar { +.o-discuss-ChannelInvitation-avatar { width: $o-mail-Avatar-size; height: $o-mail-Avatar-size; } diff --git a/addons/mail/static/src/discuss_app/channel_invitation.xml b/addons/mail/static/src/discuss/channel_invitation.xml similarity index 82% rename from addons/mail/static/src/discuss_app/channel_invitation.xml rename to addons/mail/static/src/discuss/channel_invitation.xml index 0b2e6a9613b..d3f9fd5ba3c 100644 --- a/addons/mail/static/src/discuss_app/channel_invitation.xml +++ b/addons/mail/static/src/discuss/channel_invitation.xml @@ -2,17 +2,17 @@ -
+

Invite people

- +
-
+
-
+
@@ -33,7 +33,7 @@

Selected users:

-
+
+ + + diff --git a/addons/mail/static/src/discuss/web/chat_window_patch.js b/addons/mail/static/src/discuss/web/chat_window_patch.js new file mode 100644 index 00000000000..e8ed4ad5572 --- /dev/null +++ b/addons/mail/static/src/discuss/web/chat_window_patch.js @@ -0,0 +1,15 @@ +/* @odoo-module */ + +import { ChannelInvitation } from "@mail/discuss/channel_invitation"; +import { ChatWindow } from "@mail/web/chat_window/chat_window"; +import { patch } from "@web/core/utils/patch"; + +patch(ChatWindow, "discuss", { + components: { ...ChatWindow.components, ChannelInvitation }, +}); + +patch(ChatWindow.prototype, "discuss", { + toggleAddUsers() { + this.state.activeMode = this.state.activeMode === "add-users" ? "" : "add-users"; + }, +}); diff --git a/addons/mail/static/src/discuss/web/chat_window_patch.xml b/addons/mail/static/src/discuss/web/chat_window_patch.xml new file mode 100644 index 00000000000..6283b6aefac --- /dev/null +++ b/addons/mail/static/src/discuss/web/chat_window_patch.xml @@ -0,0 +1,13 @@ + + + + +
+ +
+
+ + + +
+
diff --git a/addons/mail/static/src/discuss_app/discuss.js b/addons/mail/static/src/discuss_app/discuss.js index 1db040075e0..0356d3541b5 100644 --- a/addons/mail/static/src/discuss_app/discuss.js +++ b/addons/mail/static/src/discuss_app/discuss.js @@ -20,9 +20,7 @@ import { useEffect, } from "@odoo/owl"; import { CallSettings } from "../rtc/call_settings"; -import { usePopover } from "@web/core/popover/popover_hook"; import { useService } from "@web/core/utils/hooks"; -import { ChannelInvitation } from "./channel_invitation"; import { _t } from "@web/core/l10n/translation"; import { PinnedMessagesPanel } from "./pinned_messages_panel"; @@ -60,14 +58,7 @@ export class Discuss extends Component { this.messageEdition = useMessageEdition(); this.messageToReplyTo = useMessageToReplyTo(); this.contentRef = useRef("content"); - this.popover = usePopover(ChannelInvitation, { - onClose: () => (this.state.isAddingUsers = false), - }); - this.addUsersRef = useRef("addUsers"); - this.state = useState({ - activeMode: this.MODES.NONE, - isAddingUsers: false, - }); + this.state = useState({ activeMode: this.MODES.NONE }); this.orm = useService("orm"); this.effect = useService("effect"); this.prevInboxCounter = this.store.discuss.inbox.counter; @@ -120,15 +111,6 @@ export class Discuss extends Component { : this.MODES.PINNED_MESSAGES; } - toggleInviteForm() { - if (this.popover.isOpen) { - this.popover.close(); - } else { - this.state.isAddingUsers = true; - this.popover.open(this.addUsersRef.el, { thread: this.thread }); - } - } - toggleSettings() { this.state.activeMode = this.state.activeMode === this.MODES.SETTINGS ? this.MODES.NONE : this.MODES.SETTINGS; diff --git a/addons/mail/static/src/discuss_app/discuss.xml b/addons/mail/static/src/discuss_app/discuss.xml index ed711e42bf4..98ceb15e36c 100644 --- a/addons/mail/static/src/discuss_app/discuss.xml +++ b/addons/mail/static/src/discuss_app/discuss.xml @@ -31,12 +31,9 @@ - - diff --git a/addons/mail/static/src/web/chat_window/chat_window.js b/addons/mail/static/src/web/chat_window/chat_window.js index 296380dc689..8606aebf99f 100644 --- a/addons/mail/static/src/web/chat_window/chat_window.js +++ b/addons/mail/static/src/web/chat_window/chat_window.js @@ -12,7 +12,6 @@ import { localization } from "@web/core/l10n/localization"; import { CallSettings } from "@mail/rtc/call_settings"; import { ChannelMemberList } from "@mail/discuss_app/channel_member_list"; import { ThreadIcon } from "@mail/discuss_app/thread_icon"; -import { ChannelInvitation } from "@mail/discuss_app/channel_invitation"; import { isEventHandled } from "@mail/utils/misc"; import { ChannelSelector } from "@mail/discuss_app/channel_selector"; import { PinnedMessagesPanel } from "@mail/discuss_app/pinned_messages_panel"; @@ -33,7 +32,6 @@ export class ChatWindow extends Component { CallSettings, ChannelMemberList, ThreadIcon, - ChannelInvitation, PinnedMessagesPanel, }; static props = ["chatWindow", "right?"]; @@ -140,10 +138,6 @@ export class ChatWindow extends Component { this.state.activeMode = this.state.activeMode === "member-list" ? "" : "member-list"; } - toggleAddUsers() { - this.state.activeMode = this.state.activeMode === "add-users" ? "" : "add-users"; - } - expand() { if (this.thread.type === "chatter") { this.action.doAction({ diff --git a/addons/mail/static/src/web/chat_window/chat_window.xml b/addons/mail/static/src/web/chat_window/chat_window.xml index 606d396c79a..62af2d4f62a 100644 --- a/addons/mail/static/src/web/chat_window/chat_window.xml +++ b/addons/mail/static/src/web/chat_window/chat_window.xml @@ -29,12 +29,9 @@
-
+
-
- -
@@ -55,7 +52,6 @@ - diff --git a/addons/mail/static/tests/crosstab/crosstab_tests.js b/addons/mail/static/tests/crosstab/crosstab_tests.js index c21a3c77c82..e331de1f8f3 100644 --- a/addons/mail/static/tests/crosstab/crosstab_tests.js +++ b/addons/mail/static/tests/crosstab/crosstab_tests.js @@ -184,44 +184,6 @@ QUnit.test("Remove attachment from message", async (assert) => { assert.containsNone(tab1.target, ".o-mail-AttachmentCard:contains(test.txt)"); }); -QUnit.test("Add member to channel", async (assert) => { - const pyEnv = await startServer(); - const channelId = pyEnv["discuss.channel"].create({ name: "General" }); - const userId = pyEnv["res.users"].create({ name: "Harry" }); - pyEnv["res.partner"].create({ name: "Harry", user_ids: [userId] }); - const { openDiscuss } = await start(); - await openDiscuss(channelId); - await click("button[title='Show Member List']"); - assert.containsOnce($, ".o-mail-ChannelMember:contains(Mitchell Admin)"); - await click("button[title='Add Users']"); - await click(".o-mail-ChannelInvitation-selectable:contains(Harry)"); - await click("button[title='Invite to Channel']"); - assert.containsOnce($, ".o-mail-ChannelMember:contains(Harry)"); -}); - -QUnit.test("Remove member from channel", async (assert) => { - const pyEnv = await startServer(); - const userId = pyEnv["res.users"].create({ name: "Harry" }); - const partnerId = pyEnv["res.partner"].create({ - name: "Harry", - user_ids: [userId], - }); - const channelId = pyEnv["discuss.channel"].create({ - name: "General", - channel_member_ids: [ - [0, 0, { partner_id: pyEnv.currentPartnerId }], - [0, 0, { partner_id: partnerId }], - ], - }); - const { env, openDiscuss } = await start(); - await openDiscuss(channelId); - await click("button[title='Show Member List']"); - assert.containsOnce($, ".o-mail-ChannelMember:contains(Harry)"); - env.services.orm.call("discuss.channel", "action_unfollow", [channelId], { - context: { mockedUserId: userId }, - }); -}); - QUnit.test("Message delete notification", async (assert) => { const pyEnv = await startServer(); const messageId = pyEnv["mail.message"].create({ diff --git a/addons/mail/static/tests/discuss_app/channel_invitation_tests.js b/addons/mail/static/tests/discuss/channel_invitation_tests.js similarity index 90% rename from addons/mail/static/tests/discuss_app/channel_invitation_tests.js rename to addons/mail/static/tests/discuss/channel_invitation_tests.js index f8ab5ec7882..2344da9c2da 100644 --- a/addons/mail/static/tests/discuss_app/channel_invitation_tests.js +++ b/addons/mail/static/tests/discuss/channel_invitation_tests.js @@ -1,4 +1,4 @@ -/** @odoo-module **/ +/* @odoo-module */ import { click, insertText, start, startServer } from "@mail/../tests/helpers/test_utils"; @@ -24,7 +24,7 @@ QUnit.test( const { openDiscuss } = await start({ hasTimeControl: true }); await openDiscuss(channelId); await click(".o-mail-Discuss-header button[title='Add Users']"); - assert.containsOnce($, ".o-mail-ChannelInvitation"); + assert.containsOnce($, ".o-discuss-ChannelInvitation"); } ); @@ -53,8 +53,8 @@ QUnit.test( const { openDiscuss } = await start(); await openDiscuss(channelId); await click(".o-mail-Discuss-header button[title='Add Users']"); - await insertText(".o-mail-ChannelInvitation-search", "TestPartner2"); - assert.strictEqual($(".o-mail-ChannelInvitation-selectable").text(), "TestPartner2"); + await insertText(".o-discuss-ChannelInvitation-search", "TestPartner2"); + assert.strictEqual($(".o-discuss-ChannelInvitation-selectable").text(), "TestPartner2"); } ); @@ -79,7 +79,7 @@ QUnit.test("Invitation form should display channel group restriction", async (as await click(".o-mail-Discuss-header button[title='Add Users']"); assert.containsOnce( $, - '.o-mail-ChannelInvitation:contains(Access restricted to group "testGroup")' + '.o-discuss-ChannelInvitation:contains(Access restricted to group "testGroup")' ); }); @@ -106,7 +106,7 @@ QUnit.test("should be able to create a new group chat from an existing chat", as const { openDiscuss } = await start(); await openDiscuss(channelId); await click(".o-mail-Discuss-header button[title='Add Users']"); - await insertText(".o-mail-ChannelInvitation-search", "TestPartner2"); + await insertText(".o-discuss-ChannelInvitation-search", "TestPartner2"); await click(".form-check-input"); await click("button[title='Create Group Chat']"); assert.strictEqual( diff --git a/addons/mail/static/tests/discuss/crosstab/crosstab_tests.js b/addons/mail/static/tests/discuss/crosstab/crosstab_tests.js new file mode 100644 index 00000000000..21032892dfd --- /dev/null +++ b/addons/mail/static/tests/discuss/crosstab/crosstab_tests.js @@ -0,0 +1,43 @@ +/* @odoo-module */ + +import { click, start, startServer } from "@mail/../tests/helpers/test_utils"; + +QUnit.module("crosstab"); + +QUnit.test("Add member to channel", async (assert) => { + const pyEnv = await startServer(); + const channelId = pyEnv["discuss.channel"].create({ name: "General" }); + const userId = pyEnv["res.users"].create({ name: "Harry" }); + pyEnv["res.partner"].create({ name: "Harry", user_ids: [userId] }); + const { openDiscuss } = await start(); + await openDiscuss(channelId); + await click("button[title='Show Member List']"); + assert.containsOnce($, ".o-mail-ChannelMember:contains(Mitchell Admin)"); + await click("button[title='Add Users']"); + await click(".o-discuss-ChannelInvitation-selectable:contains(Harry)"); + await click("button[title='Invite to Channel']"); + assert.containsOnce($, ".o-mail-ChannelMember:contains(Harry)"); +}); + +QUnit.test("Remove member from channel", async (assert) => { + const pyEnv = await startServer(); + const userId = pyEnv["res.users"].create({ name: "Harry" }); + const partnerId = pyEnv["res.partner"].create({ + name: "Harry", + user_ids: [userId], + }); + const channelId = pyEnv["discuss.channel"].create({ + name: "General", + channel_member_ids: [ + [0, 0, { partner_id: pyEnv.currentPartnerId }], + [0, 0, { partner_id: partnerId }], + ], + }); + const { env, openDiscuss } = await start(); + await openDiscuss(channelId); + await click("button[title='Show Member List']"); + assert.containsOnce($, ".o-mail-ChannelMember:contains(Harry)"); + env.services.orm.call("discuss.channel", "action_unfollow", [channelId], { + context: { mockedUserId: userId }, + }); +}); diff --git a/addons/mail/static/tests/discuss_app/channel_member_list_tests.js b/addons/mail/static/tests/discuss_app/channel_member_list_tests.js index 14050698b0a..6a95f8f35cf 100644 --- a/addons/mail/static/tests/discuss_app/channel_member_list_tests.js +++ b/addons/mail/static/tests/discuss_app/channel_member_list_tests.js @@ -156,7 +156,7 @@ QUnit.test("Channel member count update after user joined", async (assert) => { assert.strictEqual(thread.memberCount, 1); await click("button[title='Show Member List']"); await click("button[title='Add Users']"); - await click(".o-mail-ChannelInvitation-selectable:contains(Harry)"); + await click(".o-discuss-ChannelInvitation-selectable:contains(Harry)"); await click("button[title='Invite to Channel']"); assert.strictEqual(thread.memberCount, 2); });