MOBILE-2873 sync: Sync activities on course prefetch
This commit is contained in:
		
							parent
							
								
									a26fbeab92
								
							
						
					
					
						commit
						910ee50600
					
				@ -28,6 +28,7 @@ import { CoreGradesHelperProvider } from '@core/grades/providers/helper';
 | 
			
		||||
import { CoreUserProvider } from '@core/user/providers/user';
 | 
			
		||||
import { AddonModAssignProvider } from './assign';
 | 
			
		||||
import { AddonModAssignHelperProvider } from './helper';
 | 
			
		||||
import { AddonModAssignSyncProvider } from './assign-sync';
 | 
			
		||||
import { AddonModAssignFeedbackDelegate } from './feedback-delegate';
 | 
			
		||||
import { AddonModAssignSubmissionDelegate } from './submission-delegate';
 | 
			
		||||
 | 
			
		||||
@ -47,7 +48,8 @@ export class AddonModAssignPrefetchHandler extends CoreCourseActivityPrefetchHan
 | 
			
		||||
            protected textUtils: CoreTextUtilsProvider, protected feedbackDelegate: AddonModAssignFeedbackDelegate,
 | 
			
		||||
            protected submissionDelegate: AddonModAssignSubmissionDelegate, protected courseHelper: CoreCourseHelperProvider,
 | 
			
		||||
            protected groupsProvider: CoreGroupsProvider, protected gradesHelper: CoreGradesHelperProvider,
 | 
			
		||||
            protected userProvider: CoreUserProvider, protected assignHelper: AddonModAssignHelperProvider) {
 | 
			
		||||
            protected userProvider: CoreUserProvider, protected assignHelper: AddonModAssignHelperProvider,
 | 
			
		||||
            protected syncProvider: AddonModAssignSyncProvider) {
 | 
			
		||||
 | 
			
		||||
        super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
 | 
			
		||||
    }
 | 
			
		||||
@ -454,4 +456,15 @@ export class AddonModAssignPrefetchHandler extends CoreCourseActivityPrefetchHan
 | 
			
		||||
 | 
			
		||||
        return Promise.all(promises);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        return this.syncProvider.syncAssign(module.instance, siteId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
import { Injectable } from '@angular/core';
 | 
			
		||||
import { Injectable, Injector } from '@angular/core';
 | 
			
		||||
import { TranslateService } from '@ngx-translate/core';
 | 
			
		||||
import { CoreAppProvider } from '@providers/app';
 | 
			
		||||
import { CoreFilepoolProvider } from '@providers/filepool';
 | 
			
		||||
@ -22,6 +22,7 @@ import { CoreUtilsProvider } from '@providers/utils/utils';
 | 
			
		||||
import { CoreCourseProvider } from '@core/course/providers/course';
 | 
			
		||||
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
 | 
			
		||||
import { CoreUserProvider } from '@core/user/providers/user';
 | 
			
		||||
import { AddonModChoiceSyncProvider } from './sync';
 | 
			
		||||
import { AddonModChoiceProvider } from './choice';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -34,10 +35,12 @@ export class AddonModChoicePrefetchHandler extends CoreCourseActivityPrefetchHan
 | 
			
		||||
    component = AddonModChoiceProvider.COMPONENT;
 | 
			
		||||
    updatesNames = /^configuration$|^.*files$|^answers$/;
 | 
			
		||||
 | 
			
		||||
    protected syncProvider: AddonModChoiceSyncProvider; // It will be injected later to prevent circular dependencies.
 | 
			
		||||
 | 
			
		||||
    constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
 | 
			
		||||
            courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
 | 
			
		||||
            domUtils: CoreDomUtilsProvider, protected choiceProvider: AddonModChoiceProvider,
 | 
			
		||||
            protected userProvider: CoreUserProvider) {
 | 
			
		||||
            protected userProvider: CoreUserProvider, protected injector: Injector) {
 | 
			
		||||
 | 
			
		||||
        super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
 | 
			
		||||
    }
 | 
			
		||||
@ -133,4 +136,19 @@ export class AddonModChoicePrefetchHandler extends CoreCourseActivityPrefetchHan
 | 
			
		||||
    invalidateModule(module: any, courseId: number): Promise<any> {
 | 
			
		||||
        return this.choiceProvider.invalidateChoiceData(courseId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        if (!this.syncProvider) {
 | 
			
		||||
            this.syncProvider = this.injector.get(AddonModChoiceSyncProvider);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this.syncProvider.syncChoice(module.instance, undefined, siteId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -127,12 +127,13 @@ export class AddonModChoiceSyncProvider extends CoreCourseActivitySyncBaseProvid
 | 
			
		||||
     * Synchronize a choice.
 | 
			
		||||
     *
 | 
			
		||||
     * @param  {number} choiceId Choice ID to be synced.
 | 
			
		||||
     * @param  {number} userId   User the answers belong to.
 | 
			
		||||
     * @param  {number} [userId] User the answers belong to.
 | 
			
		||||
     * @param  {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    syncChoice(choiceId: number, userId: number, siteId?: string): Promise<any> {
 | 
			
		||||
    syncChoice(choiceId: number, userId?: number, siteId?: string): Promise<any> {
 | 
			
		||||
        siteId = siteId || this.sitesProvider.getCurrentSiteId();
 | 
			
		||||
        userId = userId || this.sitesProvider.getCurrentSiteUserId();
 | 
			
		||||
 | 
			
		||||
        const syncId = this.getSyncId(choiceId, userId);
 | 
			
		||||
        if (this.isSyncing(syncId, siteId)) {
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,7 @@ import { AddonModDataHelperProvider } from '../../providers/helper';
 | 
			
		||||
import { AddonModDataOfflineProvider } from '../../providers/offline';
 | 
			
		||||
import { AddonModDataSyncProvider } from '../../providers/sync';
 | 
			
		||||
import { AddonModDataComponentsModule } from '../components.module';
 | 
			
		||||
import { AddonModDataPrefetchHandler } from '../../providers/prefetch-handler';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Component that displays a data index page.
 | 
			
		||||
@ -82,7 +83,7 @@ export class AddonModDataIndexComponent extends CoreCourseModuleMainActivityComp
 | 
			
		||||
 | 
			
		||||
    constructor(injector: Injector, private dataProvider: AddonModDataProvider, private dataHelper: AddonModDataHelperProvider,
 | 
			
		||||
            private dataOffline: AddonModDataOfflineProvider, @Optional() content: Content,
 | 
			
		||||
            private dataSync: AddonModDataSyncProvider, private timeUtils: CoreTimeUtilsProvider,
 | 
			
		||||
            private prefetchHandler: AddonModDataPrefetchHandler, private timeUtils: CoreTimeUtilsProvider,
 | 
			
		||||
            private groupsProvider: CoreGroupsProvider, private commentsProvider: CoreCommentsProvider,
 | 
			
		||||
            private modalCtrl: ModalController, private utils: CoreUtilsProvider, protected navCtrl: NavController,
 | 
			
		||||
            private ratingOffline: CoreRatingOfflineProvider) {
 | 
			
		||||
@ -520,17 +521,7 @@ export class AddonModDataIndexComponent extends CoreCourseModuleMainActivityComp
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    protected sync(): Promise<any> {
 | 
			
		||||
        const promises = [
 | 
			
		||||
            this.dataSync.syncDatabase(this.data.id),
 | 
			
		||||
            this.dataSync.syncRatings(this.data.coursemodule)
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return Promise.all(promises).then((results) => {
 | 
			
		||||
            return results.reduce((a, b) => ({
 | 
			
		||||
                updated: a.updated || b.updated,
 | 
			
		||||
                warnings: (a.warnings || []).concat(b.warnings || []),
 | 
			
		||||
            }), {updated: false});
 | 
			
		||||
        });
 | 
			
		||||
        return this.prefetchHandler.sync(this.module);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 | 
			
		||||
@ -26,6 +26,7 @@ import { CoreCourseProvider } from '@core/course/providers/course';
 | 
			
		||||
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
 | 
			
		||||
import { CoreRatingProvider } from '@core/rating/providers/rating';
 | 
			
		||||
import { AddonModDataProvider } from './data';
 | 
			
		||||
import { AddonModDataSyncProvider } from './sync';
 | 
			
		||||
import { AddonModDataHelperProvider } from './helper';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -43,7 +44,7 @@ export class AddonModDataPrefetchHandler extends CoreCourseActivityPrefetchHandl
 | 
			
		||||
            domUtils: CoreDomUtilsProvider, protected dataProvider: AddonModDataProvider,
 | 
			
		||||
            protected timeUtils: CoreTimeUtilsProvider, protected dataHelper: AddonModDataHelperProvider,
 | 
			
		||||
            protected groupsProvider: CoreGroupsProvider, protected commentsProvider: CoreCommentsProvider,
 | 
			
		||||
            private ratingProvider: CoreRatingProvider) {
 | 
			
		||||
            private ratingProvider: CoreRatingProvider, protected syncProvider: AddonModDataSyncProvider) {
 | 
			
		||||
 | 
			
		||||
        super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
 | 
			
		||||
    }
 | 
			
		||||
@ -301,4 +302,25 @@ export class AddonModDataPrefetchHandler extends CoreCourseActivityPrefetchHandl
 | 
			
		||||
            return Promise.all(promises);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        const promises = [
 | 
			
		||||
            this.syncProvider.syncDatabase(module.instance, siteId),
 | 
			
		||||
            this.syncProvider.syncRatings(module.id, true, siteId)
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return Promise.all(promises).then((results) => {
 | 
			
		||||
            return results.reduce((a, b) => ({
 | 
			
		||||
                updated: a.updated || b.updated,
 | 
			
		||||
                warnings: (a.warnings || []).concat(b.warnings || []),
 | 
			
		||||
            }), {updated: false});
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -114,7 +114,7 @@ export class AddonModDataSyncProvider extends CoreSyncBaseProvider {
 | 
			
		||||
            return Promise.all(this.utils.objectToArray(promises));
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        promises.push(this.syncRatings(undefined, siteId));
 | 
			
		||||
        promises.push(this.syncRatings(undefined, force, siteId));
 | 
			
		||||
 | 
			
		||||
        return Promise.all(promises);
 | 
			
		||||
    }
 | 
			
		||||
@ -362,13 +362,14 @@ export class AddonModDataSyncProvider extends CoreSyncBaseProvider {
 | 
			
		||||
     * Synchronize offline ratings.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {number} [cmId] Course module to be synced. If not defined, sync all databases.
 | 
			
		||||
     * @param {boolean} [force] Wether to force sync not depending on last execution.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    syncRatings(cmId?: number, siteId?: string): Promise<any> {
 | 
			
		||||
    syncRatings(cmId?: number, force?: boolean, siteId?: string): Promise<any> {
 | 
			
		||||
        siteId = siteId || this.sitesProvider.getCurrentSiteId();
 | 
			
		||||
 | 
			
		||||
         return this.ratingSync.syncRatings('mod_data', 'entry', 'module', cmId, 0, siteId).then((results) => {
 | 
			
		||||
         return this.ratingSync.syncRatings('mod_data', 'entry', 'module', cmId, 0, force, siteId).then((results) => {
 | 
			
		||||
            let updated = false;
 | 
			
		||||
            const warnings = [];
 | 
			
		||||
            const promises = [];
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
import { Injectable } from '@angular/core';
 | 
			
		||||
import { Injectable, Injector } from '@angular/core';
 | 
			
		||||
import { TranslateService } from '@ngx-translate/core';
 | 
			
		||||
import { CoreAppProvider } from '@providers/app';
 | 
			
		||||
import { CoreFilepoolProvider } from '@providers/filepool';
 | 
			
		||||
@ -25,6 +25,7 @@ import { AddonModFeedbackProvider } from './feedback';
 | 
			
		||||
import { AddonModFeedbackHelperProvider } from './helper';
 | 
			
		||||
import { CoreTimeUtilsProvider } from '@providers/utils/time';
 | 
			
		||||
import { CoreGroupsProvider } from '@providers/groups';
 | 
			
		||||
import { AddonModFeedbackSyncProvider } from './sync';
 | 
			
		||||
import { CoreUserProvider } from '@core/user/providers/user';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -37,11 +38,14 @@ export class AddonModFeedbackPrefetchHandler extends CoreCourseActivityPrefetchH
 | 
			
		||||
    component = AddonModFeedbackProvider.COMPONENT;
 | 
			
		||||
    updatesNames = /^configuration$|^.*files$|^attemptsfinished|^attemptsunfinished$/;
 | 
			
		||||
 | 
			
		||||
    protected syncProvider: AddonModFeedbackSyncProvider; // It will be injected later to prevent circular dependencies.
 | 
			
		||||
 | 
			
		||||
    constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
 | 
			
		||||
            courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
 | 
			
		||||
            domUtils: CoreDomUtilsProvider, protected feedbackProvider: AddonModFeedbackProvider,
 | 
			
		||||
            protected userProvider: CoreUserProvider, protected feedbackHelper: AddonModFeedbackHelperProvider,
 | 
			
		||||
            protected timeUtils: CoreTimeUtilsProvider, protected groupsProvider: CoreGroupsProvider) {
 | 
			
		||||
            protected timeUtils: CoreTimeUtilsProvider, protected groupsProvider: CoreGroupsProvider,
 | 
			
		||||
            protected injector: Injector) {
 | 
			
		||||
 | 
			
		||||
        super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
 | 
			
		||||
    }
 | 
			
		||||
@ -239,4 +243,19 @@ export class AddonModFeedbackPrefetchHandler extends CoreCourseActivityPrefetchH
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        if (!this.syncProvider) {
 | 
			
		||||
            this.syncProvider = this.injector.get(AddonModFeedbackSyncProvider);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this.syncProvider.syncFeedback(module.instance, siteId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -376,18 +376,7 @@ export class AddonModForumIndexComponent extends CoreCourseModuleMainActivityCom
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    protected sync(): Promise<boolean> {
 | 
			
		||||
        const promises = [];
 | 
			
		||||
 | 
			
		||||
        promises.push(this.forumSync.syncForumDiscussions(this.forum.id));
 | 
			
		||||
        promises.push(this.forumSync.syncForumReplies(this.forum.id));
 | 
			
		||||
        promises.push(this.forumSync.syncRatings(this.forum.cmid));
 | 
			
		||||
 | 
			
		||||
        return Promise.all(promises).then((results) => {
 | 
			
		||||
            return results.reduce((a, b) => ({
 | 
			
		||||
                updated: a.updated || b.updated,
 | 
			
		||||
                warnings: (a.warnings || []).concat(b.warnings || []),
 | 
			
		||||
            }), {updated: false});
 | 
			
		||||
        });
 | 
			
		||||
        return this.prefetchHandler.sync(this.module);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/acti
 | 
			
		||||
import { CoreGroupsProvider } from '@providers/groups';
 | 
			
		||||
import { CoreUserProvider } from '@core/user/providers/user';
 | 
			
		||||
import { AddonModForumProvider } from './forum';
 | 
			
		||||
import { AddonModForumSyncProvider } from './sync';
 | 
			
		||||
import { CoreRatingProvider } from '@core/rating/providers/rating';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -46,7 +47,8 @@ export class AddonModForumPrefetchHandler extends CoreCourseActivityPrefetchHand
 | 
			
		||||
            private groupsProvider: CoreGroupsProvider,
 | 
			
		||||
            private userProvider: CoreUserProvider,
 | 
			
		||||
            private forumProvider: AddonModForumProvider,
 | 
			
		||||
            private ratingProvider: CoreRatingProvider) {
 | 
			
		||||
            private ratingProvider: CoreRatingProvider,
 | 
			
		||||
            private syncProvider: AddonModForumSyncProvider) {
 | 
			
		||||
 | 
			
		||||
        super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
 | 
			
		||||
    }
 | 
			
		||||
@ -264,4 +266,26 @@ export class AddonModForumPrefetchHandler extends CoreCourseActivityPrefetchHand
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        const promises = [];
 | 
			
		||||
 | 
			
		||||
        promises.push(this.syncProvider.syncForumDiscussions(module.instance, undefined, siteId));
 | 
			
		||||
        promises.push(this.syncProvider.syncForumReplies(module.instance, undefined, siteId));
 | 
			
		||||
        promises.push(this.syncProvider.syncRatings(module.id, undefined, true, siteId));
 | 
			
		||||
 | 
			
		||||
        return Promise.all(promises).then((results) => {
 | 
			
		||||
            return results.reduce((a, b) => ({
 | 
			
		||||
                updated: a.updated || b.updated,
 | 
			
		||||
                warnings: (a.warnings || []).concat(b.warnings || []),
 | 
			
		||||
            }), {updated: false});
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -23,6 +23,7 @@ import { AddonModGlossaryProvider } from '../../providers/glossary';
 | 
			
		||||
import { AddonModGlossaryOfflineProvider } from '../../providers/offline';
 | 
			
		||||
import { AddonModGlossarySyncProvider } from '../../providers/sync';
 | 
			
		||||
import { AddonModGlossaryModePickerPopoverComponent } from '../mode-picker/mode-picker';
 | 
			
		||||
import { AddonModGlossaryPrefetchHandler } from '../../providers/prefetch-handler';
 | 
			
		||||
 | 
			
		||||
type FetchMode = 'author_all' | 'cat_all' | 'newest_first' | 'recently_updated' | 'search' | 'letter_all';
 | 
			
		||||
 | 
			
		||||
@ -68,7 +69,7 @@ export class AddonModGlossaryIndexComponent extends CoreCourseModuleMainActivity
 | 
			
		||||
            private popoverCtrl: PopoverController,
 | 
			
		||||
            private glossaryProvider: AddonModGlossaryProvider,
 | 
			
		||||
            private glossaryOffline: AddonModGlossaryOfflineProvider,
 | 
			
		||||
            private glossarySync: AddonModGlossarySyncProvider,
 | 
			
		||||
            private prefetchHandler: AddonModGlossaryPrefetchHandler,
 | 
			
		||||
            private ratingOffline: CoreRatingOfflineProvider) {
 | 
			
		||||
        super(injector);
 | 
			
		||||
    }
 | 
			
		||||
@ -219,17 +220,7 @@ export class AddonModGlossaryIndexComponent extends CoreCourseModuleMainActivity
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    protected sync(): Promise<boolean> {
 | 
			
		||||
        const promises = [
 | 
			
		||||
            this.glossarySync.syncGlossaryEntries(this.glossary.id),
 | 
			
		||||
            this.glossarySync.syncRatings(this.glossary.coursemodule)
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return Promise.all(promises).then((results) => {
 | 
			
		||||
            return results.reduce((a, b) => ({
 | 
			
		||||
                updated: a.updated || b.updated,
 | 
			
		||||
                warnings: (a.warnings || []).concat(b.warnings || []),
 | 
			
		||||
            }), {updated: false});
 | 
			
		||||
        });
 | 
			
		||||
        return this.prefetchHandler.sync(this.module);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/acti
 | 
			
		||||
import { CoreUserProvider } from '@core/user/providers/user';
 | 
			
		||||
import { AddonModGlossaryProvider } from './glossary';
 | 
			
		||||
import { CoreRatingProvider } from '@core/rating/providers/rating';
 | 
			
		||||
import { AddonModGlossarySyncProvider } from './sync';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handler to prefetch forums.
 | 
			
		||||
@ -44,7 +45,8 @@ export class AddonModGlossaryPrefetchHandler extends CoreCourseActivityPrefetchH
 | 
			
		||||
            domUtils: CoreDomUtilsProvider,
 | 
			
		||||
            private userProvider: CoreUserProvider,
 | 
			
		||||
            private ratingProvider: CoreRatingProvider,
 | 
			
		||||
            private glossaryProvider: AddonModGlossaryProvider) {
 | 
			
		||||
            private glossaryProvider: AddonModGlossaryProvider,
 | 
			
		||||
            private syncProvider: AddonModGlossarySyncProvider) {
 | 
			
		||||
 | 
			
		||||
        super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
 | 
			
		||||
    }
 | 
			
		||||
@ -187,4 +189,25 @@ export class AddonModGlossaryPrefetchHandler extends CoreCourseActivityPrefetchH
 | 
			
		||||
            return Promise.all(promises);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        const promises = [
 | 
			
		||||
            this.syncProvider.syncGlossaryEntries(module.instance, undefined, siteId),
 | 
			
		||||
            this.syncProvider.syncRatings(module.id, undefined, siteId)
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        return Promise.all(promises).then((results) => {
 | 
			
		||||
            return results.reduce((a, b) => ({
 | 
			
		||||
                updated: a.updated || b.updated,
 | 
			
		||||
                warnings: (a.warnings || []).concat(b.warnings || []),
 | 
			
		||||
            }), {updated: false});
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -118,7 +118,7 @@ export class AddonModGlossarySyncProvider extends CoreSyncBaseProvider {
 | 
			
		||||
            return Promise.all(this.utils.objectToArray(promises));
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        promises.push(this.syncRatings(undefined, siteId));
 | 
			
		||||
        promises.push(this.syncRatings(undefined, force, siteId));
 | 
			
		||||
 | 
			
		||||
        return Promise.all(promises);
 | 
			
		||||
    }
 | 
			
		||||
@ -259,13 +259,14 @@ export class AddonModGlossarySyncProvider extends CoreSyncBaseProvider {
 | 
			
		||||
     * Synchronize offline ratings.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {number} [cmId] Course module to be synced. If not defined, sync all glossaries.
 | 
			
		||||
     * @param {boolean} [force] Wether to force sync not depending on last execution.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved if sync is successful, rejected otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    syncRatings(cmId?: number, siteId?: string): Promise<any> {
 | 
			
		||||
    syncRatings(cmId?: number, force?: boolean, siteId?: string): Promise<any> {
 | 
			
		||||
        siteId = siteId || this.sitesProvider.getCurrentSiteId();
 | 
			
		||||
 | 
			
		||||
         return this.ratingSync.syncRatings('mod_glossary', 'entry', 'module', cmId, 0, siteId).then((results) => {
 | 
			
		||||
         return this.ratingSync.syncRatings('mod_glossary', 'entry', 'module', cmId, 0, force, siteId).then((results) => {
 | 
			
		||||
            let updated = false;
 | 
			
		||||
            const warnings = [];
 | 
			
		||||
            const promises = [];
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
import { Injectable } from '@angular/core';
 | 
			
		||||
import { Injectable, Injector } from '@angular/core';
 | 
			
		||||
import { ModalController } from 'ionic-angular';
 | 
			
		||||
import { TranslateService } from '@ngx-translate/core';
 | 
			
		||||
import { CoreAppProvider } from '@providers/app';
 | 
			
		||||
@ -24,6 +24,7 @@ import { CoreCourseProvider } from '@core/course/providers/course';
 | 
			
		||||
import { CoreGroupsProvider } from '@providers/groups';
 | 
			
		||||
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
 | 
			
		||||
import { AddonModLessonProvider } from './lesson';
 | 
			
		||||
import { AddonModLessonSyncProvider } from './lesson-sync';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handler to prefetch lessons.
 | 
			
		||||
@ -36,10 +37,12 @@ export class AddonModLessonPrefetchHandler extends CoreCourseActivityPrefetchHan
 | 
			
		||||
    // Don't check timers to decrease positives. If a user performs some action it will be reflected in other items.
 | 
			
		||||
    updatesNames = /^configuration$|^.*files$|^grades$|^gradeitems$|^pages$|^answers$|^questionattempts$|^pagesviewed$/;
 | 
			
		||||
 | 
			
		||||
    protected syncProvider: AddonModLessonSyncProvider; // It will be injected later to prevent circular dependencies.
 | 
			
		||||
 | 
			
		||||
    constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
 | 
			
		||||
            courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
 | 
			
		||||
            domUtils: CoreDomUtilsProvider, protected modalCtrl: ModalController, protected groupsProvider: CoreGroupsProvider,
 | 
			
		||||
            protected lessonProvider: AddonModLessonProvider) {
 | 
			
		||||
            protected lessonProvider: AddonModLessonProvider, protected injector: Injector) {
 | 
			
		||||
 | 
			
		||||
        super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
 | 
			
		||||
    }
 | 
			
		||||
@ -429,4 +432,19 @@ export class AddonModLessonPrefetchHandler extends CoreCourseActivityPrefetchHan
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        if (!this.syncProvider) {
 | 
			
		||||
            this.syncProvider = this.injector.get(AddonModLessonSyncProvider);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this.syncProvider.syncLesson(module.instance, false, false, siteId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -554,4 +554,19 @@ export class AddonModQuizPrefetchHandler extends CoreCourseActivityPrefetchHandl
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        if (!this.syncProvider) {
 | 
			
		||||
            this.syncProvider = this.injector.get(AddonModQuizSyncProvider);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this.syncProvider.syncQuiz(module.instance, false, siteId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
import { Injectable } from '@angular/core';
 | 
			
		||||
import { Injectable, Injector } from '@angular/core';
 | 
			
		||||
import { TranslateService } from '@ngx-translate/core';
 | 
			
		||||
import { CoreAppProvider } from '@providers/app';
 | 
			
		||||
import { CoreFilepoolProvider } from '@providers/filepool';
 | 
			
		||||
@ -24,6 +24,7 @@ import { CoreFileProvider } from '@providers/file';
 | 
			
		||||
import { CoreTextUtilsProvider } from '@providers/utils/text';
 | 
			
		||||
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
 | 
			
		||||
import { AddonModScormProvider } from './scorm';
 | 
			
		||||
import { AddonModScormSyncProvider } from './scorm-sync';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Progress event used when downloading a SCORM.
 | 
			
		||||
@ -58,10 +59,12 @@ export class AddonModScormPrefetchHandler extends CoreCourseActivityPrefetchHand
 | 
			
		||||
    component = AddonModScormProvider.COMPONENT;
 | 
			
		||||
    updatesNames = /^configuration$|^.*files$|^tracks$/;
 | 
			
		||||
 | 
			
		||||
    protected syncProvider: AddonModScormSyncProvider; // It will be injected later to prevent circular dependencies.
 | 
			
		||||
 | 
			
		||||
    constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
 | 
			
		||||
            courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
 | 
			
		||||
            domUtils: CoreDomUtilsProvider, protected fileProvider: CoreFileProvider, protected textUtils: CoreTextUtilsProvider,
 | 
			
		||||
             protected scormProvider: AddonModScormProvider) {
 | 
			
		||||
             protected scormProvider: AddonModScormProvider, protected injector: Injector) {
 | 
			
		||||
 | 
			
		||||
        super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
 | 
			
		||||
    }
 | 
			
		||||
@ -423,4 +426,19 @@ export class AddonModScormPrefetchHandler extends CoreCourseActivityPrefetchHand
 | 
			
		||||
            return Promise.all(promises);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        if (!this.syncProvider) {
 | 
			
		||||
            this.syncProvider = this.injector.get(AddonModScormSyncProvider);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this.syncProvider.syncScorm(module.instance, siteId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -12,7 +12,7 @@
 | 
			
		||||
// See the License for the specific language governing permissions and
 | 
			
		||||
// limitations under the License.
 | 
			
		||||
 | 
			
		||||
import { Injectable } from '@angular/core';
 | 
			
		||||
import { Injectable, Injector } from '@angular/core';
 | 
			
		||||
import { TranslateService } from '@ngx-translate/core';
 | 
			
		||||
import { CoreAppProvider } from '@providers/app';
 | 
			
		||||
import { CoreFilepoolProvider } from '@providers/filepool';
 | 
			
		||||
@ -22,6 +22,7 @@ import { CoreUtilsProvider } from '@providers/utils/utils';
 | 
			
		||||
import { CoreCourseProvider } from '@core/course/providers/course';
 | 
			
		||||
import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler';
 | 
			
		||||
import { AddonModSurveyProvider } from './survey';
 | 
			
		||||
import { AddonModSurveySyncProvider } from './sync';
 | 
			
		||||
import { AddonModSurveyHelperProvider } from './helper';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -34,10 +35,12 @@ export class AddonModSurveyPrefetchHandler extends CoreCourseActivityPrefetchHan
 | 
			
		||||
    component = AddonModSurveyProvider.COMPONENT;
 | 
			
		||||
    updatesNames = /^configuration$|^.*files$|^answers$/;
 | 
			
		||||
 | 
			
		||||
    protected syncProvider: AddonModSurveySyncProvider; // It will be injected later to prevent circular dependencies.
 | 
			
		||||
 | 
			
		||||
    constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider,
 | 
			
		||||
            courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
 | 
			
		||||
            domUtils: CoreDomUtilsProvider, protected surveyProvider: AddonModSurveyProvider,
 | 
			
		||||
            protected surveyHelper: AddonModSurveyHelperProvider) {
 | 
			
		||||
            protected surveyHelper: AddonModSurveyHelperProvider, protected injector: Injector) {
 | 
			
		||||
 | 
			
		||||
        super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
 | 
			
		||||
    }
 | 
			
		||||
@ -126,4 +129,19 @@ export class AddonModSurveyPrefetchHandler extends CoreCourseActivityPrefetchHan
 | 
			
		||||
            return Promise.all(promises);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        if (!this.syncProvider) {
 | 
			
		||||
            this.syncProvider = this.injector.get(AddonModSurveySyncProvider);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return this.syncProvider.syncSurvey(module.instance, undefined, siteId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -130,12 +130,13 @@ export class AddonModSurveySyncProvider extends CoreCourseActivitySyncBaseProvid
 | 
			
		||||
     * Synchronize a survey.
 | 
			
		||||
     *
 | 
			
		||||
     * @param  {number} surveyId Survey ID.
 | 
			
		||||
     * @param  {number} userId   User the answers belong to.
 | 
			
		||||
     * @param  {number} [userId]   User the answers belong to. If not defined, current user.
 | 
			
		||||
     * @param  {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>}    Promise resolved if sync is successful, rejected otherwise.
 | 
			
		||||
     */
 | 
			
		||||
    syncSurvey(surveyId: number, userId: number, siteId?: string): Promise<any> {
 | 
			
		||||
    syncSurvey(surveyId: number, userId?: number, siteId?: string): Promise<any> {
 | 
			
		||||
        siteId = siteId || this.sitesProvider.getCurrentSiteId();
 | 
			
		||||
        userId = userId || this.sitesProvider.getCurrentSiteUserId();
 | 
			
		||||
 | 
			
		||||
        const syncId = this.getSyncId(surveyId, userId);
 | 
			
		||||
        if (this.isSyncing(syncId, siteId)) {
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,7 @@ import { CoreCourseHelperProvider } from '@core/course/providers/helper';
 | 
			
		||||
import { CoreGradesHelperProvider } from '@core/grades/providers/helper';
 | 
			
		||||
import { CoreUserProvider } from '@core/user/providers/user';
 | 
			
		||||
import { AddonModWikiProvider } from './wiki';
 | 
			
		||||
import { AddonModWikiSyncProvider } from './wiki-sync';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handler to prefetch wikis.
 | 
			
		||||
@ -42,7 +43,8 @@ export class AddonModWikiPrefetchHandler extends CoreCourseActivityPrefetchHandl
 | 
			
		||||
            courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider,
 | 
			
		||||
            domUtils: CoreDomUtilsProvider, protected wikiProvider: AddonModWikiProvider, protected userProvider: CoreUserProvider,
 | 
			
		||||
            protected textUtils: CoreTextUtilsProvider, protected courseHelper: CoreCourseHelperProvider,
 | 
			
		||||
            protected groupsProvider: CoreGroupsProvider, protected gradesHelper: CoreGradesHelperProvider) {
 | 
			
		||||
            protected groupsProvider: CoreGroupsProvider, protected gradesHelper: CoreGradesHelperProvider,
 | 
			
		||||
            protected syncProvider: AddonModWikiSyncProvider) {
 | 
			
		||||
 | 
			
		||||
        super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
 | 
			
		||||
    }
 | 
			
		||||
@ -210,4 +212,15 @@ export class AddonModWikiPrefetchHandler extends CoreCourseActivityPrefetchHandl
 | 
			
		||||
            return Promise.all(promises);
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        return this.syncProvider.syncWiki(module.instance, module.course, module.id, siteId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,7 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/acti
 | 
			
		||||
import { CoreGroupsProvider } from '@providers/groups';
 | 
			
		||||
import { CoreUserProvider } from '@core/user/providers/user';
 | 
			
		||||
import { AddonModWorkshopProvider } from './workshop';
 | 
			
		||||
import { AddonModWorkshopSyncProvider } from './sync';
 | 
			
		||||
import { AddonModWorkshopHelperProvider } from './helper';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -47,7 +48,8 @@ export class AddonModWorkshopPrefetchHandler extends CoreCourseActivityPrefetchH
 | 
			
		||||
            private groupsProvider: CoreGroupsProvider,
 | 
			
		||||
            private userProvider: CoreUserProvider,
 | 
			
		||||
            private workshopProvider: AddonModWorkshopProvider,
 | 
			
		||||
            private workshopHelper: AddonModWorkshopHelperProvider) {
 | 
			
		||||
            private workshopHelper: AddonModWorkshopHelperProvider,
 | 
			
		||||
            private syncProvider: AddonModWorkshopSyncProvider) {
 | 
			
		||||
 | 
			
		||||
        super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils);
 | 
			
		||||
    }
 | 
			
		||||
@ -365,4 +367,15 @@ export class AddonModWorkshopPrefetchHandler extends CoreCourseActivityPrefetchH
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync(module: any, siteId?: string): Promise<any> {
 | 
			
		||||
        return this.syncProvider.syncWorkshop(module.instance, siteId);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -294,6 +294,7 @@ export class CoreCourseHelperProvider {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return promise.then((sections) => {
 | 
			
		||||
 | 
			
		||||
            // Confirm the download.
 | 
			
		||||
            return this.confirmDownloadSizeSection(course.id, undefined, sections, true).then(() => {
 | 
			
		||||
                // User confirmed, get the course handlers if needed.
 | 
			
		||||
@ -1317,18 +1318,22 @@ export class CoreCourseHelperProvider {
 | 
			
		||||
 | 
			
		||||
        section.isDownloading = true;
 | 
			
		||||
 | 
			
		||||
        // Validate the section needs to be downloaded and calculate amount of modules that need to be downloaded.
 | 
			
		||||
        promises.push(this.prefetchDelegate.getModulesStatus(section.modules, courseId, section.id).then((result) => {
 | 
			
		||||
            if (result.status == CoreConstants.DOWNLOADED || result.status == CoreConstants.NOT_DOWNLOADABLE) {
 | 
			
		||||
                // Section is downloaded or not downloadable, nothing to do.
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        // Sync the modules first.
 | 
			
		||||
        promises.push(this.prefetchDelegate.syncModules(section.modules).then(() => {
 | 
			
		||||
            // Validate the section needs to be downloaded and calculate amount of modules that need to be downloaded.
 | 
			
		||||
            return this.prefetchDelegate.getModulesStatus(section.modules, courseId, section.id).then((result) => {
 | 
			
		||||
                if (result.status == CoreConstants.DOWNLOADED || result.status == CoreConstants.NOT_DOWNLOADABLE) {
 | 
			
		||||
                    // Section is downloaded or not downloadable, nothing to do.
 | 
			
		||||
 | 
			
		||||
            return this.prefetchSingleSection(section, result, courseId);
 | 
			
		||||
        }, (error) => {
 | 
			
		||||
            section.isDownloading = false;
 | 
			
		||||
                    return ;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            return Promise.reject(error);
 | 
			
		||||
                return this.prefetchSingleSection(section, result, courseId);
 | 
			
		||||
            }, (error) => {
 | 
			
		||||
                section.isDownloading = false;
 | 
			
		||||
 | 
			
		||||
                return Promise.reject(error);
 | 
			
		||||
            });
 | 
			
		||||
        }));
 | 
			
		||||
 | 
			
		||||
        // Download the files in the section description.
 | 
			
		||||
 | 
			
		||||
@ -206,6 +206,15 @@ export interface CoreCourseModulePrefetchHandler extends CoreDelegateHandler {
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    removeFiles?(module: any, courseId: number): Promise<any>;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module.
 | 
			
		||||
     * @param {string} [siteId] Site ID. If not defined, current site.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when done.
 | 
			
		||||
     */
 | 
			
		||||
    sync?(module: any, siteId?: any): Promise<any>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -1139,12 +1148,42 @@ export class CoreCourseModulePrefetchDelegate extends CoreDelegate {
 | 
			
		||||
 | 
			
		||||
        // Check if the module has a prefetch handler.
 | 
			
		||||
        if (handler) {
 | 
			
		||||
            return handler.prefetch(module, courseId, single);
 | 
			
		||||
            return this.syncModule(module).then(() => {
 | 
			
		||||
                return handler.prefetch(module, courseId, single);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return Promise.resolve();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a group of modules.
 | 
			
		||||
     *
 | 
			
		||||
     * @param  {any[]}        modules Array of modules to sync.
 | 
			
		||||
     * @return {Promise<any>}         Promise resolved when finished.
 | 
			
		||||
     */
 | 
			
		||||
    syncModules(modules: any[]): Promise<any> {
 | 
			
		||||
        return Promise.all(modules.map((module) => {
 | 
			
		||||
            return this.syncModule(module);
 | 
			
		||||
        }));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sync a module.
 | 
			
		||||
     *
 | 
			
		||||
     * @param {any} module Module to sync.
 | 
			
		||||
     * @return {Promise<any>} Promise resolved when finished.
 | 
			
		||||
     */
 | 
			
		||||
    syncModule(module: any): Promise<any> {
 | 
			
		||||
        const handler = this.getPrefetchHandlerFor(module);
 | 
			
		||||
 | 
			
		||||
        const promise = handler && handler.sync ? handler.sync(module) : Promise.resolve();
 | 
			
		||||
 | 
			
		||||
        return promise.catch(() => {
 | 
			
		||||
            // Ignore errors.
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Prefetches a list of modules using their prefetch handlers.
 | 
			
		||||
     * If a prefetch already exists for this site and id, returns the current promise.
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user