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 f842b85a2f2..500638c6b18 100644 --- a/message/externallib.php +++ b/message/externallib.php @@ -3918,6 +3918,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( @@ -4067,6 +4069,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; } @@ -4082,6 +4085,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 53487a737b4..16196d0925e 100644 --- a/message/lib.php +++ b/message/lib.php @@ -851,31 +851,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); @@ -941,7 +932,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 @@ }}