Current Path : /var/www/ljmtc/cbt/message/amd/build/ |
Current File : /var/www/ljmtc/cbt/message/amd/build/message_drawer_view_conversation_renderer.min.js.map |
{"version":3,"sources":["../src/message_drawer_view_conversation_renderer.js"],"names":["define","$","Notification","Str","Templates","UserDate","Constants","Aria","SELECTORS","TEMPLATES","CONVERSATION_TYPES","getMessagesContainer","body","find","CONTENT_MESSAGES_CONTAINER","showMessagesContainer","removeClass","hideMessagesContainer","addClass","getSelfConversationMessageContainer","SELF_CONVERSATION_MESSAGE_CONTAINER","hideSelfConversationMessageContainer","getContactRequestSentContainer","CONTACT_REQUEST_SENT_MESSAGE_CONTAINER","hideContactRequestSentContainer","getFooterContentContainer","footer","CONTENT_MESSAGES_FOOTER_CONTAINER","showFooterContent","hideFooterContent","getFooterEditModeContainer","CONTENT_MESSAGES_FOOTER_EDIT_MODE_CONTAINER","showFooterEditMode","hideFooterEditMode","getFooterPlaceholderContainer","PLACEHOLDER_CONTAINER","showFooterPlaceholder","hideFooterPlaceholder","getFooterRequireContactContainer","CONTENT_MESSAGES_FOOTER_REQUIRE_CONTACT_CONTAINER","showFooterRequireContact","hideFooterRequireContact","getFooterRequireUnblockContainer","CONTENT_MESSAGES_FOOTER_REQUIRE_UNBLOCK_CONTAINER","showFooterRequireUnblock","hideFooterRequireUnblock","getFooterUnableToMessageContainer","CONTENT_MESSAGES_FOOTER_UNABLE_TO_MESSAGE_CONTAINER","showFooterUnableToMessage","hideFooterUnableToMessage","hideAllHeaderElements","header","hideHeaderContent","hideHeaderEditMode","hideHeaderPlaceholder","hideAllFooterElements","getContentPlaceholderContainer","CONTENT_PLACEHOLDER_CONTAINER","showContentPlaceholder","hideContentPlaceholder","getHeaderContent","HEADER","showHeaderContent","getHeaderEditMode","HEADER_EDIT_MODE","showHeaderEditMode","getHeaderPlaceholderContainer","HEADER_PLACEHOLDER_CONTAINER","showHeaderPlaceholder","getEmojiPickerContainer","EMOJI_PICKER_CONTAINER","getEmojiAutoCompleteContainer","EMOJI_AUTO_COMPLETE_CONTAINER","getMessageElement","messageId","messagesContainer","getDayElement","dayTimeCreated","getMoreMessagesLoadingIconContainer","MORE_MESSAGES_LOADING_ICON_CONTAINER","showMoreMessagesLoadingIcon","hideMoreMessagesLoadingIcon","getConfirmDialogueContainer","root","CONFIRM_DIALOGUE_CONTAINER","showConfirmDialogueContainer","container","siblings","hide","get","attr","hideConfirmDialogueContainer","unhide","removeAttr","setMessagesSelectedCount","value","MESSAGES_SELECTED_COUNT","text","formatMessagesForTemplate","messages","datesCache","map","message","id","isread","isRead","fromloggedinuser","fromLoggedInUser","userfrom","userFrom","formattedtime","timeCreated","renderAddDays","days","daysRenderPromises","data","render","DAY","timestamp","when","apply","then","forEach","index","html","before","element","insertBefore","append","catch","renderAddMessages","messagesData","formattedMessages","MESSAGES","messageList","messageHtml","dayContainer","day","dayMessagesContainer","DAY_MESSAGES_CONTAINER","renderUpdateMessages","after","formattedTime","LOADING_ICON_CONTAINER","TIME_CREATED","sendState","loading","time","retry","RETRY_SEND","TEXT_CONTAINER","errorMessage","messageContainer","ERROR_MESSAGE_CONTAINER","ERROR_MESSAGE","renderRemoveDays","remove","renderRemoveMessages","renderConversation","renderingPromises","hasAddDays","add","length","hasAddMessages","hasUpdateMessages","update","timestampsToFormat","datesCachePromise","Deferred","resolve","promise","concat","reduce","carry","timestamps","push","get_string","format","requests","formattedTimes","renderHeader","headerContainer","template","HEADER_PUBLIC","context","showrouteback","type","PRIVATE","showControls","HEADER_PRIVATE","HEADER_PRIVATE_NO_CONTROLS","SELF","HEADER_SELF","js","replaceNodeContents","renderFooter","get_strings","key","component","param","user","fullname","strings","title","footerContainer","TITLE","TEXT","renderScrollToMessage","messageElement","position","scrollTop","top","renderLoadingMembers","isLoadingMembers","renderLoadingFirstMessages","isLoadingFirstMessages","renderLoadingMessages","isLoading","renderShowEmojiPicker","show","EMOJI_PICKER_SEARCH_INPUT","focus","renderShowEmojiAutoComplete","showConfirmDialogue","buttonSelectors","bodyText","headerText","canCancel","skipHeader","showOk","dialogue","buttons","selector","cancelButton","CONFIRM_DIALOGUE_CANCEL_BUTTON","okayButton","CONFIRM_DIALOGUE_OKAY_BUTTON","CONFIRM_DIALOGUE_TEXT","dialogueHeader","CONFIRM_DIALOGUE_HEADER","confirmDialogue","CONFIRM_DIALOGUE","prepend","button","CAN_RECEIVE_FOCUS","filter","first","hideConfirmDialogue","hideCheckDeleteDialogue","renderConfirmBlockUser","canmessageevenifblocked","string","ACTION_CONFIRM_BLOCK","renderConfirmUnblockUser","ACTION_CONFIRM_UNBLOCK","renderConfirmAddContact","ACTION_CONFIRM_ADD_CONTACT","renderConfirmRemoveContact","ACTION_CONFIRM_REMOVE_CONTACT","renderConfirmDeleteSelectedMessages","showmessage","canDeleteMessagesForAllUsers","showCheckDeleteDialogue","ACTION_CONFIRM_DELETE_SELECTED_MESSAGES","renderConfirmDeleteConversation","ACTION_CONFIRM_DELETE_CONVERSATION","renderConfirmContactRequest","ACTION_ACCEPT_CONTACT_REQUEST","ACTION_DECLINE_CONTACT_REQUEST","checkboxRegion","DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE_CONTAINER","checkbox","DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE","prop","renderIsBlocked","isBlocked","ACTION_REQUEST_BLOCK","ACTION_REQUEST_UNBLOCK","renderIsFavourite","state","favouriteIcon","FAVOURITE_ICON_CONTAINER","addFavourite","ACTION_CONFIRM_FAVOURITE","removeFavourite","ACTION_CONFIRM_UNFAVOURITE","renderIsMuted","muteIcon","MUTED_ICON_CONTAINER","setMuted","ACTION_CONFIRM_MUTE","unsetMuted","ACTION_CONFIRM_UNMUTE","renderIsContact","addContact","ACTION_REQUEST_ADD_CONTACT","removeContact","ACTION_REQUEST_REMOVE_CONTACT","renderLoadingConfirmAction","buttonText","CONFIRM_DIALOGUE_BUTTON_TEXT","loadingIcon","renderInEditMode","inEditMode","MESSAGE_NOT_SELECTED","MESSAGE_NOT_SELECTED_ICON","MESSAGE_SELECTED_ICON","renderSelectedMessages","hasSelectedMessages","count","renderRequireAddContact","hasMessages","renderSelfConversationMessage","displayMessage","renderContactRequestSent","userFullName","renderReset","patch","configs","reset","conversation","confirmBlockUser","confirmUnblockUser","confirmAddContact","confirmRemoveContact","confirmDeleteSelectedMessages","confirmDeleteConversation","confirmContactRequest","requireAddContact","selfConversationMessage","contactRequestSent","loadingMembers","loadingFirstMessages","loadingMessages","isContact","isFavourite","isMuted","loadingConfirmAction","showEmojiPicker","showEmojiAutoComplete","scrollToMessage","selectedMessages","processConfig","config","results","hasOwnProperty","renderFunc","patchValue","i","exception"],"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 * This module updates the UI for the conversation page in the message\n * drawer.\n *\n * The module will take a patch from the message_drawer_view_conversation_patcher\n * module and update the UI to reflect the changes.\n *\n * This is the only module that ever modifies the UI of the conversation page.\n *\n * @module core_message/message_drawer_view_conversation_renderer\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/notification',\n 'core/str',\n 'core/templates',\n 'core/user_date',\n 'core_message/message_drawer_view_conversation_constants',\n 'core/aria',\n],\nfunction(\n $,\n Notification,\n Str,\n Templates,\n UserDate,\n Constants,\n Aria\n) {\n var SELECTORS = Constants.SELECTORS;\n var TEMPLATES = Constants.TEMPLATES;\n var CONVERSATION_TYPES = Constants.CONVERSATION_TYPES;\n\n /**\n * Get the messages container element.\n *\n * @param {Object} body Conversation body container element.\n * @return {Object} The messages container element.\n */\n var getMessagesContainer = function(body) {\n return body.find(SELECTORS.CONTENT_MESSAGES_CONTAINER);\n };\n\n /**\n * Show the messages container element.\n *\n * @param {Object} body Conversation body container element.\n */\n var showMessagesContainer = function(body) {\n getMessagesContainer(body).removeClass('hidden');\n };\n\n /**\n * Hide the messages container element.\n *\n * @param {Object} body Conversation body container element.\n */\n var hideMessagesContainer = function(body) {\n getMessagesContainer(body).addClass('hidden');\n };\n\n /**\n * Get the self-conversation message container element.\n *\n * @param {Object} body Conversation body container element.\n * @return {Object} The messages container element.\n */\n var getSelfConversationMessageContainer = function(body) {\n return body.find(SELECTORS.SELF_CONVERSATION_MESSAGE_CONTAINER);\n };\n\n /**\n * Hide the self-conversation message container element.\n *\n * @param {Object} body Conversation body container element.\n * @return {Object} The messages container element.\n */\n var hideSelfConversationMessageContainer = function(body) {\n return getSelfConversationMessageContainer(body).addClass('hidden');\n };\n\n /**\n * Get the contact request sent container element.\n *\n * @param {Object} body Conversation body container element.\n * @return {Object} The messages container element.\n */\n var getContactRequestSentContainer = function(body) {\n return body.find(SELECTORS.CONTACT_REQUEST_SENT_MESSAGE_CONTAINER);\n };\n\n /**\n * Hide the contact request sent container element.\n *\n * @param {Object} body Conversation body container element.\n * @return {Object} The messages container element.\n */\n var hideContactRequestSentContainer = function(body) {\n return getContactRequestSentContainer(body).addClass('hidden');\n };\n\n /**\n * Get the footer container element.\n *\n * @param {Object} footer Conversation footer container element.\n * @return {Object} The footer container element.\n */\n var getFooterContentContainer = function(footer) {\n return footer.find(SELECTORS.CONTENT_MESSAGES_FOOTER_CONTAINER);\n };\n\n /**\n * Show the footer container element.\n *\n * @param {Object} footer Conversation footer container element.\n */\n var showFooterContent = function(footer) {\n getFooterContentContainer(footer).removeClass('hidden');\n };\n\n /**\n * Hide the footer container element.\n *\n * @param {Object} footer Conversation footer container element.\n */\n var hideFooterContent = function(footer) {\n getFooterContentContainer(footer).addClass('hidden');\n };\n\n /**\n * Get the footer edit mode container element.\n *\n * @param {Object} footer Conversation footer container element.\n * @return {Object} The footer container element.\n */\n var getFooterEditModeContainer = function(footer) {\n return footer.find(SELECTORS.CONTENT_MESSAGES_FOOTER_EDIT_MODE_CONTAINER);\n };\n\n /**\n * Show the footer edit mode container element.\n *\n * @param {Object} footer Conversation footer container element.\n */\n var showFooterEditMode = function(footer) {\n getFooterEditModeContainer(footer).removeClass('hidden');\n };\n\n /**\n * Hide the footer edit mode container element.\n *\n * @param {Object} footer Conversation footer container element.\n */\n var hideFooterEditMode = function(footer) {\n getFooterEditModeContainer(footer).addClass('hidden');\n };\n\n /**\n * Get the footer placeholder.\n *\n * @param {Object} footer Conversation footer container element.\n * @return {Object} The footer placeholder container element.\n */\n var getFooterPlaceholderContainer = function(footer) {\n return footer.find(SELECTORS.PLACEHOLDER_CONTAINER);\n };\n\n /**\n * Show the footer placeholder\n *\n * @param {Object} footer Conversation footer container element.\n */\n var showFooterPlaceholder = function(footer) {\n getFooterPlaceholderContainer(footer).removeClass('hidden');\n };\n\n /**\n * Hide the footer placeholder\n *\n * @param {Object} footer Conversation footer container element.\n */\n var hideFooterPlaceholder = function(footer) {\n getFooterPlaceholderContainer(footer).addClass('hidden');\n };\n\n /**\n * Get the footer Require add as contact container element.\n *\n * @param {Object} footer Conversation footer container element.\n * @return {Object} The footer Require add as contact container element.\n */\n var getFooterRequireContactContainer = function(footer) {\n return footer.find(SELECTORS.CONTENT_MESSAGES_FOOTER_REQUIRE_CONTACT_CONTAINER);\n };\n\n /**\n * Show the footer add as contact dialogue.\n *\n * @param {Object} footer Conversation footer container element.\n */\n var showFooterRequireContact = function(footer) {\n getFooterRequireContactContainer(footer).removeClass('hidden');\n };\n\n /**\n * Hide the footer add as contact dialogue.\n *\n * @param {Object} footer Conversation footer container element.\n */\n var hideFooterRequireContact = function(footer) {\n getFooterRequireContactContainer(footer).addClass('hidden');\n };\n\n /**\n * Get the footer Required to unblock contact container element.\n *\n * @param {Object} footer Conversation footer container element.\n * @return {Object} The footer Required to unblock contact container element.\n */\n var getFooterRequireUnblockContainer = function(footer) {\n return footer.find(SELECTORS.CONTENT_MESSAGES_FOOTER_REQUIRE_UNBLOCK_CONTAINER);\n };\n\n /**\n * Show the footer Required to unblock contact container element.\n *\n * @param {Object} footer Conversation footer container element.\n */\n var showFooterRequireUnblock = function(footer) {\n getFooterRequireUnblockContainer(footer).removeClass('hidden');\n };\n\n /**\n * Hide the footer Required to unblock contact container element.\n *\n * @param {Object} footer Conversation footer container element.\n */\n var hideFooterRequireUnblock = function(footer) {\n getFooterRequireUnblockContainer(footer).addClass('hidden');\n };\n\n /**\n * Get the footer Unable to message contact container element.\n *\n * @param {Object} footer Conversation footer container element.\n * @return {Object} The footer Unable to message contact container element.\n */\n var getFooterUnableToMessageContainer = function(footer) {\n return footer.find(SELECTORS.CONTENT_MESSAGES_FOOTER_UNABLE_TO_MESSAGE_CONTAINER);\n };\n\n /**\n * Show the footer Unable to message contact container element.\n *\n * @param {Object} footer Conversation footer container element.\n */\n var showFooterUnableToMessage = function(footer) {\n getFooterUnableToMessageContainer(footer).removeClass('hidden');\n };\n\n /**\n * Hide the footer Unable to message contact container element.\n *\n * @param {Object} footer Conversation footer container element.\n */\n var hideFooterUnableToMessage = function(footer) {\n getFooterUnableToMessageContainer(footer).addClass('hidden');\n };\n\n /**\n * Hide all header elements.\n *\n * @param {Object} header Conversation header container element.\n */\n var hideAllHeaderElements = function(header) {\n hideHeaderContent(header);\n hideHeaderEditMode(header);\n hideHeaderPlaceholder(header);\n };\n\n /**\n * Hide all footer dialogues and messages.\n *\n * @param {Object} footer Conversation footer container element.\n */\n var hideAllFooterElements = function(footer) {\n hideFooterContent(footer);\n hideFooterEditMode(footer);\n hideFooterPlaceholder(footer);\n hideFooterRequireContact(footer);\n hideFooterRequireUnblock(footer);\n hideFooterUnableToMessage(footer);\n };\n\n /**\n * Get the content placeholder container element.\n *\n * @param {Object} body Conversation body container element.\n * @return {Object} The body placeholder container element.\n */\n var getContentPlaceholderContainer = function(body) {\n return body.find(SELECTORS.CONTENT_PLACEHOLDER_CONTAINER);\n };\n\n /**\n * Show the content placeholder.\n *\n * @param {Object} body Conversation body container element.\n */\n var showContentPlaceholder = function(body) {\n getContentPlaceholderContainer(body).removeClass('hidden');\n };\n\n /**\n * Hide the content placeholder.\n *\n * @param {Object} body Conversation body container element.\n */\n var hideContentPlaceholder = function(body) {\n getContentPlaceholderContainer(body).addClass('hidden');\n };\n\n /**\n * Get the header content container element.\n *\n * @param {Object} header Conversation header container element.\n * @return {Object} The header content container element.\n */\n var getHeaderContent = function(header) {\n return header.find(SELECTORS.HEADER);\n };\n\n /**\n * Show the header content.\n *\n * @param {Object} header Conversation header container element.\n */\n var showHeaderContent = function(header) {\n getHeaderContent(header).removeClass('hidden');\n };\n\n /**\n * Hide the header content.\n *\n * @param {Object} header Conversation header container element.\n */\n var hideHeaderContent = function(header) {\n getHeaderContent(header).addClass('hidden');\n };\n\n /**\n * Get the header edit mode container element.\n *\n * @param {Object} header Conversation header container element.\n * @return {Object} The header content container element.\n */\n var getHeaderEditMode = function(header) {\n return header.find(SELECTORS.HEADER_EDIT_MODE);\n };\n\n /**\n * Show the header edit mode container.\n *\n * @param {Object} header Conversation header container element.\n */\n var showHeaderEditMode = function(header) {\n getHeaderEditMode(header).removeClass('hidden');\n };\n\n /**\n * Hide the header edit mode container.\n *\n * @param {Object} header Conversation header container element.\n */\n var hideHeaderEditMode = function(header) {\n getHeaderEditMode(header).addClass('hidden');\n };\n\n /**\n * Get the header placeholder container element.\n *\n * @param {Object} header Conversation header container element.\n * @return {Object} The header placeholder container element.\n */\n var getHeaderPlaceholderContainer = function(header) {\n return header.find(SELECTORS.HEADER_PLACEHOLDER_CONTAINER);\n };\n\n /**\n * Show the header placeholder.\n *\n * @param {Object} header Conversation header container element.\n */\n var showHeaderPlaceholder = function(header) {\n getHeaderPlaceholderContainer(header).removeClass('hidden');\n };\n\n /**\n * Hide the header placeholder.\n *\n * @param {Object} header Conversation header container element.\n */\n var hideHeaderPlaceholder = function(header) {\n getHeaderPlaceholderContainer(header).addClass('hidden');\n };\n\n /**\n * Get the emoji picker container element.\n *\n * @param {Object} footer Conversation footer container element.\n * @return {Object} The emoji picker container element.\n */\n var getEmojiPickerContainer = function(footer) {\n return footer.find(SELECTORS.EMOJI_PICKER_CONTAINER);\n };\n\n /**\n * Get the emoji picker container element.\n *\n * @param {Object} footer Conversation footer container element.\n * @return {Object} The emoji picker container element.\n */\n var getEmojiAutoCompleteContainer = function(footer) {\n return footer.find(SELECTORS.EMOJI_AUTO_COMPLETE_CONTAINER);\n };\n\n /**\n * Get a message element.\n *\n * @param {Object} body Conversation body container element.\n * @param {Number} messageId the Message id.\n * @return {Object} A message element from the conversation.\n */\n var getMessageElement = function(body, messageId) {\n var messagesContainer = getMessagesContainer(body);\n return messagesContainer.find('[data-message-id=\"' + messageId + '\"]');\n };\n\n /**\n * Get the day container element. The day container element holds a list of messages for that day.\n *\n * @param {Object} body Conversation body container element.\n * @param {Number} dayTimeCreated Midnight timestamp for the day.\n * @return {Object} jQuery object\n */\n var getDayElement = function(body, dayTimeCreated) {\n var messagesContainer = getMessagesContainer(body);\n return messagesContainer.find('[data-day-id=\"' + dayTimeCreated + '\"]');\n };\n\n /**\n * Get the more messages loading icon container element.\n *\n * @param {Object} body Conversation body container element.\n * @return {Object} The more messages loading container element.\n */\n var getMoreMessagesLoadingIconContainer = function(body) {\n return body.find(SELECTORS.MORE_MESSAGES_LOADING_ICON_CONTAINER);\n };\n\n /**\n * Show the more messages loading icon.\n *\n * @param {Object} body Conversation body container element.\n */\n var showMoreMessagesLoadingIcon = function(body) {\n getMoreMessagesLoadingIconContainer(body).removeClass('hidden');\n };\n\n /**\n * Hide the more messages loading icon.\n *\n * @param {Object} body Conversation body container element.\n */\n var hideMoreMessagesLoadingIcon = function(body) {\n getMoreMessagesLoadingIconContainer(body).addClass('hidden');\n };\n\n /**\n * Get the confirm dialogue container element.\n *\n * @param {Object} root The container element to search.\n * @return {Object} The confirm dialogue container element.\n */\n var getConfirmDialogueContainer = function(root) {\n return root.find(SELECTORS.CONFIRM_DIALOGUE_CONTAINER);\n };\n\n /**\n * Show the confirm dialogue container element.\n *\n * @param {Object} root The container element containing a dialogue.\n */\n var showConfirmDialogueContainer = function(root) {\n var container = getConfirmDialogueContainer(root);\n var siblings = container.siblings(':not(.hidden)');\n Aria.hide(siblings.get());\n siblings.attr('data-confirm-dialogue-hidden', true);\n\n container.removeClass('hidden');\n };\n\n /**\n * Hide the confirm dialogue container element.\n *\n * @param {Object} root The container element containing a dialogue.\n */\n var hideConfirmDialogueContainer = function(root) {\n var container = getConfirmDialogueContainer(root);\n var siblings = container.siblings('[data-confirm-dialogue-hidden=\"true\"]');\n Aria.unhide(siblings.get());\n siblings.removeAttr('data-confirm-dialogue-hidden');\n\n container.addClass('hidden');\n };\n\n /**\n * Set the number of selected messages.\n *\n * @param {Object} header The header container element.\n * @param {Number} value The new number to display.\n */\n var setMessagesSelectedCount = function(header, value) {\n getHeaderEditMode(header).find(SELECTORS.MESSAGES_SELECTED_COUNT).text(value);\n };\n\n /**\n * Format message for the mustache template, transform camelCase properties to lowercase properties.\n *\n * @param {Array} messages Array of message objects.\n * @param {Object} datesCache Cache timestamps and their formatted date string.\n * @return {Array} Messages formated for mustache template.\n */\n var formatMessagesForTemplate = function(messages, datesCache) {\n return messages.map(function(message) {\n return {\n id: message.id,\n isread: message.isRead,\n fromloggedinuser: message.fromLoggedInUser,\n userfrom: message.userFrom,\n text: message.text,\n formattedtime: message.timeCreated ? datesCache[message.timeCreated] : null\n };\n });\n };\n\n /**\n * Create rendering promises for each day containing messages.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Array} days Array of days containing messages.\n * @param {Object} datesCache Cache timestamps and their formatted date string.\n * @return {Promise} Days rendering promises.\n */\n var renderAddDays = function(header, body, footer, days, datesCache) {\n var messagesContainer = getMessagesContainer(body);\n var daysRenderPromises = days.map(function(data) {\n return Templates.render(TEMPLATES.DAY, {\n timestamp: data.value.timestamp,\n messages: formatMessagesForTemplate(data.value.messages, datesCache)\n });\n });\n\n return $.when.apply($, daysRenderPromises).then(function() {\n // Wait until all of the rendering is done for each of the days\n // to ensure they are added to the page in the correct order.\n days.forEach(function(data, index) {\n daysRenderPromises[index]\n .then(function(html) {\n if (data.before) {\n var element = getDayElement(body, data.before.timestamp);\n return $(html).insertBefore(element);\n } else {\n return messagesContainer.append(html);\n }\n })\n .catch(function() {\n // Fail silently.\n });\n });\n\n return;\n });\n };\n\n /**\n * Add (more) messages to day containers.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Array} messages List of messages.\n * @param {Object} datesCache Cache timestamps and their formatted date string.\n * @return {Promise} Messages rendering promises.\n */\n var renderAddMessages = function(header, body, footer, messages, datesCache) {\n var messagesData = messages.map(function(data) {\n return data.value;\n });\n var formattedMessages = formatMessagesForTemplate(messagesData, datesCache);\n\n return Templates.render(TEMPLATES.MESSAGES, {messages: formattedMessages})\n .then(function(html) {\n var messageList = $(html);\n messages.forEach(function(data) {\n var messageHtml = messageList.find('[data-message-id=\"' + data.value.id + '\"]');\n if (data.before) {\n var element = getMessageElement(body, data.before.id);\n return messageHtml.insertBefore(element);\n } else {\n var dayContainer = getDayElement(body, data.day.timestamp);\n var dayMessagesContainer = dayContainer.find(SELECTORS.DAY_MESSAGES_CONTAINER);\n return dayMessagesContainer.append(messageHtml);\n }\n });\n\n return;\n });\n };\n\n /**\n * Update existing messages.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Array} messages List of messages.\n * @param {Object} datesCache Cache timestamps and their formatted date string.\n */\n var renderUpdateMessages = function(header, body, footer, messages, datesCache) {\n messages.forEach(function(message) {\n var before = message.before;\n var after = message.after;\n var element = getMessageElement(body, before.id);\n\n if (before.id != after.id) {\n element.attr('data-message-id', after.id);\n }\n\n if (before.timeCreated != after.timeCreated) {\n var formattedTime = datesCache[after.timeCreated];\n element.find(SELECTORS.LOADING_ICON_CONTAINER).addClass('hidden');\n element.find(SELECTORS.TIME_CREATED).text(formattedTime).removeClass('hidden');\n }\n\n if (before.sendState != after.sendState) {\n var loading = element.find(SELECTORS.LOADING_ICON_CONTAINER);\n var time = element.find(SELECTORS.TIME_CREATED);\n var retry = element.find(SELECTORS.RETRY_SEND);\n\n loading.addClass('hidden');\n Aria.hide(loading.get());\n\n time.addClass('hidden');\n Aria.hide(time.get());\n\n retry.addClass('hidden');\n Aria.hide(retry.get());\n\n element.removeClass('border border-danger');\n\n switch (after.sendState) {\n case 'pending':\n loading.removeClass('hidden');\n Aria.unhide(loading.get());\n break;\n case 'error':\n retry.removeClass('hidden');\n Aria.unhide(retry.get());\n element.addClass('border border-danger');\n break;\n case 'sent':\n time.removeClass('hidden');\n Aria.unhide(time.get());\n break;\n }\n }\n\n if (before.text != after.text) {\n element.find(SELECTORS.TEXT_CONTAINER).html(after.text);\n }\n\n if (before.errorMessage != after.errorMessage) {\n var messageContainer = element.find(SELECTORS.ERROR_MESSAGE_CONTAINER);\n var message = messageContainer.find(SELECTORS.ERROR_MESSAGE);\n\n if (after.errorMessage) {\n messageContainer.removeClass('hidden');\n Aria.unhide(messageContainer.get());\n message.text(after.errorMessage);\n } else {\n messageContainer.addClass('hidden');\n Aria.unhide(messageContainer.get());\n message.text('');\n }\n }\n });\n };\n\n /**\n * Remove days from conversation.\n *\n * @param {Object} body The body container element.\n * @param {Array} days Array of days to be removed.\n */\n var renderRemoveDays = function(body, days) {\n days.forEach(function(data) {\n getDayElement(body, data.timestamp).remove();\n });\n };\n\n /**\n * Remove messages from conversation.\n *\n * @param {Object} body The body container element.\n * @param {Array} messages Array of messages to be removed.\n */\n var renderRemoveMessages = function(body, messages) {\n messages.forEach(function(data) {\n getMessageElement(body, data.id).remove();\n });\n };\n\n /**\n * Render the full conversation base on input from the statemanager.\n *\n * This will pre-load all of the formatted timestamps for each message that\n * needs to render to reduce the number of networks requests.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} data The conversation diff.\n * @return {Object} jQuery promise.\n */\n var renderConversation = function(header, body, footer, data) {\n var renderingPromises = [];\n var hasAddDays = data.days.add.length > 0;\n var hasAddMessages = data.messages.add.length > 0;\n var hasUpdateMessages = data.messages.update.length > 0;\n var timestampsToFormat = [];\n var datesCachePromise = $.Deferred().resolve({}).promise();\n\n if (hasAddDays) {\n // Search for all of the timeCreated values in all of the messages in all of\n // the days that we need to render.\n timestampsToFormat = timestampsToFormat.concat(data.days.add.reduce(function(carry, day) {\n return carry.concat(day.value.messages.reduce(function(timestamps, message) {\n if (message.timeCreated) {\n timestamps.push(message.timeCreated);\n }\n return timestamps;\n }, []));\n }, []));\n }\n\n if (hasAddMessages) {\n // Search for all of the timeCreated values in all of the messages that we\n // need to render.\n timestampsToFormat = timestampsToFormat.concat(data.messages.add.reduce(function(timestamps, message) {\n if (message.value.timeCreated) {\n timestamps.push(message.value.timeCreated);\n }\n return timestamps;\n }, []));\n }\n\n if (hasUpdateMessages) {\n timestampsToFormat = timestampsToFormat.concat(data.messages.update.reduce(function(timestamps, message) {\n if (message.before.timeCreated != message.after.timeCreated) {\n timestamps.push(message.after.timeCreated);\n }\n return timestamps;\n }, []));\n }\n\n if (timestampsToFormat.length) {\n // If we have timestamps then pre-load the formatted version of each of them\n // in a single request to the server. This saves the templates doing multiple\n // individual requests.\n datesCachePromise = Str.get_string('strftimetime24', 'core_langconfig')\n .then(function(format) {\n var requests = timestampsToFormat.map(function(timestamp) {\n return {\n timestamp: timestamp,\n format: format\n };\n });\n\n return UserDate.get(requests);\n })\n .then(function(formattedTimes) {\n return timestampsToFormat.reduce(function(carry, timestamp, index) {\n carry[timestamp] = formattedTimes[index];\n return carry;\n }, {});\n });\n }\n\n if (hasAddDays) {\n renderingPromises.push(datesCachePromise.then(function(datesCache) {\n return renderAddDays(header, body, footer, data.days.add, datesCache);\n }));\n }\n\n if (hasAddMessages) {\n renderingPromises.push(datesCachePromise.then(function(datesCache) {\n return renderAddMessages(header, body, footer, data.messages.add, datesCache);\n }));\n }\n\n if (hasUpdateMessages) {\n renderingPromises.push(datesCachePromise.then(function(datesCache) {\n return renderUpdateMessages(header, body, footer, data.messages.update, datesCache);\n }));\n }\n\n if (data.days.remove.length > 0) {\n renderRemoveDays(body, data.days.remove);\n }\n\n if (data.messages.remove.length > 0) {\n renderRemoveMessages(body, data.messages.remove);\n }\n\n return $.when.apply($, renderingPromises);\n };\n\n /**\n * Render the conversation header.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} data Data for header.\n * @return {Object} jQuery promise\n */\n var renderHeader = function(header, body, footer, data) {\n var headerContainer = getHeaderContent(header);\n var template = TEMPLATES.HEADER_PUBLIC;\n data.context.showrouteback = (header.attr('data-from-panel') === \"false\");\n if (data.type == CONVERSATION_TYPES.PRIVATE) {\n template = data.showControls ? TEMPLATES.HEADER_PRIVATE : TEMPLATES.HEADER_PRIVATE_NO_CONTROLS;\n } else if (data.type == CONVERSATION_TYPES.SELF) {\n template = TEMPLATES.HEADER_SELF;\n }\n\n return Templates.render(template, data.context)\n .then(function(html, js) {\n Templates.replaceNodeContents(headerContainer, html, js);\n return;\n });\n };\n\n /**\n * Render the conversation footer.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} data Data for footer.\n * @return {Object} jQuery promise.\n */\n var renderFooter = function(header, body, footer, data) {\n hideAllFooterElements(footer);\n\n switch (data.type) {\n case 'placeholder':\n return showFooterPlaceholder(footer);\n case 'add-contact':\n return Str.get_strings([\n {\n key: 'requirecontacttomessage',\n component: 'core_message',\n param: data.user.fullname\n },\n {\n key: 'isnotinyourcontacts',\n component: 'core_message',\n param: data.user.fullname\n }\n ])\n .then(function(strings) {\n var title = strings[1];\n var text = strings[0];\n var footerContainer = getFooterRequireContactContainer(footer);\n footerContainer.find(SELECTORS.TITLE).text(title);\n footerContainer.find(SELECTORS.TEXT).text(text);\n showFooterRequireContact(footer);\n return strings;\n });\n case 'edit-mode':\n return showFooterEditMode(footer);\n case 'content':\n return showFooterContent(footer);\n case 'unblock':\n return showFooterRequireUnblock(footer);\n case 'unable-to-message':\n return showFooterUnableToMessage(footer);\n }\n\n return true;\n };\n\n /**\n * Scroll to a message in the conversation.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Number} messageId Message id.\n */\n var renderScrollToMessage = function(header, body, footer, messageId) {\n var messagesContainer = getMessagesContainer(body);\n var messageElement = getMessageElement(body, messageId);\n var position = messageElement.position();\n // Scroll the message container down to the top of the message element.\n if (position) {\n var scrollTop = messagesContainer.scrollTop() + position.top;\n messagesContainer.scrollTop(scrollTop);\n }\n };\n\n /**\n * Hide or show the conversation header.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Bool} isLoadingMembers Members loading.\n */\n var renderLoadingMembers = function(header, body, footer, isLoadingMembers) {\n if (isLoadingMembers) {\n hideHeaderContent(header);\n showHeaderPlaceholder(header);\n } else {\n showHeaderContent(header);\n hideHeaderPlaceholder(header);\n }\n };\n\n /**\n * Hide or show loading conversation messages.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Bool} isLoadingFirstMessages Messages loading.\n */\n var renderLoadingFirstMessages = function(header, body, footer, isLoadingFirstMessages) {\n if (isLoadingFirstMessages) {\n hideMessagesContainer(body);\n showContentPlaceholder(body);\n } else {\n showMessagesContainer(body);\n hideContentPlaceholder(body);\n }\n };\n\n /**\n * Hide or show loading more messages.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Bool} isLoading Messages loading.\n */\n var renderLoadingMessages = function(header, body, footer, isLoading) {\n if (isLoading) {\n showMoreMessagesLoadingIcon(body);\n } else {\n hideMoreMessagesLoadingIcon(body);\n }\n };\n\n /**\n * Hide or show the emoji picker.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Bool} show Should the emoji picker be visible.\n */\n var renderShowEmojiPicker = function(header, body, footer, show) {\n var container = getEmojiPickerContainer(footer);\n\n if (show) {\n container.removeClass('hidden');\n Aria.unhide(container.get());\n container.find(SELECTORS.EMOJI_PICKER_SEARCH_INPUT).focus();\n } else {\n container.addClass('hidden');\n Aria.hide(container.get());\n }\n };\n\n /**\n * Hide or show the emoji auto complete.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Bool} show Should the emoji picker be visible.\n */\n var renderShowEmojiAutoComplete = function(header, body, footer, show) {\n var container = getEmojiAutoCompleteContainer(footer);\n\n if (show) {\n container.removeClass('hidden');\n Aria.unhide(container.get());\n } else {\n container.addClass('hidden');\n Aria.hide(container.get());\n }\n };\n\n /**\n * Show a confirmation dialogue\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {String} buttonSelectors Selectors for the buttons to show.\n * @param {String} bodyText Text to show in dialogue.\n * @param {String} headerText Text to show in dialogue header.\n * @param {Bool} canCancel Can this dialogue be cancelled.\n * @param {Bool} skipHeader Skip blanking out the header\n * @param {Bool} showOk Show an 'Okay' button for a dialogue which will close it\n */\n var showConfirmDialogue = function(\n header,\n body,\n footer,\n buttonSelectors,\n bodyText,\n headerText,\n canCancel,\n skipHeader,\n showOk\n ) {\n var dialogue = getConfirmDialogueContainer(body);\n var buttons = buttonSelectors.map(function(selector) {\n return dialogue.find(selector);\n });\n var cancelButton = dialogue.find(SELECTORS.CONFIRM_DIALOGUE_CANCEL_BUTTON);\n var okayButton = dialogue.find(SELECTORS.CONFIRM_DIALOGUE_OKAY_BUTTON);\n var text = dialogue.find(SELECTORS.CONFIRM_DIALOGUE_TEXT);\n var dialogueHeader = dialogue.find(SELECTORS.CONFIRM_DIALOGUE_HEADER);\n\n dialogue.find('button').addClass('hidden');\n\n if (canCancel) {\n cancelButton.removeClass('hidden');\n } else {\n cancelButton.addClass('hidden');\n }\n\n if (showOk) {\n okayButton.removeClass('hidden');\n } else {\n okayButton.addClass('hidden');\n }\n\n if (headerText) {\n // Create the dialogue header.\n dialogueHeader = $('<h3 class=\"h6\" data-region=\"dialogue-header\"></h3>');\n dialogueHeader.text(headerText);\n // Prepend it to the confirmation body.\n var confirmDialogue = dialogue.find(SELECTORS.CONFIRM_DIALOGUE);\n confirmDialogue.prepend(dialogueHeader);\n } else if (dialogueHeader.length) {\n // Header text is empty but dialogue header is present, so remove it.\n dialogueHeader.remove();\n }\n\n buttons.forEach(function(button) {\n button.removeClass('hidden');\n });\n text.text(bodyText);\n showConfirmDialogueContainer(footer);\n showConfirmDialogueContainer(body);\n\n if (!skipHeader) {\n showConfirmDialogueContainer(header);\n }\n\n dialogue.find(SELECTORS.CAN_RECEIVE_FOCUS).filter(':visible').first().focus();\n };\n\n /**\n * Hide the dialogue\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @return {Bool} always true.\n */\n var hideConfirmDialogue = function(header, body, footer) {\n var dialogue = getConfirmDialogueContainer(body);\n var cancelButton = dialogue.find(SELECTORS.CONFIRM_DIALOGUE_CANCEL_BUTTON);\n var okayButton = dialogue.find(SELECTORS.CONFIRM_DIALOGUE_OKAY_BUTTON);\n var text = dialogue.find(SELECTORS.CONFIRM_DIALOGUE_TEXT);\n var dialogueHeader = dialogue.find(SELECTORS.CONFIRM_DIALOGUE_HEADER);\n\n hideCheckDeleteDialogue(body);\n hideConfirmDialogueContainer(body);\n hideConfirmDialogueContainer(footer);\n hideConfirmDialogueContainer(header);\n dialogue.find('button').addClass('hidden');\n cancelButton.removeClass('hidden');\n okayButton.removeClass('hidden');\n text.text('');\n\n // Remove dialogue header if present.\n if (dialogueHeader.length) {\n dialogueHeader.remove();\n }\n\n header.find(SELECTORS.CAN_RECEIVE_FOCUS).first().focus();\n return true;\n };\n\n /**\n * Render the confirm block user dialogue.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} user User to block.\n * @return {Object} jQuery promise\n */\n var renderConfirmBlockUser = function(header, body, footer, user) {\n if (user) {\n if (user.canmessageevenifblocked) {\n return Str.get_string('cantblockuser', 'core_message', user.fullname)\n .then(function(string) {\n return showConfirmDialogue(header, body, footer, [], string, '', false, false, true);\n });\n } else {\n return Str.get_string('blockuserconfirm', 'core_message', user.fullname)\n .then(function(string) {\n return showConfirmDialogue(header, body, footer, [SELECTORS.ACTION_CONFIRM_BLOCK], string, '', true, false);\n });\n }\n } else {\n return hideConfirmDialogue(header, body, footer);\n }\n };\n\n /**\n * Render the confirm unblock user dialogue.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} user User to unblock.\n * @return {Object} jQuery promise\n */\n var renderConfirmUnblockUser = function(header, body, footer, user) {\n if (user) {\n return Str.get_string('unblockuserconfirm', 'core_message', user.fullname)\n .then(function(string) {\n return showConfirmDialogue(header, body, footer, [SELECTORS.ACTION_CONFIRM_UNBLOCK], string, '', true, false);\n });\n } else {\n return hideConfirmDialogue(header, body, footer);\n }\n };\n\n /**\n * Render the add user as contact dialogue.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} user User to add as contact.\n * @return {Object} jQuery promise\n */\n var renderConfirmAddContact = function(header, body, footer, user) {\n if (user) {\n return Str.get_string('addcontactconfirm', 'core_message', user.fullname)\n .then(function(string) {\n return showConfirmDialogue(\n header,\n body,\n footer,\n [SELECTORS.ACTION_CONFIRM_ADD_CONTACT],\n string,\n '',\n true,\n false\n );\n });\n } else {\n return hideConfirmDialogue(header, body, footer);\n }\n };\n\n /**\n * Render the remove user from contacts dialogue.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} user User to remove from contacts.\n * @return {Object} jQuery promise\n */\n var renderConfirmRemoveContact = function(header, body, footer, user) {\n if (user) {\n return Str.get_string('removecontactconfirm', 'core_message', user.fullname)\n .then(function(string) {\n return showConfirmDialogue(\n header,\n body,\n footer,\n [SELECTORS.ACTION_CONFIRM_REMOVE_CONTACT],\n string,\n '',\n true,\n false\n );\n });\n } else {\n return hideConfirmDialogue(header, body, footer);\n }\n };\n\n /**\n * Render the delete selected messages dialogue.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} data If the dialogue should show and checkbox shows to delete message for all users.\n * @return {Object} jQuery promise\n */\n var renderConfirmDeleteSelectedMessages = function(header, body, footer, data) {\n var showmessage = null;\n if (data.type == CONVERSATION_TYPES.SELF) {\n // Message displayed to self-conversations is slighly different.\n showmessage = 'deleteselectedmessagesconfirmselfconversation';\n } else {\n // This other message should be displayed.\n if (data.canDeleteMessagesForAllUsers) {\n showCheckDeleteDialogue(body);\n showmessage = 'deleteforeveryoneselectedmessagesconfirm';\n } else {\n showmessage = 'deleteselectedmessagesconfirm';\n }\n }\n\n if (data.show) {\n return Str.get_string(showmessage, 'core_message')\n .then(function(string) {\n return showConfirmDialogue(\n header,\n body,\n footer,\n [SELECTORS.ACTION_CONFIRM_DELETE_SELECTED_MESSAGES],\n string,\n '',\n true,\n false\n );\n });\n } else {\n return hideConfirmDialogue(header, body, footer);\n }\n };\n\n /**\n * Render the confirm delete conversation dialogue.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {int|Null} type The conversation type to be removed.\n * @return {Object} jQuery promise\n */\n var renderConfirmDeleteConversation = function(header, body, footer, type) {\n var showmessage = null;\n if (type == CONVERSATION_TYPES.SELF) {\n // Message displayed to self-conversations is slighly different.\n showmessage = 'deleteallselfconfirm';\n } else if (type) {\n // This other message should be displayed.\n showmessage = 'deleteallconfirm';\n }\n\n if (showmessage) {\n return Str.get_string(showmessage, 'core_message')\n .then(function(string) {\n return showConfirmDialogue(\n header,\n body,\n footer,\n [SELECTORS.ACTION_CONFIRM_DELETE_CONVERSATION],\n string,\n '',\n true,\n false\n );\n });\n } else {\n return hideConfirmDialogue(header, body, footer);\n }\n };\n\n /**\n * Render the confirm delete conversation dialogue.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Bool} user The other user object.\n * @return {Object} jQuery promise\n */\n var renderConfirmContactRequest = function(header, body, footer, user) {\n if (user) {\n return Str.get_string('userwouldliketocontactyou', 'core_message', user.fullname)\n .then(function(string) {\n var buttonSelectors = [\n SELECTORS.ACTION_ACCEPT_CONTACT_REQUEST,\n SELECTORS.ACTION_DECLINE_CONTACT_REQUEST\n ];\n return showConfirmDialogue(header, body, footer, buttonSelectors, string, '', false, true);\n });\n } else {\n return hideConfirmDialogue(header, body, footer);\n }\n };\n\n /**\n * Show the checkbox to allow delete message for all.\n *\n * @param {Object} body The body container element.\n */\n var showCheckDeleteDialogue = function(body) {\n var dialogue = getConfirmDialogueContainer(body);\n var checkboxRegion = dialogue.find(SELECTORS.DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE_CONTAINER);\n checkboxRegion.removeClass('hidden');\n };\n\n /**\n * Hide the checkbox to allow delete message for all.\n *\n * @param {Object} body The body container element.\n */\n var hideCheckDeleteDialogue = function(body) {\n var dialogue = getConfirmDialogueContainer(body);\n var checkboxRegion = dialogue.find(SELECTORS.DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE_CONTAINER);\n var checkbox = dialogue.find(SELECTORS.DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE);\n checkbox.prop('checked', false);\n checkboxRegion.addClass('hidden');\n };\n\n /**\n * Show or hide the block / unblock option in the header dropdown menu.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Bool} isBlocked is user blocked.\n */\n var renderIsBlocked = function(header, body, footer, isBlocked) {\n if (isBlocked) {\n header.find(SELECTORS.ACTION_REQUEST_BLOCK).addClass('hidden');\n header.find(SELECTORS.ACTION_REQUEST_UNBLOCK).removeClass('hidden');\n } else {\n header.find(SELECTORS.ACTION_REQUEST_BLOCK).removeClass('hidden');\n header.find(SELECTORS.ACTION_REQUEST_UNBLOCK).addClass('hidden');\n }\n };\n\n /**\n * Show or hide the favourite / unfavourite option in the header dropdown menu\n * and the favourite star in the header title.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Bool} isFavourite is this conversation a favourite.\n */\n var renderIsFavourite = function(header, body, footer, state) {\n var favouriteIcon = header.find(SELECTORS.FAVOURITE_ICON_CONTAINER);\n var addFavourite = header.find(SELECTORS.ACTION_CONFIRM_FAVOURITE);\n var removeFavourite = header.find(SELECTORS.ACTION_CONFIRM_UNFAVOURITE);\n\n switch (state) {\n case 'hide':\n favouriteIcon.addClass('hidden');\n addFavourite.addClass('hidden');\n removeFavourite.addClass('hidden');\n break;\n case 'show-add':\n favouriteIcon.addClass('hidden');\n addFavourite.removeClass('hidden');\n removeFavourite.addClass('hidden');\n break;\n case 'show-remove':\n favouriteIcon.removeClass('hidden');\n addFavourite.addClass('hidden');\n removeFavourite.removeClass('hidden');\n break;\n }\n };\n\n /**\n * Show or hide the mute / unmute option in the header dropdown menu\n * and the muted icon in the header title.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {string} state The state of the conversation as defined by the patcher.\n */\n var renderIsMuted = function(header, body, footer, state) {\n var muteIcon = header.find(SELECTORS.MUTED_ICON_CONTAINER);\n var setMuted = header.find(SELECTORS.ACTION_CONFIRM_MUTE);\n var unsetMuted = header.find(SELECTORS.ACTION_CONFIRM_UNMUTE);\n\n switch (state) {\n case 'hide':\n muteIcon.addClass('hidden');\n setMuted.addClass('hidden');\n unsetMuted.addClass('hidden');\n break;\n case 'show-mute':\n muteIcon.addClass('hidden');\n setMuted.removeClass('hidden');\n unsetMuted.addClass('hidden');\n break;\n case 'show-unmute':\n muteIcon.removeClass('hidden');\n setMuted.addClass('hidden');\n unsetMuted.removeClass('hidden');\n break;\n }\n };\n\n /**\n * Show or hide the add / remove user as contact option in the header dropdown menu.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Bool} state the contact state.\n */\n var renderIsContact = function(header, body, footer, state) {\n var addContact = header.find(SELECTORS.ACTION_REQUEST_ADD_CONTACT);\n var removeContact = header.find(SELECTORS.ACTION_REQUEST_REMOVE_CONTACT);\n\n switch (state) {\n case 'pending-contact':\n addContact.addClass('hidden');\n removeContact.addClass('hidden');\n break;\n case 'contact':\n addContact.addClass('hidden');\n removeContact.removeClass('hidden');\n break;\n case 'non-contact':\n addContact.removeClass('hidden');\n removeContact.addClass('hidden');\n break;\n }\n };\n\n /**\n * Show or hide confirm action from confirm dialogue is loading.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Bool} isLoading confirm action is loading.\n */\n var renderLoadingConfirmAction = function(header, body, footer, isLoading) {\n var dialogue = getConfirmDialogueContainer(body);\n var buttons = dialogue.find('button');\n var buttonText = dialogue.find(SELECTORS.CONFIRM_DIALOGUE_BUTTON_TEXT);\n var loadingIcon = dialogue.find(SELECTORS.LOADING_ICON_CONTAINER);\n\n if (isLoading) {\n buttons.prop('disabled', true);\n buttonText.addClass('hidden');\n loadingIcon.removeClass('hidden');\n } else {\n buttons.prop('disabled', false);\n buttonText.removeClass('hidden');\n loadingIcon.addClass('hidden');\n }\n };\n\n /**\n * Show or hide the header and footer content for edit mode.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Bool} inEditMode In edit mode or not.\n */\n var renderInEditMode = function(header, body, footer, inEditMode) {\n var messages = null;\n\n if (inEditMode) {\n messages = body.find(SELECTORS.MESSAGE_NOT_SELECTED);\n messages.find(SELECTORS.MESSAGE_NOT_SELECTED_ICON).removeClass('hidden');\n hideHeaderContent(header);\n showHeaderEditMode(header);\n } else {\n messages = getMessagesContainer(body);\n messages.find(SELECTORS.MESSAGE_NOT_SELECTED_ICON).addClass('hidden');\n messages.find(SELECTORS.MESSAGE_SELECTED_ICON).addClass('hidden');\n showHeaderContent(header);\n hideHeaderEditMode(header);\n }\n };\n\n /**\n * Select or unselect messages.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} data The messages to select or unselect.\n */\n var renderSelectedMessages = function(header, body, footer, data) {\n var hasSelectedMessages = data.count > 0;\n\n if (data.add.length) {\n data.add.forEach(function(messageId) {\n var message = getMessageElement(body, messageId);\n message.find(SELECTORS.MESSAGE_NOT_SELECTED_ICON).addClass('hidden');\n message.find(SELECTORS.MESSAGE_SELECTED_ICON).removeClass('hidden');\n message.attr('aria-checked', true);\n });\n }\n\n if (data.remove.length) {\n data.remove.forEach(function(messageId) {\n var message = getMessageElement(body, messageId);\n\n if (hasSelectedMessages) {\n message.find(SELECTORS.MESSAGE_NOT_SELECTED_ICON).removeClass('hidden');\n }\n\n message.find(SELECTORS.MESSAGE_SELECTED_ICON).addClass('hidden');\n message.attr('aria-checked', false);\n });\n }\n\n setMessagesSelectedCount(header, data.count);\n };\n\n /**\n * Show or hide the require add contact panel.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} data Whether the user has to be added a a contact.\n * @return {Object} jQuery promise\n */\n var renderRequireAddContact = function(header, body, footer, data) {\n if (data.show && !data.hasMessages) {\n return Str.get_strings([\n {\n key: 'requirecontacttomessage',\n component: 'core_message',\n param: data.user.fullname\n },\n {\n key: 'isnotinyourcontacts',\n component: 'core_message',\n param: data.user.fullname\n }\n ])\n .then(function(strings) {\n var title = strings[1];\n var text = strings[0];\n return showConfirmDialogue(\n header,\n body,\n footer,\n [SELECTORS.ACTION_REQUEST_ADD_CONTACT],\n text,\n title,\n false,\n true\n );\n });\n } else {\n return hideConfirmDialogue(header, body, footer);\n }\n };\n\n /**\n * Show or hide the self-conversation message.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} displayMessage should the message be displayed?.\n * @return {Object|true} jQuery promise\n */\n var renderSelfConversationMessage = function(header, body, footer, displayMessage) {\n var container = getSelfConversationMessageContainer(body);\n if (displayMessage) {\n container.removeClass('hidden');\n } else {\n container.addClass('hidden');\n }\n return true;\n };\n\n /**\n * Show or hide the require add contact panel.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @param {Object} userFullName Full name of the other user.\n * @return {Object|true} jQuery promise\n */\n var renderContactRequestSent = function(header, body, footer, userFullName) {\n var container = getContactRequestSentContainer(body);\n if (userFullName) {\n return Str.get_string('yourcontactrequestpending', 'core_message', userFullName)\n .then(function(string) {\n container.find(SELECTORS.TEXT).text(string);\n container.removeClass('hidden');\n return string;\n });\n } else {\n container.addClass('hidden');\n return true;\n }\n };\n\n /**\n * Reset the UI to the initial state.\n *\n * @param {Object} header The header container element.\n * @param {Object} body The body container element.\n * @param {Object} footer The footer container element.\n * @return {Bool}\n */\n var renderReset = function(header, body, footer) {\n hideConfirmDialogue(header, body, footer);\n hideContactRequestSentContainer(body);\n hideSelfConversationMessageContainer(body);\n hideAllHeaderElements(header);\n showHeaderPlaceholder(header);\n hideAllFooterElements(footer);\n showFooterPlaceholder(footer);\n return true;\n };\n\n var render = function(header, body, footer, patch) {\n var configs = [\n {\n // Resetting the UI needs to come first, if it's required.\n reset: renderReset\n },\n {\n // Any async rendering (stuff that requires templates, strings etc) should\n // go in here.\n conversation: renderConversation,\n header: renderHeader,\n footer: renderFooter,\n confirmBlockUser: renderConfirmBlockUser,\n confirmUnblockUser: renderConfirmUnblockUser,\n confirmAddContact: renderConfirmAddContact,\n confirmRemoveContact: renderConfirmRemoveContact,\n confirmDeleteSelectedMessages: renderConfirmDeleteSelectedMessages,\n confirmDeleteConversation: renderConfirmDeleteConversation,\n confirmContactRequest: renderConfirmContactRequest,\n requireAddContact: renderRequireAddContact,\n selfConversationMessage: renderSelfConversationMessage,\n contactRequestSent: renderContactRequestSent\n },\n {\n loadingMembers: renderLoadingMembers,\n loadingFirstMessages: renderLoadingFirstMessages,\n loadingMessages: renderLoadingMessages,\n isBlocked: renderIsBlocked,\n isContact: renderIsContact,\n isFavourite: renderIsFavourite,\n isMuted: renderIsMuted,\n loadingConfirmAction: renderLoadingConfirmAction,\n inEditMode: renderInEditMode,\n showEmojiPicker: renderShowEmojiPicker,\n showEmojiAutoComplete: renderShowEmojiAutoComplete,\n },\n {\n // Scrolling should be last to make sure everything\n // on the page is visible.\n scrollToMessage: renderScrollToMessage,\n selectedMessages: renderSelectedMessages\n }\n ];\n // Helper function to process each of the configs above.\n var processConfig = function(config) {\n var results = [];\n\n for (var key in patch) {\n if (config.hasOwnProperty(key)) {\n var renderFunc = config[key];\n var patchValue = patch[key];\n results.push(renderFunc(header, body, footer, patchValue));\n }\n }\n\n return results;\n };\n\n // The first config is special because it resets the UI.\n var renderingPromises = processConfig(configs[0]);\n // The second config is special because it contains async rendering.\n renderingPromises = renderingPromises.concat(processConfig(configs[1]));\n\n // Wait for the async rendering to complete before processing the\n // rest of the configs, in order.\n return $.when.apply($, renderingPromises)\n .then(function() {\n for (var i = 2; i < configs.length; i++) {\n processConfig(configs[i]);\n }\n\n return;\n })\n .catch(Notification.exception);\n };\n\n return {\n render: render,\n };\n});\n"],"file":"message_drawer_view_conversation_renderer.min.js"}