summaryrefslogtreecommitdiff
path: root/addons/mail/static/src/models/messaging_menu
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/mail/static/src/models/messaging_menu
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/mail/static/src/models/messaging_menu')
-rw-r--r--addons/mail/static/src/models/messaging_menu/messaging_menu.js154
1 files changed, 154 insertions, 0 deletions
diff --git a/addons/mail/static/src/models/messaging_menu/messaging_menu.js b/addons/mail/static/src/models/messaging_menu/messaging_menu.js
new file mode 100644
index 00000000..60212930
--- /dev/null
+++ b/addons/mail/static/src/models/messaging_menu/messaging_menu.js
@@ -0,0 +1,154 @@
+odoo.define('mail/static/src/models/messaging_menu/messaging_menu.js', function (require) {
+'use strict';
+
+const { registerNewModel } = require('mail/static/src/model/model_core.js');
+const { attr, one2one } = require('mail/static/src/model/model_field.js');
+
+function factory(dependencies) {
+
+ class MessagingMenu extends dependencies['mail.model'] {
+
+ //----------------------------------------------------------------------
+ // Public
+ //----------------------------------------------------------------------
+
+ /**
+ * Close the messaging menu. Should reset its internal state.
+ */
+ close() {
+ this.update({ isOpen: false });
+ }
+
+ /**
+ * Toggle the visibility of the messaging menu "new message" input in
+ * mobile.
+ */
+ toggleMobileNewMessage() {
+ this.update({ isMobileNewMessageToggled: !this.isMobileNewMessageToggled });
+ }
+
+ /**
+ * Toggle whether the messaging menu is open or not.
+ */
+ toggleOpen() {
+ this.update({ isOpen: !this.isOpen });
+ }
+
+ //----------------------------------------------------------------------
+ // Private
+ //----------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ _computeInboxMessagesAutoloader() {
+ if (!this.isOpen) {
+ return;
+ }
+ const inbox = this.env.messaging.inbox;
+ if (!inbox || !inbox.mainCache) {
+ return;
+ }
+ // populate some needaction messages on threads.
+ inbox.mainCache.update({ isCacheRefreshRequested: true });
+ }
+
+ /**
+ * @private
+ * @returns {integer}
+ */
+ _updateCounter() {
+ if (!this.env.messaging) {
+ return 0;
+ }
+ const inboxMailbox = this.env.messaging.inbox;
+ const unreadChannels = this.env.models['mail.thread'].all(thread =>
+ thread.localMessageUnreadCounter > 0 &&
+ thread.model === 'mail.channel' &&
+ thread.isPinned
+ );
+ let counter = unreadChannels.length;
+ if (inboxMailbox) {
+ counter += inboxMailbox.counter;
+ }
+ if (this.messaging.notificationGroupManager) {
+ counter += this.messaging.notificationGroupManager.groups.reduce(
+ (total, group) => total + group.notifications.length,
+ 0
+ );
+ }
+ if (this.messaging.isNotificationPermissionDefault()) {
+ counter++;
+ }
+ return counter;
+ }
+
+ /**
+ * @override
+ */
+ _updateAfter(previous) {
+ const counter = this._updateCounter();
+ if (this.counter !== counter) {
+ this.update({ counter });
+ }
+ }
+
+ }
+
+ MessagingMenu.fields = {
+ /**
+ * Tab selected in the messaging menu.
+ * Either 'all', 'chat' or 'channel'.
+ */
+ activeTabId: attr({
+ default: 'all',
+ }),
+ counter: attr({
+ default: 0,
+ }),
+ /**
+ * Dummy field to automatically load messages of inbox when messaging
+ * menu is open.
+ *
+ * Useful because needaction notifications require fetching inbox
+ * messages to work.
+ */
+ inboxMessagesAutoloader: attr({
+ compute: '_computeInboxMessagesAutoloader',
+ dependencies: [
+ 'isOpen',
+ 'messagingInbox',
+ 'messagingInboxMainCache',
+ ],
+ }),
+ /**
+ * Determine whether the mobile new message input is visible or not.
+ */
+ isMobileNewMessageToggled: attr({
+ default: false,
+ }),
+ /**
+ * Determine whether the messaging menu dropdown is open or not.
+ */
+ isOpen: attr({
+ default: false,
+ }),
+ messaging: one2one('mail.messaging', {
+ inverse: 'messagingMenu',
+ }),
+ messagingInbox: one2one('mail.thread', {
+ related: 'messaging.inbox',
+ }),
+ messagingInboxMainCache: one2one('mail.thread_cache', {
+ related: 'messagingInbox.mainCache',
+ }),
+ };
+
+ MessagingMenu.modelName = 'mail.messaging_menu';
+
+ return MessagingMenu;
+}
+
+registerNewModel('mail.messaging_menu', factory);
+
+});