From 4529d5f688a504935e311fd246d1ff1b08b3dcd0 Mon Sep 17 00:00:00 2001 From: Dani Palou Date: Fri, 21 Dec 2018 09:59:22 +0100 Subject: [PATCH] MOBILE-2061 course: Fix offline completion in 3.6 --- src/core/course/pages/section/section.ts | 8 +++- src/core/course/providers/helper.ts | 53 +++++++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/src/core/course/pages/section/section.ts b/src/core/course/pages/section/section.ts index 9289f5d46..a246213b6 100644 --- a/src/core/course/pages/section/section.ts +++ b/src/core/course/pages/section/section.ts @@ -219,8 +219,14 @@ export class CoreCourseSectionPage implements OnDestroy { const sectionWithModules = sections.find((section) => { return section.modules.length > 0; }); + if (sectionWithModules && typeof sectionWithModules.modules[0].completion != 'undefined') { - promise = Promise.resolve({}); + // The module already has completion (3.6 onwards). Load the offline completion. + promise = this.courseHelper.loadOfflineCompletion(this.course.id, sections).catch(() => { + // It shouldn't happen. + }).then(() => { + return {}; + }); } else { promise = this.courseProvider.getActivitiesCompletionStatus(this.course.id).catch(() => { // It failed, don't use completion. diff --git a/src/core/course/providers/helper.ts b/src/core/course/providers/helper.ts index 6bbc497a8..09435d2a7 100644 --- a/src/core/course/providers/helper.ts +++ b/src/core/course/providers/helper.ts @@ -29,6 +29,7 @@ import { CoreCourseOptionsDelegate, CoreCourseOptionsHandlerToDisplay } from './ import { CoreSiteHomeProvider } from '@core/sitehome/providers/sitehome'; import { CoreCoursesProvider } from '@core/courses/providers/courses'; import { CoreCourseProvider } from './course'; +import { CoreCourseOfflineProvider } from './course-offline'; import { CoreCourseModuleDelegate } from './module-delegate'; import { CoreCourseModulePrefetchDelegate } from './module-prefetch-delegate'; import { CoreLoginHelperProvider } from '@core/login/providers/helper'; @@ -122,7 +123,7 @@ export class CoreCourseHelperProvider { private courseOptionsDelegate: CoreCourseOptionsDelegate, private siteHomeProvider: CoreSiteHomeProvider, private eventsProvider: CoreEventsProvider, private fileHelper: CoreFileHelperProvider, private appProvider: CoreAppProvider, private fileProvider: CoreFileProvider, private injector: Injector, - private coursesProvider: CoreCoursesProvider) { } + private coursesProvider: CoreCoursesProvider, private courseOffline: CoreCourseOfflineProvider) { } /** * This function treats every module on the sections provided to load the handler data, treat completion @@ -776,6 +777,56 @@ export class CoreCourseHelperProvider { }); } + /** + * Load offline completion into a list of sections. + * This should be used in 3.6 sites or higher, where the course contents already include the completion. + * + * @param {number} courseId The course to get the completion. + * @param {any[]} sections List of sections of the course. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when done. + */ + loadOfflineCompletion(courseId: number, sections: any[], siteId?: string): Promise { + return this.courseOffline.getCourseManualCompletions(courseId, siteId).then((offlineCompletions) => { + if (!offlineCompletions || !offlineCompletions.length) { + // No offline completion. + return; + } + + const totalOffline = offlineCompletions.length; + let loaded = 0; + + offlineCompletions = this.utils.arrayToObject(offlineCompletions, 'cmid'); + + // Load the offline data in the modules. + for (let i = 0; i < sections.length; i++) { + const section = sections[i]; + if (!section.modules || !section.modules.length) { + // Section has no modules, ignore it. + continue; + } + + for (let j = 0; j < section.modules.length; j++) { + const module = section.modules[j], + offlineCompletion = offlineCompletions[module.id]; + + if (offlineCompletion && typeof module.completiondata != 'undefined' && + offlineCompletion.timecompleted >= module.completiondata.timecompleted * 1000) { + // The module has offline completion. Load it. + module.completiondata.state = offlineCompletion.completed; + module.completiondata.offline = true; + + // If all completions have been loaded, stop. + loaded++; + if (loaded == totalOffline) { + break; + } + } + } + } + }); + } + /** * Prefetch all the courses in the array. *