Merge pull request #2931 from dpalou/MOBILE-3847

Mobile 3847
main
Noel De Martin 2021-09-01 15:03:34 +02:00 committed by GitHub
commit 311a8b73a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
31 changed files with 119 additions and 159 deletions

View File

@ -1497,6 +1497,7 @@
"core.course.insufficientavailablequota": "local_moodlemobileapp", "core.course.insufficientavailablequota": "local_moodlemobileapp",
"core.course.insufficientavailablespace": "local_moodlemobileapp", "core.course.insufficientavailablespace": "local_moodlemobileapp",
"core.course.manualcompletionnotsynced": "local_moodlemobileapp", "core.course.manualcompletionnotsynced": "local_moodlemobileapp",
"core.course.modulenotfound": "local_moodlemobileapp",
"core.course.nocontentavailable": "local_moodlemobileapp", "core.course.nocontentavailable": "local_moodlemobileapp",
"core.course.overriddennotice": "grades", "core.course.overriddennotice": "grades",
"core.course.refreshcourse": "local_moodlemobileapp", "core.course.refreshcourse": "local_moodlemobileapp",

View File

@ -17,7 +17,7 @@ import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@
import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; import { CoreSite, CoreSiteWSPreSets } from '@classes/site';
import { CoreInterceptor } from '@classes/interceptor'; import { CoreInterceptor } from '@classes/interceptor';
import { CoreWSExternalWarning, CoreWSExternalFile, CoreWSFile } from '@services/ws'; import { CoreWSExternalWarning, CoreWSExternalFile, CoreWSFile } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; import { CoreCourseCommonModWSOptions } from '@features/course/services/course';
import { CoreTextUtils } from '@services/utils/text'; import { CoreTextUtils } from '@services/utils/text';
import { CoreGrades } from '@features/grades/services/grades'; import { CoreGrades } from '@features/grades/services/grades';
@ -218,7 +218,7 @@ export class AddonModAssignProvider {
} }
} }
throw new CoreError('Assignment not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -14,9 +14,7 @@
import { Component, Optional, Input, OnInit } from '@angular/core'; import { Component, Optional, Input, OnInit } from '@angular/core';
import { IonContent } from '@ionic/angular'; import { IonContent } from '@ionic/angular';
import { import { CoreCourseModuleMainResourceComponent } from '@features/course/classes/main-resource-component';
CoreCourseModuleMainResourceComponent, CoreCourseResourceDownloadResult,
} from '@features/course/classes/main-resource-component';
import { import {
AddonModBookProvider, AddonModBookProvider,
AddonModBookContentsMap, AddonModBookContentsMap,
@ -130,35 +128,10 @@ export class AddonModBookIndexComponent extends CoreCourseModuleMainResourceComp
* @return Promise resolved when done. * @return Promise resolved when done.
*/ */
protected async fetchContent(refresh = false): Promise<void> { protected async fetchContent(refresh = false): Promise<void> {
const promises: Promise<void>[] = [];
let downloadResult: CoreCourseResourceDownloadResult | undefined;
// Try to get the book data. Ignore errors since this WS isn't available in some Moodle versions.
promises.push(CoreUtils.ignoreErrors(AddonModBook.getBook(this.courseId, this.module.id))
.then((book) => {
if (!book) {
return;
}
this.book = book;
this.dataRetrieved.emit(book);
this.description = book.intro;
this.displayNavBar = book.navstyle != AddonModBookNavStyle.TOC_ONLY;
this.displayTitlesInNavBar = book.navstyle == AddonModBookNavStyle.TEXT;
return;
}));
// Get module status to determine if it needs to be downloaded.
promises.push(this.downloadResourceIfNeeded(refresh).then((result) => {
downloadResult = result;
return;
}));
try { try {
await Promise.all(promises); const downloadResult = await this.downloadResourceIfNeeded(refresh);
await this.loadBookData();
this.contentsMap = AddonModBook.getContentsMap(this.module.contents); this.contentsMap = AddonModBook.getContentsMap(this.module.contents);
this.chapters = AddonModBook.getTocList(this.module.contents); this.chapters = AddonModBook.getTocList(this.module.contents);
@ -191,6 +164,21 @@ export class AddonModBookIndexComponent extends CoreCourseModuleMainResourceComp
} }
} }
/**
* Load book data from WS.
*
* @return Promise resolved when done.
*/
protected async loadBookData(): Promise<void> {
this.book = await AddonModBook.getBook(this.courseId, this.module.id);
this.dataRetrieved.emit(this.book);
this.description = this.book.intro;
this.displayNavBar = this.book.navstyle != AddonModBookNavStyle.TOC_ONLY;
this.displayTitlesInNavBar = this.book.navstyle == AddonModBookNavStyle.TEXT;
}
/** /**
* Load a book chapter. * Load a book chapter.
* *

View File

@ -17,7 +17,7 @@ import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; import { CoreSite, CoreSiteWSPreSets } from '@classes/site';
import { CoreTagItem } from '@features/tag/services/tag'; import { CoreTagItem } from '@features/tag/services/tag';
import { CoreWSExternalWarning, CoreWSExternalFile, CoreWS } from '@services/ws'; import { CoreWSExternalWarning, CoreWSExternalFile, CoreWS } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { CoreCourseLogHelper } from '@features/course/services/log-helper'; import { CoreCourseLogHelper } from '@features/course/services/log-helper';
import { CoreCourse, CoreCourseModuleContentFile } from '@features/course/services/course'; import { CoreCourse, CoreCourseModuleContentFile } from '@features/course/services/course';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
@ -103,7 +103,7 @@ export class AddonModBookProvider {
return book; return book;
} }
throw new CoreError('Book not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -61,7 +61,7 @@ export class AddonModChatProvider {
return chat; return chat;
} }
throw new CoreError('Chat not found.'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -23,7 +23,7 @@ import { CoreFilepool } from '@services/filepool';
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { AddonModChoiceOffline } from './choice-offline'; import { AddonModChoiceOffline } from './choice-offline';
import { AddonModChoiceAutoSyncData, AddonModChoiceSyncProvider } from './choice-sync'; import { AddonModChoiceAutoSyncData, AddonModChoiceSyncProvider } from './choice-sync';
@ -215,7 +215,7 @@ export class AddonModChoiceProvider {
return currentChoice; return currentChoice;
} }
throw new CoreError('Choice not found.'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -25,7 +25,7 @@ import { CoreFilepool } from '@services/filepool';
import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { AddonModDataFieldsDelegate } from './data-fields-delegate'; import { AddonModDataFieldsDelegate } from './data-fields-delegate';
import { AddonModDataOffline } from './data-offline'; import { AddonModDataOffline } from './data-offline';
import { AddonModDataAutoSyncData, AddonModDataSyncProvider } from './data-sync'; import { AddonModDataAutoSyncData, AddonModDataSyncProvider } from './data-sync';
@ -586,7 +586,7 @@ export class AddonModDataProvider {
return currentData; return currentData;
} }
throw new CoreError('Activity not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -22,7 +22,7 @@ import { CoreFilepool } from '@services/filepool';
import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreWSExternalFile, CoreWSExternalWarning, CoreWSStoredFile } from '@services/ws'; import { CoreWSExternalFile, CoreWSExternalWarning, CoreWSStoredFile } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { AddonModFeedbackOffline } from './feedback-offline'; import { AddonModFeedbackOffline } from './feedback-offline';
import { AddonModFeedbackAutoSyncData, AddonModFeedbackSyncProvider } from './feedback-sync'; import { AddonModFeedbackAutoSyncData, AddonModFeedbackSyncProvider } from './feedback-sync';
@ -605,7 +605,7 @@ export class AddonModFeedbackProvider {
return currentFeedback; return currentFeedback;
} }
throw new CoreError('Feedback not found.'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -20,7 +20,7 @@ import { CoreCourseLogHelper } from '@features/course/services/log-helper';
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
const ROOT_CACHE_KEY = 'mmaModFolder:'; const ROOT_CACHE_KEY = 'mmaModFolder:';
@ -80,7 +80,7 @@ export class AddonModFolderProvider {
return currentFolder; return currentFolder;
} }
throw new CoreError('Folder not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -13,6 +13,7 @@
// limitations under the License. // limitations under the License.
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { CoreError } from '@classes/errors/error';
import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; import { CoreSite, CoreSiteWSPreSets } from '@classes/site';
import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; import { CoreCourseCommonModWSOptions } from '@features/course/services/course';
import { CoreCourseLogHelper } from '@features/course/services/log-helper'; import { CoreCourseLogHelper } from '@features/course/services/log-helper';
@ -480,7 +481,7 @@ export class AddonModForumProvider {
const forum = forums.find(forum => forum.cmid == cmId); const forum = forums.find(forum => forum.cmid == cmId);
if (!forum) { if (!forum) {
throw new Error('Forum not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
return forum; return forum;

View File

@ -811,7 +811,7 @@ export class AddonModGlossaryProvider {
return glossary; return glossary;
} }
throw new CoreError('Glossary not found.'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**
@ -835,7 +835,7 @@ export class AddonModGlossaryProvider {
return glossary; return glossary;
} }
throw new CoreError('Glossary not found.'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -528,7 +528,7 @@ export class AddonModH5PActivityProvider {
return currentActivity; return currentActivity;
} }
throw new CoreError(Translate.instant('addon.mod_h5pactivity.errorgetactivity')); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -14,10 +14,7 @@
import { Component, OnInit, Optional } from '@angular/core'; import { Component, OnInit, Optional } from '@angular/core';
import { CoreSilentError } from '@classes/errors/silenterror'; import { CoreSilentError } from '@classes/errors/silenterror';
import { import { CoreCourseModuleMainResourceComponent } from '@features/course/classes/main-resource-component';
CoreCourseModuleMainResourceComponent,
CoreCourseResourceDownloadResult,
} from '@features/course/classes/main-resource-component';
import { CoreCourseContentsPage } from '@features/course/pages/contents/contents'; import { CoreCourseContentsPage } from '@features/course/pages/contents/contents';
import { CoreCourse } from '@features/course/services/course'; import { CoreCourse } from '@features/course/services/course';
import { CoreDomUtils } from '@services/utils/dom'; import { CoreDomUtils } from '@services/utils/dom';
@ -81,25 +78,13 @@ export class AddonModImscpIndexComponent extends CoreCourseModuleMainResourceCom
* @return Promise resolved when done. * @return Promise resolved when done.
*/ */
protected async fetchContent(refresh = false): Promise<void> { protected async fetchContent(refresh = false): Promise<void> {
let downloadResult: CoreCourseResourceDownloadResult; try {
const promises: Promise<void>[] = []; const downloadResult = await this.downloadResourceIfNeeded(refresh);
promises.push(AddonModImscp.getImscp(this.courseId, this.module.id).then((imscp) => { const imscp = await AddonModImscp.getImscp(this.courseId, this.module.id);
this.description = imscp.intro; this.description = imscp.intro;
this.dataRetrieved.emit(imscp); this.dataRetrieved.emit(imscp);
return;
}));
promises.push(this.downloadResourceIfNeeded(refresh).then((result) => {
downloadResult = result;
return;
}));
try {
await Promise.all(promises);
this.items = AddonModImscp.createItemList(this.module.contents); this.items = AddonModImscp.createItemList(this.module.contents);
if (this.items.length && typeof this.currentItem == 'undefined') { if (this.items.length && typeof this.currentItem == 'undefined') {

View File

@ -24,7 +24,7 @@ import { CoreSitesCommonWSOptions, CoreSites } from '@services/sites';
import { CoreTextUtils } from '@services/utils/text'; import { CoreTextUtils } from '@services/utils/text';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
const ROOT_CACHE_KEY = 'mmaModImscp:'; const ROOT_CACHE_KEY = 'mmaModImscp:';
@ -183,7 +183,7 @@ export class AddonModImscpProvider {
return currentImscp; return currentImscp;
} }
throw new CoreError('Imscp not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -19,7 +19,7 @@ import { CoreFilepool } from '@services/filepool';
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
const ROOT_CACHE_KEY = 'mmaModLabel:'; const ROOT_CACHE_KEY = 'mmaModLabel:';
@ -77,7 +77,7 @@ export class AddonModLabelProvider {
return currentLabel; return currentLabel;
} }
throw new CoreError('Label not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -1445,7 +1445,7 @@ export class AddonModLessonProvider {
return currentLesson; return currentLesson;
} }
throw new CoreError('Lesson not found.'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -110,7 +110,7 @@ export class AddonModLtiProvider {
return currentLti; return currentLti;
} }
throw new CoreError('Activity not found.'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -13,9 +13,7 @@
// limitations under the License. // limitations under the License.
import { Component, OnInit, Optional } from '@angular/core'; import { Component, OnInit, Optional } from '@angular/core';
import { import { CoreCourseModuleMainResourceComponent } from '@features/course/classes/main-resource-component';
CoreCourseModuleMainResourceComponent,
} from '@features/course/classes/main-resource-component';
import { CoreCourseContentsPage } from '@features/course/pages/contents/contents'; import { CoreCourseContentsPage } from '@features/course/pages/contents/contents';
import { CoreCourse, CoreCourseWSModule } from '@features/course/services/course'; import { CoreCourse, CoreCourseWSModule } from '@features/course/services/course';
import { CoreTextUtils } from '@services/utils/text'; import { CoreTextUtils } from '@services/utils/text';
@ -82,25 +80,32 @@ export class AddonModPageIndexComponent extends CoreCourseModuleMainResourceComp
* @return Promise resolved when done. * @return Promise resolved when done.
*/ */
protected async fetchContent(refresh?: boolean): Promise<void> { protected async fetchContent(refresh?: boolean): Promise<void> {
// Download the resource if it needs to be downloaded.
try { try {
// Download the resource if it needs to be downloaded.
const downloadResult = await this.downloadResourceIfNeeded(refresh); const downloadResult = await this.downloadResourceIfNeeded(refresh);
const promises: Promise<void>[] = []; const results = await Promise.all([
this.loadPageData(),
AddonModPageHelper.getPageHtml(this.module.contents, this.module.id),
]);
let getPagePromise: Promise<CoreCourseWSModule | AddonModPagePage>; this.contents = results[1];
this.warning = downloadResult?.failed ? this.getErrorDownloadingSomeFilesMessage(downloadResult.error!) : '';
// Get the module to get the latest title and description. Data should've been updated in download. } finally {
if (this.canGetPage) { this.fillContextMenu(refresh);
getPagePromise = AddonModPage.getPageData(this.courseId, this.module.id); }
} else {
getPagePromise = CoreCourse.getModule(this.module.id, this.courseId);
} }
promises.push(getPagePromise.then((page) => { /**
if (!page) { * Load page data from WS.
return; *
} * @return Promise resolved when done.
*/
protected async loadPageData(): Promise<void> {
// Get latest title, description and some extra data. Data should've been updated in download.
const page = this.canGetPage ?
await AddonModPage.getPageData(this.courseId, this.module.id) :
await CoreCourse.getModule(this.module.id, this.courseId);
this.description = 'intro' in page ? page.intro : page.description; this.description = 'intro' in page ? page.intro : page.description;
this.dataRetrieved.emit(page); this.dataRetrieved.emit(page);
@ -126,26 +131,6 @@ export class AddonModPageIndexComponent extends CoreCourseModuleMainResourceComp
} }
this.timemodified = 'timemodified' in this.page ? this.page.timemodified : undefined; this.timemodified = 'timemodified' in this.page ? this.page.timemodified : undefined;
return;
}).catch(() => {
// Ignore errors.
}));
// Get the page HTML.
promises.push(AddonModPageHelper.getPageHtml(this.module.contents, this.module.id).then((content) => {
this.contents = content;
this.warning = downloadResult?.failed ? this.getErrorDownloadingSomeFilesMessage(downloadResult.error!) : '';
return;
}));
await Promise.all(promises);
} finally {
// Pass false because downloadResourceIfNeeded already invalidates and refresh data if refresh=true.
this.fillContextMenu(false);
}
} }
} }

View File

@ -16,7 +16,7 @@ import { Injectable } from '@angular/core';
import { CoreSitesCommonWSOptions, CoreSites } from '@services/sites'; import { CoreSitesCommonWSOptions, CoreSites } from '@services/sites';
import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; import { CoreSite, CoreSiteWSPreSets } from '@classes/site';
import { CoreWSExternalWarning, CoreWSExternalFile } from '@services/ws'; import { CoreWSExternalWarning, CoreWSExternalFile } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { CoreFilepool } from '@services/filepool'; import { CoreFilepool } from '@services/filepool';
import { CoreCourse } from '@features/course/services/course'; import { CoreCourse } from '@features/course/services/course';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
@ -79,7 +79,7 @@ export class AddonModPageProvider {
return currentPage; return currentPage;
} }
throw new CoreError('Page not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -748,7 +748,7 @@ export class AddonModQuizProvider {
const quiz = response.quizzes.find(quiz => quiz[key] == value); const quiz = response.quizzes.find(quiz => quiz[key] == value);
if (!quiz) { if (!quiz) {
throw new CoreError('Quiz not found.'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
return quiz; return quiz;

View File

@ -14,9 +14,7 @@
import { Component, OnDestroy, OnInit, Optional } from '@angular/core'; import { Component, OnDestroy, OnInit, Optional } from '@angular/core';
import { CoreError } from '@classes/errors/error'; import { CoreError } from '@classes/errors/error';
import { import { CoreCourseModuleMainResourceComponent } from '@features/course/classes/main-resource-component';
CoreCourseModuleMainResourceComponent,
} from '@features/course/classes/main-resource-component';
import { CoreCourseContentsPage } from '@features/course/pages/contents/contents'; import { CoreCourseContentsPage } from '@features/course/pages/contents/contents';
import { CoreCourse, CoreCourseWSModule } from '@features/course/services/course'; import { CoreCourse, CoreCourseWSModule } from '@features/course/services/course';
import { CoreCourseModulePrefetchDelegate } from '@features/course/services/module-prefetch-delegate'; import { CoreCourseModulePrefetchDelegate } from '@features/course/services/module-prefetch-delegate';
@ -118,13 +116,13 @@ export class AddonModResourceIndexComponent extends CoreCourseModuleMainResource
// Get the resource instance to get the latest name/description and to know if it's embedded. // Get the resource instance to get the latest name/description and to know if it's embedded.
if (this.canGetResource) { if (this.canGetResource) {
resource = await CoreUtils.ignoreErrors(AddonModResource.getResourceData(this.courseId, this.module.id)); resource = await AddonModResource.getResourceData(this.courseId, this.module.id);
this.description = resource?.intro || ''; this.description = resource.intro || '';
options = resource?.displayoptions ? CoreTextUtils.unserialize(resource.displayoptions) : {}; options = resource.displayoptions ? CoreTextUtils.unserialize(resource.displayoptions) : {};
} else { } else {
resource = await CoreUtils.ignoreErrors(CoreCourse.getModule(this.module.id, this.courseId)); resource = await CoreCourse.getModule(this.module.id, this.courseId);
this.description = resource?.description || ''; this.description = resource.description || '';
options = resource?.customdata ? CoreTextUtils.unserialize(CoreTextUtils.parseJSON(resource.customdata)) : {}; options = resource.customdata ? CoreTextUtils.unserialize(CoreTextUtils.parseJSON(resource.customdata)) : {};
} }
try { try {

View File

@ -21,7 +21,7 @@ import { CoreFilepool } from '@services/filepool';
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; import { CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
const ROOT_CACHE_KEY = 'mmaModResource:'; const ROOT_CACHE_KEY = 'mmaModResource:';
@ -82,7 +82,7 @@ export class AddonModResourceProvider {
return currentResource; return currentResource;
} }
throw new CoreError('Resource not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -1105,7 +1105,7 @@ export class AddonModScormProvider {
const currentScorm = <AddonModScormScorm> response.scorms.find(scorm => scorm[key] == value); const currentScorm = <AddonModScormScorm> response.scorms.find(scorm => scorm[key] == value);
if (!currentScorm) { if (!currentScorm) {
throw new CoreError('SCORM not found.'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
// If the SCORM isn't available the WS returns a warning and it doesn't return timeopen and timeclosed. // If the SCORM isn't available the WS returns a warning and it doesn't return timeopen and timeclosed.

View File

@ -22,7 +22,7 @@ import { CoreFilepool } from '@services/filepool';
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; import { CoreStatusWithWarningsWSResponse, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { AddonModSurveyOffline } from './survey-offline'; import { AddonModSurveyOffline } from './survey-offline';
const ROOT_CACHE_KEY = 'mmaModSurvey:'; const ROOT_CACHE_KEY = 'mmaModSurvey:';
@ -121,7 +121,7 @@ export class AddonModSurveyProvider {
return currentSurvey; return currentSurvey;
} }
throw new CoreError('Activity not found.'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -28,7 +28,7 @@
<core-iframe [src]="url"></core-iframe> <core-iframe [src]="url"></core-iframe>
</div> </div>
<ion-list *ngIf="!shouldIframe && (!shouldEmbed || !isOther)"> <ion-list *ngIf="url && !shouldIframe && (!shouldEmbed || !isOther)">
<ion-item *ngIf="shouldEmbed"> <ion-item *ngIf="shouldEmbed">
<ion-label> <ion-label>
<img *ngIf="isImage" [alt]="name" [src]="url"> <img *ngIf="isImage" [alt]="name" [src]="url">

View File

@ -16,7 +16,7 @@ import { Injectable } from '@angular/core';
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
import { CoreSite, CoreSiteWSPreSets } from '@classes/site'; import { CoreSite, CoreSiteWSPreSets } from '@classes/site';
import { CoreWSExternalWarning, CoreWSExternalFile } from '@services/ws'; import { CoreWSExternalWarning, CoreWSExternalFile } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { CoreConstants } from '@/core/constants'; import { CoreConstants } from '@/core/constants';
import { CoreMimetypeUtils } from '@services/utils/mimetype'; import { CoreMimetypeUtils } from '@services/utils/mimetype';
import { CoreCourse } from '@features/course/services/course'; import { CoreCourse } from '@features/course/services/course';
@ -131,7 +131,7 @@ export class AddonModUrlProvider {
return currentUrl; return currentUrl;
} }
throw new CoreError('Url not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -397,7 +397,7 @@ export class AddonModWikiProvider {
return currentWiki; return currentWiki;
} }
throw new CoreError('Wiki not found.'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**

View File

@ -23,7 +23,7 @@ import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@
import { CoreTextFormat, defaultTextFormat } from '@services/utils/text'; import { CoreTextFormat, defaultTextFormat } from '@services/utils/text';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreStatusWithWarningsWSResponse, CoreWS, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws'; import { CoreStatusWithWarningsWSResponse, CoreWS, CoreWSExternalFile, CoreWSExternalWarning } from '@services/ws';
import { makeSingleton } from '@singletons'; import { makeSingleton, Translate } from '@singletons';
import { CoreFormFields } from '@singletons/form'; import { CoreFormFields } from '@singletons/form';
import { AddonModWorkshopOffline } from './workshop-offline'; import { AddonModWorkshopOffline } from './workshop-offline';
import { AddonModWorkshopAutoSyncData, AddonModWorkshopSyncProvider } from './workshop-sync'; import { AddonModWorkshopAutoSyncData, AddonModWorkshopSyncProvider } from './workshop-sync';
@ -272,7 +272,7 @@ export class AddonModWorkshopProvider {
const workshop = response.workshops.find((workshop) => workshop[key] == value); const workshop = response.workshops.find((workshop) => workshop[key] == value);
if (!workshop) { if (!workshop) {
throw new CoreError('Activity not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
// Set submission types for Moodle 3.5 and older. // Set submission types for Moodle 3.5 and older.

View File

@ -26,6 +26,7 @@ import { CoreDomUtils } from '@services/utils/dom';
import { CoreWSExternalWarning } from '@services/ws'; import { CoreWSExternalWarning } from '@services/ws';
import { CoreCourseContentsPage } from '../pages/contents/contents'; import { CoreCourseContentsPage } from '../pages/contents/contents';
import { CoreConstants } from '@/core/constants'; import { CoreConstants } from '@/core/constants';
import { CoreSites } from '@services/sites';
/** /**
* Template class to easily create CoreCourseModuleMainComponent of activities. * Template class to easily create CoreCourseModuleMainComponent of activities.
@ -211,7 +212,7 @@ export class CoreCourseModuleMainActivityComponent extends CoreCourseModuleMainR
await this.fetchContent(refresh, sync, showErrors); await this.fetchContent(refresh, sync, showErrors);
} catch (error) { } catch (error) {
if (!refresh) { if (!refresh && !CoreSites.getCurrentSite()?.isOfflineDisabled()) {
// Some call failed, retry without using cache since it might be a new activity. // Some call failed, retry without using cache since it might be a new activity.
return await this.refreshContent(sync); return await this.refreshContent(sync);
} }

View File

@ -41,6 +41,7 @@
"insufficientavailablespace": "You are trying to download {{size}}. This will leave your device with insufficient space to operate normally. Please clear some storage space first.", "insufficientavailablespace": "You are trying to download {{size}}. This will leave your device with insufficient space to operate normally. Please clear some storage space first.",
"insufficientavailablequota": "Your device could not allocate space to save this download. It may be reserving space for app and system updates. Please clear some storage space first.", "insufficientavailablequota": "Your device could not allocate space to save this download. It may be reserving space for app and system updates. Please clear some storage space first.",
"manualcompletionnotsynced": "Manual completion not synchronised.", "manualcompletionnotsynced": "Manual completion not synchronised.",
"modulenotfound": "Resource or activity not found, please make sure you're online and it's still available.",
"nocontentavailable": "No content available at the moment.", "nocontentavailable": "No content available at the moment.",
"overriddennotice": "Your final grade from this activity was manually adjusted.", "overriddennotice": "Your final grade from this activity was manually adjusted.",
"refreshcourse": "Refresh course", "refreshcourse": "Refresh course",

View File

@ -505,7 +505,7 @@ export class CoreCourseProvider {
return foundModule; return foundModule;
} }
throw Error('Module not found'); throw new CoreError(Translate.instant('core.course.modulenotfound'));
} }
/** /**