diff --git a/message/amd/build/message_area.min.js b/message/amd/build/message_area.min.js deleted file mode 100644 index 288f2dfcd32..00000000000 --- a/message/amd/build/message_area.min.js +++ /dev/null @@ -1 +0,0 @@ -define(["jquery","core_message/message_area_contacts","core_message/message_area_messages","core_message/message_area_profile","core_message/message_area_tabs","core_message/message_area_search"],function(a,b,c,d,e,f){function g(b,c,d,e){this.node=a(b),this.pollmin=c,this.pollmax=d,this.polltimeout=e,this._init()}return g.prototype.node=null,g.prototype.pollmin=null,g.prototype.pollmax=null,g.prototype.polltimeout=null,g.prototype._init=function(){new b(this),new c(this),new d(this),new e(this),new f(this)},g.prototype.onDelegateEvent=function(a,b,c){this.node.on(a,b,c)},g.prototype.onCustomEvent=function(a,b){this.node.on(a,b)},g.prototype.trigger=function(a,b){"undefined"==typeof b&&(b=""),this.node.trigger(a,b)},g.prototype.find=function(a){return this.node.find(a)},g.prototype.getCurrentUserId=function(){return this.node.data("userid")},g.prototype.showContactsFirst=function(){return!!this.node.data("displaycontacts")},g}); \ No newline at end of file diff --git a/message/amd/build/message_area_actions.min.js b/message/amd/build/message_area_actions.min.js deleted file mode 100644 index 2a0fd288ddd..00000000000 --- a/message/amd/build/message_area_actions.min.js +++ /dev/null @@ -1 +0,0 @@ -define(["core_message/message_area_events"],function(a){function b(a){this.messageArea=a}var c={MESSAGES:"[data-region='messages']"};return b.prototype.messageArea=null,b.prototype.chooseMessagesToDelete=function(){0!==this.messageArea.find(c.MESSAGES).length&&this.messageArea.trigger(a.CHOOSEMESSAGESTODELETE)},b}); \ No newline at end of file diff --git a/message/amd/build/message_area_contacts.min.js b/message/amd/build/message_area_contacts.min.js deleted file mode 100644 index d5078a2799d..00000000000 --- a/message/amd/build/message_area_contacts.min.js +++ /dev/null @@ -1 +0,0 @@ -define(["jquery","core/ajax","core/templates","core/notification","core/custom_interaction_events","core/str","core_message/message_area_events"],function(a,b,c,d,e,f,g){function h(a){this.messageArea=a,this._init()}var i={CONTACT:"[data-region='contact']",CONTACTICONBLOCKED:"[data-region='contact-icon-blocked']",CONTACTS:"[data-region='contacts'][data-region-content='contacts']",CONTACTSAREA:"[data-region='contacts-area']",CONVERSATIONS:"[data-region='contacts'][data-region-content='conversations']",COURSE:"[data-region='course']",LASTMESSAGETEXT:"[data-region='last-message-text']",LASTMESSAGEUSER:"[data-region='last-message-user']",LOADINGICON:".loading-icon",MESSAGETEXT:"[data-region='message-text']",MESSAGINGAREA:"[data-region='messaging-area']",NOCONTACTS:"[data-region=no-contacts]",SEARCHBOX:"[data-region='search-box']",SEARCHRESULTSAREA:"[data-region='search-results-area']",SEARCHTEXTAREA:"[data-region='search-text-area']",SELECTEDVIEWCONVERSATION:"[data-action='view-contact-msg'].selected",SELECTEDVIEWPROFILE:"[data-action='view-contact-profile'].selected",SHOWMESSAGES:"[data-action='show-messages']",VIEWCONVERSATION:"[data-action='view-contact-msg']",VIEWPROFILE:"[data-action='view-contact-profile']"};return h.prototype._isLoadingConversations=!1,h.prototype._isLoadingContacts=!1,h.prototype._numContactsDisplayed=0,h.prototype._numContactsToRetrieve=20,h.prototype._numConversationsDisplayed=0,h.prototype._numConversationsToRetrieve=20,h.prototype._messageLength=60,h.prototype.messageArea=null,h.prototype._init=function(){e.define(this.messageArea.node,[e.events.activate,e.events.down,e.events.up]),this.messageArea.onCustomEvent(g.MESSAGESEARCHCANCELED,this._viewConversations.bind(this)),this.messageArea.onCustomEvent(g.USERSSEARCHCANCELED,this._viewContacts.bind(this)),this.messageArea.onCustomEvent(g.CONTACTSSELECTED,this._viewContacts.bind(this)),this.messageArea.onCustomEvent(g.CONVERSATIONDELETED,this._deleteConversation.bind(this)),this.messageArea.onCustomEvent(g.CONVERSATIONSSELECTED,this._viewConversations.bind(this)),this.messageArea.onCustomEvent(g.CONTACTSSELECTED,this._viewContacts.bind(this)),this.messageArea.onCustomEvent(g.MESSAGESDELETED,this._updateLastMessage.bind(this)),this.messageArea.onCustomEvent(g.MESSAGESENT,this._handleMessageSent.bind(this)),this.messageArea.onCustomEvent(g.CONTACTREMOVED,function(a,b){this._removeContact(i.CONTACTS,b)}.bind(this)),this.messageArea.onCustomEvent(g.CONTACTADDED,function(a,b){this._addContact(b)}.bind(this)),this.messageArea.onCustomEvent(g.CONTACTBLOCKED,function(a,b){this._blockContact(b)}.bind(this)),this.messageArea.onCustomEvent(g.CONTACTUNBLOCKED,function(a,b){this._unblockContact(b)}.bind(this)),this.messageArea.onCustomEvent(g.CHOOSEMESSAGESTODELETE,this._startDeleting.bind(this)),this.messageArea.onCustomEvent(g.CANCELDELETEMESSAGES,this._stopDeleting.bind(this)),this.messageArea.onDelegateEvent(e.events.activate,i.VIEWCONVERSATION,this._viewConversation.bind(this)),this.messageArea.onDelegateEvent(e.events.activate,i.VIEWPROFILE,this._viewContact.bind(this)),this.messageArea.onDelegateEvent(e.events.activate,i.SHOWMESSAGES,this._showMessagingArea.bind(this)),this.messageArea.onDelegateEvent(e.events.up,i.CONTACT,this._selectPreviousContact.bind(this)),this.messageArea.onDelegateEvent(e.events.down,i.CONTACT,this._selectNextContact.bind(this)),this.messageArea.onDelegateEvent(e.events.up,i.VIEWCONVERSATION,this._selectPreviousConversation.bind(this)),this.messageArea.onDelegateEvent(e.events.down,i.VIEWCONVERSATION,this._selectNextConversation.bind(this)),this.messageArea.onDelegateEvent(e.events.up,i.COURSE,this._selectPreviousCourse.bind()),this.messageArea.onDelegateEvent(e.events.down,i.COURSE,this._selectNextCourse.bind()),this.messageArea.onDelegateEvent("focus",i.SEARCHBOX,this._setSearching.bind(this)),this.messageArea.onDelegateEvent("blur",i.SEARCHBOX,this._clearSearching.bind(this)),e.define(this.messageArea.find(i.CONVERSATIONS),[e.events.scrollBottom]),e.define(this.messageArea.find(i.CONTACTS),[e.events.scrollBottom]),this.messageArea.onDelegateEvent(e.events.scrollBottom,i.CONVERSATIONS,this._loadConversations.bind(this)),this.messageArea.onDelegateEvent(e.events.scrollBottom,i.CONTACTS,this._loadContacts.bind(this)),this.messageArea.showContactsFirst()||(this._numConversationsDisplayed=20)},h.prototype._startDeleting=function(){this.messageArea.find(i.CONTACTSAREA).addClass("editing")},h.prototype._stopDeleting=function(){this.messageArea.find(i.CONTACTSAREA).removeClass("editing")},h.prototype._viewConversations=function(){0===this._numConversationsDisplayed&&this._loadConversations(),this.messageArea.find(i.CONTACTS).hide(),this.messageArea.find(i.CONVERSATIONS).show()},h.prototype._viewContacts=function(){0===this._numContactsDisplayed&&this._loadContacts(),this.messageArea.find(i.CONVERSATIONS).hide(),this.messageArea.find(i.CONTACTS).show()},h.prototype._handleMessageSent=function(a,b,c){this._viewConversations();var d=this._getUserNode(i.CONVERSATIONS,b);if(0===d.length){var e=this._getUserNode(i.CONTACTS,b);if(0===e.length&&(e=this._getUserNode(i.SEARCHRESULTSAREA,b)),0==e.length)return;d=e.clone(),d.attr("data-action","view-contact-msg"),this.messageArea.find(i.CONVERSATIONS+" "+i.NOCONTACTS).remove(),this._numConversationsDisplayed++}d.prependTo(this.messageArea.find(i.CONVERSATIONS)),this.messageArea.find(i.CONVERSATIONS).scrollTop(0),this._updateContactText(d,c,!0),this._setSelectedUser("[data-userid='"+b+"']")},h.prototype._loadConversations=function(){if(this._isLoadingConversations)return!1;this._isLoadingConversations=!0;var a=0;return c.render("core/loading",{}).then(function(a,b){return this._numConversationsDisplayed?c.appendNodeContents(this.messageArea.find(i.CONVERSATIONS),"
"+a+"
",b):c.replaceNodeContents(this.messageArea.find(i.CONVERSATIONS),"
"+a+"
",b),this._getItems("core_message_data_for_messagearea_conversations",this._numConversationsDisplayed,this._numConversationsToRetrieve)}.bind(this)).then(function(b){return a=b.contacts.length,b.isconversation=!0,c.render("core_message/message_area_contacts",b)}).then(function(b,d){this.messageArea.find(i.CONVERSATIONS+" "+i.LOADINGICON).remove(),a>0?(c.appendNodeContents(this.messageArea.find(i.CONVERSATIONS),b,d),this._numConversationsDisplayed+=this._numConversationsToRetrieve):this._numConversationsDisplayed||c.replaceNodeContents(this.messageArea.find(i.CONVERSATIONS),b,d),this._isLoadingConversations=!1}.bind(this)).fail(d.exception)},h.prototype._loadContacts=function(){if(this._isLoadingContacts)return!1;this._isLoadingContacts=!0;var a=0;return c.render("core/loading",{}).then(function(a,b){return this._numContactsDisplayed?c.appendNodeContents(this.messageArea.find(i.CONTACTS),"
"+a+"
",b):c.replaceNodeContents(this.messageArea.find(i.CONTACTS),"
"+a+"
",b),this._getItems("core_message_data_for_messagearea_contacts",this._numContactsDisplayed,this._numContactsToRetrieve)}.bind(this)).then(function(b){return a=b.contacts.length,b.isconversation=!1,c.render("core_message/message_area_contacts",b)}).then(function(b,d){this.messageArea.find(i.CONTACTS+" "+i.LOADINGICON).remove(),a>0?(c.appendNodeContents(this.messageArea.find(i.CONTACTS),b,d),this._numContactsDisplayed+=a):this._numContactsDisplayed||c.replaceNodeContents(this.messageArea.find(i.CONTACTS),b,d),this._isLoadingContacts=!1}.bind(this)).fail(d.exception)},h.prototype._viewConversation=function(b){this.messageArea.trigger(g.CANCELDELETEMESSAGES);var c=a(b.currentTarget).data("userid"),d=a(b.currentTarget).data("messageid"),e="[data-userid='"+c+"']";d&&(e="[data-messageid='"+d+"']"),this._setSelectedUser(e),this.messageArea.trigger(g.CONVERSATIONSELECTED,c),this.messageArea.find(i.SELECTEDVIEWPROFILE).removeClass("selected"),this._showMessagingArea()},h.prototype._viewContact=function(b){this.messageArea.trigger(g.CANCELDELETEMESSAGES);var c=a(b.currentTarget).data("userid");this._setSelectedUser("[data-userid='"+c+"']"),this.messageArea.trigger(g.CONTACTSELECTED,c),this.messageArea.find(i.SELECTEDVIEWCONVERSATION).removeClass("selected"),this._showMessagingArea()},h.prototype._getItems=function(a,c,d){var e=b.call([{methodname:a,args:{userid:this.messageArea.getCurrentUserId(),limitfrom:c,limitnum:d}}]);return e[0]},h.prototype._deleteConversation=function(a,b){this._removeContact(i.CONVERSATIONS,b),this._numConversationsDisplayed--,this._hideMessagingArea(),this._stopDeleting()},h.prototype._updateLastMessage=function(a,b,c){if(c){var d=this._getUserNode(i.CONVERSATIONS,b),e=c.find(i.MESSAGETEXT).text().trim(),f=!1;c.data("useridto")==b&&(f=!0),this._updateContactText(d,e,f)}this._stopDeleting()},h.prototype._addContact=function(){this.messageArea.find(i.CONTACTS).empty(),this._numContactsDisplayed=0,this._loadContacts()},h.prototype._removeContact=function(a,b){this._getUserNode(a,b).remove(),this._numContactsDisplayed--},h.prototype._blockContact=function(a){var b=this._getUserNode(i.CONTACTS,a);b.find(i.CONTACTICONBLOCKED).removeClass("hidden"),b=this._getUserNode(i.CONVERSATIONS,a),b.find(i.CONTACTICONBLOCKED).removeClass("hidden"),b=this._getUserNode(i.SEARCHRESULTSAREA,a),b.find(i.CONTACTICONBLOCKED).removeClass("hidden")},h.prototype._unblockContact=function(a){var b=this._getUserNode(i.CONTACTS,a);b.find(i.CONTACTICONBLOCKED).addClass("hidden"),b=this._getUserNode(i.CONVERSATIONS,a),b.find(i.CONTACTICONBLOCKED).addClass("hidden"),b=this._getUserNode(i.SEARCHRESULTSAREA,a),b.find(i.CONTACTICONBLOCKED).addClass("hidden")},h.prototype._getUserNode=function(a,b){return this.messageArea.find(a+" "+i.CONTACT+"[data-userid='"+b+"']")},h.prototype._setSelectedUser=function(a){this.messageArea.find(i.CONTACT).removeClass("selected"),this.messageArea.find(i.CONTACT).attr("aria-pressed",!1),this.messageArea.find(i.CONTACT+a).addClass("selected"),this.messageArea.find(i.CONTACT+a).attr("aria-pressed",!0)},h.prototype._getContactText=function(a){return a.length>this._messageLength&&(a=a.substr(0,this._messageLength-3),a+="..."),document.createTextNode(a)},h.prototype._updateContactText=function(a,b,c){b=this._getContactText(b),c?f.get_string("you","message").done(function(b){a.find(i.LASTMESSAGEUSER).empty().append(b)}).always(function(){a.find(i.LASTMESSAGETEXT).empty().append(b)}):(a.find(i.LASTMESSAGEUSER).empty(),a.find(i.LASTMESSAGETEXT).empty().append(b))},h.prototype._selectNextContact=function(b,c){var d=a(b.target).closest(i.CONTACT),e=d.next();e.focus(),c.originalEvent.preventDefault(),c.originalEvent.stopPropagation()},h.prototype._selectPreviousContact=function(b,c){var d=a(b.target).closest(i.CONTACT),e=d.prev();e.focus(),c.originalEvent.preventDefault(),c.originalEvent.stopPropagation()},h.prototype._selectNextCourse=function(b,c){var d=a(b.target).closest(i.COURSE);d.next().focus(),c.originalEvent.preventDefault(),c.originalEvent.stopPropagation()},h.prototype._selectPreviousCourse=function(b,c){var d=a(b.target).closest(i.COURSE);d.prev().focus(),c.originalEvent.preventDefault(),c.originalEvent.stopPropagation()},h.prototype._selectNextConversation=function(b,c){var d=a(b.target).closest(i.VIEWCONVERSATION),e=d.next();e.focus(),c.originalEvent.preventDefault(),c.originalEvent.stopPropagation()},h.prototype._selectPreviousConversation=function(b,c){var d=a(b.target).closest(i.VIEWCONVERSATION),e=d.prev();e.focus(),c.originalEvent.preventDefault(),c.originalEvent.stopPropagation()},h.prototype._setSearching=function(){a(i.SEARCHTEXTAREA).addClass("searching")},h.prototype._clearSearching=function(){a(i.SEARCHTEXTAREA).removeClass("searching")},h.prototype._showMessagingArea=function(){this.messageArea.find(i.MESSAGINGAREA).removeClass("hide-messages").addClass("show-messages")},h.prototype._hideMessagingArea=function(){this.messageArea.find(i.MESSAGINGAREA).removeClass("show-messages").addClass("hide-messages")},h}); \ No newline at end of file diff --git a/message/amd/build/message_area_events.min.js b/message/amd/build/message_area_events.min.js deleted file mode 100644 index a94af1dba35..00000000000 --- a/message/amd/build/message_area_events.min.js +++ /dev/null @@ -1 +0,0 @@ -define([],function(){return{CANCELDELETEMESSAGES:"cancel-delete-messages",CHOOSEMESSAGESTODELETE:"choose-messages-to-delete",CONTACTADDED:"contact-added",CONTACTBLOCKED:"contact-blocked",CONTACTREMOVED:"contact-removed",CONTACTSELECTED:"contact-selected",CONTACTSSELECTED:"contacts-selected",CONTACTUNBLOCKED:"contact-unblocked",CONVERSATIONDELETED:"conversation-deleted",CONVERSATIONSELECTED:"conversation-selected",CONVERSATIONSSELECTED:"conversations-selected",MESSAGESDELETED:"messages-deleted",MESSAGESEARCHCANCELED:"message-search-canceled",MESSAGESENT:"message-sent",SENDMESSAGE:"message-send",USERSSEARCHCANCELED:"users-search-canceled"}}); \ No newline at end of file diff --git a/message/amd/build/message_area_messages.min.js b/message/amd/build/message_area_messages.min.js deleted file mode 100644 index fb627be1c8e..00000000000 --- a/message/amd/build/message_area_messages.min.js +++ /dev/null @@ -1 +0,0 @@ -define(["jquery","core/ajax","core/templates","core/notification","core/custom_interaction_events","core/auto_rows","core_message/message_area_actions","core/modal_factory","core/modal_events","core/str","core_message/message_area_events","core/backoff_timer"],function(a,b,c,d,e,f,g,h,i,j,k,l){function m(a){this.messageArea=a,this._init()}var n=500,o=50,p={BLOCKTIME:"[data-region='blocktime']",CANCELDELETEMESSAGES:"[data-action='cancel-delete-messages']",CONTACT:"[data-region='contact']",CONVERSATIONS:"[data-region='contacts'][data-region-content='conversations']",DELETEALLMESSAGES:"[data-action='delete-all-messages']",DELETEMESSAGES:"[data-action='delete-messages']",LOADINGICON:".loading-icon",MESSAGE:"[data-region='message']",MESSAGERESPONSE:"[data-region='response']",MESSAGES:"[data-region='messages']",MESSAGESAREA:"[data-region='messages-area']",MESSAGINGAREA:"[data-region='messaging-area']",SENDMESSAGE:"[data-action='send-message']",SENDMESSAGETEXT:"[data-region='send-message-txt']",SHOWCONTACTS:"[data-action='show-contacts']",STARTDELETEMESSAGES:"[data-action='start-delete-messages']"},q=1e3;return m.prototype._isSendingMessage=!1,m.prototype._isLoadingMessages=!1,m.prototype._numMessagesDisplayed=0,m.prototype._messageQueue=[],m.prototype._numMessagesToRetrieve=20,m.prototype._confirmationModal=null,m.prototype._latestMessageTimestamp=0,m.prototype._backoffTimer=null,m.prototype.messageArea=null,m.prototype._init=function(){e.define(this.messageArea.node,[e.events.activate,e.events.up,e.events.down,e.events.enter]),a(window).height()<=670&&(n=400),f.init(this.messageArea.node),this.messageArea.onCustomEvent(k.CONVERSATIONSELECTED,this._viewMessages.bind(this)),this.messageArea.onCustomEvent(k.SENDMESSAGE,this._viewMessages.bind(this)),this.messageArea.onCustomEvent(k.CHOOSEMESSAGESTODELETE,this._chooseMessagesToDelete.bind(this)),this.messageArea.onCustomEvent(k.CANCELDELETEMESSAGES,this._hideDeleteAction.bind(this)),this.messageArea.onDelegateEvent(e.events.activate,p.SENDMESSAGE,this._sendMessage.bind(this)),this.messageArea.onDelegateEvent(e.events.activate,p.STARTDELETEMESSAGES,this._startDeleting.bind(this)),this.messageArea.onDelegateEvent(e.events.activate,p.DELETEMESSAGES,this._deleteMessages.bind(this)),this.messageArea.onDelegateEvent(e.events.activate,p.DELETEALLMESSAGES,this._deleteAllMessages.bind(this)),this.messageArea.onDelegateEvent(e.events.activate,p.CANCELDELETEMESSAGES,this._triggerCancelMessagesToDelete.bind(this)),this.messageArea.onDelegateEvent(e.events.activate,p.MESSAGE,this._toggleMessage.bind(this)),this.messageArea.onDelegateEvent(e.events.activate,p.SHOWCONTACTS,this._hideMessagingArea.bind(this)),this.messageArea.onDelegateEvent(e.events.up,p.MESSAGE,this._selectPreviousMessage.bind(this)),this.messageArea.onDelegateEvent(e.events.down,p.MESSAGE,this._selectNextMessage.bind(this)),this.messageArea.onDelegateEvent("focus",p.SENDMESSAGETEXT,this._setMessaging.bind(this)),this.messageArea.onDelegateEvent("blur",p.SENDMESSAGETEXT,this._clearMessaging.bind(this)),a(document).on(f.events.ROW_CHANGE,this._adjustMessagesAreaHeight.bind(this));var b=this.messageArea.find(p.MESSAGES);b.length&&(this._addScrollEventListener(b.find(p.MESSAGE).length),this._latestMessageTimestamp=b.find(p.MESSAGE+":last").data("timecreated")),this._backoffTimer=new l(this._loadNewMessages.bind(this),l.getIncrementalCallback(this.messageArea.pollmin*q,q,this.messageArea.pollmax*q,this.messageArea.polltimeout*q)),this._backoffTimer.start()},m.prototype._viewMessages=function(e,f){this._numMessagesDisplayed=0,this._backoffTimer.stop(),this._latestMessageTimestamp=0;var g=b.call([{methodname:"core_message_mark_all_messages_as_read",args:{useridto:this.messageArea.getCurrentUserId(),useridfrom:f}}]),h=0;return c.render("core/loading",{}).then(function(a,b){return c.replaceNodeContents(this.messageArea.find(p.MESSAGESAREA),a,b),g[0]}.bind(this)).then(function(){var b=this.messageArea.find(p.CONVERSATIONS+" "+p.CONTACT+"[data-userid='"+f+"']");return b.hasClass("unread")&&(b.removeClass("unread"),a(document).trigger("messagearea:conversationselected",f)),this._getMessages(f)}.bind(this)).then(function(a){return h=a.messages.length,c.render("core_message/message_area_messages_area",a)}).then(function(a,b){c.replaceNodeContents(this.messageArea.find(p.MESSAGESAREA),a,b),this._addScrollEventListener(h),this._backoffTimer.restart(),this.messageArea.find(p.SENDMESSAGETEXT).focus()}.bind(this)).fail(d.exception)},m.prototype._loadMessages=function(){if(this._isLoadingMessages)return!1;this._isLoadingMessages=!0;var b=0;return c.render("core/loading",{}).then(function(a,b){return c.prependNodeContents(this.messageArea.find(p.MESSAGES),"
"+a+"
",b),this._getMessages(this._getUserId())}.bind(this)).then(function(a){return b=a.messages.length,c.render("core_message/message_area_messages",a)}).then(function(d,e){if(this.messageArea.find(p.MESSAGES+" "+p.LOADINGICON).remove(),b>0){var f=a("
"+d+"
");this._hasMatchingBlockTime(this.messageArea.node,f,!0)&&this.messageArea.node.find(p.BLOCKTIME+":first").remove();var g=this.messageArea.find(p.MESSAGES)[0].scrollHeight;c.prependNodeContents(this.messageArea.find(p.MESSAGES),d,e);var h=this.messageArea.find(p.MESSAGES)[0].scrollHeight;this.messageArea.find(p.MESSAGES).scrollTop(h-g),this._numMessagesDisplayed+=b}this._isLoadingMessages=!1}.bind(this)).fail(d.exception)},m.prototype._loadNewMessages=function(){if(this._isLoadingMessages)return!1;if(!this._getUserId())return!1;this._isLoadingMessages=!0;var a=!1,b=this.messageArea.find(p.MESSAGES);if(0!==b.length){var c=b.scrollTop(),e=b.innerHeight(),f=b[0].scrollHeight;c+e>=f&&(a=!0)}return this._getMessages(this._getUserId(),!0).then(function(b){return this._addMessagesToDom(b.messages,a)}.bind(this)).always(function(){this._isLoadingMessages=!1}.bind(this)).fail(d.exception)},m.prototype._getMessages=function(a,c){var e={currentuserid:this.messageArea.getCurrentUserId(),otheruserid:a,limitfrom:this._numMessagesDisplayed,limitnum:this._numMessagesToRetrieve,newest:!0};c&&(e.timefrom=this._latestMessageTimestamp,e.limitfrom=0,e.limitnum=0);var f=b.call([{methodname:"core_message_data_for_messagearea_messages",args:e}]);return f[0].then(function(a){var b=a.messages;if(b&&b.length){var c=b[b.length-1];c.timecreated>this._latestMessageTimestamp&&(this._latestMessageTimestamp=c.timecreated+1)}return a}.bind(this)).fail(function(a){this._backoffTimer.stop(),d.exception(a)}.bind(this))},m.prototype._sendMessage=function(){var a=this.messageArea.find(p.SENDMESSAGETEXT),c=a.val().trim();if(""===c)return!1;if(this._isSendingMessage)return!1;this._isSendingMessage=!0;var e=b.call([{methodname:"core_message_send_instant_messages",args:{messages:[{touserid:this._getUserId(),text:c}]}}]);return a.prop("disabled",!0),e[0].then(function(a){if(a.length<0)throw new Error("Invalid response");if(a[0].errormessage)throw new Error(a[0].errormessage);return this.messageArea.trigger(k.MESSAGESENT,[this._getUserId(),c]),this._addLastMessageToDom()}.bind(this)).then(function(){this._isSendingMessage=!1}.bind(this)).always(function(){a.prop("disabled",!1),a.focus()}).fail(d.exception)},m.prototype._chooseMessagesToDelete=function(){this.messageArea.find(p.MESSAGESAREA).addClass("editing"),this.messageArea.find(p.MESSAGE).attr("role","checkbox").attr("aria-checked","false")},m.prototype._deleteMessages=function(){var c=this.messageArea.getCurrentUserId(),e=this.messageArea.find(p.MESSAGE+"[aria-checked='true']"),f=[],g=[];e.each(function(b,d){var e=a(d),h=e.data("messageid"),i=e.data("messageread")?1:0;g.push(e),f.push({methodname:"core_message_delete_message",args:{messageid:h,userid:c,read:i}})}),f.length>0?a.when(b.call(f)).then(function(){var b=null,c=this.messageArea.find(p.MESSAGE),d=c.last(),e=g[g.length-1];a.each(g,function(a,b){b.remove()}),d.data("id")===e.data("id")&&(b=this.messageArea.find(p.MESSAGE).last()),a.each(g,function(a,b){var c=b.data("blocktime");0===this.messageArea.find(p.MESSAGE+"[data-blocktime='"+c+"']").length&&this.messageArea.find(p.BLOCKTIME+"[data-blocktime='"+c+"']").remove()}.bind(this)),0===this.messageArea.find(p.MESSAGE).length&&this.messageArea.find(p.CONVERSATIONS+" "+p.CONTACT+"[data-userid='"+this._getUserId()+"']").remove(),this.messageArea.trigger(k.MESSAGESDELETED,[this._getUserId(),b])}.bind(this))["catch"](d.exception):this.messageArea.trigger(k.MESSAGESDELETED,this._getUserId()),this._hideDeleteAction()},m.prototype._addScrollEventListener=function(a){this._scrollBottom(),this._numMessagesDisplayed=a,e.define(this.messageArea.find(p.MESSAGES),[e.events.scrollTop]),this.messageArea.onCustomEvent(e.events.scrollTop,this._loadMessages.bind(this))},m.prototype._deleteAllMessages=function(){if(this._confirmationModal)return void this._confirmationModal.show();var c=j.get_strings([{key:"confirm"},{key:"deleteallconfirm",component:"message"},{key:"delete"}]),e=h.create({type:h.types.SAVE_CANCEL},this.messageArea.find(p.DELETEALLMESSAGES));a.when(c,e).then(function(a,c){c.setTitle(a[0]),c.setBody(a[1]),c.setSaveButtonText(a[2]),this._confirmationModal=c,c.getRoot().on(i.save,function(){var a=this._getUserId(),c={methodname:"core_message_delete_conversation",args:{userid:this.messageArea.getCurrentUserId(),otheruserid:a}};b.call([c])[0].then(function(){this.messageArea.find(p.MESSAGESAREA).empty(),this.messageArea.trigger(k.CONVERSATIONDELETED,a),this._hideDeleteAction()}.bind(this))["catch"](d.exception)}.bind(this)),c.show()}.bind(this))["catch"](d.exception)},m.prototype._hideDeleteAction=function(){this.messageArea.find(p.MESSAGE).removeAttr("role").removeAttr("aria-checked"),this.messageArea.find(p.MESSAGESAREA).removeClass("editing")},m.prototype._triggerCancelMessagesToDelete=function(){this.messageArea.trigger(k.CANCELDELETEMESSAGES)},m.prototype._addMessagesToDom=function(b,d){var e=0,f=this.messageArea.find(p.MESSAGES);return b=b.filter(function(a){var b=""+a.id+a.isread;if(this._messageQueue[b])return!1;var c=f.find(p.MESSAGE+'[data-id="'+b+'"]');return c.length||(this._messageQueue[b]=!0),!c.length}.bind(this)),e=b.length,c.render("core_message/message_area_messages",{messages:b}).then(function(b,f){if(e>0){var g=a("
"+b+"
");this._hasMatchingBlockTime(this.messageArea.node,g,!1)&&g.find(p.BLOCKTIME+":first").remove(),c.appendNodeContents(this.messageArea.find(p.MESSAGES),g,f),d&&this._scrollBottom(),this._numMessagesDisplayed+=e,this._backoffTimer.restart()}}.bind(this))},m.prototype._addLastMessageToDom=function(){var a=b.call([{methodname:"core_message_data_for_messagearea_get_most_recent_message",args:{currentuserid:this.messageArea.getCurrentUserId(),otheruserid:this._getUserId()}}]);return a[0].then(function(a){return this._addMessagesToDom([a],!0)}.bind(this)).always(function(){this.messageArea.find(p.SENDMESSAGETEXT).val("").trigger("input")}.bind(this)).fail(d.exception)},m.prototype._getUserId=function(){return this.messageArea.find(p.MESSAGES).data("userid")},m.prototype._scrollBottom=function(){var a=this.messageArea.find(p.MESSAGES);0!==a.length&&a.scrollTop(a[0].scrollHeight)},m.prototype._selectPreviousMessage=function(b,c){var d=a(b.target).closest(p.MESSAGE);do d=d.prev();while(d.length&&!d.is(p.MESSAGE));d.focus(),c.originalEvent.preventDefault(),c.originalEvent.stopPropagation()},m.prototype._selectNextMessage=function(b,c){var d=a(b.target).closest(p.MESSAGE);do d=d.next();while(d.length&&!d.is(p.MESSAGE));d.focus(),c.originalEvent.preventDefault(),c.originalEvent.stopPropagation()},m.prototype._setMessaging=function(b){a(b.target).closest(p.MESSAGERESPONSE).addClass("messaging")},m.prototype._clearMessaging=function(b){a(b.target).closest(p.MESSAGERESPONSE).removeClass("messaging")},m.prototype._startDeleting=function(a){var b=new g(this.messageArea);b.chooseMessagesToDelete(),a.preventDefault()},m.prototype._isEditing=function(){return this.messageArea.find(p.MESSAGESAREA).hasClass("editing")},m.prototype._toggleMessage=function(b){if(this._isEditing()){var c=a(b.target).closest(p.MESSAGE);"true"===c.attr("aria-checked")?c.attr("aria-checked","false"):c.attr("aria-checked","true")}},m.prototype._adjustMessagesAreaHeight=function(){var a=this.messageArea.find(p.MESSAGES),b=this.messageArea.find(p.MESSAGERESPONSE),c=b.outerHeight(),d=c-o,e=n-d;a.outerHeight(e)},m.prototype._sendMessageHandler=function(a,b){b.originalEvent.preventDefault(),this._sendMessage()},m.prototype._hideMessagingArea=function(){this.messageArea.find(p.MESSAGINGAREA).removeClass("show-messages").addClass("hide-messages")},m.prototype._hasMatchingBlockTime=function(a,b,c){var d,e,f,g;return c?(e=":first",g=":last"):(e=":last",g=":first"),d=a.find(p.BLOCKTIME+e),f=b.find(p.BLOCKTIME+g),!(!d.length||!f.length)&&d.data("blocktime")==f.data("blocktime")},m}); \ No newline at end of file diff --git a/message/amd/build/message_area_profile.min.js b/message/amd/build/message_area_profile.min.js deleted file mode 100644 index c99cadbe81e..00000000000 --- a/message/amd/build/message_area_profile.min.js +++ /dev/null @@ -1 +0,0 @@ -define(["jquery","core/ajax","core/templates","core/notification","core/str","core/config","core/custom_interaction_events","core_message/message_area_events"],function(a,b,c,d,e,f,g,h){function i(a){this.messageArea=a,this._init()}var j={PROFILE:"[data-region='profile']",PROFILEADDCONTACT:"[data-action='profile-add-contact']",PROFILEBLOCKCONTACT:"[data-action='profile-block-contact']",PROFILEREMOVECONTACT:"[data-action='profile-remove-contact']",PROFILESENDMESSAGE:"[data-action='profile-send-message']",PROFILEUNBLOCKCONTACT:"[data-action='profile-unblock-contact']",PROFILEVIEW:"[data-action='profile-view']",SHOWCONTACTS:"[data-action='show-contacts']",MESSAGESAREA:"[data-region='messages-area']",MESSAGINGAREA:"[data-region='messaging-area']"};return i.prototype.messageArea=null,i.prototype._init=function(){g.define(this.messageArea.node,[g.events.activate]),this.messageArea.onCustomEvent(h.CONTACTSELECTED,this._viewProfile.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEVIEW,function(a,b){this._viewFullProfile(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILESENDMESSAGE,function(a,b){this._sendMessage(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEUNBLOCKCONTACT,function(a,b){this._unblockContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEBLOCKCONTACT,function(a,b){this._blockContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEADDCONTACT,function(a,b){this._addContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.PROFILEREMOVECONTACT,function(a,b){this._removeContact(),b.originalEvent.preventDefault()}.bind(this)),this.messageArea.onDelegateEvent(g.events.activate,j.SHOWCONTACTS,this._hideMessagingArea.bind(this))},i.prototype._viewProfile=function(a,e){c.render("core/loading",{}).done(function(a,b){c.replaceNodeContents(this.messageArea.find(j.MESSAGESAREA),a,b)}.bind(this));var f=b.call([{methodname:"core_message_data_for_messagearea_get_profile",args:{currentuserid:this.messageArea.getCurrentUserId(),otheruserid:e}}]);return f[0].then(function(a){return c.render("core_message/message_area_profile",a)}).then(function(a,b){c.replaceNodeContents(this.messageArea.find(j.MESSAGESAREA),a,b)}.bind(this)).fail(d.exception)},i.prototype._viewFullProfile=function(){window.location.href=f.wwwroot+"/user/profile.php?id="+this._getUserId()},i.prototype._sendMessage=function(){this.messageArea.trigger(h.SENDMESSAGE,this._getUserId())},i.prototype._blockContact=function(){var a=this._performAction("core_message_block_user","unblockcontact","profile-block-contact","profile-unblock-contact","");return a.then(function(){this.messageArea.trigger(h.CONTACTBLOCKED,this._getUserId())}.bind(this))},i.prototype._unblockContact=function(){var a=this._performAction("core_message_unblock_user","blockcontact","profile-unblock-contact","profile-block-contact","danger");return a.then(function(){this.messageArea.trigger(h.CONTACTUNBLOCKED,this._getUserId())}.bind(this))},i.prototype._addContact=function(){var a=this._performAction("core_message_create_contact_request","removecontact","profile-add-contact","profile-remove-contact","danger");return a.then(function(){this.messageArea.trigger(h.CONTACTADDED,this._getUserId())}.bind(this))},i.prototype._removeContact=function(){var a=this._performAction("core_message_delete_contacts","addcontact","profile-remove-contact","profile-add-contact","");return a.then(function(){this.messageArea.trigger(h.CONTACTREMOVED,this._getUserId())}.bind(this))},i.prototype._performAction=function(a,c,f,g,h){var i="";switch(a){case"core_message_block_user":i={userid:this.messageArea.getCurrentUserId(),blockeduserid:this._getUserId()};break;case"core_message_unblock_user":i={userid:this.messageArea.getCurrentUserId(),unblockeduserid:this._getUserId()};break;case"core_message_create_contact_request":i={userid:this.messageArea.getCurrentUserId(),requesteduserid:this._getUserId()};break;default:i={userid:this.messageArea.getCurrentUserId(),userids:[this._getUserId()]}}var j=b.call([{methodname:a,args:i}]);return j[0].then(function(){return e.get_string(c,"message")}).then(function(a){this._changeText(a,f,g,h)}.bind(this)).fail(d.exception)},i.prototype._changeText=function(a,b,c,d){var e=this.messageArea.find("[data-action='"+b+"']");e.text(a),e.removeClass(),d&&e.addClass(d),e.attr("data-action",c)},i.prototype._getUserId=function(){return this.messageArea.find(j.PROFILE).data("userid")},i.prototype._hideMessagingArea=function(){this.messageArea.find(j.MESSAGINGAREA).removeClass("show-messages").addClass("hide-messages")},i}); \ No newline at end of file diff --git a/message/amd/build/message_area_search.min.js b/message/amd/build/message_area_search.min.js deleted file mode 100644 index fcaaef74c78..00000000000 --- a/message/amd/build/message_area_search.min.js +++ /dev/null @@ -1 +0,0 @@ -define(["jquery","core/ajax","core/templates","core/notification","core/str","core/custom_interaction_events","core_message/message_area_events"],function(a,b,c,d,e,f,g){function h(a){this.messageArea=a,this._init()}var i={CONTACTS:"[data-region='contacts'][data-region-content='contacts']",CONTACTSAREA:"[data-region='contacts-area']",CONVERSATIONS:"[data-region='contacts'][data-region-content='conversations']",DELETESEARCHFILTER:"[data-region='search-filter-area']",LOADINGICON:".loading-icon",SEARCHBOX:"[data-region='search-box']",SEARCHFILTER:"[data-region='search-filter']",SEARCHFILTERAREA:"[data-region='search-filter-area']",SEARCHRESULTSAREA:"[data-region='search-results-area']",SEARCHTEXTAREA:"[data-region='search-text-area']",SEARCHUSERSINCOURSE:"[data-action='search-users-in-course']"};return h.prototype.messageArea=null,h.prototype._searchArea=null,h.prototype._courseid=null,h.prototype._isLoading=!1,h.prototype._numMessagesDisplayed=0,h.prototype._numMessagesToRetrieve=20,h.prototype._numUsersDisplayed=0,h.prototype._numUsersToRetrieve=20,h.prototype._searchAreas={MESSAGES:"messages",USERS:"users",USERSINCOURSE:"usersincourse"},h.prototype._requestTimeout=null,h.prototype._init=function(){this.messageArea.find(i.SEARCHTEXTAREA).on("input",this._searchRequest.bind(this)),this.messageArea.onDelegateEvent(f.events.activate,i.SEARCHUSERSINCOURSE,function(b){this._setFilter(a(b.currentTarget).html()),this._setPlaceholderText("searchforuser"),this._clearSearchArea(),this._searchArea=this._searchAreas.USERSINCOURSE,this._courseid=a(b.currentTarget).data("courseid"),this._searchUsersInCourse(),this.messageArea.find(i.SEARCHBOX).focus()}.bind(this)),this.messageArea.onDelegateEvent(f.events.activate,i.DELETESEARCHFILTER,function(){this._hideSearchResults(),this._searchArea=this._searchAreas.USERS,this._setPlaceholderText("searchforuserorcourse"),this.messageArea.trigger(g.USERSSEARCHCANCELED),this.messageArea.find(i.SEARCHBOX).focus()}.bind(this)),this.messageArea.onCustomEvent(g.CONVERSATIONSSELECTED,function(){this._hideSearchResults(),this._searchArea=this._searchAreas.MESSAGES,this._setPlaceholderText("searchmessages")}.bind(this)),this.messageArea.onCustomEvent(g.CONTACTSSELECTED,function(){this._hideSearchResults(),this._searchArea=this._searchAreas.USERS,this._setPlaceholderText("searchforuserorcourse")}.bind(this)),this.messageArea.onCustomEvent(g.MESSAGESENT,function(){this._hideSearchResults(),this._searchArea=this._searchAreas.MESSAGES,this._setPlaceholderText("searchmessages")}.bind(this)),f.define(this.messageArea.find(i.SEARCHRESULTSAREA),[f.events.scrollBottom]),this.messageArea.onDelegateEvent(f.events.scrollBottom,i.SEARCHRESULTSAREA,function(){this._searchArea==this._searchAreas.MESSAGES?this._searchMessages():this._searchArea==this._searchAreas.USERSINCOURSE&&this._searchUsersInCourse()}.bind(this)),this._searchArea=this.messageArea.showContactsFirst()?this._searchAreas.USERS:this._searchAreas.MESSAGES},h.prototype._searchRequest=function(){var a=this.messageArea.find(i.SEARCHTEXTAREA+" input").val();return this._requestTimeout&&clearTimeout(this._requestTimeout),""===a.trim()?void(this._searchArea==this._searchAreas.MESSAGES?(this._hideSearchResults(),this.messageArea.trigger(g.MESSAGESEARCHCANCELED)):this._searchArea==this._searchAreas.USERS?(this._hideSearchResults(),this.messageArea.trigger(g.USERSSEARCHCANCELED)):this._searchArea==this._searchAreas.USERSINCOURSE&&(this._clearSearchArea(),this._searchUsersInCourse())):(this.messageArea.find(i.CONVERSATIONS).hide(),this.messageArea.find(i.CONTACTS).hide(),this.messageArea.find(i.SEARCHRESULTSAREA).show(),void(this._searchArea==this._searchAreas.MESSAGES?this._requestTimeout=setTimeout(function(){this._clearSearchArea(),this._numMessagesDisplayed=0,this._searchMessages()}.bind(this),300):this._searchArea==this._searchAreas.USERSINCOURSE?this._requestTimeout=setTimeout(function(){this._clearSearchArea(),this._numUsersDisplayed=0,this._searchUsersInCourse()}.bind(this),300):this._requestTimeout=setTimeout(function(){this._clearSearchArea(),this._numUsersDisplayed=0,this._searchUsers()}.bind(this),300)))},h.prototype._searchMessages=function(){if(this._isLoading)return!1;var a=this.messageArea.find(i.SEARCHBOX).val();this._isLoading=!0;var e=b.call([{methodname:"core_message_data_for_messagearea_search_messages",args:{userid:this.messageArea.getCurrentUserId(),search:a,limitfrom:this._numMessagesDisplayed,limitnum:this._numMessagesToRetrieve}}]),f=0;return c.render("core/loading",{}).then(function(a,b){return c.appendNodeContents(this.messageArea.find(i.SEARCHRESULTSAREA),"
"+a+"
",b),e[0]}.bind(this)).then(function(a){return f=a.contacts.length,c.render("core_message/message_area_message_search_results",a)}).then(function(a,b){this.messageArea.find(i.SEARCHRESULTSAREA+" "+i.LOADINGICON).remove(),f>0?(c.appendNodeContents(this.messageArea.find(i.SEARCHRESULTSAREA),a,b),this._numMessagesDisplayed+=f):0==this._numMessagesDisplayed&&c.replaceNodeContents(this.messageArea.find(i.SEARCHRESULTSAREA),a,b),this._isLoading=!1}.bind(this)).fail(d.exception)},h.prototype._searchUsers=function(){var a=this.messageArea.find(i.SEARCHBOX).val(),e=b.call([{methodname:"core_message_data_for_messagearea_search_users",args:{userid:this.messageArea.getCurrentUserId(),search:a,limitnum:this._numUsersToRetrieve}}]);return c.render("core/loading",{}).then(function(a,b){return c.replaceNodeContents(this.messageArea.find(i.SEARCHRESULTSAREA),"
"+a+"
",b),e[0]}.bind(this)).then(function(a){return a.contacts.length>0&&(a.hascontacts=!0),a.courses.length>0&&(a.hascourses=!0),a.noncontacts.length>0&&(a.hasnoncontacts=!0),c.render("core_message/message_area_user_search_results",a)}).then(function(a,b){c.replaceNodeContents(this.messageArea.find(i.SEARCHRESULTSAREA),a,b)}.bind(this)).fail(d.exception)},h.prototype._searchUsersInCourse=function(){if(this._isLoading)return!1;var a=this.messageArea.find(i.SEARCHBOX).val();this._isLoading=!0;var e=b.call([{methodname:"core_message_data_for_messagearea_search_users_in_course",args:{userid:this.messageArea.getCurrentUserId(),courseid:this._courseid,search:a,limitfrom:this._numUsersDisplayed,limitnum:this._numUsersToRetrieve}}]),f=0;return c.render("core/loading",{}).then(function(a,b){return c.appendNodeContents(this.messageArea.find(i.SEARCHRESULTSAREA),"
"+a+"
",b),e[0]}.bind(this)).then(function(a){return f=a.contacts.length,f>0&&(a.hascontacts=!0),c.render("core_message/message_area_user_search_results",a)}).then(function(a,b){this.messageArea.find(i.SEARCHRESULTSAREA+" "+i.LOADINGICON).remove(),f>0?(c.appendNodeContents(this.messageArea.find(i.SEARCHRESULTSAREA),a,b),this._numUsersDisplayed+=f):0==this._numUsersDisplayed&&c.replaceNodeContents(this.messageArea.find(i.SEARCHRESULTSAREA),a,b),this._isLoading=!1}.bind(this)).fail(d.exception)},h.prototype._setPlaceholderText=function(a){return e.get_string(a,"message").then(function(a){this.messageArea.find(i.SEARCHTEXTAREA+" input").attr("placeholder",a)}.bind(this))},h.prototype._setFilter=function(a){this.messageArea.find(i.SEARCHBOX).val(""),this.messageArea.find(i.CONTACTSAREA).addClass("searchfilter"),this.messageArea.find(i.SEARCHFILTERAREA).show(),this.messageArea.find(i.SEARCHFILTER).html(a),e.get_string("removecoursefilter","message",a).then(function(a){this.messageArea.find(i.SEARCHFILTERAREA).attr("aria-label",a)}.bind(this))["catch"](d.exception)},h.prototype._clearFilters=function(){this.messageArea.find(i.CONTACTSAREA).removeClass("searchfilter"),this.messageArea.find(i.SEARCHFILTER).empty(),this.messageArea.find(i.SEARCHFILTERAREA).hide(),this.messageArea.find(i.SEARCHFILTERAREA).removeAttr("aria-label")},h.prototype._clearSearchArea=function(){this.messageArea.find(i.SEARCHRESULTSAREA).empty()},h.prototype._hideSearchResults=function(){this._clearFilters(),this.messageArea.find(i.SEARCHTEXTAREA+" input").val(""),this._clearSearchArea(),this.messageArea.find(i.SEARCHRESULTSAREA).hide()},h}); \ No newline at end of file diff --git a/message/amd/build/message_area_tabs.min.js b/message/amd/build/message_area_tabs.min.js deleted file mode 100644 index 9c3daf335cb..00000000000 --- a/message/amd/build/message_area_tabs.min.js +++ /dev/null @@ -1 +0,0 @@ -define(["core/custom_interaction_events","core_message/message_area_events"],function(a,b){function c(a){this.messageArea=a,this._init()}var d={ACTIVECONTACTSTAB:"[data-region='contacts-area'] [role='tab'][aria-selected='true']",CONTACTSPANELS:"[data-region='contacts']",VIEWCONTACTS:"[data-action='contacts-view']",VIEWCONVERSATIONS:"[data-action='conversations-view']"};return c.prototype.messageArea=null,c.prototype._init=function(){a.define(this.messageArea.node,[a.events.activate,a.events.up,a.events.down,a.events.next,a.events.previous,a.events.ctrlPageUp,a.events.ctrlPageDown]),this.messageArea.onDelegateEvent(a.events.activate,d.VIEWCONVERSATIONS,this._viewConversations.bind(this)),this.messageArea.onDelegateEvent(a.events.activate,d.VIEWCONTACTS,this._viewContacts.bind(this)),this.messageArea.onDelegateEvent(a.events.up,d.VIEWCONVERSATIONS,this._toggleTabs.bind(this)),this.messageArea.onDelegateEvent(a.events.down,d.VIEWCONVERSATIONS,this._toggleTabs.bind(this)),this.messageArea.onDelegateEvent(a.events.next,d.VIEWCONVERSATIONS,this._toggleTabs.bind(this)),this.messageArea.onDelegateEvent(a.events.previous,d.VIEWCONVERSATIONS,this._toggleTabs.bind(this)),this.messageArea.onDelegateEvent(a.events.up,d.VIEWCONTACTS,this._toggleTabs.bind(this)),this.messageArea.onDelegateEvent(a.events.down,d.VIEWCONTACTS,this._toggleTabs.bind(this)),this.messageArea.onDelegateEvent(a.events.next,d.VIEWCONTACTS,this._toggleTabs.bind(this)),this.messageArea.onDelegateEvent(a.events.previous,d.VIEWCONTACTS,this._toggleTabs.bind(this)),this.messageArea.onDelegateEvent(a.events.ctrlPageUp,d.CONTACTSPANELS,this._toggleTabs.bind(this)),this.messageArea.onDelegateEvent(a.events.ctrlPageDown,d.CONTACTSPANELS,this._toggleTabs.bind(this)),this.messageArea.onCustomEvent(b.MESSAGESENT,function(){this._selectTab(d.VIEWCONVERSATIONS,d.VIEWCONTACTS)}.bind(this))},c.prototype._viewConversations=function(){this.messageArea.trigger(b.CONVERSATIONSSELECTED),this._selectTab(d.VIEWCONVERSATIONS,d.VIEWCONTACTS)},c.prototype._viewContacts=function(){this.messageArea.trigger(b.CONTACTSSELECTED),this._selectTab(d.VIEWCONTACTS,d.VIEWCONVERSATIONS)},c.prototype._selectTab=function(a,b){b=this.messageArea.find(b),b.removeClass("selected"),b.attr("aria-selected","false"),b.attr("tabindex","-1"),a=this.messageArea.find(a),a.addClass("selected"),a.attr("aria-selected","true"),a.attr("tabindex","0")},c.prototype._toggleTabs=function(a,b){var c=this.messageArea.find(d.ACTIVECONTACTSTAB);c.is(d.VIEWCONVERSATIONS)?this._viewContacts():this._viewConversations(),this.messageArea.find(d.ACTIVECONTACTSTAB).focus(),a.preventDefault(),a.stopPropagation(),b.originalEvent.preventDefault(),b.originalEvent.stopPropagation()},c}); \ No newline at end of file diff --git a/message/amd/build/message_preferences.min.js b/message/amd/build/message_preferences.min.js deleted file mode 100644 index 54bf9178e48..00000000000 --- a/message/amd/build/message_preferences.min.js +++ /dev/null @@ -1 +0,0 @@ -define(["jquery","core/ajax","core/notification","core_message/message_notification_preference","core/custom_interaction_events"],function(a,b,c,d,e){var f={PREFERENCE:"[data-state]",PREFERENCES_CONTAINER:'[data-region="preferences-container"]',CONTACTABLE_PRIVACY_CONTAINER:'[data-region="privacy-setting-container"]'},g=function(b){this.root=a(b),this.userId=this.root.find(f.PREFERENCES_CONTAINER).attr("data-user-id"),this.registerEventListeners()};return g.prototype.preferencesDisabled=function(){return this.root.find(f.PREFERENCES_CONTAINER).hasClass("disabled")},g.prototype.saveContactablePrivacySetting=function(){var d=this.root.find(f.CONTACTABLE_PRIVACY_CONTAINER),e=a("input[type='radio']:checked").val();if(d.hasClass("loading"))return a.Deferred().resolve();d.addClass("loading");var g={methodname:"core_user_update_user_preferences",args:{userid:this.userId,preferences:[{type:d.attr("data-preference-key"),value:e}]}};return b.call([g])[0].fail(c.exception).always(function(){d.removeClass("loading")})},g.prototype.registerEventListeners=function(){e.define(this.root,[e.events.activate]),this.root.on("change",function(b){if("message_blocknoncontacts"==b.target.name)this.saveContactablePrivacySetting();else if(!this.preferencesDisabled()){var c=a(b.target).closest(f.PREFERENCES_CONTAINER),e=a(b.target).closest(f.PREFERENCE),g=new d(c,this.userId);e.addClass("loading"),g.save().always(function(){e.removeClass("loading")})}}.bind(this))},g}); \ No newline at end of file diff --git a/message/amd/src/message_area.js b/message/amd/src/message_area.js deleted file mode 100644 index b9482aa005e..00000000000 --- a/message/amd/src/message_area.js +++ /dev/null @@ -1,131 +0,0 @@ -// This file is part of Moodle - http://moodle.org/ -// -// Moodle is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Moodle is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Moodle. If not, see . - -/** - * This module instantiates the functionality of the messaging area. - * - * @module core_message/message_area - * @package core_message - * @copyright 2016 Mark Nelson - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -define(['jquery', 'core_message/message_area_contacts', 'core_message/message_area_messages', - 'core_message/message_area_profile', 'core_message/message_area_tabs', 'core_message/message_area_search'], - function($, Contacts, Messages, Profile, Tabs, Search) { - - /** - * Messagearea class. - * - * @param {String} selector The selector for the page region containing the message area. - * @param {int} pollmin - * @param {int} pollmax - * @param {int} polltimeout - */ - function Messagearea(selector, pollmin, pollmax, polltimeout) { - this.node = $(selector); - this.pollmin = pollmin; - this.pollmax = pollmax; - this.polltimeout = polltimeout; - this._init(); - } - - /** @type {jQuery} The jQuery node for the page region containing the message area. */ - Messagearea.prototype.node = null; - - /** @type {int} The minimum time to poll for messages. */ - Messagearea.prototype.pollmin = null; - - /** @type {int} The maximum time to poll for messages. */ - Messagearea.prototype.pollmax = null; - - /** @type {int} The time used once we have reached the maximum polling time. */ - Messagearea.prototype.polltimeout = null; - - /** - * Initialise the other objects we require. - */ - Messagearea.prototype._init = function() { - new Contacts(this); - new Messages(this); - new Profile(this); - new Tabs(this); - new Search(this); - }; - - /** - * Handles adding a delegate event to the messaging area node. - * - * @param {String} action The action we are listening for - * @param {String} selector The selector for the page we are assigning the action to - * @param {Function} callable The function to call when the event happens - */ - Messagearea.prototype.onDelegateEvent = function(action, selector, callable) { - this.node.on(action, selector, callable); - }; - - /** - * Handles adding a custom event to the messaging area node. - * - * @param {String} action The action we are listening for - * @param {Function} callable The function to call when the event happens - */ - Messagearea.prototype.onCustomEvent = function(action, callable) { - this.node.on(action, callable); - }; - - /** - * Handles triggering an event on the messaging area node. - * - * @param {String} event The selector for the page region containing the message area - * @param {Object=} data The data to pass when we trigger the event - */ - Messagearea.prototype.trigger = function(event, data) { - if (typeof data == 'undefined') { - data = ''; - } - this.node.trigger(event, data); - }; - - /** - * Handles finding a node in the messaging area. - * - * @param {String} selector The selector for the node we are looking for - * @return {jQuery} The node - */ - Messagearea.prototype.find = function(selector) { - return this.node.find(selector); - }; - - /** - * Returns the ID of the user whose message area we are viewing. - * - * @return {int} The user id - */ - Messagearea.prototype.getCurrentUserId = function() { - return this.node.data('userid'); - }; - - /** - * Function to determine if we should be showing contacts initially or messages. - * - * @return {boolean} True to show contacts first, otherwise show messages. - */ - Messagearea.prototype.showContactsFirst = function() { - return !!this.node.data('displaycontacts'); - }; - - return Messagearea; - } -); diff --git a/message/amd/src/message_area_actions.js b/message/amd/src/message_area_actions.js deleted file mode 100644 index 95041834849..00000000000 --- a/message/amd/src/message_area_actions.js +++ /dev/null @@ -1,54 +0,0 @@ -// This file is part of Moodle - http://moodle.org/ -// -// Moodle is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Moodle is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Moodle. If not, see . - -/** - * The module handles any actions we perform on the message area. - * - * @module core_message/message_area_actions - * @package core_message - * @copyright 2016 Mark Nelson - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -define(['core_message/message_area_events'], function(Events) { - - /** @type {Object} The list of selectors for the message area. */ - var SELECTORS = { - MESSAGES: "[data-region='messages']" - }; - - /** - * Actions class. - * - * @param {Messagearea} messageArea The messaging area object. - */ - function Actions(messageArea) { - this.messageArea = messageArea; - } - - /** @type {Messagearea} The messaging area object. */ - Actions.prototype.messageArea = null; - - /** - * Handles when we have selected to delete messages. - */ - Actions.prototype.chooseMessagesToDelete = function() { - // Only fire the event if we are viewing messages. - if (this.messageArea.find(SELECTORS.MESSAGES).length !== 0) { - this.messageArea.trigger(Events.CHOOSEMESSAGESTODELETE); - } - }; - - return Actions; -}); \ No newline at end of file diff --git a/message/amd/src/message_area_contacts.js b/message/amd/src/message_area_contacts.js deleted file mode 100644 index c2eb102e0ac..00000000000 --- a/message/amd/src/message_area_contacts.js +++ /dev/null @@ -1,711 +0,0 @@ -// This file is part of Moodle - http://moodle.org/ -// -// Moodle is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Moodle is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Moodle. If not, see . - -/** - * This module handles the contacts area of the messaging area. - * - * @module core_message/message_area_contacts - * @package core_message - * @copyright 2016 Mark Nelson - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/custom_interaction_events', 'core/str', - 'core_message/message_area_events'], - function($, Ajax, Templates, Notification, CustomEvents, Str, Events) { - - /** @type {Object} The list of selectors for the message area. */ - var SELECTORS = { - CONTACT: "[data-region='contact']", - CONTACTICONBLOCKED: "[data-region='contact-icon-blocked']", - CONTACTS: "[data-region='contacts'][data-region-content='contacts']", - CONTACTSAREA: "[data-region='contacts-area']", - CONVERSATIONS: "[data-region='contacts'][data-region-content='conversations']", - COURSE: "[data-region='course']", - LASTMESSAGETEXT: "[data-region='last-message-text']", - LASTMESSAGEUSER: "[data-region='last-message-user']", - LOADINGICON: '.loading-icon', - MESSAGETEXT: "[data-region='message-text']", - MESSAGINGAREA: "[data-region='messaging-area']", - NOCONTACTS: "[data-region=no-contacts]", - SEARCHBOX: "[data-region='search-box']", - SEARCHRESULTSAREA: "[data-region='search-results-area']", - SEARCHTEXTAREA: "[data-region='search-text-area']", - SELECTEDVIEWCONVERSATION: "[data-action='view-contact-msg'].selected", - SELECTEDVIEWPROFILE: "[data-action='view-contact-profile'].selected", - SHOWMESSAGES: "[data-action='show-messages']", - VIEWCONVERSATION: "[data-action='view-contact-msg']", - VIEWPROFILE: "[data-action='view-contact-profile']" - }; - - /** - * Contacts class. - * - * @param {Messagearea} messageArea The messaging area object. - */ - function Contacts(messageArea) { - this.messageArea = messageArea; - this._init(); - } - - /** @type {Boolean} checks if we are currently loading conversations */ - Contacts.prototype._isLoadingConversations = false; - - /** @type {Boolean} checks if we are currently loading contacts */ - Contacts.prototype._isLoadingContacts = false; - - /** @type {int} the number of contacts displayed */ - Contacts.prototype._numContactsDisplayed = 0; - - /** @type {int} the number of contacts to retrieve */ - Contacts.prototype._numContactsToRetrieve = 20; - - /** @type {int} the number of conversations displayed */ - Contacts.prototype._numConversationsDisplayed = 0; - - /** @type {int} the number of conversations to retrieve */ - Contacts.prototype._numConversationsToRetrieve = 20; - - /** @type {int} the number of chars of the message to show */ - Contacts.prototype._messageLength = 60; - - /** @type {Messagearea} The messaging area object. */ - Contacts.prototype.messageArea = null; - - /** - * Initialise the event listeners. - * - * @private - */ - Contacts.prototype._init = function() { - CustomEvents.define(this.messageArea.node, [ - CustomEvents.events.activate, - CustomEvents.events.down, - CustomEvents.events.up, - ]); - - this.messageArea.onCustomEvent(Events.MESSAGESEARCHCANCELED, this._viewConversations.bind(this)); - this.messageArea.onCustomEvent(Events.USERSSEARCHCANCELED, this._viewContacts.bind(this)); - this.messageArea.onCustomEvent(Events.CONTACTSSELECTED, this._viewContacts.bind(this)); - this.messageArea.onCustomEvent(Events.CONVERSATIONDELETED, this._deleteConversation.bind(this)); - this.messageArea.onCustomEvent(Events.CONVERSATIONSSELECTED, this._viewConversations.bind(this)); - this.messageArea.onCustomEvent(Events.CONTACTSSELECTED, this._viewContacts.bind(this)); - this.messageArea.onCustomEvent(Events.MESSAGESDELETED, this._updateLastMessage.bind(this)); - this.messageArea.onCustomEvent(Events.MESSAGESENT, this._handleMessageSent.bind(this)); - this.messageArea.onCustomEvent(Events.CONTACTREMOVED, function(e, userid) { - this._removeContact(SELECTORS.CONTACTS, userid); - }.bind(this)); - this.messageArea.onCustomEvent(Events.CONTACTADDED, function(e, userid) { - this._addContact(userid); - }.bind(this)); - this.messageArea.onCustomEvent(Events.CONTACTBLOCKED, function(e, userid) { - this._blockContact(userid); - }.bind(this)); - this.messageArea.onCustomEvent(Events.CONTACTUNBLOCKED, function(e, userid) { - this._unblockContact(userid); - }.bind(this)); - this.messageArea.onCustomEvent(Events.CHOOSEMESSAGESTODELETE, - this._startDeleting.bind(this)); - this.messageArea.onCustomEvent(Events.CANCELDELETEMESSAGES, - this._stopDeleting.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.VIEWCONVERSATION, - this._viewConversation.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.VIEWPROFILE, - this._viewContact.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.SHOWMESSAGES, - this._showMessagingArea.bind(this)); - - this.messageArea.onDelegateEvent(CustomEvents.events.up, SELECTORS.CONTACT, - this._selectPreviousContact.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.down, SELECTORS.CONTACT, - this._selectNextContact.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.up, SELECTORS.VIEWCONVERSATION, - this._selectPreviousConversation.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.down, SELECTORS.VIEWCONVERSATION, - this._selectNextConversation.bind(this)); - - this.messageArea.onDelegateEvent(CustomEvents.events.up, SELECTORS.COURSE, this._selectPreviousCourse.bind()); - this.messageArea.onDelegateEvent(CustomEvents.events.down, SELECTORS.COURSE, this._selectNextCourse.bind()); - - this.messageArea.onDelegateEvent('focus', SELECTORS.SEARCHBOX, this._setSearching.bind(this)); - this.messageArea.onDelegateEvent('blur', SELECTORS.SEARCHBOX, this._clearSearching.bind(this)); - - // Now enable the ability to infinitely scroll through conversations and contacts. - CustomEvents.define(this.messageArea.find(SELECTORS.CONVERSATIONS), [ - CustomEvents.events.scrollBottom - ]); - CustomEvents.define(this.messageArea.find(SELECTORS.CONTACTS), [ - CustomEvents.events.scrollBottom - ]); - this.messageArea.onDelegateEvent(CustomEvents.events.scrollBottom, SELECTORS.CONVERSATIONS, - this._loadConversations.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.scrollBottom, SELECTORS.CONTACTS, - this._loadContacts.bind(this)); - - if (!this.messageArea.showContactsFirst()) { - // Set the initial number of conversations to retrieve. Otherwise it will display no conversations. - this._numConversationsDisplayed = 20; - } - }; - - /** - * Turn on deleting. - * - * @private - */ - Contacts.prototype._startDeleting = function() { - this.messageArea.find(SELECTORS.CONTACTSAREA).addClass('editing'); - }; - - /** - * Turn off deleting. - * - * @private - */ - Contacts.prototype._stopDeleting = function() { - this.messageArea.find(SELECTORS.CONTACTSAREA).removeClass('editing'); - }; - - /** - * Handles viewing the list of conversations. - * - * @private - */ - Contacts.prototype._viewConversations = function() { - // If conversations is empty then try load some. - if (this._numConversationsDisplayed === 0) { - this._loadConversations(); - } - - this.messageArea.find(SELECTORS.CONTACTS).hide(); - this.messageArea.find(SELECTORS.CONVERSATIONS).show(); - }; - - /** - * Handles viewing the list of contacts. - * - * @private - */ - Contacts.prototype._viewContacts = function() { - // If contacts is empty then try load some. - if (this._numContactsDisplayed === 0) { - this._loadContacts(); - } - - this.messageArea.find(SELECTORS.CONVERSATIONS).hide(); - this.messageArea.find(SELECTORS.CONTACTS).show(); - }; - - /** - * Handles when a message is sent. - * - * @param {Event} event The message sent event - * @param {int} userid The id of the user who the message was sent to - * @param {String} text The message text - * @private - */ - Contacts.prototype._handleMessageSent = function(event, userid, text) { - // Switch to viewing the conversations. - this._viewConversations(); - // Get the user node. - var user = this._getUserNode(SELECTORS.CONVERSATIONS, userid); - // If the user has not been loaded yet, let's copy the element from contact or search panel to the conversation panel. - if (user.length === 0) { - // Let's clone the data on the contact page. - var usercontact = this._getUserNode(SELECTORS.CONTACTS, userid); - if (usercontact.length === 0) { - // No luck, maybe we sent the message to a user we searched for - check search page. - usercontact = this._getUserNode(SELECTORS.SEARCHRESULTSAREA, userid); - } - if (usercontact.length == 0) { - // Can't do much. - return; - } - user = usercontact.clone(); - // Change the data action attribute. - user.attr('data-action', 'view-contact-msg'); - // Remove the 'no conversations' message. - this.messageArea.find(SELECTORS.CONVERSATIONS + " " + - SELECTORS.NOCONTACTS).remove(); - // Increment the number of conversations displayed. - this._numConversationsDisplayed++; - } - // Move the contact to the top of the list. - user.prependTo(this.messageArea.find(SELECTORS.CONVERSATIONS)); - // Scroll to the top. - this.messageArea.find(SELECTORS.CONVERSATIONS).scrollTop(0); - // Get the new text to show. - this._updateContactText(user, text, true); - // Ensure user is selected. - this._setSelectedUser("[data-userid='" + userid + "']"); - }; - - /** - * Handles loading conversations. - * - * @return {Promise|boolean} The promise resolved when the contact area has been rendered, - * @private - */ - Contacts.prototype._loadConversations = function() { - if (this._isLoadingConversations) { - return false; - } - - // Tell the user we are loading items. - this._isLoadingConversations = true; - - // Keep track of the number of contacts - var numberreceived = 0; - // Add loading icon to the end of the list. - return Templates.render('core/loading', {}).then(function(html, js) { - if (this._numConversationsDisplayed) { - Templates.appendNodeContents(this.messageArea.find(SELECTORS.CONVERSATIONS), - "
" + html + "
", js); - } else { // No conversations, just replace contents. - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.CONVERSATIONS), - "
" + html + "
", js); - } - return this._getItems('core_message_data_for_messagearea_conversations', - this._numConversationsDisplayed, this._numConversationsToRetrieve); - }.bind(this)).then(function(data) { - numberreceived = data.contacts.length; - data.isconversation = true; - return Templates.render('core_message/message_area_contacts', data); - }).then(function(html, js) { - // Remove the loading icon. - this.messageArea.find(SELECTORS.CONVERSATIONS + " " + - SELECTORS.LOADINGICON).remove(); - // Only append data if we got data back. - if (numberreceived > 0) { - // Show the new content. - Templates.appendNodeContents(this.messageArea.find(SELECTORS.CONVERSATIONS), html, js); - // Increment the number of conversations displayed. We increment by the number of conversations we - // asked to retrieve not by the number that was actually retrieved, see MDL-55870. - this._numConversationsDisplayed += this._numConversationsToRetrieve; - } else if (!this._numConversationsDisplayed) { - // If we didn't receive any contacts and there are currently none, then we want to show a message. - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.CONVERSATIONS), html, js); - } - // Mark that we are no longer busy loading data. - this._isLoadingConversations = false; - }.bind(this)).fail(Notification.exception); - }; - - /** - * Handles loading contacts. - * - * @return {Promise|boolean} The promise resolved when the contact area has been rendered - * @private - */ - Contacts.prototype._loadContacts = function() { - if (this._isLoadingContacts) { - return false; - } - - // Tell the user we are loading items. - this._isLoadingContacts = true; - - // Keep track of the number of contacts - var numberreceived = 0; - // Add loading icon to the end of the list. - return Templates.render('core/loading', {}).then(function(html, js) { - if (this._numContactsDisplayed) { - Templates.appendNodeContents(this.messageArea.find(SELECTORS.CONTACTS), - "
" + html + "
", js); - } else { // No contacts, just replace contents. - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.CONTACTS), - "
" + html + "
", js); - } - return this._getItems('core_message_data_for_messagearea_contacts', - this._numContactsDisplayed, this._numContactsToRetrieve); - }.bind(this)).then(function(data) { - numberreceived = data.contacts.length; - data.isconversation = false; - return Templates.render('core_message/message_area_contacts', data); - }).then(function(html, js) { - // Remove the loading icon. - this.messageArea.find(SELECTORS.CONTACTS + " " + - SELECTORS.LOADINGICON).remove(); - // Only append data if we got data back. - if (numberreceived > 0) { - // Show the new content. - Templates.appendNodeContents(this.messageArea.find(SELECTORS.CONTACTS), html, js); - // Increment the number of contacts displayed. - this._numContactsDisplayed += numberreceived; - } else if (!this._numContactsDisplayed) { - // If we didn't receive any contacts and there are currently none, then we want to show a message. - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.CONTACTS), html, js); - } - // Mark that we are no longer busy loading data. - this._isLoadingContacts = false; - }.bind(this)).fail(Notification.exception); - }; - - /** - * Handles viewing a particular conversation. - * - * @param {Event} event - * @private - */ - Contacts.prototype._viewConversation = function(event) { - // Cancel any deletion of messages we may have. - this.messageArea.trigger(Events.CANCELDELETEMESSAGES); - - var userid = $(event.currentTarget).data('userid'); - var messageid = $(event.currentTarget).data('messageid'); - var selector = "[data-userid='" + userid + "']"; - // If we have a specific message id then we did a search and the contact may appear in multiple - // places - we don't want to highlight them all. - if (messageid) { - selector = "[data-messageid='" + messageid + "']"; - } - - this._setSelectedUser(selector); - this.messageArea.trigger(Events.CONVERSATIONSELECTED, userid); - // Don't highlight the contact because the message region has changed. - this.messageArea.find(SELECTORS.SELECTEDVIEWPROFILE).removeClass('selected'); - this._showMessagingArea(); - }; - - /** - * Handles viewing a particular contact. - * - * @param {Event} event - * @private - */ - Contacts.prototype._viewContact = function(event) { - // Cancel any deletion of messages we may have. - this.messageArea.trigger(Events.CANCELDELETEMESSAGES); - - var userid = $(event.currentTarget).data('userid'); - this._setSelectedUser("[data-userid='" + userid + "']"); - this.messageArea.trigger(Events.CONTACTSELECTED, userid); - // Don't highlight the conversation because the message region has changed. - this.messageArea.find(SELECTORS.SELECTEDVIEWCONVERSATION).removeClass('selected'); - this._showMessagingArea(); - }; - - /** - * Handles returning a list of items to display. - * - * @param {String} webservice The web service to call - * @param {int} limitfrom - * @param {int} limitnum - * @return {Promise} The promise resolved when the contact area has been rendered - * @private - */ - Contacts.prototype._getItems = function(webservice, limitfrom, limitnum) { - // Call the web service to return the data we want to view. - var promises = Ajax.call([{ - methodname: webservice, - args: { - userid: this.messageArea.getCurrentUserId(), - limitfrom: limitfrom, - limitnum: limitnum - } - }]); - - return promises[0]; - }; - - /** - * Handles deleting a conversation. - * - * @param {Event} event - * @param {int} userid The user id belonging to the messages we are deleting. - * @private - */ - Contacts.prototype._deleteConversation = function(event, userid) { - // Remove the conversation. - this._removeContact(SELECTORS.CONVERSATIONS, userid); - this._numConversationsDisplayed--; - this._hideMessagingArea(); - // Now we have done all the deletion we can set the flag back to false. - this._stopDeleting(); - }; - - /** - * Handles updating the last message in the contact. - * - * @param {Event} event - * @param {int} userid The user id belonging to the messages we are deleting - * @param {jQuery|null} updatemessage The message we need to update the contact panel with - * @private - */ - Contacts.prototype._updateLastMessage = function(event, userid, updatemessage) { - // Check if the last message needs updating. - if (updatemessage) { - var user = this._getUserNode(SELECTORS.CONVERSATIONS, userid); - var updatemessagetext = updatemessage.find(SELECTORS.MESSAGETEXT).text().trim(); - var sentbyuser = false; - if (updatemessage.data('useridto') == userid) { - // Must have been sent by the currently logged in user. - sentbyuser = true; - } - - this._updateContactText(user, updatemessagetext, sentbyuser); - } - - // Now we have done all the deletion we can set the flag back to false. - this._stopDeleting(); - }; - - /** - * Handles adding a contact to the list. - * - * @private - */ - Contacts.prototype._addContact = function() { - this.messageArea.find(SELECTORS.CONTACTS).empty(); - this._numContactsDisplayed = 0; - this._loadContacts(); - }; - - /** - * Handles removing a contact from the list. - * - * @param {String} selector - * @param {int} userid - * @private - */ - Contacts.prototype._removeContact = function(selector, userid) { - this._getUserNode(selector, userid).remove(); - this._numContactsDisplayed--; - }; - - /** - * Handles marking a contact as blocked on the list. - * - * @param {int} userid - * @private - */ - Contacts.prototype._blockContact = function(userid) { - var user = this._getUserNode(SELECTORS.CONTACTS, userid); - user.find(SELECTORS.CONTACTICONBLOCKED).removeClass('hidden'); - - user = this._getUserNode(SELECTORS.CONVERSATIONS, userid); - user.find(SELECTORS.CONTACTICONBLOCKED).removeClass('hidden'); - - user = this._getUserNode(SELECTORS.SEARCHRESULTSAREA, userid); - user.find(SELECTORS.CONTACTICONBLOCKED).removeClass('hidden'); - }; - - /** - * Handles marking a contact as unblocked on the list. - * - * @param {int} userid - * @private - */ - Contacts.prototype._unblockContact = function(userid) { - var user = this._getUserNode(SELECTORS.CONTACTS, userid); - user.find(SELECTORS.CONTACTICONBLOCKED).addClass('hidden'); - - user = this._getUserNode(SELECTORS.CONVERSATIONS, userid); - user.find(SELECTORS.CONTACTICONBLOCKED).addClass('hidden'); - - user = this._getUserNode(SELECTORS.SEARCHRESULTSAREA, userid); - user.find(SELECTORS.CONTACTICONBLOCKED).addClass('hidden'); - }; - - /** - * Handles retrieving a user node from a list. - * - * @param {String} selector - * @param {int} userid - * @return {jQuery} The user node - * @private - */ - Contacts.prototype._getUserNode = function(selector, userid) { - return this.messageArea.find(selector + " " + SELECTORS.CONTACT + - "[data-userid='" + userid + "']"); - }; - - /** - * Handles selecting a contact in the list. - * - * @param {String} selector - * @private - */ - Contacts.prototype._setSelectedUser = function(selector) { - // Remove the 'selected' class from any other contact. - this.messageArea.find(SELECTORS.CONTACT).removeClass('selected'); - this.messageArea.find(SELECTORS.CONTACT).attr('aria-pressed', false); - // Set the tab for the user to selected. - this.messageArea.find(SELECTORS.CONTACT + selector).addClass('selected'); - this.messageArea.find(SELECTORS.CONTACT + selector).attr('aria-pressed', true); - }; - - /** - * Converts a text message into the text that should be stored in the contact list - * - * @param {String} text - * @return {String} The altered text - */ - Contacts.prototype._getContactText = function(text) { - if (text.length > this._messageLength) { - text = text.substr(0, this._messageLength - 3); - text += '...'; - } - - // Text node prevents script injection through HTML entities. - return document.createTextNode(text); - }; - - /** - * Handles updating the contact text. - * - * @param {jQuery} user The user to update - * @param {String} text The text to update the contact with - * @param {Boolean} sentbyuser Was it sent by the currently logged in user? - * @private - */ - Contacts.prototype._updateContactText = function(user, text, sentbyuser) { - // Get the text we will display on the contact panel. - text = this._getContactText(text); - if (sentbyuser) { - Str.get_string('you', 'message').done(function(string) { - // Ensure we display that the message is from this user. - user.find(SELECTORS.LASTMESSAGEUSER).empty().append(string); - }).always(function() { - user.find(SELECTORS.LASTMESSAGETEXT).empty().append(text); - }); - } else { - user.find(SELECTORS.LASTMESSAGEUSER).empty(); - user.find(SELECTORS.LASTMESSAGETEXT).empty().append(text); - } - }; - - /** - * Shifts focus to the next contact in the list. - * - * @param {event} e The jquery event - * @param {object} data Additional event data - */ - Contacts.prototype._selectNextContact = function(e, data) { - var contact = $(e.target).closest(SELECTORS.CONTACT); - var next = contact.next(); - next.focus(); - - data.originalEvent.preventDefault(); - data.originalEvent.stopPropagation(); - }; - - /** - * Shifts focus to the previous contact in the list. - * - * @param {event} e The jquery event - * @param {object} data Additional event data - */ - Contacts.prototype._selectPreviousContact = function(e, data) { - var contact = $(e.target).closest(SELECTORS.CONTACT); - var previous = contact.prev(); - previous.focus(); - - data.originalEvent.preventDefault(); - data.originalEvent.stopPropagation(); - }; - - /** - * Shifts focus to the next course in the list. - * - * @param {event} e The jquery event - * @param {object} data Additional event data - */ - Contacts.prototype._selectNextCourse = function(e, data) { - var course = $(e.target).closest(SELECTORS.COURSE); - course.next().focus(); - - data.originalEvent.preventDefault(); - data.originalEvent.stopPropagation(); - }; - - /** - * Shifts focus to the previous course in the list. - * - * @param {event} e The jquery event - * @param {object} data Additional event data - */ - Contacts.prototype._selectPreviousCourse = function(e, data) { - var course = $(e.target).closest(SELECTORS.COURSE); - course.prev().focus(); - - data.originalEvent.preventDefault(); - data.originalEvent.stopPropagation(); - }; - - /** - * Shifts focus to the next conversation in the list. - * - * @param {event} e The jquery event - * @param {object} data Additional event data - */ - Contacts.prototype._selectNextConversation = function(e, data) { - var conversation = $(e.target).closest(SELECTORS.VIEWCONVERSATION); - var next = conversation.next(); - next.focus(); - - data.originalEvent.preventDefault(); - data.originalEvent.stopPropagation(); - }; - - /** - * Shifts focus to the previous conversation in the list. - * - * @param {event} e The jquery event - * @param {object} data Additional event data - */ - Contacts.prototype._selectPreviousConversation = function(e, data) { - var conversation = $(e.target).closest(SELECTORS.VIEWCONVERSATION); - var previous = conversation.prev(); - previous.focus(); - - data.originalEvent.preventDefault(); - data.originalEvent.stopPropagation(); - }; - - /** - * Flags the search area as seaching. - */ - Contacts.prototype._setSearching = function() { - $(SELECTORS.SEARCHTEXTAREA).addClass('searching'); - }; - - /** - * Flags the search area as seaching. - */ - Contacts.prototype._clearSearching = function() { - $(SELECTORS.SEARCHTEXTAREA).removeClass('searching'); - }; - - /** - * Make the messaging area visible. - */ - Contacts.prototype._showMessagingArea = function() { - this.messageArea.find(SELECTORS.MESSAGINGAREA) - .removeClass('hide-messages') - .addClass('show-messages'); - }; - - /** - * Hide the messaging area. - */ - Contacts.prototype._hideMessagingArea = function() { - this.messageArea.find(SELECTORS.MESSAGINGAREA) - .removeClass('show-messages') - .addClass('hide-messages'); - }; - - return Contacts; - } -); diff --git a/message/amd/src/message_area_events.js b/message/amd/src/message_area_events.js deleted file mode 100644 index 0ae610d5119..00000000000 --- a/message/amd/src/message_area_events.js +++ /dev/null @@ -1,45 +0,0 @@ -// This file is part of Moodle - http://moodle.org/ -// -// Moodle is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Moodle is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Moodle. If not, see . - -/** - * This module defines the events that are triggered in the message area. - * - * @module core_message/message_area_events - * @package core_message - * @copyright 2016 Mark Nelson - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -define([], function() { - - /** @type {Object} The list of events triggered in the message area. */ - return { - CANCELDELETEMESSAGES: 'cancel-delete-messages', - CHOOSEMESSAGESTODELETE: 'choose-messages-to-delete', - CONTACTADDED: 'contact-added', - CONTACTBLOCKED: 'contact-blocked', - CONTACTREMOVED: 'contact-removed', - CONTACTSELECTED: 'contact-selected', - CONTACTSSELECTED: 'contacts-selected', - CONTACTUNBLOCKED: 'contact-unblocked', - CONVERSATIONDELETED: 'conversation-deleted', - CONVERSATIONSELECTED: 'conversation-selected', - CONVERSATIONSSELECTED: 'conversations-selected', - MESSAGESDELETED: 'messages-deleted', - MESSAGESEARCHCANCELED: 'message-search-canceled', - MESSAGESENT: 'message-sent', - SENDMESSAGE: 'message-send', - USERSSEARCHCANCELED: 'users-search-canceled' - }; -}); \ No newline at end of file diff --git a/message/amd/src/message_area_messages.js b/message/amd/src/message_area_messages.js deleted file mode 100644 index 77e6f50e911..00000000000 --- a/message/amd/src/message_area_messages.js +++ /dev/null @@ -1,876 +0,0 @@ -// This file is part of Moodle - http://moodle.org/ -// -// Moodle is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Moodle is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Moodle. If not, see . - -/** - * This module handles the message area of the messaging area. - * - * @module core_message/message_area_messages - * @package core_message - * @copyright 2016 Mark Nelson - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/custom_interaction_events', - 'core/auto_rows', 'core_message/message_area_actions', 'core/modal_factory', 'core/modal_events', - 'core/str', 'core_message/message_area_events', 'core/backoff_timer'], - function($, Ajax, Templates, Notification, CustomEvents, AutoRows, Actions, ModalFactory, - ModalEvents, Str, Events, BackOffTimer) { - - /** @type {int} The message area default height. */ - var MESSAGES_AREA_DEFAULT_HEIGHT = 500; - - /** @type {int} The response default height. */ - var MESSAGES_RESPONSE_DEFAULT_HEIGHT = 50; - - /** @type {Object} The list of selectors for the message area. */ - var SELECTORS = { - BLOCKTIME: "[data-region='blocktime']", - CANCELDELETEMESSAGES: "[data-action='cancel-delete-messages']", - CONTACT: "[data-region='contact']", - CONVERSATIONS: "[data-region='contacts'][data-region-content='conversations']", - DELETEALLMESSAGES: "[data-action='delete-all-messages']", - DELETEMESSAGES: "[data-action='delete-messages']", - LOADINGICON: '.loading-icon', - MESSAGE: "[data-region='message']", - MESSAGERESPONSE: "[data-region='response']", - MESSAGES: "[data-region='messages']", - MESSAGESAREA: "[data-region='messages-area']", - MESSAGINGAREA: "[data-region='messaging-area']", - SENDMESSAGE: "[data-action='send-message']", - SENDMESSAGETEXT: "[data-region='send-message-txt']", - SHOWCONTACTS: "[data-action='show-contacts']", - STARTDELETEMESSAGES: "[data-action='start-delete-messages']", - }; - - /** @type {int} The number of milliseconds in a second. */ - var MILLISECONDSINSEC = 1000; - - /** - * Messages class. - * - * @param {Messagearea} messageArea The messaging area object. - */ - function Messages(messageArea) { - this.messageArea = messageArea; - this._init(); - } - - /** @type {Boolean} checks if we are sending a message */ - Messages.prototype._isSendingMessage = false; - - /** @type {Boolean} checks if we are currently loading messages */ - Messages.prototype._isLoadingMessages = false; - - /** @type {int} the number of messagess displayed */ - Messages.prototype._numMessagesDisplayed = 0; - - /** @type {array} the messages displayed or about to be displayed on the page */ - Messages.prototype._messageQueue = []; - - /** @type {int} the number of messages to retrieve */ - Messages.prototype._numMessagesToRetrieve = 20; - - /** @type {Modal} the confirmation modal */ - Messages.prototype._confirmationModal = null; - - /** @type {int} the timestamp for the most recent visible message */ - Messages.prototype._latestMessageTimestamp = 0; - - /** @type {BackOffTimer} the backoff timer */ - Messages.prototype._backoffTimer = null; - - /** @type {Messagearea} The messaging area object. */ - Messages.prototype.messageArea = null; - - /** - * Initialise the event listeners. - * - * @private - */ - Messages.prototype._init = function() { - CustomEvents.define(this.messageArea.node, [ - CustomEvents.events.activate, - CustomEvents.events.up, - CustomEvents.events.down, - CustomEvents.events.enter, - ]); - - // We have a responsive media query based on height that reduces this size on screens shorter than 670. - if ($(window).height() <= 670) { - MESSAGES_AREA_DEFAULT_HEIGHT = 400; - } - - AutoRows.init(this.messageArea.node); - - this.messageArea.onCustomEvent(Events.CONVERSATIONSELECTED, this._viewMessages.bind(this)); - this.messageArea.onCustomEvent(Events.SENDMESSAGE, this._viewMessages.bind(this)); - this.messageArea.onCustomEvent(Events.CHOOSEMESSAGESTODELETE, this._chooseMessagesToDelete.bind(this)); - this.messageArea.onCustomEvent(Events.CANCELDELETEMESSAGES, this._hideDeleteAction.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.SENDMESSAGE, - this._sendMessage.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.STARTDELETEMESSAGES, - this._startDeleting.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.DELETEMESSAGES, - this._deleteMessages.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.DELETEALLMESSAGES, - this._deleteAllMessages.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.CANCELDELETEMESSAGES, - this._triggerCancelMessagesToDelete.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.MESSAGE, - this._toggleMessage.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.SHOWCONTACTS, - this._hideMessagingArea.bind(this)); - - this.messageArea.onDelegateEvent(CustomEvents.events.up, SELECTORS.MESSAGE, - this._selectPreviousMessage.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.down, SELECTORS.MESSAGE, - this._selectNextMessage.bind(this)); - - this.messageArea.onDelegateEvent('focus', SELECTORS.SENDMESSAGETEXT, this._setMessaging.bind(this)); - this.messageArea.onDelegateEvent('blur', SELECTORS.SENDMESSAGETEXT, this._clearMessaging.bind(this)); - - $(document).on(AutoRows.events.ROW_CHANGE, this._adjustMessagesAreaHeight.bind(this)); - - // Check if any messages have been displayed on page load. - var messages = this.messageArea.find(SELECTORS.MESSAGES); - if (messages.length) { - this._addScrollEventListener(messages.find(SELECTORS.MESSAGE).length); - this._latestMessageTimestamp = messages.find(SELECTORS.MESSAGE + ':last').data('timecreated'); - } - - // Create a timer to poll the server for new messages. - this._backoffTimer = new BackOffTimer(this._loadNewMessages.bind(this), - BackOffTimer.getIncrementalCallback(this.messageArea.pollmin * MILLISECONDSINSEC, MILLISECONDSINSEC, - this.messageArea.pollmax * MILLISECONDSINSEC, this.messageArea.polltimeout * MILLISECONDSINSEC)); - - // Start the timer. - this._backoffTimer.start(); - }; - - /** - * View the message panel. - * - * @param {Event} event - * @param {int} userid - * @return {Promise} The promise resolved when the messages have been loaded. - * @private - */ - Messages.prototype._viewMessages = function(event, userid) { - // We are viewing another user, or re-loading the panel, so set number of messages displayed to 0. - this._numMessagesDisplayed = 0; - // Stop the existing timer so we can set up the new user's messages. - this._backoffTimer.stop(); - // Reset the latest timestamp when we change the messages view. - this._latestMessageTimestamp = 0; - - // Mark all the messages as read. - var markMessagesAsRead = Ajax.call([{ - methodname: 'core_message_mark_all_messages_as_read', - args: { - useridto: this.messageArea.getCurrentUserId(), - useridfrom: userid - } - }]); - - // Keep track of the number of messages received. - var numberreceived = 0; - // Show loading template. - return Templates.render('core/loading', {}).then(function(html, js) { - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.MESSAGESAREA), html, js); - return markMessagesAsRead[0]; - }.bind(this)).then(function() { - var conversationnode = this.messageArea.find(SELECTORS.CONVERSATIONS + " " + - SELECTORS.CONTACT + "[data-userid='" + userid + "']"); - if (conversationnode.hasClass('unread')) { - // Remove the class. - conversationnode.removeClass('unread'); - // Trigger an event letting the notification popover (and whoever else) know. - $(document).trigger('messagearea:conversationselected', userid); - } - return this._getMessages(userid); - }.bind(this)).then(function(data) { - numberreceived = data.messages.length; - // We have the data - lets render the template with it. - return Templates.render('core_message/message_area_messages_area', data); - }).then(function(html, js) { - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.MESSAGESAREA), html, js); - this._addScrollEventListener(numberreceived); - // Restart the poll timer. - this._backoffTimer.restart(); - this.messageArea.find(SELECTORS.SENDMESSAGETEXT).focus(); - }.bind(this)).fail(Notification.exception); - }; - - /** - * Loads messages while scrolling. - * - * @return {Promise|boolean} The promise resolved when the messages have been loaded. - * @private - */ - Messages.prototype._loadMessages = function() { - if (this._isLoadingMessages) { - return false; - } - - this._isLoadingMessages = true; - - // Keep track of the number of messages received. - var numberreceived = 0; - // Show loading template. - return Templates.render('core/loading', {}).then(function(html, js) { - Templates.prependNodeContents(this.messageArea.find(SELECTORS.MESSAGES), - "
" + html + "
", js); - return this._getMessages(this._getUserId()); - }.bind(this)).then(function(data) { - numberreceived = data.messages.length; - // We have the data - lets render the template with it. - return Templates.render('core_message/message_area_messages', data); - }).then(function(html, js) { - // Remove the loading icon. - this.messageArea.find(SELECTORS.MESSAGES + " " + - SELECTORS.LOADINGICON).remove(); - // Check if we got something to do. - if (numberreceived > 0) { - var newHtml = $('
' + html + '
'); - if (this._hasMatchingBlockTime(this.messageArea.node, newHtml, true)) { - this.messageArea.node.find(SELECTORS.BLOCKTIME + ':first').remove(); - } - // Get height before we add the messages. - var oldheight = this.messageArea.find(SELECTORS.MESSAGES)[0].scrollHeight; - // Show the new content. - Templates.prependNodeContents(this.messageArea.find(SELECTORS.MESSAGES), html, js); - // Get height after we add the messages. - var newheight = this.messageArea.find(SELECTORS.MESSAGES)[0].scrollHeight; - // Make sure scroll bar is at the location before we loaded more messages. - this.messageArea.find(SELECTORS.MESSAGES).scrollTop(newheight - oldheight); - // Increment the number of messages displayed. - this._numMessagesDisplayed += numberreceived; - } - // Mark that we are no longer busy loading data. - this._isLoadingMessages = false; - }.bind(this)).fail(Notification.exception); - }; - - /** - * Loads and renders messages newer than the most recently seen messages. - * - * @return {Promise|boolean} The promise resolved when the messages have been loaded. - * @private - */ - Messages.prototype._loadNewMessages = function() { - if (this._isLoadingMessages) { - return false; - } - - // If we have no user id yet then bail early. - if (!this._getUserId()) { - return false; - } - - this._isLoadingMessages = true; - - // Only scroll the message window if the user hasn't scrolled up. - var shouldScrollBottom = false; - var messages = this.messageArea.find(SELECTORS.MESSAGES); - if (messages.length !== 0) { - var scrollTop = messages.scrollTop(); - var innerHeight = messages.innerHeight(); - var scrollHeight = messages[0].scrollHeight; - - if (scrollTop + innerHeight >= scrollHeight) { - shouldScrollBottom = true; - } - } - - // Keep track of the number of messages received. - return this._getMessages(this._getUserId(), true).then(function(data) { - return this._addMessagesToDom(data.messages, shouldScrollBottom); - }.bind(this)).always(function() { - // Mark that we are no longer busy loading data. - this._isLoadingMessages = false; - }.bind(this)).fail(Notification.exception); - }; - - /** - * Handles returning a list of messages to display. - * - * @param {int} userid - * @param {bool} fromTimestamp Load messages from the latest known timestamp - * @return {Promise} The promise resolved when the contact area has been rendered - * @private - */ - Messages.prototype._getMessages = function(userid, fromTimestamp) { - var args = { - currentuserid: this.messageArea.getCurrentUserId(), - otheruserid: userid, - limitfrom: this._numMessagesDisplayed, - limitnum: this._numMessagesToRetrieve, - newest: true - }; - - // If we're trying to load new messages since the message UI was - // rendered. Used for ajax polling while user is on the message UI. - if (fromTimestamp) { - args.timefrom = this._latestMessageTimestamp; - // Remove limit and offset. We want all new messages. - args.limitfrom = 0; - args.limitnum = 0; - } - - // Call the web service to get our data. - var promises = Ajax.call([{ - methodname: 'core_message_data_for_messagearea_messages', - args: args, - }]); - - // Do stuff when we get data back. - return promises[0].then(function(data) { - var messages = data.messages; - - // Did we get any new messages? - if (messages && messages.length) { - var latestMessage = messages[messages.length - 1]; - - // Update our record of the latest known message for future requests. - if (latestMessage.timecreated > this._latestMessageTimestamp) { - // Next request should be for the second after the most recent message we've seen. - this._latestMessageTimestamp = latestMessage.timecreated + 1; - } - } - - return data; - }.bind(this)).fail(function(ex) { - // Stop the timer if we received an error so that we don't keep spamming the server. - this._backoffTimer.stop(); - Notification.exception(ex); - }.bind(this)); - }; - - /** - * Handles sending a message. - * - * @return {Promise|boolean} The promise resolved once the message has been sent. - * @private - */ - Messages.prototype._sendMessage = function() { - var element = this.messageArea.find(SELECTORS.SENDMESSAGETEXT); - var text = element.val().trim(); - - // Do not do anything if it is empty. - if (text === '') { - return false; - } - - // If we are sending a message, don't do anything, be patient! - if (this._isSendingMessage) { - return false; - } - - // Ok, mark that we are sending a message. - this._isSendingMessage = true; - - // Call the web service to save our message. - var promises = Ajax.call([{ - methodname: 'core_message_send_instant_messages', - args: { - messages: [ - { - touserid: this._getUserId(), - text: text - } - ] - } - }]); - - element.prop('disabled', true); - - // Update the DOM when we get some data back. - return promises[0].then(function(response) { - if (response.length < 0) { - // Even errors should return valid data. - throw new Error('Invalid response'); - } - if (response[0].errormessage) { - throw new Error(response[0].errormessage); - } - // Fire an event to say the message was sent. - this.messageArea.trigger(Events.MESSAGESENT, [this._getUserId(), text]); - // Update the messaging area. - return this._addLastMessageToDom(); - }.bind(this)).then(function() { - // Ok, we are no longer sending a message. - this._isSendingMessage = false; - }.bind(this)).always(function() { - element.prop('disabled', false); - element.focus(); - }).fail(Notification.exception); - }; - - /** - * Handles selecting messages to delete. - * - * @private - */ - Messages.prototype._chooseMessagesToDelete = function() { - this.messageArea.find(SELECTORS.MESSAGESAREA).addClass('editing'); - this.messageArea.find(SELECTORS.MESSAGE) - .attr('role', 'checkbox') - .attr('aria-checked', 'false'); - }; - - /** - * Handles deleting messages. - * - * @private - */ - Messages.prototype._deleteMessages = function() { - var userid = this.messageArea.getCurrentUserId(); - var checkboxes = this.messageArea.find(SELECTORS.MESSAGE + "[aria-checked='true']"); - var requests = []; - var messagestoremove = []; - - // Go through all the checked checkboxes and prepare them for deletion. - checkboxes.each(function(id, element) { - var node = $(element); - var messageid = node.data('messageid'); - var isread = node.data('messageread') ? 1 : 0; - messagestoremove.push(node); - requests.push({ - methodname: 'core_message_delete_message', - args: { - messageid: messageid, - userid: userid, - read: isread - } - }); - }); - if (requests.length > 0) { - $.when(Ajax.call(requests)).then(function() { - // Store the last message on the page, and the last message being deleted. - var updatemessage = null; - var messages = this.messageArea.find(SELECTORS.MESSAGE); - var lastmessage = messages.last(); - var lastremovedmessage = messagestoremove[messagestoremove.length - 1]; - // Remove the messages from the DOM. - $.each(messagestoremove, function(key, message) { - // Remove the message. - message.remove(); - }); - // If the last message was deleted then we need to provide the new last message. - if (lastmessage.data('id') === lastremovedmessage.data('id')) { - updatemessage = this.messageArea.find(SELECTORS.MESSAGE).last(); - } - // Now we have removed all the messages from the DOM lets remove any block times we may need to as well. - $.each(messagestoremove, function(key, message) { - // First - let's make sure there are no more messages in that time block. - var blocktime = message.data('blocktime'); - if (this.messageArea.find(SELECTORS.MESSAGE + - "[data-blocktime='" + blocktime + "']").length === 0) { - this.messageArea.find(SELECTORS.BLOCKTIME + - "[data-blocktime='" + blocktime + "']").remove(); - } - }.bind(this)); - - // If there are no messages at all, then remove conversation panel. - if (this.messageArea.find(SELECTORS.MESSAGE).length === 0) { - this.messageArea.find(SELECTORS.CONVERSATIONS + " " + - SELECTORS.CONTACT + "[data-userid='" + this._getUserId() + "']").remove(); - } - - // Trigger event letting other modules know messages were deleted. - this.messageArea.trigger(Events.MESSAGESDELETED, [this._getUserId(), updatemessage]); - }.bind(this)).catch(Notification.exception); - } else { - // Trigger event letting other modules know messages were deleted. - this.messageArea.trigger(Events.MESSAGESDELETED, this._getUserId()); - } - - // Hide the items responsible for deleting messages. - this._hideDeleteAction(); - }; - - /** - * Handles adding a scrolling event listener. - * - * @param {int} numberreceived The number of messages received - * @private - */ - Messages.prototype._addScrollEventListener = function(numberreceived) { - // Scroll to the bottom. - this._scrollBottom(); - // Set the number of messages displayed. - this._numMessagesDisplayed = numberreceived; - // Now enable the ability to infinitely scroll through messages. - CustomEvents.define(this.messageArea.find(SELECTORS.MESSAGES), [ - CustomEvents.events.scrollTop - ]); - // Assign the event for scrolling. - this.messageArea.onCustomEvent(CustomEvents.events.scrollTop, this._loadMessages.bind(this)); - }; - - /** - * Handles deleting a conversation. - * - * @private - */ - Messages.prototype._deleteAllMessages = function() { - if (this._confirmationModal) { - // Just show the existing modal. - this._confirmationModal.show(); - return; - } - - var stringsPromise = Str.get_strings([ - {key: 'confirm'}, - {key: 'deleteallconfirm', component: 'message'}, - {key: 'delete'} - ]); - var deleteModalPromise = ModalFactory.create( - { - type: ModalFactory.types.SAVE_CANCEL - }, - this.messageArea.find(SELECTORS.DELETEALLMESSAGES) - ); - - $.when(stringsPromise, deleteModalPromise).then(function(s, modal) { - modal.setTitle(s[0]); - modal.setBody(s[1]); - modal.setSaveButtonText(s[2]); - - this._confirmationModal = modal; - // Only delete the conversation if the user agreed in the confirmation modal. - modal.getRoot().on(ModalEvents.save, function() { - var otherUserId = this._getUserId(); - var request = { - methodname: 'core_message_delete_conversation', - args: { - userid: this.messageArea.getCurrentUserId(), - otheruserid: otherUserId - } - }; - - // Delete the conversation. - Ajax.call([request])[0].then(function() { - // Clear the message area. - this.messageArea.find(SELECTORS.MESSAGESAREA).empty(); - // Let the app know a conversation was deleted. - this.messageArea.trigger(Events.CONVERSATIONDELETED, otherUserId); - this._hideDeleteAction(); - }.bind(this)).catch(Notification.exception); - }.bind(this)); - - // Display the confirmation. - modal.show(); - }.bind(this)).catch(Notification.exception); - }; - - /** - * Handles hiding the delete checkboxes and replacing the response area. - * - * @private - */ - Messages.prototype._hideDeleteAction = function() { - this.messageArea.find(SELECTORS.MESSAGE) - .removeAttr('role') - .removeAttr('aria-checked'); - this.messageArea.find(SELECTORS.MESSAGESAREA).removeClass('editing'); - }; - - /** - * Triggers the CANCELDELETEMESSAGES event. - * - * @private - */ - Messages.prototype._triggerCancelMessagesToDelete = function() { - // Trigger event letting other modules know message deletion was canceled. - this.messageArea.trigger(Events.CANCELDELETEMESSAGES); - }; - - /** - * Handles adding messages to the DOM. - * - * @param {array} messages An array of messages to be added to the DOM. - * @param {boolean} shouldScrollBottom True will scroll to the bottom of the message window and show the new messages. - * @return {Promise} The promise resolved when the messages have been added to the DOM. - * @private - */ - Messages.prototype._addMessagesToDom = function(messages, shouldScrollBottom) { - var numberreceived = 0; - var messagesArea = this.messageArea.find(SELECTORS.MESSAGES); - messages = messages.filter(function(message) { - var id = "" + message.id + message.isread; - // If the message is already queued to be rendered, remove from the list of messages. - if (this._messageQueue[id]) { - return false; - } - // Filter out any messages already rendered. - var result = messagesArea.find(SELECTORS.MESSAGE + '[data-id="' + id + '"]'); - // Any message we are rendering should go in the messageQueue. - if (!result.length) { - this._messageQueue[id] = true; - } - return !result.length; - }.bind(this)); - numberreceived = messages.length; - // We have the data - lets render the template with it. - return Templates.render('core_message/message_area_messages', {messages: messages}).then(function(html, js) { - // Check if we got something to do. - if (numberreceived > 0) { - var newHtml = $('
' + html + '
'); - if (this._hasMatchingBlockTime(this.messageArea.node, newHtml, false)) { - newHtml.find(SELECTORS.BLOCKTIME + ':first').remove(); - } - // Show the new content. - Templates.appendNodeContents(this.messageArea.find(SELECTORS.MESSAGES), newHtml, js); - // Scroll the new message into view. - if (shouldScrollBottom) { - this._scrollBottom(); - } - // Increment the number of messages displayed. - this._numMessagesDisplayed += numberreceived; - // Reset the poll timer because the user may be active. - this._backoffTimer.restart(); - } - }.bind(this)); - }; - - /** - * Handles adding the last message to the DOM. - * - * @return {Promise} The promise resolved when the message has been added to the DOM. - * @private - */ - Messages.prototype._addLastMessageToDom = function() { - // Call the web service to return how the message should look. - var promises = Ajax.call([{ - methodname: 'core_message_data_for_messagearea_get_most_recent_message', - args: { - currentuserid: this.messageArea.getCurrentUserId(), - otheruserid: this._getUserId() - } - }]); - - // Add the message. - return promises[0].then(function(data) { - return this._addMessagesToDom([data], true); - }.bind(this)).always(function() { - // Empty the response text area.text - this.messageArea.find(SELECTORS.SENDMESSAGETEXT).val('').trigger('input'); - }.bind(this)).fail(Notification.exception); - }; - - /** - * Returns the ID of the other user in the conversation. - * - * @return {int} The user id - * @private - */ - Messages.prototype._getUserId = function() { - return this.messageArea.find(SELECTORS.MESSAGES).data('userid'); - }; - - /** - * Scrolls to the bottom of the messages. - * - * @private - */ - Messages.prototype._scrollBottom = function() { - // Scroll to the bottom. - var messages = this.messageArea.find(SELECTORS.MESSAGES); - if (messages.length !== 0) { - messages.scrollTop(messages[0].scrollHeight); - } - }; - - /** - * Select the previous message in the list. - * - * @param {event} e The jquery event - * @param {object} data Extra event data - * @private - */ - Messages.prototype._selectPreviousMessage = function(e, data) { - var currentMessage = $(e.target).closest(SELECTORS.MESSAGE); - - do { - currentMessage = currentMessage.prev(); - } while (currentMessage.length && !currentMessage.is(SELECTORS.MESSAGE)); - - currentMessage.focus(); - - data.originalEvent.preventDefault(); - data.originalEvent.stopPropagation(); - }; - - /** - * Select the next message in the list. - * - * @param {event} e The jquery event - * @param {object} data Extra event data - * @private - */ - Messages.prototype._selectNextMessage = function(e, data) { - var currentMessage = $(e.target).closest(SELECTORS.MESSAGE); - - do { - currentMessage = currentMessage.next(); - } while (currentMessage.length && !currentMessage.is(SELECTORS.MESSAGE)); - - currentMessage.focus(); - - data.originalEvent.preventDefault(); - data.originalEvent.stopPropagation(); - }; - - /** - * Flag the response area as messaging. - * - * @param {event} e The jquery event - * @private - */ - Messages.prototype._setMessaging = function(e) { - $(e.target).closest(SELECTORS.MESSAGERESPONSE).addClass('messaging'); - }; - - /** - * Clear the response area as messaging flag. - * - * @param {event} e The jquery event - * @private - */ - Messages.prototype._clearMessaging = function(e) { - $(e.target).closest(SELECTORS.MESSAGERESPONSE).removeClass('messaging'); - }; - - /** - * Turn on delete message mode. - * - * @param {event} e The jquery event - * @private - */ - Messages.prototype._startDeleting = function(e) { - var actions = new Actions(this.messageArea); - actions.chooseMessagesToDelete(); - - e.preventDefault(); - }; - - /** - * Check if the message area is in editing mode. - * - * @return {bool} - * @private - */ - Messages.prototype._isEditing = function() { - return this.messageArea.find(SELECTORS.MESSAGESAREA).hasClass('editing'); - }; - - /** - * Check or uncheck the message if the message area is in editing mode. - * - * @param {event} e The jquery event - * @private - */ - Messages.prototype._toggleMessage = function(e) { - if (!this._isEditing()) { - return; - } - - var message = $(e.target).closest(SELECTORS.MESSAGE); - - if (message.attr('aria-checked') === 'true') { - message.attr('aria-checked', 'false'); - } else { - message.attr('aria-checked', 'true'); - } - }; - - /** - * Adjust the height of the messages area to match the changed height of - * the response area. - * - * @private - */ - Messages.prototype._adjustMessagesAreaHeight = function() { - var messagesArea = this.messageArea.find(SELECTORS.MESSAGES); - var messagesResponse = this.messageArea.find(SELECTORS.MESSAGERESPONSE); - - var currentMessageResponseHeight = messagesResponse.outerHeight(); - var diffResponseHeight = currentMessageResponseHeight - MESSAGES_RESPONSE_DEFAULT_HEIGHT; - var newMessagesAreaHeight = MESSAGES_AREA_DEFAULT_HEIGHT - diffResponseHeight; - - messagesArea.outerHeight(newMessagesAreaHeight); - }; - - /** - * Handle the event that triggers sending a message from the messages area. - * - * @param {event} e The jquery event - * @param {object} data Additional event data - * @private - */ - Messages.prototype._sendMessageHandler = function(e, data) { - data.originalEvent.preventDefault(); - - this._sendMessage(); - }; - - /** - * Hide the messaging area. This only applies on smaller screen resolutions. - * - * @private - */ - Messages.prototype._hideMessagingArea = function() { - this.messageArea.find(SELECTORS.MESSAGINGAREA) - .removeClass('show-messages') - .addClass('hide-messages'); - }; - - /** - * Checks if a day separator needs to be removed. - * - * Example - scrolling up and loading previous messages that belong to the - * same day as the last message that was previously shown, meaning we can - * remove the original separator. - * - * @param {jQuery} domHtml The HTML in the DOM. - * @param {jQuery} newHtml The HTML to compare to the DOM - * @param {boolean} loadingPreviousMessages Are we loading previous messages? - * @return {boolean} - * @private - */ - Messages.prototype._hasMatchingBlockTime = function(domHtml, newHtml, loadingPreviousMessages) { - var blockTime, blockTimePos, newBlockTime, newBlockTimePos; - - if (loadingPreviousMessages) { - blockTimePos = ':first'; - newBlockTimePos = ':last'; - } else { - blockTimePos = ':last'; - newBlockTimePos = ':first'; - } - - blockTime = domHtml.find(SELECTORS.BLOCKTIME + blockTimePos); - newBlockTime = newHtml.find(SELECTORS.BLOCKTIME + newBlockTimePos); - - if (blockTime.length && newBlockTime.length) { - return blockTime.data('blocktime') == newBlockTime.data('blocktime'); - } - - return false; - }; - - return Messages; - } -); diff --git a/message/amd/src/message_area_profile.js b/message/amd/src/message_area_profile.js deleted file mode 100644 index eb73dcb5326..00000000000 --- a/message/amd/src/message_area_profile.js +++ /dev/null @@ -1,304 +0,0 @@ -// This file is part of Moodle - http://moodle.org/ -// -// Moodle is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Moodle is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Moodle. If not, see . - -/** - * This module handles the profile area of the messaging area. - * - * @module core_message/message_area_profile - * @package core_message - * @copyright 2016 Mark Nelson - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str', 'core/config', - 'core/custom_interaction_events', 'core_message/message_area_events'], - function($, Ajax, Templates, Notification, Str, Config, CustomEvents, Events) { - - /** @type {Object} The list of selectors for the message area. */ - var SELECTORS = { - PROFILE: "[data-region='profile']", - PROFILEADDCONTACT: "[data-action='profile-add-contact']", - PROFILEBLOCKCONTACT: "[data-action='profile-block-contact']", - PROFILEREMOVECONTACT: "[data-action='profile-remove-contact']", - PROFILESENDMESSAGE: "[data-action='profile-send-message']", - PROFILEUNBLOCKCONTACT: "[data-action='profile-unblock-contact']", - PROFILEVIEW: "[data-action='profile-view']", - SHOWCONTACTS: "[data-action='show-contacts']", - MESSAGESAREA: "[data-region='messages-area']", - MESSAGINGAREA: "[data-region='messaging-area']" - }; - - /** - * Profile class. - * - * @param {Messagearea} messageArea The messaging area object. - */ - function Profile(messageArea) { - this.messageArea = messageArea; - this._init(); - } - - /** @type {Messagearea} The messaging area object. */ - Profile.prototype.messageArea = null; - - /** - * Initialise the event listeners. - * - * @private - */ - Profile.prototype._init = function() { - CustomEvents.define(this.messageArea.node, [ - CustomEvents.events.activate - ]); - - this.messageArea.onCustomEvent(Events.CONTACTSELECTED, this._viewProfile.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.PROFILEVIEW, - function(e, data) { - this._viewFullProfile(); - data.originalEvent.preventDefault(); - }.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.PROFILESENDMESSAGE, - function(e, data) { - this._sendMessage(); - data.originalEvent.preventDefault(); - }.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.PROFILEUNBLOCKCONTACT, - function(e, data) { - this._unblockContact(); - data.originalEvent.preventDefault(); - }.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.PROFILEBLOCKCONTACT, - function(e, data) { - this._blockContact(); - data.originalEvent.preventDefault(); - }.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.PROFILEADDCONTACT, - function(e, data) { - this._addContact(); - data.originalEvent.preventDefault(); - }.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.PROFILEREMOVECONTACT, - function(e, data) { - this._removeContact(); - data.originalEvent.preventDefault(); - }.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.SHOWCONTACTS, - this._hideMessagingArea.bind(this)); - }; - - /** - * Handles viewing the profile. - * - * @param {Event} event - * @param {int} userid - * @return {Promise} The promise resolved when the profile has been rendered - * @private - */ - Profile.prototype._viewProfile = function(event, userid) { - // Show loading template. - Templates.render('core/loading', {}).done(function(html, js) { - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.MESSAGESAREA), html, js); - }.bind(this)); - - // Call the web service to return the profile. - var promises = Ajax.call([{ - methodname: 'core_message_data_for_messagearea_get_profile', - args: { - currentuserid: this.messageArea.getCurrentUserId(), - otheruserid: userid - } - }]); - - // Show the profile. - return promises[0].then(function(data) { - return Templates.render('core_message/message_area_profile', data); - }).then(function(html, js) { - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.MESSAGESAREA), html, js); - }.bind(this)).fail(Notification.exception); - }; - - /** - * Handles viewing the user's full profile. - * - * @private - */ - Profile.prototype._viewFullProfile = function() { - window.location.href = Config.wwwroot + '/user/profile.php?id=' + this._getUserId(); - }; - - /** - * Handles viewing the messages with the user. - * - * @private - */ - Profile.prototype._sendMessage = function() { - this.messageArea.trigger(Events.SENDMESSAGE, this._getUserId()); - }; - - /** - * Handles blocking the contact. - * - * @return {Promise} The promise resolved when the contact has been blocked - * @private - */ - Profile.prototype._blockContact = function() { - var action = this._performAction('core_message_block_user', 'unblockcontact', 'profile-block-contact', - 'profile-unblock-contact', ''); - return action.then(function() { - this.messageArea.trigger(Events.CONTACTBLOCKED, this._getUserId()); - }.bind(this)); - }; - - /** - * Handles unblocking the contact. - * - * @return {Promise} The promise resolved when the contact has been unblocked - * @private - */ - Profile.prototype._unblockContact = function() { - var action = this._performAction('core_message_unblock_user', 'blockcontact', 'profile-unblock-contact', - 'profile-block-contact', 'danger'); - return action.then(function() { - this.messageArea.trigger(Events.CONTACTUNBLOCKED, this._getUserId()); - }.bind(this)); - }; - - /** - * Handles adding the contact. - * - * @return {Promise} The promise resolved when the contact has been added - * @private - */ - Profile.prototype._addContact = function() { - var action = this._performAction('core_message_create_contact_request', 'removecontact', 'profile-add-contact', - 'profile-remove-contact', 'danger'); - return action.then(function() { - this.messageArea.trigger(Events.CONTACTADDED, this._getUserId()); - }.bind(this)); - }; - - /** - * Handles removing the contact. - * - * @return {Promise} The promise resolved when the contact has been removed - * @private - */ - Profile.prototype._removeContact = function() { - var action = this._performAction('core_message_delete_contacts', 'addcontact', 'profile-remove-contact', - 'profile-add-contact', ''); - return action.then(function() { - this.messageArea.trigger(Events.CONTACTREMOVED, this._getUserId()); - }.bind(this)); - }; - - /** - * Helper function to perform actions on the profile page. - * - * @param {String} service The web service to call. - * @param {String} string The string to change the button value to - * @param {String} oldaction The data-action of the button - * @param {string} newaction The data-action to change the button to - * @param {String} newclass The CSS class we want to add - * @return {Promise} The promise resolved when the action has been performed - * @private - */ - Profile.prototype._performAction = function(service, string, oldaction, newaction, newclass) { - // This is a temporary hack as we are getting rid of this UI. - var userargs = ''; - switch (service) { - case 'core_message_block_user': - userargs = { - userid: this.messageArea.getCurrentUserId(), - blockeduserid: this._getUserId() - }; - break; - case 'core_message_unblock_user': - userargs = { - userid: this.messageArea.getCurrentUserId(), - unblockeduserid: this._getUserId() - }; - break; - case 'core_message_create_contact_request': - userargs = { - userid: this.messageArea.getCurrentUserId(), - requesteduserid: this._getUserId() - }; - break; - default: - userargs = { - userid: this.messageArea.getCurrentUserId(), - userids: [ - this._getUserId() - ] - }; - } - - - var promises = Ajax.call([{ - methodname: service, - args: userargs - }]); - - return promises[0].then(function() { - return Str.get_string(string, 'message'); - }).then(function(s) { - this._changeText(s, oldaction, newaction, newclass); - }.bind(this)).fail(Notification.exception); - }; - - /** - * Changes the text in the profile area. - * - * @param {String} text The string to change the button value to - * @param {string} oldaction The data-action of the button - * @param {string} newaction The data-action to change the button to - * @param {String} newclass The CSS class we want to add - * @private - */ - Profile.prototype._changeText = function(text, oldaction, newaction, newclass) { - var anchor = this.messageArea.find("[data-action='" + oldaction + "']"); - // Change the text. - anchor.text(text); - // Remove any class. - anchor.removeClass(); - // Add the class if there is one. - if (newclass) { - anchor.addClass(newclass); - } - - anchor.attr('data-action', newaction); - }; - - /** - * Returns the ID of the user whos profile we are viewing. - * - * @return {int} The user ID - * @private - */ - Profile.prototype._getUserId = function() { - return this.messageArea.find(SELECTORS.PROFILE).data('userid'); - }; - - /** - * Hide the messaging area. This only applies on smaller screen resolutions. - */ - Profile.prototype._hideMessagingArea = function() { - this.messageArea.find(SELECTORS.MESSAGINGAREA) - .removeClass('show-messages') - .addClass('hide-messages'); - }; - - return Profile; - } -); diff --git a/message/amd/src/message_area_search.js b/message/amd/src/message_area_search.js deleted file mode 100644 index 46960d7a7d8..00000000000 --- a/message/amd/src/message_area_search.js +++ /dev/null @@ -1,425 +0,0 @@ -// This file is part of Moodle - http://moodle.org/ -// -// Moodle is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Moodle is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Moodle. If not, see . - -/** - * The module handles searching contacts. - * - * @module core_message/message_area_search - * @package core_message - * @copyright 2016 Mark Nelson - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -define(['jquery', 'core/ajax', 'core/templates', 'core/notification', 'core/str', 'core/custom_interaction_events', - 'core_message/message_area_events'], - function($, Ajax, Templates, Notification, Str, CustomEvents, Events) { - - /** @type {Object} The list of selectors for the message area. */ - var SELECTORS = { - CONTACTS: "[data-region='contacts'][data-region-content='contacts']", - CONTACTSAREA: "[data-region='contacts-area']", - CONVERSATIONS: "[data-region='contacts'][data-region-content='conversations']", - DELETESEARCHFILTER: "[data-region='search-filter-area']", - LOADINGICON: '.loading-icon', - SEARCHBOX: "[data-region='search-box']", - SEARCHFILTER: "[data-region='search-filter']", - SEARCHFILTERAREA: "[data-region='search-filter-area']", - SEARCHRESULTSAREA: "[data-region='search-results-area']", - SEARCHTEXTAREA: "[data-region='search-text-area']", - SEARCHUSERSINCOURSE: "[data-action='search-users-in-course']", - }; - - /** - * Search class. - * - * @param {Messagearea} messageArea The messaging area object. - */ - function Search(messageArea) { - this.messageArea = messageArea; - this._init(); - } - - /** @type {Messagearea} The messaging area object. */ - Search.prototype.messageArea = null; - - /** @type {String} The area we are searching in. */ - Search.prototype._searchArea = null; - - /** @type {String} The id of the course we are searching in (if any). */ - Search.prototype._courseid = null; - - /** @type {Boolean} checks if we are currently loading */ - Search.prototype._isLoading = false; - - /** @type {String} The number of messages displayed. */ - Search.prototype._numMessagesDisplayed = 0; - - /** @type {String} The number of messages to retrieve. */ - Search.prototype._numMessagesToRetrieve = 20; - - /** @type {String} The number of users displayed. */ - Search.prototype._numUsersDisplayed = 0; - - /** @type {String} The number of users to retrieve. */ - Search.prototype._numUsersToRetrieve = 20; - - /** @type {Array} The type of available search areas. **/ - Search.prototype._searchAreas = { - MESSAGES: 'messages', - USERS: 'users', - USERSINCOURSE: 'usersincourse' - }; - - /** @type {int} The timeout before performing an ajax search */ - Search.prototype._requestTimeout = null; - - /** - * Initialise the event listeners. - * - * @private - */ - Search.prototype._init = function() { - // Handle searching for text. - this.messageArea.find(SELECTORS.SEARCHTEXTAREA).on('input', this._searchRequest.bind(this)); - - // Handle clicking on a course in the list of users. - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.SEARCHUSERSINCOURSE, function(e) { - this._setFilter($(e.currentTarget).html()); - this._setPlaceholderText('searchforuser'); - this._clearSearchArea(); - this._searchArea = this._searchAreas.USERSINCOURSE; - this._courseid = $(e.currentTarget).data('courseid'); - this._searchUsersInCourse(); - this.messageArea.find(SELECTORS.SEARCHBOX).focus(); - }.bind(this)); - - // Handle deleting the search filter. - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.DELETESEARCHFILTER, function() { - this._hideSearchResults(); - // Filter has been removed, so we don't want to be searching in a course anymore. - this._searchArea = this._searchAreas.USERS; - this._setPlaceholderText('searchforuserorcourse'); - // Go back the contacts. - this.messageArea.trigger(Events.USERSSEARCHCANCELED); - this.messageArea.find(SELECTORS.SEARCHBOX).focus(); - }.bind(this)); - - // Handle events that occur outside this module. - this.messageArea.onCustomEvent(Events.CONVERSATIONSSELECTED, function() { - this._hideSearchResults(); - this._searchArea = this._searchAreas.MESSAGES; - this._setPlaceholderText('searchmessages'); - }.bind(this)); - this.messageArea.onCustomEvent(Events.CONTACTSSELECTED, function() { - this._hideSearchResults(); - this._searchArea = this._searchAreas.USERS; - this._setPlaceholderText('searchforuserorcourse'); - }.bind(this)); - this.messageArea.onCustomEvent(Events.MESSAGESENT, function() { - this._hideSearchResults(); - this._searchArea = this._searchAreas.MESSAGES; - this._setPlaceholderText('searchmessages'); - }.bind(this)); - - // Event listeners for scrolling through messages and users in courses. - CustomEvents.define(this.messageArea.find(SELECTORS.SEARCHRESULTSAREA), [ - CustomEvents.events.scrollBottom - ]); - this.messageArea.onDelegateEvent(CustomEvents.events.scrollBottom, SELECTORS.SEARCHRESULTSAREA, - function() { - if (this._searchArea == this._searchAreas.MESSAGES) { - this._searchMessages(); - } else if (this._searchArea == this._searchAreas.USERSINCOURSE) { - this._searchUsersInCourse(); - } - }.bind(this) - ); - - // Set the initial search area. - this._searchArea = (this.messageArea.showContactsFirst()) ? this._searchAreas.USERS : this._searchAreas.MESSAGES; - }; - - /** - * Handles when search requests are sent. - * - * @private - */ - Search.prototype._searchRequest = function() { - var str = this.messageArea.find(SELECTORS.SEARCHTEXTAREA + ' input').val(); - - if (this._requestTimeout) { - clearTimeout(this._requestTimeout); - } - - if (str.trim() === '') { - // If nothing we being searched then we need to display the usual data. - if (this._searchArea == this._searchAreas.MESSAGES) { - this._hideSearchResults(); - this.messageArea.trigger(Events.MESSAGESEARCHCANCELED); - } else if (this._searchArea == this._searchAreas.USERS) { - this._hideSearchResults(); - this.messageArea.trigger(Events.USERSSEARCHCANCELED); - } else if (this._searchArea == this._searchAreas.USERSINCOURSE) { - // We are still searching in a course, so need to list all the users again. - this._clearSearchArea(); - this._searchUsersInCourse(); - } - return; - } - - this.messageArea.find(SELECTORS.CONVERSATIONS).hide(); - this.messageArea.find(SELECTORS.CONTACTS).hide(); - this.messageArea.find(SELECTORS.SEARCHRESULTSAREA).show(); - - if (this._searchArea == this._searchAreas.MESSAGES) { - this._requestTimeout = setTimeout(function() { - this._clearSearchArea(); - this._numMessagesDisplayed = 0; - this._searchMessages(); - }.bind(this), 300); - } else if (this._searchArea == this._searchAreas.USERSINCOURSE) { - this._requestTimeout = setTimeout(function() { - this._clearSearchArea(); - this._numUsersDisplayed = 0; - this._searchUsersInCourse(); - }.bind(this), 300); - } else { // Must be searching for users and courses - this._requestTimeout = setTimeout(function() { - this._clearSearchArea(); - this._numUsersDisplayed = 0; - this._searchUsers(); - }.bind(this), 300); - } - }; - - /** - * Handles searching for messages. - * - * @private - * @return {Promise|boolean} The promise resolved when the search area has been rendered - */ - Search.prototype._searchMessages = function() { - if (this._isLoading) { - return false; - } - - var str = this.messageArea.find(SELECTORS.SEARCHBOX).val(); - - // Tell the user we are loading items. - this._isLoading = true; - - // Call the web service to get our data. - var promises = Ajax.call([{ - methodname: 'core_message_data_for_messagearea_search_messages', - args: { - userid: this.messageArea.getCurrentUserId(), - search: str, - limitfrom: this._numMessagesDisplayed, - limitnum: this._numMessagesToRetrieve - } - }]); - - // Keep track of the number of messages - var numberreceived = 0; - // Add loading icon to the end of the list. - return Templates.render('core/loading', {}).then(function(html, js) { - Templates.appendNodeContents(this.messageArea.find(SELECTORS.SEARCHRESULTSAREA), - "
" + html + "
", js); - return promises[0]; - }.bind(this)).then(function(data) { - numberreceived = data.contacts.length; - return Templates.render('core_message/message_area_message_search_results', data); - }).then(function(html, js) { - // Remove the loading icon. - this.messageArea.find(SELECTORS.SEARCHRESULTSAREA + " " + - SELECTORS.LOADINGICON).remove(); - // Only append data if we got data back. - if (numberreceived > 0) { - // Show the new content. - Templates.appendNodeContents(this.messageArea.find(SELECTORS.SEARCHRESULTSAREA), html, js); - // Increment the number of contacts displayed. - this._numMessagesDisplayed += numberreceived; - } else if (this._numMessagesDisplayed == 0) { // Must have nothing to begin with. - // Replace the new content. - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.SEARCHRESULTSAREA), html, js); - } - // Mark that we are no longer busy loading data. - this._isLoading = false; - }.bind(this)).fail(Notification.exception); - }; - - /** - * Handles searching for users. - * - * @private - * @return {Promise} The promise resolved when the search area has been rendered - */ - Search.prototype._searchUsers = function() { - var str = this.messageArea.find(SELECTORS.SEARCHBOX).val(); - - // Call the web service to get our data. - var promises = Ajax.call([{ - methodname: 'core_message_data_for_messagearea_search_users', - args: { - userid: this.messageArea.getCurrentUserId(), - search: str, - limitnum: this._numUsersToRetrieve - } - }]); - - // Perform the search and replace the content. - return Templates.render('core/loading', {}).then(function(html, js) { - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.SEARCHRESULTSAREA), - "
" + html + "
", js); - return promises[0]; - }.bind(this)).then(function(data) { - if (data.contacts.length > 0) { - data.hascontacts = true; - } - if (data.courses.length > 0) { - data.hascourses = true; - } - if (data.noncontacts.length > 0) { - data.hasnoncontacts = true; - } - return Templates.render('core_message/message_area_user_search_results', data); - }).then(function(html, js) { - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.SEARCHRESULTSAREA), html, js); - }.bind(this)).fail(Notification.exception); - }; - - /** - * Handles searching for users in a course. - * - * @private - * @return {Promise|boolean} The promise resolved when the search area has been rendered - */ - Search.prototype._searchUsersInCourse = function() { - if (this._isLoading) { - return false; - } - - var str = this.messageArea.find(SELECTORS.SEARCHBOX).val(); - - // Tell the user we are loading items. - this._isLoading = true; - - // Call the web service to get our data. - var promises = Ajax.call([{ - methodname: 'core_message_data_for_messagearea_search_users_in_course', - args: { - userid: this.messageArea.getCurrentUserId(), - courseid: this._courseid, - search: str, - limitfrom: this._numUsersDisplayed, - limitnum: this._numUsersToRetrieve - } - }]); - - // Keep track of the number of contacts - var numberreceived = 0; - // Add loading icon to the end of the list. - return Templates.render('core/loading', {}).then(function(html, js) { - Templates.appendNodeContents(this.messageArea.find(SELECTORS.SEARCHRESULTSAREA), - "
" + html + "
", js); - return promises[0]; - }.bind(this)).then(function(data) { - numberreceived = data.contacts.length; - if (numberreceived > 0) { - data.hascontacts = true; - } - return Templates.render('core_message/message_area_user_search_results', data); - }).then(function(html, js) { - // Remove the loading icon. - this.messageArea.find(SELECTORS.SEARCHRESULTSAREA + " " + - SELECTORS.LOADINGICON).remove(); - // Only append data if we got data back. - if (numberreceived > 0) { - // Show the new content. - Templates.appendNodeContents(this.messageArea.find(SELECTORS.SEARCHRESULTSAREA), html, js); - // Increment the number of contacts displayed. - this._numUsersDisplayed += numberreceived; - } else if (this._numUsersDisplayed == 0) { // Must have nothing to begin with. - // Replace the new content. - Templates.replaceNodeContents(this.messageArea.find(SELECTORS.SEARCHRESULTSAREA), html, js); - } - // Mark that we are no longer busy loading data. - this._isLoading = false; - }.bind(this)).fail(Notification.exception); - }; - - /** - * Sets placeholder text for search input. - * - * @private - * @param {String} text The placeholder text - * @return {Promise} The promise resolved when the placeholder text has been set - */ - Search.prototype._setPlaceholderText = function(text) { - return Str.get_string(text, 'message').then(function(s) { - this.messageArea.find(SELECTORS.SEARCHTEXTAREA + ' input').attr('placeholder', s); - }.bind(this)); - }; - - /** - * Sets filter for search input. - * - * @private - * @param {String} text The filter text - */ - Search.prototype._setFilter = function(text) { - this.messageArea.find(SELECTORS.SEARCHBOX).val(''); - this.messageArea.find(SELECTORS.CONTACTSAREA).addClass('searchfilter'); - this.messageArea.find(SELECTORS.SEARCHFILTERAREA).show(); - this.messageArea.find(SELECTORS.SEARCHFILTER).html(text); - Str.get_string('removecoursefilter', 'message', text).then(function(languagestring) { - this.messageArea.find(SELECTORS.SEARCHFILTERAREA).attr('aria-label', languagestring); - }.bind(this)).catch(Notification.exception); - }; - - /** - * Hides filter for search input. - * - * @private - */ - Search.prototype._clearFilters = function() { - this.messageArea.find(SELECTORS.CONTACTSAREA).removeClass('searchfilter'); - this.messageArea.find(SELECTORS.SEARCHFILTER).empty(); - this.messageArea.find(SELECTORS.SEARCHFILTERAREA).hide(); - this.messageArea.find(SELECTORS.SEARCHFILTERAREA).removeAttr('aria-label'); - }; - - /** - * Handles clearing the search area. - * - * @private - */ - Search.prototype._clearSearchArea = function() { - this.messageArea.find(SELECTORS.SEARCHRESULTSAREA).empty(); - }; - - /** - * Handles hiding the search area. - * - * @private - */ - Search.prototype._hideSearchResults = function() { - this._clearFilters(); - this.messageArea.find(SELECTORS.SEARCHTEXTAREA + ' input').val(''); - this._clearSearchArea(); - this.messageArea.find(SELECTORS.SEARCHRESULTSAREA).hide(); - }; - - return Search; -}); diff --git a/message/amd/src/message_area_tabs.js b/message/amd/src/message_area_tabs.js deleted file mode 100644 index b0bcca8fffc..00000000000 --- a/message/amd/src/message_area_tabs.js +++ /dev/null @@ -1,161 +0,0 @@ -// This file is part of Moodle - http://moodle.org/ -// -// Moodle is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Moodle is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Moodle. If not, see . - -/** - * This module handles the tabs of the messaging area. - * - * @module core_message/message_area_tabs - * @package core_message - * @copyright 2016 Mark Nelson - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -define(['core/custom_interaction_events', 'core_message/message_area_events'], function(CustomEvents, Events) { - - /** @type {Object} The list of selectors for the message area. */ - var SELECTORS = { - ACTIVECONTACTSTAB: "[data-region='contacts-area'] [role='tab'][aria-selected='true']", - CONTACTSPANELS: "[data-region='contacts']", - VIEWCONTACTS: "[data-action='contacts-view']", - VIEWCONVERSATIONS: "[data-action='conversations-view']" - }; - - /** - * Tabs class. - * - * @param {Messagearea} messageArea The messaging area object. - */ - function Tabs(messageArea) { - this.messageArea = messageArea; - this._init(); - } - - /** @type {Messagearea} The messaging area object. */ - Tabs.prototype.messageArea = null; - - /** - * Initialise the event listeners. - * - * @private - */ - Tabs.prototype._init = function() { - CustomEvents.define(this.messageArea.node, [ - CustomEvents.events.activate, - CustomEvents.events.up, - CustomEvents.events.down, - CustomEvents.events.next, - CustomEvents.events.previous, - CustomEvents.events.ctrlPageUp, - CustomEvents.events.ctrlPageDown, - ]); - - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.VIEWCONVERSATIONS, - this._viewConversations.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.activate, SELECTORS.VIEWCONTACTS, - this._viewContacts.bind(this)); - - // Change to the other tab if any arrow keys are pressed, since there are only two tabs. - this.messageArea.onDelegateEvent(CustomEvents.events.up, SELECTORS.VIEWCONVERSATIONS, - this._toggleTabs.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.down, SELECTORS.VIEWCONVERSATIONS, - this._toggleTabs.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.next, SELECTORS.VIEWCONVERSATIONS, - this._toggleTabs.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.previous, SELECTORS.VIEWCONVERSATIONS, - this._toggleTabs.bind(this)); - // Change to the other tab if any arrow keys are pressed, since there are only two tabs. - this.messageArea.onDelegateEvent(CustomEvents.events.up, SELECTORS.VIEWCONTACTS, - this._toggleTabs.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.down, SELECTORS.VIEWCONTACTS, - this._toggleTabs.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.next, SELECTORS.VIEWCONTACTS, - this._toggleTabs.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.previous, SELECTORS.VIEWCONTACTS, - this._toggleTabs.bind(this)); - // Tab panel keyboard handling. - this.messageArea.onDelegateEvent(CustomEvents.events.ctrlPageUp, SELECTORS.CONTACTSPANELS, - this._toggleTabs.bind(this)); - this.messageArea.onDelegateEvent(CustomEvents.events.ctrlPageDown, SELECTORS.CONTACTSPANELS, - this._toggleTabs.bind(this)); - - this.messageArea.onCustomEvent(Events.MESSAGESENT, function() { - this._selectTab(SELECTORS.VIEWCONVERSATIONS, SELECTORS.VIEWCONTACTS); - }.bind(this)); - }; - - /** - * Handles when the conversation tab is selected. - * - * @private - */ - Tabs.prototype._viewConversations = function() { - this.messageArea.trigger(Events.CONVERSATIONSSELECTED); - this._selectTab(SELECTORS.VIEWCONVERSATIONS, SELECTORS.VIEWCONTACTS); - }; - - /** - * Handles when the contacts tab is selected. - * - * @private - */ - Tabs.prototype._viewContacts = function() { - this.messageArea.trigger(Events.CONTACTSSELECTED); - this._selectTab(SELECTORS.VIEWCONTACTS, SELECTORS.VIEWCONVERSATIONS); - }; - - /** - * Sets a tab to selected. - * - * @param {String} tabselect The name of the tab to select - * @param {String} tabdeselect The name of the tab to deselect - * @private - */ - Tabs.prototype._selectTab = function(tabselect, tabdeselect) { - tabdeselect = this.messageArea.find(tabdeselect); - tabdeselect.removeClass('selected'); - tabdeselect.attr('aria-selected', 'false'); - tabdeselect.attr('tabindex', '-1'); - - tabselect = this.messageArea.find(tabselect); - tabselect.addClass('selected'); - tabselect.attr('aria-selected', 'true'); - tabselect.attr('tabindex', '0'); - }; - - /** - * Change to the inactive tab. - * - * @param {event} e The javascript event - * @param {object} data The additional event data - * @private - */ - Tabs.prototype._toggleTabs = function(e, data) { - var activeTab = this.messageArea.find(SELECTORS.ACTIVECONTACTSTAB); - - if (activeTab.is(SELECTORS.VIEWCONVERSATIONS)) { - this._viewContacts(); - } else { - this._viewConversations(); - } - - this.messageArea.find(SELECTORS.ACTIVECONTACTSTAB).focus(); - - e.preventDefault(); - e.stopPropagation(); - data.originalEvent.preventDefault(); - data.originalEvent.stopPropagation(); - }; - - return Tabs; -}); diff --git a/message/amd/src/message_preferences.js b/message/amd/src/message_preferences.js deleted file mode 100644 index c5944b62ce2..00000000000 --- a/message/amd/src/message_preferences.js +++ /dev/null @@ -1,125 +0,0 @@ -// This file is part of Moodle - http://moodle.org/ -// -// Moodle is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Moodle is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Moodle. If not, see . - -/** - * Controls the message preference page. - * - * @module core_message/message_preferences - * @class message_preferences - * @package message - * @copyright 2016 Ryan Wyllie - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ -define(['jquery', 'core/ajax', 'core/notification', - 'core_message/message_notification_preference', 'core/custom_interaction_events'], - function($, Ajax, Notification, MessageNotificationPreference, CustomEvents) { - - var SELECTORS = { - PREFERENCE: '[data-state]', - PREFERENCES_CONTAINER: '[data-region="preferences-container"]', - CONTACTABLE_PRIVACY_CONTAINER: '[data-region="privacy-setting-container"]', - }; - - /** - * Constructor for the MessagePreferences. - * - * @param {object} element The root element for the message preferences - */ - var MessagePreferences = function(element) { - this.root = $(element); - this.userId = this.root.find(SELECTORS.PREFERENCES_CONTAINER).attr('data-user-id'); - - this.registerEventListeners(); - }; - - /** - * Check if the preferences have been disabled on this page. - * - * @method preferencesDisabled - * @return {bool} - */ - MessagePreferences.prototype.preferencesDisabled = function() { - return this.root.find(SELECTORS.PREFERENCES_CONTAINER).hasClass('disabled'); - }; - - /** - * Update the contactable privacy user preference in the DOM and - * send a request to update on the server. - * - * @return {Promise} - * @method saveContactablePrivacySetting - */ - MessagePreferences.prototype.saveContactablePrivacySetting = function() { - var container = this.root.find(SELECTORS.CONTACTABLE_PRIVACY_CONTAINER); - var value = $("input[type='radio']:checked").val(); - - if (container.hasClass('loading')) { - return $.Deferred().resolve(); - } - - container.addClass('loading'); - - var request = { - methodname: 'core_user_update_user_preferences', - args: { - userid: this.userId, - preferences: [ - { - type: container.attr('data-preference-key'), - value: value, - } - ] - } - }; - - return Ajax.call([request])[0] - .fail(Notification.exception) - .always(function() { - container.removeClass('loading'); - }); - }; - - /** - * Create all of the event listeners for the message preferences page. - * - * @method registerEventListeners - */ - MessagePreferences.prototype.registerEventListeners = function() { - CustomEvents.define(this.root, [ - CustomEvents.events.activate - ]); - - this.root.on('change', function(e) { - // Add listener for privacy setting radio buttons change. - if (e.target.name == 'message_blocknoncontacts') { - this.saveContactablePrivacySetting(); - } else { - // Add listener for processor preferences. - if (!this.preferencesDisabled()) { - var preferencesContainer = $(e.target).closest(SELECTORS.PREFERENCES_CONTAINER); - var preferenceElement = $(e.target).closest(SELECTORS.PREFERENCE); - var messagePreference = new MessageNotificationPreference(preferencesContainer, this.userId); - - preferenceElement.addClass('loading'); - messagePreference.save().always(function() { - preferenceElement.removeClass('loading'); - }); - } - } - }.bind(this)); - }; - - return MessagePreferences; -});