MDL-63303 message: add enter to send user preference

This commit is contained in:
Ryan Wyllie 2018-11-08 15:26:21 +08:00
parent f074d6f086
commit 8c8939c1ae
12 changed files with 93 additions and 10 deletions

View File

@ -233,6 +233,7 @@ $string['unknownuser'] = 'Unknown user';
$string['unreadnotification'] = 'Unread notification: {$a}';
$string['unreadnewgroupconversationmessage'] = 'New message from {$a->name} in {$a->conversationname}';
$string['unreadnewmessage'] = 'New message from {$a}';
$string['useentertosend'] = 'Use enter to send';
$string['usercantbemessaged'] = 'You can\'t message {$a} due to their message preferences. Try adding them as a contact.';
$string['userisblockingyou'] = 'This user has blocked you from sending messages to them';
$string['userisblockingyounoncontact'] = '{$a} only accepts messages from their contacts.';

View File

@ -1 +1 @@
define([],function(){return{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",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"}});
define([],function(){return{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"}});

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
define(["jquery","core/notification","core/str","core_message/message_repository","core/custom_interaction_events"],function(a,b,c,d,e){var f={SETTINGS:'[data-region="settings"]',PREFERENCE_CONTROL:'[data-region="preference-control"]',PRIVACY_PREFERENCE:'[data-preference="blocknoncontacts"] input[type="radio"]',EMAIL_ENABLED_PREFERENCE:'[data-preference="emailnotifications"] input[type="checkbox"]'},g={message_provider_moodle_instantmessage_loggedoff:{type:"emailnotifications",enabled:"email",disabled:"none"},message_provider_moodle_instantmessage_loggedin:{type:"emailnotifications",enabled:"email",disabled:"none"}},h=function(c,h){var i=c.find(f.SETTINGS);e.define(i,[e.events.activate]),i.on(e.events.activate,f.EMAIL_ENABLED_PREFERENCE,function(c){var e=a(c.target),i=e.closest(f.PREFERENCE_CONTROL),j=i.attr("data-preference"),k=e.prop("checked"),l=Object.keys(g).reduce(function(a,b){var c=g[b];return c.type===j&&a.push({type:b,value:k?c.enabled:c.disabled}),a},[]);d.savePreferences(h,l)["catch"](b.exception)}),i.on(e.events.activate,f.PRIVACY_PREFERENCE,function(c){var e=a(c.target).val(),f=[{type:"message_blocknoncontacts",value:e}];d.savePreferences(h,f)["catch"](b.exception)})},i=function(b,c,d){return c.attr("data-init")||(h(c,d),c.attr("data-init",!0)),a.Deferred().resolve().promise()},j=function(){return c.get_string("messagedrawerviewsettings","core_message")};return{show:i,description:j}});
define(["jquery","core/notification","core/str","core/pubsub","core_message/message_repository","core/custom_interaction_events","core_message/message_drawer_events"],function(a,b,c,d,e,f,g){var h={SETTINGS:'[data-region="settings"]',PREFERENCE_CONTROL:'[data-region="preference-control"]',PRIVACY_PREFERENCE:'[data-preference="blocknoncontacts"] input[type="radio"]',EMAIL_ENABLED_PREFERENCE:'[data-preference="emailnotifications"] input[type="checkbox"]',ENTER_TO_SEND_PREFERENCE:'[data-preference="entertosend"] input[type="checkbox"]'},i={message_provider_moodle_instantmessage_loggedoff:{type:"emailnotifications",enabled:"email",disabled:"none"},message_provider_moodle_instantmessage_loggedin:{type:"emailnotifications",enabled:"email",disabled:"none"}},j=function(c,j){var k=c.find(h.SETTINGS);f.define(k,[f.events.activate]),k.on(f.events.activate,h.EMAIL_ENABLED_PREFERENCE,function(c){var f=a(c.target),k=f.closest(h.PREFERENCE_CONTROL),l=k.attr("data-preference"),m=f.prop("checked"),n=Object.keys(i).reduce(function(a,b){var c=i[b];return c.type===l&&a.push({type:b,value:m?c.enabled:c.disabled}),a},[]);e.savePreferences(j,n).then(function(){d.publish(g.PREFERENCES_UPDATED,n)})["catch"](b.exception)}),k.on(f.events.activate,h.PRIVACY_PREFERENCE,function(c){var f=a(c.target).val(),h=[{type:"message_blocknoncontacts",value:f}];e.savePreferences(j,h).then(function(){d.publish(g.PREFERENCES_UPDATED,h)})["catch"](b.exception)}),k.on(f.events.activate,h.ENTER_TO_SEND_PREFERENCE,function(c){var f=a(c.target).prop("checked"),h=[{type:"message_entertosend",value:f}];e.savePreferences(j,h).then(function(){d.publish(g.PREFERENCES_UPDATED,h)})["catch"](b.exception)})},k=function(b,c,d){return c.attr("data-init")||(j(c,d),c.attr("data-init",!0)),a.Deferred().resolve().promise()},l=function(){return c.get_string("messagedrawerviewsettings","core_message")};return{show:k,description:l}});

View File

@ -35,6 +35,7 @@ define([], function() {
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',

View File

@ -1225,7 +1225,8 @@ function(
CustomEvents.events.activate
]);
CustomEvents.define(footer, [
CustomEvents.events.activate
CustomEvents.events.activate,
CustomEvents.events.enter
]);
CustomEvents.define(messagesContainer, [
CustomEvents.events.scrollTop,
@ -1273,6 +1274,13 @@ function(
footer.on(CustomEvents.events.activate, selector, handlerFunction);
});
footer.on(CustomEvents.events.enter, SELECTORS.MESSAGE_TEXT_AREA, function(e, data) {
var enterToSend = footer.attr('data-enter-to-send');
if (enterToSend == true) {
handleSendMessage(e, data);
}
});
PubSub.subscribe(MessageDrawerEvents.ROUTE_CHANGED, function(newRouteData) {
if (newMessagesPollTimer) {
if (newRouteData.route == MessageDrawerRoutes.VIEW_CONVERSATION) {
@ -1282,6 +1290,17 @@ function(
}
}
});
PubSub.subscribe(MessageDrawerEvents.PREFERENCES_UPDATED, function(preferences) {
var filteredPreferences = preferences.filter(function(preference) {
return preference.type == 'message_entertosend';
});
var enterToSendPreference = filteredPreferences.length ? filteredPreferences[0] : null;
if (enterToSendPreference) {
footer.attr('data-enter-to-send', enterToSendPreference.value);
}
});
};
/**

View File

@ -25,22 +25,27 @@ define(
'jquery',
'core/notification',
'core/str',
'core/pubsub',
'core_message/message_repository',
'core/custom_interaction_events',
'core_message/message_drawer_events'
],
function(
$,
Notification,
Str,
PubSub,
Repository,
CustomEvents
CustomEvents,
MessageDrawerEvents
) {
var SELECTORS = {
SETTINGS: '[data-region="settings"]',
PREFERENCE_CONTROL: '[data-region="preference-control"]',
PRIVACY_PREFERENCE: '[data-preference="blocknoncontacts"] input[type="radio"]',
EMAIL_ENABLED_PREFERENCE: '[data-preference="emailnotifications"] input[type="checkbox"]'
EMAIL_ENABLED_PREFERENCE: '[data-preference="emailnotifications"] input[type="checkbox"]',
ENTER_TO_SEND_PREFERENCE: '[data-preference="entertosend"] input[type="checkbox"]',
};
var PREFERENCES_EMAIL = {
@ -89,6 +94,10 @@ function(
}, []);
Repository.savePreferences(loggedInUserId, preferences)
.then(function() {
PubSub.publish(MessageDrawerEvents.PREFERENCES_UPDATED, preferences);
return;
})
.catch(Notification.exception);
}
);
@ -103,6 +112,28 @@ function(
];
Repository.savePreferences(loggedInUserId, preferences)
.then(function() {
PubSub.publish(MessageDrawerEvents.PREFERENCES_UPDATED, preferences);
return;
})
.catch(Notification.exception);
}
);
settingsContainer.on(CustomEvents.events.activate, SELECTORS.ENTER_TO_SEND_PREFERENCE, function(e) {
var newValue = $(e.target).prop('checked');
var preferences = [
{
type: 'message_entertosend',
value: newValue
}
];
Repository.savePreferences(loggedInUserId, preferences)
.then(function() {
PubSub.publish(MessageDrawerEvents.PREFERENCES_UPDATED, preferences);
return;
})
.catch(Notification.exception);
}
);

View File

@ -158,7 +158,11 @@ class provider implements
public static function export_user_preferences(int $userid) {
$preferences = get_user_preferences(null, null, $userid);
foreach ($preferences as $name => $value) {
if ((substr($name, 0, 16) == 'message_provider') || ($name == 'message_blocknoncontacts')) {
if (
(substr($name, 0, 16) == 'message_provider') ||
($name == 'message_blocknoncontacts') ||
($name == 'message_entertosend')
) {
writer::export_user_preference(
'core_message',
$name,

View File

@ -736,6 +736,11 @@ function core_message_user_preferences() {
return $value;
}
);
$preferences['message_entertosend'] = array(
'type' => PARAM_BOOL,
'null' => NULL_NOT_ALLOWED,
'default' => false
);
$preferences['/^message_provider_([\w\d_]*)_logged(in|off)$/'] = array('isregex' => true, 'type' => PARAM_NOTAGS,
'null' => NULL_NOT_ALLOWED, 'default' => 'none',
'permissioncallback' => function ($user, $preferencename) {
@ -859,6 +864,9 @@ function core_message_before_standard_top_of_body_html() {
$emailloggedoff = get_user_preferences('message_provider_moodle_instantmessage_loggedoff', 'none', $USER->id);
$emailenabled = $emailloggedin == 'email' && $emailloggedoff == 'email';
// Enter to send.
$entertosend = get_user_preferences('message_entertosend', false, $USER->id);
return $renderer->render_from_template('core_message/message_drawer', [
'contactrequestcount' => $requestcount,
'loggedinuser' => [
@ -898,7 +906,8 @@ function core_message_before_standard_top_of_body_html() {
],
'settings' => [
'privacy' => $choices,
'emailenabled' => $emailenabled
'emailenabled' => $emailenabled,
'entertosend' => $entertosend
]
]);
}

View File

@ -39,6 +39,7 @@
class="hidden border-top bg-white position-relative"
aria-hidden="true"
data-region="view-conversation"
data-enter-to-send="{{settings.entertosend}}"
>
<div class="hidden p-2" data-region="content-messages-footer-container">
{{> core_message/message_drawer_view_conversation_footer_content }}

View File

@ -60,7 +60,7 @@
</div>
{{/privacy}}
</div>
<h3 class="mb-2 mt-5 h6 font-weight-bold">{{#str}}categoryemail, admin{{/str}}</h3>
<h3 class="mb-2 mt-4 h6 font-weight-bold">{{#str}}categoryemail, admin{{/str}}</h3>
<div
data-region="preference-control"
data-preference="emailnotifications"
@ -75,6 +75,21 @@
</label>
</span>
</div>
<h3 class="mb-2 mt-4 h6 font-weight-bold">{{#str}} general, core {{/str}}</h3>
<div
data-region="preference-control"
data-preference="entertosend"
>
<span class="switch">
<input type="checkbox"
id="enter-to-send-{{uniqid}}"
{{#entertosend}}checked{{/entertosend}}
>
<label for="enter-to-send-{{uniqid}}">
{{#str}} useentertosend, core_message {{/str}}
</label>
</span>
</div>
</div>
{{/settings}}
</div>

View File

@ -161,6 +161,7 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
set_user_preference('message_provider_moodle_instantmessage_loggedin', 'airnotifier', $USER->id);
set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'popup', $USER->id);
set_user_preference('message_blocknoncontacts', \core_message\api::MESSAGE_PRIVACY_ONLYCONTACTS, $USER->id);
set_user_preference('message_entertosend', true, $USER->id);
set_user_preference('message_provider_moodle_instantmessage_loggedoff', 'inbound', $user->id);
// Set an unrelated preference.
@ -175,10 +176,11 @@ class core_message_privacy_provider_testcase extends \core_privacy\tests\provide
$prefs = (array) $writer->get_user_preferences('core_message');
// Check only 3 preferences exist.
$this->assertCount(3, $prefs);
$this->assertCount(4, $prefs);
$this->assertArrayHasKey('message_provider_moodle_instantmessage_loggedin', $prefs);
$this->assertArrayHasKey('message_provider_moodle_instantmessage_loggedoff', $prefs);
$this->assertArrayHasKey('message_blocknoncontacts', $prefs);
$this->assertArrayHasKey('message_entertosend', $prefs);
foreach ($prefs as $key => $pref) {
if ($key == 'message_provider_moodle_instantmessage_loggedin') {