diff --git a/www/addons/messages/controllers/discussion.js b/www/addons/messages/controllers/discussion.js index f0efa22c731..9a5dc5ec782 100644 --- a/www/addons/messages/controllers/discussion.js +++ b/www/addons/messages/controllers/discussion.js @@ -24,7 +24,7 @@ angular.module('mm.addons.messages') .controller('mmaMessagesDiscussionCtrl', function($scope, $stateParams, $mmApp, $mmaMessages, $mmSite, $timeout, $mmEvents, $window, $ionicScrollDelegate, mmUserProfileState, $mmUtil, mmaMessagesPollInterval, $interval, $log, $ionicHistory, $ionicPlatform, mmCoreEventKeyboardShow, mmCoreEventKeyboardHide, mmaMessagesDiscussionLoadedEvent, mmaMessagesDiscussionLeftEvent, - $mmUser) { + $mmUser, $translate) { $log = $log.getInstance('mmaMessagesDiscussionCtrl'); @@ -32,6 +32,7 @@ angular.module('mm.addons.messages') userFullname = $stateParams.userFullname, messagesBeingSent = 0, polling, + fetching, backView = $ionicHistory.backView(), lastMessage, scrollView = $ionicScrollDelegate.$getByHandle('mmaMessagesScroll'); @@ -146,6 +147,38 @@ angular.module('mm.addons.messages') } }; + // Convenience function to fetch messages. + function fetchMessages() { + $log.debug('Polling new messages for discussion with user ' + userId); + if (messagesBeingSent > 0) { + // We do not poll while a message is being sent or we could confuse the user + // as his message would disappear from the list, and he'd have to wait for the + // interval to check for new messages. + return; + } else if (!$mmApp.isOnline()) { + // Obviously we cannot check for new messages when the app is offline. + return; + } else if (fetching) { + // Already fetching. + return; + } + + fetching = true; + + // Invalidate the cache before fetching. + $mmaMessages.invalidateDiscussionCache(userId); + $mmaMessages.getDiscussion(userId).then(function(messages) { + if (messagesBeingSent > 0) { + // Ignore polling if due to a race condition. + return; + } + $scope.messages = $mmaMessages.sortMessages(messages); + notifyNewMessage(); + }).finally(function() { + fetching = false; + }); + } + // Set a polling to get new messages every certain time. function setPolling() { if (polling) { @@ -154,29 +187,7 @@ angular.module('mm.addons.messages') } // Start polling. - polling = $interval(function() { - $log.debug('Polling new messages for discussion with user ' + userId); - if (messagesBeingSent > 0) { - // We do not poll while a message is being sent or we could confuse the user - // as his message would disappear from the list, and he'd have to wait for the - // interval to check for new messages. - return; - } else if (!$mmApp.isOnline()) { - // Obviously we cannot check for new messages when the app is offline. - return; - } - - // Invalidate the cache before fetching. - $mmaMessages.invalidateDiscussionCache(userId); - $mmaMessages.getDiscussion(userId).then(function(messages) { - if (messagesBeingSent > 0) { - // Ignore polling if due to a race condition. - return; - } - $scope.messages = $mmaMessages.sortMessages(messages); - notifyNewMessage(); - }); - }, mmaMessagesPollInterval); + polling = $interval(fetchMessages, mmaMessagesPollInterval); } // Unset polling. @@ -264,6 +275,33 @@ angular.module('mm.addons.messages') } } + // Check if user can delete messages. + $scope.canDelete = $mmaMessages.canDeleteMessages(); + + // Function to select a message to be deleted. + $scope.selectMessage = function(id) { + $scope.selectedMessage = id; + }; + + // Function to delete a message. + $scope.deleteMessage = function(message, index) { + $mmUtil.showConfirm($translate('mma.messages.deletemessageconfirmation')).then(function() { + var modal = $mmUtil.showModalLoading('mm.core.deleting', true); + $mmaMessages.deleteMessage(message.id, message.read).then(function() { + $scope.messages.splice(index, 1); // Remove message from the list without having to wait for re-fetch. + fetchMessages(); // Re-fetch messages to update cached data. + }).catch(function(error) { + if (typeof error === 'string') { + $mmUtil.showErrorModal(error); + } else { + $mmUtil.showErrorModal('mma.messages.errordeletemessage', true); + } + }).finally(function() { + modal.dismiss(); + }); + }); + }; + if ($ionicPlatform.isTablet()) { $mmEvents.trigger(mmaMessagesDiscussionLoadedEvent, userId); } diff --git a/www/addons/messages/lang/en.json b/www/addons/messages/lang/en.json index 28cf9e44bb8..1dbee758b2e 100644 --- a/www/addons/messages/lang/en.json +++ b/www/addons/messages/lang/en.json @@ -4,7 +4,9 @@ "contactname": "Contact name", "contactlistempty": "The contact list is empty", "contacts": "Contacts", - "erroruseronlyacceptsmessagefromcontacts": "", + "deletemessage": "Delete message", + "deletemessageconfirmation": "Are you sure you want to delete this message? It will only be deleted from your messaging history and will still be viewable by the user who sent or received the message.", + "errordeletemessage": "Error while deleting the message.", "errorwhileretrievingcontacts": "Error while retrieving the contacts from the server.", "errorwhileretrievingdiscussions": "Error while retrieving the discussions from the server.", "errorwhileretrievingmessages": "Error while retrieving the messages from the server.", diff --git a/www/addons/messages/scss/styles.scss b/www/addons/messages/scss/styles.scss index 664fd0cd1e5..db4d92c32e1 100644 --- a/www/addons/messages/scss/styles.scss +++ b/www/addons/messages/scss/styles.scss @@ -32,4 +32,13 @@ $mma-messages-date-badge: "stable" !default; .mma-messages-discussion-container { padding-bottom: 15px; +} + +.button.button-icon.mma-messages-delete-button { + min-height: auto; + line-height: initial; + &:before { + font-size: 100%; + line-height: initial; + } } \ No newline at end of file diff --git a/www/addons/messages/services/messages.js b/www/addons/messages/services/messages.js index 581aa2b896c..4388b9b4c2c 100644 --- a/www/addons/messages/services/messages.js +++ b/www/addons/messages/services/messages.js @@ -60,6 +60,41 @@ angular.module('mm.addons.messages') }); }; + /** + * Check if messages can be deleted in current site. + * + * @module mm.addons.messages + * @ngdoc method + * @name $mmaMessages#canDeleteMessages + * @return {Boolean} True if can delete messages, false otherwise. + */ + self.canDeleteMessages = function() { + return $mmSite.wsAvailable('core_message_delete_message'); + }; + + /** + * Check if messages can be deleted in current site. + * + * @module mm.addons.messages + * @ngdoc method + * @name $mmaMessages#deleteMessage + * @param {Number} id Message ID. + * @param {Number} read 1 if message is read, 0 otherwise. + * @param {Number} [userId] User we want to delete the message for. If not defined, use current user. + * @return {Promise} Promise resolved when the message has been deleted. + */ + self.deleteMessage = function(id, read, userId) { + userId = userId || $mmSite.getUserId(); + var params = { + messageid: id, + userid: userId, + read: read + }; + return $mmSite.write('core_message_delete_message', params).then(function() { + return self.invalidateDiscussionCache(userId); + }); + }; + /** * Get all the contacts of the current user. * @@ -405,7 +440,12 @@ angular.module('mm.addons.messages') newestfirst: 1, }); - return $mmSite.read('core_message_get_messages', params, presets); + return $mmSite.read('core_message_get_messages', params, presets).then(function(response) { + angular.forEach(response.messages, function(message) { + message.read = params.read == 0 ? 0 : 1; + }); + return response; + }); }; /** diff --git a/www/addons/messages/templates/discussion.html b/www/addons/messages/templates/discussion.html index 60d7ed79754..5bb236b3abd 100644 --- a/www/addons/messages/templates/discussion.html +++ b/www/addons/messages/templates/discussion.html @@ -12,11 +12,14 @@

{{ message.timecreated * 1000 | mmFormatDate:"dfdayweekmonth" }}

-
+
{{ message.smallmessage | mmaMessagesFormat }} - {{ message.timecreated * 1000 | mmFormatDate:"dftimedate" }} + + {{ message.timecreated * 1000 | mmFormatDate:"dftimedate" }} + +
diff --git a/www/core/lang/en.json b/www/core/lang/en.json index 115a1640e48..c284ec39786 100644 --- a/www/core/lang/en.json +++ b/www/core/lang/en.json @@ -21,6 +21,7 @@ "course": "Course", "day": "day", "days": "days", + "deleting": "Deleting", "description": "Description", "dfdayweekmonth": "ddd, D MMM", "dflastweekdate": "ddd",