From 1fadad46a0d30a6d9b9c9b497cd82b14fc62fbbe Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Wed, 6 Feb 2019 14:53:52 +0800 Subject: [PATCH 1/8] MDL-64773 core: added new table to keep track of muted conversations --- lib/db/install.xml | 16 +++++++++++++++- lib/db/upgrade.php | 26 ++++++++++++++++++++++++++ version.php | 2 +- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/lib/db/install.xml b/lib/db/install.xml index e106f9c18fa..39761379cb0 100644 --- a/lib/db/install.xml +++ b/lib/db/install.xml @@ -1,5 +1,5 @@ - @@ -650,6 +650,20 @@ + + + + + + + + + + + + + +
diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index 51d51572fbb..851b7fdacd4 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -2753,5 +2753,31 @@ function xmldb_main_upgrade($oldversion) { upgrade_main_savepoint(true, 2019030100.01); } + if ($oldversion < 2019030800.00) { + // Define table 'message_conversation_actions' to be created. + // Note - I would have preferred 'message_conversation_user_actions' but due to Oracle we can't. Boo. + $table = new xmldb_table('message_conversation_actions'); + + // Adding fields to table 'message_conversation_actions'. + $table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null); + $table->add_field('userid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null); + $table->add_field('conversationid', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null); + $table->add_field('action', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null); + $table->add_field('timecreated', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, null, null); + + // Adding keys to table 'message_conversation_actions'. + $table->add_key('primary', XMLDB_KEY_PRIMARY, ['id']); + $table->add_key('userid', XMLDB_KEY_FOREIGN, ['userid'], 'user', ['id']); + $table->add_key('conversationid', XMLDB_KEY_FOREIGN, ['conversationid'], 'message_conversations', ['id']); + + // Conditionally launch create table for 'message_conversation_actions'. + if (!$dbman->table_exists($table)) { + $dbman->create_table($table); + } + + // Main savepoint reached. + upgrade_main_savepoint(true, 2019030800.00); + } + return true; } diff --git a/version.php b/version.php index acfa8ec784c..a1bca9e9aee 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2019030700.00; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2019030800.00; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes. From 2687312b29a1c9b15f222eb26a89cad9470fd115 Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Wed, 6 Feb 2019 17:09:16 +0800 Subject: [PATCH 2/8] MDL-64773 core_message: added API to mute/unmute conversations --- message/classes/api.php | 60 +++++++++++++++++++++++++++++ message/tests/api_test.php | 78 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+) diff --git a/message/classes/api.php b/message/classes/api.php index b15a97e4b02..3885da31342 100644 --- a/message/classes/api.php +++ b/message/classes/api.php @@ -48,6 +48,11 @@ class api { */ const MESSAGE_ACTION_DELETED = 2; + /** + * The action for reading a message. + */ + const CONVERSATION_ACTION_MUTED = 1; + /** * The privacy setting for being messaged by anyone within courses user is member of. */ @@ -3133,4 +3138,59 @@ class api { return $counts; } + + /** + * Handles muting a conversation. + * + * @param int $userid The id of the user + * @param int $conversationid The id of the conversation + */ + public static function mute_conversation(int $userid, int $conversationid) : void { + global $DB; + + $mutedconversation = new \stdClass(); + $mutedconversation->userid = $userid; + $mutedconversation->conversationid = $conversationid; + $mutedconversation->action = self::CONVERSATION_ACTION_MUTED; + $mutedconversation->timecreated = time(); + + $DB->insert_record('message_conversation_actions', $mutedconversation); + } + + /** + * Handles unmuting a conversation. + * + * @param int $userid The id of the user + * @param int $conversationid The id of the conversation + */ + public static function unmute_conversation(int $userid, int $conversationid) : void { + global $DB; + + $DB->delete_records('message_conversation_actions', + [ + 'userid' => $userid, + 'conversationid' => $conversationid, + 'action' => self::CONVERSATION_ACTION_MUTED + ] + ); + } + + /** + * Checks whether a conversation is muted or not. + * + * @param int $userid The id of the user + * @param int $conversationid The id of the conversation + * @return bool Whether or not the conversation is muted or not + */ + public static function is_conversation_muted(int $userid, int $conversationid) : bool { + global $DB; + + return $DB->record_exists('message_conversation_actions', + [ + 'userid' => $userid, + 'conversationid' => $conversationid, + 'action' => self::CONVERSATION_ACTION_MUTED + ] + ); + } } diff --git a/message/tests/api_test.php b/message/tests/api_test.php index f3f534b4ac2..ce8ea8d3449 100644 --- a/message/tests/api_test.php +++ b/message/tests/api_test.php @@ -4912,6 +4912,84 @@ class core_message_api_testcase extends core_message_messagelib_testcase { $this->assertEquals(0, $DB->count_records('message_users_blocked')); } + /** + * Test muting a conversation. + */ + public function test_mute_conversation() { + global $DB; + + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + + $conversation = \core_message\api::create_conversation( + \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [ + $user1->id, + $user2->id + ] + ); + $conversationid = $conversation->id; + + \core_message\api::mute_conversation($user1->id, $conversationid); + + $mutedconversation = $DB->get_records('message_conversation_actions'); + + $this->assertCount(1, $mutedconversation); + + $mutedconversation = reset($mutedconversation); + + $this->assertEquals($user1->id, $mutedconversation->userid); + $this->assertEquals($conversationid, $mutedconversation->conversationid); + $this->assertEquals(\core_message\api::CONVERSATION_ACTION_MUTED, $mutedconversation->action); + } + + /** + * Test unmuting a conversation. + */ + public function test_unmute_conversation() { + global $DB; + + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + + $conversation = \core_message\api::create_conversation( + \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [ + $user1->id, + $user2->id + ] + ); + $conversationid = $conversation->id; + + \core_message\api::mute_conversation($user1->id, $conversationid); + \core_message\api::unmute_conversation($user1->id, $conversationid); + + $this->assertEquals(0, $DB->count_records('message_conversation_actions')); + } + + /** + * Test if a conversation is muted. + */ + public function test_is_conversation_muted() { + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + + $conversation = \core_message\api::create_conversation( + \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [ + $user1->id, + $user2->id + ] + ); + $conversationid = $conversation->id; + + $this->assertFalse(\core_message\api::is_conversation_muted($user1->id, $conversationid)); + + \core_message\api::mute_conversation($user1->id, $conversationid); + + $this->assertTrue(\core_message\api::is_conversation_muted($user1->id, $conversationid)); + } + /** * Test is contact check. */ From 086409f6010673c3672b9194195355114c661860 Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Wed, 6 Feb 2019 18:49:18 +0800 Subject: [PATCH 3/8] MDL-64773 core_message: added web services to mute/unmute conversations --- lib/db/services.php | 18 ++++ message/externallib.php | 119 +++++++++++++++++++++ message/tests/externallib_test.php | 162 +++++++++++++++++++++++++++++ version.php | 2 +- 4 files changed, 300 insertions(+), 1 deletion(-) diff --git a/lib/db/services.php b/lib/db/services.php index e69b2472cf8..ea5f502b64e 100644 --- a/lib/db/services.php +++ b/lib/db/services.php @@ -874,6 +874,24 @@ $functions = array( 'type' => 'write', 'capabilities' => 'moodle/course:managegroups' ), + 'core_message_mute_conversations' => array( + 'classname' => 'core_message_external', + 'methodname' => 'mute_conversations', + 'classpath' => 'message/externallib.php', + 'description' => 'Mutes a list of conversations', + 'type' => 'write', + 'ajax' => true, + 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE), + ), + 'core_message_unmute_conversations' => array( + 'classname' => 'core_message_external', + 'methodname' => 'unmute_conversations', + 'classpath' => 'message/externallib.php', + 'description' => 'Unmutes a list of conversations', + 'type' => 'write', + 'ajax' => true, + 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE), + ), 'core_message_block_user' => array( 'classname' => 'core_message_external', 'methodname' => 'block_user', diff --git a/message/externallib.php b/message/externallib.php index a779b987cd4..35238bf9a78 100644 --- a/message/externallib.php +++ b/message/externallib.php @@ -410,6 +410,125 @@ class core_message_external extends external_api { return null; } + /** + * Mute conversations parameters description. + * + * @return external_function_parameters + */ + public static function mute_conversations_parameters() { + return new external_function_parameters( + [ + 'userid' => new external_value(PARAM_INT, 'The id of the user who is blocking'), + 'conversationids' => new external_multiple_structure( + new external_value(PARAM_INT, 'id of the conversation', VALUE_REQUIRED) + ), + ] + ); + } + + /** + * Mutes conversations. + * + * @param int $userid The id of the user who is blocking + * @param array $conversationids The list of conversations being muted + * @return external_description + */ + public static function mute_conversations(int $userid, array $conversationids) { + global $CFG, $USER; + + // Check if messaging is enabled. + if (empty($CFG->messaging)) { + throw new moodle_exception('disabled', 'message'); + } + + // Validate context. + $context = context_system::instance(); + self::validate_context($context); + + $params = ['userid' => $userid, 'conversationids' => $conversationids]; + $params = self::validate_parameters(self::mute_conversations_parameters(), $params); + + $capability = 'moodle/site:manageallmessaging'; + if (($USER->id != $params['userid']) && !has_capability($capability, $context)) { + throw new required_capability_exception($context, $capability, 'nopermissions', ''); + } + + foreach ($params['conversationids'] as $conversationid) { + if (!\core_message\api::is_conversation_muted($params['userid'], $conversationid)) { + \core_message\api::mute_conversation($params['userid'], $conversationid); + } + } + + return []; + } + + /** + * Mute conversations return description. + * + * @return external_description + */ + public static function mute_conversations_returns() { + return new external_warnings(); + } + + /** + * Unmute conversations parameters description. + * + * @return external_function_parameters + */ + public static function unmute_conversations_parameters() { + return new external_function_parameters( + [ + 'userid' => new external_value(PARAM_INT, 'The id of the user who is unblocking'), + 'conversationids' => new external_multiple_structure( + new external_value(PARAM_INT, 'id of the conversation', VALUE_REQUIRED) + ), + ] + ); + } + + /** + * Unmute conversations. + * + * @param int $userid The id of the user who is unblocking + * @param array $conversationids The list of conversations being muted + */ + public static function unmute_conversations(int $userid, array $conversationids) { + global $CFG, $USER; + + // Check if messaging is enabled. + if (empty($CFG->messaging)) { + throw new moodle_exception('disabled', 'message'); + } + + // Validate context. + $context = context_system::instance(); + self::validate_context($context); + + $params = ['userid' => $userid, 'conversationids' => $conversationids]; + $params = self::validate_parameters(self::unmute_conversations_parameters(), $params); + + $capability = 'moodle/site:manageallmessaging'; + if (($USER->id != $params['userid']) && !has_capability($capability, $context)) { + throw new required_capability_exception($context, $capability, 'nopermissions', ''); + } + + foreach ($params['conversationids'] as $conversationid) { + \core_message\api::unmute_conversation($params['userid'], $conversationid); + } + + return []; + } + + /** + * Unmute conversations return description. + * + * @return external_description + */ + public static function unmute_conversations_returns() { + return new external_warnings(); + } + /** * Block user parameters description. * diff --git a/message/tests/externallib_test.php b/message/tests/externallib_test.php index 92c2698e100..098dc0579f4 100644 --- a/message/tests/externallib_test.php +++ b/message/tests/externallib_test.php @@ -1022,6 +1022,168 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { core_message_external::decline_contact_request($user1->id, $user2->id); } + /** + * Test muting conversations. + */ + public function test_mute_conversations() { + global $DB; + + $this->resetAfterTest(true); + + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + + $conversation = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [$user1->id, $user2->id]); + + $this->setUser($user1); + + // Muting a conversation. + $return = core_message_external::mute_conversations($user1->id, [$conversation->id]); + $return = external_api::clean_returnvalue(core_message_external::mute_conversations_returns(), $return); + $this->assertEquals(array(), $return); + + // Get list of muted conversations. + $mca = $DB->get_record('message_conversation_actions', []); + + $this->assertEquals($user1->id, $mca->userid); + $this->assertEquals($conversation->id, $mca->conversationid); + $this->assertEquals(\core_message\api::CONVERSATION_ACTION_MUTED, $mca->action); + + // Muting a conversation that is already muted. + $return = core_message_external::mute_conversations($user1->id, [$conversation->id]); + $return = external_api::clean_returnvalue(core_message_external::mute_conversations_returns(), $return); + $this->assertEquals(array(), $return); + + $this->assertEquals(1, $DB->count_records('message_conversation_actions')); + } + + /** + * Test muting a conversation with messaging disabled. + */ + public function test_mute_conversations_messaging_disabled() { + global $CFG; + + $this->resetAfterTest(); + + // Create some skeleton data just so we can call the WS. + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + + $conversation = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [$user1->id, $user2->id]); + + $this->setUser($user1); + + // Disable messaging. + $CFG->messaging = 0; + + // Ensure an exception is thrown. + $this->expectException('moodle_exception'); + core_message_external::mute_conversations($user1->id, [$conversation->id]); + } + + /** + * Test muting a conversation with no permission. + */ + public function test_mute_conversations_no_permission() { + $this->resetAfterTest(); + + // Create some skeleton data just so we can call the WS. + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + $user3 = self::getDataGenerator()->create_user(); + + $conversation = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [$user1->id, $user2->id]); + + $this->setUser($user3); + + // Ensure an exception is thrown. + $this->expectException('required_capability_exception'); + core_message_external::mute_conversations($user1->id, [$conversation->id]); + } + + /** + * Test unmuting conversations. + */ + public function test_unmute_conversations() { + global $DB; + + $this->resetAfterTest(true); + + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + + $conversation = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [$user1->id, $user2->id]); + + $this->setUser($user1); + + // Mute the conversation. + \core_message\api::mute_conversation($user1->id, $conversation->id); + + // Unmuting a conversation. + $return = core_message_external::unmute_conversations($user1->id, [$conversation->id]); + $return = external_api::clean_returnvalue(core_message_external::unmute_conversations_returns(), $return); + $this->assertEquals(array(), $return); + + $this->assertEquals(0, $DB->count_records('message_conversation_actions')); + + // Unmuting a conversation which is already unmuted. + $return = core_message_external::unmute_conversations($user1->id, [$conversation->id]); + $return = external_api::clean_returnvalue(core_message_external::unmute_conversations_returns(), $return); + $this->assertEquals(array(), $return); + + $this->assertEquals(0, $DB->count_records('message_conversation_actions')); + } + + /** + * Test unmuting a conversation with messaging disabled. + */ + public function test_unmute_conversation_messaging_disabled() { + global $CFG; + + $this->resetAfterTest(); + + // Create some skeleton data just so we can call the WS. + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + + $conversation = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [$user1->id, $user2->id]); + + $this->setUser($user1); + + // Disable messaging. + $CFG->messaging = 0; + + // Ensure an exception is thrown. + $this->expectException('moodle_exception'); + core_message_external::unmute_conversations($user1->id, [$user2->id]); + } + + /** + * Test unmuting a conversation with no permission. + */ + public function test_unmute_conversation_no_permission() { + $this->resetAfterTest(); + + // Create some skeleton data just so we can call the WS. + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + $user3 = self::getDataGenerator()->create_user(); + + $conversation = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [$user1->id, $user2->id]); + + $this->setUser($user3); + + // Ensure an exception is thrown. + $this->expectException('required_capability_exception'); + core_message_external::unmute_conversations($user1->id, [$conversation->id]); + } + /** * Test blocking a user. */ diff --git a/version.php b/version.php index a1bca9e9aee..5656a45cc8f 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2019030800.00; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2019030800.01; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes. From 1c36c11a18c08d6389992f696b270bf5b3e742f3 Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Wed, 6 Feb 2019 19:24:17 +0800 Subject: [PATCH 4/8] MDL-64773 core_message: updated privacy provider --- lang/en/message.php | 5 ++ message/classes/privacy/provider.php | 35 ++++++++++ message/tests/privacy_provider_test.php | 85 ++++++++++++++++++++++++- 3 files changed, 122 insertions(+), 3 deletions(-) diff --git a/lang/en/message.php b/lang/en/message.php index f9a045a1907..ba9e1c37169 100644 --- a/lang/en/message.php +++ b/lang/en/message.php @@ -162,6 +162,11 @@ $string['privacy:metadata:message_contact_requests'] = 'The list of contact requ $string['privacy:metadata:message_contact_requests:requesteduserid'] = 'The ID of the user who received the contact request'; $string['privacy:metadata:message_contact_requests:timecreated'] = 'The time when the contact request was created'; $string['privacy:metadata:message_contact_requests:userid'] = 'The ID of the user who sent the contact request'; +$string['privacy:metadata:message_conversation_actions'] = 'The list of conversation user actions'; +$string['privacy:metadata:message_conversation_actions:action'] = 'The action that was performed'; +$string['privacy:metadata:message_conversation_actions:conversationid'] = 'The ID of the conversation this action belongs to'; +$string['privacy:metadata:message_conversation_actions:timecreated'] = 'The time when the action was created'; +$string['privacy:metadata:message_conversation_actions:userid'] = 'The ID of the user who performed this action'; $string['privacy:metadata:message_conversation_members'] = 'The list of users in a conversation'; $string['privacy:metadata:message_conversation_members:conversationid'] = 'The ID of the conversation'; $string['privacy:metadata:message_conversation_members:timecreated'] = 'The time when the member was created'; diff --git a/message/classes/privacy/provider.php b/message/classes/privacy/provider.php index 8e5441bf526..ee90f5c1fce 100644 --- a/message/classes/privacy/provider.php +++ b/message/classes/privacy/provider.php @@ -99,6 +99,16 @@ class provider implements 'privacy:metadata:message_conversation_members' ); + $items->add_database_table( + 'message_conversation_actions', + [ + 'conversationid' => 'privacy:metadata:message_conversation_actions:conversationid', + 'userid' => 'privacy:metadata:message_conversation_actions:userid', + 'timecreated' => 'privacy:metadata:message_conversation_actions:timecreated', + ], + 'privacy:metadata:message_conversation_actions' + ); + $items->add_database_table( 'message_contacts', [ @@ -205,6 +215,8 @@ class provider implements // It is enough to add the user's context as soon as we come to the conclusion that the user has some data. // Also, the order of checking is sorted by the probability of occurrence (just by guess). // There is no need to check the message_user_actions table, as there needs to be a message in order to be a message action. + // There is no need to check the message_conversation_actions table, as there needs to be a conversation in order to + // be a conversation action. // So, checking messages table would suffice. $hasdata = false; @@ -258,6 +270,8 @@ class provider implements // It is enough to add the user's context as soon as we come to the conclusion that the user has some data. // Also, the order of checking is sorted by the probability of occurrence (just by guess). // There is no need to check the message_user_actions table, as there needs to be a message in order to be a message action. + // There is no need to check the message_conversation_actions table, as there needs to be a conversation in order to + // be a conversation action. // So, checking messages table would suffice. $hasdata = false; @@ -568,6 +582,7 @@ class provider implements // Delete members and conversations. $DB->delete_records_list('message_conversation_members', 'conversationid', $conversationids); + $DB->delete_records_list('message_conversation_actions', 'conversationid', $conversationids); $DB->delete_records_list('message_conversations', 'id', $conversationids); } } @@ -673,6 +688,9 @@ class provider implements // Reuse the $params var because it contains the useridparams and the conversationids. $DB->delete_records_select('message_conversation_members', $sql, $params); + // Delete any conversation actions. + $DB->delete_records_select('message_conversation_actions', $sql, $params); + // Delete the favourite conversations. $userlist = new \core_privacy\local\request\approved_userlist($context, 'core_message', $userids); \core_favourites\privacy\provider::delete_favourites_for_userlist( @@ -763,6 +781,9 @@ class provider implements // Reuse the $params var because it contains the userid and the conversationids. $DB->delete_records_select('message_conversation_members', $sql, $params); + // Delete any conversation actions. + $DB->delete_records_select('message_conversation_actions', $sql, $params); + // Delete the favourite conversations. if (empty($contextids) && empty($component) && empty($itemtype) && empty($itemid)) { // Favourites for individual conversations are stored into the user context. @@ -974,6 +995,20 @@ class provider implements // If the conversation has been favorited by the user, include it in the export. writer::with_context($context)->export_related_data($subcontext, 'starred', (object) $conversationfavourite); } + + // Check if the conversation was muted. + $params = [ + 'userid' => $userid, + 'conversationid' => $conversation->id, + 'action' => \core_message\api::CONVERSATION_ACTION_MUTED + ]; + if ($mca = $DB->get_record('message_conversation_actions', $params)) { + $mcatostore = [ + 'muted' => transform::yesno(true), + 'timecreated' => transform::datetime($mca->timecreated), + ]; + writer::with_context($context)->export_related_data($subcontext, 'muted', (object) $mcatostore); + } } } diff --git a/message/tests/privacy_provider_test.php b/message/tests/privacy_provider_test.php index 425c4253e68..6fc24366528 100644 --- a/message/tests/privacy_provider_test.php +++ b/message/tests/privacy_provider_test.php @@ -47,7 +47,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide $collection = new collection('core_message'); $newcollection = provider::get_metadata($collection); $itemcollection = $newcollection->get_collection(); - $this->assertCount(9, $itemcollection); + $this->assertCount(10, $itemcollection); $messagestable = array_shift($itemcollection); $this->assertEquals('messages', $messagestable->get_name()); @@ -58,6 +58,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide $messageconversationmemberstable = array_shift($itemcollection); $this->assertEquals('message_conversation_members', $messageconversationmemberstable->get_name()); + $messageconversationactions = array_shift($itemcollection); + $this->assertEquals('message_conversation_actions', $messageconversationactions->get_name()); + $messagecontacts = array_shift($itemcollection); $this->assertEquals('message_contacts', $messagecontacts->get_name()); @@ -1584,6 +1587,10 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide \core_message\api::set_favourite_conversation($conversation1->id, $user1->id); \core_message\api::set_favourite_conversation($iconversation1id, $user2->id); + // Mute some conversations. + \core_message\api::mute_conversation($user1->id, $conversation1->id); + \core_message\api::mute_conversation($user2->id, $iconversation1id); + // Send some messages to the conversation. $m1 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1', $now + 1); $m2 = testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 2', $now + 2); @@ -1646,6 +1653,15 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide $this->assertEquals(transform::datetime($now + 5), $m3->timeread); $this->assertArrayNotHasKey('timedeleted', (array) $m3); + // Confirm the muted group conversation is correct. + $mutedconversations = (array) $writer->get_related_data([ + get_string('messages', 'core_message'), + get_string($conversation1->itemtype, $conversation1->component), + get_string('privacy:export:conversationprefix', 'core_message') . $conversation1->name + ], 'muted'); + $this->assertCount(2, $mutedconversations); + $this->assertEquals(get_string('yes'), $mutedconversations['muted']); + // Confirm the favourite group conversation is correct. $favourite = (array) $writer->get_related_data([ get_string('messages', 'core_message'), @@ -1707,6 +1723,14 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide $this->assertEquals('-', $m3->timeread); $this->assertArrayNotHasKey('timedeleted', (array) $m3); + // Confirm the muted group conversation is correct. + $mutedconversations = (array) $writer->get_related_data([ + get_string('messages', 'core_message'), + get_string($conversation1->itemtype, $conversation1->component), + $conversation1->name + ], 'muted'); + $this->assertCount(0, $mutedconversations); + // Confirm there are no favourite group conversation for user2. $favourite = (array) $writer->get_related_data([ get_string('messages', 'core_message'), @@ -1822,6 +1846,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide // Mark as read one of the conversation messages. \core_message\api::mark_message_as_read($user1->id, $dbgm3, $now + 5); + // Mark some conversations as muted by two users. + \core_message\api::mute_conversation($user1->id, $iconversation1id); + \core_message\api::mute_conversation($user1->id, $conversation1->id); + \core_message\api::mute_conversation($user2->id, $conversation1->id); + // There should be 2 contacts. $this->assertEquals(2, $DB->count_records('message_contacts')); @@ -1837,6 +1866,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide // There should be 4 user actions - 3 for reading the message, 1 for deleting. $this->assertEquals(4, $DB->count_records('message_user_actions')); + // There should be 3 muted conversations. + $this->assertEquals(3, $DB->count_records('message_conversation_actions')); + // There should be 4 conversations - 2 individual + 2 group. $this->assertEquals(4, $DB->count_records('message_conversations')); @@ -1861,7 +1893,10 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide // There should be still 2 blocked users. $this->assertEquals(2, $DB->count_records('message_users_blocked')); - // There should be 5 notifications. + // There should be 1 muted conversation. + $this->assertEquals(1, $DB->count_records('message_conversation_actions')); + + // There should be 3 notifications. $this->assertEquals(5, $DB->count_records('notifications')); // There should be 5 messages - 3 individual - 2 group (course2). @@ -1992,6 +2027,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide $dbgm3 = $DB->get_record('messages', ['id' => $gm3]); + // Mark some conversations as muted by two users. + \core_message\api::mute_conversation($user1->id, $iconversation1id); + \core_message\api::mute_conversation($user1->id, $conversation1->id); + \core_message\api::mute_conversation($user2->id, $conversation1->id); + // Mark as read one of the conversation messages. \core_message\api::mark_message_as_read($user1->id, $dbgm3, $now + 5); @@ -2010,6 +2050,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide // There should be 4 user actions - 3 for reading the message, 1 for deleting. $this->assertEquals(4, $DB->count_records('message_user_actions')); + // There should be 3 muted conversations. + $this->assertEquals(3, $DB->count_records('message_conversation_actions')); + // There should be 4 conversations - 2 individual + 2 group. $this->assertEquals(4, $DB->count_records('message_conversations')); @@ -2031,6 +2074,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide $this->assertEquals(2, $DB->count_records('message_users_blocked')); $this->assertEquals(8, $DB->count_records('messages')); $this->assertEquals(4, $DB->count_records('message_user_actions')); + $this->assertEquals(3, $DB->count_records('message_conversation_actions')); $this->assertEquals(4, $DB->count_records('message_conversations')); $this->assertEquals(9, $DB->count_records('message_conversation_members')); $this->assertEquals(5, $DB->count_records('notifications')); @@ -2045,6 +2089,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide $this->assertEquals(2, $DB->count_records('message_users_blocked')); $this->assertEquals(8, $DB->count_records('messages')); $this->assertEquals(4, $DB->count_records('message_user_actions')); + $this->assertEquals(3, $DB->count_records('message_conversation_actions')); $this->assertEquals(4, $DB->count_records('message_conversations')); $this->assertEquals(9, $DB->count_records('message_conversation_members')); $this->assertEquals(5, $DB->count_records('notifications')); @@ -2154,6 +2199,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide // Mark as read one of the conversation messages. \core_message\api::mark_message_as_read($user1->id, $dbgm3, $now + 5); + // Mark some of the conversations as muted by two users. + \core_message\api::mute_conversation($user1->id, $iconversation1id); + \core_message\api::mute_conversation($user1->id, $conversation1->id); + \core_message\api::mute_conversation($user2->id, $conversation1->id); + // There should be 2 contacts. $this->assertEquals(2, $DB->count_records('message_contacts')); @@ -2169,6 +2219,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide // There should be 4 user actions - 3 for reading the message, 1 for deleting. $this->assertEquals(4, $DB->count_records('message_user_actions')); + // There should be 3 muted conversations. + $this->assertEquals(3, $DB->count_records('message_conversation_actions')); + // There should be 4 conversations - 2 individual + 2 group. $this->assertEquals(4, $DB->count_records('message_conversations')); @@ -2190,6 +2243,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide $this->assertEquals(2, $DB->count_records('message_users_blocked')); $this->assertEquals(8, $DB->count_records('messages')); $this->assertEquals(4, $DB->count_records('message_user_actions')); + $this->assertEquals(3, $DB->count_records('message_conversation_actions')); $this->assertEquals(4, $DB->count_records('message_conversations')); $this->assertEquals(9, $DB->count_records('message_conversation_members')); $this->assertEquals(5, $DB->count_records('notifications')); @@ -2204,6 +2258,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide $this->assertEquals(2, $DB->count_records('message_users_blocked')); $this->assertEquals(8, $DB->count_records('messages')); $this->assertEquals(4, $DB->count_records('message_user_actions')); + $this->assertEquals(3, $DB->count_records('message_conversation_actions')); $this->assertEquals(4, $DB->count_records('message_conversations')); $this->assertEquals(9, $DB->count_records('message_conversation_members')); $this->assertEquals(5, $DB->count_records('notifications')); @@ -2301,6 +2356,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide // Mark as read one of the conversation messages. \core_message\api::mark_message_as_read($user1->id, $dbm3, $now + 5); + // Mark some of the conversations as muted by two users. + \core_message\api::mute_conversation($user1->id, $iconversation1id); + \core_message\api::mute_conversation($user1->id, $conversation1->id); + \core_message\api::mute_conversation($user2->id, $conversation1->id); + // There should be 2 contacts. $this->assertEquals(2, $DB->count_records('message_contacts')); @@ -2319,6 +2379,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide // There should be 4 user actions - 3 for reading the message, one for deleting. $this->assertEquals(4, $DB->count_records('message_user_actions')); + // There should be 3 users muting a conversation. + $this->assertEquals(3, $DB->count_records('message_conversation_actions')); + // There should be 3 conversations - 2 private + 1 group. $this->assertEquals(3, $DB->count_records('message_conversations')); @@ -2347,7 +2410,10 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide // There should be still 2 blocked users. $this->assertEquals(2, $DB->count_records('message_users_blocked')); - // There should be 5 notifications. + // There should be 2 muted conversation. + $this->assertEquals(2, $DB->count_records('message_conversation_actions')); + + // There should be 3 notifications. $this->assertEquals(5, $DB->count_records('notifications')); // There should be 4 messages - 3 private + 1 group sent by user2. @@ -2484,6 +2550,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide // Mark as read one of the conversation messages. \core_message\api::mark_message_as_read($user1->id, $dbm3, $now + 5); + // Mark some of the conversations as muted by two users. + \core_message\api::mute_conversation($user1->id, $iconversation1id); + \core_message\api::mute_conversation($user1->id, $conversation1->id); + \core_message\api::mute_conversation($user2->id, $conversation1->id); + // There should be 2 contacts. $this->assertEquals(2, $DB->count_records('message_contacts')); @@ -2502,6 +2573,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide // There should be 4 user actions - 3 for reading the message, one for deleting. $this->assertEquals(4, $DB->count_records('message_user_actions')); + // There should be 3 muted conversation. + $this->assertEquals(3, $DB->count_records('message_conversation_actions')); + // There should be 3 conversations - 2 private + 2 group. $this->assertEquals(4, $DB->count_records('message_conversations')); @@ -2529,6 +2603,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide $this->assertEquals(5, $DB->count_records('notifications')); $this->assertEquals(6, $DB->count_records('messages')); $this->assertEquals(4, $DB->count_records('message_user_actions')); + $this->assertEquals(3, $DB->count_records('message_conversation_actions')); $this->assertEquals(4, $DB->count_records('message_conversations')); $this->assertEquals(8, $DB->count_records('message_conversation_members')); $this->assertEquals(3, $DB->count_records('favourite')); @@ -2545,6 +2620,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide $this->assertEquals(5, $DB->count_records('notifications')); $this->assertEquals(6, $DB->count_records('messages')); $this->assertEquals(4, $DB->count_records('message_user_actions')); + $this->assertEquals(3, $DB->count_records('message_conversation_actions')); $this->assertEquals(4, $DB->count_records('message_conversations')); $this->assertEquals(3, $DB->count_records('favourite')); // There should be 7 conversation members - (2 + 2) private + 3 group. @@ -2583,6 +2659,9 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide }, $useractions); $this->assertNotContains($gm3, $useractions); + // There should be 1 muted conversation. + $this->assertEquals(1, $DB->count_records('message_conversation_actions')); + // There should be still 4 conversations - 2 private + 2 group. $this->assertEquals(4, $DB->count_records('message_conversations')); From 00c59245465de467968c5ed51919d061a6734fde Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Tue, 12 Feb 2019 10:58:24 +0800 Subject: [PATCH 5/8] MDL-64773 core_message: ensure existing APIs return muted status --- message/classes/api.php | 15 ++++++- message/externallib.php | 3 +- message/tests/api_test.php | 70 ++++++++++++++++++++++++++++++ message/tests/externallib_test.php | 49 +++++++++++++++++++++ 4 files changed, 134 insertions(+), 3 deletions(-) diff --git a/message/classes/api.php b/message/classes/api.php index 3885da31342..9376f5b93d3 100644 --- a/message/classes/api.php +++ b/message/classes/api.php @@ -550,7 +550,7 @@ class api { $sql = "SELECT m.id as messageid, mc.id as id, mc.name as conversationname, mc.type as conversationtype, m.useridfrom, m.smallmessage, m.fullmessage, m.fullmessageformat, m.fullmessagehtml, m.timecreated, mc.component, - mc.itemtype, mc.itemid, mc.contextid + mc.itemtype, mc.itemid, mc.contextid, mca.action as ismuted FROM {message_conversations} mc INNER JOIN {message_conversation_members} mcm ON (mcm.conversationid = mc.id AND mcm.userid = :userid3) @@ -574,12 +574,15 @@ class api { ON lastmessage.conversationid = mc.id LEFT JOIN {messages} m ON m.id = lastmessage.messageid + LEFT JOIN {message_conversation_actions} mca + ON (mca.conversationid = mc.id AND mca.userid = :userid4 AND mca.action = :convaction) WHERE mc.id IS NOT NULL AND mc.enabled = 1 $typesql $favouritesql ORDER BY (CASE WHEN m.timecreated IS NULL THEN 0 ELSE 1 END) DESC, m.timecreated DESC, id DESC"; $params = array_merge($favouriteparams, ['userid' => $userid, 'action' => self::MESSAGE_ACTION_DELETED, - 'userid2' => $userid, 'userid3' => $userid, 'convtype' => $type]); + 'userid2' => $userid, 'userid3' => $userid, 'userid4' => $userid, 'convaction' => self::CONVERSATION_ACTION_MUTED, + 'convtype' => $type]); $conversationset = $DB->get_recordset_sql($sql, $params, $limitfrom, $limitnum); $conversations = []; @@ -795,6 +798,7 @@ class api { $conv->isfavourite = in_array($conv->id, $favouriteconversationids); $conv->isread = isset($unreadcounts[$conv->id]) ? false : true; $conv->unreadcount = isset($unreadcounts[$conv->id]) ? $unreadcounts[$conv->id]->unreadcount : null; + $conv->ismuted = $conversation->ismuted ? true : false; $conv->members = $members[$conv->id]; // Add the most recent message information. @@ -955,6 +959,12 @@ class api { $membercount = $DB->count_records('message_conversation_members', ['conversationid' => $conversationid]); + $ismuted = false; + if ($DB->record_exists('message_conversation_actions', ['userid' => $userid, + 'conversationid' => $conversationid, 'action' => self::CONVERSATION_ACTION_MUTED])) { + $ismuted = true; + } + return (object) [ 'id' => $conversation->id, 'name' => $conversation->name, @@ -965,6 +975,7 @@ class api { 'isfavourite' => $isfavourite, 'isread' => empty($unreadcount), 'unreadcount' => $unreadcount, + 'ismuted' => $ismuted, 'members' => $members, 'messages' => $messages['messages'] ]; diff --git a/message/externallib.php b/message/externallib.php index 35238bf9a78..9d107601709 100644 --- a/message/externallib.php +++ b/message/externallib.php @@ -1242,7 +1242,8 @@ class core_message_external extends external_api { 'imageurl' => new external_value(PARAM_URL, 'A link to the conversation picture, if set', VALUE_DEFAULT, null), 'type' => new external_value(PARAM_INT, 'The type of the conversation (1=individual,2=group)'), 'membercount' => new external_value(PARAM_INT, 'Total number of conversation members'), - 'isfavourite' => new external_value(PARAM_BOOL, 'If the user marked conversation this conversation as a favourite'), + 'ismuted' => new external_value(PARAM_BOOL, 'If the user muted this conversation'), + 'isfavourite' => new external_value(PARAM_BOOL, 'If the user marked this conversation as a favourite'), 'isread' => new external_value(PARAM_BOOL, 'If the user has read all messages in the conversation'), 'unreadcount' => new external_value(PARAM_INT, 'The number of unread messages in this conversation', VALUE_DEFAULT, null), diff --git a/message/tests/api_test.php b/message/tests/api_test.php index ce8ea8d3449..ba5ed1888fb 100644 --- a/message/tests/api_test.php +++ b/message/tests/api_test.php @@ -1302,6 +1302,50 @@ class core_message_api_testcase extends core_message_messagelib_testcase { $this->assertEquals($expectedmessagetext, $messages[0]->text); } + /** + * Test verifying get_conversations identifies if a conversation is muted or not. + */ + public function test_get_conversations_some_muted() { + // Create some users. + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + $user3 = self::getDataGenerator()->create_user(); + + $conversation1 = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [$user1->id, $user2->id]); + testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1'); + testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 2'); + \core_message\api::mute_conversation($user1->id, $conversation1->id); + + $conversation2 = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [$user1->id, $user3->id]); + testhelper::send_fake_message_to_conversation($user1, $conversation2->id, 'Message 1'); + testhelper::send_fake_message_to_conversation($user2, $conversation2->id, 'Message 2'); + + $conversation3 = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP, + [$user1->id, $user2->id]); + \core_message\api::mute_conversation($user1->id, $conversation3->id); + + $conversation4 = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP, + [$user1->id, $user3->id]); + + $conversations = \core_message\api::get_conversations($user1->id); + + usort($conversations, function($first, $second){ + return $first->id > $second->id; + }); + + $conv1 = array_shift($conversations); + $conv2 = array_shift($conversations); + $conv3 = array_shift($conversations); + $conv4 = array_shift($conversations); + + $this->assertTrue($conv1->ismuted); + $this->assertFalse($conv2->ismuted); + $this->assertTrue($conv3->ismuted); + $this->assertFalse($conv4->ismuted); + } + /** * Tests retrieving conversations with a limit and offset to ensure pagination works correctly. */ @@ -5850,6 +5894,32 @@ class core_message_api_testcase extends core_message_messagelib_testcase { \core_message\api::send_message_to_conversation($user2->id, $ic1->id, 'test', FORMAT_MOODLE); } + /** + * Test the get_conversation() function with a muted conversation. + */ + public function test_get_conversation_with_muted_conversation() { + $this->resetAfterTest(); + + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + + $this->setUser($user1); + + $conversation = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [$user1->id, $user2->id]); + + $conversation = \core_message\api::get_conversation($user1->id, $conversation->id); + + $this->assertFalse($conversation->ismuted); + + // Now, mute the conversation. + \core_message\api::mute_conversation($user1->id, $conversation->id); + + $conversation = \core_message\api::get_conversation($user1->id, $conversation->id); + + $this->assertTrue($conversation->ismuted); + } + /** * Data provider for test_get_conversation_counts(). */ diff --git a/message/tests/externallib_test.php b/message/tests/externallib_test.php index 098dc0579f4..d76e1ceefac 100644 --- a/message/tests/externallib_test.php +++ b/message/tests/externallib_test.php @@ -5816,6 +5816,55 @@ class core_message_externallib_testcase extends externallib_advanced_testcase { $this->assertNotEmpty($individualmember['contactrequests']); } + /** + * Test verifying get_conversations identifies if a conversation is muted or not. + */ + public function test_get_conversations_some_muted() { + $this->resetAfterTest(); + + // Create some users. + $user1 = self::getDataGenerator()->create_user(); + $user2 = self::getDataGenerator()->create_user(); + $user3 = self::getDataGenerator()->create_user(); + + $conversation1 = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [$user1->id, $user2->id]); + testhelper::send_fake_message_to_conversation($user1, $conversation1->id, 'Message 1'); + testhelper::send_fake_message_to_conversation($user2, $conversation1->id, 'Message 2'); + \core_message\api::mute_conversation($user1->id, $conversation1->id); + + $conversation2 = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [$user1->id, $user3->id]); + testhelper::send_fake_message_to_conversation($user1, $conversation2->id, 'Message 1'); + testhelper::send_fake_message_to_conversation($user2, $conversation2->id, 'Message 2'); + + $conversation3 = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP, + [$user1->id, $user2->id]); + \core_message\api::mute_conversation($user1->id, $conversation3->id); + + $conversation4 = \core_message\api::create_conversation(\core_message\api::MESSAGE_CONVERSATION_TYPE_GROUP, + [$user1->id, $user3->id]); + + $this->setUser($user1); + $result = core_message_external::get_conversations($user1->id); + $result = external_api::clean_returnvalue(core_message_external::get_conversations_returns(), $result); + $conversations = $result['conversations']; + + usort($conversations, function($first, $second){ + return $first['id'] > $second['id']; + }); + + $conv1 = array_shift($conversations); + $conv2 = array_shift($conversations); + $conv3 = array_shift($conversations); + $conv4 = array_shift($conversations); + + $this->assertTrue($conv1['ismuted']); + $this->assertFalse($conv2['ismuted']); + $this->assertTrue($conv3['ismuted']); + $this->assertFalse($conv4['ismuted']); + } + /** * Test returning members in a conversation with no contact requests. */ From 8eaf770d016be64d394777d1c09a70592ff6c1dd Mon Sep 17 00:00:00 2001 From: Barbara Ramiro Date: Fri, 15 Feb 2019 12:19:20 +0800 Subject: [PATCH 6/8] MDL-64773 core: added muted icon --- pix/i/muted.png | Bin 0 -> 244 bytes pix/i/muted.svg | 1 + 2 files changed, 1 insertion(+) create mode 100755 pix/i/muted.png create mode 100755 pix/i/muted.svg diff --git a/pix/i/muted.png b/pix/i/muted.png new file mode 100755 index 0000000000000000000000000000000000000000..c0440fc8a3f97c676181a9eddac31866e407f6f8 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GGLLkg|>2BR0px`o3 z7sn8b(?=(trE}6qLlno7!s1ygy80T(s(5HOH!548{|9P8~3|T6Ok7 zM0)bSlbc&v_VilJnqRm1nEtfcr$U|N8r;*Hwr;z7B62b7+l_a=v1uz^=QUw$d8?n3 p@95I>THNJHYHX<|cm4lk{BQT@d(L-`egArtboard \ No newline at end of file From bd038cc19fb9c24c9c45c35878efb849f07c5523 Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Fri, 15 Feb 2019 12:18:40 +0800 Subject: [PATCH 7/8] MDL-64773 core_message: add ability to mute/unmute conversations --- lang/en/message.php | 2 + .../output/icon_system_fontawesome.php | 1 + .../amd/build/message_drawer_events.min.js | 2 +- .../message_drawer_view_conversation.min.js | 2 +- ..._drawer_view_conversation_constants.min.js | 2 +- ...ge_drawer_view_conversation_patcher.min.js | 2 +- ...e_drawer_view_conversation_renderer.min.js | 2 +- ...wer_view_conversation_state_manager.min.js | 2 +- ...essage_drawer_view_overview_section.min.js | 2 +- message/amd/build/message_repository.min.js | 2 +- message/amd/src/message_drawer_events.js | 2 + .../src/message_drawer_view_conversation.js | 71 +++++++++++++++++++ ...sage_drawer_view_conversation_constants.js | 3 + ...essage_drawer_view_conversation_patcher.js | 38 +++++++++- ...ssage_drawer_view_conversation_renderer.js | 34 +++++++++ ..._drawer_view_conversation_state_manager.js | 15 ++++ .../message_drawer_view_overview_section.js | 37 ++++++++++ message/amd/src/message_repository.js | 38 ++++++++++ ...message_drawer_conversations_list.mustache | 3 + ...ation_header_content_type_private.mustache | 9 +++ ..._content_type_private_no_controls.mustache | 3 + ...sation_header_content_type_public.mustache | 9 +++ ...ation_header_content_type_private.mustache | 13 ++++ ..._content_type_private_no_controls.mustache | 3 + ...sation_header_content_type_public.mustache | 13 ++++ 25 files changed, 301 insertions(+), 9 deletions(-) diff --git a/lang/en/message.php b/lang/en/message.php index ba9e1c37169..5d394d2808a 100644 --- a/lang/en/message.php +++ b/lang/en/message.php @@ -107,6 +107,7 @@ $string['messagepreferences'] = 'Message preferences'; $string['messages'] = 'Messages'; $string['messagesselected:'] = 'Messages selected:'; $string['messagingdatahasnotbeenmigrated'] = 'Your messages are temporarily unavailable due to upgrades in the messaging infrastructure. Please wait for them to be migrated.'; +$string['muteconversation'] = 'Mute'; $string['newonlymsg'] = 'Show only new'; $string['newmessage'] = 'New message'; $string['newmessagesearch'] = 'Select or search for a contact to send a new message.'; @@ -238,6 +239,7 @@ $string['unblockcontact'] = 'Unblock contact'; $string['unblockuser'] = 'Unblock user'; $string['unblockuserconfirm'] = 'Are you sure you want to unblock {$a}?'; $string['unknownuser'] = 'Unknown user'; +$string['unmuteconversation'] = 'Unmute'; $string['unreadnotification'] = 'Unread notification: {$a}'; $string['unreadnewgroupconversationmessage'] = 'New message from {$a->name} in {$a->conversationname}'; $string['unreadnewmessage'] = 'New message from {$a}'; diff --git a/lib/classes/output/icon_system_fontawesome.php b/lib/classes/output/icon_system_fontawesome.php index 8d9672fd23b..f18760135ea 100644 --- a/lib/classes/output/icon_system_fontawesome.php +++ b/lib/classes/output/icon_system_fontawesome.php @@ -260,6 +260,7 @@ class icon_system_fontawesome extends icon_system_font { 'core:i/moodle_host' => 'fa-graduation-cap', 'core:i/moremenu' => 'fa-ellipsis-h', 'core:i/move_2d' => 'fa-arrows', + 'core:i/muted' => 'fa-microphone-slash', 'core:i/navigationitem' => 'fa-fw', 'core:i/ne_red_mark' => 'fa-remove', 'core:i/new' => 'fa-bolt', diff --git a/message/amd/build/message_drawer_events.min.js b/message/amd/build/message_drawer_events.min.js index 15244eb2926..6cf3713a964 100644 --- a/message/amd/build/message_drawer_events.min.js +++ b/message/amd/build/message_drawer_events.min.js @@ -1 +1 @@ -define([],function(){return{CREATE_CONVERSATION_WITH_USER:"message-drawer-create-conversation-with-user",CONTACT_BLOCKED:"message-drawer-contact-blocked",CONTACT_UNBLOCKED:"message-drawer-contact-unblocked",CONTACT_ADDED:"message-drawer-contact-added",CONTACT_REMOVED:"message-drawer-contact-removed",CONTACT_REQUEST_ACCEPTED:"message-drawer-contact-request-accepted",CONTACT_REQUEST_DECLINED:"message-drawer-contact-request-declined",CONVERSATION_CREATED:"message-drawer-conversation-created",CONVERSATION_NEW_LAST_MESSAGE:"message-drawer-conversation-new-last-message",CONVERSATION_DELETED:"message-drawer-conversation-deleted",CONVERSATION_READ:"message-drawer-conversation-read",CONVERSATION_SET_FAVOURITE:"message-drawer-conversation-set-favourite",CONVERSATION_UNSET_FAVOURITE:"message-drawer-conversation-unset-favourite",PREFERENCES_UPDATED:"message-drawer-preferences-updated",ROUTE_CHANGED:"message-drawer-route-change",SHOW:"message-drawer-show",HIDE:"message-drawer-hide",TOGGLE_VISIBILITY:"message-drawer-toggle",SHOW_CONVERSATION:"message-drawer-show-conversation",SHOW_SETTINGS:"message-drawer-show-settings"}}); \ No newline at end of file +define([],function(){return{CREATE_CONVERSATION_WITH_USER:"message-drawer-create-conversation-with-user",CONTACT_BLOCKED:"message-drawer-contact-blocked",CONTACT_UNBLOCKED:"message-drawer-contact-unblocked",CONTACT_ADDED:"message-drawer-contact-added",CONTACT_REMOVED:"message-drawer-contact-removed",CONTACT_REQUEST_ACCEPTED:"message-drawer-contact-request-accepted",CONTACT_REQUEST_DECLINED:"message-drawer-contact-request-declined",CONVERSATION_CREATED:"message-drawer-conversation-created",CONVERSATION_NEW_LAST_MESSAGE:"message-drawer-conversation-new-last-message",CONVERSATION_DELETED:"message-drawer-conversation-deleted",CONVERSATION_READ:"message-drawer-conversation-read",CONVERSATION_SET_FAVOURITE:"message-drawer-conversation-set-favourite",CONVERSATION_SET_MUTED:"message-drawer-conversation-set-muted",CONVERSATION_UNSET_FAVOURITE:"message-drawer-conversation-unset-favourite",CONVERSATION_UNSET_MUTED:"message-drawer-conversation-unset-muted",PREFERENCES_UPDATED:"message-drawer-preferences-updated",ROUTE_CHANGED:"message-drawer-route-change",SHOW:"message-drawer-show",HIDE:"message-drawer-hide",TOGGLE_VISIBILITY:"message-drawer-toggle",SHOW_CONVERSATION:"message-drawer-show-conversation",SHOW_SETTINGS:"message-drawer-show-settings"}}); \ No newline at end of file diff --git a/message/amd/build/message_drawer_view_conversation.min.js b/message/amd/build/message_drawer_view_conversation.min.js index 8399306b2b0..6d5e118dbe3 100644 --- a/message/amd/build/message_drawer_view_conversation.min.js +++ b/message/amd/build/message_drawer_view_conversation.min.js @@ -1 +1 @@ -define(["jquery","core/auto_rows","core/backoff_timer","core/custom_interaction_events","core/notification","core/pubsub","core/str","core_message/message_repository","core_message/message_drawer_events","core_message/message_drawer_view_conversation_constants","core_message/message_drawer_view_conversation_patcher","core_message/message_drawer_view_conversation_renderer","core_message/message_drawer_view_conversation_state_manager","core_message/message_drawer_router","core_message/message_drawer_routes"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var p={},q=null,r=!1,s=0,t=null,u=!0,v=!1,w=null,x=[],y=j.NEWEST_MESSAGES_FIRST,z=j.LOAD_MESSAGE_LIMIT,A=j.INITIAL_NEW_MESSAGE_POLL_TIMEOUT,B=j.SELECTORS,C=j.CONVERSATION_TYPES,D=function(){if(!q||q.type!=C.PRIVATE)return null;var a=q.loggedInUserId,b=Object.keys(q.members).filter(function(b){return a!=b});return b.length?b[0]:null},E=function(a){return Object.keys(p).reduce(function(b,c){if(!b){var d=p[c].state;d.type==C.PRIVATE&&a in d.members&&(b=d.id)}return b},null)},F=function(a){return{id:parseInt(a.attr("data-user-id"),10),fullname:null,profileimageurl:null,profileimageurlsmall:null,isonline:null,showonlinestatus:null,isblocked:null,iscontact:null,isdeleted:null,canmessage:null,requirescontact:null,contactrequests:[]}},G=function(){return s},H=function(a){s=a,p[q.id].messagesOffset=a},I=function(){return r},J=function(a){r=a,p[q.id].loadedAllMessages=a},K=function(a){return a.find(B.MESSAGES_CONTAINER)},L=function(b){return{id:b.id,name:b.name,subname:b.subname,imageUrl:b.imageUrl,isFavourite:b.isFavourite,type:b.type,totalMemberCount:b.totalMemberCount,loggedInUserId:b.loggedInUserId,messages:b.messages.map(function(b){return a.extend({},b)}),members:Object.keys(b.members).reduce(function(c,d){return c[d]=a.extend({},b.members[d]),c[d].contactrequests=b.members[d].contactrequests.map(function(b){return a.extend({},b)}),c},{})}},M=function(a,b){var c=a.id,d=m.setLoadingMembers(q,!0);return d=m.setLoadingMessages(d,!0),w(d).then(function(){return h.getMemberInfo(c,[b],!0,!0)}).then(function(a){if(a.length)return a[0];throw new Error("Unable to load other user profile")}).then(function(b){var c=m.addMembers(q,[b,a]);return c=m.setLoadingMembers(c,!1),c=m.setLoadingMessages(c,!1),c=m.setName(c,b.fullname),c=m.setType(c,1),c=m.setImageUrl(c,b.profileimageurl),c=m.setTotalMemberCount(c,2),w(c).then(function(){return b})})["catch"](function(a){var b=m.setLoadingMembers(q,!1);w(b),e.exception(a)})},N=function(a,b){var c=a.members.filter(function(a){return a.id!=b}),d=c.length?c[0]:null,e=a.name,f=a.imageurl;a.type==C.PRIVATE&&(e=e||d?d.fullname:"",f=f||d?d.profileimageurl:"");var g=m.addMembers(q,a.members);return g=m.setName(g,e),g=m.setSubname(g,a.subname),g=m.setType(g,a.type),g=m.setImageUrl(g,f),g=m.setTotalMemberCount(g,a.membercount),g=m.setIsFavourite(g,a.isfavourite),g=m.addMessages(g,a.messages)},O=function(a,b,c,d,f){var g=b.id,i=m.setLoadingMembers(q,!0);return i=m.setLoadingMessages(i,!0),w(i).then(function(){return h.getConversation(g,a,!0,!0,0,0,c+1,d,f)}).then(function(a){return a.messages.length>c?a.messages=a.messages.slice(1):J(!0),H(d+c),a}).then(function(a){var c=a.members.filter(function(a){return a.id==b.id});c.length<1&&(a.members=a.members.concat([b]));var d=N(a,b.id);return d=m.setLoadingMembers(d,!1),d=m.setLoadingMessages(d,!1),w(d).then(function(){return a})}).then(function(){return S(a)})["catch"](function(a){var b=m.setLoadingMembers(q,!1);b=m.setLoadingMessages(b,!1),w(b),e.exception(a)})},P=function(a,b,c,d){var f=a.members.filter(function(a){return a.id==b.id});f.length<1&&(a.members=a.members.concat([b]));var g=N(a,b.id);g=m.setLoadingMembers(g,!1),g=m.setLoadingMessages(g,!0);var h=a.messages.length;return w(g).then(function(){if(hb?a.messages=a.messages.slice(0,-1):J(!0),a):a}).then(function(a){var b=a.members.filter(function(a){return!(a.id in q.members)}),c=m.addMembers(q,b);return c=m.addMessages(c,a.messages),c=m.setLoadingMessages(c,!1),w(c).then(function(){return a})})["catch"](function(a){var b=m.setLoadingMessages(q,!1);throw w(b),a})},R=function(b,c){return function(){var d=q.messages,e=d.length?d[d.length-1]:null;if(e&&!u&&!v){for(var g=[],h=d.length-1;h>=0;h--){var j=d[h];if(j.timeCreated!==e.timeCreated)break;g.push(j.id)}return Q(b,0,0,c,g,e.timeCreated).then(function(a){if(a.messages.length){t.restart();var c=L(q);return f.publish(i.CONVERSATION_NEW_LAST_MESSAGE,c),S(b)}return a})}return a.Deferred().resolve().promise()}},S=function(a){var b=q.loggedInUserId;return h.markAllConversationMessagesAsRead(b,a).then(function(){var b=m.markMessagesAsRead(q,q.messages);return f.publish(i.CONVERSATION_READ,a),w(b)})},T=function(a){return fa(a).then(function(){var b=m.addPendingBlockUsersById(q,[a]);return w(b)})},U=function(a){var b=m.setLoadingConfirmAction(q,!0);return w(b).then(function(){return h.blockUser(q.loggedInUserId,a)}).then(function(b){var c=m.addMembers(q,[b]);return c=m.removePendingBlockUsersById(c,[a]),c=m.setLoadingConfirmAction(c,!1),f.publish(i.CONTACT_BLOCKED,a),w(c)})},V=function(a){return fa(a).then(function(){var b=m.addPendingUnblockUsersById(q,[a]);return w(b)})},W=function(a){var b=m.setLoadingConfirmAction(q,!0);return w(b).then(function(){return h.unblockUser(q.loggedInUserId,a)}).then(function(b){var c=m.addMembers(q,[b]);return c=m.removePendingUnblockUsersById(c,[a]),c=m.setLoadingConfirmAction(c,!1),f.publish(i.CONTACT_UNBLOCKED,a),w(c)})},X=function(a){return fa(a).then(function(){var b=m.addPendingRemoveContactsById(q,[a]);return w(b)})},Y=function(a){var b=m.setLoadingConfirmAction(q,!0);return w(b).then(function(){return h.deleteContacts(q.loggedInUserId,[a])}).then(function(b){var c=m.addMembers(q,b);return c=m.removePendingRemoveContactsById(c,[a]),c=m.setLoadingConfirmAction(c,!1),f.publish(i.CONTACT_REMOVED,a),w(c)})},Z=function(a){return fa(a).then(function(){var b=m.addPendingAddContactsById(q,[a]);return w(b)})},$=function(a){var b=m.setLoadingConfirmAction(q,!0);return w(b).then(function(){return h.createContactRequest(q.loggedInUserId,a)}).then(function(a){if(!a.request)throw new Error(a.warnings[0].message);return a.request}).then(function(b){var c=m.removePendingAddContactsById(q,[a]);return c=m.addContactRequests(c,[b]),c=m.setLoadingConfirmAction(c,!1),w(c)})},_=function(){var a=q.loggedInUserId,b=q.id;return h.setFavouriteConversations(a,[b]).then(function(){var a=m.setIsFavourite(q,!0);return w(a)}).then(function(){return f.publish(i.CONVERSATION_SET_FAVOURITE,L(q))})},aa=function(){var a=q.loggedInUserId,b=q.id;return h.unsetFavouriteConversations(a,[b]).then(function(){var a=m.setIsFavourite(q,!1);return w(a)}).then(function(){return f.publish(i.CONVERSATION_UNSET_FAVOURITE,L(q))})},ba=function(a){var b=q.selectedMessageIds;return fa(a).then(function(){var a=m.addPendingDeleteMessagesById(q,b);return w(a)})},ca=function(){var a=q.pendingDeleteMessageIds,b=m.setLoadingConfirmAction(q,!0);return w(b).then(function(){return h.deleteMessages(q.loggedInUserId,a)}).then(function(){var b=m.removeMessagesById(q,a);b=m.removePendingDeleteMessagesById(b,a),b=m.removeSelectedMessagesById(b,a),b=m.setLoadingConfirmAction(b,!1);var c=q.messages[q.messages.length-1],d=b.messages.length?b.messages[b.messages.length-1]:null;if(d&&d.id!=c.id){var e=L(b);f.publish(i.CONVERSATION_NEW_LAST_MESSAGE,e)}else b.messages.length||f.publish(i.CONVERSATION_DELETED,b.id);return w(b)})},da=function(a){return fa(a).then(function(){var a=m.setPendingDeleteConversation(q,!0);return w(a)})},ea=function(){var a=m.setLoadingConfirmAction(q,!0);return w(a).then(function(){return h.deleteConversation(q.loggedInUserId,q.id)}).then(function(){var a=m.removeMessages(q,q.messages);return a=m.removeSelectedMessagesById(a,q.selectedMessageIds),a=m.setPendingDeleteConversation(a,!1),a=m.setLoadingConfirmAction(a,!1),f.publish(i.CONVERSATION_DELETED,a.id),w(a)})},fa=function(a){var b=q.pendingDeleteMessageIds,c=m.removePendingAddContactsById(q,[a]);return c=m.removePendingRemoveContactsById(c,[a]),c=m.removePendingUnblockUsersById(c,[a]),c=m.removePendingBlockUsersById(c,[a]),c=m.removePendingDeleteMessagesById(c,b),c=m.setPendingDeleteConversation(c,!1),w(c)},ga=function(a){var b=q.loggedInUserId,c=q.members[a].contactrequests.filter(function(a){return a.requesteduserid==b}),d=c[0],e=m.setLoadingConfirmAction(q,!0);return w(e).then(function(){return h.acceptContactRequest(a,b)}).then(function(a){var b=m.removeContactRequests(q,[d]);return b=m.addMembers(q,[a]),b=m.setLoadingConfirmAction(b,!1),w(b)}).then(function(){f.publish(i.CONTACT_ADDED,q.members[a]),f.publish(i.CONTACT_REQUEST_ACCEPTED,d)})},ha=function(a){var b=q.loggedInUserId,c=q.members[a].contactrequests.filter(function(a){return a.requesteduserid==b}),d=c[0],e=m.setLoadingConfirmAction(q,!0);return w(e).then(function(){return h.declineContactRequest(a,b)}).then(function(a){var b=m.removeContactRequests(q,[d]);return b=m.addMembers(q,[a]),b=m.setLoadingConfirmAction(b,!1),w(b)}).then(function(){f.publish(i.CONTACT_REQUEST_DECLINED,d)})},ia=function(a,b){v=!0;var c=m.setSendingMessage(q,!0),d=null;return w(c).then(function(){if(a||q.type!=C.PRIVATE)return h.sendMessageToConversation(a,b);var c=D();return h.sendMessageToUser(c,b).then(function(a){return d=parseInt(a.conversationid,10),a})}).then(function(a){var b=m.addMessages(q,[a]);b=m.setSendingMessage(b,!1);var c=L(b);return b.id||(b=m.setId(b,d),c.id=d,va(d),f.publish(i.CONVERSATION_CREATED,c)),w(b).then(function(){v=!1,f.publish(i.CONVERSATION_NEW_LAST_MESSAGE,c)})})["catch"](function(a){v=!1;var b=m.setSendingMessage(q,!1);w(b),e.exception(a)})},ja=function(a){var b=q;return b=q.selectedMessageIds.indexOf(a)>-1?m.removeSelectedMessagesById(q,[a]):m.addSelectedMessagesById(q,[a]),w(b)},ka=function(){return fa(D()).then(function(){var a=m.removeSelectedMessagesById(q,q.selectedMessageIds);return w(a)})},la=function(b,c,d,e){var f=function(a){return l.render(b,c,d,a)};if(!e){var g=m.buildInitialState(q.midnight,q.loggedInUserId,q.id),h=k.buildPatch(g,q);f(h)}return x.push(f),function(b){var c=k.buildPatch(q,b),d=x.map(function(a){return a(c)});return a.when.apply(null,d).then(function(){q=b,b.id&&(p[b.id]={state:b,messagesOffset:G(),loadedAllMessages:I()})})}},ma=function(a){return function(b,c){q.loadingConfirmAction||a(D())["catch"](function(a){var b=m.setLoadingConfirmAction(q,!1);w(b),e.exception(a)}),c.originalEvent.preventDefault()}},na=function(b,c){var d=a(b.target),e=d.closest(B.FOOTER_CONTAINER),f=e.find(B.MESSAGE_TEXT_AREA),g=f.val().trim();""!==g&&ia(q.id,g),c.originalEvent.preventDefault()},oa=function(b,c){var d=window.getSelection(),f=a(b.target);if(""==d.toString()&&!f.is("a")){var g=f.closest(B.MESSAGE),h=parseInt(g.attr("data-message-id"),10);ja(h)["catch"](e.exception),c.originalEvent.preventDefault()}},pa=function(a,b){ka()["catch"](e.exception),b.originalEvent.preventDefault()},qa=function(a){return function(b,c){var d=D(),e=q.members[d];n.go(a,o.VIEW_CONTACT,e),c.originalEvent.preventDefault()}},ra=function(a,b){_()["catch"](e.exception),b.originalEvent.preventDefault()},sa=function(a,b){aa()["catch"](e.exception),b.originalEvent.preventDefault()},ta=function(a){return function(b,c){n.go(a,o.VIEW_GROUP_INFO,{id:q.id,name:q.name,subname:q.subname,imageUrl:q.imageUrl,totalMemberCount:q.totalMemberCount},q.loggedInUserId),c.originalEvent.preventDefault()}},ua=function(a,c,g,h){var j=!1,k=K(g),l=[[B.ACTION_REQUEST_BLOCK,ma(T)],[B.ACTION_REQUEST_UNBLOCK,ma(V)],[B.ACTION_REQUEST_ADD_CONTACT,ma(Z)],[B.ACTION_REQUEST_REMOVE_CONTACT,ma(X)],[B.ACTION_REQUEST_DELETE_CONVERSATION,ma(da)],[B.ACTION_CANCEL_EDIT_MODE,pa],[B.ACTION_VIEW_CONTACT,qa(a)],[B.ACTION_VIEW_GROUP_INFO,ta(a)],[B.ACTION_CONFIRM_FAVOURITE,ra],[B.ACTION_CONFIRM_UNFAVOURITE,sa]],n=[[B.ACTION_CANCEL_CONFIRM,ma(fa)],[B.ACTION_CONFIRM_BLOCK,ma(U)],[B.ACTION_CONFIRM_UNBLOCK,ma(W)],[B.ACTION_CONFIRM_ADD_CONTACT,ma($)],[B.ACTION_CONFIRM_REMOVE_CONTACT,ma(Y)],[B.ACTION_CONFIRM_DELETE_SELECTED_MESSAGES,ma(ca)],[B.ACTION_CONFIRM_DELETE_CONVERSATION,ma(ea)],[B.ACTION_REQUEST_ADD_CONTACT,ma(Z)],[B.ACTION_ACCEPT_CONTACT_REQUEST,ma(ga)],[B.ACTION_DECLINE_CONTACT_REQUEST,ma(ha)],[B.MESSAGE,oa]],p=[[B.SEND_MESSAGE_BUTTON,na],[B.ACTION_REQUEST_DELETE_SELECTED_MESSAGES,ma(ba)],[B.ACTION_REQUEST_ADD_CONTACT,ma(Z)],[B.ACTION_REQUEST_UNBLOCK,ma(V)]];b.init(h),d.define(c,[d.events.activate]),d.define(g,[d.events.activate]),d.define(h,[d.events.activate,d.events.enter]),d.define(k,[d.events.scrollTop,d.events.scrollLock]),k.on(d.events.scrollTop,function(a,b){var c=Object.keys(q.members).length>1;if(!u&&!j&&!I()&&c){j=!0;var d=m.setLoadingMessages(q,!0);w(d).then(function(){return Q(q.id,z,G(),y,[])}).then(function(){j=!1,H(G()+z)})["catch"](function(a){j=!1,e.exception(a)})}b.originalEvent.preventDefault()}),l.forEach(function(a){var b=a[0],e=a[1];c.on(d.events.activate,b,e)}),n.forEach(function(a){var b=a[0],c=a[1];g.on(d.events.activate,b,c)}),p.forEach(function(a){var b=a[0],c=a[1];h.on(d.events.activate,b,c)}),h.on(d.events.enter,B.MESSAGE_TEXT_AREA,function(a,b){var c=h.attr("data-enter-to-send");c&&"false"!=c&&"0"!=c&&na(a,b)}),f.subscribe(i.ROUTE_CHANGED,function(a){t&&a.route!=o.VIEW_CONVERSATION&&t.stop()})},va=function(a){t&&t.stop(),t=new c(R(a,y),function(a){return a?2*a:A}),t.start()},wa=function(a,b,c){var d=c.id,e=parseInt(a.attr("data-midnight"),10),f=m.buildInitialState(e,d,b);return q||(q=f),t&&t.stop(),w(f)},xa=function(a,b,c){return wa(a,null,b).then(function(){return h.getConversationBetweenUsers(b.id,c,!0,!0,0,0,z,0,y).then(function(c){return za(a,c,b)})["catch"](function(){return M(b,c)})})},ya=function(a,b,c){var d=null;return b in p&&(d=p[b]),wa(a,b,c).then(function(){if(d){var a=d.state;return a=m.setLoadingMessages(a,!1),a=m.setLoadingMembers(a,!1),H(d.messagesOffset),J(d.loadedAllMessages),w(a)}return O(b,c,z,0,y)}).then(function(){return va(b)})},za=function(a,b,c){var d=null;return b.id in p&&(d=p[b.id]),wa(a,b.id,c).then(function(){if(d){var a=d.state;return a=m.setLoadingMessages(a,!1),a=m.setLoadingMembers(a,!1),H(d.messagesOffset),J(d.loadedAllMessages),w(a)}return P(b,c,z,y)}).then(function(){return va(b.id)})},Aa=function(b,c,d,f,g,h,i){var k=null,l=null;g&&null!==g&&"object"==typeof g?(k=g,l=parseInt(k.id,10)):(k=null,l=parseInt(g,10),l=isNaN(l)?null:l),!l&&h&&i&&(l=E(i));var m=!q||q.id!=l||i&&i!=D();if(d.attr("data-init")||(w=la(c,d,f,m),ua(b,c,d,f),d.attr("data-init",!0)),m){u=!0;var n=null,o=F(d);return n=k?za(d,k,o,i):l?ya(d,l,o,i):xa(d,o,i),n.then(function(){u=!1,c.find(j.SELECTORS.CAN_RECEIVE_FOCUS).first().focus()})["catch"](function(a){u=!1,e.exception(a)})}if(va(l),q.type==C.PRIVATE&&h){var p=D();switch(h){case"block":return T(p);case"unblock":return V(p);case"add-contact":return Z(p);case"remove-contact":return X(p)}}return a.Deferred().resolve().promise()},Ba=function(){return g.get_string("messagedrawerviewconversation","core_message",q.name)};return{show:Aa,description:Ba}}); \ No newline at end of file +define(["jquery","core/auto_rows","core/backoff_timer","core/custom_interaction_events","core/notification","core/pubsub","core/str","core_message/message_repository","core_message/message_drawer_events","core_message/message_drawer_view_conversation_constants","core_message/message_drawer_view_conversation_patcher","core_message/message_drawer_view_conversation_renderer","core_message/message_drawer_view_conversation_state_manager","core_message/message_drawer_router","core_message/message_drawer_routes"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var p={},q=null,r=!1,s=0,t=null,u=!0,v=!1,w=null,x=[],y=j.NEWEST_MESSAGES_FIRST,z=j.LOAD_MESSAGE_LIMIT,A=j.INITIAL_NEW_MESSAGE_POLL_TIMEOUT,B=j.SELECTORS,C=j.CONVERSATION_TYPES,D=function(){if(!q||q.type!=C.PRIVATE)return null;var a=q.loggedInUserId,b=Object.keys(q.members).filter(function(b){return a!=b});return b.length?b[0]:null},E=function(a){return Object.keys(p).reduce(function(b,c){if(!b){var d=p[c].state;d.type==C.PRIVATE&&a in d.members&&(b=d.id)}return b},null)},F=function(a){return{id:parseInt(a.attr("data-user-id"),10),fullname:null,profileimageurl:null,profileimageurlsmall:null,isonline:null,showonlinestatus:null,isblocked:null,iscontact:null,isdeleted:null,canmessage:null,requirescontact:null,contactrequests:[]}},G=function(){return s},H=function(a){s=a,p[q.id].messagesOffset=a},I=function(){return r},J=function(a){r=a,p[q.id].loadedAllMessages=a},K=function(a){return a.find(B.MESSAGES_CONTAINER)},L=function(b){return{id:b.id,name:b.name,subname:b.subname,imageUrl:b.imageUrl,isFavourite:b.isFavourite,isMuted:b.isMuted,type:b.type,totalMemberCount:b.totalMemberCount,loggedInUserId:b.loggedInUserId,messages:b.messages.map(function(b){return a.extend({},b)}),members:Object.keys(b.members).reduce(function(c,d){return c[d]=a.extend({},b.members[d]),c[d].contactrequests=b.members[d].contactrequests.map(function(b){return a.extend({},b)}),c},{})}},M=function(a,b){var c=a.id,d=m.setLoadingMembers(q,!0);return d=m.setLoadingMessages(d,!0),w(d).then(function(){return h.getMemberInfo(c,[b],!0,!0)}).then(function(a){if(a.length)return a[0];throw new Error("Unable to load other user profile")}).then(function(b){var c=m.addMembers(q,[b,a]);return c=m.setLoadingMembers(c,!1),c=m.setLoadingMessages(c,!1),c=m.setName(c,b.fullname),c=m.setType(c,1),c=m.setImageUrl(c,b.profileimageurl),c=m.setTotalMemberCount(c,2),w(c).then(function(){return b})})["catch"](function(a){var b=m.setLoadingMembers(q,!1);w(b),e.exception(a)})},N=function(a,b){var c=a.members.filter(function(a){return a.id!=b}),d=c.length?c[0]:null,e=a.name,f=a.imageurl;a.type==C.PRIVATE&&(e=e||d?d.fullname:"",f=f||d?d.profileimageurl:"");var g=m.addMembers(q,a.members);return g=m.setName(g,e),g=m.setSubname(g,a.subname),g=m.setType(g,a.type),g=m.setImageUrl(g,f),g=m.setTotalMemberCount(g,a.membercount),g=m.setIsFavourite(g,a.isfavourite),g=m.setIsMuted(g,a.ismuted),g=m.addMessages(g,a.messages)},O=function(a,b,c,d,f){var g=b.id,i=m.setLoadingMembers(q,!0);return i=m.setLoadingMessages(i,!0),w(i).then(function(){return h.getConversation(g,a,!0,!0,0,0,c+1,d,f)}).then(function(a){return a.messages.length>c?a.messages=a.messages.slice(1):J(!0),H(d+c),a}).then(function(a){var c=a.members.filter(function(a){return a.id==b.id});c.length<1&&(a.members=a.members.concat([b]));var d=N(a,b.id);return d=m.setLoadingMembers(d,!1),d=m.setLoadingMessages(d,!1),w(d).then(function(){return a})}).then(function(){return S(a)})["catch"](function(a){var b=m.setLoadingMembers(q,!1);b=m.setLoadingMessages(b,!1),w(b),e.exception(a)})},P=function(a,b,c,d){var f=a.members.filter(function(a){return a.id==b.id});f.length<1&&(a.members=a.members.concat([b]));var g=N(a,b.id);g=m.setLoadingMembers(g,!1),g=m.setLoadingMessages(g,!0);var h=a.messages.length;return w(g).then(function(){if(hb?a.messages=a.messages.slice(0,-1):J(!0),a):a}).then(function(a){var b=a.members.filter(function(a){return!(a.id in q.members)}),c=m.addMembers(q,b);return c=m.addMessages(c,a.messages),c=m.setLoadingMessages(c,!1),w(c).then(function(){return a})})["catch"](function(a){var b=m.setLoadingMessages(q,!1);throw w(b),a})},R=function(b,c){return function(){var d=q.messages,e=d.length?d[d.length-1]:null;if(e&&!u&&!v){for(var g=[],h=d.length-1;h>=0;h--){var j=d[h];if(j.timeCreated!==e.timeCreated)break;g.push(j.id)}return Q(b,0,0,c,g,e.timeCreated).then(function(a){if(a.messages.length){t.restart();var c=L(q);return f.publish(i.CONVERSATION_NEW_LAST_MESSAGE,c),S(b)}return a})}return a.Deferred().resolve().promise()}},S=function(a){var b=q.loggedInUserId;return h.markAllConversationMessagesAsRead(b,a).then(function(){var b=m.markMessagesAsRead(q,q.messages);return f.publish(i.CONVERSATION_READ,a),w(b)})},T=function(a){return ha(a).then(function(){var b=m.addPendingBlockUsersById(q,[a]);return w(b)})},U=function(a){var b=m.setLoadingConfirmAction(q,!0);return w(b).then(function(){return h.blockUser(q.loggedInUserId,a)}).then(function(b){var c=m.addMembers(q,[b]);return c=m.removePendingBlockUsersById(c,[a]),c=m.setLoadingConfirmAction(c,!1),f.publish(i.CONTACT_BLOCKED,a),w(c)})},V=function(a){return ha(a).then(function(){var b=m.addPendingUnblockUsersById(q,[a]);return w(b)})},W=function(a){var b=m.setLoadingConfirmAction(q,!0);return w(b).then(function(){return h.unblockUser(q.loggedInUserId,a)}).then(function(b){var c=m.addMembers(q,[b]);return c=m.removePendingUnblockUsersById(c,[a]),c=m.setLoadingConfirmAction(c,!1),f.publish(i.CONTACT_UNBLOCKED,a),w(c)})},X=function(a){return ha(a).then(function(){var b=m.addPendingRemoveContactsById(q,[a]);return w(b)})},Y=function(a){var b=m.setLoadingConfirmAction(q,!0);return w(b).then(function(){return h.deleteContacts(q.loggedInUserId,[a])}).then(function(b){var c=m.addMembers(q,b);return c=m.removePendingRemoveContactsById(c,[a]),c=m.setLoadingConfirmAction(c,!1),f.publish(i.CONTACT_REMOVED,a),w(c)})},Z=function(a){return ha(a).then(function(){var b=m.addPendingAddContactsById(q,[a]);return w(b)})},$=function(a){var b=m.setLoadingConfirmAction(q,!0);return w(b).then(function(){return h.createContactRequest(q.loggedInUserId,a)}).then(function(a){if(!a.request)throw new Error(a.warnings[0].message);return a.request}).then(function(b){var c=m.removePendingAddContactsById(q,[a]);return c=m.addContactRequests(c,[b]),c=m.setLoadingConfirmAction(c,!1),w(c)})},_=function(){var a=q.loggedInUserId,b=q.id;return h.setFavouriteConversations(a,[b]).then(function(){var a=m.setIsFavourite(q,!0);return w(a)}).then(function(){return f.publish(i.CONVERSATION_SET_FAVOURITE,L(q))})},aa=function(){var a=q.loggedInUserId,b=q.id;return h.unsetFavouriteConversations(a,[b]).then(function(){var a=m.setIsFavourite(q,!1);return w(a)}).then(function(){return f.publish(i.CONVERSATION_UNSET_FAVOURITE,L(q))})},ba=function(){var a=q.loggedInUserId,b=q.id;return h.setMutedConversations(a,[b]).then(function(){var a=m.setIsMuted(q,!0);return w(a)}).then(function(){return f.publish(i.CONVERSATION_SET_MUTED,L(q))})},ca=function(){var a=q.loggedInUserId,b=q.id;return h.unsetMutedConversations(a,[b]).then(function(){var a=m.setIsMuted(q,!1);return w(a)}).then(function(){return f.publish(i.CONVERSATION_UNSET_MUTED,L(q))})},da=function(a){var b=q.selectedMessageIds;return ha(a).then(function(){var a=m.addPendingDeleteMessagesById(q,b);return w(a)})},ea=function(){var a=q.pendingDeleteMessageIds,b=m.setLoadingConfirmAction(q,!0);return w(b).then(function(){return h.deleteMessages(q.loggedInUserId,a)}).then(function(){var b=m.removeMessagesById(q,a);b=m.removePendingDeleteMessagesById(b,a),b=m.removeSelectedMessagesById(b,a),b=m.setLoadingConfirmAction(b,!1);var c=q.messages[q.messages.length-1],d=b.messages.length?b.messages[b.messages.length-1]:null;if(d&&d.id!=c.id){var e=L(b);f.publish(i.CONVERSATION_NEW_LAST_MESSAGE,e)}else b.messages.length||f.publish(i.CONVERSATION_DELETED,b.id);return w(b)})},fa=function(a){return ha(a).then(function(){var a=m.setPendingDeleteConversation(q,!0);return w(a)})},ga=function(){var a=m.setLoadingConfirmAction(q,!0);return w(a).then(function(){return h.deleteConversation(q.loggedInUserId,q.id)}).then(function(){var a=m.removeMessages(q,q.messages);return a=m.removeSelectedMessagesById(a,q.selectedMessageIds),a=m.setPendingDeleteConversation(a,!1),a=m.setLoadingConfirmAction(a,!1),f.publish(i.CONVERSATION_DELETED,a.id),w(a)})},ha=function(a){var b=q.pendingDeleteMessageIds,c=m.removePendingAddContactsById(q,[a]);return c=m.removePendingRemoveContactsById(c,[a]),c=m.removePendingUnblockUsersById(c,[a]),c=m.removePendingBlockUsersById(c,[a]),c=m.removePendingDeleteMessagesById(c,b),c=m.setPendingDeleteConversation(c,!1),w(c)},ia=function(a){var b=q.loggedInUserId,c=q.members[a].contactrequests.filter(function(a){return a.requesteduserid==b}),d=c[0],e=m.setLoadingConfirmAction(q,!0);return w(e).then(function(){return h.acceptContactRequest(a,b)}).then(function(a){var b=m.removeContactRequests(q,[d]);return b=m.addMembers(q,[a]),b=m.setLoadingConfirmAction(b,!1),w(b)}).then(function(){f.publish(i.CONTACT_ADDED,q.members[a]),f.publish(i.CONTACT_REQUEST_ACCEPTED,d)})},ja=function(a){var b=q.loggedInUserId,c=q.members[a].contactrequests.filter(function(a){return a.requesteduserid==b}),d=c[0],e=m.setLoadingConfirmAction(q,!0);return w(e).then(function(){return h.declineContactRequest(a,b)}).then(function(a){var b=m.removeContactRequests(q,[d]);return b=m.addMembers(q,[a]),b=m.setLoadingConfirmAction(b,!1),w(b)}).then(function(){f.publish(i.CONTACT_REQUEST_DECLINED,d)})},ka=function(a,b){v=!0;var c=m.setSendingMessage(q,!0),d=null;return w(c).then(function(){if(a||q.type!=C.PRIVATE)return h.sendMessageToConversation(a,b);var c=D();return h.sendMessageToUser(c,b).then(function(a){return d=parseInt(a.conversationid,10),a})}).then(function(a){var b=m.addMessages(q,[a]);b=m.setSendingMessage(b,!1);var c=L(b);return b.id||(b=m.setId(b,d),c.id=d,za(d),f.publish(i.CONVERSATION_CREATED,c)),w(b).then(function(){v=!1,f.publish(i.CONVERSATION_NEW_LAST_MESSAGE,c)})})["catch"](function(a){v=!1;var b=m.setSendingMessage(q,!1);w(b),e.exception(a)})},la=function(a){var b=q;return b=q.selectedMessageIds.indexOf(a)>-1?m.removeSelectedMessagesById(q,[a]):m.addSelectedMessagesById(q,[a]),w(b)},ma=function(){return ha(D()).then(function(){var a=m.removeSelectedMessagesById(q,q.selectedMessageIds);return w(a)})},na=function(b,c,d,e){var f=function(a){return l.render(b,c,d,a)};if(!e){var g=m.buildInitialState(q.midnight,q.loggedInUserId,q.id),h=k.buildPatch(g,q);f(h)}return x.push(f),function(b){var c=k.buildPatch(q,b),d=x.map(function(a){return a(c)});return a.when.apply(null,d).then(function(){q=b,b.id&&(p[b.id]={state:b,messagesOffset:G(),loadedAllMessages:I()})})}},oa=function(a){return function(b,c){q.loadingConfirmAction||a(D())["catch"](function(a){var b=m.setLoadingConfirmAction(q,!1);w(b),e.exception(a)}),c.originalEvent.preventDefault()}},pa=function(b,c){var d=a(b.target),e=d.closest(B.FOOTER_CONTAINER),f=e.find(B.MESSAGE_TEXT_AREA),g=f.val().trim();""!==g&&ka(q.id,g),c.originalEvent.preventDefault()},qa=function(b,c){var d=window.getSelection(),f=a(b.target);if(""==d.toString()&&!f.is("a")){var g=f.closest(B.MESSAGE),h=parseInt(g.attr("data-message-id"),10);la(h)["catch"](e.exception),c.originalEvent.preventDefault()}},ra=function(a,b){ma()["catch"](e.exception),b.originalEvent.preventDefault()},sa=function(a){return function(b,c){var d=D(),e=q.members[d];n.go(a,o.VIEW_CONTACT,e),c.originalEvent.preventDefault()}},ta=function(a,b){_()["catch"](e.exception),b.originalEvent.preventDefault()},ua=function(a,b){aa()["catch"](e.exception),b.originalEvent.preventDefault()},va=function(a,b){ba()["catch"](e.exception),b.originalEvent.preventDefault()},wa=function(a,b){ca()["catch"](e.exception),b.originalEvent.preventDefault()},xa=function(a){return function(b,c){n.go(a,o.VIEW_GROUP_INFO,{id:q.id,name:q.name,subname:q.subname,imageUrl:q.imageUrl,totalMemberCount:q.totalMemberCount},q.loggedInUserId),c.originalEvent.preventDefault()}},ya=function(a,c,g,h){var j=!1,k=K(g),l=[[B.ACTION_REQUEST_BLOCK,oa(T)],[B.ACTION_REQUEST_UNBLOCK,oa(V)],[B.ACTION_REQUEST_ADD_CONTACT,oa(Z)],[B.ACTION_REQUEST_REMOVE_CONTACT,oa(X)],[B.ACTION_REQUEST_DELETE_CONVERSATION,oa(fa)],[B.ACTION_CANCEL_EDIT_MODE,ra],[B.ACTION_VIEW_CONTACT,sa(a)],[B.ACTION_VIEW_GROUP_INFO,xa(a)],[B.ACTION_CONFIRM_FAVOURITE,ta],[B.ACTION_CONFIRM_MUTE,va],[B.ACTION_CONFIRM_UNFAVOURITE,ua],[B.ACTION_CONFIRM_UNMUTE,wa]],n=[[B.ACTION_CANCEL_CONFIRM,oa(ha)],[B.ACTION_CONFIRM_BLOCK,oa(U)],[B.ACTION_CONFIRM_UNBLOCK,oa(W)],[B.ACTION_CONFIRM_ADD_CONTACT,oa($)],[B.ACTION_CONFIRM_REMOVE_CONTACT,oa(Y)],[B.ACTION_CONFIRM_DELETE_SELECTED_MESSAGES,oa(ea)],[B.ACTION_CONFIRM_DELETE_CONVERSATION,oa(ga)],[B.ACTION_REQUEST_ADD_CONTACT,oa(Z)],[B.ACTION_ACCEPT_CONTACT_REQUEST,oa(ia)],[B.ACTION_DECLINE_CONTACT_REQUEST,oa(ja)],[B.MESSAGE,qa]],p=[[B.SEND_MESSAGE_BUTTON,pa],[B.ACTION_REQUEST_DELETE_SELECTED_MESSAGES,oa(da)],[B.ACTION_REQUEST_ADD_CONTACT,oa(Z)],[B.ACTION_REQUEST_UNBLOCK,oa(V)]];b.init(h),d.define(c,[d.events.activate]),d.define(g,[d.events.activate]),d.define(h,[d.events.activate,d.events.enter]),d.define(k,[d.events.scrollTop,d.events.scrollLock]),k.on(d.events.scrollTop,function(a,b){var c=Object.keys(q.members).length>1;if(!u&&!j&&!I()&&c){j=!0;var d=m.setLoadingMessages(q,!0);w(d).then(function(){return Q(q.id,z,G(),y,[])}).then(function(){j=!1,H(G()+z)})["catch"](function(a){j=!1,e.exception(a)})}b.originalEvent.preventDefault()}),l.forEach(function(a){var b=a[0],e=a[1];c.on(d.events.activate,b,e)}),n.forEach(function(a){var b=a[0],c=a[1];g.on(d.events.activate,b,c)}),p.forEach(function(a){var b=a[0],c=a[1];h.on(d.events.activate,b,c)}),h.on(d.events.enter,B.MESSAGE_TEXT_AREA,function(a,b){var c=h.attr("data-enter-to-send");c&&"false"!=c&&"0"!=c&&pa(a,b)}),f.subscribe(i.ROUTE_CHANGED,function(a){t&&a.route!=o.VIEW_CONVERSATION&&t.stop()})},za=function(a){t&&t.stop(),t=new c(R(a,y),function(a){return a?2*a:A}),t.start()},Aa=function(a,b,c){var d=c.id,e=parseInt(a.attr("data-midnight"),10),f=m.buildInitialState(e,d,b);return q||(q=f),t&&t.stop(),w(f)},Ba=function(a,b,c){return Aa(a,null,b).then(function(){return h.getConversationBetweenUsers(b.id,c,!0,!0,0,0,z,0,y).then(function(c){return Da(a,c,b)})["catch"](function(){return M(b,c)})})},Ca=function(a,b,c){var d=null;return b in p&&(d=p[b]),Aa(a,b,c).then(function(){if(d){var a=d.state;return a=m.setLoadingMessages(a,!1),a=m.setLoadingMembers(a,!1),H(d.messagesOffset),J(d.loadedAllMessages),w(a)}return O(b,c,z,0,y)}).then(function(){return za(b)})},Da=function(a,b,c){var d=null;return b.id in p&&(d=p[b.id]),Aa(a,b.id,c).then(function(){if(d){var a=d.state;return a=m.setLoadingMessages(a,!1),a=m.setLoadingMembers(a,!1),H(d.messagesOffset),J(d.loadedAllMessages),w(a)}return P(b,c,z,y)}).then(function(){return za(b.id)})},Ea=function(b,c,d,f,g,h,i){var k=null,l=null;g&&null!==g&&"object"==typeof g?(k=g,l=parseInt(k.id,10)):(k=null,l=parseInt(g,10),l=isNaN(l)?null:l),!l&&h&&i&&(l=E(i));var m=!q||q.id!=l||i&&i!=D();if(d.attr("data-init")||(w=na(c,d,f,m),ya(b,c,d,f),d.attr("data-init",!0)),m){u=!0;var n=null,o=F(d);return n=k?Da(d,k,o,i):l?Ca(d,l,o,i):Ba(d,o,i),n.then(function(){u=!1,c.find(j.SELECTORS.CAN_RECEIVE_FOCUS).first().focus()})["catch"](function(a){u=!1,e.exception(a)})}if(za(l),q.type==C.PRIVATE&&h){var p=D();switch(h){case"block":return T(p);case"unblock":return V(p);case"add-contact":return Z(p);case"remove-contact":return X(p)}}return a.Deferred().resolve().promise()},Fa=function(){return g.get_string("messagedrawerviewconversation","core_message",q.name)};return{show:Ea,description:Fa}}); \ No newline at end of file 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 afd8fe09422..a45db355ff4 100644 --- a/message/amd/build/message_drawer_view_conversation_constants.min.js +++ b/message/amd/build/message_drawer_view_conversation_constants.min.js @@ -1 +1 @@ -define([],function(){var a={ACTION_ACCEPT_CONTACT_REQUEST:'[data-action="accept-contact-request"]',ACTION_CANCEL_CONFIRM:'[data-action="cancel-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_UNFAVOURITE:'[data-action="confirm-unfavourite"]',ACTION_CONFIRM_REMOVE_CONTACT:'[data-action="confirm-remove-contact"]',ACTION_CONFIRM_UNBLOCK:'[data-action="confirm-unblock"]',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_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"]',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"]',PLACEHOLDER_CONTAINER:'[data-region="placeholder-container"]',SEND_MESSAGE_BUTTON:'[data-action="send-message"]',SEND_MESSAGE_ICON_CONTAINER:'[data-region="send-icon-container"]',TEXT:'[data-region="text"]',TITLE:'[data-region="title"]'},b={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",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"},c={PRIVATE:1,PUBLIC:2};return{SELECTORS:a,TEMPLATES:b,CONVERSATION_TYPES:c,NEWEST_MESSAGES_FIRST:!0,LOAD_MESSAGE_LIMIT:100,INITIAL_NEW_MESSAGE_POLL_TIMEOUT:1e3}}); \ No newline at end of file +define([],function(){var a={ACTION_ACCEPT_CONTACT_REQUEST:'[data-action="accept-contact-request"]',ACTION_CANCEL_CONFIRM:'[data-action="cancel-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_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"]',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"]',SEND_MESSAGE_BUTTON:'[data-action="send-message"]',SEND_MESSAGE_ICON_CONTAINER:'[data-region="send-icon-container"]',TEXT:'[data-region="text"]',TITLE:'[data-region="title"]'},b={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",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"},c={PRIVATE:1,PUBLIC:2};return{SELECTORS:a,TEMPLATES:b,CONVERSATION_TYPES:c,NEWEST_MESSAGES_FIRST:!0,LOAD_MESSAGE_LIMIT:100,INITIAL_NEW_MESSAGE_POLL_TIMEOUT:1e3}}); \ No newline at end of file diff --git a/message/amd/build/message_drawer_view_conversation_patcher.min.js b/message/amd/build/message_drawer_view_conversation_patcher.min.js index a7d2929a25f..7ec4cfd0f98 100644 --- a/message/amd/build/message_drawer_view_conversation_patcher.min.js +++ b/message/amd/build/message_drawer_view_conversation_patcher.min.js @@ -1 +1 @@ -define(["jquery","core/user_date","core_message/message_drawer_view_conversation_constants"],function(a,b,c){var d=function(a,c){var d=a.reduce(function(a,d){var e=b.getUserMidnightForTimestamp(d.timeCreated,c);return a.hasOwnProperty(e)?a[e].push(d):a[e]=[d],a},{});return Object.keys(d).map(function(a){return{timestamp:a,messages:d[a]}})},e=function(a,b,c){b=b.slice();var d=[],e=[],f=[];return a.forEach(function(a){for(var d=!1,g=0;g0,i=g.length>0;return d||e?h&&i?null:h||!i||e.iscontact?!d&&e?e.iscontact?"contact":null:!e&&d?d.iscontact?"non-contact":null:d.iscontact&&!e.iscontact?i?"pending-contact":"non-contact":!d.iscontact&&e.iscontact?"contact":null:"pending-contact":null},B=function(a,b){return!(a.loadingConfirmAction||!b.loadingConfirmAction)||!(a.loadingConfirmAction&&!b.loadingConfirmAction)&&null},C=function(a,b){var c=a.selectedMessageIds.length>0,d=b.selectedMessageIds.length>0,e=a.messages.length!=b.messages.length;return!(c||!d)||!(c&&!d)&&(!(!c||!e)||null)},D=function(a,b){var c=a.selectedMessageIds,d=b.selectedMessageIds;if(g(c,d))return null;var f=e(c,d,function(a,b){return a==b});return{count:d.length,add:f.missingFromA,remove:f.missingFromB}},E=function(a){return Object.keys(a.members).reduce(function(b,c){return c==a.loggedInUserId||b||(b=a.members[c]),b},null)},F=function(a,b){var c=b.contactrequests.filter(function(b){return b.userid==a||b.requesteduserid}),d=c.length>0;return b.requirescontact&&!b.iscontact&&!d},G=function(a,b){var c=E(a),d=E(b),e=a.messages.length>0,f=b.messages.length>0,g=b.loggedInUserId,h=c&&F(g,c),i=d&&F(g,d),j=t(a,b),k=j===!1;if(!a.hasTriedToLoadMessages&&!b.hasTriedToLoadMessages)return null;if(!c&&!d)return null;if(!c&&i)return{show:!0,hasMessages:f,user:d};if(k&&i)return{show:!0,hasMessages:f,user:d};if(a.hasTriedToLoadMessages&&b.hasTriedToLoadMessages){if(!h&&i)return{show:!0,hasMessages:f,user:d};if(h&&!i)return{show:!1,hasMessages:f}}return!a.hasTriedToLoadMessages&&b.hasTriedToLoadMessages&&i?{show:!0,hasMessages:f,user:d}:a.hasTriedToLoadMessages&&!b.hasTriedToLoadMessages&&h?{show:!1,hasMessages:e}:null},H=function(a,b){var c=E(a),d=E(b);return c||d?c&&!d?!c.isblocked&&null:!c&&d?!!d.isblocked||null:!(c.isblocked||!d.isblocked)||!(c.isblocked&&!d.isblocked)&&null:null},I=function(a,b){var c=E(a),d=E(b);return c||d?c&&!d?!c.canmessage||null:!c&&d?!d.canmessage||null:!(!c.canmessage&&d.canmessage)&&(!(!c.canmessage||d.canmessage)||null):null},J=function(a,b){var c=o(a,b),d=C(a,b),e=G(a,b),f=H(a,b),g=I(a,b),h=null!==e?e.show&&e.hasMessages:null,i=E(b),j=function(a,c){if(a)return c;if(null!==a&&!a){if(!i)return{type:"content"};if(i.isblocked)return{type:"unblock"};if(b.messages.length&&F(b.loggedInUserId,i))return{type:"add-contact",user:i};if(!i.canmessage||i.requirescontact&&!i.iscontact)return{type:"unable-to-message"}}return null};if(null===c&&null===d&&null===e&&null===f)return null;for(var k=[[c,{type:"placeholder"}],[d,{type:"edit-mode"}],[g,{type:"unable-to-message"}],[f,{type:"unblock"}],[h,{type:"add-contact",user:i}]],l=0;l0,i=g.length>0,j=a.messages.length>0,k=a.messages.length>0;return h||!i||e.iscontact||k?!(d&&!d.iscontact&&i&&e.iscontact)&&(!(h&&!i)&&(!(!j&&k)&&null)):e.fullname},N=function(b,d){var e={all:{reset:L,conversation:j,scrollToMessage:m,loadingMembers:n,loadingFirstMessages:o,loadingMessages:p,sendingMessage:q,confirmDeleteSelectedMessages:v,inEditMode:C,selectedMessages:D,isFavourite:z}};e[c.CONVERSATION_TYPES.PRIVATE]={header:k,footer:J,confirmBlockUser:r,confirmUnblockUser:s,confirmAddContact:t,confirmRemoveContact:u,confirmContactRequest:x,confirmDeleteConversation:w,isBlocked:y,isContact:A,loadingConfirmAction:B,requireAddContact:G,contactRequestSent:M},e[c.CONVERSATION_TYPES.PUBLIC]={header:l,footer:K};var f=a.extend({},e.all);return d.type&&d.type in e&&(f=a.extend(f,e[d.type])),Object.keys(f).reduce(function(a,c){var e=f[c],g=e(b,d);return null!==g&&(a[c]=g),a},{})};return{buildPatch:N}}); \ No newline at end of file +define(["jquery","core/user_date","core_message/message_drawer_view_conversation_constants"],function(a,b,c){var d=function(a,c){var d=a.reduce(function(a,d){var e=b.getUserMidnightForTimestamp(d.timeCreated,c);return a.hasOwnProperty(e)?a[e].push(d):a[e]=[d],a},{});return Object.keys(d).map(function(a){return{timestamp:a,messages:d[a]}})},e=function(a,b,c){b=b.slice();var d=[],e=[],f=[];return a.forEach(function(a){for(var d=!1,g=0;g0,i=g.length>0;return d||e?h&&i?null:h||!i||e.iscontact?!d&&e?e.iscontact?"contact":null:!e&&d?d.iscontact?"non-contact":null:d.iscontact&&!e.iscontact?i?"pending-contact":"non-contact":!d.iscontact&&e.iscontact?"contact":null:"pending-contact":null},C=function(a,b){return!(a.loadingConfirmAction||!b.loadingConfirmAction)||!(a.loadingConfirmAction&&!b.loadingConfirmAction)&&null},D=function(a,b){var c=a.selectedMessageIds.length>0,d=b.selectedMessageIds.length>0,e=a.messages.length!=b.messages.length;return!(c||!d)||!(c&&!d)&&(!(!c||!e)||null)},E=function(a,b){var c=a.selectedMessageIds,d=b.selectedMessageIds;if(g(c,d))return null;var f=e(c,d,function(a,b){return a==b});return{count:d.length,add:f.missingFromA,remove:f.missingFromB}},F=function(a){return Object.keys(a.members).reduce(function(b,c){return c==a.loggedInUserId||b||(b=a.members[c]),b},null)},G=function(a,b){var c=b.contactrequests.filter(function(b){return b.userid==a||b.requesteduserid}),d=c.length>0;return b.requirescontact&&!b.iscontact&&!d},H=function(a,b){var c=F(a),d=F(b),e=a.messages.length>0,f=b.messages.length>0,g=b.loggedInUserId,h=c&&G(g,c),i=d&&G(g,d),j=t(a,b),k=j===!1;if(!a.hasTriedToLoadMessages&&!b.hasTriedToLoadMessages)return null;if(!c&&!d)return null;if(!c&&i)return{show:!0,hasMessages:f,user:d};if(k&&i)return{show:!0,hasMessages:f,user:d};if(a.hasTriedToLoadMessages&&b.hasTriedToLoadMessages){if(!h&&i)return{show:!0,hasMessages:f,user:d};if(h&&!i)return{show:!1,hasMessages:f}}return!a.hasTriedToLoadMessages&&b.hasTriedToLoadMessages&&i?{show:!0,hasMessages:f,user:d}:a.hasTriedToLoadMessages&&!b.hasTriedToLoadMessages&&h?{show:!1,hasMessages:e}:null},I=function(a,b){var c=F(a),d=F(b);return c||d?c&&!d?!c.isblocked&&null:!c&&d?!!d.isblocked||null:!(c.isblocked||!d.isblocked)||!(c.isblocked&&!d.isblocked)&&null:null},J=function(a,b){var c=F(a),d=F(b);return c||d?c&&!d?!c.canmessage||null:!c&&d?!d.canmessage||null:!(!c.canmessage&&d.canmessage)&&(!(!c.canmessage||d.canmessage)||null):null},K=function(a,b){var c=o(a,b),d=D(a,b),e=H(a,b),f=I(a,b),g=J(a,b),h=null!==e?e.show&&e.hasMessages:null,i=F(b),j=function(a,c){if(a)return c;if(null!==a&&!a){if(!i)return{type:"content"};if(i.isblocked)return{type:"unblock"};if(b.messages.length&&G(b.loggedInUserId,i))return{type:"add-contact",user:i};if(!i.canmessage||i.requirescontact&&!i.iscontact)return{type:"unable-to-message"}}return null};if(null===c&&null===d&&null===e&&null===f)return null;for(var k=[[c,{type:"placeholder"}],[d,{type:"edit-mode"}],[g,{type:"unable-to-message"}],[f,{type:"unblock"}],[h,{type:"add-contact",user:i}]],l=0;l0,i=g.length>0,j=a.messages.length>0,k=a.messages.length>0;return h||!i||e.iscontact||k?!(d&&!d.iscontact&&i&&e.iscontact)&&(!(h&&!i)&&(!(!j&&k)&&null)):e.fullname},O=function(b,d){var e={all:{reset:M,conversation:j,scrollToMessage:m,loadingMembers:n,loadingFirstMessages:o,loadingMessages:p,sendingMessage:q,confirmDeleteSelectedMessages:v,inEditMode:D,selectedMessages:E,isFavourite:z,isMuted:A}};e[c.CONVERSATION_TYPES.PRIVATE]={header:k,footer:K,confirmBlockUser:r,confirmUnblockUser:s,confirmAddContact:t,confirmRemoveContact:u,confirmContactRequest:x,confirmDeleteConversation:w,isBlocked:y,isContact:B,loadingConfirmAction:C,requireAddContact:H,contactRequestSent:N},e[c.CONVERSATION_TYPES.PUBLIC]={header:l,footer:L};var f=a.extend({},e.all);return d.type&&d.type in e&&(f=a.extend(f,e[d.type])),Object.keys(f).reduce(function(a,c){var e=f[c],g=e(b,d);return null!==g&&(a[c]=g),a},{})};return{buildPatch:O}}); \ 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 cf35154ce2e..b23ddc6ca44 100644 --- a/message/amd/build/message_drawer_view_conversation_renderer.min.js +++ b/message/amd/build/message_drawer_view_conversation_renderer.min.js @@ -1 +1 @@ -define(["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.CONTACT_REQUEST_SENT_MESSAGE_CONTAINER)},n=function(a){return m(a).addClass("hidden")},o=function(a){return a.find(g.CONTENT_MESSAGES_FOOTER_CONTAINER)},p=function(a){o(a).removeClass("hidden")},q=function(a){o(a).addClass("hidden")},r=function(a){return a.find(g.CONTENT_MESSAGES_FOOTER_EDIT_MODE_CONTAINER)},s=function(a){r(a).removeClass("hidden")},t=function(a){r(a).addClass("hidden")},u=function(a){return a.find(g.PLACEHOLDER_CONTAINER)},v=function(a){u(a).removeClass("hidden")},w=function(a){u(a).addClass("hidden")},x=function(a){return a.find(g.CONTENT_MESSAGES_FOOTER_REQUIRE_CONTACT_CONTAINER)},y=function(a){x(a).removeClass("hidden")},z=function(a){x(a).addClass("hidden")},A=function(a){return a.find(g.CONTENT_MESSAGES_FOOTER_REQUIRE_UNBLOCK_CONTAINER)},B=function(a){A(a).removeClass("hidden")},C=function(a){A(a).addClass("hidden")},D=function(a){return a.find(g.CONTENT_MESSAGES_FOOTER_UNABLE_TO_MESSAGE_CONTAINER)},E=function(a){D(a).removeClass("hidden")},F=function(a){D(a).addClass("hidden")},G=function(a){N(a),Q(a),T(a)},H=function(a){q(a),t(a),w(a),z(a),C(a),F(a)},I=function(a){return a.find(g.CONTENT_PLACEHOLDER_CONTAINER)},J=function(a){I(a).removeClass("hidden")},K=function(a){I(a).addClass("hidden")},L=function(a){return a.find(g.HEADER)},M=function(a){L(a).removeClass("hidden")},N=function(a){L(a).addClass("hidden")},O=function(a){return a.find(g.HEADER_EDIT_MODE)},P=function(a){O(a).removeClass("hidden")},Q=function(a){O(a).addClass("hidden")},R=function(a){return a.find(g.HEADER_PLACEHOLDER_CONTAINER)},S=function(a){R(a).removeClass("hidden")},T=function(a){R(a).addClass("hidden")},U=function(a){return a.find(g.MESSAGE_TEXT_AREA)},V=function(a,b){var c=j(a);return c.find('[data-message-id="'+b+'"]')},W=function(a,b){var c=j(a);return c.find('[data-day-id="'+b+'"]')},X=function(a){return a.find(g.MORE_MESSAGES_LOADING_ICON_CONTAINER)},Y=function(a){X(a).removeClass("hidden")},Z=function(a){X(a).addClass("hidden")},$=function(a){a.find(g.SEND_MESSAGE_BUTTON).prop("disabled",!0),U(a).prop("disabled",!0)},_=function(a){a.find(g.SEND_MESSAGE_BUTTON).prop("disabled",!1),U(a).prop("disabled",!1)},aa=function(a){$(a),a.find(g.SEND_MESSAGE_ICON_CONTAINER).addClass("hidden"),a.find(g.LOADING_ICON_CONTAINER).removeClass("hidden")},ba=function(a){_(a),a.find(g.SEND_MESSAGE_ICON_CONTAINER).removeClass("hidden"),a.find(g.LOADING_ICON_CONTAINER).addClass("hidden")},ca=function(a){var b=U(a);b.val(""),b.focus()},da=function(a){return a.find(g.CONFIRM_DIALOGUE_CONTAINER)},ea=function(a){var b=da(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")},fa=function(a){var b=da(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")},ga=function(a,b){O(a).find(g.MESSAGES_SELECTED_COUNT).text(b)},ha=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:b[a.timeCreated]}})},ia=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:ha(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=W(c,b.before.timestamp);return a(d).insertBefore(e)}return i.append(d)})["catch"](function(){})})})},ja=function(b,c,e,f,i){var j=f.map(function(a){return a.value}),k=ha(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=V(c,a.before.id);return b.insertBefore(e)}var f=W(c,a.day.timestamp),h=f.find(g.DAY_MESSAGES_CONTAINER);return h.append(b)})})},ka=function(a,b){b.forEach(function(b){W(a,b.timestamp).remove()})},la=function(a,b){b.forEach(function(b){V(a,b.id).remove()})},ma=function(b,d,f,g){var h=[],i=g.days.add.length>0,j=g.messages.add.length>0,k=[],l=a.Deferred().resolve({}).promise();return i&&(k=k.concat(g.days.add.reduce(function(a,b){return a.concat(b.value.messages.map(function(a){return a.timeCreated}))},[]))),j&&(k=k.concat(g.messages.add.map(function(a){return a.value.timeCreated}))),k.length&&(l=c.get_string("strftimetime24","core_langconfig").then(function(a){var b=k.map(function(b){return{timestamp:b,format:a}});return e.get(b)}).then(function(a){return k.reduce(function(b,c,d){return b[c]=a[d],b},{})})),i&&h.push(l.then(function(a){return ia(b,d,f,g.days.add,a)})),j&&h.push(l.then(function(a){return ja(b,d,f,g.messages.add,a)})),g.days.remove.length>0&&ka(d,g.days.remove),g.messages.remove.length>0&&la(d,g.messages.remove),a.when.apply(a,h)},na=function(a,b,c,e){var f=L(a),g=h.HEADER_PUBLIC;return e.type==i.PRIVATE&&(g=e.showControls?h.HEADER_PRIVATE:h.HEADER_PRIVATE_NO_CONTROLS),d.render(g,e.context).then(function(a,b){d.replaceNodeContents(f,a,b)})},oa=function(a,b,d,e){switch(H(d),e.type){case"placeholder":return v(d);case"add-contact":return c.get_strings([{key:"requirecontacttomessage",component:"core_message",param:e.user.fullname},{key:"isnotinyourcontacts",component:"core_message",param:e.user.fullname}]).then(function(a){var b=a[1],c=a[0],e=x(d);return e.find(g.TITLE).text(b),e.find(g.TEXT).text(c),y(d),a});case"edit-mode":return s(d);case"content":return p(d);case"unblock":return B(d);case"unable-to-message":return E(d)}return!0},pa=function(a,b,c,d){var e=j(b),f=V(b,d),g=f.position();if(g){var h=e.scrollTop()+g.top;e.scrollTop(h)}},qa=function(a,b,c,d){d?(N(a),S(a)):(M(a),T(a))},ra=function(a,b,c,d){d?(l(b),J(b)):(k(b),K(b))},sa=function(a,b,c,d){d?Y(b):Z(b)},ta=function(a,b,c,d){d?aa(c):(ba(c),ca(c))},ua=function(a,b,c,d,e,f,h,i){var j=da(b),k=d.map(function(a){return j.find(a)}),l=j.find(g.CONFIRM_DIALOGUE_CANCEL_BUTTON),m=j.find(g.CONFIRM_DIALOGUE_TEXT),n=j.find(g.CONFIRM_DIALOGUE_HEADER);j.find("button").addClass("hidden"),h?l.removeClass("hidden"):l.addClass("hidden"),f?(n.removeClass("hidden"),n.text(f)):(n.addClass("hidden"),n.text("")),k.forEach(function(a){a.removeClass("hidden")}),m.text(e),ea(c),ea(b),i||ea(a),j.find(g.CAN_RECEIVE_FOCUS).filter(":visible").first().focus()},va=function(a,b,c){var d=da(b),e=d.find(g.CONFIRM_DIALOGUE_CANCEL_BUTTON),f=d.find(g.CONFIRM_DIALOGUE_TEXT),h=d.find(g.CONFIRM_DIALOGUE_HEADER);return fa(b),fa(c),fa(a),d.find("button").addClass("hidden"),e.removeClass("hidden"),f.text(""),h.addClass("hidden"),h.text(""),a.find(g.CAN_RECEIVE_FOCUS).first().focus(),!0},wa=function(a,b,d,e){return e?c.get_string("blockuserconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_BLOCK],c,"",!0,!1)}):va(a,b,d)},xa=function(a,b,d,e){return e?c.get_string("unblockuserconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_UNBLOCK],c,"",!0,!1)}):va(a,b,d)},ya=function(a,b,d,e){return e?c.get_string("addcontactconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_ADD_CONTACT],c,"",!0,!1)}):va(a,b,d)},za=function(a,b,d,e){return e?c.get_string("removecontactconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_REMOVE_CONTACT],c,"",!0,!1)}):va(a,b,d)},Aa=function(a,b,d,e){return e?c.get_string("deleteselectedmessagesconfirm","core_message").then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_DELETE_SELECTED_MESSAGES],c,"",!0,!1)}):va(a,b,d)},Ba=function(a,b,d,e){return e?c.get_string("deleteallconfirm","core_message").then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_DELETE_CONVERSATION],c,"",!0,!1)}):va(a,b,d)},Ca=function(a,b,d,e){return e?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)}):va(a,b,d)},Da=function(a,b,c,d){d?(a.find(g.ACTION_REQUEST_BLOCK).addClass("hidden"),a.find(g.ACTION_REQUEST_UNBLOCK).removeClass("hidden")):(a.find(g.ACTION_REQUEST_BLOCK).removeClass("hidden"),a.find(g.ACTION_REQUEST_UNBLOCK).addClass("hidden"))},Ea=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")}},Fa=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")}},Ga=function(a,b,c,d){var e=da(b),f=e.find("button"),h=e.find(g.CONFIRM_DIALOGUE_BUTTON_TEXT),i=e.find(g.LOADING_ICON_CONTAINER);d?(f.prop("disabled",!0),h.addClass("hidden"),i.removeClass("hidden")):(f.prop("disabled",!1),h.removeClass("hidden"),i.addClass("hidden"))},Ha=function(a,b,c,d){var e=null;d?(e=b.find(g.MESSAGE_NOT_SELECTED),e.find(g.MESSAGE_NOT_SELECTED_ICON).removeClass("hidden"),N(a),P(a)):(e=j(b),e.find(g.MESSAGE_NOT_SELECTED_ICON).addClass("hidden"),e.find(g.MESSAGE_SELECTED_ICON).addClass("hidden"),M(a),Q(a))},Ia=function(a,b,c,d){var e=d.count>0;d.add.length&&d.add.forEach(function(a){var c=V(b,a);c.find(g.MESSAGE_NOT_SELECTED_ICON).addClass("hidden"),c.find(g.MESSAGE_SELECTED_ICON).removeClass("hidden"),c.attr("aria-checked",!0)}),d.remove.length&&d.remove.forEach(function(a){var c=V(b,a);e&&c.find(g.MESSAGE_NOT_SELECTED_ICON).removeClass("hidden"),c.find(g.MESSAGE_SELECTED_ICON).addClass("hidden"),c.attr("aria-checked",!1)}),ga(a,d.count)},Ja=function(a,b,d,e){return e.show&&!e.hasMessages?c.get_strings([{key:"requirecontacttomessage",component:"core_message",param:e.user.fullname},{key:"isnotinyourcontacts",component:"core_message",param:e.user.fullname}]).then(function(c){var e=c[1],f=c[0];return ua(a,b,d,[g.ACTION_REQUEST_ADD_CONTACT],f,e,!1,!0)}):va(a,b,d)},Ka=function(a,b,d,e){var f=m(b);return e?c.get_string("yourcontactrequestpending","core_message",e).then(function(a){return f.find(g.TEXT).text(a),f.removeClass("hidden"),a}):(f.addClass("hidden"),!0)},La=function(a,b,c){return va(a,b,c),n(b),G(a),S(a),H(c),v(c),!0},Ma=function(c,d,e,f){var g=[{reset:La},{conversation:ma,header:na,footer:oa,confirmBlockUser:wa,confirmUnblockUser:xa,confirmAddContact:ya,confirmRemoveContact:za,confirmDeleteSelectedMessages:Aa,confirmDeleteConversation:Ba,confirmContactRequest:Ca,requireAddContact:Ja,contactRequestSent:Ka},{loadingMembers:qa,loadingFirstMessages:ra,loadingMessages:sa,sendingMessage:ta,isBlocked:Da,isContact:Fa,isFavourite:Ea,loadingConfirmAction:Ga,inEditMode:Ha},{scrollToMessage:pa,selectedMessages:Ia}],h=function(a){var b=[];for(var g in f)if(a.hasOwnProperty(g)){var h=a[g],i=f[g];b.push(h(c,d,e,i))}return b},i=h(g[0]);return i=i.concat(h(g[1])),a.when.apply(a,i).then(function(){for(var a=2;a0,j=g.messages.add.length>0,k=[],l=a.Deferred().resolve({}).promise();return i&&(k=k.concat(g.days.add.reduce(function(a,b){return a.concat(b.value.messages.map(function(a){return a.timeCreated}))},[]))),j&&(k=k.concat(g.messages.add.map(function(a){return a.value.timeCreated}))),k.length&&(l=c.get_string("strftimetime24","core_langconfig").then(function(a){var b=k.map(function(b){return{timestamp:b,format:a}});return e.get(b)}).then(function(a){return k.reduce(function(b,c,d){return b[c]=a[d],b},{})})),i&&h.push(l.then(function(a){return ia(b,d,f,g.days.add,a)})),j&&h.push(l.then(function(a){return ja(b,d,f,g.messages.add,a)})),g.days.remove.length>0&&ka(d,g.days.remove),g.messages.remove.length>0&&la(d,g.messages.remove),a.when.apply(a,h)},na=function(a,b,c,e){var f=L(a),g=h.HEADER_PUBLIC;return e.type==i.PRIVATE&&(g=e.showControls?h.HEADER_PRIVATE:h.HEADER_PRIVATE_NO_CONTROLS),d.render(g,e.context).then(function(a,b){d.replaceNodeContents(f,a,b)})},oa=function(a,b,d,e){switch(H(d),e.type){case"placeholder":return v(d);case"add-contact":return c.get_strings([{key:"requirecontacttomessage",component:"core_message",param:e.user.fullname},{key:"isnotinyourcontacts",component:"core_message",param:e.user.fullname}]).then(function(a){var b=a[1],c=a[0],e=x(d);return e.find(g.TITLE).text(b),e.find(g.TEXT).text(c),y(d),a});case"edit-mode":return s(d);case"content":return p(d);case"unblock":return B(d);case"unable-to-message":return E(d)}return!0},pa=function(a,b,c,d){var e=j(b),f=V(b,d),g=f.position();if(g){var h=e.scrollTop()+g.top;e.scrollTop(h)}},qa=function(a,b,c,d){d?(N(a),S(a)):(M(a),T(a))},ra=function(a,b,c,d){d?(l(b),J(b)):(k(b),K(b))},sa=function(a,b,c,d){d?Y(b):Z(b)},ta=function(a,b,c,d){d?aa(c):(ba(c),ca(c))},ua=function(a,b,c,d,e,f,h,i){var j=da(b),k=d.map(function(a){return j.find(a)}),l=j.find(g.CONFIRM_DIALOGUE_CANCEL_BUTTON),m=j.find(g.CONFIRM_DIALOGUE_TEXT),n=j.find(g.CONFIRM_DIALOGUE_HEADER);j.find("button").addClass("hidden"),h?l.removeClass("hidden"):l.addClass("hidden"),f?(n.removeClass("hidden"),n.text(f)):(n.addClass("hidden"),n.text("")),k.forEach(function(a){a.removeClass("hidden")}),m.text(e),ea(c),ea(b),i||ea(a),j.find(g.CAN_RECEIVE_FOCUS).filter(":visible").first().focus()},va=function(a,b,c){var d=da(b),e=d.find(g.CONFIRM_DIALOGUE_CANCEL_BUTTON),f=d.find(g.CONFIRM_DIALOGUE_TEXT),h=d.find(g.CONFIRM_DIALOGUE_HEADER);return fa(b),fa(c),fa(a),d.find("button").addClass("hidden"),e.removeClass("hidden"),f.text(""),h.addClass("hidden"),h.text(""),a.find(g.CAN_RECEIVE_FOCUS).first().focus(),!0},wa=function(a,b,d,e){return e?c.get_string("blockuserconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_BLOCK],c,"",!0,!1)}):va(a,b,d)},xa=function(a,b,d,e){return e?c.get_string("unblockuserconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_UNBLOCK],c,"",!0,!1)}):va(a,b,d)},ya=function(a,b,d,e){return e?c.get_string("addcontactconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_ADD_CONTACT],c,"",!0,!1)}):va(a,b,d)},za=function(a,b,d,e){return e?c.get_string("removecontactconfirm","core_message",e.fullname).then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_REMOVE_CONTACT],c,"",!0,!1)}):va(a,b,d)},Aa=function(a,b,d,e){return e?c.get_string("deleteselectedmessagesconfirm","core_message").then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_DELETE_SELECTED_MESSAGES],c,"",!0,!1)}):va(a,b,d)},Ba=function(a,b,d,e){return e?c.get_string("deleteallconfirm","core_message").then(function(c){return ua(a,b,d,[g.ACTION_CONFIRM_DELETE_CONVERSATION],c,"",!0,!1)}):va(a,b,d)},Ca=function(a,b,d,e){return e?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)}):va(a,b,d)},Da=function(a,b,c,d){d?(a.find(g.ACTION_REQUEST_BLOCK).addClass("hidden"),a.find(g.ACTION_REQUEST_UNBLOCK).removeClass("hidden")):(a.find(g.ACTION_REQUEST_BLOCK).removeClass("hidden"),a.find(g.ACTION_REQUEST_UNBLOCK).addClass("hidden"))},Ea=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")}},Fa=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")}},Ga=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")}},Ha=function(a,b,c,d){var e=da(b),f=e.find("button"),h=e.find(g.CONFIRM_DIALOGUE_BUTTON_TEXT),i=e.find(g.LOADING_ICON_CONTAINER);d?(f.prop("disabled",!0),h.addClass("hidden"),i.removeClass("hidden")):(f.prop("disabled",!1),h.removeClass("hidden"),i.addClass("hidden"))},Ia=function(a,b,c,d){var e=null;d?(e=b.find(g.MESSAGE_NOT_SELECTED),e.find(g.MESSAGE_NOT_SELECTED_ICON).removeClass("hidden"),N(a),P(a)):(e=j(b),e.find(g.MESSAGE_NOT_SELECTED_ICON).addClass("hidden"),e.find(g.MESSAGE_SELECTED_ICON).addClass("hidden"),M(a),Q(a))},Ja=function(a,b,c,d){var e=d.count>0;d.add.length&&d.add.forEach(function(a){var c=V(b,a);c.find(g.MESSAGE_NOT_SELECTED_ICON).addClass("hidden"),c.find(g.MESSAGE_SELECTED_ICON).removeClass("hidden"),c.attr("aria-checked",!0)}),d.remove.length&&d.remove.forEach(function(a){var c=V(b,a);e&&c.find(g.MESSAGE_NOT_SELECTED_ICON).removeClass("hidden"),c.find(g.MESSAGE_SELECTED_ICON).addClass("hidden"),c.attr("aria-checked",!1)}),ga(a,d.count)},Ka=function(a,b,d,e){return e.show&&!e.hasMessages?c.get_strings([{key:"requirecontacttomessage",component:"core_message",param:e.user.fullname},{key:"isnotinyourcontacts",component:"core_message",param:e.user.fullname}]).then(function(c){var e=c[1],f=c[0];return ua(a,b,d,[g.ACTION_REQUEST_ADD_CONTACT],f,e,!1,!0)}):va(a,b,d)},La=function(a,b,d,e){var f=m(b);return e?c.get_string("yourcontactrequestpending","core_message",e).then(function(a){return f.find(g.TEXT).text(a),f.removeClass("hidden"),a}):(f.addClass("hidden"),!0)},Ma=function(a,b,c){return va(a,b,c),n(b),G(a),S(a),H(c),v(c),!0},Na=function(c,d,e,f){var g=[{reset:Ma},{conversation:ma,header:na,footer:oa,confirmBlockUser:wa,confirmUnblockUser:xa,confirmAddContact:ya,confirmRemoveContact:za,confirmDeleteSelectedMessages:Aa,confirmDeleteConversation:Ba,confirmContactRequest:Ca,requireAddContact:Ka,contactRequestSent:La},{loadingMembers:qa,loadingFirstMessages:ra,loadingMessages:sa,sendingMessage:ta,isBlocked:Da,isContact:Ga,isFavourite:Ea,isMuted:Fa,loadingConfirmAction:Ha,inEditMode:Ia},{scrollToMessage:pa,selectedMessages:Ja}],h=function(a){var b=[];for(var g in f)if(a.hasOwnProperty(g)){var h=a[g],i=f[g];b.push(h(c,d,e,i))}return b},i=h(g[0]);return i=i.concat(h(g[1])),a.when.apply(a,i).then(function(){for(var a=2;ab.timeCreated?1:a.idb.id?1:0}),e.messages=g.filter(function(a,b,c){return!b||a.id!==c[b-1].id}),e},g=function(a,c){var d=b(a),e=c.map(function(a){return a.id});return d.messages=d.messages.filter(function(a){return e.indexOf(a.id)<0}),d},h=function(a,c){var d=b(a);return d.messages=d.messages.filter(function(a){return c.indexOf(a.id)<0}),d},i=function(a,c){var e=b(a),f=d(c);return f.forEach(function(a){e.members[a.id]=a}),e},j=function(a,c){var d=b(a);return c.forEach(function(a){delete d.members[a.id]}),d},k=function(a,c){var d=b(a);return d.loadingMessages=c,a.loadingMessages&&!c&&(d.hasTriedToLoadMessages=!0),d},l=function(a,c){var d=b(a);return d.sendingMessage=c,d},m=function(a,c){var d=b(a);return d.loadingMembers=c,d},n=function(a,c){var d=b(a);return d.id=c,d},o=function(a,c){var d=b(a);return d.name=c,d},p=function(a,c){var d=b(a);return d.subname=c,d},q=function(a,c){var d=b(a);return d.type=c,d},r=function(a,c){var d=b(a);return d.isFavourite=c,d},s=function(a,c){var d=b(a);return d.totalMemberCount=c,d},t=function(a,c){var d=b(a);return d.imageUrl=c,d},u=function(a,c){var d=b(a);return d.loadingConfirmAction=c,d},v=function(a,c){var d=b(a);return d.pendingDeleteConversation=c,d},w=function(a,c){var d=b(a);return c.forEach(function(a){d.pendingBlockUserIds.push(a)}),d},x=function(a,c){var d=b(a);return c.forEach(function(a){d.pendingRemoveContactIds.push(a)}),d},y=function(a,c){var d=b(a);return c.forEach(function(a){d.pendingUnblockUserIds.push(a)}),d},z=function(a,c){var d=b(a);return c.forEach(function(a){d.pendingAddContactIds.push(a)}),d},A=function(a,c){var d=b(a);return c.forEach(function(a){d.pendingDeleteMessageIds.push(a)}),d},B=function(a,c){var d=b(a);return d.pendingBlockUserIds=d.pendingBlockUserIds.filter(function(a){return c.indexOf(a)<0}),d},C=function(a,c){var d=b(a);return d.pendingRemoveContactIds=d.pendingRemoveContactIds.filter(function(a){return c.indexOf(a)<0}),d},D=function(a,c){var d=b(a);return d.pendingUnblockUserIds=d.pendingUnblockUserIds.filter(function(a){return c.indexOf(a)<0}),d},E=function(a,c){var d=b(a);return d.pendingAddContactIds=d.pendingAddContactIds.filter(function(a){return c.indexOf(a)<0}),d},F=function(a,c){var d=b(a);return d.pendingDeleteMessageIds=d.pendingDeleteMessageIds.filter(function(a){return c.indexOf(a)<0}),d},G=function(a,c){var d=b(a);return d.selectedMessageIds=d.selectedMessageIds.concat(c),d},H=function(a,c){var d=b(a);return d.selectedMessageIds=d.selectedMessageIds.filter(function(a){return c.indexOf(a)<0}),d},I=function(a,c){var d=b(a),e=c.map(function(a){return a.id});return d.messages=d.messages.map(function(a){return e.indexOf(a.id)>=0&&(a.isRead=!0),a}),d},J=function(a,c){var d=b(a);return c.forEach(function(a){var b=a.userid,c=a.requesteduserid;d.members[b].contactrequests.push(a),d.members[c].contactrequests.push(a)}),d},K=function(a,c){var d=b(a);return c.forEach(function(a){var b=a.userid,c=a.requesteduserid;d.members[b].contactrequests=d.members[b].contactrequests.filter(function(a){return a.userid!=b}),d.members[c].contactrequests=d.members[c].contactrequests.filter(function(a){return a.requesteduserid!=c})}),d};return{buildInitialState:e,addMessages:f,removeMessages:g,removeMessagesById:h,addMembers:i,removeMembers:j,setLoadingMessages:k,setSendingMessage:l,setLoadingMembers:m,setId:n,setName:o,setSubname:p,setType:q,setIsFavourite:r,setTotalMemberCount:s,setImageUrl:t,setLoadingConfirmAction:u,setPendingDeleteConversation:v,addPendingBlockUsersById:w,addPendingRemoveContactsById:x,addPendingUnblockUsersById:y,addPendingAddContactsById:z,addPendingDeleteMessagesById:A,removePendingBlockUsersById:B,removePendingRemoveContactsById:C,removePendingUnblockUsersById:D,removePendingAddContactsById:E,removePendingDeleteMessagesById:F,addSelectedMessagesById:G,removeSelectedMessagesById:H,markMessagesAsRead:I,addContactRequests:J,removeContactRequests:K}}); \ No newline at end of file +define(["jquery"],function(a){var b=function(b){var c=a.extend({},b);return c.messages=b.messages.map(function(b){return a.extend({},b)}),c.members=Object.keys(b.members).reduce(function(c,d){return c[d]=a.extend({},b.members[d]),c[d].contactrequests=b.members[d].contactrequests.map(function(b){return a.extend({},b)}),c},{}),c},c=function(a,b,c){return a.map(function(a){var d=a.useridfrom==b;return{id:parseInt(a.id,10),isRead:a.isread,fromLoggedInUser:d,userFrom:c[a.useridfrom],text:a.text,timeCreated:parseInt(a.timecreated,10)}})},d=function(a){return a.map(function(a){return{id:a.id,fullname:a.fullname,profileurl:a.profileurl,profileimageurl:a.profileimageurl,profileimageurlsmall:a.profileimageurlsmall,isonline:a.isonline,showonlinestatus:a.showonlinestatus,isblocked:a.isblocked,iscontact:a.iscontact,isdeleted:a.isdeleted,canmessage:a.canmessage,requirescontact:a.requirescontact,contactrequests:a.contactrequests||[]}})},e=function(a,b,c){return{midnight:a,loggedInUserId:b,id:c,name:null,subname:null,type:null,totalMemberCount:null,imageUrl:null,isFavourite:null,isMuted:null,members:{},messages:[],hasTriedToLoadMessages:!1,loadingMessages:!0,sendingMessage:!1,loadingMembers:!0,loadingConfirmAction:!1,pendingBlockUserIds:[],pendingUnblockUserIds:[],pendingRemoveContactIds:[],pendingAddContactIds:[],pendingDeleteMessageIds:[],pendingDeleteConversation:!1,selectedMessageIds:[]}},f=function(a,d){var e=b(a),f=c(d,a.loggedInUserId,a.members),g=a.messages.concat(f);return g.sort(function(a,b){return a.timeCreatedb.timeCreated?1:a.idb.id?1:0}),e.messages=g.filter(function(a,b,c){return!b||a.id!==c[b-1].id}),e},g=function(a,c){var d=b(a),e=c.map(function(a){return a.id});return d.messages=d.messages.filter(function(a){return e.indexOf(a.id)<0}),d},h=function(a,c){var d=b(a);return d.messages=d.messages.filter(function(a){return c.indexOf(a.id)<0}),d},i=function(a,c){var e=b(a),f=d(c);return f.forEach(function(a){e.members[a.id]=a}),e},j=function(a,c){var d=b(a);return c.forEach(function(a){delete d.members[a.id]}),d},k=function(a,c){var d=b(a);return d.loadingMessages=c,a.loadingMessages&&!c&&(d.hasTriedToLoadMessages=!0),d},l=function(a,c){var d=b(a);return d.sendingMessage=c,d},m=function(a,c){var d=b(a);return d.loadingMembers=c,d},n=function(a,c){var d=b(a);return d.id=c,d},o=function(a,c){var d=b(a);return d.name=c,d},p=function(a,c){var d=b(a);return d.subname=c,d},q=function(a,c){var d=b(a);return d.type=c,d},r=function(a,c){var d=b(a);return d.isFavourite=c,d},s=function(a,c){var d=b(a);return d.isMuted=c,d},t=function(a,c){var d=b(a);return d.totalMemberCount=c,d},u=function(a,c){var d=b(a);return d.imageUrl=c,d},v=function(a,c){var d=b(a);return d.loadingConfirmAction=c,d},w=function(a,c){var d=b(a);return d.pendingDeleteConversation=c,d},x=function(a,c){var d=b(a);return c.forEach(function(a){d.pendingBlockUserIds.push(a)}),d},y=function(a,c){var d=b(a);return c.forEach(function(a){d.pendingRemoveContactIds.push(a)}),d},z=function(a,c){var d=b(a);return c.forEach(function(a){d.pendingUnblockUserIds.push(a)}),d},A=function(a,c){var d=b(a);return c.forEach(function(a){d.pendingAddContactIds.push(a)}),d},B=function(a,c){var d=b(a);return c.forEach(function(a){d.pendingDeleteMessageIds.push(a)}),d},C=function(a,c){var d=b(a);return d.pendingBlockUserIds=d.pendingBlockUserIds.filter(function(a){return c.indexOf(a)<0}),d},D=function(a,c){var d=b(a);return d.pendingRemoveContactIds=d.pendingRemoveContactIds.filter(function(a){return c.indexOf(a)<0}),d},E=function(a,c){var d=b(a);return d.pendingUnblockUserIds=d.pendingUnblockUserIds.filter(function(a){return c.indexOf(a)<0}),d},F=function(a,c){var d=b(a);return d.pendingAddContactIds=d.pendingAddContactIds.filter(function(a){return c.indexOf(a)<0}),d},G=function(a,c){var d=b(a);return d.pendingDeleteMessageIds=d.pendingDeleteMessageIds.filter(function(a){return c.indexOf(a)<0}),d},H=function(a,c){var d=b(a);return d.selectedMessageIds=d.selectedMessageIds.concat(c),d},I=function(a,c){var d=b(a);return d.selectedMessageIds=d.selectedMessageIds.filter(function(a){return c.indexOf(a)<0}),d},J=function(a,c){var d=b(a),e=c.map(function(a){return a.id});return d.messages=d.messages.map(function(a){return e.indexOf(a.id)>=0&&(a.isRead=!0),a}),d},K=function(a,c){var d=b(a);return c.forEach(function(a){var b=a.userid,c=a.requesteduserid;d.members[b].contactrequests.push(a),d.members[c].contactrequests.push(a)}),d},L=function(a,c){var d=b(a);return c.forEach(function(a){var b=a.userid,c=a.requesteduserid;d.members[b].contactrequests=d.members[b].contactrequests.filter(function(a){return a.userid!=b}),d.members[c].contactrequests=d.members[c].contactrequests.filter(function(a){return a.requesteduserid!=c})}),d};return{buildInitialState:e,addMessages:f,removeMessages:g,removeMessagesById:h,addMembers:i,removeMembers:j,setLoadingMessages:k,setSendingMessage:l,setLoadingMembers:m,setId:n,setName:o,setSubname:p,setType:q,setIsFavourite:r,setIsMuted:s,setTotalMemberCount:t,setImageUrl:u,setLoadingConfirmAction:v,setPendingDeleteConversation:w,addPendingBlockUsersById:x,addPendingRemoveContactsById:y,addPendingUnblockUsersById:z,addPendingAddContactsById:A,addPendingDeleteMessagesById:B,removePendingBlockUsersById:C,removePendingRemoveContactsById:D,removePendingUnblockUsersById:E,removePendingAddContactsById:F,removePendingDeleteMessagesById:G,addSelectedMessagesById:H,removeSelectedMessagesById:I,markMessagesAsRead:J,addContactRequests:K,removeContactRequests:L}}); \ No newline at end of file diff --git a/message/amd/build/message_drawer_view_overview_section.min.js b/message/amd/build/message_drawer_view_overview_section.min.js index 0154211b746..48c4b7f944a 100644 --- a/message/amd/build/message_drawer_view_overview_section.min.js +++ b/message/amd/build/message_drawer_view_overview_section.min.js @@ -1 +1 @@ -define(["jquery","core/custom_interaction_events","core/notification","core/pubsub","core/str","core/templates","core/user_date","core_message/message_repository","core_message/message_drawer_events","core_message/message_drawer_router","core_message/message_drawer_routes","core_message/message_drawer_lazy_load_list","core_message/message_drawer_view_conversation_constants"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n={TOGGLE:'[data-region="toggle"]',CONVERSATION:"[data-conversation-id]",BLOCKED_ICON_CONTAINER:'[data-region="contact-icon-blocked"]',LAST_MESSAGE:'[data-region="last-message"]',LAST_MESSAGE_DATE:'[data-region="last-message-date"]',UNREAD_COUNT:'[data-region="unread-count"]',SECTION_TOTAL_COUNT:'[data-region="section-total-count"]',SECTION_TOTAL_COUNT_CONTAINER:'[data-region="section-total-count-container"]',SECTION_UNREAD_COUNT:'[data-region="section-unread-count"]',PLACEHOLDER_CONTAINER:'[data-region="placeholder-container"]'},o={CONVERSATIONS_LIST:"core_message/message_drawer_conversations_list",CONVERSATIONS_LIST_ITEMS_PLACEHOLDER:"core_message/message_drawer_conversations_list_items_placeholder"},p=50,q={},r=!1,s=!1,t=function(a){return l.getRoot(a).hasClass("show")},u=function(a){a.addClass("expanded")},v=function(a){a.removeClass("expanded")},w=function(a,b){var c=a.find(n.SECTION_TOTAL_COUNT_CONTAINER),d=c.find(n.SECTION_TOTAL_COUNT);d.text(b),c.removeClass("hidden");var e=b>20?20:b,g=Array.apply(null,Array(e)).map(function(){return!0});f.render(o.CONVERSATIONS_LIST_ITEMS_PLACEHOLDER,{placeholders:g}).then(function(b){var c=a.find(n.PLACEHOLDER_CONTAINER);c.html(b)})["catch"](function(){})},x=function(a,b){var c=a.find(n.SECTION_UNREAD_COUNT);c.text(b),b>0&&c.removeClass("hidden")},y=function(b,d,e){var g=d.map(function(b){var c=b.messages.length?b.messages[b.messages.length-1]:null,d={id:b.id,imageurl:b.imageurl,name:b.name,subname:b.subname,unreadcount:b.unreadcount,lastmessagedate:c?c.timecreated:null,sentfromcurrentuser:c?c.useridfrom==e:null,lastmessage:c?a(c.text).text()||c.text:null};if(b.type==m.CONVERSATION_TYPES.PRIVATE){var f=b.members.reduce(function(a,b){return a||b.id==e||(a=b),a},null);d.userid=f.id,d.showonlinestatus=f.showonlinestatus,d.isonline=f.isonline,d.isblocked=f.isblocked}return b.type==m.CONVERSATION_TYPES.PUBLIC&&(d.lastsendername=b.members.reduce(function(a,b){return a||b.id!=c.useridfrom||(a=b.fullname),a},null)),d});return f.render(o.CONVERSATIONS_LIST,{conversations:g}).then(function(a){return b.append(a),a})["catch"](c.exception)},z=function(a,b,d){return function(e,f){return h.getConversations(f,a,p+1,d,b).then(function(a){var b=a.conversations;return b.length>p?b=b.slice(0,-1):l.setLoadedAll(e,!0),d+=p,b.forEach(function(a){q[a.id]=a}),b})["catch"](c.exception)}},A=function(a){return a.find(n.SECTION_TOTAL_COUNT)},B=function(a){return a.find(n.SECTION_UNREAD_COUNT)},C=function(a){if(r){var b=A(a),c=parseInt(b.text());c+=1,b.text(c)}},D=function(a){if(r){var b=A(a),c=parseInt(b.text());c-=1,b.text(c)}},E=function(a){if(s){var b=B(a),c=parseInt(b.text());c-=1,b.text(c),c<1&&b.addClass("hidden")}},F=function(a,b){return a.find('[data-conversation-id="'+b+'"]')},G=function(a,b){return a.find('[data-user-id="'+b+'"]')},H=function(a){a.find(n.BLOCKED_ICON_CONTAINER).removeClass("hidden")},I=function(a){a.find(n.BLOCKED_ICON_CONTAINER).addClass("hidden")},J=function(b,c){var d,f=c.messages[c.messages.length-1],h="";d=f.fromLoggedInUser?{key:"you",component:"core_message"}:{key:"sender",component:"core_message",param:f.userFrom.fullname};var i=[d,{key:"strftimetime24",component:"core_langconfig"}];return e.get_strings(i).then(function(a){return h=a[0],g.get([{timestamp:f.timeCreated,format:a[1]}])}).then(function(a){return a[0]}).then(function(d){b.find(n.LAST_MESSAGE_DATE).text(d).removeClass("hidden"),f.fromLoggedInUser||c.type!==m.CONVERSATION_TYPES.PRIVATE||(h="");var e=h+" "+a(f.text).text()+"";return b.find(n.LAST_MESSAGE).html(e)})},K=function(b,d){var e=b.find(n.CONVERSATION),g="";if(!e.length){var h=l.getRoot(b);l.showContent(h),l.hideEmptyMessage(h)}var i=d.messages.length,j=i?d.messages[i-1]:null;j&&(g=a(j.text).text()||j.text);var k={id:d.id,name:d.name,subname:d.subname,lastmessagedate:j?j.timeCreated:null,sentfromcurrentuser:j?j.fromLoggedInUser:null,lastmessage:g,imageurl:d.imageUrl};return q[d.id]=d,f.render(o.CONVERSATIONS_LIST,{conversations:[k]}).then(function(a){var c=l.getContentContainer(b);return c.prepend(a)}).then(function(){return C(b)})["catch"](c.exception)},L=function(a,b){b.remove(),D(a);var c=a.find(n.CONVERSATION);if(!c.length){var d=l.getRoot(a);l.hideContent(d),l.showEmptyMessage(d)}},M=function(a,b){var c=b.find(n.UNREAD_COUNT);c.text("0"),c.addClass("hidden"),E(a)},N=function(c,e,f,g,h){var m=l.getRoot(e),o=e.find(n.TOGGLE);e.css("min-height",o.outerHeight()),e.on("show.bs.collapse",function(){u(e),l.show(m,f,y)}),e.on("hidden.bs.collapse",function(){v(e)}),d.subscribe(i.CONTACT_BLOCKED,function(a){var b=G(e,a);b.length&&H(b)}),d.subscribe(i.CONTACT_UNBLOCKED,function(a){var b=G(e,a);b.length&&I(b)}),d.subscribe(i.CONVERSATION_NEW_LAST_MESSAGE,function(a){if(!(g&&a.type!=g||h&&!a.isFavourite||!h&&a.isFavourite)){var b=a.id,c=F(e,b);c.length?J(c,a):K(e,a)}}),d.subscribe(i.CONVERSATION_DELETED,function(a){var b=F(e,a);b.length&&L(e,b)}),d.subscribe(i.CONVERSATION_READ,function(a){var b=F(e,a);b.length&&M(e,b)}),d.subscribe(i.CONVERSATION_SET_FAVOURITE,function(a){var b=null;!h||g&&g!=a.type?g==a.type&&(b=F(e,a.id),b.length&&L(e,b)):(b=F(e,a.id),b.length||K(e,a))}),d.subscribe(i.CONVERSATION_UNSET_FAVOURITE,function(a){var b=null;h?(b=F(e,a.id),b.length&&L(e,b)):g==a.type&&(b=F(e,a.id),b.length||K(e,a))}),b.define(e,[b.events.activate]),e.on(b.events.activate,n.CONVERSATION,function(b,d){var e=a(b.target).closest(n.CONVERSATION),f=e.attr("data-conversation-id"),g=q[f];j.go(c,k.VIEW_CONVERSATION,g),d.originalEvent.preventDefault()})},O=function(b,c,d,e,f,g,h,i){var j=a(d);if(!j.attr("data-init")){var k=z(f,g,0);if(N(b,j,k,f,g),t(j)){u(j);var m=l.getRoot(j);l.show(m,k,y)}h.then(function(a){w(j,a),r=!0})["catch"](function(){}),i.then(function(a){x(j,a),s=!0})["catch"](function(){}),j.attr("data-init",!0)}};return{show:O,isVisible:t}}); \ No newline at end of file +define(["jquery","core/custom_interaction_events","core/notification","core/pubsub","core/str","core/templates","core/user_date","core_message/message_repository","core_message/message_drawer_events","core_message/message_drawer_router","core_message/message_drawer_routes","core_message/message_drawer_lazy_load_list","core_message/message_drawer_view_conversation_constants"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n={TOGGLE:'[data-region="toggle"]',CONVERSATION:"[data-conversation-id]",BLOCKED_ICON_CONTAINER:'[data-region="contact-icon-blocked"]',LAST_MESSAGE:'[data-region="last-message"]',LAST_MESSAGE_DATE:'[data-region="last-message-date"]',MUTED_ICON_CONTAINER:'[data-region="muted-icon-container"]',UNREAD_COUNT:'[data-region="unread-count"]',SECTION_TOTAL_COUNT:'[data-region="section-total-count"]',SECTION_TOTAL_COUNT_CONTAINER:'[data-region="section-total-count-container"]',SECTION_UNREAD_COUNT:'[data-region="section-unread-count"]',PLACEHOLDER_CONTAINER:'[data-region="placeholder-container"]'},o={CONVERSATIONS_LIST:"core_message/message_drawer_conversations_list",CONVERSATIONS_LIST_ITEMS_PLACEHOLDER:"core_message/message_drawer_conversations_list_items_placeholder"},p=50,q={},r=!1,s=!1,t=function(a){return l.getRoot(a).hasClass("show")},u=function(a){a.addClass("expanded")},v=function(a){a.removeClass("expanded")},w=function(a,b){var c=a.find(n.SECTION_TOTAL_COUNT_CONTAINER),d=c.find(n.SECTION_TOTAL_COUNT);d.text(b),c.removeClass("hidden");var e=b>20?20:b,g=Array.apply(null,Array(e)).map(function(){return!0});f.render(o.CONVERSATIONS_LIST_ITEMS_PLACEHOLDER,{placeholders:g}).then(function(b){var c=a.find(n.PLACEHOLDER_CONTAINER);c.html(b)})["catch"](function(){})},x=function(a,b){var c=a.find(n.SECTION_UNREAD_COUNT);c.text(b),b>0&&c.removeClass("hidden")},y=function(b,d,e){var g=d.map(function(b){var c=b.messages.length?b.messages[b.messages.length-1]:null,d={id:b.id,imageurl:b.imageurl,name:b.name,subname:b.subname,unreadcount:b.unreadcount,ismuted:b.ismuted,lastmessagedate:c?c.timecreated:null,sentfromcurrentuser:c?c.useridfrom==e:null,lastmessage:c?a(c.text).text()||c.text:null};if(b.type==m.CONVERSATION_TYPES.PRIVATE){var f=b.members.reduce(function(a,b){return a||b.id==e||(a=b),a},null);d.userid=f.id,d.showonlinestatus=f.showonlinestatus,d.isonline=f.isonline,d.isblocked=f.isblocked}return b.type==m.CONVERSATION_TYPES.PUBLIC&&(d.lastsendername=b.members.reduce(function(a,b){return a||b.id!=c.useridfrom||(a=b.fullname),a},null)),d});return f.render(o.CONVERSATIONS_LIST,{conversations:g}).then(function(a){return b.append(a),a})["catch"](c.exception)},z=function(a,b,d){return function(e,f){return h.getConversations(f,a,p+1,d,b).then(function(a){var b=a.conversations;return b.length>p?b=b.slice(0,-1):l.setLoadedAll(e,!0),d+=p,b.forEach(function(a){q[a.id]=a}),b})["catch"](c.exception)}},A=function(a){return a.find(n.SECTION_TOTAL_COUNT)},B=function(a){return a.find(n.SECTION_UNREAD_COUNT)},C=function(a){if(r){var b=A(a),c=parseInt(b.text());c+=1,b.text(c)}},D=function(a){if(r){var b=A(a),c=parseInt(b.text());c-=1,b.text(c)}},E=function(a){if(s){var b=B(a),c=parseInt(b.text());c-=1,b.text(c),c<1&&b.addClass("hidden")}},F=function(a,b){return a.find('[data-conversation-id="'+b+'"]')},G=function(a,b){return a.find('[data-user-id="'+b+'"]')},H=function(a){a.find(n.MUTED_ICON_CONTAINER).removeClass("hidden")},I=function(a){a.find(n.MUTED_ICON_CONTAINER).addClass("hidden")},J=function(a){a.find(n.BLOCKED_ICON_CONTAINER).removeClass("hidden")},K=function(a){a.find(n.BLOCKED_ICON_CONTAINER).addClass("hidden")},L=function(b,c){var d,f=c.messages[c.messages.length-1],h="";d=f.fromLoggedInUser?{key:"you",component:"core_message"}:{key:"sender",component:"core_message",param:f.userFrom.fullname};var i=[d,{key:"strftimetime24",component:"core_langconfig"}];return e.get_strings(i).then(function(a){return h=a[0],g.get([{timestamp:f.timeCreated,format:a[1]}])}).then(function(a){return a[0]}).then(function(d){b.find(n.LAST_MESSAGE_DATE).text(d).removeClass("hidden"),f.fromLoggedInUser||c.type!==m.CONVERSATION_TYPES.PRIVATE||(h="");var e=h+" "+a(f.text).text()+"";return b.find(n.LAST_MESSAGE).html(e)})},M=function(b,d){var e=b.find(n.CONVERSATION),g="";if(!e.length){var h=l.getRoot(b);l.showContent(h),l.hideEmptyMessage(h)}var i=d.messages.length,j=i?d.messages[i-1]:null;j&&(g=a(j.text).text()||j.text);var k={id:d.id,name:d.name,subname:d.subname,lastmessagedate:j?j.timeCreated:null,sentfromcurrentuser:j?j.fromLoggedInUser:null,lastmessage:g,imageurl:d.imageUrl};return q[d.id]=d,f.render(o.CONVERSATIONS_LIST,{conversations:[k]}).then(function(a){var c=l.getContentContainer(b);return c.prepend(a)}).then(function(){return C(b)})["catch"](c.exception)},N=function(a,b){b.remove(),D(a);var c=a.find(n.CONVERSATION);if(!c.length){var d=l.getRoot(a);l.hideContent(d),l.showEmptyMessage(d)}},O=function(a,b){var c=b.find(n.UNREAD_COUNT);c.text("0"),c.addClass("hidden"),E(a)},P=function(c,e,f,g,h){var m=l.getRoot(e),o=e.find(n.TOGGLE);e.css("min-height",o.outerHeight()),e.on("show.bs.collapse",function(){u(e),l.show(m,f,y)}),e.on("hidden.bs.collapse",function(){v(e)}),d.subscribe(i.CONTACT_BLOCKED,function(a){var b=G(e,a);b.length&&J(b)}),d.subscribe(i.CONTACT_UNBLOCKED,function(a){var b=G(e,a);b.length&&K(b)}),d.subscribe(i.CONVERSATION_SET_MUTED,function(a){var b=a.id,c=F(e,b);c.length&&H(c)}),d.subscribe(i.CONVERSATION_UNSET_MUTED,function(a){var b=a.id,c=F(e,b);c.length&&I(c)}),d.subscribe(i.CONVERSATION_NEW_LAST_MESSAGE,function(a){if(!(g&&a.type!=g||h&&!a.isFavourite||!h&&a.isFavourite)){var b=a.id,c=F(e,b);c.length?L(c,a):M(e,a)}}),d.subscribe(i.CONVERSATION_DELETED,function(a){var b=F(e,a);b.length&&N(e,b)}),d.subscribe(i.CONVERSATION_READ,function(a){var b=F(e,a);b.length&&O(e,b)}),d.subscribe(i.CONVERSATION_SET_FAVOURITE,function(a){var b=null;!h||g&&g!=a.type?g==a.type&&(b=F(e,a.id),b.length&&N(e,b)):(b=F(e,a.id),b.length||M(e,a))}),d.subscribe(i.CONVERSATION_UNSET_FAVOURITE,function(a){var b=null;h?(b=F(e,a.id),b.length&&N(e,b)):g==a.type&&(b=F(e,a.id),b.length||M(e,a))}),b.define(e,[b.events.activate]),e.on(b.events.activate,n.CONVERSATION,function(b,d){var e=a(b.target).closest(n.CONVERSATION),f=e.attr("data-conversation-id"),g=q[f];j.go(c,k.VIEW_CONVERSATION,g),d.originalEvent.preventDefault()})},Q=function(b,c,d,e,f,g,h,i){var j=a(d);if(!j.attr("data-init")){var k=z(f,g,0);if(P(b,j,k,f,g),t(j)){u(j);var m=l.getRoot(j);l.show(m,k,y)}h.then(function(a){w(j,a),r=!0})["catch"](function(){}),i.then(function(a){x(j,a),s=!0})["catch"](function(){}),j.attr("data-init",!0)}};return{show:Q,isVisible:t}}); \ No newline at end of file diff --git a/message/amd/build/message_repository.min.js b/message/amd/build/message_repository.min.js index 9f480a69077..999ba175551 100644 --- a/message/amd/build/message_repository.min.js +++ b/message/amd/build/message_repository.min.js @@ -1 +1 @@ -define(["jquery","core/ajax","core/notification"],function(a,b,c){var d={PRIVATE:1,PUBLIC:2},e=function(a){"undefined"==typeof a.limit&&(a.limit=0),"undefined"==typeof a.offset&&(a.offset=0),"undefined"==typeof a.type&&(a.type=null),"undefined"==typeof a.favouritesonly&&(a.favouritesonly=!1),a.limitfrom=a.offset,a.limitnum=a.limit,delete a.limit,delete a.offset;var d={methodname:"core_message_data_for_messagearea_conversations",args:a},e=b.call([d])[0];return e.fail(c.exception),e},f=function(a){var d={methodname:"core_message_get_unread_conversations_count",args:a},e=b.call([d])[0];return e.fail(c.exception),e},g=function(a){var d={methodname:"core_message_mark_all_messages_as_read",args:a},e=b.call([d])[0];return e.fail(c.exception),e},h=function(a,c,d){var e={userid:a};"undefined"!=typeof c&&(e.limitnum=c),"undefined"!=typeof d&&(e.limitfrom=d);var f={methodname:"core_message_get_user_contacts",args:e};return b.call([f])[0]},i=function(a,c){var d={methodname:"core_message_data_for_messagearea_get_profile",args:{currentuserid:a,otheruserid:c}};return b.call([d])[0]},j=function(c,d){var e=[{methodname:"core_message_block_user",args:{userid:c,blockeduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:c,userids:[d],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},k=function(c,d){var e=[{methodname:"core_message_unblock_user",args:{userid:c,unblockeduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:c,userids:[d],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},l=function(a,c){var d={methodname:"core_message_create_contact_request",args:{userid:a,requesteduserid:c}};return b.call([d])[0]},m=function(c,d){var e=[{methodname:"core_message_delete_contacts",args:{userid:c,userids:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:c,userids:d,includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b})},n=function(a,c,d,e,f,g){var h={currentuserid:a,convid:c,newest:!!f};"undefined"!=typeof d&&(h.limitnum=d),"undefined"!=typeof e&&(h.limitfrom=e),"undefined"!=typeof g&&(h.timefrom=g);var i={methodname:"core_message_get_conversation_messages",args:h};return b.call([i])[0]},o=function(a,c,d,e){var f={userid:a,search:c};"undefined"!=typeof d&&(f.limitnum=d),"undefined"!=typeof e&&(f.limitfrom=e);var g={methodname:"core_message_message_search_users",args:f};return b.call([g])[0]},p=function(a,c,d,e){var f={userid:a,search:c};"undefined"!=typeof d&&(f.limitnum=d),"undefined"!=typeof e&&(f.limitfrom=e);var g={methodname:"core_message_data_for_messagearea_search_messages",args:f};return b.call([g])[0]},q=function(a,c){var d=c.map(function(b){return{touserid:a,text:b}}),e={methodname:"core_message_send_instant_messages",args:{messages:d}};return b.call([e])[0].then(function(a){var b=a.reduce(function(a,b){return b.errormessage&&a.push(b.errormessage),a},[]);if(b.length)throw new Error(b.join("\n"));return a}).then(function(a){return a.map(function(a){return{id:a.msgid,text:a.text,timecreated:a.timecreated,useridfrom:a.useridfrom,conversationid:a.conversationid}})})},r=function(a,b){return q(a,[b]).then(function(a){return a[0]})},s=function(a,c){var d=c.map(function(a){return{text:a}}),e={methodname:"core_message_send_messages_to_conversation",args:{conversationid:a,messages:d}};return b.call([e])[0]},t=function(a,b){return s(a,[b]).then(function(a){return a[0]})},u=function(a,c){var d={methodname:"core_user_update_user_preferences",args:{userid:a,preferences:c}};return b.call([d])[0]},v=function(a){var c={methodname:"core_user_get_user_preferences",args:{userid:a}};return b.call([c])[0]},w=function(c,d){return a.when.apply(null,b.call(d.map(function(a){return{methodname:"core_message_delete_message",args:{messageid:a,userid:c}}})))},x=function(a,c){var d={methodname:"core_message_delete_conversations_by_id",args:{userid:a,conversationids:[c]}};return b.call([d])[0]},y=function(a){var c={methodname:"core_message_get_contact_requests",args:{userid:a}};return b.call([c])[0]},z=function(c,d){var e=[{methodname:"core_message_confirm_contact_request",args:{userid:c,requesteduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:d,userids:[c],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},A=function(c,d){var e=[{methodname:"core_message_decline_contact_request",args:{userid:c,requesteduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:d,userids:[c],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},B=function(a,c,d,e,f,g,h,i,j){var k={userid:a,conversationid:c};"undefined"!=typeof d&&null!==d&&(k.includecontactrequests=d),"undefined"!=typeof e&&null!==e&&(k.includeprivacyinfo=e),"undefined"!=typeof f&&null!==f&&(k.memberlimit=f),"undefined"!=typeof g&&null!==g&&(k.memberoffset=g),"undefined"!=typeof h&&null!==h&&(k.messagelimit=h),"undefined"!=typeof i&&null!==i&&(k.messageoffset=i),"undefined"!=typeof j&&null!==j&&(k.newestmessagesfirst=j);var l={methodname:"core_message_get_conversation",args:k};return b.call([l])[0]},C=function(a,c,d,e,f,g,h,i,j){var k={userid:a,otheruserid:c};"undefined"!=typeof d&&null!==d&&(k.includecontactrequests=d),"undefined"!=typeof e&&null!==e&&(k.includeprivacyinfo=e),"undefined"!=typeof f&&null!==f&&(k.memberlimit=f),"undefined"!=typeof g&&null!==g&&(k.memberoffset=g),"undefined"!=typeof h&&null!==h&&(k.messagelimit=h),"undefined"!=typeof i&&null!==i&&(k.messageoffset=i),"undefined"!=typeof j&&null!==j&&(k.newestmessagesfirst=j);var l={methodname:"core_message_get_conversation_between_users",args:k};return b.call([l])[0]},D=function(a,c,e,f,g){var h={userid:a,type:c};"undefined"!=typeof e&&null!==e&&(h.limitnum=e),"undefined"!=typeof f&&null!==f&&(h.limitfrom=f),"undefined"!=typeof g&&null!==g&&(h.favourites=g);var i={methodname:"core_message_get_conversations",args:h};return b.call([i])[0].then(function(a){return a.conversations.length&&(a.conversations=a.conversations.map(function(a){if(a.type==d.PRIVATE){var b=a.members.length?a.members[0]:null;b&&(a.name=a.name?a.name:b.fullname,a.imageurl=a.imageurl?a.imageurl:b.profileimageurl)}return a})),a})},E=function(a,c,d,e,f){var g={userid:c,conversationid:a};"undefined"!=typeof d&&null!==d&&(g.limitnum=d),"undefined"!=typeof e&&null!==e&&(g.limitfrom=e),"undefined"!=typeof f&&null!==f&&(g.includecontactrequests=f);var h={methodname:"core_message_get_conversation_members",args:g};return b.call([h])[0]},F=function(a,c){var d={methodname:"core_message_set_favourite_conversations",args:{userid:a,conversations:c}};return b.call([d])[0]},G=function(a,c){var d={methodname:"core_message_unset_favourite_conversations",args:{userid:a,conversations:c}};return b.call([d])[0]},H=function(a,c,d,e){var f={referenceuserid:a,userids:c};"undefined"!=typeof d&&(f.includecontactrequests=d),"undefined"!=typeof e&&(f.includeprivacyinfo=e);var g={methodname:"core_message_get_member_info",args:f};return b.call([g])[0]},I=function(a,c){var d={methodname:"core_message_mark_all_conversation_messages_as_read",args:{userid:a,conversationid:c}};return b.call([d])[0]},J=function(a){var c={methodname:"core_message_get_user_message_preferences",args:{userid:a}};return b.call([c])[0]},K=function(a){var c={methodname:"core_message_get_conversation_counts",args:{userid:a}};return b.call([c])[0]},L=function(a){var c={methodname:"core_message_get_unread_conversation_counts",args:{userid:a}};return b.call([c])[0]},M=function(c){var d=[{methodname:"core_message_get_conversation_counts",args:{userid:c}},{methodname:"core_message_get_unread_conversation_counts",args:{userid:c}}];return a.when.apply(null,b.call(d)).then(function(a,b){return{total:a,unread:b}})};return{query:e,countUnreadConversations:f,markAllAsRead:g,getContacts:h,getProfile:i,blockUser:j,unblockUser:k,createContactRequest:l,deleteContacts:m,getMessages:n,searchUsers:o,searchMessages:p,sendMessagesToUser:q,sendMessageToUser:r,sendMessagesToConversation:s,sendMessageToConversation:t,savePreferences:u,getPreferences:v,deleteMessages:w,deleteConversation:x,getContactRequests:y,acceptContactRequest:z,declineContactRequest:A,getConversation:B,getConversationBetweenUsers:C,getConversations:D,getConversationMembers:E,setFavouriteConversations:F,unsetFavouriteConversations:G,getMemberInfo:H,markAllConversationMessagesAsRead:I,getUserMessagePreferences:J,getTotalConversationCounts:K,getUnreadConversationCounts:L,getAllConversationCounts:M}}); \ No newline at end of file +define(["jquery","core/ajax","core/notification"],function(a,b,c){var d={PRIVATE:1,PUBLIC:2},e=function(a){"undefined"==typeof a.limit&&(a.limit=0),"undefined"==typeof a.offset&&(a.offset=0),"undefined"==typeof a.type&&(a.type=null),"undefined"==typeof a.favouritesonly&&(a.favouritesonly=!1),a.limitfrom=a.offset,a.limitnum=a.limit,delete a.limit,delete a.offset;var d={methodname:"core_message_data_for_messagearea_conversations",args:a},e=b.call([d])[0];return e.fail(c.exception),e},f=function(a){var d={methodname:"core_message_get_unread_conversations_count",args:a},e=b.call([d])[0];return e.fail(c.exception),e},g=function(a){var d={methodname:"core_message_mark_all_messages_as_read",args:a},e=b.call([d])[0];return e.fail(c.exception),e},h=function(a,c,d){var e={userid:a};"undefined"!=typeof c&&(e.limitnum=c),"undefined"!=typeof d&&(e.limitfrom=d);var f={methodname:"core_message_get_user_contacts",args:e};return b.call([f])[0]},i=function(a,c){var d={methodname:"core_message_data_for_messagearea_get_profile",args:{currentuserid:a,otheruserid:c}};return b.call([d])[0]},j=function(c,d){var e=[{methodname:"core_message_block_user",args:{userid:c,blockeduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:c,userids:[d],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},k=function(c,d){var e=[{methodname:"core_message_unblock_user",args:{userid:c,unblockeduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:c,userids:[d],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},l=function(a,c){var d={methodname:"core_message_create_contact_request",args:{userid:a,requesteduserid:c}};return b.call([d])[0]},m=function(c,d){var e=[{methodname:"core_message_delete_contacts",args:{userid:c,userids:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:c,userids:d,includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b})},n=function(a,c,d,e,f,g){var h={currentuserid:a,convid:c,newest:!!f};"undefined"!=typeof d&&(h.limitnum=d),"undefined"!=typeof e&&(h.limitfrom=e),"undefined"!=typeof g&&(h.timefrom=g);var i={methodname:"core_message_get_conversation_messages",args:h};return b.call([i])[0]},o=function(a,c,d,e){var f={userid:a,search:c};"undefined"!=typeof d&&(f.limitnum=d),"undefined"!=typeof e&&(f.limitfrom=e);var g={methodname:"core_message_message_search_users",args:f};return b.call([g])[0]},p=function(a,c,d,e){var f={userid:a,search:c};"undefined"!=typeof d&&(f.limitnum=d),"undefined"!=typeof e&&(f.limitfrom=e);var g={methodname:"core_message_data_for_messagearea_search_messages",args:f};return b.call([g])[0]},q=function(a,c){var d=c.map(function(b){return{touserid:a,text:b}}),e={methodname:"core_message_send_instant_messages",args:{messages:d}};return b.call([e])[0].then(function(a){var b=a.reduce(function(a,b){return b.errormessage&&a.push(b.errormessage),a},[]);if(b.length)throw new Error(b.join("\n"));return a}).then(function(a){return a.map(function(a){return{id:a.msgid,text:a.text,timecreated:a.timecreated,useridfrom:a.useridfrom,conversationid:a.conversationid}})})},r=function(a,b){return q(a,[b]).then(function(a){return a[0]})},s=function(a,c){var d=c.map(function(a){return{text:a}}),e={methodname:"core_message_send_messages_to_conversation",args:{conversationid:a,messages:d}};return b.call([e])[0]},t=function(a,b){return s(a,[b]).then(function(a){return a[0]})},u=function(a,c){var d={methodname:"core_user_update_user_preferences",args:{userid:a,preferences:c}};return b.call([d])[0]},v=function(a){var c={methodname:"core_user_get_user_preferences",args:{userid:a}};return b.call([c])[0]},w=function(c,d){return a.when.apply(null,b.call(d.map(function(a){return{methodname:"core_message_delete_message",args:{messageid:a,userid:c}}})))},x=function(a,c){var d={methodname:"core_message_delete_conversations_by_id",args:{userid:a,conversationids:[c]}};return b.call([d])[0]},y=function(a){var c={methodname:"core_message_get_contact_requests",args:{userid:a}};return b.call([c])[0]},z=function(c,d){var e=[{methodname:"core_message_confirm_contact_request",args:{userid:c,requesteduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:d,userids:[c],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},A=function(c,d){var e=[{methodname:"core_message_decline_contact_request",args:{userid:c,requesteduserid:d}},{methodname:"core_message_get_member_info",args:{referenceuserid:d,userids:[c],includecontactrequests:!0,includeprivacyinfo:!0}}];return a.when.apply(null,b.call(e)).then(function(a,b){return b.length?b[0]:{}})},B=function(a,c,d,e,f,g,h,i,j){var k={userid:a,conversationid:c};"undefined"!=typeof d&&null!==d&&(k.includecontactrequests=d),"undefined"!=typeof e&&null!==e&&(k.includeprivacyinfo=e),"undefined"!=typeof f&&null!==f&&(k.memberlimit=f),"undefined"!=typeof g&&null!==g&&(k.memberoffset=g),"undefined"!=typeof h&&null!==h&&(k.messagelimit=h),"undefined"!=typeof i&&null!==i&&(k.messageoffset=i),"undefined"!=typeof j&&null!==j&&(k.newestmessagesfirst=j);var l={methodname:"core_message_get_conversation",args:k};return b.call([l])[0]},C=function(a,c,d,e,f,g,h,i,j){var k={userid:a,otheruserid:c};"undefined"!=typeof d&&null!==d&&(k.includecontactrequests=d),"undefined"!=typeof e&&null!==e&&(k.includeprivacyinfo=e),"undefined"!=typeof f&&null!==f&&(k.memberlimit=f),"undefined"!=typeof g&&null!==g&&(k.memberoffset=g),"undefined"!=typeof h&&null!==h&&(k.messagelimit=h),"undefined"!=typeof i&&null!==i&&(k.messageoffset=i),"undefined"!=typeof j&&null!==j&&(k.newestmessagesfirst=j);var l={methodname:"core_message_get_conversation_between_users",args:k};return b.call([l])[0]},D=function(a,c,e,f,g){var h={userid:a,type:c};"undefined"!=typeof e&&null!==e&&(h.limitnum=e),"undefined"!=typeof f&&null!==f&&(h.limitfrom=f),"undefined"!=typeof g&&null!==g&&(h.favourites=g);var i={methodname:"core_message_get_conversations",args:h};return b.call([i])[0].then(function(a){return a.conversations.length&&(a.conversations=a.conversations.map(function(a){if(a.type==d.PRIVATE){var b=a.members.length?a.members[0]:null;b&&(a.name=a.name?a.name:b.fullname,a.imageurl=a.imageurl?a.imageurl:b.profileimageurl)}return a})),a})},E=function(a,c,d,e,f){var g={userid:c,conversationid:a};"undefined"!=typeof d&&null!==d&&(g.limitnum=d),"undefined"!=typeof e&&null!==e&&(g.limitfrom=e),"undefined"!=typeof f&&null!==f&&(g.includecontactrequests=f);var h={methodname:"core_message_get_conversation_members",args:g};return b.call([h])[0]},F=function(a,c){var d={methodname:"core_message_set_favourite_conversations",args:{userid:a,conversations:c}};return b.call([d])[0]},G=function(a,c){var d={methodname:"core_message_unset_favourite_conversations",args:{userid:a,conversations:c}};return b.call([d])[0]},H=function(a,c){var d={methodname:"core_message_mute_conversations",args:{userid:a,conversationids:c}};return b.call([d])[0]},I=function(a,c){var d={methodname:"core_message_unmute_conversations",args:{userid:a,conversationids:c}};return b.call([d])[0]},J=function(a,c,d,e){var f={referenceuserid:a,userids:c};"undefined"!=typeof d&&(f.includecontactrequests=d),"undefined"!=typeof e&&(f.includeprivacyinfo=e);var g={methodname:"core_message_get_member_info",args:f};return b.call([g])[0]},K=function(a,c){var d={methodname:"core_message_mark_all_conversation_messages_as_read",args:{userid:a,conversationid:c}};return b.call([d])[0]},L=function(a){var c={methodname:"core_message_get_user_message_preferences",args:{userid:a}};return b.call([c])[0]},M=function(a){var c={methodname:"core_message_get_conversation_counts",args:{userid:a}};return b.call([c])[0]},N=function(a){var c={methodname:"core_message_get_unread_conversation_counts",args:{userid:a}};return b.call([c])[0]},O=function(c){var d=[{methodname:"core_message_get_conversation_counts",args:{userid:c}},{methodname:"core_message_get_unread_conversation_counts",args:{userid:c}}];return a.when.apply(null,b.call(d)).then(function(a,b){return{total:a,unread:b}})};return{query:e,countUnreadConversations:f,markAllAsRead:g,getContacts:h,getProfile:i,blockUser:j,unblockUser:k,createContactRequest:l,deleteContacts:m,getMessages:n,searchUsers:o,searchMessages:p,sendMessagesToUser:q,sendMessageToUser:r,sendMessagesToConversation:s,sendMessageToConversation:t,savePreferences:u,getPreferences:v,deleteMessages:w,deleteConversation:x,getContactRequests:y,acceptContactRequest:z,declineContactRequest:A,getConversation:B,getConversationBetweenUsers:C,getConversations:D,getConversationMembers:E,setFavouriteConversations:F,setMutedConversations:H,unsetFavouriteConversations:G,unsetMutedConversations:I,getMemberInfo:J,markAllConversationMessagesAsRead:K,getUserMessagePreferences:L,getTotalConversationCounts:M,getUnreadConversationCounts:N,getAllConversationCounts:O}}); \ No newline at end of file diff --git a/message/amd/src/message_drawer_events.js b/message/amd/src/message_drawer_events.js index 002d218c1ac..fa5ce014bd3 100644 --- a/message/amd/src/message_drawer_events.js +++ b/message/amd/src/message_drawer_events.js @@ -35,7 +35,9 @@ define([], function() { CONVERSATION_DELETED: 'message-drawer-conversation-deleted', CONVERSATION_READ: 'message-drawer-conversation-read', CONVERSATION_SET_FAVOURITE: 'message-drawer-conversation-set-favourite', + CONVERSATION_SET_MUTED: 'message-drawer-conversation-set-muted', CONVERSATION_UNSET_FAVOURITE: 'message-drawer-conversation-unset-favourite', + CONVERSATION_UNSET_MUTED: 'message-drawer-conversation-unset-muted', PREFERENCES_UPDATED: 'message-drawer-preferences-updated', ROUTE_CHANGED: 'message-drawer-route-change', SHOW: 'message-drawer-show', diff --git a/message/amd/src/message_drawer_view_conversation.js b/message/amd/src/message_drawer_view_conversation.js index 486ee7cc2e4..8b8949b566a 100644 --- a/message/amd/src/message_drawer_view_conversation.js +++ b/message/amd/src/message_drawer_view_conversation.js @@ -240,6 +240,7 @@ function( subname: state.subname, imageUrl: state.imageUrl, isFavourite: state.isFavourite, + isMuted: state.isMuted, type: state.type, totalMemberCount: state.totalMemberCount, loggedInUserId: state.loggedInUserId, @@ -328,6 +329,7 @@ function( newState = StateManager.setImageUrl(newState, imageUrl); newState = StateManager.setTotalMemberCount(newState, conversation.membercount); newState = StateManager.setIsFavourite(newState, conversation.isfavourite); + newState = StateManager.setIsMuted(newState, conversation.ismuted); newState = StateManager.addMessages(newState, conversation.messages); return newState; }; @@ -795,6 +797,50 @@ function( }); }; + /** + * Set the current conversation as a muted conversation. + * + * @return {Promise} Renderer promise. + */ + var setMuted = function() { + var userId = viewState.loggedInUserId; + var conversationId = viewState.id; + + return Repository.setMutedConversations(userId, [conversationId]) + .then(function() { + var newState = StateManager.setIsMuted(viewState, true); + return render(newState); + }) + .then(function() { + return PubSub.publish( + MessageDrawerEvents.CONVERSATION_SET_MUTED, + formatConversationForEvent(viewState) + ); + }); + }; + + /** + * Unset the current conversation as a muted conversation. + * + * @return {Promise} Renderer promise. + */ + var unsetMuted = function() { + var userId = viewState.loggedInUserId; + var conversationId = viewState.id; + + return Repository.unsetMutedConversations(userId, [conversationId]) + .then(function() { + var newState = StateManager.setIsMuted(viewState, false); + return render(newState); + }) + .then(function() { + return PubSub.publish( + MessageDrawerEvents.CONVERSATION_UNSET_MUTED, + formatConversationForEvent(viewState) + ); + }); + }; + /** * Tell the statemanager there is a request to delete the selected messages * and run the renderer to show confirm delete messages dialogue. @@ -1211,6 +1257,29 @@ function( /** * Show the view group info page. + * Set this conversation as muted. + * + * @param {Object} e Element this event handler is called on. + * @param {Object} data Data for this event. + */ + var handleSetMuted = function(e, data) { + setMuted().catch(Notification.exception); + data.originalEvent.preventDefault(); + }; + + /** + * Unset this conversation as muted. + * + * @param {Object} e Element this event handler is called on. + * @param {Object} data Data for this event. + */ + var handleUnsetMuted = function(e, data) { + unsetMuted().catch(Notification.exception); + data.originalEvent.preventDefault(); + }; + + /** + * Show the view contact page. * * @param {String} namespace Unique identifier for the Routes * @return {Function} View group info handler. @@ -1254,7 +1323,9 @@ function( [SELECTORS.ACTION_VIEW_CONTACT, generateHandleViewContact(namespace)], [SELECTORS.ACTION_VIEW_GROUP_INFO, generateHandleViewGroupInfo(namespace)], [SELECTORS.ACTION_CONFIRM_FAVOURITE, handleSetFavourite], + [SELECTORS.ACTION_CONFIRM_MUTE, handleSetMuted], [SELECTORS.ACTION_CONFIRM_UNFAVOURITE, handleUnsetFavourite], + [SELECTORS.ACTION_CONFIRM_UNMUTE, handleUnsetMuted] ]; var bodyActivateHandlers = [ [SELECTORS.ACTION_CANCEL_CONFIRM, generateConfirmActionHandler(cancelRequest)], diff --git a/message/amd/src/message_drawer_view_conversation_constants.js b/message/amd/src/message_drawer_view_conversation_constants.js index 83507c00528..3bd84c8e218 100644 --- a/message/amd/src/message_drawer_view_conversation_constants.js +++ b/message/amd/src/message_drawer_view_conversation_constants.js @@ -31,9 +31,11 @@ define([], function() { 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"]', @@ -74,6 +76,7 @@ define([], function() { 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"]', SEND_MESSAGE_BUTTON: '[data-action="send-message"]', SEND_MESSAGE_ICON_CONTAINER: '[data-region="send-icon-container"]', diff --git a/message/amd/src/message_drawer_view_conversation_patcher.js b/message/amd/src/message_drawer_view_conversation_patcher.js index dd7556a4a8b..43ea13c4ed8 100644 --- a/message/amd/src/message_drawer_view_conversation_patcher.js +++ b/message/amd/src/message_drawer_view_conversation_patcher.js @@ -298,6 +298,7 @@ function( totalmembercount: newState.totalMemberCount, imageurl: newState.imageUrl, isfavourite: newState.isFavourite, + ismuted: newState.isMuted, // Don't show favouriting if we don't have a conversation. showfavourite: newState.id !== null, userid: newOtherUser.id, @@ -336,6 +337,7 @@ function( totalmembercount: newState.totalMemberCount, imageurl: newState.imageUrl, isfavourite: newState.isFavourite, + ismuted: newState.isMuted, // Don't show favouriting if we don't have a conversation. showfavourite: newState.id !== null } @@ -646,6 +648,39 @@ function( } }; + /** + * Check if there are any changes the conversation muted state. + * + * @param {Object} state The current state. + * @param {Object} newState The new state. + * @return {string|null} + */ + var buildIsMuted = function(state, newState) { + var oldIsMuted = state.isMuted; + var newIsMuted = newState.isMuted; + + if (state.id === null && newState.id === null) { + // The conversation isn't yet created so don't change anything. + return null; + } else if (state.id === null && newState.id !== null) { + // The conversation was created so we can show the mute button. + return 'show-mute'; + } else if (state.id !== null && newState.id === null) { + // We're changing from a created conversation to a new conversation so hide + // the muting functionality for now. + return 'hide'; + } else if (oldIsMuted == newIsMuted) { + // No change. + return null; + } else if (!oldIsMuted && newIsMuted) { + return 'show-unmute'; + } else if (oldIsMuted && !newIsMuted) { + return 'show-mute'; + } else { + return null; + } + }; + /** * Check if there are any changes in the contact status of the current user * and other user. @@ -1130,7 +1165,8 @@ function( confirmDeleteSelectedMessages: buildConfirmDeleteSelectedMessages, inEditMode: buildInEditMode, selectedMessages: buildSelectedMessages, - isFavourite: buildIsFavourite + isFavourite: buildIsFavourite, + isMuted: buildIsMuted } }; // These build functions are only applicable to private conversations. diff --git a/message/amd/src/message_drawer_view_conversation_renderer.js b/message/amd/src/message_drawer_view_conversation_renderer.js index 5e5cf908355..d0b67f23eff 100644 --- a/message/amd/src/message_drawer_view_conversation_renderer.js +++ b/message/amd/src/message_drawer_view_conversation_renderer.js @@ -1248,6 +1248,39 @@ function( } }; + /** + * Show or hide the mute / unmute option in the header dropdown menu + * and the muted icon in the header title. + * + * @param {Object} header The header container element. + * @param {Object} body The body container element. + * @param {Object} footer The footer container element. + * @param {string} state The state of the conversation as defined by the patcher. + */ + var renderIsMuted = function(header, body, footer, state) { + var muteIcon = header.find(SELECTORS.MUTED_ICON_CONTAINER); + var setMuted = header.find(SELECTORS.ACTION_CONFIRM_MUTE); + var unsetMuted = header.find(SELECTORS.ACTION_CONFIRM_UNMUTE); + + switch (state) { + case 'hide': + muteIcon.addClass('hidden'); + setMuted.addClass('hidden'); + unsetMuted.addClass('hidden'); + break; + case 'show-mute': + muteIcon.addClass('hidden'); + setMuted.removeClass('hidden'); + unsetMuted.addClass('hidden'); + break; + case 'show-unmute': + muteIcon.removeClass('hidden'); + setMuted.addClass('hidden'); + unsetMuted.removeClass('hidden'); + break; + } + }; + /** * Show or hide the add / remove user as contact option in the header dropdown menu. * @@ -1476,6 +1509,7 @@ function( isBlocked: renderIsBlocked, isContact: renderIsContact, isFavourite: renderIsFavourite, + isMuted: renderIsMuted, loadingConfirmAction: renderLoadingConfirmAction, inEditMode: renderInEditMode }, diff --git a/message/amd/src/message_drawer_view_conversation_state_manager.js b/message/amd/src/message_drawer_view_conversation_state_manager.js index 0340b452dba..98ed99eab70 100644 --- a/message/amd/src/message_drawer_view_conversation_state_manager.js +++ b/message/amd/src/message_drawer_view_conversation_state_manager.js @@ -121,6 +121,7 @@ define(['jquery'], function($) { totalMemberCount: null, imageUrl: null, isFavourite: null, + isMuted: null, members: {}, messages: [], hasTriedToLoadMessages: false, @@ -347,6 +348,19 @@ define(['jquery'], function($) { return newState; }; + /** + * Set whether the conversation is a muted conversation. + * + * @param {Object} state Current state. + * @param {bool} isMuted If it's muted. + * @return {Object} New state. + */ + var setIsMuted = function(state, isMuted) { + var newState = cloneState(state); + newState.isMuted = isMuted; + return newState; + }; + /** * Set the total member count. * @@ -659,6 +673,7 @@ define(['jquery'], function($) { setSubname: setSubname, setType: setType, setIsFavourite: setIsFavourite, + setIsMuted: setIsMuted, setTotalMemberCount: setTotalMemberCount, setImageUrl: setImageUrl, setLoadingConfirmAction: setLoadingConfirmAction, diff --git a/message/amd/src/message_drawer_view_overview_section.js b/message/amd/src/message_drawer_view_overview_section.js index 8e39af3f7fe..bf32f2af2fb 100644 --- a/message/amd/src/message_drawer_view_overview_section.js +++ b/message/amd/src/message_drawer_view_overview_section.js @@ -58,6 +58,7 @@ function( BLOCKED_ICON_CONTAINER: '[data-region="contact-icon-blocked"]', LAST_MESSAGE: '[data-region="last-message"]', LAST_MESSAGE_DATE: '[data-region="last-message-date"]', + MUTED_ICON_CONTAINER: '[data-region="muted-icon-container"]', UNREAD_COUNT: '[data-region="unread-count"]', SECTION_TOTAL_COUNT: '[data-region="section-total-count"]', SECTION_TOTAL_COUNT_CONTAINER: '[data-region="section-total-count-container"]', @@ -169,6 +170,7 @@ function( name: conversation.name, subname: conversation.subname, unreadcount: conversation.unreadcount, + ismuted: conversation.ismuted, lastmessagedate: lastMessage ? lastMessage.timecreated : null, sentfromcurrentuser: lastMessage ? lastMessage.useridfrom == userId : null, lastmessage: lastMessage ? $(lastMessage.text).text() || lastMessage.text : null @@ -334,6 +336,24 @@ function( return root.find('[data-user-id="' + userId + '"]'); }; + /** + * Show the conversation is muted icon. + * + * @param {Object} conversationElement The conversation element. + */ + var muteConversation = function(conversationElement) { + conversationElement.find(SELECTORS.MUTED_ICON_CONTAINER).removeClass('hidden'); + }; + + /** + * Hide the conversation is muted icon. + * + * @param {Object} conversationElement The conversation element. + */ + var unmuteConversation = function(conversationElement) { + conversationElement.find(SELECTORS.MUTED_ICON_CONTAINER).addClass('hidden'); + }; + /** * Show the contact is blocked icon. * @@ -515,11 +535,28 @@ function( PubSub.subscribe(MessageDrawerEvents.CONTACT_UNBLOCKED, function(userId) { var conversationElement = getConversationElementFromUserId(root, userId); + if (conversationElement.length) { unblockContact(conversationElement); } }); + PubSub.subscribe(MessageDrawerEvents.CONVERSATION_SET_MUTED, function(conversation) { + var conversationId = conversation.id; + var conversationElement = getConversationElement(root, conversationId); + if (conversationElement.length) { + muteConversation(conversationElement); + } + }); + + PubSub.subscribe(MessageDrawerEvents.CONVERSATION_UNSET_MUTED, function(conversation) { + var conversationId = conversation.id; + var conversationElement = getConversationElement(root, conversationId); + if (conversationElement.length) { + unmuteConversation(conversationElement); + } + }); + PubSub.subscribe(MessageDrawerEvents.CONVERSATION_NEW_LAST_MESSAGE, function(conversation) { if ( (type && conversation.type != type) || diff --git a/message/amd/src/message_repository.js b/message/amd/src/message_repository.js index a7da2f01fae..24b234938d6 100644 --- a/message/amd/src/message_repository.js +++ b/message/amd/src/message_repository.js @@ -905,6 +905,42 @@ define(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notificat return Ajax.call([request])[0]; }; + /** + * Set a list of conversations to set as muted for the given user. + * + * @param {int} userId The user id + * @param {array} conversationIds List of conversation ids to set as favourite + * @return {object} jQuery promise + */ + var setMutedConversations = function(userId, conversationIds) { + var request = { + methodname: 'core_message_mute_conversations', + args: { + userid: userId, + conversationids: conversationIds + } + }; + return Ajax.call([request])[0]; + }; + + /** + * Set a list of conversations to unset as muted for the given user. + * + * @param {int} userId The user id + * @param {array} conversationIds List of conversation ids to unset as favourite + * @return {object} jQuery promise + */ + var unsetMutedConversations = function(userId, conversationIds) { + var request = { + methodname: 'core_message_unmute_conversations', + args: { + userid: userId, + conversationids: conversationIds + } + }; + return Ajax.call([request])[0]; + }; + /** * Get a list of user's member info. * @@ -1060,7 +1096,9 @@ define(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notificat getConversations: getConversations, getConversationMembers: getConversationMembers, setFavouriteConversations: setFavouriteConversations, + setMutedConversations: setMutedConversations, unsetFavouriteConversations: unsetFavouriteConversations, + unsetMutedConversations: unsetMutedConversations, getMemberInfo: getMemberInfo, markAllConversationMessagesAsRead: markAllConversationMessagesAsRead, getUserMessagePreferences: getUserMessagePreferences, diff --git a/message/templates/message_drawer_conversations_list.mustache b/message/templates/message_drawer_conversations_list.mustache index 00ea59ac6c4..df496af7b8c 100644 --- a/message/templates/message_drawer_conversations_list.mustache +++ b/message/templates/message_drawer_conversations_list.mustache @@ -61,6 +61,9 @@ {{#pix}} t/block, core, {{#str}} contactblocked, message {{/str}} {{/pix}} + + {{#pix}} i/muted, core {{/pix}} + {{#subname}}

{{.}}

diff --git a/message/templates/message_drawer_view_conversation_header_content_type_private.mustache b/message/templates/message_drawer_view_conversation_header_content_type_private.mustache index df7b4db61fe..3d748b6150a 100644 --- a/message/templates/message_drawer_view_conversation_header_content_type_private.mustache +++ b/message/templates/message_drawer_view_conversation_header_content_type_private.mustache @@ -60,6 +60,9 @@ {{#pix}} i/star-rating, core {{/pix}} + + {{#pix}} i/muted, core {{/pix}} + {{#showonlinestatus}}

@@ -90,6 +93,12 @@ {{#str}} unblockuser, core_message {{/str}} + + {{#str}} muteconversation, core_message {{/str}} + + + {{#str}} unmuteconversation, core_message {{/str}} + {{#str}} deleteconversation, core_message {{/str}} diff --git a/message/templates/message_drawer_view_conversation_header_content_type_private_no_controls.mustache b/message/templates/message_drawer_view_conversation_header_content_type_private_no_controls.mustache index e2390e5fd05..4422fcd8ee3 100644 --- a/message/templates/message_drawer_view_conversation_header_content_type_private_no_controls.mustache +++ b/message/templates/message_drawer_view_conversation_header_content_type_private_no_controls.mustache @@ -59,6 +59,9 @@ {{#pix}} i/star-rating, core {{/pix}} + + {{#pix}} i/muted, core {{/pix}} + {{#showonlinestatus}}

diff --git a/message/templates/message_drawer_view_conversation_header_content_type_public.mustache b/message/templates/message_drawer_view_conversation_header_content_type_public.mustache index 71a68fa77d1..152a30ded8b 100644 --- a/message/templates/message_drawer_view_conversation_header_content_type_public.mustache +++ b/message/templates/message_drawer_view_conversation_header_content_type_public.mustache @@ -59,6 +59,9 @@ {{#pix}} i/star-rating, core {{/pix}} + + {{#pix}} i/muted, core {{/pix}} +

{{subname}}

@@ -78,6 +81,12 @@ {{#str}} removefromfavourites, core_message {{/str}} + + {{#str}} muteconversation, core_message {{/str}} + + + {{#str}} unmuteconversation, core_message {{/str}} + diff --git a/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_private.mustache b/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_private.mustache index 1b35f9fe9e8..9ede2426dcf 100644 --- a/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_private.mustache +++ b/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_private.mustache @@ -65,6 +65,9 @@ {{#pix}} i/star, core {{/pix}} + + {{#pix}} i/muted, core {{/pix}} + {{#showonlinestatus}}

@@ -105,6 +108,16 @@ {{#str}} unblockuser, core_message {{/str}} +

  • + + {{#str}} muteconversation, core_message {{/str}} + +
  • +
  • + + {{#str}} unmuteconversation, core_message {{/str}} + +
  • {{#str}} deleteconversation, core_message {{/str}} diff --git a/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_private_no_controls.mustache b/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_private_no_controls.mustache index 5fb4fdc9954..2e7ece4c50e 100644 --- a/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_private_no_controls.mustache +++ b/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_private_no_controls.mustache @@ -64,6 +64,9 @@ {{#pix}} i/star, core {{/pix}} + + {{#pix}} i/muted, core {{/pix}} + {{#showonlinestatus}}

    diff --git a/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_public.mustache b/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_public.mustache index e9d8a8e978e..b6613d40f76 100644 --- a/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_public.mustache +++ b/theme/bootstrapbase/templates/core_message/message_drawer_view_conversation_header_content_type_public.mustache @@ -63,6 +63,9 @@ {{#pix}} i/star, core {{/pix}} + + {{#pix}} i/muted, core {{/pix}} +

    {{subname}}

    @@ -78,6 +81,16 @@ {{#str}} groupinfo, core_message {{/str}}
  • +
  • + + {{#str}} muteconversation, core_message {{/str}} + +
  • +
  • + + {{#str}} unmuteconversation, core_message {{/str}} + +
  • {{#str}} addtofavourites, core_message {{/str}} From 5e600f7ce247d8968f27370a774e44afd7831778 Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Fri, 15 Feb 2019 15:42:12 +0800 Subject: [PATCH 8/8] MDL-64773 core_message: do not process muted conversations --- lib/classes/message/manager.php | 15 ++++++++--- lib/tests/messagelib_test.php | 45 +++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/lib/classes/message/manager.php b/lib/classes/message/manager.php index 5440a589584..de307322d75 100644 --- a/lib/classes/message/manager.php +++ b/lib/classes/message/manager.php @@ -84,13 +84,16 @@ class manager { // Get user records for all members of the conversation. // We must fetch distinct users, because it's possible for a user to message themselves via bulk user actions. // In such cases, there will be 2 records referring to the same user. - $sql = "SELECT u.* + $sql = "SELECT u.*, mca.id as ismuted FROM {user} u + LEFT JOIN {message_conversation_actions} mca + ON mca.userid = u.id AND mca.conversationid = ? AND mca.action = ? WHERE u.id IN ( SELECT mcm.userid FROM {message_conversation_members} mcm - WHERE mcm.conversationid = :convid + WHERE mcm.conversationid = ? )"; - $members = $DB->get_records_sql($sql, ['convid' => $eventdata->convid]); + $members = $DB->get_records_sql($sql, [$eventdata->convid, \core_message\api::CONVERSATION_ACTION_MUTED, + $eventdata->convid]); if (empty($members)) { throw new \moodle_exception("Conversation has no members or does not exist."); } @@ -138,7 +141,10 @@ class manager { foreach ($otherusers as $recipient) { // If this message was a legacy (1:1) message, then we use the userto. if ($legacymessage) { + $ismuted = $recipient->ismuted; + $recipient = $eventdata->userto; + $recipient->ismuted = $ismuted; } $usertoisrealuser = (\core_user::is_real_user($recipient->id) != false); @@ -195,8 +201,9 @@ class manager { // Fill in the array of processors to be used based on default and user preferences. // This applies only to individual conversations. Messages to group conversations ignore processors. + // Do not process muted conversations. $processorlist = []; - if ($conv->type == \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL) { + if ($conv->type == \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL && !$recipient->ismuted) { foreach ($processors as $processor) { // Skip adding processors for internal user, if processor doesn't support sending message to internal user. if (!$usertoisrealuser && !$processor->object->can_send_to_any_users()) { diff --git a/lib/tests/messagelib_test.php b/lib/tests/messagelib_test.php index 01ec3fbe93d..489a4852978 100644 --- a/lib/tests/messagelib_test.php +++ b/lib/tests/messagelib_test.php @@ -1118,6 +1118,51 @@ class core_messagelib_testcase extends advanced_testcase { $this->assertTrue($storedfileexists); } + public function test_send_message_when_muted() { + $this->preventResetByRollback(); + $this->resetAfterTest(); + + $userfrom = $this->getDataGenerator()->create_user(); + $userto = $this->getDataGenerator()->create_user(); + + // Create a conversation between the users. + $conversation = \core_message\api::create_conversation( + \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL, + [ + $userfrom->id, + $userto->id + ] + ); + + $message = new \core\message\message(); + $message->courseid = 1; + $message->component = 'moodle'; + $message->name = 'instantmessage'; + $message->userfrom = $userfrom; + $message->convid = $conversation->id; + $message->subject = 'message subject 1'; + $message->fullmessage = 'message body'; + $message->fullmessageformat = FORMAT_MARKDOWN; + $message->fullmessagehtml = '

    message body

    '; + $message->smallmessage = 'small message'; + $message->notification = '0'; + + $sink = $this->redirectEmails(); + message_send($message); + $emails = $sink->get_messages(); + $this->assertCount(1, $emails); + $sink->clear(); + + // Mute the conversation. + \core_message\api::mute_conversation($userto->id, $conversation->id); + + $sink = $this->redirectEmails(); + message_send($message); + $emails = $sink->get_messages(); + $this->assertCount(0, $emails); + $sink->clear(); + } + /** * Is a particular message type in the list of message types. * @param string $component