From b4657acc8a686a586699b67a0a04fc7741c77634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Mon, 12 Jun 2017 09:56:28 +0200 Subject: [PATCH] MOBILE-2125 data: Delete entry --- www/addons/mod/data/controllers/entry.js | 12 +++-- www/addons/mod/data/lang/en.json | 3 ++ www/addons/mod/data/main.js | 1 + www/addons/mod/data/services/data.js | 22 ++++++++- www/addons/mod/data/services/handlers.js | 60 +++++++++++++++++++++++- 5 files changed, 92 insertions(+), 6 deletions(-) diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js index 6951ca54d8d..3f94bd07ad2 100644 --- a/www/addons/mod/data/controllers/entry.js +++ b/www/addons/mod/data/controllers/entry.js @@ -22,7 +22,8 @@ angular.module('mm.addons.mod_data') * @name mmaModDataEntryCtrl */ .controller('mmaModDataEntryCtrl', function($scope, $stateParams, $mmaModData, mmaModDataComponent, $mmCourse, $q, $mmEvents, - $mmText, $translate, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, $ionicScrollDelegate, mmaModDataEventEntryChanged) { + $mmText, $translate, $mmUtil, $mmSite, $mmaModDataHelper, $mmGroups, $ionicScrollDelegate, mmaModDataEventEntryChanged, + $ionicHistory) { var module = $stateParams.module || {}, courseId = $stateParams.courseid, @@ -174,8 +175,13 @@ angular.module('mm.addons.mod_data') // Refresh entry on change. entryChangedObserver = $mmEvents.on(mmaModDataEventEntryChanged, function(eventData) { if (eventData.entryId == entryId && data.id == eventData.dataId && $mmSite.getId() == eventData.siteId) { - $scope.databaseLoaded = false; - return fetchEntryData(true); + if (eventData.deleted) { + // If deleted, go back. + $ionicHistory.goBack(); + } else { + $scope.databaseLoaded = false; + return fetchEntryData(true); + } } }); diff --git a/www/addons/mod/data/lang/en.json b/www/addons/mod/data/lang/en.json index 76b50d2082a..03ac31afac0 100644 --- a/www/addons/mod/data/lang/en.json +++ b/www/addons/mod/data/lang/en.json @@ -1,12 +1,15 @@ { "addentries": "Add entries", + "confirmdeleterecord": "Are you sure you want to delete this entry?", "entrieslefttoadd": "You must add {{$a.entriesleft}} more entry/entries in order to complete this activity", "entrieslefttoaddtoview": "You must add {{$a.entrieslefttoview}} more entry/entries before you can view other participants' entries.", "errorapproving": "Error approving or unapproving entry.", + "errordeleting": "Error deleting the entry.", "expired": "Sorry, this activity closed on {{$a}} and is no longer available", "norecords": "No entries in database", "notopenyet": "Sorry, this activity is not available until {{$a}}", "recordapproved": "Entry approved", + "recorddeleted": "Entry deleted", "recorddisapproved": "Entry unapproved", "search": "Search" } diff --git a/www/addons/mod/data/main.js b/www/addons/mod/data/main.js index 05b351dde8c..c6bfa192fbe 100644 --- a/www/addons/mod/data/main.js +++ b/www/addons/mod/data/main.js @@ -62,4 +62,5 @@ angular.module('mm.addons.mod_data', ['mm.core']) $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:index', '$mmaModDataHandlers.indexLinksHandler'); $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:entry', '$mmaModDataHandlers.showEntryLinksHandler'); $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:approve', '$mmaModDataHandlers.approveEntryLinksHandler'); + $mmContentLinksDelegateProvider.registerLinkHandler('mmaModData:delete', '$mmaModDataHandlers.deleteEntryLinksHandler'); }); diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index 28fcdfceab4..55c3fdf2aa1 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -403,7 +403,7 @@ angular.module('mm.addons.mod_data') * @param {Number} entryId Entry ID. * @param {Boolean} approve Whether to approve (true) or unapprove the entry. * @param {String} [siteId] Site ID. If not defined, current site. - * @return {Promise} Promise resolved when the database entry is retrieved. + * @return {Promise} Promise resolved when the action is done. */ self.approveEntry = function(entryId, approve, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { @@ -416,6 +416,26 @@ angular.module('mm.addons.mod_data') }); }; + /** + * Deletes an entry. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModData#deleteEntry + * @param {Number} entryId Entry ID. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the action is done. + */ + self.deleteEntry = function(entryId, siteId) { + return $mmSitesManager.getSite(siteId).then(function(site) { + var params = { + entryid: entryId + }; + + return site.write('mod_data_delete_entry', params); + }); + }; + /** * Get the list of configured fields for the given database. * diff --git a/www/addons/mod/data/services/handlers.js b/www/addons/mod/data/services/handlers.js index b02f707520a..2c00b4b1f63 100644 --- a/www/addons/mod/data/services/handlers.js +++ b/www/addons/mod/data/services/handlers.js @@ -23,7 +23,7 @@ angular.module('mm.addons.mod_data') */ .factory('$mmaModDataHandlers', function($mmCourse, $mmaModData, $state, $mmContentLinksHelper, $mmUtil, $mmEvents, $mmSite, $q, mmaModDataComponent, $mmaModDataPrefetchHandler, mmCoreDownloading, mmCoreNotDownloaded, $mmContentLinkHandlerFactory, - mmCoreEventPackageStatusChanged, mmCoreOutdated, $mmCoursePrefetchDelegate, mmaModDataEventEntryChanged) { + mmCoreEventPackageStatusChanged, mmCoreOutdated, $mmCoursePrefetchDelegate, mmaModDataEventEntryChanged, $translate) { var self = {}; /** @@ -215,7 +215,7 @@ angular.module('mm.addons.mod_data') }]; }; - /** + /** * Content links handler for database approve/disapprove entry. * Match mod/data/view.php?d=6&approve=5 with a valid data id and entryid. * @@ -268,5 +268,61 @@ angular.module('mm.addons.mod_data') }]; }; + /** + * Content links handler for database delete entry. + * Match mod/data/view.php?d=6&delete=5 with a valid data id and entryid. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHandlers#deleteEntryLinksHandler + */ + self.deleteEntryLinksHandler = $mmContentLinkHandlerFactory.createChild( + /\/mod\/data\/view\.php.*([\?\&](d|delete)=\d+)/, '$mmCourseDelegate_mmaModData'); + + // Check if the deleteEntryLinksHandler is enabled for a certain site. See $mmContentLinkHandlerFactory#isEnabled. + self.deleteEntryLinksHandler.isEnabled = $mmaModData.isPluginEnabled; + + // Get actions to perform with the link. See $mmContentLinkHandlerFactory#getActions. + self.deleteEntryLinksHandler.getActions = function(siteIds, url, params, courseId) { + if (typeof params.d == 'undefined' || typeof params.delete == 'undefined') { + // Required fields not defined. Cannot treat the URL. + return false; + } + + return [{ + action: function(siteId) { + // Confirm before delete. + return $mmUtil.showConfirm($translate.instant('mma.mod_data.confirmdeleterecord')).then(function() { + var modal = $mmUtil.showModalLoading(), + dataId = parseInt(params.d, 10), + entryId = parseInt(params.delete, 10); + + // Delete entry. + return $mmaModData.deleteEntry(entryId, siteId).catch(function(message) { + modal.dismiss(); + $mmUtil.showErrorModal(message, 'mma.mod_data.errordeleting', true); + + return $q.reject(); + }).then(function() { + var promises = []; + promises.push($mmaModData.invalidateEntryData(dataId, entryId, siteId)); + promises.push($mmaModData.invalidateEntriesData(dataId, siteId)); + + return $q.all(promises); + }).then(function() { + $mmEvents.trigger(mmaModDataEventEntryChanged, {dataId: dataId, entryId: entryId, siteId: siteId, + deleted: true}); + + modal.dismiss(); + $mmUtil.showToast('mma.mod_data.recorddeleted', true, 3000); + }).finally(function() { + // Just in case. In fact we need to dismiss the modal before showing a toast or error message. + modal.dismiss(); + }); + }); + } + }]; + }; + return self; });