diff --git a/message/amd/build/message_drawer_view_overview_section.min.js b/message/amd/build/message_drawer_view_overview_section.min.js index f23344518ea..6828406eb98 100644 --- a/message/amd/build/message_drawer_view_overview_section.min.js +++ b/message/amd/build/message_drawer_view_overview_section.min.js @@ -1 +1 @@ -define(["jquery","core/custom_interaction_events","core/notification","core/pubsub","core/str","core/templates","core/user_date","core_message/message_repository","core_message/message_drawer_events","core_message/message_drawer_router","core_message/message_drawer_routes","core_message/message_drawer_lazy_load_list","core_message/message_drawer_view_conversation_constants"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n={TOGGLE:'[data-region="toggle"]',CONVERSATION:"[data-conversation-id]",BLOCKED_ICON_CONTAINER:'[data-region="contact-icon-blocked"]',LAST_MESSAGE:'[data-region="last-message"]',LAST_MESSAGE_DATE:'[data-region="last-message-date"]',UNREAD_COUNT:'[data-region="unread-count"]',SECTION_TOTAL_COUNT:'[data-region="section-total-count"]',SECTION_TOTAL_COUNT_CONTAINER:'[data-region="section-total-count-container"]',SECTION_UNREAD_COUNT:'[data-region="section-unread-count"]',PLACEHOLDER_CONTAINER:'[data-region="placeholder-container"]'},o={CONVERSATIONS_LIST:"core_message/message_drawer_conversations_list",CONVERSATIONS_LIST_ITEMS_PLACEHOLDER:"core_message/message_drawer_conversations_list_items_placeholder"},p=50,q={},r=!1,s=!1,t=function(a){return l.getRoot(a).hasClass("show")},u=function(a){a.addClass("expanded")},v=function(a){a.removeClass("expanded")},w=function(a,b){var c=a.find(n.SECTION_TOTAL_COUNT_CONTAINER),d=c.find(n.SECTION_TOTAL_COUNT);d.text(b),c.removeClass("hidden"),e.get_string("totalconversations","core_message",b).done(function(a){c.attr("aria-label",a)});var g=b>20?20:b,h=Array.apply(null,Array(g)).map(function(){return!0});f.render(o.CONVERSATIONS_LIST_ITEMS_PLACEHOLDER,{placeholders:h}).then(function(b){var c=a.find(n.PLACEHOLDER_CONTAINER);c.html(b)})["catch"](function(){})},x=function(a,b){var c=a.find(n.SECTION_UNREAD_COUNT);c.text(b),e.get_string("unreadconversations","core_message",b).done(function(a){c.attr("aria-label",a)}),b>0&&c.removeClass("hidden")},y=function(b){return b.map(function(b){return Object.keys(b).reduce(function(c,d){return a.isArray(b[d])?c[d.toLowerCase()]=y(b[d]):c[d.toLowerCase()]=b[d],c},{})},[])},z=function(b,c){b=y(b);var d=b.map(function(b){var d=b.messages.length?b.messages[b.messages.length-1]:null,e={id:b.id,imageurl:b.imageurl,name:b.name,subname:b.subname,unreadcount:b.unreadcount,lastmessagedate:d?d.timecreated:null,sentfromcurrentuser:d?d.useridfrom==c:null,lastmessage:d?a(d.text).text()||d.text:null};if(b.type==m.CONVERSATION_TYPES.PRIVATE){var f=b.members.reduce(function(a,b){return a||b.id==c||(a=b),a},null);e.userid=f.id,e.showonlinestatus=f.showonlinestatus,e.isonline=f.isonline,e.isblocked=f.isblocked}return b.type==m.CONVERSATION_TYPES.PUBLIC&&(e.lastsendername=b.members.reduce(function(a,b){return a||b.id!=d.useridfrom||(a=b.fullname),a},null)),e});return f.render(o.CONVERSATIONS_LIST,{conversations:d})},A=function(a,b,d){return function(e,f){return h.getConversations(f,a,p+1,d,b).then(function(a){var b=a.conversations;return b.length>p?b=b.slice(0,-1):l.setLoadedAll(e,!0),d+=p,b.forEach(function(a){q[a.id]=a}),b})["catch"](c.exception)}},B=function(a){return a.find(n.SECTION_TOTAL_COUNT)},C=function(a){return a.find(n.SECTION_UNREAD_COUNT)},D=function(a){if(r){var b=B(a),c=parseInt(b.text());c+=1,b.text(c)}},E=function(a){if(r){var b=B(a),c=parseInt(b.text());c-=1,b.text(c)}},F=function(a){if(s){var b=C(a),c=parseInt(b.text());c-=1,b.text(c),c<1&&b.addClass("hidden")}},G=function(a,b){return a.find('[data-conversation-id="'+b+'"]')},H=function(a,b){return a.find('[data-user-id="'+b+'"]')},I=function(a){a.find(n.BLOCKED_ICON_CONTAINER).removeClass("hidden")},J=function(a){a.find(n.BLOCKED_ICON_CONTAINER).addClass("hidden")},K=function(b,d){var e=b.find(n.CONVERSATION),g="";if(!e.length){var h=l.getRoot(b);l.showContent(h),l.hideEmptyMessage(h)}var i=d.messages.length,j=i?d.messages[i-1]:null;j&&(g=a(j.text).text()||j.text,d.messages[i-1].useridfrom=j.userFrom.id);var k={id:d.id,name:d.name,subname:d.subname,lastmessagedate:j?j.timeCreated:null,sentfromcurrentuser:j?j.fromLoggedInUser:null,lastmessage:g,imageurl:d.imageUrl};return q[d.id]=y([d])[0],f.render(o.CONVERSATIONS_LIST,{conversations:[k]}).then(function(a){var c=l.getContentContainer(b);return c.prepend(a)}).then(function(){return D(b)})["catch"](c.exception)},L=function(a,b){b.remove(),E(a);var c=a.find(n.CONVERSATION);if(!c.length){var d=l.getRoot(a);l.hideContent(d),l.showEmptyMessage(d)}},M=function(a,b){var c=b.find(n.UNREAD_COUNT);c.text("0"),c.addClass("hidden"),F(a)},N=function(e,f,g,h){var m=l.getRoot(e),o=e.find(n.TOGGLE);e.css("min-height",o.outerHeight()),e.on("show.bs.collapse",function(){u(e),l.show(m,f,function(a,b,c){return z(b,c).then(function(b){return a.append(b),b})})}),e.on("hidden.bs.collapse",function(){v(e)}),d.subscribe(i.CONTACT_BLOCKED,function(a){var b=H(e,a);b.length&&I(b)}),d.subscribe(i.CONTACT_UNBLOCKED,function(a){var b=H(e,a);b.length&&J(b)}),d.subscribe(i.CONVERSATION_NEW_LAST_MESSAGE,function(a){if(!(g&&a.type!=g||h&&!a.isFavourite||!h&&a.isFavourite)){var b=a.id,d=G(e,b);if(d.length){var f=l.getContentContainer(e);z([a],a.loggedInUserId).then(function(a){return f.prepend(a),d.remove(),a})["catch"](c.exception)}else K(e,a)}}),d.subscribe(i.CONVERSATION_DELETED,function(a){var b=G(e,a);delete q[a],b.length&&L(e,b)}),d.subscribe(i.CONVERSATION_READ,function(a){var b=G(e,a);b.length&&M(e,b)}),d.subscribe(i.CONVERSATION_SET_FAVOURITE,function(a){var b=null;!h||g&&g!=a.type?g==a.type&&(b=G(e,a.id),b.length&&L(e,b)):(b=G(e,a.id),b.length||K(e,a))}),d.subscribe(i.CONVERSATION_UNSET_FAVOURITE,function(a){var b=null;h?(b=G(e,a.id),b.length&&L(e,b)):g==a.type&&(b=G(e,a.id),b.length||K(e,a))}),b.define(e,[b.events.activate]),e.on(b.events.activate,n.CONVERSATION,function(b,c){var d=a(b.target).closest(n.CONVERSATION),e=d.attr("data-conversation-id"),f=q[e];j.go(k.VIEW_CONVERSATION,f),c.originalEvent.preventDefault()})},O=function(b,c,d,e,f){if(b=a(b),!b.attr("data-init")){var g=A(c,d,0);if(N(b,g,c,d),t(b)){u(b);var h=l.getRoot(b);l.show(h,g,function(a,b,c){return z(b,c).then(function(b){return a.append(b),b})})}e.then(function(a){w(b,a),r=!0})["catch"](function(){}),f.then(function(a){x(b,a),s=!0})["catch"](function(){}),b.attr("data-init",!0)}};return{show:O,isVisible:t}}); \ No newline at end of file +define(["jquery","core/custom_interaction_events","core/notification","core/pubsub","core/str","core/templates","core/user_date","core_message/message_repository","core_message/message_drawer_events","core_message/message_drawer_router","core_message/message_drawer_routes","core_message/message_drawer_lazy_load_list","core_message/message_drawer_view_conversation_constants"],function(a,b,c,d,e,f,g,h,i,j,k,l,m){var n={TOGGLE:'[data-region="toggle"]',CONVERSATION:"[data-conversation-id]",BLOCKED_ICON_CONTAINER:'[data-region="contact-icon-blocked"]',LAST_MESSAGE:'[data-region="last-message"]',LAST_MESSAGE_DATE:'[data-region="last-message-date"]',UNREAD_COUNT:'[data-region="unread-count"]',SECTION_TOTAL_COUNT:'[data-region="section-total-count"]',SECTION_TOTAL_COUNT_CONTAINER:'[data-region="section-total-count-container"]',SECTION_UNREAD_COUNT:'[data-region="section-unread-count"]',PLACEHOLDER_CONTAINER:'[data-region="placeholder-container"]'},o={CONVERSATIONS_LIST:"core_message/message_drawer_conversations_list",CONVERSATIONS_LIST_ITEMS_PLACEHOLDER:"core_message/message_drawer_conversations_list_items_placeholder"},p=50,q={},r=!1,s=!1,t=function(a){return l.getRoot(a).hasClass("show")},u=function(a){a.addClass("expanded")},v=function(a){a.removeClass("expanded")},w=function(a,b){var c=a.find(n.SECTION_TOTAL_COUNT_CONTAINER),d=c.find(n.SECTION_TOTAL_COUNT);d.text(b),c.removeClass("hidden"),e.get_string("totalconversations","core_message",b).done(function(a){c.attr("aria-label",a)});var g=b>20?20:b,h=Array.apply(null,Array(g)).map(function(){return!0});f.render(o.CONVERSATIONS_LIST_ITEMS_PLACEHOLDER,{placeholders:h}).then(function(b){var c=a.find(n.PLACEHOLDER_CONTAINER);c.html(b)})["catch"](function(){})},x=function(a,b){var c=a.find(n.SECTION_UNREAD_COUNT);c.text(b),e.get_string("unreadconversations","core_message",b).done(function(a){c.attr("aria-label",a)}),b>0&&c.removeClass("hidden")},y=function(b){var c=function(b){return Object.keys(b).reduce(function(d,e){return a.isArray(b[e])?d[e.toLowerCase()]=b[e].map(c):d[e.toLowerCase()]=b[e],d},{})},d=c(b);return d.messages=d.messages.map(function(a){return a.useridfrom=a.userfrom.id,a}),d},z=function(b,c){var d=b.map(function(b){var d=b.messages.length?b.messages[b.messages.length-1]:null,e={id:b.id,imageurl:b.imageurl,name:b.name,subname:b.subname,unreadcount:b.unreadcount,lastmessagedate:d?d.timecreated:null,sentfromcurrentuser:d?d.useridfrom==c:null,lastmessage:d?a(d.text).text()||d.text:null};if(b.type==m.CONVERSATION_TYPES.PRIVATE){var f=b.members.reduce(function(a,b){return a||b.id==c||(a=b),a},null);e.userid=f.id,e.showonlinestatus=f.showonlinestatus,e.isonline=f.isonline,e.isblocked=f.isblocked}return b.type==m.CONVERSATION_TYPES.PUBLIC&&(e.lastsendername=b.members.reduce(function(a,b){return!a&&d&&b.id==d.useridfrom&&(a=b.fullname),a},null)),e});return f.render(o.CONVERSATIONS_LIST,{conversations:d})},A=function(a,b,d){return function(e,f){return h.getConversations(f,a,p+1,d,b).then(function(a){var b=a.conversations;return b.length>p?b=b.slice(0,-1):l.setLoadedAll(e,!0),d+=p,b.forEach(function(a){q[a.id]=a}),b})["catch"](c.exception)}},B=function(a){return a.find(n.SECTION_TOTAL_COUNT)},C=function(a){return a.find(n.SECTION_UNREAD_COUNT)},D=function(a){if(r){var b=B(a),c=parseInt(b.text());c+=1,b.text(c)}},E=function(a){if(r){var b=B(a),c=parseInt(b.text());c-=1,b.text(c)}},F=function(a){if(s){var b=C(a),c=parseInt(b.text());c-=1,b.text(c),c<1&&b.addClass("hidden")}},G=function(a,b){return a.find('[data-conversation-id="'+b+'"]')},H=function(a,b){return a.find('[data-user-id="'+b+'"]')},I=function(a){a.find(n.BLOCKED_ICON_CONTAINER).removeClass("hidden")},J=function(a){a.find(n.BLOCKED_ICON_CONTAINER).addClass("hidden")},K=function(a,b,d){var e=a.find(n.CONVERSATION);if(!e.length){var f=l.getRoot(a);l.showContent(f),l.hideEmptyMessage(f)}return q[b.id]=b,z([b],d).then(function(b){var c=l.getContentContainer(a);return c.prepend(b)}).then(function(){return D(a)})["catch"](c.exception)},L=function(a,b){b.remove(),E(a);var c=a.find(n.CONVERSATION);if(!c.length){var d=l.getRoot(a);l.hideContent(d),l.showEmptyMessage(d)}},M=function(a,b){var c=b.find(n.UNREAD_COUNT);c.text("0"),c.addClass("hidden"),F(a)},N=function(e,f,g,h){var m=l.getRoot(e),o=e.find(n.TOGGLE);e.css("min-height",o.outerHeight()),e.on("show.bs.collapse",function(){u(e),l.show(m,f,function(a,b,d){return z(b,d).then(function(b){return a.append(b),b})["catch"](c.exception)})}),e.on("hidden.bs.collapse",function(){v(e)}),d.subscribe(i.CONTACT_BLOCKED,function(a){var b=H(e,a);b.length&&I(b)}),d.subscribe(i.CONTACT_UNBLOCKED,function(a){var b=H(e,a);b.length&&J(b)}),d.subscribe(i.CONVERSATION_NEW_LAST_MESSAGE,function(a){if(!(g&&a.type!=g||h&&!a.isFavourite||!h&&a.isFavourite)){var b=a.loggedInUserId,d=a.id,f=G(e,d);if(a=y(a),f.length){var i=l.getContentContainer(e);z([a],b).then(function(a){return i.prepend(a),f.remove(),a})["catch"](c.exception)}else K(e,a,b)}}),d.subscribe(i.CONVERSATION_DELETED,function(a){var b=G(e,a);delete q[a],b.length&&L(e,b)}),d.subscribe(i.CONVERSATION_READ,function(a){var b=G(e,a);b.length&&M(e,b)}),d.subscribe(i.CONVERSATION_SET_FAVOURITE,function(a){var b=null;!h||g&&g!=a.type?g==a.type&&(b=G(e,a.id),b.length&&L(e,b)):(b=G(e,a.id),b.length||K(e,y(a),a.loggedInUserId))}),d.subscribe(i.CONVERSATION_UNSET_FAVOURITE,function(a){var b=null;h?(b=G(e,a.id),b.length&&L(e,b)):g==a.type&&(b=G(e,a.id),b.length||K(e,y(a),a.loggedInUserId))}),b.define(e,[b.events.activate]),e.on(b.events.activate,n.CONVERSATION,function(b,c){var d=a(b.target).closest(n.CONVERSATION),e=d.attr("data-conversation-id"),f=q[e];j.go(k.VIEW_CONVERSATION,f),c.originalEvent.preventDefault()})},O=function(b,d,e,f,g){if(b=a(b),!b.attr("data-init")){var h=A(d,e,0);if(N(b,h,d,e),t(b)){u(b);var i=l.getRoot(b);l.show(i,h,function(a,b,d){return z(b,d).then(function(b){return a.append(b),b})["catch"](c.exception)})}f.then(function(a){w(b,a),r=!0})["catch"](function(){}),g.then(function(a){x(b,a),s=!0})["catch"](function(){}),b.attr("data-init",!0)}};return{show:O,isVisible:t}}); \ No newline at end of file diff --git a/message/amd/src/message_drawer_view_overview_section.js b/message/amd/src/message_drawer_view_overview_section.js index 766cb42272c..bb24e0b1127 100644 --- a/message/amd/src/message_drawer_view_overview_section.js +++ b/message/amd/src/message_drawer_view_overview_section.js @@ -158,23 +158,36 @@ function( }; /** - * Reformat the conversations to a common standard because this is linked directly to the ajax response and via - * an event publish which operate on the same fields but in a different format - * @param conversations + * Create a formatted conversation object from the the one we get from events. The new object + * will be in a format that matches what we receive from the server. + * + * @param {Object} conversation + * @return {Object} formatted conversation. */ - var formatConversationsForRender = function(conversations) { - // Convert the conversation to the standard stored and then cache the conversation. - return conversations.map(function(conversation) { - return Object.keys(conversation).reduce(function(carry, key){ - if ($.isArray(conversation[key])) { - carry[key.toLowerCase()] = formatConversationsForRender(conversation[key]); + var formatConversationFromEvent = function(conversation) { + // Recursively lowercase all of the keys for an object. + var recursivelyLowercaseKeys = function(object) { + return Object.keys(object).reduce(function(carry, key) { + if ($.isArray(object[key])) { + carry[key.toLowerCase()] = object[key].map(recursivelyLowercaseKeys); } else { - carry[key.toLowerCase()] = conversation[key]; + carry[key.toLowerCase()] = object[key]; } return carry; }, {}); - }, []); + }; + + // Recursively lowercase all of the keys for the conversation. + var formatted = recursivelyLowercaseKeys(conversation); + + // Make sure all messages have the useridfrom property set. + formatted.messages = formatted.messages.map(function(message) { + message.useridfrom = message.userfrom.id; + return message; + }); + + return formatted; }; /** @@ -186,7 +199,6 @@ function( * @return {Object} jQuery promise. */ var render = function(conversations, userId) { - conversations = formatConversationsForRender(conversations); var formattedConversations = conversations.map(function(conversation) { var lastMessage = conversation.messages.length ? conversation.messages[conversation.messages.length - 1] : null; @@ -218,7 +230,7 @@ function( if (conversation.type == MessageDrawerViewConversationContants.CONVERSATION_TYPES.PUBLIC) { formattedConversation.lastsendername = conversation.members.reduce(function(carry, member) { - if (!carry && member.id == lastMessage.useridfrom) { + if (!carry && lastMessage && member.id == lastMessage.useridfrom) { carry = member.fullname; } return carry; @@ -380,11 +392,11 @@ function( * * @param {Object} root Overview messages container element. * @param {Object} conversation The conversation. + * @param {Number} userId The logged in user id. * @return {Object} jQuery promise */ - var createNewConversation = function(root, conversation) { + var createNewConversationFromEvent = function(root, conversation, userId) { var existingConversations = root.find(SELECTORS.CONVERSATION); - var text = ''; if (!existingConversations.length) { // If we didn't have any conversations then we need to show @@ -394,28 +406,9 @@ function( LazyLoadList.hideEmptyMessage(listRoot); } - var messageCount = conversation.messages.length; - var lastMessage = messageCount ? conversation.messages[messageCount - 1] : null; - - if (lastMessage) { - text = $(lastMessage.text).text() || lastMessage.text; - conversation.messages[messageCount - 1].useridfrom = lastMessage.userFrom.id; - } - - var formattedConversation = { - id: conversation.id, - name: conversation.name, - subname: conversation.subname, - lastmessagedate: lastMessage ? lastMessage.timeCreated : null, - sentfromcurrentuser: lastMessage ? lastMessage.fromLoggedInUser : null, - lastmessage: text, - imageurl: conversation.imageUrl, - }; - - // Convert the conversation to the standard stored and then cache the conversation. - loadedConversationsById[conversation.id] = formatConversationsForRender([conversation])[0]; - - return Templates.render(TEMPLATES.CONVERSATIONS_LIST, {conversations: [formattedConversation]}) + // Cache the conversation. + loadedConversationsById[conversation.id] = conversation; + return render([conversation], userId) .then(function(html) { var contentContainer = LazyLoadList.getContentContainer(root); return contentContainer.prepend(html); @@ -478,10 +471,12 @@ function( root.on('show.bs.collapse', function() { setExpanded(root); LazyLoadList.show(listRoot, loadCallback, function(contentContainer, conversations, userId) { - return render(conversations, userId).then(function(html) { - contentContainer.append(html); - return html; - }); + return render(conversations, userId) + .then(function(html) { + contentContainer.append(html); + return html; + }) + .catch(Notification.exception); }); }); @@ -512,11 +507,13 @@ function( return; } + var loggedInUserId = conversation.loggedInUserId; var conversationId = conversation.id; var element = getConversationElement(root, conversationId); + conversation = formatConversationFromEvent(conversation); if (element.length) { var contentContainer = LazyLoadList.getContentContainer(root); - render([conversation], conversation.loggedInUserId) + render([conversation], loggedInUserId) .then(function(html) { contentContainer.prepend(html); element.remove(); @@ -524,7 +521,7 @@ function( }) .catch(Notification.exception); } else { - createNewConversation(root, conversation); + createNewConversationFromEvent(root, conversation, loggedInUserId); } }); @@ -548,7 +545,11 @@ function( if (includeFavourites && (!type || type == conversation.type)) { conversationElement = getConversationElement(root, conversation.id); if (!conversationElement.length) { - createNewConversation(root, conversation); + createNewConversationFromEvent( + root, + formatConversationFromEvent(conversation), + conversation.loggedInUserId + ); } } else if (type == conversation.type) { conversationElement = getConversationElement(root, conversation.id); @@ -568,7 +569,11 @@ function( } else if (type == conversation.type) { conversationElement = getConversationElement(root, conversation.id); if (!conversationElement.length) { - createNewConversation(root, conversation); + createNewConversationFromEvent( + root, + formatConversationFromEvent(conversation), + conversation.loggedInUserId + ); } } }); @@ -604,10 +609,12 @@ function( setExpanded(root); var listRoot = LazyLoadList.getRoot(root); LazyLoadList.show(listRoot, loadCallback, function(contentContainer, conversations, userId) { - return render(conversations, userId).then(function(html) { - contentContainer.append(html); - return html; - }); + return render(conversations, userId) + .then(function(html) { + contentContainer.append(html); + return html; + }) + .catch(Notification.exception); }); }