From fb31e3da0b052387b937c09c47b7bf4f4f15b787 Mon Sep 17 00:00:00 2001 From: Jun Pataleta Date: Fri, 7 Feb 2020 23:22:53 +0800 Subject: [PATCH] MDL-67862 message: Render dialogue header only when necessary --- ..._drawer_view_conversation_constants.min.js | 2 +- ...wer_view_conversation_constants.min.js.map | 2 +- ...e_drawer_view_conversation_renderer.min.js | 2 +- ...awer_view_conversation_renderer.min.js.map | 2 +- ...sage_drawer_view_conversation_constants.js | 1 + ...ssage_drawer_view_conversation_renderer.js | 19 +++++++++++++------ ...onversation_body_confirm_dialogue.mustache | 1 - 7 files changed, 18 insertions(+), 11 deletions(-) diff --git a/message/amd/build/message_drawer_view_conversation_constants.min.js b/message/amd/build/message_drawer_view_conversation_constants.min.js index 2157c187aa3..b603cf21c5d 100644 --- a/message/amd/build/message_drawer_view_conversation_constants.min.js +++ b/message/amd/build/message_drawer_view_conversation_constants.min.js @@ -1,2 +1,2 @@ -define ("core_message/message_drawer_view_conversation_constants",[],function(){return{SELECTORS:{ACTION_ACCEPT_CONTACT_REQUEST:"[data-action=\"accept-contact-request\"]",ACTION_CANCEL_CONFIRM:"[data-action=\"cancel-confirm\"]",ACTION_OKAY_CONFIRM:"[data-action=\"okay-confirm\"]",ACTION_CANCEL_EDIT_MODE:"[data-action=\"cancel-edit-mode\"]",ACTION_CONFIRM_ADD_CONTACT:"[data-action=\"confirm-add-contact\"]",ACTION_CONFIRM_BLOCK:"[data-action=\"confirm-block\"]",ACTION_CONFIRM_DELETE_SELECTED_MESSAGES:"[data-action=\"confirm-delete-selected-messages\"]",ACTION_CONFIRM_DELETE_CONVERSATION:"[data-action=\"confirm-delete-conversation\"]",ACTION_CONFIRM_FAVOURITE:"[data-action=\"confirm-favourite\"]",ACTION_CONFIRM_MUTE:"[data-action=\"confirm-mute\"]",ACTION_CONFIRM_UNFAVOURITE:"[data-action=\"confirm-unfavourite\"]",ACTION_CONFIRM_REMOVE_CONTACT:"[data-action=\"confirm-remove-contact\"]",ACTION_CONFIRM_UNBLOCK:"[data-action=\"confirm-unblock\"]",ACTION_CONFIRM_UNMUTE:"[data-action=\"confirm-unmute\"]",ACTION_DECLINE_CONTACT_REQUEST:"[data-action=\"decline-contact-request\"]",ACTION_REQUEST_ADD_CONTACT:"[data-action=\"request-add-contact\"]",ACTION_REQUEST_BLOCK:"[data-action=\"request-block\"]",ACTION_REQUEST_DELETE_CONVERSATION:"[data-action=\"request-delete-conversation\"]",ACTION_REQUEST_DELETE_SELECTED_MESSAGES:"[data-action=\"delete-selected-messages\"]",ACTION_REQUEST_REMOVE_CONTACT:"[data-action=\"request-remove-contact\"]",ACTION_REQUEST_UNBLOCK:"[data-action=\"request-unblock\"]",ACTION_VIEW_CONTACT:"[data-action=\"view-contact\"]",ACTION_VIEW_GROUP_INFO:"[data-action=\"view-group-info\"]",CAN_RECEIVE_FOCUS:"input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]",CONFIRM_DIALOGUE_BUTTON_TEXT:"[data-region=\"dialogue-button-text\"]",CONFIRM_DIALOGUE_CANCEL_BUTTON:"[data-action=\"cancel-confirm\"]",CONFIRM_DIALOGUE_CONTAINER:"[data-region=\"confirm-dialogue-container\"]",CONFIRM_DIALOGUE_HEADER:"[data-region=\"dialogue-header\"]",CONFIRM_DIALOGUE_OKAY_BUTTON:"[data-action=\"okay-confirm\"]",CONFIRM_DIALOGUE_TEXT:"[data-region=\"dialogue-text\"]",CONTACT_REQUEST_SENT_MESSAGE_CONTAINER:"[data-region=\"contact-request-sent-message-container\"]",CONTENT_PLACEHOLDER_CONTAINER:"[data-region=\"content-placeholder\"]",CONTENT_CONTAINER:"[data-region=\"content-container\"]",CONTENT_MESSAGES_CONTAINER:"[data-region=\"content-message-container\"]",CONTENT_MESSAGES_FOOTER_CONTAINER:"[data-region=\"content-messages-footer-container\"]",CONTENT_MESSAGES_FOOTER_EDIT_MODE_CONTAINER:"[data-region=\"content-messages-footer-edit-mode-container\"]",CONTENT_MESSAGES_FOOTER_REQUIRE_CONTACT_CONTAINER:"[data-region=\"content-messages-footer-require-contact-container\"]",CONTENT_MESSAGES_FOOTER_REQUIRE_UNBLOCK_CONTAINER:"[data-region=\"content-messages-footer-require-unblock-container\"]",CONTENT_MESSAGES_FOOTER_UNABLE_TO_MESSAGE_CONTAINER:"[data-region=\"content-messages-footer-unable-to-message\"]",DAY_MESSAGES_CONTAINER:"[data-region=\"day-messages-container\"]",DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE:"[data-region=\"delete-messages-for-all-users-toggle\"]",DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE_CONTAINER:"[data-region=\"delete-messages-for-all-users-toggle-container\"]",EMOJI_AUTO_COMPLETE_CONTAINER:"[data-region=\"emoji-auto-complete-container\"]",EMOJI_PICKER_CONTAINER:"[data-region=\"emoji-picker-container\"]",EMOJI_PICKER:"[data-region=\"emoji-picker\"]",EMOJI_PICKER_SEARCH_INPUT:"[data-region=\"search-input\"]",ERROR_MESSAGE_CONTAINER:"[data-region=\"error-message-container\"]",ERROR_MESSAGE:"[data-region=\"error-message\"]",FAVOURITE_ICON_CONTAINER:"[data-region=\"favourite-icon-container\"]",FOOTER_CONTAINER:"[data-region=\"content-messages-footer-container\"]",HEADER:"[data-region=\"header-content\"]",HEADER_EDIT_MODE:"[data-region=\"header-edit-mode\"]",HEADER_PLACEHOLDER_CONTAINER:"[data-region=\"header-placeholder\"]",LOADING_ICON_CONTAINER:"[data-region=\"loading-icon-container\"]",MESSAGE:"[data-region=\"message\"]",MESSAGE_NOT_SELECTED:"[data-region=\"message\"][aria-checked=\"false\"]",MESSAGE_NOT_SELECTED_ICON:"[data-region=\"not-selected-icon\"]",MESSAGE_SELECTED_ICON:"[data-region=\"selected-icon\"]",MESSAGES:"[data-region=\"content-message-container\"]",MESSAGES_CONTAINER:"[data-region=\"content-message-container\"]",MESSAGES_SELECTED_COUNT:"[data-region=\"message-selected-court\"]",MESSAGE_TEXT_AREA:"[data-region=\"send-message-txt\"]",MORE_MESSAGES_LOADING_ICON_CONTAINER:"[data-region=\"more-messages-loading-icon-container\"]",MUTED_ICON_CONTAINER:"[data-region=\"muted-icon-container\"]",PLACEHOLDER_CONTAINER:"[data-region=\"placeholder-container\"]",RETRY_SEND:"[data-region=\"retry-send\"]",SELF_CONVERSATION_MESSAGE_CONTAINER:"[data-region=\"self-conversation-message-container\"]",SEND_MESSAGE_BUTTON:"[data-action=\"send-message\"]",SEND_MESSAGE_ICON_CONTAINER:"[data-region=\"send-icon-container\"]",TEXT:"[data-region=\"text\"]",TEXT_CONTAINER:"[data-region=\"text-container\"]",TIME_CREATED:"[data-region=\"time-created\"]",TITLE:"[data-region=\"title\"]",TOGGLE_EMOJI_PICKER_BUTTON:"[data-action=\"toggle-emoji-picker\"]"},TEMPLATES:{HEADER_PRIVATE:"core_message/message_drawer_view_conversation_header_content_type_private",HEADER_PRIVATE_NO_CONTROLS:"core_message/message_drawer_view_conversation_header_content_type_private_no_controls",HEADER_PUBLIC:"core_message/message_drawer_view_conversation_header_content_type_public",HEADER_SELF:"core_message/message_drawer_view_conversation_header_content_type_self",DAY:"core_message/message_drawer_view_conversation_body_day",MESSAGE:"core_message/message_drawer_view_conversation_body_message",MESSAGES:"core_message/message_drawer_view_conversation_body_messages"},CONVERSATION_TYPES:{PRIVATE:1,PUBLIC:2,SELF:3},NEWEST_MESSAGES_FIRST:!0,LOAD_MESSAGE_LIMIT:100,MILLISECONDS_IN_SEC:1e3}}); +define ("core_message/message_drawer_view_conversation_constants",[],function(){return{SELECTORS:{ACTION_ACCEPT_CONTACT_REQUEST:"[data-action=\"accept-contact-request\"]",ACTION_CANCEL_CONFIRM:"[data-action=\"cancel-confirm\"]",ACTION_OKAY_CONFIRM:"[data-action=\"okay-confirm\"]",ACTION_CANCEL_EDIT_MODE:"[data-action=\"cancel-edit-mode\"]",ACTION_CONFIRM_ADD_CONTACT:"[data-action=\"confirm-add-contact\"]",ACTION_CONFIRM_BLOCK:"[data-action=\"confirm-block\"]",ACTION_CONFIRM_DELETE_SELECTED_MESSAGES:"[data-action=\"confirm-delete-selected-messages\"]",ACTION_CONFIRM_DELETE_CONVERSATION:"[data-action=\"confirm-delete-conversation\"]",ACTION_CONFIRM_FAVOURITE:"[data-action=\"confirm-favourite\"]",ACTION_CONFIRM_MUTE:"[data-action=\"confirm-mute\"]",ACTION_CONFIRM_UNFAVOURITE:"[data-action=\"confirm-unfavourite\"]",ACTION_CONFIRM_REMOVE_CONTACT:"[data-action=\"confirm-remove-contact\"]",ACTION_CONFIRM_UNBLOCK:"[data-action=\"confirm-unblock\"]",ACTION_CONFIRM_UNMUTE:"[data-action=\"confirm-unmute\"]",ACTION_DECLINE_CONTACT_REQUEST:"[data-action=\"decline-contact-request\"]",ACTION_REQUEST_ADD_CONTACT:"[data-action=\"request-add-contact\"]",ACTION_REQUEST_BLOCK:"[data-action=\"request-block\"]",ACTION_REQUEST_DELETE_CONVERSATION:"[data-action=\"request-delete-conversation\"]",ACTION_REQUEST_DELETE_SELECTED_MESSAGES:"[data-action=\"delete-selected-messages\"]",ACTION_REQUEST_REMOVE_CONTACT:"[data-action=\"request-remove-contact\"]",ACTION_REQUEST_UNBLOCK:"[data-action=\"request-unblock\"]",ACTION_VIEW_CONTACT:"[data-action=\"view-contact\"]",ACTION_VIEW_GROUP_INFO:"[data-action=\"view-group-info\"]",CAN_RECEIVE_FOCUS:"input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]",CONFIRM_DIALOGUE:"[data-region=\"confirm-dialogue\"]",CONFIRM_DIALOGUE_BUTTON_TEXT:"[data-region=\"dialogue-button-text\"]",CONFIRM_DIALOGUE_CANCEL_BUTTON:"[data-action=\"cancel-confirm\"]",CONFIRM_DIALOGUE_CONTAINER:"[data-region=\"confirm-dialogue-container\"]",CONFIRM_DIALOGUE_HEADER:"[data-region=\"dialogue-header\"]",CONFIRM_DIALOGUE_OKAY_BUTTON:"[data-action=\"okay-confirm\"]",CONFIRM_DIALOGUE_TEXT:"[data-region=\"dialogue-text\"]",CONTACT_REQUEST_SENT_MESSAGE_CONTAINER:"[data-region=\"contact-request-sent-message-container\"]",CONTENT_PLACEHOLDER_CONTAINER:"[data-region=\"content-placeholder\"]",CONTENT_CONTAINER:"[data-region=\"content-container\"]",CONTENT_MESSAGES_CONTAINER:"[data-region=\"content-message-container\"]",CONTENT_MESSAGES_FOOTER_CONTAINER:"[data-region=\"content-messages-footer-container\"]",CONTENT_MESSAGES_FOOTER_EDIT_MODE_CONTAINER:"[data-region=\"content-messages-footer-edit-mode-container\"]",CONTENT_MESSAGES_FOOTER_REQUIRE_CONTACT_CONTAINER:"[data-region=\"content-messages-footer-require-contact-container\"]",CONTENT_MESSAGES_FOOTER_REQUIRE_UNBLOCK_CONTAINER:"[data-region=\"content-messages-footer-require-unblock-container\"]",CONTENT_MESSAGES_FOOTER_UNABLE_TO_MESSAGE_CONTAINER:"[data-region=\"content-messages-footer-unable-to-message\"]",DAY_MESSAGES_CONTAINER:"[data-region=\"day-messages-container\"]",DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE:"[data-region=\"delete-messages-for-all-users-toggle\"]",DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE_CONTAINER:"[data-region=\"delete-messages-for-all-users-toggle-container\"]",EMOJI_AUTO_COMPLETE_CONTAINER:"[data-region=\"emoji-auto-complete-container\"]",EMOJI_PICKER_CONTAINER:"[data-region=\"emoji-picker-container\"]",EMOJI_PICKER:"[data-region=\"emoji-picker\"]",EMOJI_PICKER_SEARCH_INPUT:"[data-region=\"search-input\"]",ERROR_MESSAGE_CONTAINER:"[data-region=\"error-message-container\"]",ERROR_MESSAGE:"[data-region=\"error-message\"]",FAVOURITE_ICON_CONTAINER:"[data-region=\"favourite-icon-container\"]",FOOTER_CONTAINER:"[data-region=\"content-messages-footer-container\"]",HEADER:"[data-region=\"header-content\"]",HEADER_EDIT_MODE:"[data-region=\"header-edit-mode\"]",HEADER_PLACEHOLDER_CONTAINER:"[data-region=\"header-placeholder\"]",LOADING_ICON_CONTAINER:"[data-region=\"loading-icon-container\"]",MESSAGE:"[data-region=\"message\"]",MESSAGE_NOT_SELECTED:"[data-region=\"message\"][aria-checked=\"false\"]",MESSAGE_NOT_SELECTED_ICON:"[data-region=\"not-selected-icon\"]",MESSAGE_SELECTED_ICON:"[data-region=\"selected-icon\"]",MESSAGES:"[data-region=\"content-message-container\"]",MESSAGES_CONTAINER:"[data-region=\"content-message-container\"]",MESSAGES_SELECTED_COUNT:"[data-region=\"message-selected-court\"]",MESSAGE_TEXT_AREA:"[data-region=\"send-message-txt\"]",MORE_MESSAGES_LOADING_ICON_CONTAINER:"[data-region=\"more-messages-loading-icon-container\"]",MUTED_ICON_CONTAINER:"[data-region=\"muted-icon-container\"]",PLACEHOLDER_CONTAINER:"[data-region=\"placeholder-container\"]",RETRY_SEND:"[data-region=\"retry-send\"]",SELF_CONVERSATION_MESSAGE_CONTAINER:"[data-region=\"self-conversation-message-container\"]",SEND_MESSAGE_BUTTON:"[data-action=\"send-message\"]",SEND_MESSAGE_ICON_CONTAINER:"[data-region=\"send-icon-container\"]",TEXT:"[data-region=\"text\"]",TEXT_CONTAINER:"[data-region=\"text-container\"]",TIME_CREATED:"[data-region=\"time-created\"]",TITLE:"[data-region=\"title\"]",TOGGLE_EMOJI_PICKER_BUTTON:"[data-action=\"toggle-emoji-picker\"]"},TEMPLATES:{HEADER_PRIVATE:"core_message/message_drawer_view_conversation_header_content_type_private",HEADER_PRIVATE_NO_CONTROLS:"core_message/message_drawer_view_conversation_header_content_type_private_no_controls",HEADER_PUBLIC:"core_message/message_drawer_view_conversation_header_content_type_public",HEADER_SELF:"core_message/message_drawer_view_conversation_header_content_type_self",DAY:"core_message/message_drawer_view_conversation_body_day",MESSAGE:"core_message/message_drawer_view_conversation_body_message",MESSAGES:"core_message/message_drawer_view_conversation_body_messages"},CONVERSATION_TYPES:{PRIVATE:1,PUBLIC:2,SELF:3},NEWEST_MESSAGES_FIRST:!0,LOAD_MESSAGE_LIMIT:100,MILLISECONDS_IN_SEC:1e3}}); //# sourceMappingURL=message_drawer_view_conversation_constants.min.js.map diff --git a/message/amd/build/message_drawer_view_conversation_constants.min.js.map b/message/amd/build/message_drawer_view_conversation_constants.min.js.map index c63609d15f5..3a66da7532a 100644 --- a/message/amd/build/message_drawer_view_conversation_constants.min.js.map +++ b/message/amd/build/message_drawer_view_conversation_constants.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/message_drawer_view_conversation_constants.js"],"names":["define","SELECTORS","ACTION_ACCEPT_CONTACT_REQUEST","ACTION_CANCEL_CONFIRM","ACTION_OKAY_CONFIRM","ACTION_CANCEL_EDIT_MODE","ACTION_CONFIRM_ADD_CONTACT","ACTION_CONFIRM_BLOCK","ACTION_CONFIRM_DELETE_SELECTED_MESSAGES","ACTION_CONFIRM_DELETE_CONVERSATION","ACTION_CONFIRM_FAVOURITE","ACTION_CONFIRM_MUTE","ACTION_CONFIRM_UNFAVOURITE","ACTION_CONFIRM_REMOVE_CONTACT","ACTION_CONFIRM_UNBLOCK","ACTION_CONFIRM_UNMUTE","ACTION_DECLINE_CONTACT_REQUEST","ACTION_REQUEST_ADD_CONTACT","ACTION_REQUEST_BLOCK","ACTION_REQUEST_DELETE_CONVERSATION","ACTION_REQUEST_DELETE_SELECTED_MESSAGES","ACTION_REQUEST_REMOVE_CONTACT","ACTION_REQUEST_UNBLOCK","ACTION_VIEW_CONTACT","ACTION_VIEW_GROUP_INFO","CAN_RECEIVE_FOCUS","CONFIRM_DIALOGUE_BUTTON_TEXT","CONFIRM_DIALOGUE_CANCEL_BUTTON","CONFIRM_DIALOGUE_CONTAINER","CONFIRM_DIALOGUE_HEADER","CONFIRM_DIALOGUE_OKAY_BUTTON","CONFIRM_DIALOGUE_TEXT","CONTACT_REQUEST_SENT_MESSAGE_CONTAINER","CONTENT_PLACEHOLDER_CONTAINER","CONTENT_CONTAINER","CONTENT_MESSAGES_CONTAINER","CONTENT_MESSAGES_FOOTER_CONTAINER","CONTENT_MESSAGES_FOOTER_EDIT_MODE_CONTAINER","CONTENT_MESSAGES_FOOTER_REQUIRE_CONTACT_CONTAINER","CONTENT_MESSAGES_FOOTER_REQUIRE_UNBLOCK_CONTAINER","CONTENT_MESSAGES_FOOTER_UNABLE_TO_MESSAGE_CONTAINER","DAY_MESSAGES_CONTAINER","DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE","DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE_CONTAINER","EMOJI_AUTO_COMPLETE_CONTAINER","EMOJI_PICKER_CONTAINER","EMOJI_PICKER","EMOJI_PICKER_SEARCH_INPUT","ERROR_MESSAGE_CONTAINER","ERROR_MESSAGE","FAVOURITE_ICON_CONTAINER","FOOTER_CONTAINER","HEADER","HEADER_EDIT_MODE","HEADER_PLACEHOLDER_CONTAINER","LOADING_ICON_CONTAINER","MESSAGE","MESSAGE_NOT_SELECTED","MESSAGE_NOT_SELECTED_ICON","MESSAGE_SELECTED_ICON","MESSAGES","MESSAGES_CONTAINER","MESSAGES_SELECTED_COUNT","MESSAGE_TEXT_AREA","MORE_MESSAGES_LOADING_ICON_CONTAINER","MUTED_ICON_CONTAINER","PLACEHOLDER_CONTAINER","RETRY_SEND","SELF_CONVERSATION_MESSAGE_CONTAINER","SEND_MESSAGE_BUTTON","SEND_MESSAGE_ICON_CONTAINER","TEXT","TEXT_CONTAINER","TIME_CREATED","TITLE","TOGGLE_EMOJI_PICKER_BUTTON","TEMPLATES","HEADER_PRIVATE","HEADER_PRIVATE_NO_CONTROLS","HEADER_PUBLIC","HEADER_SELF","DAY","CONVERSATION_TYPES","PRIVATE","PUBLIC","SELF","NEWEST_MESSAGES_FIRST","LOAD_MESSAGE_LIMIT","MILLISECONDS_IN_SEC"],"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 .\n\n/**\n * Constant values for the conversation page in the message drawer.\n *\n * @module core_message/message_drawer_view_conversation_constants\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n\n var SELECTORS = {\n ACTION_ACCEPT_CONTACT_REQUEST: '[data-action=\"accept-contact-request\"]',\n ACTION_CANCEL_CONFIRM: '[data-action=\"cancel-confirm\"]',\n ACTION_OKAY_CONFIRM: '[data-action=\"okay-confirm\"]',\n ACTION_CANCEL_EDIT_MODE: '[data-action=\"cancel-edit-mode\"]',\n ACTION_CONFIRM_ADD_CONTACT: '[data-action=\"confirm-add-contact\"]',\n ACTION_CONFIRM_BLOCK: '[data-action=\"confirm-block\"]',\n ACTION_CONFIRM_DELETE_SELECTED_MESSAGES: '[data-action=\"confirm-delete-selected-messages\"]',\n ACTION_CONFIRM_DELETE_CONVERSATION: '[data-action=\"confirm-delete-conversation\"]',\n ACTION_CONFIRM_FAVOURITE: '[data-action=\"confirm-favourite\"]',\n ACTION_CONFIRM_MUTE: '[data-action=\"confirm-mute\"]',\n ACTION_CONFIRM_UNFAVOURITE: '[data-action=\"confirm-unfavourite\"]',\n ACTION_CONFIRM_REMOVE_CONTACT: '[data-action=\"confirm-remove-contact\"]',\n ACTION_CONFIRM_UNBLOCK: '[data-action=\"confirm-unblock\"]',\n ACTION_CONFIRM_UNMUTE: '[data-action=\"confirm-unmute\"]',\n ACTION_DECLINE_CONTACT_REQUEST: '[data-action=\"decline-contact-request\"]',\n ACTION_REQUEST_ADD_CONTACT: '[data-action=\"request-add-contact\"]',\n ACTION_REQUEST_BLOCK: '[data-action=\"request-block\"]',\n ACTION_REQUEST_DELETE_CONVERSATION: '[data-action=\"request-delete-conversation\"]',\n ACTION_REQUEST_DELETE_SELECTED_MESSAGES: '[data-action=\"delete-selected-messages\"]',\n ACTION_REQUEST_REMOVE_CONTACT: '[data-action=\"request-remove-contact\"]',\n ACTION_REQUEST_UNBLOCK: '[data-action=\"request-unblock\"]',\n ACTION_VIEW_CONTACT: '[data-action=\"view-contact\"]',\n ACTION_VIEW_GROUP_INFO: '[data-action=\"view-group-info\"]',\n CAN_RECEIVE_FOCUS: 'input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]',\n CONFIRM_DIALOGUE_BUTTON_TEXT: '[data-region=\"dialogue-button-text\"]',\n CONFIRM_DIALOGUE_CANCEL_BUTTON: '[data-action=\"cancel-confirm\"]',\n CONFIRM_DIALOGUE_CONTAINER: '[data-region=\"confirm-dialogue-container\"]',\n CONFIRM_DIALOGUE_HEADER: '[data-region=\"dialogue-header\"]',\n CONFIRM_DIALOGUE_OKAY_BUTTON: '[data-action=\"okay-confirm\"]',\n CONFIRM_DIALOGUE_TEXT: '[data-region=\"dialogue-text\"]',\n CONTACT_REQUEST_SENT_MESSAGE_CONTAINER: '[data-region=\"contact-request-sent-message-container\"]',\n CONTENT_PLACEHOLDER_CONTAINER: '[data-region=\"content-placeholder\"]',\n CONTENT_CONTAINER: '[data-region=\"content-container\"]',\n CONTENT_MESSAGES_CONTAINER: '[data-region=\"content-message-container\"]',\n CONTENT_MESSAGES_FOOTER_CONTAINER: '[data-region=\"content-messages-footer-container\"]',\n CONTENT_MESSAGES_FOOTER_EDIT_MODE_CONTAINER: '[data-region=\"content-messages-footer-edit-mode-container\"]',\n CONTENT_MESSAGES_FOOTER_REQUIRE_CONTACT_CONTAINER: '[data-region=\"content-messages-footer-require-contact-container\"]',\n CONTENT_MESSAGES_FOOTER_REQUIRE_UNBLOCK_CONTAINER: '[data-region=\"content-messages-footer-require-unblock-container\"]',\n CONTENT_MESSAGES_FOOTER_UNABLE_TO_MESSAGE_CONTAINER: '[data-region=\"content-messages-footer-unable-to-message\"]',\n DAY_MESSAGES_CONTAINER: '[data-region=\"day-messages-container\"]',\n DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE: '[data-region=\"delete-messages-for-all-users-toggle\"]',\n DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE_CONTAINER: '[data-region=\"delete-messages-for-all-users-toggle-container\"]',\n EMOJI_AUTO_COMPLETE_CONTAINER: '[data-region=\"emoji-auto-complete-container\"]',\n EMOJI_PICKER_CONTAINER: '[data-region=\"emoji-picker-container\"]',\n EMOJI_PICKER: '[data-region=\"emoji-picker\"]',\n EMOJI_PICKER_SEARCH_INPUT: '[data-region=\"search-input\"]',\n ERROR_MESSAGE_CONTAINER: '[data-region=\"error-message-container\"]',\n ERROR_MESSAGE: '[data-region=\"error-message\"]',\n FAVOURITE_ICON_CONTAINER: '[data-region=\"favourite-icon-container\"]',\n FOOTER_CONTAINER: '[data-region=\"content-messages-footer-container\"]',\n HEADER: '[data-region=\"header-content\"]',\n HEADER_EDIT_MODE: '[data-region=\"header-edit-mode\"]',\n HEADER_PLACEHOLDER_CONTAINER: '[data-region=\"header-placeholder\"]',\n LOADING_ICON_CONTAINER: '[data-region=\"loading-icon-container\"]',\n MESSAGE: '[data-region=\"message\"]',\n MESSAGE_NOT_SELECTED: '[data-region=\"message\"][aria-checked=\"false\"]',\n MESSAGE_NOT_SELECTED_ICON: '[data-region=\"not-selected-icon\"]',\n MESSAGE_SELECTED_ICON: '[data-region=\"selected-icon\"]',\n MESSAGES: '[data-region=\"content-message-container\"]',\n MESSAGES_CONTAINER: '[data-region=\"content-message-container\"]',\n MESSAGES_SELECTED_COUNT: '[data-region=\"message-selected-court\"]',\n MESSAGE_TEXT_AREA: '[data-region=\"send-message-txt\"]',\n MORE_MESSAGES_LOADING_ICON_CONTAINER: '[data-region=\"more-messages-loading-icon-container\"]',\n MUTED_ICON_CONTAINER: '[data-region=\"muted-icon-container\"]',\n PLACEHOLDER_CONTAINER: '[data-region=\"placeholder-container\"]',\n RETRY_SEND: '[data-region=\"retry-send\"]',\n SELF_CONVERSATION_MESSAGE_CONTAINER: '[data-region=\"self-conversation-message-container\"]',\n SEND_MESSAGE_BUTTON: '[data-action=\"send-message\"]',\n SEND_MESSAGE_ICON_CONTAINER: '[data-region=\"send-icon-container\"]',\n TEXT: '[data-region=\"text\"]',\n TEXT_CONTAINER: '[data-region=\"text-container\"]',\n TIME_CREATED: '[data-region=\"time-created\"]',\n TITLE: '[data-region=\"title\"]',\n TOGGLE_EMOJI_PICKER_BUTTON: '[data-action=\"toggle-emoji-picker\"]'\n };\n\n var TEMPLATES = {\n HEADER_PRIVATE: 'core_message/message_drawer_view_conversation_header_content_type_private',\n HEADER_PRIVATE_NO_CONTROLS: 'core_message/message_drawer_view_conversation_header_content_type_private_no_controls',\n HEADER_PUBLIC: 'core_message/message_drawer_view_conversation_header_content_type_public',\n HEADER_SELF: 'core_message/message_drawer_view_conversation_header_content_type_self',\n DAY: 'core_message/message_drawer_view_conversation_body_day',\n MESSAGE: 'core_message/message_drawer_view_conversation_body_message',\n MESSAGES: 'core_message/message_drawer_view_conversation_body_messages'\n };\n\n // Conversation types. They must have the same values defined in \\core_message\\api.\n var CONVERSATION_TYPES = {\n PRIVATE: 1,\n PUBLIC: 2,\n SELF: 3\n };\n\n return {\n SELECTORS: SELECTORS,\n TEMPLATES: TEMPLATES,\n CONVERSATION_TYPES: CONVERSATION_TYPES,\n NEWEST_MESSAGES_FIRST: true,\n LOAD_MESSAGE_LIMIT: 100,\n MILLISECONDS_IN_SEC: 1000\n };\n});\n"],"file":"message_drawer_view_conversation_constants.min.js"} \ No newline at end of file +{"version":3,"sources":["../src/message_drawer_view_conversation_constants.js"],"names":["define","SELECTORS","ACTION_ACCEPT_CONTACT_REQUEST","ACTION_CANCEL_CONFIRM","ACTION_OKAY_CONFIRM","ACTION_CANCEL_EDIT_MODE","ACTION_CONFIRM_ADD_CONTACT","ACTION_CONFIRM_BLOCK","ACTION_CONFIRM_DELETE_SELECTED_MESSAGES","ACTION_CONFIRM_DELETE_CONVERSATION","ACTION_CONFIRM_FAVOURITE","ACTION_CONFIRM_MUTE","ACTION_CONFIRM_UNFAVOURITE","ACTION_CONFIRM_REMOVE_CONTACT","ACTION_CONFIRM_UNBLOCK","ACTION_CONFIRM_UNMUTE","ACTION_DECLINE_CONTACT_REQUEST","ACTION_REQUEST_ADD_CONTACT","ACTION_REQUEST_BLOCK","ACTION_REQUEST_DELETE_CONVERSATION","ACTION_REQUEST_DELETE_SELECTED_MESSAGES","ACTION_REQUEST_REMOVE_CONTACT","ACTION_REQUEST_UNBLOCK","ACTION_VIEW_CONTACT","ACTION_VIEW_GROUP_INFO","CAN_RECEIVE_FOCUS","CONFIRM_DIALOGUE","CONFIRM_DIALOGUE_BUTTON_TEXT","CONFIRM_DIALOGUE_CANCEL_BUTTON","CONFIRM_DIALOGUE_CONTAINER","CONFIRM_DIALOGUE_HEADER","CONFIRM_DIALOGUE_OKAY_BUTTON","CONFIRM_DIALOGUE_TEXT","CONTACT_REQUEST_SENT_MESSAGE_CONTAINER","CONTENT_PLACEHOLDER_CONTAINER","CONTENT_CONTAINER","CONTENT_MESSAGES_CONTAINER","CONTENT_MESSAGES_FOOTER_CONTAINER","CONTENT_MESSAGES_FOOTER_EDIT_MODE_CONTAINER","CONTENT_MESSAGES_FOOTER_REQUIRE_CONTACT_CONTAINER","CONTENT_MESSAGES_FOOTER_REQUIRE_UNBLOCK_CONTAINER","CONTENT_MESSAGES_FOOTER_UNABLE_TO_MESSAGE_CONTAINER","DAY_MESSAGES_CONTAINER","DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE","DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE_CONTAINER","EMOJI_AUTO_COMPLETE_CONTAINER","EMOJI_PICKER_CONTAINER","EMOJI_PICKER","EMOJI_PICKER_SEARCH_INPUT","ERROR_MESSAGE_CONTAINER","ERROR_MESSAGE","FAVOURITE_ICON_CONTAINER","FOOTER_CONTAINER","HEADER","HEADER_EDIT_MODE","HEADER_PLACEHOLDER_CONTAINER","LOADING_ICON_CONTAINER","MESSAGE","MESSAGE_NOT_SELECTED","MESSAGE_NOT_SELECTED_ICON","MESSAGE_SELECTED_ICON","MESSAGES","MESSAGES_CONTAINER","MESSAGES_SELECTED_COUNT","MESSAGE_TEXT_AREA","MORE_MESSAGES_LOADING_ICON_CONTAINER","MUTED_ICON_CONTAINER","PLACEHOLDER_CONTAINER","RETRY_SEND","SELF_CONVERSATION_MESSAGE_CONTAINER","SEND_MESSAGE_BUTTON","SEND_MESSAGE_ICON_CONTAINER","TEXT","TEXT_CONTAINER","TIME_CREATED","TITLE","TOGGLE_EMOJI_PICKER_BUTTON","TEMPLATES","HEADER_PRIVATE","HEADER_PRIVATE_NO_CONTROLS","HEADER_PUBLIC","HEADER_SELF","DAY","CONVERSATION_TYPES","PRIVATE","PUBLIC","SELF","NEWEST_MESSAGES_FIRST","LOAD_MESSAGE_LIMIT","MILLISECONDS_IN_SEC"],"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 .\n\n/**\n * Constant values for the conversation page in the message drawer.\n *\n * @module core_message/message_drawer_view_conversation_constants\n * @copyright 2018 Ryan Wyllie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine([], function() {\n\n var SELECTORS = {\n ACTION_ACCEPT_CONTACT_REQUEST: '[data-action=\"accept-contact-request\"]',\n ACTION_CANCEL_CONFIRM: '[data-action=\"cancel-confirm\"]',\n ACTION_OKAY_CONFIRM: '[data-action=\"okay-confirm\"]',\n ACTION_CANCEL_EDIT_MODE: '[data-action=\"cancel-edit-mode\"]',\n ACTION_CONFIRM_ADD_CONTACT: '[data-action=\"confirm-add-contact\"]',\n ACTION_CONFIRM_BLOCK: '[data-action=\"confirm-block\"]',\n ACTION_CONFIRM_DELETE_SELECTED_MESSAGES: '[data-action=\"confirm-delete-selected-messages\"]',\n ACTION_CONFIRM_DELETE_CONVERSATION: '[data-action=\"confirm-delete-conversation\"]',\n ACTION_CONFIRM_FAVOURITE: '[data-action=\"confirm-favourite\"]',\n ACTION_CONFIRM_MUTE: '[data-action=\"confirm-mute\"]',\n ACTION_CONFIRM_UNFAVOURITE: '[data-action=\"confirm-unfavourite\"]',\n ACTION_CONFIRM_REMOVE_CONTACT: '[data-action=\"confirm-remove-contact\"]',\n ACTION_CONFIRM_UNBLOCK: '[data-action=\"confirm-unblock\"]',\n ACTION_CONFIRM_UNMUTE: '[data-action=\"confirm-unmute\"]',\n ACTION_DECLINE_CONTACT_REQUEST: '[data-action=\"decline-contact-request\"]',\n ACTION_REQUEST_ADD_CONTACT: '[data-action=\"request-add-contact\"]',\n ACTION_REQUEST_BLOCK: '[data-action=\"request-block\"]',\n ACTION_REQUEST_DELETE_CONVERSATION: '[data-action=\"request-delete-conversation\"]',\n ACTION_REQUEST_DELETE_SELECTED_MESSAGES: '[data-action=\"delete-selected-messages\"]',\n ACTION_REQUEST_REMOVE_CONTACT: '[data-action=\"request-remove-contact\"]',\n ACTION_REQUEST_UNBLOCK: '[data-action=\"request-unblock\"]',\n ACTION_VIEW_CONTACT: '[data-action=\"view-contact\"]',\n ACTION_VIEW_GROUP_INFO: '[data-action=\"view-group-info\"]',\n CAN_RECEIVE_FOCUS: 'input:not([type=\"hidden\"]), a[href], button, textarea, select, [tabindex]',\n CONFIRM_DIALOGUE: '[data-region=\"confirm-dialogue\"]',\n CONFIRM_DIALOGUE_BUTTON_TEXT: '[data-region=\"dialogue-button-text\"]',\n CONFIRM_DIALOGUE_CANCEL_BUTTON: '[data-action=\"cancel-confirm\"]',\n CONFIRM_DIALOGUE_CONTAINER: '[data-region=\"confirm-dialogue-container\"]',\n CONFIRM_DIALOGUE_HEADER: '[data-region=\"dialogue-header\"]',\n CONFIRM_DIALOGUE_OKAY_BUTTON: '[data-action=\"okay-confirm\"]',\n CONFIRM_DIALOGUE_TEXT: '[data-region=\"dialogue-text\"]',\n CONTACT_REQUEST_SENT_MESSAGE_CONTAINER: '[data-region=\"contact-request-sent-message-container\"]',\n CONTENT_PLACEHOLDER_CONTAINER: '[data-region=\"content-placeholder\"]',\n CONTENT_CONTAINER: '[data-region=\"content-container\"]',\n CONTENT_MESSAGES_CONTAINER: '[data-region=\"content-message-container\"]',\n CONTENT_MESSAGES_FOOTER_CONTAINER: '[data-region=\"content-messages-footer-container\"]',\n CONTENT_MESSAGES_FOOTER_EDIT_MODE_CONTAINER: '[data-region=\"content-messages-footer-edit-mode-container\"]',\n CONTENT_MESSAGES_FOOTER_REQUIRE_CONTACT_CONTAINER: '[data-region=\"content-messages-footer-require-contact-container\"]',\n CONTENT_MESSAGES_FOOTER_REQUIRE_UNBLOCK_CONTAINER: '[data-region=\"content-messages-footer-require-unblock-container\"]',\n CONTENT_MESSAGES_FOOTER_UNABLE_TO_MESSAGE_CONTAINER: '[data-region=\"content-messages-footer-unable-to-message\"]',\n DAY_MESSAGES_CONTAINER: '[data-region=\"day-messages-container\"]',\n DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE: '[data-region=\"delete-messages-for-all-users-toggle\"]',\n DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE_CONTAINER: '[data-region=\"delete-messages-for-all-users-toggle-container\"]',\n EMOJI_AUTO_COMPLETE_CONTAINER: '[data-region=\"emoji-auto-complete-container\"]',\n EMOJI_PICKER_CONTAINER: '[data-region=\"emoji-picker-container\"]',\n EMOJI_PICKER: '[data-region=\"emoji-picker\"]',\n EMOJI_PICKER_SEARCH_INPUT: '[data-region=\"search-input\"]',\n ERROR_MESSAGE_CONTAINER: '[data-region=\"error-message-container\"]',\n ERROR_MESSAGE: '[data-region=\"error-message\"]',\n FAVOURITE_ICON_CONTAINER: '[data-region=\"favourite-icon-container\"]',\n FOOTER_CONTAINER: '[data-region=\"content-messages-footer-container\"]',\n HEADER: '[data-region=\"header-content\"]',\n HEADER_EDIT_MODE: '[data-region=\"header-edit-mode\"]',\n HEADER_PLACEHOLDER_CONTAINER: '[data-region=\"header-placeholder\"]',\n LOADING_ICON_CONTAINER: '[data-region=\"loading-icon-container\"]',\n MESSAGE: '[data-region=\"message\"]',\n MESSAGE_NOT_SELECTED: '[data-region=\"message\"][aria-checked=\"false\"]',\n MESSAGE_NOT_SELECTED_ICON: '[data-region=\"not-selected-icon\"]',\n MESSAGE_SELECTED_ICON: '[data-region=\"selected-icon\"]',\n MESSAGES: '[data-region=\"content-message-container\"]',\n MESSAGES_CONTAINER: '[data-region=\"content-message-container\"]',\n MESSAGES_SELECTED_COUNT: '[data-region=\"message-selected-court\"]',\n MESSAGE_TEXT_AREA: '[data-region=\"send-message-txt\"]',\n MORE_MESSAGES_LOADING_ICON_CONTAINER: '[data-region=\"more-messages-loading-icon-container\"]',\n MUTED_ICON_CONTAINER: '[data-region=\"muted-icon-container\"]',\n PLACEHOLDER_CONTAINER: '[data-region=\"placeholder-container\"]',\n RETRY_SEND: '[data-region=\"retry-send\"]',\n SELF_CONVERSATION_MESSAGE_CONTAINER: '[data-region=\"self-conversation-message-container\"]',\n SEND_MESSAGE_BUTTON: '[data-action=\"send-message\"]',\n SEND_MESSAGE_ICON_CONTAINER: '[data-region=\"send-icon-container\"]',\n TEXT: '[data-region=\"text\"]',\n TEXT_CONTAINER: '[data-region=\"text-container\"]',\n TIME_CREATED: '[data-region=\"time-created\"]',\n TITLE: '[data-region=\"title\"]',\n TOGGLE_EMOJI_PICKER_BUTTON: '[data-action=\"toggle-emoji-picker\"]'\n };\n\n var TEMPLATES = {\n HEADER_PRIVATE: 'core_message/message_drawer_view_conversation_header_content_type_private',\n HEADER_PRIVATE_NO_CONTROLS: 'core_message/message_drawer_view_conversation_header_content_type_private_no_controls',\n HEADER_PUBLIC: 'core_message/message_drawer_view_conversation_header_content_type_public',\n HEADER_SELF: 'core_message/message_drawer_view_conversation_header_content_type_self',\n DAY: 'core_message/message_drawer_view_conversation_body_day',\n MESSAGE: 'core_message/message_drawer_view_conversation_body_message',\n MESSAGES: 'core_message/message_drawer_view_conversation_body_messages'\n };\n\n // Conversation types. They must have the same values defined in \\core_message\\api.\n var CONVERSATION_TYPES = {\n PRIVATE: 1,\n PUBLIC: 2,\n SELF: 3\n };\n\n return {\n SELECTORS: SELECTORS,\n TEMPLATES: TEMPLATES,\n CONVERSATION_TYPES: CONVERSATION_TYPES,\n NEWEST_MESSAGES_FIRST: true,\n LOAD_MESSAGE_LIMIT: 100,\n MILLISECONDS_IN_SEC: 1000\n };\n});\n"],"file":"message_drawer_view_conversation_constants.min.js"} \ No newline at end of file diff --git a/message/amd/build/message_drawer_view_conversation_renderer.min.js b/message/amd/build/message_drawer_view_conversation_renderer.min.js index b24dd692fff..6d35caebdfb 100644 --- a/message/amd/build/message_drawer_view_conversation_renderer.min.js +++ b/message/amd/build/message_drawer_view_conversation_renderer.min.js @@ -1,2 +1,2 @@ -define ("core_message/message_drawer_view_conversation_renderer",["jquery","core/notification","core/str","core/templates","core/user_date","core_message/message_drawer_view_conversation_constants"],function(a,b,c,d,e,f){var g=f.SELECTORS,h=f.TEMPLATES,i=f.CONVERSATION_TYPES,j=function(a){return a.find(g.CONTENT_MESSAGES_CONTAINER)},k=function(a){j(a).removeClass("hidden")},l=function(a){j(a).addClass("hidden")},m=function(a){return a.find(g.SELF_CONVERSATION_MESSAGE_CONTAINER)},n=function(a){return m(a).addClass("hidden")},o=function(a){return a.find(g.CONTACT_REQUEST_SENT_MESSAGE_CONTAINER)},p=function(a){return o(a).addClass("hidden")},q=function(a){return a.find(g.CONTENT_MESSAGES_FOOTER_CONTAINER)},r=function(a){q(a).removeClass("hidden")},s=function(a){q(a).addClass("hidden")},t=function(a){return a.find(g.CONTENT_MESSAGES_FOOTER_EDIT_MODE_CONTAINER)},u=function(a){t(a).removeClass("hidden")},v=function(a){t(a).addClass("hidden")},w=function(a){return a.find(g.PLACEHOLDER_CONTAINER)},x=function(a){w(a).removeClass("hidden")},y=function(a){w(a).addClass("hidden")},z=function(a){return a.find(g.CONTENT_MESSAGES_FOOTER_REQUIRE_CONTACT_CONTAINER)},A=function(a){z(a).removeClass("hidden")},B=function(a){z(a).addClass("hidden")},C=function(a){return a.find(g.CONTENT_MESSAGES_FOOTER_REQUIRE_UNBLOCK_CONTAINER)},D=function(a){C(a).removeClass("hidden")},E=function(a){C(a).addClass("hidden")},F=function(a){return a.find(g.CONTENT_MESSAGES_FOOTER_UNABLE_TO_MESSAGE_CONTAINER)},G=function(a){F(a).removeClass("hidden")},H=function(a){F(a).addClass("hidden")},I=function(a){P(a);S(a);V(a)},J=function(a){s(a);v(a);y(a);B(a);E(a);H(a)},K=function(a){return a.find(g.CONTENT_PLACEHOLDER_CONTAINER)},L=function(a){K(a).removeClass("hidden")},M=function(a){K(a).addClass("hidden")},N=function(a){return a.find(g.HEADER)},O=function(a){N(a).removeClass("hidden")},P=function(a){N(a).addClass("hidden")},Q=function(a){return a.find(g.HEADER_EDIT_MODE)},R=function(a){Q(a).removeClass("hidden")},S=function(a){Q(a).addClass("hidden")},T=function(a){return a.find(g.HEADER_PLACEHOLDER_CONTAINER)},U=function(a){T(a).removeClass("hidden")},V=function(a){T(a).addClass("hidden")},W=function(a){return a.find(g.EMOJI_PICKER_CONTAINER)},X=function(a){return a.find(g.EMOJI_AUTO_COMPLETE_CONTAINER)},Y=function(a,b){var c=j(a);return c.find("[data-message-id=\""+b+"\"]")},Z=function(a,b){var c=j(a);return c.find("[data-day-id=\""+b+"\"]")},$=function(a){return a.find(g.MORE_MESSAGES_LOADING_ICON_CONTAINER)},_=function(a){$(a).removeClass("hidden")},aa=function(a){$(a).addClass("hidden")},ba=function(a){return a.find(g.CONFIRM_DIALOGUE_CONTAINER)},ca=function(a){var b=ba(a),c=b.siblings(":not(.hidden)");c.attr("aria-hidden",!0);c.attr("tabindex",-1);c.attr("data-confirm-dialogue-hidden",!0);b.removeClass("hidden")},da=function(a){var b=ba(a),c=b.siblings("[data-confirm-dialogue-hidden=\"true\"]");c.removeAttr("aria-hidden");c.removeAttr("tabindex");c.removeAttr("data-confirm-dialogue-hidden");b.addClass("hidden")},ea=function(a,b){Q(a).find(g.MESSAGES_SELECTED_COUNT).text(b)},fa=function(a,b){return a.map(function(a){return{id:a.id,isread:a.isRead,fromloggedinuser:a.fromLoggedInUser,userfrom:a.userFrom,text:a.text,formattedtime:a.timeCreated?b[a.timeCreated]:null}})},ga=function(b,c,e,f,g){var i=j(c),k=f.map(function(a){return d.render(h.DAY,{timestamp:a.value.timestamp,messages:fa(a.value.messages,g)})});return a.when.apply(a,k).then(function(){f.forEach(function(b,d){k[d].then(function(d){if(b.before){var e=Z(c,b.before.timestamp);return a(d).insertBefore(e)}else{return i.append(d)}}).catch(function(){})})})},ha=function(b,c,e,f,i){var j=f.map(function(a){return a.value}),k=fa(j,i);return d.render(h.MESSAGES,{messages:k}).then(function(b){var d=a(b);f.forEach(function(a){var b=d.find("[data-message-id=\""+a.value.id+"\"]");if(a.before){var e=Y(c,a.before.id);return b.insertBefore(e)}else{var f=Z(c,a.day.timestamp),h=f.find(g.DAY_MESSAGES_CONTAINER);return h.append(b)}})})},ia=function(a,b,c,d,e){d.forEach(function(a){var c=a.before,d=a.after,f=Y(b,c.id);if(c.id!=d.id){f.attr("data-message-id",d.id)}if(c.timeCreated!=d.timeCreated){var h=e[d.timeCreated];f.find(g.LOADING_ICON_CONTAINER).addClass("hidden");f.find(g.TIME_CREATED).text(h).removeClass("hidden")}if(c.sendState!=d.sendState){var i=f.find(g.LOADING_ICON_CONTAINER),j=f.find(g.TIME_CREATED),k=f.find(g.RETRY_SEND);i.addClass("hidden");i.attr("aria-hidden","true");j.addClass("hidden");j.attr("aria-hidden","true");k.addClass("hidden");k.attr("aria-hidden","true");f.removeClass("border border-danger");switch(d.sendState){case"pending":i.removeClass("hidden");i.attr("aria-hidden","false");break;case"error":k.removeClass("hidden");k.attr("aria-hidden","false");f.addClass("border border-danger");break;case"sent":j.removeClass("hidden");j.attr("aria-hidden","false");break;}}if(c.text!=d.text){f.find(g.TEXT_CONTAINER).html(d.text)}if(c.errorMessage!=d.errorMessage){var l=f.find(g.ERROR_MESSAGE_CONTAINER),a=l.find(g.ERROR_MESSAGE);if(d.errorMessage){l.removeClass("hidden");l.attr("aria-hidden","false");a.text(d.errorMessage)}else{l.addClass("hidden");l.attr("aria-hidden","true");a.text("")}}})},ja=function(a,b){b.forEach(function(b){Z(a,b.timestamp).remove()})},ka=function(a,b){b.forEach(function(b){Y(a,b.id).remove()})},la=function(b,d,f,g){var h=[],i=0");q.text(h);var r=l.find(g.CONFIRM_DIALOGUE);r.prepend(q)}else if(q.length){q.remove()}m.forEach(function(a){a.removeClass("hidden")});p.text(f);ca(d);ca(c);if(!j){ca(b)}l.find(g.CAN_RECEIVE_FOCUS).filter(":visible").first().focus()},va=function(a,b,c){var d=ba(b),e=d.find(g.CONFIRM_DIALOGUE_CANCEL_BUTTON),f=d.find(g.CONFIRM_DIALOGUE_OKAY_BUTTON),h=d.find(g.CONFIRM_DIALOGUE_TEXT),i=d.find(g.CONFIRM_DIALOGUE_HEADER);Ea(b);da(b);da(c);da(a);d.find("button").addClass("hidden");e.removeClass("hidden");f.removeClass("hidden");h.text("");if(i.length){i.remove()}a.find(g.CAN_RECEIVE_FOCUS).first().focus();return!0},wa=function(a,b,d,e){if(e){if(e.canmessageevenifblocked){return c.get_string("cantblockuser","core_message",e.fullname).then(function(c){return ua(a,b,d,[],c,"",!1,!1,!0)})}else{return c.get_string("blockuserconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_BLOCK],c,"",!0,!1)})}}else{return va(a,b,d)}},xa=function(a,b,d,e){if(e){return c.get_string("unblockuserconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_UNBLOCK],c,"",!0,!1)})}else{return va(a,b,d)}},ya=function(a,b,d,e){if(e){return c.get_string("addcontactconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_ADD_CONTACT],c,"",!0,!1)})}else{return va(a,b,d)}},za=function(a,b,d,e){if(e){return c.get_string("removecontactconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_REMOVE_CONTACT],c,"",!0,!1)})}else{return va(a,b,d)}},Aa=function(a,b,d,e){var f=null;if(e.type==i.SELF){f="deleteselectedmessagesconfirmselfconversation"}else{if(e.canDeleteMessagesForAllUsers){Da(b);f="deleteforeveryoneselectedmessagesconfirm"}else{f="deleteselectedmessagesconfirm"}}if(e.show){return c.get_string(f,"core_message").then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_DELETE_SELECTED_MESSAGES],c,"",!0,!1)})}else{return va(a,b,d)}},Ba=function(a,b,d,e){var f=null;if(e==i.SELF){f="deleteallselfconfirm"}else if(e){f="deleteallconfirm"}if(f){return c.get_string(f,"core_message").then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_DELETE_CONVERSATION],c,"",!0,!1)})}else{return va(a,b,d)}},Ca=function(a,b,d,e){if(e){return c.get_string("userwouldliketocontactyou","core_message",e.fullname).then(function(c){var e=[g.ACTION_ACCEPT_CONTACT_REQUEST,g.ACTION_DECLINE_CONTACT_REQUEST];return ua(a,b,d,e,c,"",!1,!0)})}else{return va(a,b,d)}},Da=function(a){var b=ba(a),c=b.find(g.DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE_CONTAINER);c.removeClass("hidden")},Ea=function(a){var b=ba(a),c=b.find(g.DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE_CONTAINER),d=b.find(g.DELETE_MESSAGES_FOR_ALL_USERS_TOGGLE);d.prop("checked",!1);c.addClass("hidden")},Fa=function(a,b,c,d){if(d){a.find(g.ACTION_REQUEST_BLOCK).addClass("hidden");a.find(g.ACTION_REQUEST_UNBLOCK).removeClass("hidden")}else{a.find(g.ACTION_REQUEST_BLOCK).removeClass("hidden");a.find(g.ACTION_REQUEST_UNBLOCK).addClass("hidden")}},Ga=function(a,b,c,d){var e=a.find(g.FAVOURITE_ICON_CONTAINER),f=a.find(g.ACTION_CONFIRM_FAVOURITE),h=a.find(g.ACTION_CONFIRM_UNFAVOURITE);switch(d){case"hide":e.addClass("hidden");f.addClass("hidden");h.addClass("hidden");break;case"show-add":e.addClass("hidden");f.removeClass("hidden");h.addClass("hidden");break;case"show-remove":e.removeClass("hidden");f.addClass("hidden");h.removeClass("hidden");break;}},Ha=function(a,b,c,d){var e=a.find(g.MUTED_ICON_CONTAINER),f=a.find(g.ACTION_CONFIRM_MUTE),h=a.find(g.ACTION_CONFIRM_UNMUTE);switch(d){case"hide":e.addClass("hidden");f.addClass("hidden");h.addClass("hidden");break;case"show-mute":e.addClass("hidden");f.removeClass("hidden");h.addClass("hidden");break;case"show-unmute":e.removeClass("hidden");f.addClass("hidden");h.removeClass("hidden");break;}},Ia=function(a,b,c,d){var e=a.find(g.ACTION_REQUEST_ADD_CONTACT),f=a.find(g.ACTION_REQUEST_REMOVE_CONTACT);switch(d){case"pending-contact":e.addClass("hidden");f.addClass("hidden");break;case"contact":e.addClass("hidden");f.removeClass("hidden");break;case"non-contact":e.removeClass("hidden");f.addClass("hidden");break;}},Ja=function(a,b,c,d){var e=ba(b),f=e.find("button"),h=e.find(g.CONFIRM_DIALOGUE_BUTTON_TEXT),i=e.find(g.LOADING_ICON_CONTAINER);if(d){f.prop("disabled",!0);h.addClass("hidden");i.removeClass("hidden")}else{f.prop("disabled",!1);h.removeClass("hidden");i.addClass("hidden")}},Ka=function(a,b,c,d){var e=null;if(d){e=b.find(g.MESSAGE_NOT_SELECTED);e.find(g.MESSAGE_NOT_SELECTED_ICON).removeClass("hidden");P(a);R(a)}else{e=j(b);e.find(g.MESSAGE_NOT_SELECTED_ICON).addClass("hidden");e.find(g.MESSAGE_SELECTED_ICON).addClass("hidden");O(a);S(a)}},La=function(a,b,c,d){var e=0.\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 \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],\nfunction(\n $,\n Notification,\n Str,\n Templates,\n UserDate,\n Constants\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 siblings.attr('aria-hidden', true);\n siblings.attr('tabindex', -1);\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 siblings.removeAttr('aria-hidden');\n siblings.removeAttr('tabindex');\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 loading.attr('aria-hidden', 'true');\n time.addClass('hidden');\n time.attr('aria-hidden', 'true');\n retry.addClass('hidden');\n retry.attr('aria-hidden', 'true');\n element.removeClass('border border-danger');\n\n switch (after.sendState) {\n case 'pending':\n loading.removeClass('hidden');\n loading.attr('aria-hidden', 'false');\n break;\n case 'error':\n retry.removeClass('hidden');\n retry.attr('aria-hidden', 'false');\n element.addClass('border border-danger');\n break;\n case 'sent':\n time.removeClass('hidden');\n time.attr('aria-hidden', 'false');\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 messageContainer.attr('aria-hidden', 'false');\n message.text(after.errorMessage);\n } else {\n messageContainer.addClass('hidden');\n messageContainer.attr('aria-hidden', 'true');\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 container.attr('aria-hidden', false);\n container.find(SELECTORS.EMOJI_PICKER_SEARCH_INPUT).focus();\n } else {\n container.addClass('hidden');\n container.attr('aria-hidden', true);\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 container.attr('aria-hidden', false);\n } else {\n container.addClass('hidden');\n container.attr('aria-hidden', true);\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 dialogueHeader.removeClass('hidden');\n dialogueHeader.text(headerText);\n } else {\n dialogueHeader.addClass('hidden');\n dialogueHeader.text('');\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 dialogueHeader.addClass('hidden');\n dialogueHeader.text('');\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"} \ No newline at end of file +{"version":3,"sources":["../src/message_drawer_view_conversation_renderer.js"],"names":["define","$","Notification","Str","Templates","UserDate","Constants","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","attr","hideConfirmDialogueContainer","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","get","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 .\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 \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],\nfunction(\n $,\n Notification,\n Str,\n Templates,\n UserDate,\n Constants\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 siblings.attr('aria-hidden', true);\n siblings.attr('tabindex', -1);\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 siblings.removeAttr('aria-hidden');\n siblings.removeAttr('tabindex');\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 loading.attr('aria-hidden', 'true');\n time.addClass('hidden');\n time.attr('aria-hidden', 'true');\n retry.addClass('hidden');\n retry.attr('aria-hidden', 'true');\n element.removeClass('border border-danger');\n\n switch (after.sendState) {\n case 'pending':\n loading.removeClass('hidden');\n loading.attr('aria-hidden', 'false');\n break;\n case 'error':\n retry.removeClass('hidden');\n retry.attr('aria-hidden', 'false');\n element.addClass('border border-danger');\n break;\n case 'sent':\n time.removeClass('hidden');\n time.attr('aria-hidden', 'false');\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 messageContainer.attr('aria-hidden', 'false');\n message.text(after.errorMessage);\n } else {\n messageContainer.addClass('hidden');\n messageContainer.attr('aria-hidden', 'true');\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 container.attr('aria-hidden', false);\n container.find(SELECTORS.EMOJI_PICKER_SEARCH_INPUT).focus();\n } else {\n container.addClass('hidden');\n container.attr('aria-hidden', true);\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 container.attr('aria-hidden', false);\n } else {\n container.addClass('hidden');\n container.attr('aria-hidden', true);\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 = $('

');\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"} \ No newline at end of file diff --git a/message/amd/src/message_drawer_view_conversation_constants.js b/message/amd/src/message_drawer_view_conversation_constants.js index e22d008c879..d1023f8cdba 100644 --- a/message/amd/src/message_drawer_view_conversation_constants.js +++ b/message/amd/src/message_drawer_view_conversation_constants.js @@ -47,6 +47,7 @@ define([], function() { ACTION_VIEW_CONTACT: '[data-action="view-contact"]', ACTION_VIEW_GROUP_INFO: '[data-action="view-group-info"]', CAN_RECEIVE_FOCUS: 'input:not([type="hidden"]), a[href], button, textarea, select, [tabindex]', + CONFIRM_DIALOGUE: '[data-region="confirm-dialogue"]', CONFIRM_DIALOGUE_BUTTON_TEXT: '[data-region="dialogue-button-text"]', CONFIRM_DIALOGUE_CANCEL_BUTTON: '[data-action="cancel-confirm"]', CONFIRM_DIALOGUE_CONTAINER: '[data-region="confirm-dialogue-container"]', diff --git a/message/amd/src/message_drawer_view_conversation_renderer.js b/message/amd/src/message_drawer_view_conversation_renderer.js index dbbb8713165..3f24f26f18f 100644 --- a/message/amd/src/message_drawer_view_conversation_renderer.js +++ b/message/amd/src/message_drawer_view_conversation_renderer.js @@ -1079,11 +1079,15 @@ function( } if (headerText) { - dialogueHeader.removeClass('hidden'); + // Create the dialogue header. + dialogueHeader = $('

'); dialogueHeader.text(headerText); - } else { - dialogueHeader.addClass('hidden'); - dialogueHeader.text(''); + // Prepend it to the confirmation body. + var confirmDialogue = dialogue.find(SELECTORS.CONFIRM_DIALOGUE); + confirmDialogue.prepend(dialogueHeader); + } else if (dialogueHeader.length) { + // Header text is empty but dialogue header is present, so remove it. + dialogueHeader.remove(); } buttons.forEach(function(button) { @@ -1123,8 +1127,11 @@ function( cancelButton.removeClass('hidden'); okayButton.removeClass('hidden'); text.text(''); - dialogueHeader.addClass('hidden'); - dialogueHeader.text(''); + + // Remove dialogue header if present. + if (dialogueHeader.length) { + dialogueHeader.remove(); + } header.find(SELECTORS.CAN_RECEIVE_FOCUS).first().focus(); return true; diff --git a/message/templates/message_drawer_view_conversation_body_confirm_dialogue.mustache b/message/templates/message_drawer_view_conversation_body_confirm_dialogue.mustache index 085ba14dd49..f591b5ea709 100644 --- a/message/templates/message_drawer_view_conversation_body_confirm_dialogue.mustache +++ b/message/templates/message_drawer_view_conversation_body_confirm_dialogue.mustache @@ -36,7 +36,6 @@ }}