/
var
/
www
/
html
/
lgpd
/
message
/
amd
/
build
/
Upload File
HOME
{"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"}