1331bfd482b6aaac3d0b677041d4fdbe25b8645e
[moodle.git] / message / amd / build / message_drawer_view_overview_section.min.js.map
1 {"version":3,"sources":["../src/message_drawer_view_overview_section.js"],"names":["define","$","CustomEvents","Notification","PubSub","Str","Pending","Templates","UserDate","MessageRepository","MessageDrawerEvents","MessageDrawerRouter","MessageDrawerRoutes","LazyLoadList","MessageDrawerViewConversationContants","SELECTORS","TOGGLE","CONVERSATION","BLOCKED_ICON_CONTAINER","LAST_MESSAGE","LAST_MESSAGE_DATE","MUTED_ICON_CONTAINER","UNREAD_COUNT","SECTION_TOTAL_COUNT","SECTION_TOTAL_COUNT_CONTAINER","SECTION_UNREAD_COUNT","PLACEHOLDER_CONTAINER","TEMPLATES","CONVERSATIONS_LIST","CONVERSATIONS_LIST_ITEMS_PLACEHOLDER","LOAD_LIMIT","loadedConversationsById","loadedTotalCounts","loadedUnreadCounts","isVisible","root","getRoot","hasClass","setExpanded","addClass","setCollapsed","removeClass","renderTotalCount","count","container","find","countElement","text","get_string","done","string","attr","numPlaceholders","placeholders","Array","apply","map","render","then","html","placeholderContainer","catch","renderUnreadCount","formatConversationFromEvent","conversation","recursivelyLowercaseKeys","object","Object","keys","reduce","carry","key","isArray","toLowerCase","formatted","messages","message","useridfrom","userfrom","id","conversations","userId","pending","formatMessagePreview","lastMessage","tmpElement","document","createElement","innerHTML","replace","isMedia","querySelector","messagePreview","indexOf","pix","label","includes","labelString","renderPix","icon","exception","mapPromises","length","formattedConversation","imageurl","name","subname","unreadcount","ismuted","lastmessagedate","timecreated","sentfromcurrentuser","lastmessage","otherUser","type","CONVERSATION_TYPES","SELF","members","PRIVATE","member","userid","showonlinestatus","isonline","isblocked","PUBLIC","lastsendername","fullname","Promise","all","formattedConversations","forEach","Date","toDateString","istoday","js","resolve","Deferred","error","getLoadCallback","types","includeFavourites","offset","includeSelfConversations","nonSelfConversationTypes","filter","candidate","getConversations","response","slice","setLoadedAll","getTotalConversationCountElement","getTotalUnreadConversationCountElement","incrementTotalConversationCount","element","parseInt","decrementTotalConversationCount","decrementTotalUnreadConversationCount","getConversationElement","conversationId","getConversationElementFromUserId","muteConversation","conversationElement","unmuteConversation","blockContact","unblockContact","createNewConversationFromEvent","existingConversations","listRoot","showContent","hideEmptyMessage","contentContainer","getContentContainer","prepend","deleteConversation","remove","hideContent","showEmptyMessage","markConversationAsRead","unreadCount","registerEventListeners","namespace","loadCallback","fromPanel","conversationBelongsToThisSection","conversationType","isFavourite","toggle","css","outerHeight","on","show","append","subscribe","CONTACT_BLOCKED","CONTACT_UNBLOCKED","CONVERSATION_SET_MUTED","CONVERSATION_UNSET_MUTED","CONVERSATION_NEW_LAST_MESSAGE","loggedInUserId","CONVERSATION_DELETED","CONVERSATION_READ","CONVERSATION_SET_FAVOURITE","CONVERSATION_UNSET_FAVOURITE","events","activate","e","data","target","closest","go","VIEW_CONVERSATION","originalEvent","preventDefault","header","body","footer","totalCountPromise","unreadCountPromise"],"mappings":"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","sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Controls a section of the overview page in the message drawer.\n *\n * @module     core_message/message_drawer_view_overview_section\n * @copyright  2018 Ryan Wyllie <ryan@moodle.com>\n * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(\n[\n    'jquery',\n    'core/custom_interaction_events',\n    'core/notification',\n    'core/pubsub',\n    'core/str',\n    'core/pending',\n    'core/templates',\n    'core/user_date',\n    'core_message/message_repository',\n    'core_message/message_drawer_events',\n    'core_message/message_drawer_router',\n    'core_message/message_drawer_routes',\n    'core_message/message_drawer_lazy_load_list',\n    'core_message/message_drawer_view_conversation_constants'\n],\nfunction(\n    $,\n    CustomEvents,\n    Notification,\n    PubSub,\n    Str,\n    Pending,\n    Templates,\n    UserDate,\n    MessageRepository,\n    MessageDrawerEvents,\n    MessageDrawerRouter,\n    MessageDrawerRoutes,\n    LazyLoadList,\n    MessageDrawerViewConversationContants\n) {\n\n    var SELECTORS = {\n        TOGGLE: '[data-region=\"toggle\"]',\n        CONVERSATION: '[data-conversation-id]',\n        BLOCKED_ICON_CONTAINER: '[data-region=\"contact-icon-blocked\"]',\n        LAST_MESSAGE: '[data-region=\"last-message\"]',\n        LAST_MESSAGE_DATE: '[data-region=\"last-message-date\"]',\n        MUTED_ICON_CONTAINER: '[data-region=\"muted-icon-container\"]',\n        UNREAD_COUNT: '[data-region=\"unread-count\"]',\n        SECTION_TOTAL_COUNT: '[data-region=\"section-total-count\"]',\n        SECTION_TOTAL_COUNT_CONTAINER: '[data-region=\"section-total-count-container\"]',\n        SECTION_UNREAD_COUNT: '[data-region=\"section-unread-count\"]',\n        PLACEHOLDER_CONTAINER: '[data-region=\"placeholder-container\"]'\n    };\n\n    var TEMPLATES = {\n        CONVERSATIONS_LIST: 'core_message/message_drawer_conversations_list',\n        CONVERSATIONS_LIST_ITEMS_PLACEHOLDER: 'core_message/message_drawer_conversations_list_items_placeholder'\n    };\n\n    var LOAD_LIMIT = 50;\n    var loadedConversationsById = {};\n    var loadedTotalCounts = false;\n    var loadedUnreadCounts = false;\n\n    /**\n     * Get the section visibility status.\n     *\n     * @param  {Object} root The section container element.\n     * @return {Bool} Is section visible.\n     */\n    var isVisible = function(root) {\n        return LazyLoadList.getRoot(root).hasClass('show');\n    };\n\n    /**\n     * Set this section as expanded.\n     *\n     * @param  {Object} root The section container element.\n     */\n    var setExpanded = function(root) {\n        root.addClass('expanded');\n    };\n\n    /**\n     * Set this section as collapsed.\n     *\n     * @param  {Object} root The section container element.\n     */\n    var setCollapsed = function(root) {\n        root.removeClass('expanded');\n    };\n\n    /**\n     * Render the total count value and show it for the user. Also update the placeholder\n     * HTML for better visuals.\n     *\n     * @param {Object} root The section container element.\n     * @param {Number} count The total count\n     */\n    var renderTotalCount = function(root, count) {\n        var container = root.find(SELECTORS.SECTION_TOTAL_COUNT_CONTAINER);\n        var countElement = container.find(SELECTORS.SECTION_TOTAL_COUNT);\n        countElement.text(count);\n        container.removeClass('hidden');\n        Str.get_string('totalconversations', 'core_message', count).done(function(string) {\n            container.attr('aria-label', string);\n        });\n\n        var numPlaceholders = count > 20 ? 20 : count;\n        // Array of \"true\" up to the number of placeholders we want.\n        var placeholders = Array.apply(null, Array(numPlaceholders)).map(function() {\n            return true;\n        });\n\n        // Replace the current placeholder (loading spinner) with some nicer placeholders that\n        // better represent the content.\n        Templates.render(TEMPLATES.CONVERSATIONS_LIST_ITEMS_PLACEHOLDER, {placeholders: placeholders})\n            .then(function(html) {\n                var placeholderContainer = root.find(SELECTORS.PLACEHOLDER_CONTAINER);\n                placeholderContainer.html(html);\n                return;\n            })\n            .catch(function() {\n                // Silently ignore. Doesn't matter if we can't render the placeholders.\n            });\n    };\n\n    /**\n     * Render the unread count value and show it for the user if it's higher than zero.\n     *\n     * @param {Object} root The section container element.\n     * @param {Number} count The unread count\n     */\n    var renderUnreadCount = function(root, count) {\n        var countElement = root.find(SELECTORS.SECTION_UNREAD_COUNT);\n        countElement.text(count);\n\n        Str.get_string('unreadconversations', 'core_message', count).done(function(string) {\n            countElement.attr('aria-label', string);\n        });\n\n        if (count > 0) {\n            countElement.removeClass('hidden');\n        }\n    };\n\n    /**\n     * Create a formatted conversation object from the the one we get from events. The new object\n     * will be in a format that matches what we receive from the server.\n     *\n     * @param {Object} conversation\n     * @return {Object} formatted conversation.\n     */\n    var formatConversationFromEvent = function(conversation) {\n        // Recursively lowercase all of the keys for an object.\n        var recursivelyLowercaseKeys = function(object) {\n            return Object.keys(object).reduce(function(carry, key) {\n                if ($.isArray(object[key])) {\n                    carry[key.toLowerCase()] = object[key].map(recursivelyLowercaseKeys);\n                } else {\n                    carry[key.toLowerCase()] = object[key];\n                }\n\n                return carry;\n            }, {});\n        };\n\n        // Recursively lowercase all of the keys for the conversation.\n        var formatted = recursivelyLowercaseKeys(conversation);\n\n        // Make sure all messages have the useridfrom property set.\n        formatted.messages = formatted.messages.map(function(message) {\n            message.useridfrom = message.userfrom.id;\n            return message;\n        });\n\n        return formatted;\n    };\n\n    /**\n     * Render the messages in the overview page.\n     *\n     * @param {Object} contentContainer Conversations content container.\n     * @param {Array} conversations List of conversations to render.\n     * @param {Number} userId Logged in user id.\n     * @return {Object} jQuery promise.\n     */\n    var render = function(conversations, userId) {\n\n        // Helper to format the last message for rendering.\n        // Returns a promise which resolves to either a string, or null\n        // (such as in the event of an empty personal space).\n        var pending = new Pending();\n\n        var formatMessagePreview = async function(lastMessage) {\n            if (!lastMessage) {\n                return null;\n            }\n            // Check the message html for a src attribute, indicative of media.\n            // Replace <img with <noimg to stop browsers pre-fetching the image as part of tmp element creation.\n            var tmpElement = document.createElement(\"element\");\n            tmpElement.innerHTML = lastMessage.text.replace(/<img /g, '<noimg ');\n            var isMedia = tmpElement.querySelector(\"[src]\") || false;\n\n            if (!isMedia) {\n                // Try to get the text value of the content.\n                // If that's not possible, we'll report it under the catch-all 'other media'.\n                var messagePreview = $(lastMessage.text).text();\n                if (messagePreview) {\n                    // The text value of the message must have no html/script tags.\n                    if (messagePreview.indexOf('<') == -1) {\n                        return messagePreview;\n                    }\n                }\n            }\n\n            // As a fallback, report unknowns as 'other media' type content.\n            var pix = 'i/messagecontentmultimediageneral';\n            var label = 'messagecontentmultimediageneral';\n\n            if (lastMessage.text.includes('<img')) {\n                pix = 'i/messagecontentimage';\n                label = 'messagecontentimage';\n            } else if (lastMessage.text.includes('<video')) {\n                pix = 'i/messagecontentvideo';\n                label = 'messagecontentvideo';\n            } else if (lastMessage.text.includes('<audio')) {\n                pix = 'i/messagecontentaudio';\n                label = 'messagecontentaudio';\n            }\n\n            try {\n                var labelString = await Str.get_string(label, 'core_message');\n                var icon = await Templates.renderPix(pix, 'core', labelString);\n                return icon + ' ' + labelString;\n            } catch (error) {\n                Notification.exception(error);\n                return null;\n            }\n        };\n\n        var mapPromises = conversations.map(function(conversation) {\n\n            var lastMessage = conversation.messages.length ? conversation.messages[conversation.messages.length - 1] : null;\n\n            return formatMessagePreview(lastMessage)\n                .then(function(messagePreview) {\n                    var formattedConversation = {\n                        id: conversation.id,\n                        imageurl: conversation.imageurl,\n                        name: conversation.name,\n                        subname: conversation.subname,\n                        unreadcount: conversation.unreadcount,\n                        ismuted: conversation.ismuted,\n                        lastmessagedate: lastMessage ? lastMessage.timecreated : null,\n                        sentfromcurrentuser: lastMessage ? lastMessage.useridfrom == userId : null,\n                        lastmessage: messagePreview\n                    };\n\n                    var otherUser = null;\n                    if (conversation.type == MessageDrawerViewConversationContants.CONVERSATION_TYPES.SELF) {\n                        // Self-conversations have only one member.\n                        otherUser = conversation.members[0];\n                    } else if (conversation.type == MessageDrawerViewConversationContants.CONVERSATION_TYPES.PRIVATE) {\n                        // For private conversations, remove the current userId from the members to get the other user.\n                        otherUser = conversation.members.reduce(function(carry, member) {\n                            if (!carry && member.id != userId) {\n                                carry = member;\n                            }\n                            return carry;\n                        }, null);\n                    }\n\n                    if (otherUser !== null) {\n                        formattedConversation.userid = otherUser.id;\n                        formattedConversation.showonlinestatus = otherUser.showonlinestatus;\n                        formattedConversation.isonline = otherUser.isonline;\n                        formattedConversation.isblocked = otherUser.isblocked;\n                    }\n\n                    if (conversation.type == MessageDrawerViewConversationContants.CONVERSATION_TYPES.PUBLIC) {\n                        formattedConversation.lastsendername = conversation.members.reduce(function(carry, member) {\n                            if (!carry && lastMessage && member.id == lastMessage.useridfrom) {\n                                carry = member.fullname;\n                            }\n                            return carry;\n                        }, null);\n                    }\n\n                    return formattedConversation;\n                }).catch(Notification.exception);\n        });\n\n        return Promise.all(mapPromises)\n            .then(function(formattedConversations) {\n                formattedConversations.forEach(function(conversation) {\n                    if (new Date().toDateString() == new Date(conversation.lastmessagedate * 1000).toDateString()) {\n                        conversation.istoday = true;\n                    }\n                });\n\n                return Templates.render(TEMPLATES.CONVERSATIONS_LIST, {conversations: formattedConversations});\n            }).then(function(html, js) {\n                pending.resolve();\n                return $.Deferred().resolve(html, js);\n            }).catch(function(error) {\n                pending.resolve();\n                Notification.exception(error);\n            });\n    };\n\n    /**\n     * Build the callback to load conversations.\n     *\n     * @param  {Array|null} types The conversation types for this section.\n     * @param  {bool} includeFavourites Include/exclude favourites.\n     * @param  {Number} offset Result offset\n     * @return {Function}\n     */\n    var getLoadCallback = function(types, includeFavourites, offset) {\n        // Note: This function is a bit messy because we've added the concept of loading\n        // multiple conversations types (e.g. private + self) at once but haven't properly\n        // updated the web service to accept an array of types. Instead we've added a new\n        // parameter for the self type which means we can only ever load self + other type.\n        // This should be improved to make it more extensible in the future. Adding new params\n        // for each type isn't very scalable.\n        var type = null;\n        // Include self conversations in the results by default.\n        var includeSelfConversations = true;\n        if (types && types.length) {\n            // Just get the conversation types that aren't \"self\" for now.\n            var nonSelfConversationTypes = types.filter(function(candidate) {\n                return candidate != MessageDrawerViewConversationContants.CONVERSATION_TYPES.SELF;\n            });\n            // If we're specifically asking for a list of types that doesn't include the self\n            // conversations then we don't need to include them.\n            includeSelfConversations = types.length != nonSelfConversationTypes.length;\n            // As mentioned above the webservice is currently limited to loading one type at a\n            // time (plus self conversations) so let's hope we never change this.\n            type = nonSelfConversationTypes[0];\n        }\n\n        return function(root, userId) {\n            return MessageRepository.getConversations(\n                    userId,\n                    type,\n                    LOAD_LIMIT + 1,\n                    offset,\n                    includeFavourites,\n                    includeSelfConversations\n                )\n                .then(function(response) {\n                    var conversations = response.conversations;\n\n                    if (conversations.length > LOAD_LIMIT) {\n                        conversations = conversations.slice(0, -1);\n                    } else {\n                        LazyLoadList.setLoadedAll(root, true);\n                    }\n\n                    offset = offset + LOAD_LIMIT;\n\n                    conversations.forEach(function(conversation) {\n                        loadedConversationsById[conversation.id] = conversation;\n                    });\n\n                    return conversations;\n                })\n                .catch(Notification.exception);\n        };\n    };\n\n    /**\n     * Get the total count container element.\n     *\n     * @param  {Object} root Overview messages container element.\n     * @return {Object} Total count container element.\n     */\n    var getTotalConversationCountElement = function(root) {\n        return root.find(SELECTORS.SECTION_TOTAL_COUNT);\n    };\n\n    /**\n     * Get the unread conversations count container element.\n     *\n     * @param  {Object} root Overview messages container element.\n     * @return {Object} Unread conversations count container element.\n     */\n    var getTotalUnreadConversationCountElement = function(root) {\n        return root.find(SELECTORS.SECTION_UNREAD_COUNT);\n    };\n\n    /**\n     * Increment the total conversations count.\n     *\n     * @param  {Object} root Overview messages container element.\n     */\n    var incrementTotalConversationCount = function(root) {\n        if (loadedTotalCounts) {\n            var element = getTotalConversationCountElement(root);\n            var count = parseInt(element.text());\n            count = count + 1;\n            element.text(count);\n        }\n    };\n\n    /**\n     * Decrement the total conversations count.\n     *\n     * @param  {Object} root Overview messages container element.\n     */\n    var decrementTotalConversationCount = function(root) {\n        if (loadedTotalCounts) {\n            var element = getTotalConversationCountElement(root);\n            var count = parseInt(element.text());\n            count = count - 1;\n            element.text(count);\n        }\n    };\n\n    /**\n     * Decrement the total unread conversations count.\n     *\n     * @param  {Object} root Overview messages container element.\n     */\n    var decrementTotalUnreadConversationCount = function(root) {\n        if (loadedUnreadCounts) {\n            var element = getTotalUnreadConversationCountElement(root);\n            var count = parseInt(element.text());\n            count = count - 1;\n            element.text(count);\n\n            if (count < 1) {\n                element.addClass('hidden');\n            }\n        }\n    };\n\n    /**\n     * Get a contact / conversation element.\n     *\n     * @param  {Object} root Overview messages container element.\n     * @param  {Number} conversationId The conversation id.\n     * @return {Object} Conversation element.\n     */\n    var getConversationElement = function(root, conversationId) {\n        return root.find('[data-conversation-id=\"' + conversationId + '\"]');\n    };\n\n    /**\n     * Get a contact / conversation element from a user id.\n     *\n     * @param  {Object} root Overview messages container element.\n     * @param  {Number} userId The user id.\n     * @return {Object} Conversation element.\n     */\n    var getConversationElementFromUserId = function(root, userId) {\n        return root.find('[data-user-id=\"' + userId + '\"]');\n    };\n\n    /**\n     * Show the conversation is muted icon.\n     *\n     * @param  {Object} conversationElement The conversation element.\n     */\n    var muteConversation = function(conversationElement) {\n        conversationElement.find(SELECTORS.MUTED_ICON_CONTAINER).removeClass('hidden');\n    };\n\n    /**\n     * Hide the conversation is muted icon.\n     *\n     * @param  {Object} conversationElement The conversation element.\n     */\n    var unmuteConversation = function(conversationElement) {\n        conversationElement.find(SELECTORS.MUTED_ICON_CONTAINER).addClass('hidden');\n    };\n\n    /**\n     * Show the contact is blocked icon.\n     *\n     * @param  {Object} conversationElement The conversation element.\n     */\n    var blockContact = function(conversationElement) {\n        conversationElement.find(SELECTORS.BLOCKED_ICON_CONTAINER).removeClass('hidden');\n    };\n\n    /**\n     * Hide the contact is blocked icon.\n     *\n     * @param  {Object} conversationElement The conversation element.\n     */\n    var unblockContact = function(conversationElement) {\n        conversationElement.find(SELECTORS.BLOCKED_ICON_CONTAINER).addClass('hidden');\n    };\n\n    /**\n     * Create an render new conversation element in the list of conversations.\n     *\n     * @param  {Object} root Overview messages container element.\n     * @param  {Object} conversation The conversation.\n     * @param  {Number} userId The logged in user id.\n     * @return {Object} jQuery promise\n     */\n    var createNewConversationFromEvent = function(root, conversation, userId) {\n        var existingConversations = root.find(SELECTORS.CONVERSATION);\n\n        if (!existingConversations.length) {\n            // If we didn't have any conversations then we need to show\n            // the content of the list and hide the empty message.\n            var listRoot = LazyLoadList.getRoot(root);\n            LazyLoadList.showContent(listRoot);\n            LazyLoadList.hideEmptyMessage(listRoot);\n        }\n\n        // Cache the conversation.\n        loadedConversationsById[conversation.id] = conversation;\n\n        return render([conversation], userId)\n            .then(function(html) {\n                var contentContainer = LazyLoadList.getContentContainer(root);\n                return contentContainer.prepend(html);\n            })\n            .then(function() {\n                return incrementTotalConversationCount(root);\n            })\n            .catch(Notification.exception);\n    };\n\n    /**\n     * Delete a conversation from the list of conversations.\n     *\n     * @param  {Object} root Overview messages container element.\n     * @param  {Object} conversationElement The conversation element.\n     */\n    var deleteConversation = function(root, conversationElement) {\n        conversationElement.remove();\n        decrementTotalConversationCount(root);\n\n        var conversations = root.find(SELECTORS.CONVERSATION);\n        if (!conversations.length) {\n            // If we don't have any conversations then we need to hide\n            // the content of the list and show the empty message.\n            var listRoot = LazyLoadList.getRoot(root);\n            LazyLoadList.hideContent(listRoot);\n            LazyLoadList.showEmptyMessage(listRoot);\n        }\n    };\n\n    /**\n     * Mark a conversation as read.\n     *\n     * @param  {Object} root Overview messages container element.\n     * @param  {Object} conversationElement The conversation element.\n     */\n    var markConversationAsRead = function(root, conversationElement) {\n        var unreadCount = conversationElement.find(SELECTORS.UNREAD_COUNT);\n        unreadCount.text('0');\n        unreadCount.addClass('hidden');\n        decrementTotalUnreadConversationCount(root);\n    };\n\n    /**\n     * Listen to, and handle events in this section.\n     *\n     * @param {String} namespace Unique identifier for the Routes\n     * @param {Object} root The section container element.\n     * @param {Function} loadCallback The callback to load items.\n     * @param {Array|null} types The conversation types for this section\n     * @param {bool} includeFavourites If this section includes favourites\n     * @param {String} fromPanel Routing argument to send if the section is loaded in message index left panel.\n     */\n    var registerEventListeners = function(namespace, root, loadCallback, types, includeFavourites, fromPanel) {\n        var listRoot = LazyLoadList.getRoot(root);\n        var conversationBelongsToThisSection = function(conversation) {\n            // Make sure the type is an int so that the index of check matches correctly.\n            var conversationType = parseInt(conversation.type, 10);\n            if (\n                // If the conversation type isn't one this section cares about then we can ignore it.\n                (types && types.indexOf(conversationType) < 0) ||\n                // If this is the favourites section and the conversation isn't a favourite then ignore it.\n                (includeFavourites && !conversation.isFavourite) ||\n                // If this section doesn't include favourites and the conversation is a favourite then ignore it.\n                (!includeFavourites && conversation.isFavourite)\n            ) {\n                return false;\n            }\n\n            return true;\n        };\n\n        // Set the minimum height of the section to the height of the toggle. This\n        // smooths out the collapse animation.\n        var toggle = root.find(SELECTORS.TOGGLE);\n        root.css('min-height', toggle.outerHeight());\n\n        root.on('show.bs.collapse', function() {\n            setExpanded(root);\n            LazyLoadList.show(listRoot, loadCallback, function(contentContainer, conversations, userId) {\n                return render(conversations, userId)\n                    .then(function(html) {\n                        contentContainer.append(html);\n                        return html;\n                    })\n                    .catch(Notification.exception);\n            });\n        });\n\n        root.on('hidden.bs.collapse', function() {\n            setCollapsed(root);\n        });\n\n        PubSub.subscribe(MessageDrawerEvents.CONTACT_BLOCKED, function(userId) {\n            var conversationElement = getConversationElementFromUserId(root, userId);\n            if (conversationElement.length) {\n                blockContact(conversationElement);\n            }\n        });\n\n        PubSub.subscribe(MessageDrawerEvents.CONTACT_UNBLOCKED, function(userId) {\n            var conversationElement = getConversationElementFromUserId(root, userId);\n\n            if (conversationElement.length) {\n                unblockContact(conversationElement);\n            }\n        });\n\n        PubSub.subscribe(MessageDrawerEvents.CONVERSATION_SET_MUTED, function(conversation) {\n            var conversationId = conversation.id;\n            var conversationElement = getConversationElement(root, conversationId);\n            if (conversationElement.length) {\n                muteConversation(conversationElement);\n            }\n        });\n\n        PubSub.subscribe(MessageDrawerEvents.CONVERSATION_UNSET_MUTED, function(conversation) {\n            var conversationId = conversation.id;\n            var conversationElement = getConversationElement(root, conversationId);\n            if (conversationElement.length) {\n                unmuteConversation(conversationElement);\n            }\n        });\n\n        PubSub.subscribe(MessageDrawerEvents.CONVERSATION_NEW_LAST_MESSAGE, function(conversation) {\n            if (!conversationBelongsToThisSection(conversation)) {\n                return;\n            }\n\n            var loggedInUserId = conversation.loggedInUserId;\n            var conversationId = conversation.id;\n            var element = getConversationElement(root, conversationId);\n            conversation = formatConversationFromEvent(conversation);\n            if (element.length) {\n                var contentContainer = LazyLoadList.getContentContainer(root);\n                render([conversation], loggedInUserId)\n                    .then(function(html) {\n                            contentContainer.prepend(html);\n                            element.remove();\n                            return html;\n                        })\n                    .catch(Notification.exception);\n            } else {\n                createNewConversationFromEvent(root, conversation, loggedInUserId);\n            }\n        });\n\n        PubSub.subscribe(MessageDrawerEvents.CONVERSATION_DELETED, function(conversationId) {\n            var conversationElement = getConversationElement(root, conversationId);\n            delete loadedConversationsById[conversationId];\n            if (conversationElement.length) {\n                deleteConversation(root, conversationElement);\n            }\n        });\n\n        PubSub.subscribe(MessageDrawerEvents.CONVERSATION_READ, function(conversationId) {\n            var conversationElement = getConversationElement(root, conversationId);\n            if (conversationElement.length) {\n                markConversationAsRead(root, conversationElement);\n            }\n        });\n\n        PubSub.subscribe(MessageDrawerEvents.CONVERSATION_SET_FAVOURITE, function(conversation) {\n            var conversationElement = null;\n            if (conversationBelongsToThisSection(conversation)) {\n                conversationElement = getConversationElement(root, conversation.id);\n                if (!conversationElement.length) {\n                    createNewConversationFromEvent(\n                        root,\n                        formatConversationFromEvent(conversation),\n                        conversation.loggedInUserId\n                    );\n                }\n            } else {\n                conversationElement = getConversationElement(root, conversation.id);\n                if (conversationElement.length) {\n                    deleteConversation(root, conversationElement);\n                }\n            }\n        });\n\n        PubSub.subscribe(MessageDrawerEvents.CONVERSATION_UNSET_FAVOURITE, function(conversation) {\n            var conversationElement = null;\n            if (conversationBelongsToThisSection(conversation)) {\n                conversationElement = getConversationElement(root, conversation.id);\n                if (!conversationElement.length) {\n                    createNewConversationFromEvent(\n                        root,\n                        formatConversationFromEvent(conversation),\n                        conversation.loggedInUserId\n                    );\n                }\n            } else {\n                conversationElement = getConversationElement(root, conversation.id);\n                if (conversationElement.length) {\n                    deleteConversation(root, conversationElement);\n                }\n            }\n        });\n\n        CustomEvents.define(root, [CustomEvents.events.activate]);\n        root.on(CustomEvents.events.activate, SELECTORS.CONVERSATION, function(e, data) {\n            var conversationElement = $(e.target).closest(SELECTORS.CONVERSATION);\n            var conversationId = conversationElement.attr('data-conversation-id');\n            var conversation = loadedConversationsById[conversationId];\n            MessageDrawerRouter.go(namespace, MessageDrawerRoutes.VIEW_CONVERSATION, conversation, fromPanel);\n\n            data.originalEvent.preventDefault();\n        });\n    };\n\n    /**\n     * Setup the section.\n     *\n     * @param {String} namespace Unique identifier for the Routes\n     * @param {Object} header The header container element.\n     * @param {Object} body The section container element.\n     * @param {Object} footer The footer container element.\n     * @param {Array} types The conversation types that show in this section\n     * @param {bool} includeFavourites If this section includes favourites\n     * @param {Object} totalCountPromise Resolves wth the total conversations count\n     * @param {Object} unreadCountPromise Resolves wth the unread conversations count\n     * @param {bool} fromPanel shown in message app panel.\n     */\n    var show = function(namespace, header, body, footer, types, includeFavourites, totalCountPromise, unreadCountPromise,\n        fromPanel) {\n        var root = $(body);\n\n        if (!root.attr('data-init')) {\n            var loadCallback = getLoadCallback(types, includeFavourites, 0);\n            registerEventListeners(namespace, root, loadCallback, types, includeFavourites, fromPanel);\n\n            if (isVisible(root)) {\n                setExpanded(root);\n                var listRoot = LazyLoadList.getRoot(root);\n                LazyLoadList.show(listRoot, loadCallback, function(contentContainer, conversations, userId) {\n                    return render(conversations, userId)\n                        .then(function(html) {\n                            contentContainer.append(html);\n                            return html;\n                        })\n                        .catch(Notification.exception);\n                });\n            }\n\n            // This is given to us by the calling code because the total counts for all sections\n            // are loaded in a single ajax request rather than one request per section.\n            totalCountPromise.then(function(count) {\n                renderTotalCount(root, count);\n                loadedTotalCounts = true;\n                return;\n            })\n            .catch(function() {\n                // Silently ignore if we can't updated the counts. No need to bother the user.\n            });\n\n            // This is given to us by the calling code because the unread counts for all sections\n            // are loaded in a single ajax request rather than one request per section.\n            unreadCountPromise.then(function(count) {\n                renderUnreadCount(root, count);\n                loadedUnreadCounts = true;\n                return;\n            })\n            .catch(function() {\n                // Silently ignore if we can't updated the counts. No need to bother the user.\n            });\n\n            root.attr('data-init', true);\n        }\n    };\n\n    return {\n        show: show,\n        isVisible: isVisible\n    };\n});\n"],"file":"message_drawer_view_overview_section.min.js"}