Merge branch 'MDL-66607-37' of git://github.com/andrewnicols/moodle into MOODLE_37_STABLE
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -59,6 +59,7 @@ define(
|
||||
'core/backoff_timer',
|
||||
'core/custom_interaction_events',
|
||||
'core/notification',
|
||||
'core/pending',
|
||||
'core/pubsub',
|
||||
'core/str',
|
||||
'core_message/message_repository',
|
||||
@@ -76,6 +77,7 @@ function(
|
||||
BackOffTimer,
|
||||
CustomEvents,
|
||||
Notification,
|
||||
Pending,
|
||||
PubSub,
|
||||
Str,
|
||||
Repository,
|
||||
@@ -103,6 +105,8 @@ function(
|
||||
var isResetting = true;
|
||||
// If the UI is currently sending a message.
|
||||
var isSendingMessage = false;
|
||||
// If the UI is currently deleting a conversation.
|
||||
var isDeletingConversationContent = false;
|
||||
// These functions which will be generated when this module is
|
||||
// first called. See generateRenderFunction for details.
|
||||
var render = null;
|
||||
@@ -550,7 +554,7 @@ function(
|
||||
var messages = viewState.messages;
|
||||
var mostRecentMessage = messages.length ? messages[messages.length - 1] : null;
|
||||
|
||||
if (mostRecentMessage && !isResetting && !isSendingMessage) {
|
||||
if (mostRecentMessage && !isResetting && !isSendingMessage && !isDeletingConversationContent) {
|
||||
// There may be multiple messages with the same time created value since
|
||||
// the accuracy is only down to the second. The server will include these
|
||||
// messages in the result (since it does a >= comparison on time from) so
|
||||
@@ -605,12 +609,18 @@ function(
|
||||
*/
|
||||
var markConversationAsRead = function(conversationId) {
|
||||
var loggedInUserId = viewState.loggedInUserId;
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:markConversationAsRead');
|
||||
|
||||
return Repository.markAllConversationMessagesAsRead(loggedInUserId, conversationId)
|
||||
.then(function() {
|
||||
var newState = StateManager.markMessagesAsRead(viewState, viewState.messages);
|
||||
PubSub.publish(MessageDrawerEvents.CONVERSATION_READ, conversationId);
|
||||
return render(newState);
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -635,6 +645,8 @@ function(
|
||||
*/
|
||||
var blockUser = function(userId) {
|
||||
var newState = StateManager.setLoadingConfirmAction(viewState, true);
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:blockUser');
|
||||
|
||||
render(newState);
|
||||
|
||||
return Repository.blockUser(viewState.loggedInUserId, userId)
|
||||
@@ -644,6 +656,11 @@ function(
|
||||
newState = StateManager.setLoadingConfirmAction(newState, false);
|
||||
PubSub.publish(MessageDrawerEvents.CONTACT_BLOCKED, userId);
|
||||
return render(newState);
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -668,6 +685,7 @@ function(
|
||||
*/
|
||||
var unblockUser = function(userId) {
|
||||
var newState = StateManager.setLoadingConfirmAction(viewState, true);
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:unblockUser');
|
||||
render(newState);
|
||||
|
||||
return Repository.unblockUser(viewState.loggedInUserId, userId)
|
||||
@@ -677,6 +695,11 @@ function(
|
||||
newState = StateManager.setLoadingConfirmAction(newState, false);
|
||||
PubSub.publish(MessageDrawerEvents.CONTACT_UNBLOCKED, userId);
|
||||
return render(newState);
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -701,6 +724,7 @@ function(
|
||||
*/
|
||||
var removeContact = function(userId) {
|
||||
var newState = StateManager.setLoadingConfirmAction(viewState, true);
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:removeContact');
|
||||
render(newState);
|
||||
|
||||
return Repository.deleteContacts(viewState.loggedInUserId, [userId])
|
||||
@@ -710,6 +734,11 @@ function(
|
||||
newState = StateManager.setLoadingConfirmAction(newState, false);
|
||||
PubSub.publish(MessageDrawerEvents.CONTACT_REMOVED, userId);
|
||||
return render(newState);
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -734,6 +763,7 @@ function(
|
||||
*/
|
||||
var addContact = function(userId) {
|
||||
var newState = StateManager.setLoadingConfirmAction(viewState, true);
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:addContactRequests');
|
||||
render(newState);
|
||||
|
||||
return Repository.createContactRequest(viewState.loggedInUserId, userId)
|
||||
@@ -749,6 +779,11 @@ function(
|
||||
newState = StateManager.addContactRequests(newState, [request]);
|
||||
newState = StateManager.setLoadingConfirmAction(newState, false);
|
||||
return render(newState);
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -760,6 +795,7 @@ function(
|
||||
var setFavourite = function() {
|
||||
var userId = viewState.loggedInUserId;
|
||||
var conversationId = viewState.id;
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:setFavourite');
|
||||
|
||||
return Repository.setFavouriteConversations(userId, [conversationId])
|
||||
.then(function() {
|
||||
@@ -771,6 +807,11 @@ function(
|
||||
MessageDrawerEvents.CONVERSATION_SET_FAVOURITE,
|
||||
formatConversationForEvent(viewState)
|
||||
);
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -782,6 +823,7 @@ function(
|
||||
var unsetFavourite = function() {
|
||||
var userId = viewState.loggedInUserId;
|
||||
var conversationId = viewState.id;
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:unsetFavourite');
|
||||
|
||||
return Repository.unsetFavouriteConversations(userId, [conversationId])
|
||||
.then(function() {
|
||||
@@ -793,6 +835,11 @@ function(
|
||||
MessageDrawerEvents.CONVERSATION_UNSET_FAVOURITE,
|
||||
formatConversationForEvent(viewState)
|
||||
);
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -804,6 +851,7 @@ function(
|
||||
var setMuted = function() {
|
||||
var userId = viewState.loggedInUserId;
|
||||
var conversationId = viewState.id;
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:markConversationAsRead');
|
||||
|
||||
return Repository.setMutedConversations(userId, [conversationId])
|
||||
.then(function() {
|
||||
@@ -815,6 +863,11 @@ function(
|
||||
MessageDrawerEvents.CONVERSATION_SET_MUTED,
|
||||
formatConversationForEvent(viewState)
|
||||
);
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -860,6 +913,7 @@ function(
|
||||
* @return {Promise} Renderer promise.
|
||||
*/
|
||||
var deleteSelectedMessages = function() {
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:deleteSelectedMessages');
|
||||
var messageIds = viewState.pendingDeleteMessageIds;
|
||||
var newState = StateManager.setLoadingConfirmAction(viewState, true);
|
||||
|
||||
@@ -873,6 +927,14 @@ function(
|
||||
deleteMessagesPromise = Repository.deleteMessages(viewState.loggedInUserId, messageIds);
|
||||
}
|
||||
|
||||
// Mark that we are deleting content from the conversation to prevent updates of it.
|
||||
isDeletingConversationContent = true;
|
||||
|
||||
// Stop polling for new messages to the open conversation.
|
||||
if (newMessagesPollTimer) {
|
||||
newMessagesPollTimer.stop();
|
||||
}
|
||||
|
||||
return deleteMessagesPromise.then(function() {
|
||||
var newState = StateManager.removeMessagesById(viewState, messageIds);
|
||||
newState = StateManager.removePendingDeleteMessagesById(newState, messageIds);
|
||||
@@ -890,8 +952,15 @@ function(
|
||||
PubSub.publish(MessageDrawerEvents.CONVERSATION_DELETED, newState.id);
|
||||
}
|
||||
|
||||
isDeletingConversationContent = false;
|
||||
return render(newState);
|
||||
});
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
})
|
||||
.catch(Notification.exception);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -913,9 +982,18 @@ function(
|
||||
* @return {Promise} Renderer promise.
|
||||
*/
|
||||
var deleteConversation = function() {
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:markConversationAsRead');
|
||||
var newState = StateManager.setLoadingConfirmAction(viewState, true);
|
||||
render(newState);
|
||||
|
||||
// Mark that we are deleting the conversation to prevent updates of it.
|
||||
isDeletingConversationContent = true;
|
||||
|
||||
// Stop polling for new messages to the open conversation.
|
||||
if (newMessagesPollTimer) {
|
||||
newMessagesPollTimer.stop();
|
||||
}
|
||||
|
||||
return Repository.deleteConversation(viewState.loggedInUserId, viewState.id)
|
||||
.then(function() {
|
||||
var newState = StateManager.removeMessages(viewState, viewState.messages);
|
||||
@@ -924,7 +1002,14 @@ function(
|
||||
newState = StateManager.setLoadingConfirmAction(newState, false);
|
||||
PubSub.publish(MessageDrawerEvents.CONVERSATION_DELETED, newState.id);
|
||||
|
||||
isDeletingConversationContent = false;
|
||||
|
||||
return render(newState);
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -952,6 +1037,8 @@ function(
|
||||
* @return {Promise} Renderer promise.
|
||||
*/
|
||||
var acceptContactRequest = function(userId) {
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:acceptContactRequest');
|
||||
|
||||
// Search the list of the logged in user's contact requests to find the
|
||||
// one from this user.
|
||||
var loggedInUserId = viewState.loggedInUserId;
|
||||
@@ -973,6 +1060,11 @@ function(
|
||||
PubSub.publish(MessageDrawerEvents.CONTACT_ADDED, viewState.members[userId]);
|
||||
PubSub.publish(MessageDrawerEvents.CONTACT_REQUEST_ACCEPTED, request);
|
||||
return;
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -983,6 +1075,8 @@ function(
|
||||
* @return {Promise} Renderer promise.
|
||||
*/
|
||||
var declineContactRequest = function(userId) {
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:declineContactRequest');
|
||||
|
||||
// Search the list of the logged in user's contact requests to find the
|
||||
// one from this user.
|
||||
var loggedInUserId = viewState.loggedInUserId;
|
||||
@@ -1003,6 +1097,11 @@ function(
|
||||
.then(function() {
|
||||
PubSub.publish(MessageDrawerEvents.CONTACT_REQUEST_DECLINED, request);
|
||||
return;
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
});
|
||||
};
|
||||
|
||||
@@ -1012,9 +1111,11 @@ function(
|
||||
*
|
||||
* @param {Number} conversationId The conversation to send to.
|
||||
* @param {String} text Text to send.
|
||||
* @return {Promise} Renderer promise.
|
||||
*/
|
||||
var sendMessage = function(conversationId, text) {
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_conversation:sendMessage');
|
||||
|
||||
// Flag that we're processing the queue.
|
||||
isSendingMessage = true;
|
||||
var newState = StateManager.setSendingMessage(viewState, true);
|
||||
var newConversationId = null;
|
||||
@@ -1057,6 +1158,11 @@ function(
|
||||
PubSub.publish(MessageDrawerEvents.CONVERSATION_NEW_LAST_MESSAGE, conversation);
|
||||
return;
|
||||
})
|
||||
.then(function(result) {
|
||||
pendingPromise.resolve();
|
||||
|
||||
return result;
|
||||
})
|
||||
.catch(function(error) {
|
||||
isSendingMessage = false;
|
||||
var newState = StateManager.setSendingMessage(viewState, false);
|
||||
@@ -1084,8 +1190,6 @@ function(
|
||||
|
||||
/**
|
||||
* Cancel edit mode (selecting the messages).
|
||||
*
|
||||
* @return {Promise} Renderer promise.
|
||||
*/
|
||||
var cancelEditMode = function() {
|
||||
cancelRequest(getOtherUserId());
|
||||
@@ -1122,6 +1226,8 @@ function(
|
||||
renderable.deferred.resolve(true);
|
||||
// Keep processing the buffer until it's empty.
|
||||
processRenderBuffer(header, body, footer);
|
||||
|
||||
return;
|
||||
})
|
||||
.catch(function(error) {
|
||||
isRendering = false;
|
||||
@@ -1520,6 +1626,7 @@ function(
|
||||
isRendering = false;
|
||||
renderBuffer = [];
|
||||
isSendingMessage = false;
|
||||
isDeletingConversationContent = false;
|
||||
|
||||
var loggedInUserId = loggedInUserProfile.id;
|
||||
var midnight = parseInt(body.attr('data-midnight'), 10);
|
||||
|
||||
@@ -25,6 +25,7 @@ define(
|
||||
'jquery',
|
||||
'core/custom_interaction_events',
|
||||
'core/notification',
|
||||
'core/pending',
|
||||
'core/pubsub',
|
||||
'core/str',
|
||||
'core/templates',
|
||||
@@ -40,6 +41,7 @@ function(
|
||||
$,
|
||||
CustomEvents,
|
||||
Notification,
|
||||
Pending,
|
||||
PubSub,
|
||||
Str,
|
||||
Templates,
|
||||
@@ -73,6 +75,7 @@ function(
|
||||
|
||||
var LOAD_LIMIT = 50;
|
||||
var loadedConversationsById = {};
|
||||
var deletedConversationsById = {};
|
||||
var loadedTotalCounts = false;
|
||||
var loadedUnreadCounts = false;
|
||||
|
||||
@@ -194,7 +197,6 @@ function(
|
||||
/**
|
||||
* Render the messages in the overview page.
|
||||
*
|
||||
* @param {Object} contentContainer Conversations content container.
|
||||
* @param {Array} conversations List of conversations to render.
|
||||
* @param {Number} userId Logged in user id.
|
||||
* @return {Object} jQuery promise.
|
||||
@@ -595,6 +597,7 @@ function(
|
||||
return;
|
||||
}
|
||||
|
||||
var pendingPromise = new Pending('core_message/message_drawer_view_overview_section:new');
|
||||
var loggedInUserId = conversation.loggedInUserId;
|
||||
var conversationId = conversation.id;
|
||||
var element = getConversationElement(root, conversationId);
|
||||
@@ -603,19 +606,34 @@ function(
|
||||
var contentContainer = LazyLoadList.getContentContainer(root);
|
||||
render([conversation], loggedInUserId)
|
||||
.then(function(html) {
|
||||
contentContainer.prepend(html);
|
||||
element.remove();
|
||||
return html;
|
||||
})
|
||||
if (deletedConversationsById[conversationId]) {
|
||||
// This conversation was deleted at some point since the messaging drawer was created.
|
||||
if (conversation.messages[0].timeadded < deletedConversationsById[conversationId]) {
|
||||
// The 'new' message was added before the conversation was deleted.
|
||||
// This is probably stale data.
|
||||
return;
|
||||
}
|
||||
}
|
||||
contentContainer.prepend(html);
|
||||
element.remove();
|
||||
|
||||
return;
|
||||
})
|
||||
.then(pendingPromise.resolve)
|
||||
.catch(Notification.exception);
|
||||
} else if (conversation.messages.length) {
|
||||
createNewConversationFromEvent(root, conversation, loggedInUserId)
|
||||
.then(pendingPromise.resolve)
|
||||
.catch();
|
||||
} else {
|
||||
createNewConversationFromEvent(root, conversation, loggedInUserId);
|
||||
pendingPromise.resolve();
|
||||
}
|
||||
});
|
||||
|
||||
PubSub.subscribe(MessageDrawerEvents.CONVERSATION_DELETED, function(conversationId) {
|
||||
var conversationElement = getConversationElement(root, conversationId);
|
||||
delete loadedConversationsById[conversationId];
|
||||
deletedConversationsById[conversationId] = new Date();
|
||||
if (conversationElement.length) {
|
||||
deleteConversation(root, conversationElement);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user