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...",