diff --git a/www/addons/mod/data/controllers/edit.js b/www/addons/mod/data/controllers/edit.js index afb0eb308f0..90bec456681 100644 --- a/www/addons/mod/data/controllers/edit.js +++ b/www/addons/mod/data/controllers/edit.js @@ -87,31 +87,7 @@ angular.module('mm.addons.mod_data') $scope.fields[field.id] = field; }); - if (entryId > 0) { - return $mmaModData.getEntry(data.id, entryId); - } - - for (var x in offlineActions) { - if (offlineActions[x].action == 'add') { - offlineEntry = offlineActions[x]; - - var siteInfo = $mmSite.getInfo(), - entryData = { - id: offlineEntry.entryid, - canmanageentry: true, - approved: !data.approval || data.manageapproved, - dataid: offlineEntry.dataid, - groupid: offlineEntry.groupid, - timecreated: -offlineEntry.entryid, - timemodified: -offlineEntry.entryid, - userid: siteInfo.userid, - fullname: siteInfo.fullname, - contents: {} - }; - - return {entry: entryData}; - } - } + return $mmaModDataHelper.getEntry(data, entryId, offlineActions); }).then(function(entryData) { if (entryData) { entry = entryData.entry; diff --git a/www/addons/mod/data/controllers/entry.js b/www/addons/mod/data/controllers/entry.js index d63244fe152..82731060624 100644 --- a/www/addons/mod/data/controllers/entry.js +++ b/www/addons/mod/data/controllers/entry.js @@ -87,7 +87,7 @@ angular.module('mm.addons.mod_data') $scope.fields[field.id] = field; }); - return $mmaModData.getEntry(data.id, entryId); + return $mmaModDataHelper.getEntry(data, entryId, offlineActions); }); }).then(function(entry) { entry = entry.entry; diff --git a/www/addons/mod/data/lang/en.json b/www/addons/mod/data/lang/en.json index b1931a4b23f..8ad92b9ec45 100644 --- a/www/addons/mod/data/lang/en.json +++ b/www/addons/mod/data/lang/en.json @@ -33,7 +33,6 @@ "recorddeleted": "Entry deleted", "recorddisapproved": "Entry unapproved", "resetsettings": "Reset filters", - "restore": "Restore", "search": "Search", "selectedrequired": "All selected required", "timeadded": "Time added", diff --git a/www/addons/mod/data/services/data.js b/www/addons/mod/data/services/data.js index 926b0ab2d1d..c2de10b9f0f 100644 --- a/www/addons/mod/data/services/data.js +++ b/www/addons/mod/data/services/data.js @@ -622,12 +622,7 @@ angular.module('mm.addons.mod_data') params.groupid = groupId; } - return site.write('mod_data_add_entry', params).then(function(result) { - if (result.newentryid) { - return result; - } - return $q.reject(); - }).catch(function(error) { + return site.write('mod_data_add_entry', params).catch(function(error) { return $q.reject({ error: error, wserror: $mmUtil.isWebServiceError(error) @@ -766,12 +761,7 @@ angular.module('mm.addons.mod_data') data: data }; - return site.write('mod_data_update_entry', params).then(function(result) { - if (result.updated) { - return result; - } - return $q.reject(); - }).catch(function(error) { + return site.write('mod_data_update_entry', params).catch(function(error) { return $q.reject({ error: error, wserror: $mmUtil.isWebServiceError(error) @@ -808,8 +798,8 @@ angular.module('mm.addons.mod_data') perpage: perPage || mmaModDataPerPage }, preSets = { - getCache: 0, - saveCache: 1, + getFromCache: 0, + saveToCache: 1, emergencyCache: 1 }; @@ -839,11 +829,13 @@ angular.module('mm.addons.mod_data') * @module mm.addons.mod_data * @ngdoc method * @name $mmaModData#getFields - * @param {Number} dataId Data ID. - * @param {String} [siteId] Site ID. If not defined, current site. - * @return {Promise} Promise resolved when the database is retrieved. + * @param {Number} dataId Data ID. + * @param {Boolean} [forceCache] True to always get the value from cache, false otherwise. Default false. + * @param {Boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when the fields are retrieved. */ - self.getFields = function(dataId, siteId) { + self.getFields = function(dataId, forceCache, ignoreCache, siteId) { return $mmSitesManager.getSite(siteId).then(function(site) { var params = { databaseid: dataId @@ -852,6 +844,13 @@ angular.module('mm.addons.mod_data') cacheKey: getFieldsCacheKey(dataId) }; + if (forceCache) { + preSets.omitExpires = true; + } else if (ignoreCache) { + preSets.getFromCache = 0; + preSets.emergencyCache = 0; + } + return site.read('mod_data_get_fields', params, preSets).then(function(response) { if (response && response.fields) { return response.fields; diff --git a/www/addons/mod/data/services/data_offline.js b/www/addons/mod/data/services/data_offline.js index 7a16d8d1755..4cab769cdf0 100644 --- a/www/addons/mod/data/services/data_offline.js +++ b/www/addons/mod/data/services/data_offline.js @@ -37,9 +37,6 @@ angular.module('mm.addons.mod_data') { name: 'entryid' }, - { - name: 'fields' - }, { name: 'timemodified' }, diff --git a/www/addons/mod/data/services/helper.js b/www/addons/mod/data/services/helper.js index 53666cb89e1..e0c89e45707 100644 --- a/www/addons/mod/data/services/helper.js +++ b/www/addons/mod/data/services/helper.js @@ -22,7 +22,7 @@ angular.module('mm.addons.mod_data') * @name $mmaModDataHelper */ .factory('$mmaModDataHelper', function($mmaModData, $mmaModDataFieldsDelegate, $q, mmaModDataComponent, $mmFileUploader, $mmSite, - $mmaModDataOffline, $mmFS, $mmFileUploaderHelper) { + $mmaModDataOffline, $mmFS, $mmFileUploaderHelper, $mmSitesManager) { var self = { searchOther: { @@ -101,7 +101,7 @@ angular.module('mm.addons.mod_data') replacements.timeadded = true; replacements.timemodified = true; - replacements.edit = accessInfo.canmanageentries || (accessInfo.inreadonlyperiod && record.canmanageentry); + replacements.edit = record.canmanageentry; // This already checks capabilities and readonly period. replacements.delete = replacements.edit; replacements.approve = database.approval && accessInfo.canapprove && !record.approved; replacements.disapprove = database.approval && accessInfo.canapprove && record.approved; @@ -660,6 +660,48 @@ angular.module('mm.addons.mod_data') }); }; + /** + * Get an online or offline entry. + * + * @module mm.addons.mod_data + * @ngdoc method + * @name $mmaModDataHelper#getEntry + * @param {Object} data Database. + * @param {Number} entryId Entry ID. + * @param {Object} [offlineActions] Offline data with the actions done. Required for offline entries. + * @param {String} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved with the entry. + */ + self.getEntry = function(data, entryId, offlineActions, siteId) { + if (entryId > 0) { + // It's an online entry, get it from WS. + return $mmaModData.getEntry(data.id, entryId, siteId); + } + + // It's an offline entry, search it in the offline actions. + return $mmSitesManager.getSite(siteId).then(function(site) { + for (var x in offlineActions) { + if (offlineActions[x].action == 'add') { + var offlineEntry = offlineActions[x], + siteInfo = site.getInfo(), + entryData = { + id: offlineEntry.entryid, + canmanageentry: true, + approved: !data.approval || data.manageapproved, + dataid: offlineEntry.dataid, + groupid: offlineEntry.groupid, + timecreated: -offlineEntry.entryid, + timemodified: -offlineEntry.entryid, + userid: siteInfo.userid, + fullname: siteInfo.fullname, + contents: {} + }; + + return {entry: entryData}; + } + } + }); + }; return self; }); diff --git a/www/addons/mod/data/services/prefetch_handler.js b/www/addons/mod/data/services/prefetch_handler.js index 493a2723e16..e7956f1a06f 100644 --- a/www/addons/mod/data/services/prefetch_handler.js +++ b/www/addons/mod/data/services/prefetch_handler.js @@ -323,6 +323,8 @@ angular.module('mm.addons.mod_data') var database = info.database, promises = []; + promises.push($mmaModData.getFields(database.id, false, true, siteId)); + promises.push($mmFilepool.addFilesToQueueByUrl(siteId, info.files, self.component, module.id)); angular.forEach(info.groups, function(group) { diff --git a/www/addons/mod/data/templates/action.html b/www/addons/mod/data/templates/action.html index 91581409647..1675b58fe80 100644 --- a/www/addons/mod/data/templates/action.html +++ b/www/addons/mod/data/templates/action.html @@ -1,7 +1,7 @@ - + diff --git a/www/addons/mod/lesson/lang/en.json b/www/addons/mod/lesson/lang/en.json index 92a9bb049b6..f9425621099 100644 --- a/www/addons/mod/lesson/lang/en.json +++ b/www/addons/mod/lesson/lang/en.json @@ -22,7 +22,7 @@ "emptypassword": "Password cannot be empty", "enterpassword": "Please enter the password:", "eolstudentoutoftimenoanswers": "You did not answer any questions. You have received a 0 for this lesson.", - "errorprefetchrandombranch": "This lesson contains a jump to a random content page, it cannot be attempted in the app until it has been started in web.", + "errorprefetchrandombranch": "This lesson contains a jump to a random content page. It can't be attempted in the app until it has been started in a web browser.", "errorreviewretakenotlast": "This attempt can no longer be reviewed because another attempt has been finished.", "finish": "Finish", "finishretakeoffline": "This attempt was finished offline.", diff --git a/www/core/lang/en.json b/www/core/lang/en.json index d48edfa86b1..783417f3a48 100644 --- a/www/core/lang/en.json +++ b/www/core/lang/en.json @@ -163,6 +163,7 @@ "refresh": "Refresh", "required": "Required", "requireduserdatamissing": "This user lacks some required profile data. Please, fill this data in your Moodle and try again.
{{$a}}", + "restore": "Restore", "retry": "Retry", "save": "Save", "search": " Search...",