From 08ae9a7362aef284a355c42d1956d0fecaf750b7 Mon Sep 17 00:00:00 2001 From: Ryan Wyllie Date: Mon, 19 Nov 2018 14:30:23 +0800 Subject: [PATCH] MDL-64054 message: add all processors to message settings Changed the settings page in the message drawer to display all message notification processors (e.g. email, mobile, jabber) for the user to configure based on which processors are enabled on the site. --- lib/db/services.php | 1 + .../build/message_drawer_view_settings.min.js | 2 +- message/amd/build/message_repository.min.js | 2 +- .../amd/src/message_drawer_view_settings.js | 257 +++++++++++++----- message/amd/src/message_repository.js | 19 +- message/externallib.php | 4 + message/lib.php | 16 +- ...message_drawer_view_settings_body.mustache | 61 +---- ...drawer_view_settings_body_content.mustache | 75 +++++ ..._content_notification_preferences.mustache | 49 ++++ ...er_view_settings_body_placeholder.mustache | 72 +++++ 11 files changed, 418 insertions(+), 140 deletions(-) create mode 100644 message/templates/message_drawer_view_settings_body_content.mustache create mode 100644 message/templates/message_drawer_view_settings_body_content_notification_preferences.mustache create mode 100644 message/templates/message_drawer_view_settings_body_placeholder.mustache diff --git a/lib/db/services.php b/lib/db/services.php index 9f7392362d9..a9cef8a07f8 100644 --- a/lib/db/services.php +++ b/lib/db/services.php @@ -1278,6 +1278,7 @@ $functions = array( 'type' => 'read', 'capabilities' => 'moodle/user:editownmessageprofile', 'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE), + 'ajax' => true ), 'core_message_set_favourite_conversations' => array( 'classname' => 'core_message_external', diff --git a/message/amd/build/message_drawer_view_settings.min.js b/message/amd/build/message_drawer_view_settings.min.js index 7afce0cc70b..5fbcdb9032c 100644 --- a/message/amd/build/message_drawer_view_settings.min.js +++ b/message/amd/build/message_drawer_view_settings.min.js @@ -1 +1 @@ -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}}); \ No newline at end of file +define(["jquery","core/notification","core/str","core/pubsub","core/templates","core_message/message_repository","core/custom_interaction_events","core_message/message_drawer_events"],function(a,b,c,d,e,f,g,h){var i={CHECKBOX:'input[type="checkbox"]',SETTINGS:'[data-region="settings"]',PRIVACY_PREFERENCE:'[data-preference="blocknoncontacts"] input[type="radio"]',NOTIFICATIONS_PREFERENCE:'[data-preference="notifications"] input[type="checkbox"]',ENTER_TO_SEND_PREFERENCE:'[data-preference="entertosend"] input[type="checkbox"]',NOTIFICATION_PREFERENCES_CONTAINER:'[data-region="notification-preference-container"]',CONTENT_CONTAINER:'[data-region="content-container"]',PLACEHOLDER_CONTAINER:'[data-region="placeholder-container"]'},j={NOTIFICATION_PREFERENCES:"core_message/message_drawer_view_settings_body_content_notification_preferences"},k="message_provider_moodle_instantmessage",l=function(b,c){var d=b.find(i.PRIVACY_PREFERENCE);d.each(function(b,d){d=a(d),d.val()==c?d.prop("checked",!0):d.prop("checked",!1)})},m=function(a,b){var c=a.find(i.ENTER_TO_SEND_PREFERENCE);b?c.prop("checked",!0):c.prop("checked",!1)},n=function(a,c){return f.savePreferences(a,c).then(function(){d.publish(h.PREFERENCES_UPDATED,c)})["catch"](b.exception)},o=function(b,c){var d=b.find(i.SETTINGS);g.define(d,[g.events.activate]),d.on(g.events.activate,i.NOTIFICATIONS_PREFERENCE,function(b){var d=a(b.target).closest(i.NOTIFICATION_PREFERENCES_CONTAINER),e=d.find(i.CHECKBOX);if(e.length){var f=e.toArray().reduce(function(b,c){return c=a(c),c.prop("checked")&&b.push(c.attr("data-name")),b},[]),g=f.length?f.join(","):"none",h=[{type:"message_provider_moodle_instantmessage_loggedoff",value:g},{type:"message_provider_moodle_instantmessage_loggedin",value:g}];n(c,h)}}),d.on(g.events.activate,i.PRIVACY_PREFERENCE,function(b){var d=a(b.target).val(),e=[{type:"message_blocknoncontacts",value:d}];n(c,e)}),d.on(g.events.activate,i.ENTER_TO_SEND_PREFERENCE,function(b){var d=a(b.target).prop("checked"),e=[{type:"message_entertosend",value:d}];n(c,e)})},p=function(a,c){f.getUserMessagePreferences(c).then(function(b){l(a,b.blocknoncontacts),m(a,b.entertosend);var c=[];b.preferences.components.length&&b.preferences.components.forEach(function(a){if(a.notifications.length){var b=a.notifications.filter(function(a){return a.preferencekey==k});if(b.length){var d=a.notifications[0];c=d.processors.map(function(a){var b=a.loggedin.checked||a.loggedoff.checked;return{displayname:a.displayname,name:a.name,checked:b,locked:a.locked,lockedmessage:a.lockedmessage||null}})}}});var d=a.find(i.NOTIFICATION_PREFERENCES_CONTAINER);return!c.length||(d.removeClass("hidden"),e.render(j.NOTIFICATION_PREFERENCES,{processors:c}).then(function(a){return d.append(a),a}))}).then(function(){a.find(i.CONTENT_CONTAINER).removeClass("hidden"),a.find(i.PLACEHOLDER_CONTAINER).addClass("hidden"),o(a,c)})["catch"](b.exception)},q=function(b,c,d){return c.attr("data-init")||(p(c,d),c.attr("data-init",!0)),a.Deferred().resolve().promise()},r=function(){return c.get_string("messagedrawerviewsettings","core_message")};return{show:q,description:r}}); \ 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 4e55810c9a1..cdc2fa7ee06 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_data_for_messagearea_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(a,c){return b.call(c.map(function(b){return{methodname:"core_message_delete_message",args:{messageid:b,userid:a}}}))},x=function(a,c){var d={methodname:"core_message_delete_conversation",args:{userid:a,otheruserid: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]};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,deleteCoversation:x,getContactRequests:y,acceptContactRequest:z,declineContactRequest:A,getConversation:B,getConversationBetweenUsers:C,getConversations:D,getConversationMembers:E,setFavouriteConversations:F,unsetFavouriteConversations:G,getMemberInfo:H,markAllConversationMessagesAsRead:I}}); \ 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_data_for_messagearea_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(a,c){return b.call(c.map(function(b){return{methodname:"core_message_delete_message",args:{messageid:b,userid:a}}}))},x=function(a,c){var d={methodname:"core_message_delete_conversation",args:{userid:a,otheruserid: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]};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,deleteCoversation: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}}); \ No newline at end of file diff --git a/message/amd/src/message_drawer_view_settings.js b/message/amd/src/message_drawer_view_settings.js index cd7eda6eed6..8146bbd3696 100644 --- a/message/amd/src/message_drawer_view_settings.js +++ b/message/amd/src/message_drawer_view_settings.js @@ -26,6 +26,7 @@ define( 'core/notification', 'core/str', 'core/pubsub', + 'core/templates', 'core_message/message_repository', 'core/custom_interaction_events', 'core_message/message_drawer_events' @@ -35,32 +36,81 @@ function( Notification, Str, PubSub, + Templates, Repository, CustomEvents, MessageDrawerEvents ) { var SELECTORS = { + CHECKBOX: 'input[type="checkbox"]', 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"]', + NOTIFICATIONS_PREFERENCE: '[data-preference="notifications"] input[type="checkbox"]', ENTER_TO_SEND_PREFERENCE: '[data-preference="entertosend"] input[type="checkbox"]', + NOTIFICATION_PREFERENCES_CONTAINER: '[data-region="notification-preference-container"]', + CONTENT_CONTAINER: '[data-region="content-container"]', + PLACEHOLDER_CONTAINER: '[data-region="placeholder-container"]' }; - var PREFERENCES_EMAIL = { - 'message_provider_moodle_instantmessage_loggedoff': { - type: 'emailnotifications', - enabled: 'email', - disabled: 'none' - }, - 'message_provider_moodle_instantmessage_loggedin': { - type: 'emailnotifications', - enabled: 'email', - disabled: 'none' + var TEMPLATES = { + NOTIFICATION_PREFERENCES: 'core_message/message_drawer_view_settings_body_content_notification_preferences' + }; + + var NOTIFICATION_PREFERENCES_KEY = 'message_provider_moodle_instantmessage'; + + /** + * Select the correct radio button in the DOM for the privacy preference. + * + * @param {Object} body The settings body element. + * @param {Number} value Which radio button should be set + */ + var setPrivacyPreference = function(body, value) { + var inputs = body.find(SELECTORS.PRIVACY_PREFERENCE); + inputs.each(function(index, input) { + input = $(input); + if (input.val() == value) { + input.prop('checked', true); + } else { + input.prop('checked', false); + } + }); + }; + + /** + * Set the "enter to send" checkbox to the correct value in the DOM. + * + * @param {Object} body The settings body element. + * @param {Bool} value Whether enter to send is enabled or disabled. + */ + var setEnterToSend = function(body, value) { + var checkbox = body.find(SELECTORS.ENTER_TO_SEND_PREFERENCE); + + if (value) { + checkbox.prop('checked', true); + } else { + checkbox.prop('checked', false); } }; + /** + * Send a request to the server to save the given preferences. Also publish + * a preferences updated event for the rest of the message drawer to + * subscribe to. + * + * @param {Number} loggedInUserId The logged in user id. + * @param {Array} preferences The preferences to set. + * @return {Object} jQuery promise + */ + var savePreferences = function(loggedInUserId, preferences) { + return Repository.savePreferences(loggedInUserId, preferences) + .then(function() { + PubSub.publish(MessageDrawerEvents.PREFERENCES_UPDATED, preferences); + return; + }) + .catch(Notification.exception); + }; + /** * Create all of the event listeners for the message preferences page. * @@ -75,68 +125,139 @@ function( CustomEvents.events.activate ]); - settingsContainer.on(CustomEvents.events.activate, SELECTORS.EMAIL_ENABLED_PREFERENCE, function(e) { - var checkbox = $(e.target); - var setting = checkbox.closest(SELECTORS.PREFERENCE_CONTROL); - var type = setting.attr('data-preference'); - var isEnabled = checkbox.prop('checked'); - var preferences = Object.keys(PREFERENCES_EMAIL).reduce(function(carry, preference) { - var config = PREFERENCES_EMAIL[preference]; - - if (config.type === type) { - carry.push({ - type: preference, - value: isEnabled ? config.enabled : config.disabled - }); - } - - return carry; - }, []); - - Repository.savePreferences(loggedInUserId, preferences) - .then(function() { - PubSub.publish(MessageDrawerEvents.PREFERENCES_UPDATED, preferences); - return; - }) - .catch(Notification.exception); + settingsContainer.on(CustomEvents.events.activate, SELECTORS.NOTIFICATIONS_PREFERENCE, function(e) { + var container = $(e.target).closest(SELECTORS.NOTIFICATION_PREFERENCES_CONTAINER); + var checkboxes = container.find(SELECTORS.CHECKBOX); + if (!checkboxes.length) { + return; } - ); + // The preference value is all of the enabled processors, comma separated, so let's + // see which ones are enabled. + var values = checkboxes.toArray().reduce(function(carry, checkbox) { + checkbox = $(checkbox); + if (checkbox.prop('checked')) { + carry.push(checkbox.attr('data-name')); + } + + return carry; + }, []); + var newValue = values.length ? values.join(',') : 'none'; + var preferences = [ + { + type: 'message_provider_moodle_instantmessage_loggedoff', + value: newValue + }, + { + type: 'message_provider_moodle_instantmessage_loggedin', + value: newValue + } + ]; + + savePreferences(loggedInUserId, preferences); + }); settingsContainer.on(CustomEvents.events.activate, SELECTORS.PRIVACY_PREFERENCE, function(e) { - var newValue = $(e.target).val(); - var preferences = [ - { - type: 'message_blocknoncontacts', - value: newValue - } - ]; + var newValue = $(e.target).val(); + var preferences = [ + { + type: 'message_blocknoncontacts', + value: newValue + } + ]; - Repository.savePreferences(loggedInUserId, preferences) - .then(function() { - PubSub.publish(MessageDrawerEvents.PREFERENCES_UPDATED, preferences); - return; - }) - .catch(Notification.exception); - } - ); + savePreferences(loggedInUserId, preferences); + }); 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 - } - ]; + 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); - } - ); + savePreferences(loggedInUserId, preferences); + }); + }; + + /** + * Initialise the module by loading the user's messaging preferences from the server and + * rendering them in the settings page. + * + * Moodle may have many (or no) message processors enabled to notify the user when they + * receive messages. We need to dynamically build the settings page based on which processors + * are configured for the user. + * + * @param {Object} body The settings body element. + * @param {Number} loggedInUserId The logged in user id. + */ + var init = function(body, loggedInUserId) { + // Load the message preferences from the server. + Repository.getUserMessagePreferences(loggedInUserId) + .then(function(response) { + // Set the values of the stright forward preferences. + setPrivacyPreference(body, response.blocknoncontacts); + setEnterToSend(body, response.entertosend); + + // Parse the list of other preferences into a more usable format. + var notificationProcessors = []; + if (response.preferences.components.length) { + response.preferences.components.forEach(function(component) { + if (component.notifications.length) { + // Filter down to just the notification processors that work on instant + // messaging. We don't care about another other ones. + var notificationPreferences = component.notifications.filter(function(notification) { + return notification.preferencekey == NOTIFICATION_PREFERENCES_KEY; + }); + + if (notificationPreferences.length) { + // Messaging only has one config at the moment which is for notifications + // on personal messages. + var configuration = component.notifications[0]; + notificationProcessors = configuration.processors.map(function(processor) { + // Consider the the processor enabled if either preference is set. This is + // for backwards compatibility. Going forward they will be treated as one + // setting. + var checked = processor.loggedin.checked || processor.loggedoff.checked; + return { + displayname: processor.displayname, + name: processor.name, + checked: checked, + // The admin can force processors to be enabled at a site level so + // we need to check if this processor has been locked by the admin. + locked: processor.locked, + lockedmessage: processor.lockedmessage || null, + }; + }); + } + } + }); + } + + var container = body.find(SELECTORS.NOTIFICATION_PREFERENCES_CONTAINER); + if (notificationProcessors.length) { + // We have processors (i.e. email, mobile, jabber) to show. + container.removeClass('hidden'); + // Render the processor options. + return Templates.render(TEMPLATES.NOTIFICATION_PREFERENCES, {processors: notificationProcessors}) + .then(function(html) { + container.append(html); + return html; + }); + } else { + return true; + } + }) + .then(function() { + // We're done loading so hide the loading placeholder and show the settings. + body.find(SELECTORS.CONTENT_CONTAINER).removeClass('hidden'); + body.find(SELECTORS.PLACEHOLDER_CONTAINER).addClass('hidden'); + // Register the event listers for if the user wants to change the preferences. + registerEventListeners(body, loggedInUserId); + return; + }) + .catch(Notification.exception); }; /** @@ -150,7 +271,7 @@ function( */ var show = function(header, body, loggedInUserId) { if (!body.attr('data-init')) { - registerEventListeners(body, loggedInUserId); + init(body, loggedInUserId); body.attr('data-init', true); } diff --git a/message/amd/src/message_repository.js b/message/amd/src/message_repository.js index 8fa57e83885..507e1ec376d 100644 --- a/message/amd/src/message_repository.js +++ b/message/amd/src/message_repository.js @@ -954,6 +954,22 @@ define(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notificat return Ajax.call([request])[0]; }; + /** + * Get the user's message preferences. + * + * @param {int} userId The user id to load preferences for + * @return {object} jQuery promise + */ + var getUserMessagePreferences = function(userId) { + var request = { + methodname: 'core_message_get_user_message_preferences', + args: { + userid: userId + } + }; + return Ajax.call([request])[0]; + }; + return { query: query, countUnreadConversations: countUnreadConversations, @@ -985,6 +1001,7 @@ define(['jquery', 'core/ajax', 'core/notification'], function($, Ajax, Notificat setFavouriteConversations: setFavouriteConversations, unsetFavouriteConversations: unsetFavouriteConversations, getMemberInfo: getMemberInfo, - markAllConversationMessagesAsRead: markAllConversationMessagesAsRead + markAllConversationMessagesAsRead: markAllConversationMessagesAsRead, + getUserMessagePreferences: getUserMessagePreferences }; }); diff --git a/message/externallib.php b/message/externallib.php index cccdf07cbfb..2a4528473d9 100644 --- a/message/externallib.php +++ b/message/externallib.php @@ -3917,6 +3917,8 @@ class core_message_external extends external_api { 'displayname' => new external_value(PARAM_TEXT, 'Display name'), 'name' => new external_value(PARAM_PLUGIN, 'Processor name'), 'locked' => new external_value(PARAM_BOOL, 'Is locked by admin?'), + 'lockedmessage' => new external_value(PARAM_TEXT, + 'Text to display if locked', VALUE_OPTIONAL), 'userconfigured' => new external_value(PARAM_INT, 'Is configured?'), 'loggedin' => new external_single_structure( array( @@ -4066,6 +4068,7 @@ class core_message_external extends external_api { 'warnings' => array(), 'preferences' => $notificationlistoutput->export_for_template($renderer), 'blocknoncontacts' => \core_message\api::get_user_privacy_messaging_preference($user->id), + 'entertosend' => get_user_preferences('message_entertosend', false, $user) ); return $result; } @@ -4081,6 +4084,7 @@ class core_message_external extends external_api { array( 'preferences' => self::get_preferences_structure(), 'blocknoncontacts' => new external_value(PARAM_INT, 'Privacy messaging setting to define who can message you'), + 'entertosend' => new external_value(PARAM_BOOL, 'User preference for using enter to send messages'), 'warnings' => new external_warnings(), ) ); diff --git a/message/lib.php b/message/lib.php index eb0dffbbd21..93379f56e34 100644 --- a/message/lib.php +++ b/message/lib.php @@ -837,31 +837,22 @@ function core_message_standard_after_main_region_html() { $requestcount = \core_message\api::count_received_contact_requests($USER); $contactscount = \core_message\api::count_contacts($USER->id); - // Get the privacy settings options for being messaged. - $privacysetting = \core_message\api::get_user_privacy_messaging_preference($USER->id); $choices = []; $choices[] = [ 'value' => \core_message\api::MESSAGE_PRIVACY_ONLYCONTACTS, - 'text' => get_string('contactableprivacy_onlycontacts', 'message'), - 'checked' => ($privacysetting == \core_message\api::MESSAGE_PRIVACY_ONLYCONTACTS) + 'text' => get_string('contactableprivacy_onlycontacts', 'message') ]; $choices[] = [ 'value' => \core_message\api::MESSAGE_PRIVACY_COURSEMEMBER, - 'text' => get_string('contactableprivacy_coursemember', 'message'), - 'checked' => ($privacysetting == \core_message\api::MESSAGE_PRIVACY_COURSEMEMBER) + 'text' => get_string('contactableprivacy_coursemember', 'message') ]; if (!empty($CFG->messagingallusers)) { // Add the MESSAGE_PRIVACY_SITE option when site-wide messaging between users is enabled. $choices[] = [ 'value' => \core_message\api::MESSAGE_PRIVACY_SITE, - 'text' => get_string('contactableprivacy_site', 'message'), - 'checked' => ($privacysetting == \core_message\api::MESSAGE_PRIVACY_SITE) + 'text' => get_string('contactableprivacy_site', 'message') ]; } - // Email settings. - $emailloggedin = get_user_preferences('message_provider_moodle_instantmessage_loggedin', 'none', $USER); - $emailloggedoff = get_user_preferences('message_provider_moodle_instantmessage_loggedoff', 'none', $USER); - $emailenabled = $emailloggedin == 'email' || $emailloggedoff == 'email'; // Enter to send. $entertosend = get_user_preferences('message_entertosend', false, $USER); @@ -908,7 +899,6 @@ function core_message_standard_after_main_region_html() { ], 'settings' => [ 'privacy' => $choices, - 'emailenabled' => $emailenabled, 'entertosend' => $entertosend ] ]); diff --git a/message/templates/message_drawer_view_settings_body.mustache b/message/templates/message_drawer_view_settings_body.mustache index 92443cf7216..cc119928a08 100644 --- a/message/templates/message_drawer_view_settings_body.mustache +++ b/message/templates/message_drawer_view_settings_body.mustache @@ -35,61 +35,10 @@ }}