MDL-63303 message: fix bugs in message drawer part 4
[moodle.git] / message / amd / src / message_popover.js
blob556e3415b67a3ffc34aa4760d2f1b65aebc1a51a
1 // This file is part of Moodle - http://moodle.org/
2 //
3 // Moodle is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // Moodle is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16 /**
17  * Controls the message popover in the nav bar.
18  *
19  * @module     core_message/message_popover
20  * @copyright  2018 Ryan Wyllie <ryan@moodle.com>
21  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
22  */
23 define(
25     'jquery',
26     'core/custom_interaction_events',
27     'core/pubsub',
28     'core_message/message_drawer_events'
30 function(
31     $,
32     CustomEvents,
33     PubSub,
34     MessageDrawerEvents
35 ) {
36     var SELECTORS = {
37         COUNT_CONTAINER: '[data-region="count-container"]'
38     };
40     /**
41      * Toggle the message drawer visibility.
42      */
43     var toggleMessageDrawerVisibility = function() {
44         PubSub.publish(MessageDrawerEvents.TOGGLE_VISIBILITY);
45     };
47     /**
48      * Decrement the unread conversation count in the nav bar if a conversation
49      * is read. When there are no unread conversations then hide the counter.
50      *
51      * @param {Object} root The root element for the popover.
52      * @return {Function}
53      */
54     var handleDecrementConversationCount = function(root) {
55         return function() {
56             var countContainer = root.find(SELECTORS.COUNT_CONTAINER);
57             var count = parseInt(countContainer.text(), 10);
59             if (isNaN(count)) {
60                 countContainer.addClass('hidden');
61             } else if (!count || count < 2) {
62                 countContainer.addClass('hidden');
63             } else {
64                 count = count - 1;
65                 countContainer.text(count);
66             }
67         };
68     };
70     /**
71      * Add events listeners for when the popover icon is clicked and when conversations
72      * are read.
73      *
74      * @param {Object} root The root element for the popover.
75      */
76     var registerEventListeners = function(root) {
77         CustomEvents.define(root, [CustomEvents.events.activate]);
79         root.on(CustomEvents.events.activate, function(e, data) {
80             toggleMessageDrawerVisibility();
81             data.originalEvent.preventDefault();
82         });
84         PubSub.subscribe(MessageDrawerEvents.CONVERSATION_READ, handleDecrementConversationCount(root));
85         PubSub.subscribe(MessageDrawerEvents.CONTACT_REQUEST_ACCEPTED, handleDecrementConversationCount(root));
86         PubSub.subscribe(MessageDrawerEvents.CONTACT_REQUEST_DECLINED, handleDecrementConversationCount(root));
87     };
89     /**
90      * Initialise the message popover.
91      *
92      * @param {Object} root The root element for the popover.
93      */
94     var init = function(root) {
95         root = $(root);
96         registerEventListeners(root);
97     };
99     return {
100         init: init,
101     };