From 8a4563aa28e488b6bdd4953b703067cfd0ea6df1 Mon Sep 17 00:00:00 2001 From: Albert Gasset Date: Mon, 22 Oct 2018 13:55:45 +0200 Subject: [PATCH 1/5] MOBILE-2675 iframe: Open site content in the app in offline --- scripts/langindex.json | 1 + src/assets/lang/en.json | 1 + src/lang/en.json | 1 + src/providers/utils/iframe.ts | 49 ++++++++++++++++++++++++++++++----- 4 files changed, 46 insertions(+), 6 deletions(-) diff --git a/scripts/langindex.json b/scripts/langindex.json index fbe4bd714..118e7bc6a 100644 --- a/scripts/langindex.json +++ b/scripts/langindex.json @@ -1631,6 +1631,7 @@ "core.view": "moodle", "core.viewcode": "local_moodlemobileapp", "core.vieweditor": "local_moodlemobileapp", + "core.viewembeddedcontent": "local_moodlemobileapp", "core.viewprofile": "moodle", "core.warningofflinedatadeleted": "local_moodlemobileapp", "core.whatisyourage": "moodle", diff --git a/src/assets/lang/en.json b/src/assets/lang/en.json index d5a2e6427..cfa5bf287 100644 --- a/src/assets/lang/en.json +++ b/src/assets/lang/en.json @@ -1630,6 +1630,7 @@ "core.view": "View", "core.viewcode": "View code", "core.vieweditor": "View editor", + "core.viewembeddedcontent": "View embedded content", "core.viewprofile": "View profile", "core.warningofflinedatadeleted": "Offline data from {{component}} '{{name}}' has been deleted. {{error}}", "core.whatisyourage": "What is your age?", diff --git a/src/lang/en.json b/src/lang/en.json index 3838eab45..1828ec37b 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -240,6 +240,7 @@ "view": "View", "viewcode": "View code", "vieweditor": "View editor", + "viewembeddedcontent": "View embedded content", "viewprofile": "View profile", "warningofflinedatadeleted": "Offline data from {{component}} '{{name}}' has been deleted. {{error}}", "whatisyourage": "What is your age?", diff --git a/src/providers/utils/iframe.ts b/src/providers/utils/iframe.ts index 04863e1c8..44031c49c 100644 --- a/src/providers/utils/iframe.ts +++ b/src/providers/utils/iframe.ts @@ -13,7 +13,7 @@ // limitations under the License. import { Injectable, NgZone } from '@angular/core'; -import { Platform } from 'ionic-angular'; +import { Config, Platform } from 'ionic-angular'; import { TranslateService } from '@ngx-translate/core'; import { Network } from '@ionic-native/network'; import { CoreAppProvider } from '../app'; @@ -24,6 +24,7 @@ import { CoreDomUtilsProvider } from './dom'; import { CoreTextUtilsProvider } from './text'; import { CoreUrlUtilsProvider } from './url'; import { CoreUtilsProvider } from './utils'; +import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper'; /* * "Utils" service with helper functions for iframes, embed and similar. @@ -37,7 +38,8 @@ export class CoreIframeUtilsProvider { constructor(logger: CoreLoggerProvider, private fileProvider: CoreFileProvider, private sitesProvider: CoreSitesProvider, private urlUtils: CoreUrlUtilsProvider, private textUtils: CoreTextUtilsProvider, private utils: CoreUtilsProvider, private domUtils: CoreDomUtilsProvider, private platform: Platform, private appProvider: CoreAppProvider, - private translate: TranslateService, private network: Network, private zone: NgZone) { + private translate: TranslateService, private network: Network, private zone: NgZone, private config: Config, + private contentLinksHelper: CoreContentLinksHelperProvider) { this.logger = logger.getInstance('CoreUtilsProvider'); } @@ -57,16 +59,51 @@ export class CoreIframeUtilsProvider { return true; } - // The frame has an online URL but the app is offline. Show a warning. + // The frame has an online URL but the app is offline. Show a warning, or a link if the URL can be opened in the app. const div = document.createElement('div'); div.setAttribute('text-center', ''); div.setAttribute('padding', ''); div.classList.add('core-iframe-offline-warning'); - div.innerHTML = (isSubframe ? '' : this.domUtils.getConnectionWarningIconHtml()) + - '

' + this.translate.instant('core.networkerroriframemsg') + '

'; - element.parentElement.insertBefore(div, element); + const site = this.sitesProvider.getCurrentSite(); + const username = site ? site.getInfo().username : undefined; + this.contentLinksHelper.canHandleLink(src, undefined, username).then((canHandleLink) => { + if (canHandleLink) { + const link = document.createElement('a'); + + if (isSubframe) { + // Ionic styles are not available in subframes, adding some minimal inline styles. + link.style.display = 'block'; + link.style.padding = '1em'; + link.style.fontWeight = '500'; + link.style.textAlign = 'center'; + link.style.textTransform = 'uppercase'; + link.style.cursor = 'pointer'; + } else { + const mode = this.config.get('mode'); + link.setAttribute('ion-button', ''); + link.classList.add('button', 'button-' + mode, + 'button-default', 'button-default-' + mode, + 'button-block', 'button-block-' + mode); + } + + const message = this.translate.instant('core.viewembeddedcontent'); + link.innerHTML = isSubframe ? message : '' + message + ''; + + link.onclick = (event: Event): void => { + this.contentLinksHelper.handleLink(src, username); + event.preventDefault(); + }; + + div.appendChild(link); + } else { + div.innerHTML = (isSubframe ? '' : this.domUtils.getConnectionWarningIconHtml()) + + '

' + this.translate.instant('core.networkerroriframemsg') + '

'; + } + + element.parentElement.insertBefore(div, element); + }); // Add a class to specify that the iframe is hidden. element.classList.add('core-iframe-offline-disabled'); From d4b3496f79dc31890422063ef40e64ad8e8d76a2 Mon Sep 17 00:00:00 2001 From: Albert Gasset Date: Mon, 29 Oct 2018 10:32:27 +0100 Subject: [PATCH 2/5] MOBILE-2675 course: Fallback for fetching module info in offline --- src/core/course/providers/course.ts | 116 ++++++++++++++++------------ 1 file changed, 68 insertions(+), 48 deletions(-) diff --git a/src/core/course/providers/course.ts b/src/core/course/providers/course.ts index 16a1bc386..80b34b354 100644 --- a/src/core/course/providers/course.ts +++ b/src/core/course/providers/course.ts @@ -303,35 +303,18 @@ export class CoreCourseProvider { siteId?: string, modName?: string): Promise { siteId = siteId || this.sitesProvider.getCurrentSiteId(); - let promise; - - if (!courseId) { - // No courseId passed, try to retrieve it. - promise = this.getModuleBasicInfo(moduleId, siteId).then((module) => { - return module.course; - }); - } else { - promise = Promise.resolve(courseId); - } - - return promise.then((cid) => { - courseId = cid; - - // Get the site. - return this.sitesProvider.getSite(siteId); - }).then((site) => { - // We have courseId, we can use core_course_get_contents for compatibility. - this.logger.debug(`Getting module ${moduleId} in course ${courseId}`); - + // Helper function to do the WS request without processing the result. + const doRequest = (site: CoreSite, moduleId: number, modName: string, includeStealth: boolean, preferCache: boolean): + Promise => { const params: any = { - courseid: courseId, - options: [] - }, - preSets: any = { - omitExpires: preferCache - }; + courseid: courseId, + options: [] + }; + const preSets: CoreSiteWSPreSets = { + omitExpires: preferCache + }; - if (this.canRequestStealthModules(site)) { + if (includeStealth) { params.options.push({ name: 'includestealthmodules', value: 1 @@ -354,35 +337,72 @@ export class CoreCourseProvider { } if (!preferCache && ignoreCache) { - preSets.getFromCache = 0; - preSets.emergencyCache = 0; - } - - if (sectionId) { - params.options.push({ - name: 'sectionid', - value: sectionId - }); + preSets.getFromCache = false; + preSets.emergencyCache = false; } return site.read('core_course_get_contents', params, preSets).catch(() => { - // Error getting the module. Try to get all contents (without filtering by module). - return this.getSections(courseId, false, false, preSets, siteId); - }).then((sections) => { - for (let i = 0; i < sections.length; i++) { - const section = sections[i]; - for (let j = 0; j < section.modules.length; j++) { - const module = section.modules[j]; - if (module.id == moduleId) { - module.course = courseId; - - return module; - } + // The module might still be cached by a request with different parameters. + if (!ignoreCache && !this.appProvider.isOnline()) { + if (includeStealth) { + // Older versions didn't include the includestealthmodules option. + return doRequest(site, moduleId, modName, false, true); + } else if (modName) { + // Falback to the request for the given moduleId only. + return doRequest(site, moduleId, undefined, this.canRequestStealthModules(site), true); } } return Promise.reject(null); }); + }; + + let promise; + if (!courseId) { + // No courseId passed, try to retrieve it. + promise = this.getModuleBasicInfo(moduleId, siteId).then((module) => { + courseId = module.course; + }); + } else { + promise = Promise.resolve(); + } + + return promise.then(() => { + return this.sitesProvider.getSite(siteId); + }).then((site) => { + // We have courseId, we can use core_course_get_contents for compatibility. + this.logger.debug(`Getting module ${moduleId} in course ${courseId}`); + + return doRequest(site, moduleId, modName, this.canRequestStealthModules(site), preferCache); + }).catch(() => { + // Error getting the module. Try to get all contents (without filtering by module). + const preSets: CoreSiteWSPreSets = { + omitExpires: preferCache + }; + + if (!preferCache && ignoreCache) { + preSets.getFromCache = false; + preSets.emergencyCache = false; + } + + return this.getSections(courseId, false, false, preSets, siteId); + }).then((sections) => { + for (let i = 0; i < sections.length; i++) { + const section = sections[i]; + if (sectionId != null && !isNaN(sectionId) && sectionId != section.id) { + continue; + } + for (let j = 0; j < section.modules.length; j++) { + const module = section.modules[j]; + if (module.id == moduleId) { + module.course = courseId; + + return module; + } + } + } + + return Promise.reject(null); }); } From d2c82f25dd43d65bd1af6e9b7035feb0353057b7 Mon Sep 17 00:00:00 2001 From: Albert Gasset Date: Mon, 29 Oct 2018 10:54:02 +0100 Subject: [PATCH 3/5] MOBILE-2675 prefetch: Prefetch module info to be able to handle links --- src/addon/mod/assign/providers/prefetch-handler.ts | 2 -- src/addon/mod/lesson/providers/prefetch-handler.ts | 3 --- src/addon/mod/resource/providers/prefetch-handler.ts | 5 ----- src/addon/mod/wiki/providers/prefetch-handler.ts | 1 - src/core/course/classes/activity-prefetch-handler.ts | 9 +++++++-- src/core/course/classes/resource-prefetch-handler.ts | 7 +++++-- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/src/addon/mod/assign/providers/prefetch-handler.ts b/src/addon/mod/assign/providers/prefetch-handler.ts index 3aec8050c..23ad10b7f 100644 --- a/src/addon/mod/assign/providers/prefetch-handler.ts +++ b/src/addon/mod/assign/providers/prefetch-handler.ts @@ -230,8 +230,6 @@ export class AddonModAssignPrefetchHandler extends CoreCourseActivityPrefetchHan siteId = siteId || this.sitesProvider.getCurrentSiteId(); - promises.push(this.courseProvider.getModuleBasicInfo(module.id, siteId)); - // Get assignment to retrieve all its submissions. promises.push(this.assignProvider.getAssignment(courseId, module.id, siteId).then((assign) => { const subPromises = [], diff --git a/src/addon/mod/lesson/providers/prefetch-handler.ts b/src/addon/mod/lesson/providers/prefetch-handler.ts index 30fbc8a1d..17de0a1dd 100644 --- a/src/addon/mod/lesson/providers/prefetch-handler.ts +++ b/src/addon/mod/lesson/providers/prefetch-handler.ts @@ -358,9 +358,6 @@ export class AddonModLessonPrefetchHandler extends CoreCourseActivityPrefetchHan // Prefetch question attempts in last retake for offline calculations. promises.push(this.lessonProvider.getQuestionsAttemptsOnline(lesson.id, retake, false, undefined, false, true, siteId)); - // Get module info to be able to handle links. - promises.push(this.courseProvider.getModuleBasicInfo(module.id, siteId)); - if (accessInfo.canviewreports) { // Prefetch reports data. promises.push(this.groupsProvider.getActivityAllowedGroupsIfEnabled(module.id, undefined, siteId).then((groups) => { diff --git a/src/addon/mod/resource/providers/prefetch-handler.ts b/src/addon/mod/resource/providers/prefetch-handler.ts index 1a2342acf..30b75932b 100644 --- a/src/addon/mod/resource/providers/prefetch-handler.ts +++ b/src/addon/mod/resource/providers/prefetch-handler.ts @@ -70,11 +70,6 @@ export class AddonModResourcePrefetchHandler extends CoreCourseResourcePrefetchH promises.push(this.resourceProvider.getResourceData(courseId, module.id)); } - /* When prefetching we usually use ignoreCache=true. However, this WS call can return a lot of data, so if - a user downloads resources 1 by 1 we would be downloading the same data over and over again. Since - this data won't change often it's probably better to use ignoreCache=false. */ - promises.push(this.courseProvider.getModule(module.id, courseId, undefined, false, false, undefined, this.modName)); - return Promise.all(promises); }); } diff --git a/src/addon/mod/wiki/providers/prefetch-handler.ts b/src/addon/mod/wiki/providers/prefetch-handler.ts index 6f131ab58..a8848db0c 100644 --- a/src/addon/mod/wiki/providers/prefetch-handler.ts +++ b/src/addon/mod/wiki/providers/prefetch-handler.ts @@ -201,7 +201,6 @@ export class AddonModWikiPrefetchHandler extends CoreCourseActivityPrefetchHandl promises.push(this.wikiProvider.getWiki(courseId, module.id, false, siteId).then((wiki) => { return this.courseHelper.getModuleCourseIdByInstance(wiki.id, 'wiki', siteId); })); - promises.push(this.courseProvider.getModuleBasicInfo(module.id, siteId)); // Get related page files and fetch them. promises.push(this.getFiles(module, courseId, single, siteId).then((files) => { diff --git a/src/core/course/classes/activity-prefetch-handler.ts b/src/core/course/classes/activity-prefetch-handler.ts index 72805ca21..3c0294a93 100644 --- a/src/core/course/classes/activity-prefetch-handler.ts +++ b/src/core/course/classes/activity-prefetch-handler.ts @@ -101,8 +101,13 @@ export class CoreCourseActivityPrefetchHandlerBase extends CoreCourseModulePrefe } const prefetchPromise = this.setDownloading(module.id, siteId).then(() => { - // Package marked as downloading, call the download function. - // Send all the params except downloadFn. This includes all params passed after siteId. + // Package marked as downloading, get module info to be able to handle links. + return Promise.all([ + this.courseProvider.getModuleBasicInfo(module.id, siteId), + this.courseProvider.getModule(module.id, courseId, undefined, false, true, siteId), + ]); + }).then(() => { + // Call the download function, send all the params except downloadFn. This includes all params passed after siteId. return downloadFn.apply(downloadFn, [module, courseId, single, siteId].concat(args)); }).then((extra: any) => { // Only accept string types. diff --git a/src/core/course/classes/resource-prefetch-handler.ts b/src/core/course/classes/resource-prefetch-handler.ts index b707e2086..f2e51246b 100644 --- a/src/core/course/classes/resource-prefetch-handler.ts +++ b/src/core/course/classes/resource-prefetch-handler.ts @@ -61,8 +61,11 @@ export class CoreCourseResourcePrefetchHandlerBase extends CoreCourseModulePrefe return this.getOngoingDownload(module.id, siteId); } - // Load module contents (ignore cache so we always have the latest data). - const prefetchPromise = this.loadContents(module, courseId, true).then(() => { + // Get module info to be able to handle links. + const prefetchPromise = this.courseProvider.getModuleBasicInfo(module.id, siteId).then(() => { + // Load module contents (ignore cache so we always have the latest data). + return this.loadContents(module, courseId, true); + }).then(() => { // Get the intro files. return this.getIntroFiles(module, courseId); }).then((introFiles) => { From 5b403129cd498399d33e9d4e23b123fe58dd5e22 Mon Sep 17 00:00:00 2001 From: Albert Gasset Date: Mon, 29 Oct 2018 15:55:33 +0100 Subject: [PATCH 4/5] MOBILE-2675 offline: Ignore errors when logging actions --- src/addon/competency/pages/competency/competency.ts | 9 +++++++-- .../pages/competencysummary/competencysummary.ts | 4 +++- src/addon/mod/book/components/index/index.ts | 2 ++ src/addon/mod/chat/components/index/index.ts | 2 ++ src/addon/mod/data/components/index/index.ts | 2 ++ src/addon/mod/feedback/components/index/index.ts | 4 +++- src/addon/mod/feedback/pages/form/form.ts | 2 ++ src/addon/mod/folder/components/index/index.ts | 2 ++ src/addon/mod/glossary/pages/entry/entry.ts | 4 +++- src/addon/mod/imscp/components/index/index.ts | 2 ++ src/addon/mod/page/components/index/index.ts | 2 ++ src/addon/mod/resource/components/index/index.ts | 2 ++ src/addon/mod/resource/providers/helper.ts | 2 ++ src/addon/mod/survey/components/index/index.ts | 2 ++ src/addon/mod/url/components/index/index.ts | 2 ++ src/addon/mod/url/providers/module-handler.ts | 2 ++ src/addon/mod/wiki/components/index/index.ts | 4 +++- src/addon/mod/workshop/pages/submission/submission.ts | 2 ++ src/addon/notes/components/list/list.ts | 8 ++++++-- src/core/grades/components/course/course.ts | 4 +++- src/core/grades/pages/courses/courses.ts | 4 +++- 21 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/addon/competency/pages/competency/competency.ts b/src/addon/competency/pages/competency/competency.ts index 0443a66d8..3a20061c3 100644 --- a/src/addon/competency/pages/competency/competency.ts +++ b/src/addon/competency/pages/competency/competency.ts @@ -54,9 +54,14 @@ export class AddonCompetencyCompetencyPage { ionViewDidLoad(): void { this.fetchCompetency().then(() => { if (this.planId) { - this.competencyProvider.logCompetencyInPlanView(this.planId, this.competencyId, this.planStatus, this.userId); + this.competencyProvider.logCompetencyInPlanView(this.planId, this.competencyId, this.planStatus, this.userId) + .catch(() => { + // Ignore errors. + }); } else { - this.competencyProvider.logCompetencyInCourseView(this.courseId, this.competencyId, this.userId); + this.competencyProvider.logCompetencyInCourseView(this.courseId, this.competencyId, this.userId).catch(() => { + // Ignore errors. + }); } }).finally(() => { this.competencyLoaded = true; diff --git a/src/addon/competency/pages/competencysummary/competencysummary.ts b/src/addon/competency/pages/competencysummary/competencysummary.ts index 8464d4312..3045f44f3 100644 --- a/src/addon/competency/pages/competencysummary/competencysummary.ts +++ b/src/addon/competency/pages/competencysummary/competencysummary.ts @@ -41,7 +41,9 @@ export class AddonCompetencyCompetencySummaryPage { */ ionViewDidLoad(): void { this.fetchCompetency().then(() => { - this.competencyProvider.logCompetencyView(this.competencyId); + this.competencyProvider.logCompetencyView(this.competencyId).catch(() => { + // Ignore errors. + }); }).finally(() => { this.competencyLoaded = true; }); diff --git a/src/addon/mod/book/components/index/index.ts b/src/addon/mod/book/components/index/index.ts index 4db347675..9e8a29ebc 100644 --- a/src/addon/mod/book/components/index/index.ts +++ b/src/addon/mod/book/components/index/index.ts @@ -168,6 +168,8 @@ export class AddonModBookIndexComponent extends CoreCourseModuleMainResourceComp if (!this.nextChapter) { this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); } + }).catch(() => { + // Ignore errors. }); }).catch((error) => { this.domUtils.showErrorModalDefault(error, 'addon.mod_book.errorchapter', true); diff --git a/src/addon/mod/chat/components/index/index.ts b/src/addon/mod/chat/components/index/index.ts index 881411996..12f773827 100644 --- a/src/addon/mod/chat/components/index/index.ts +++ b/src/addon/mod/chat/components/index/index.ts @@ -49,6 +49,8 @@ export class AddonModChatIndexComponent extends CoreCourseModuleMainActivityComp this.loadContent().then(() => { this.chatProvider.logView(this.chat.id).then(() => { this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); + }).catch(() => { + // Ignore errors. }); }); } diff --git a/src/addon/mod/data/components/index/index.ts b/src/addon/mod/data/components/index/index.ts index d259527a6..5f7a9a957 100644 --- a/src/addon/mod/data/components/index/index.ts +++ b/src/addon/mod/data/components/index/index.ts @@ -105,6 +105,8 @@ export class AddonModDataIndexComponent extends CoreCourseModuleMainActivityComp this.dataProvider.logView(this.data.id).then(() => { this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); + }).catch(() => { + // Ignore errors. }); }); diff --git a/src/addon/mod/feedback/components/index/index.ts b/src/addon/mod/feedback/components/index/index.ts index 16ad4b2f1..b24f1e5bb 100644 --- a/src/addon/mod/feedback/components/index/index.ts +++ b/src/addon/mod/feedback/components/index/index.ts @@ -97,7 +97,9 @@ export class AddonModFeedbackIndexComponent extends CoreCourseModuleMainActivity super.ngOnInit(); this.loadContent(false, true).then(() => { - this.feedbackProvider.logView(this.feedback.id); + this.feedbackProvider.logView(this.feedback.id).catch(() => { + // Ignore errors. + }); }).finally(() => { this.tabsReady = true; }); diff --git a/src/addon/mod/feedback/pages/form/form.ts b/src/addon/mod/feedback/pages/form/form.ts index c4329475b..c468f03bc 100644 --- a/src/addon/mod/feedback/pages/form/form.ts +++ b/src/addon/mod/feedback/pages/form/form.ts @@ -96,6 +96,8 @@ export class AddonModFeedbackFormPage implements OnDestroy { this.fetchData().then(() => { this.feedbackProvider.logView(this.feedback.id, true).then(() => { this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); + }).catch(() => { + // Ignore errors. }); }); } diff --git a/src/addon/mod/folder/components/index/index.ts b/src/addon/mod/folder/components/index/index.ts index 290867043..f977be7e3 100644 --- a/src/addon/mod/folder/components/index/index.ts +++ b/src/addon/mod/folder/components/index/index.ts @@ -57,6 +57,8 @@ export class AddonModFolderIndexComponent extends CoreCourseModuleMainResourceCo this.loadContent().then(() => { this.folderProvider.logView(this.module.instance).then(() => { this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); + }).catch(() => { + // Ignore errors. }); }).finally(() => { this.loaded = true; diff --git a/src/addon/mod/glossary/pages/entry/entry.ts b/src/addon/mod/glossary/pages/entry/entry.ts index f6aa7df41..0e2451be6 100644 --- a/src/addon/mod/glossary/pages/entry/entry.ts +++ b/src/addon/mod/glossary/pages/entry/entry.ts @@ -48,7 +48,9 @@ export class AddonModGlossaryEntryPage { */ ionViewDidLoad(): void { this.fetchEntry().then(() => { - this.glossaryProvider.logEntryView(this.entry.id); + this.glossaryProvider.logEntryView(this.entry.id).catch(() => { + // Ignore errors. + }); }).finally(() => { this.loaded = true; }); diff --git a/src/addon/mod/imscp/components/index/index.ts b/src/addon/mod/imscp/components/index/index.ts index 8572ea5cc..7e27a7910 100644 --- a/src/addon/mod/imscp/components/index/index.ts +++ b/src/addon/mod/imscp/components/index/index.ts @@ -54,6 +54,8 @@ export class AddonModImscpIndexComponent extends CoreCourseModuleMainResourceCom this.loadContent().then(() => { this.imscpProvider.logView(this.module.instance).then(() => { this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); + }).catch(() => { + // Ignore errors. }); }); } diff --git a/src/addon/mod/page/components/index/index.ts b/src/addon/mod/page/components/index/index.ts index ed70412fb..cb008550b 100644 --- a/src/addon/mod/page/components/index/index.ts +++ b/src/addon/mod/page/components/index/index.ts @@ -55,6 +55,8 @@ export class AddonModPageIndexComponent extends CoreCourseModuleMainResourceComp this.loadContent().then(() => { this.pageProvider.logView(this.module.instance).then(() => { this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); + }).catch(() => { + // Ignore errors. }); }); } diff --git a/src/addon/mod/resource/components/index/index.ts b/src/addon/mod/resource/components/index/index.ts index 9bdb7243b..ee49883b0 100644 --- a/src/addon/mod/resource/components/index/index.ts +++ b/src/addon/mod/resource/components/index/index.ts @@ -52,6 +52,8 @@ export class AddonModResourceIndexComponent extends CoreCourseModuleMainResource this.loadContent().then(() => { this.resourceProvider.logView(this.module.instance).then(() => { this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); + }).catch(() => { + // Ignore errors. }); }); } diff --git a/src/addon/mod/resource/providers/helper.ts b/src/addon/mod/resource/providers/helper.ts index d51eba5a2..eec56772b 100644 --- a/src/addon/mod/resource/providers/helper.ts +++ b/src/addon/mod/resource/providers/helper.ts @@ -154,6 +154,8 @@ export class AddonModResourceHelperProvider { module.contents).then(() => { this.resourceProvider.logView(module.instance).then(() => { this.courseProvider.checkModuleCompletion(courseId, module.completionstatus); + }).catch(() => { + // Ignore errors. }); }).catch((error) => { this.domUtils.showErrorModalDefault(error, 'addon.mod_resource.errorwhileloadingthecontent', true); diff --git a/src/addon/mod/survey/components/index/index.ts b/src/addon/mod/survey/components/index/index.ts index bddf70a1b..7db99f743 100644 --- a/src/addon/mod/survey/components/index/index.ts +++ b/src/addon/mod/survey/components/index/index.ts @@ -55,6 +55,8 @@ export class AddonModSurveyIndexComponent extends CoreCourseModuleMainActivityCo this.loadContent(false, true).then(() => { this.surveyProvider.logView(this.survey.id).then(() => { this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); + }).catch(() => { + // Ignore errors. }); }); } diff --git a/src/addon/mod/url/components/index/index.ts b/src/addon/mod/url/components/index/index.ts index 589de7cbf..3bbdfad79 100644 --- a/src/addon/mod/url/components/index/index.ts +++ b/src/addon/mod/url/components/index/index.ts @@ -173,6 +173,8 @@ export class AddonModUrlIndexComponent extends CoreCourseModuleMainResourceCompo go(): void { this.urlProvider.logView(this.module.instance).then(() => { this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); + }).catch(() => { + // Ignore errors. }); this.urlHelper.open(this.url); } diff --git a/src/addon/mod/url/providers/module-handler.ts b/src/addon/mod/url/providers/module-handler.ts index 7043c23e1..874eb09ca 100644 --- a/src/addon/mod/url/providers/module-handler.ts +++ b/src/addon/mod/url/providers/module-handler.ts @@ -164,6 +164,8 @@ export class AddonModUrlModuleHandler implements CoreCourseModuleHandler { protected openUrl(module: any, courseId: number): void { this.urlProvider.logView(module.instance).then(() => { this.courseProvider.checkModuleCompletion(courseId, module.completionstatus); + }).catch(() => { + // Ignore errors. }); this.urlHelper.open(module.contents[0].fileurl); } diff --git a/src/addon/mod/wiki/components/index/index.ts b/src/addon/mod/wiki/components/index/index.ts index bca61171c..545c1e1c7 100644 --- a/src/addon/mod/wiki/components/index/index.ts +++ b/src/addon/mod/wiki/components/index/index.ts @@ -341,7 +341,9 @@ export class AddonModWikiIndexComponent extends CoreCourseModuleMainActivityComp this.currentPage = data.pageId; this.showLoadingAndFetch(true, false).then(() => { - this.wikiProvider.logPageView(this.currentPage); + this.wikiProvider.logPageView(this.currentPage).catch(() => { + // Ignore errors. + }); }); // Stop listening for new page events. diff --git a/src/addon/mod/workshop/pages/submission/submission.ts b/src/addon/mod/workshop/pages/submission/submission.ts index c9242e761..b12dff3b5 100644 --- a/src/addon/mod/workshop/pages/submission/submission.ts +++ b/src/addon/mod/workshop/pages/submission/submission.ts @@ -132,6 +132,8 @@ export class AddonModWorkshopSubmissionPage implements OnInit, OnDestroy { this.fetchSubmissionData().then(() => { this.workshopProvider.logViewSubmission(this.submissionId).then(() => { this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); + }).catch(() => { + // Ignore errors. }); }); } diff --git a/src/addon/notes/components/list/list.ts b/src/addon/notes/components/list/list.ts index 942670e11..b51247b3d 100644 --- a/src/addon/notes/components/list/list.ts +++ b/src/addon/notes/components/list/list.ts @@ -67,7 +67,9 @@ export class AddonNotesListComponent implements OnInit, OnDestroy { */ ngOnInit(): void { this.fetchNotes(true).then(() => { - this.notesProvider.logView(this.courseId); + this.notesProvider.logView(this.courseId).catch(() => { + // Ignore errors. + }); }); } @@ -128,7 +130,9 @@ export class AddonNotesListComponent implements OnInit, OnDestroy { this.refreshIcon = 'spinner'; this.syncIcon = 'spinner'; this.fetchNotes(true).then(() => { - this.notesProvider.logView(this.courseId); + this.notesProvider.logView(this.courseId).catch(() => { + // Ignore errors. + }); }); } diff --git a/src/core/grades/components/course/course.ts b/src/core/grades/components/course/course.ts index 757a4c3a0..8d66dd320 100644 --- a/src/core/grades/components/course/course.ts +++ b/src/core/grades/components/course/course.ts @@ -53,7 +53,9 @@ export class CoreGradesCourseComponent { } // Add log in Moodle. - return this.gradesProvider.logCourseGradesView(this.courseId, this.userId); + return this.gradesProvider.logCourseGradesView(this.courseId, this.userId).catch(() => { + // Ignore errors. + }); }).finally(() => { this.gradesLoaded = true; }); diff --git a/src/core/grades/pages/courses/courses.ts b/src/core/grades/pages/courses/courses.ts index 14a7e83dd..62a67829a 100644 --- a/src/core/grades/pages/courses/courses.ts +++ b/src/core/grades/pages/courses/courses.ts @@ -55,7 +55,9 @@ export class CoreGradesCoursesPage { } // Add log in Moodle. - return this.gradesProvider.logCoursesGradesView(); + return this.gradesProvider.logCoursesGradesView().catch(() => { + // Ignore errors. + }); }).finally(() => { this.gradesLoaded = true; }); From 2528df5261d53ff0f0aa391540ba7cba8d8cc2b9 Mon Sep 17 00:00:00 2001 From: Albert Gasset Date: Mon, 29 Oct 2018 16:03:31 +0100 Subject: [PATCH 5/5] MOBILE-2675 url: Ignore error when fetching moddule in offline --- src/addon/mod/url/providers/module-handler.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/addon/mod/url/providers/module-handler.ts b/src/addon/mod/url/providers/module-handler.ts index 874eb09ca..bf7895760 100644 --- a/src/addon/mod/url/providers/module-handler.ts +++ b/src/addon/mod/url/providers/module-handler.ts @@ -140,6 +140,9 @@ export class AddonModUrlModuleHandler implements CoreCourseModuleHandler { return this.courseProvider.loadModuleContents(module, courseId, undefined, false, false, undefined, this.modName) .then(() => { return !(module.contents && module.contents[0] && module.contents[0].fileurl); + }).catch(() => { + // Module contents could not be loaded, most probably device is offline. + return true; }); }