forked from CIT/Vmeda.Online
		
	MOBILE-2428 prefetch: Refactor prefetch base classes
This commit is contained in:
		
							parent
							
								
									0969b5cff1
								
							
						
					
					
						commit
						c17534d69d
					
				| @ -12,11 +12,16 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreGroupsProvider } from '@providers/groups'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreTextUtilsProvider } from '@providers/utils/text'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseHelperProvider } from '@core/course/providers/helper'; | ||||
| import { CoreGradesHelperProvider } from '@core/grades/providers/helper'; | ||||
| @ -30,19 +35,21 @@ import { AddonModAssignSubmissionDelegate } from './submission-delegate'; | ||||
|  * Handler to prefetch assigns. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModAssignPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModAssignPrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModAssign'; | ||||
|     modName = 'assign'; | ||||
|     component = AddonModAssignProvider.COMPONENT; | ||||
|     updatesNames = /^configuration$|^.*files$|^submissions$|^grades$|^gradeitems$|^outcomes$|^comments$/; | ||||
| 
 | ||||
|     constructor(protected injector: Injector, protected assignProvider: AddonModAssignProvider, | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected assignProvider: AddonModAssignProvider, | ||||
|             protected textUtils: CoreTextUtilsProvider, protected feedbackDelegate: AddonModAssignFeedbackDelegate, | ||||
|             protected submissionDelegate: AddonModAssignSubmissionDelegate, protected courseProvider: CoreCourseProvider, | ||||
|             protected courseHelper: CoreCourseHelperProvider, protected filepoolProvider: CoreFilepoolProvider, | ||||
|             protected submissionDelegate: AddonModAssignSubmissionDelegate, protected courseHelper: CoreCourseHelperProvider, | ||||
|             protected groupsProvider: CoreGroupsProvider, protected gradesHelper: CoreGradesHelperProvider, | ||||
|             protected userProvider: CoreUserProvider, protected assignHelper: AddonModAssignHelperProvider) { | ||||
|         super(injector); | ||||
| 
 | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -65,19 +72,6 @@ export class AddonModAssignPrefetchHandler extends CoreCourseModulePrefetchHandl | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         // Same implementation for download or prefetch.
 | ||||
|         return this.prefetch(module, courseId, false, dirPath); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get list of files. If not defined, we'll assume they're in module.contents. | ||||
|      * | ||||
| @ -207,7 +201,7 @@ export class AddonModAssignPrefetchHandler extends CoreCourseModulePrefetchHandl | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|  | ||||
| @ -12,23 +12,32 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseResourcePrefetchHandlerBase } from '@core/course/classes/resource-prefetch-handler'; | ||||
| import { AddonModBookProvider } from './book'; | ||||
| 
 | ||||
| /** | ||||
|  * Handler to prefetch books. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModBookPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModBookPrefetchHandler extends CoreCourseResourcePrefetchHandlerBase { | ||||
|     name = 'AddonModBook'; | ||||
|     modName = 'book'; | ||||
|     component = AddonModBookProvider.COMPONENT; | ||||
|     updatesNames = /^configuration$|^.*files$|^entries$/; | ||||
|     isResource = true; | ||||
| 
 | ||||
|     constructor(injector: Injector, protected bookProvider: AddonModBookProvider) { | ||||
|         super(injector); | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected bookProvider: AddonModBookProvider) { | ||||
| 
 | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -12,8 +12,15 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| 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 { AddonModChoiceProvider } from './choice'; | ||||
| import { AddonModChoiceSyncProvider } from './sync'; | ||||
| @ -22,28 +29,18 @@ import { AddonModChoiceSyncProvider } from './sync'; | ||||
|  * Handler to prefetch choices. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModChoicePrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModChoicePrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModChoice'; | ||||
|     modName = 'choice'; | ||||
|     component = AddonModChoiceProvider.COMPONENT; | ||||
|     updatesNames = /^configuration$|^.*files$|^answers$/; | ||||
| 
 | ||||
|     constructor(protected injector: Injector, protected choiceProvider: AddonModChoiceProvider, | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected choiceProvider: AddonModChoiceProvider, | ||||
|             protected syncProvider: AddonModChoiceSyncProvider, protected userProvider: CoreUserProvider) { | ||||
|         super(injector); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         // Same implementation for download or prefetch.
 | ||||
|         return this.prefetch(module, courseId, false, dirPath); | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -52,7 +49,7 @@ export class AddonModChoicePrefetchHandler extends CoreCourseModulePrefetchHandl | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
| @ -137,13 +134,4 @@ export class AddonModChoicePrefetchHandler extends CoreCourseModulePrefetchHandl | ||||
|     invalidateModule(module: any, courseId: number): Promise<any> { | ||||
|         return this.choiceProvider.invalidateChoiceData(courseId); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Whether or not the handler is enabled on a site level. | ||||
|      * | ||||
|      * @return {boolean|Promise<boolean>} A boolean, or a promise resolved with a boolean, indicating if the handler is enabled. | ||||
|      */ | ||||
|     isEnabled(): boolean | Promise<boolean> { | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -12,13 +12,18 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreGroupsProvider } from '@providers/groups'; | ||||
| import { CoreTimeUtilsProvider } from '@providers/utils/time'; | ||||
| import { CoreCommentsProvider } from '@core/comments/providers/comments'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler'; | ||||
| import { AddonModDataProvider } from './data'; | ||||
| import { AddonModDataHelperProvider } from './helper'; | ||||
| 
 | ||||
| @ -26,63 +31,19 @@ import { AddonModDataHelperProvider } from './helper'; | ||||
|  * Handler to prefetch databases. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModDataPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModDataPrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModData'; | ||||
|     modName = 'data'; | ||||
|     component = AddonModDataProvider.COMPONENT; | ||||
|     updatesNames = /^configuration$|^.*files$|^entries$|^gradeitems$|^outcomes$|^comments$|^ratings/; | ||||
| 
 | ||||
|     constructor(injector: Injector, protected dataProvider: AddonModDataProvider, protected timeUtils: CoreTimeUtilsProvider, | ||||
|             protected filepoolProvider: CoreFilepoolProvider, protected dataHelper: AddonModDataHelperProvider, | ||||
|             protected groupsProvider: CoreGroupsProvider, protected commentsProvider: CoreCommentsProvider, | ||||
|             protected courseProvider: CoreCourseProvider) { | ||||
|         super(injector); | ||||
|     } | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected dataProvider: AddonModDataProvider, | ||||
|             protected timeUtils: CoreTimeUtilsProvider, protected dataHelper: AddonModDataHelperProvider, | ||||
|             protected groupsProvider: CoreGroupsProvider, protected commentsProvider: CoreCommentsProvider) { | ||||
| 
 | ||||
|     /** | ||||
|      * Download or prefetch the content. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {boolean} [prefetch] True to prefetch, false to download right away. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. This is to keep the files | ||||
|      *                           relative paths and make the package work in an iframe. Undefined to download the files | ||||
|      *                           in the filepool root data. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. Data returned is not reliable. | ||||
|      */ | ||||
|     downloadOrPrefetch(module: any, courseId: number, prefetch?: boolean, dirPath?: string): Promise<any> { | ||||
|         const promises = [], | ||||
|             siteId = this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         promises.push(super.downloadOrPrefetch(module, courseId, prefetch)); | ||||
|         promises.push(this.getDatabaseInfoHelper(module, courseId, false, false, true, siteId).then((info) => { | ||||
|             // Prefetch the database data.
 | ||||
|             const database = info.database, | ||||
|                 promises = []; | ||||
| 
 | ||||
|             promises.push(this.dataProvider.getFields(database.id, false, true, siteId)); | ||||
| 
 | ||||
|             promises.push(this.filepoolProvider.addFilesToQueue(siteId, info.files, this.component, module.id)); | ||||
| 
 | ||||
|             info.groups.forEach((group) => { | ||||
|                promises.push(this.dataProvider.getDatabaseAccessInformation(database.id, group.id, false, true, siteId)); | ||||
|             }); | ||||
| 
 | ||||
|             info.entries.forEach((entry) => { | ||||
|                 promises.push(this.dataProvider.getEntry(database.id, entry.id, siteId)); | ||||
|                 if (database.comments) { | ||||
|                     promises.push(this.commentsProvider.getComments('module', database.coursemodule, 'mod_data', entry.id, | ||||
|                         'database_entry', 0, siteId)); | ||||
|                 } | ||||
|             }); | ||||
| 
 | ||||
|             // Add Basic Info to manage links.
 | ||||
|             promises.push(this.courseProvider.getModuleBasicInfoByInstance(database.id, 'data', siteId)); | ||||
| 
 | ||||
|             return Promise.all(promises); | ||||
|         })); | ||||
| 
 | ||||
|         return Promise.all(promises); | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -282,4 +243,56 @@ export class AddonModDataPrefetchHandler extends CoreCourseModulePrefetchHandler | ||||
|     isEnabled(): boolean | Promise<boolean> { | ||||
|         return this.dataProvider.isPluginEnabled(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a module. | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|         return this.prefetchPackage(module, courseId, single, this.prefetchDatabase.bind(this)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a database. | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} single True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {String} siteId Site ID. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     protected prefetchDatabase(module: any, courseId: number, single: boolean, siteId: string): Promise<any> { | ||||
| 
 | ||||
|         return this.getDatabaseInfoHelper(module, courseId, false, false, true, siteId).then((info) => { | ||||
|             // Prefetch the database data.
 | ||||
|             const database = info.database, | ||||
|                 promises = []; | ||||
| 
 | ||||
|             promises.push(this.dataProvider.getFields(database.id, false, true, siteId)); | ||||
| 
 | ||||
|             promises.push(this.filepoolProvider.addFilesToQueue(siteId, info.files, this.component, module.id)); | ||||
| 
 | ||||
|             info.groups.forEach((group) => { | ||||
|                promises.push(this.dataProvider.getDatabaseAccessInformation(database.id, group.id, false, true, siteId)); | ||||
|             }); | ||||
| 
 | ||||
|             info.entries.forEach((entry) => { | ||||
|                 promises.push(this.dataProvider.getEntry(database.id, entry.id, siteId)); | ||||
|                 if (database.comments) { | ||||
|                     promises.push(this.commentsProvider.getComments('module', database.coursemodule, 'mod_data', entry.id, | ||||
|                         'database_entry', 0, siteId)); | ||||
|                 } | ||||
|             }); | ||||
| 
 | ||||
|             // Add Basic Info to manage links.
 | ||||
|             promises.push(this.courseProvider.getModuleBasicInfoByInstance(database.id, 'data', siteId)); | ||||
| 
 | ||||
|             return Promise.all(promises); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -12,11 +12,17 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler'; | ||||
| import { AddonModFeedbackProvider } from './feedback'; | ||||
| import { AddonModFeedbackHelperProvider } from './helper'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreTimeUtilsProvider } from '@providers/utils/time'; | ||||
| import { CoreGroupsProvider } from '@providers/groups'; | ||||
| import { CoreUserProvider } from '@core/user/providers/user'; | ||||
| @ -25,101 +31,19 @@ import { CoreUserProvider } from '@core/user/providers/user'; | ||||
|  * Handler to prefetch feedbacks. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModFeedbackPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModFeedbackPrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModFeedback'; | ||||
|     modName = 'feedback'; | ||||
|     component = AddonModFeedbackProvider.COMPONENT; | ||||
|     updatesNames = /^configuration$|^.*files$|^attemptsfinished|^attemptsunfinished$/; | ||||
| 
 | ||||
|     constructor(injector: Injector, protected feedbackProvider: AddonModFeedbackProvider,  protected userProvider: CoreUserProvider, | ||||
|             protected filepoolProvider: CoreFilepoolProvider, protected feedbackHelper: AddonModFeedbackHelperProvider, | ||||
|     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) { | ||||
|         super(injector); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download or prefetch the content. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {boolean} [prefetch] True to prefetch, false to download right away. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. This is to keep the files | ||||
|      *                           relative paths and make the package work in an iframe. Undefined to download the files | ||||
|      *                           in the filepool root feedback. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. Data returned is not reliable. | ||||
|      */ | ||||
|     downloadOrPrefetch(module: any, courseId: number, prefetch?: boolean, dirPath?: string): Promise<any> { | ||||
|         const promises = [], | ||||
|             siteId = this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         promises.push(super.downloadOrPrefetch(module, courseId, prefetch)); | ||||
|         promises.push(this.feedbackProvider.getFeedback(courseId, module.id).then((feedback) => { | ||||
|             const p1 = []; | ||||
| 
 | ||||
|             p1.push(this.getFiles(module, courseId).then((files) => { | ||||
|                 return this.filepoolProvider.addFilesToQueue(siteId, files, this.component, module.id); | ||||
|             })); | ||||
| 
 | ||||
|             p1.push(this.feedbackProvider.getFeedbackAccessInformation(feedback.id, false, true, siteId).then((accessData) => { | ||||
|                 const p2 = []; | ||||
|                 if (accessData.canedititems || accessData.canviewreports) { | ||||
|                     // Get all groups analysis.
 | ||||
|                     p2.push(this.feedbackProvider.getAnalysis(feedback.id, undefined, siteId)); | ||||
|                     p2.push(this.groupsProvider.getActivityGroupInfo(feedback.coursemodule, true, undefined, siteId) | ||||
|                             .then((groupInfo) => { | ||||
|                         const p3 = [], | ||||
|                             userIds = []; | ||||
| 
 | ||||
|                         if (!groupInfo.groups || groupInfo.groups.length == 0) { | ||||
|                             groupInfo.groups = [{id: 0}]; | ||||
|                         } | ||||
|                         groupInfo.groups.forEach((group) => { | ||||
|                             p3.push(this.feedbackProvider.getAnalysis(feedback.id, group.id, siteId)); | ||||
|                             p3.push(this.feedbackProvider.getAllResponsesAnalysis(feedback.id, group.id, siteId) | ||||
|                                     .then((responses) => { | ||||
|                                 responses.attempts.forEach((attempt) => { | ||||
|                                     userIds.push(attempt.userid); | ||||
|                                 }); | ||||
|                             })); | ||||
| 
 | ||||
|                             if (!accessData.isanonymous) { | ||||
|                                 p3.push(this.feedbackProvider.getAllNonRespondents(feedback.id, group.id, siteId) | ||||
|                                         .then((responses) => { | ||||
|                                     responses.users.forEach((user) => { | ||||
|                                         userIds.push(user.userid); | ||||
|                                     }); | ||||
|                                 })); | ||||
|                             } | ||||
|                         }); | ||||
| 
 | ||||
|                         return Promise.all(p3).then(() => { | ||||
|                             // Prefetch user profiles.
 | ||||
|                             return this.userProvider.prefetchProfiles(userIds, courseId, siteId); | ||||
|                         }); | ||||
|                     })); | ||||
|                 } | ||||
| 
 | ||||
|                 p2.push(this.feedbackProvider.getItems(feedback.id, siteId)); | ||||
| 
 | ||||
|                 if (accessData.cancomplete && accessData.cansubmit && !accessData.isempty) { | ||||
|                     // Send empty data, so it will recover last completed feedback attempt values.
 | ||||
|                     p2.push(this.feedbackProvider.processPageOnline(feedback.id, 0, {}, undefined, siteId).finally(() => { | ||||
|                         const p4 = []; | ||||
| 
 | ||||
|                         p4.push(this.feedbackProvider.getCurrentValues(feedback.id, false, true, siteId)); | ||||
|                         p4.push(this.feedbackProvider.getResumePage(feedback.id, false, true, siteId)); | ||||
| 
 | ||||
|                         return Promise.all(p4); | ||||
|                     })); | ||||
|                 } | ||||
| 
 | ||||
|                 return Promise.all(p2); | ||||
|             })); | ||||
| 
 | ||||
|             return Promise.all(p1); | ||||
|         })); | ||||
| 
 | ||||
|         return Promise.all(promises); | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -224,4 +148,95 @@ export class AddonModFeedbackPrefetchHandler extends CoreCourseModulePrefetchHan | ||||
|     isEnabled(): boolean | Promise<boolean> { | ||||
|         return this.feedbackProvider.isPluginEnabled(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a module. | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|         return this.prefetchPackage(module, courseId, single, this.prefetchFeedback.bind(this)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a feedback. | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} single True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {String} siteId Site ID. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     protected prefetchFeedback(module: any, courseId: number, single: boolean, siteId: string): Promise<any> { | ||||
|         // Prefetch the feedback data.
 | ||||
|         return this.feedbackProvider.getFeedback(courseId, module.id).then((feedback) => { | ||||
|             const p1 = []; | ||||
| 
 | ||||
|             p1.push(this.getFiles(module, courseId).then((files) => { | ||||
|                 return this.filepoolProvider.addFilesToQueue(siteId, files, this.component, module.id); | ||||
|             })); | ||||
| 
 | ||||
|             p1.push(this.feedbackProvider.getFeedbackAccessInformation(feedback.id, false, true, siteId).then((accessData) => { | ||||
|                 const p2 = []; | ||||
|                 if (accessData.canedititems || accessData.canviewreports) { | ||||
|                     // Get all groups analysis.
 | ||||
|                     p2.push(this.feedbackProvider.getAnalysis(feedback.id, undefined, siteId)); | ||||
|                     p2.push(this.groupsProvider.getActivityGroupInfo(feedback.coursemodule, true, undefined, siteId) | ||||
|                             .then((groupInfo) => { | ||||
|                         const p3 = [], | ||||
|                             userIds = []; | ||||
| 
 | ||||
|                         if (!groupInfo.groups || groupInfo.groups.length == 0) { | ||||
|                             groupInfo.groups = [{id: 0}]; | ||||
|                         } | ||||
|                         groupInfo.groups.forEach((group) => { | ||||
|                             p3.push(this.feedbackProvider.getAnalysis(feedback.id, group.id, siteId)); | ||||
|                             p3.push(this.feedbackProvider.getAllResponsesAnalysis(feedback.id, group.id, siteId) | ||||
|                                     .then((responses) => { | ||||
|                                 responses.attempts.forEach((attempt) => { | ||||
|                                     userIds.push(attempt.userid); | ||||
|                                 }); | ||||
|                             })); | ||||
| 
 | ||||
|                             if (!accessData.isanonymous) { | ||||
|                                 p3.push(this.feedbackProvider.getAllNonRespondents(feedback.id, group.id, siteId) | ||||
|                                         .then((responses) => { | ||||
|                                     responses.users.forEach((user) => { | ||||
|                                         userIds.push(user.userid); | ||||
|                                     }); | ||||
|                                 })); | ||||
|                             } | ||||
|                         }); | ||||
| 
 | ||||
|                         return Promise.all(p3).then(() => { | ||||
|                             // Prefetch user profiles.
 | ||||
|                             return this.userProvider.prefetchProfiles(userIds, courseId, siteId); | ||||
|                         }); | ||||
|                     })); | ||||
|                 } | ||||
| 
 | ||||
|                 p2.push(this.feedbackProvider.getItems(feedback.id, siteId)); | ||||
| 
 | ||||
|                 if (accessData.cancomplete && accessData.cansubmit && !accessData.isempty) { | ||||
|                     // Send empty data, so it will recover last completed feedback attempt values.
 | ||||
|                     p2.push(this.feedbackProvider.processPageOnline(feedback.id, 0, {}, undefined, siteId).finally(() => { | ||||
|                         const p4 = []; | ||||
| 
 | ||||
|                         p4.push(this.feedbackProvider.getCurrentValues(feedback.id, false, true, siteId)); | ||||
|                         p4.push(this.feedbackProvider.getResumePage(feedback.id, false, true, siteId)); | ||||
| 
 | ||||
|                         return Promise.all(p4); | ||||
|                     })); | ||||
|                 } | ||||
| 
 | ||||
|                 return Promise.all(p2); | ||||
|             })); | ||||
| 
 | ||||
|             return Promise.all(p1); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -12,22 +12,31 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseResourcePrefetchHandlerBase } from '@core/course/classes/resource-prefetch-handler'; | ||||
| import { AddonModFolderProvider } from './folder'; | ||||
| 
 | ||||
| /** | ||||
|  * Handler to prefetch folders. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModFolderPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModFolderPrefetchHandler extends CoreCourseResourcePrefetchHandlerBase { | ||||
|     name = 'AddonModFolder'; | ||||
|     modName = 'folder'; | ||||
|     component = AddonModFolderProvider.COMPONENT; | ||||
|     isResource = true; | ||||
| 
 | ||||
|     constructor(injector: Injector, protected folderProvider: AddonModFolderProvider) { | ||||
|         super(injector); | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected folderProvider: AddonModFolderProvider) { | ||||
| 
 | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -12,8 +12,15 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler'; | ||||
| import { CoreGroupsProvider } from '@providers/groups'; | ||||
| import { CoreUserProvider } from '@core/user/providers/user'; | ||||
| import { AddonModForumProvider } from './forum'; | ||||
| @ -22,30 +29,24 @@ import { AddonModForumProvider } from './forum'; | ||||
|  * Handler to prefetch forums. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModForumPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModForumPrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModForum'; | ||||
|     modName = 'forum'; | ||||
|     component = AddonModForumProvider.COMPONENT; | ||||
|     updatesNames = /^configuration$|^.*files$|^discussions$/; | ||||
| 
 | ||||
|     constructor(injector: Injector, | ||||
|     constructor(translate: TranslateService, | ||||
|             appProvider: CoreAppProvider, | ||||
|             utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, | ||||
|             filepoolProvider: CoreFilepoolProvider, | ||||
|             sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, | ||||
|             private groupsProvider: CoreGroupsProvider, | ||||
|             private userProvider: CoreUserProvider, | ||||
|             private forumProvider: AddonModForumProvider) { | ||||
|         super(injector); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         // Same implementation for download or prefetch.
 | ||||
|         return this.prefetch(module, courseId, false, dirPath); | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -137,7 +138,7 @@ export class AddonModForumPrefetchHandler extends CoreCourseModulePrefetchHandle | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|  | ||||
| @ -12,8 +12,15 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| 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 { AddonModGlossaryProvider } from './glossary'; | ||||
| 
 | ||||
| @ -21,29 +28,23 @@ import { AddonModGlossaryProvider } from './glossary'; | ||||
|  * Handler to prefetch forums. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModGlossaryPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModGlossaryPrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModGlossary'; | ||||
|     modName = 'glossary'; | ||||
|     component = AddonModGlossaryProvider.COMPONENT; | ||||
|     updatesNames = /^configuration$|^.*files$|^entries$/; | ||||
| 
 | ||||
|     constructor(injector: Injector, | ||||
|     constructor(translate: TranslateService, | ||||
|             appProvider: CoreAppProvider, | ||||
|             utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, | ||||
|             filepoolProvider: CoreFilepoolProvider, | ||||
|             sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, | ||||
|             private userProvider: CoreUserProvider, | ||||
|             private glossaryProvider: AddonModGlossaryProvider) { | ||||
|         super(injector); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         // Glossaries cannot be downloaded right away, only prefetched.
 | ||||
|         return this.prefetch(module, courseId); | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -102,7 +103,7 @@ export class AddonModGlossaryPrefetchHandler extends CoreCourseModulePrefetchHan | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|  | ||||
| @ -12,36 +12,31 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseResourcePrefetchHandlerBase } from '@core/course/classes/resource-prefetch-handler'; | ||||
| import { AddonModImscpProvider } from './imscp'; | ||||
| 
 | ||||
| /** | ||||
|  * Handler to prefetch IMSCPs. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModImscpPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModImscpPrefetchHandler extends CoreCourseResourcePrefetchHandlerBase { | ||||
|     name = 'AddonModImscp'; | ||||
|     modName = 'imscp'; | ||||
|     component = AddonModImscpProvider.COMPONENT; | ||||
|     isResource = true; | ||||
| 
 | ||||
|     constructor(injector: Injector, protected imscpProvider: AddonModImscpProvider, | ||||
|             protected filepoolProvider: CoreFilepoolProvider) { | ||||
|         super(injector); | ||||
|     } | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected imscpProvider: AddonModImscpProvider) { | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         return this.prefetch(module, courseId, false, dirPath); | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -12,26 +12,36 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { ModalController } from 'ionic-angular'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreGroupsProvider } from '@providers/groups'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler'; | ||||
| import { AddonModLessonProvider } from './lesson'; | ||||
| 
 | ||||
| /** | ||||
|  * Handler to prefetch lessons. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModLessonPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModLessonPrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModLesson'; | ||||
|     modName = 'lesson'; | ||||
|     component = AddonModLessonProvider.COMPONENT; | ||||
|     // 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$/; | ||||
| 
 | ||||
|     constructor(protected injector: Injector, protected modalCtrl: ModalController, protected groupsProvider: CoreGroupsProvider, | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected modalCtrl: ModalController, protected groupsProvider: CoreGroupsProvider, | ||||
|             protected lessonProvider: AddonModLessonProvider) { | ||||
|         super(injector); | ||||
| 
 | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -58,19 +68,6 @@ export class AddonModLessonPrefetchHandler extends CoreCourseModulePrefetchHandl | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         // Same implementation for download and prefetch.
 | ||||
|         return this.prefetch(module, courseId, false, dirPath); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get the download size of a module. | ||||
|      * | ||||
| @ -112,18 +109,6 @@ export class AddonModLessonPrefetchHandler extends CoreCourseModulePrefetchHandl | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get list of files. If not defined, we'll assume they're in module.contents. | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {Number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @return {Promise<any[]>} Promise resolved with the list of files. | ||||
|      */ | ||||
|     getFiles(module: any, courseId: number, single?: boolean): Promise<any[]> { | ||||
|         return Promise.resolve([]); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get the lesson password if needed. If not stored, it can ask the user to enter it. | ||||
|      * | ||||
| @ -254,7 +239,7 @@ export class AddonModLessonPrefetchHandler extends CoreCourseModulePrefetchHandl | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|  | ||||
| @ -12,9 +12,15 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseResourcePrefetchHandlerBase } from '@core/course/classes/resource-prefetch-handler'; | ||||
| import { AddonModPageProvider } from './page'; | ||||
| import { AddonModPageHelperProvider } from './helper'; | ||||
| 
 | ||||
| @ -22,16 +28,18 @@ import { AddonModPageHelperProvider } from './helper'; | ||||
|  * Handler to prefetch pages. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModPagePrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModPagePrefetchHandler extends CoreCourseResourcePrefetchHandlerBase { | ||||
|     name = 'AddonModPage'; | ||||
|     modName = 'page'; | ||||
|     component = AddonModPageProvider.COMPONENT; | ||||
|     updatesNames = /^configuration$|^.*files$/; | ||||
|     isResource = true; | ||||
| 
 | ||||
|     constructor(injector: Injector, protected pageProvider: AddonModPageProvider, protected utils: CoreUtilsProvider, | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected pageProvider: AddonModPageProvider, | ||||
|             protected pageHelper: AddonModPageHelperProvider) { | ||||
|         super(injector); | ||||
| 
 | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -13,9 +13,16 @@ | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreTextUtilsProvider } from '@providers/utils/text'; | ||||
| import { CoreQuestionHelperProvider } from '@core/question/providers/helper'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler'; | ||||
| import { AddonModQuizProvider } from './quiz'; | ||||
| import { AddonModQuizHelperProvider } from './helper'; | ||||
| import { AddonModQuizAccessRuleDelegate } from './access-rules-delegate'; | ||||
| @ -26,7 +33,7 @@ import { CoreConstants } from '@core/constants'; | ||||
|  * Handler to prefetch quizzes. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModQuizPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModQuizPrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModQuiz'; | ||||
|     modName = 'quiz'; | ||||
|     component = AddonModQuizProvider.COMPONENT; | ||||
| @ -34,23 +41,13 @@ export class AddonModQuizPrefetchHandler extends CoreCourseModulePrefetchHandler | ||||
| 
 | ||||
|     protected syncProvider: AddonModQuizSyncProvider; // It will be injected later to prevent circular dependencies.
 | ||||
| 
 | ||||
|     constructor(protected injector: Injector, protected quizProvider: AddonModQuizProvider, | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected injector: Injector, protected quizProvider: AddonModQuizProvider, | ||||
|             protected textUtils: CoreTextUtilsProvider, protected quizHelper: AddonModQuizHelperProvider, | ||||
|             protected accessRuleDelegate: AddonModQuizAccessRuleDelegate, protected questionHelper: CoreQuestionHelperProvider) { | ||||
|         super(injector); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         // Same implementation for download or prefetch.
 | ||||
|         return this.prefetch(module, courseId, false, dirPath); | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -69,18 +66,6 @@ export class AddonModQuizPrefetchHandler extends CoreCourseModulePrefetchHandler | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get list of files. If not defined, we'll assume they're in module.contents. | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {Number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @return {Promise<any[]>} Promise resolved with the list of files. | ||||
|      */ | ||||
|     getFiles(module: any, courseId: number, single?: boolean): Promise<any[]> { | ||||
|         return Promise.resolve([]); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Gather some preflight data for an attempt. This function will start a new attempt if needed. | ||||
|      * | ||||
| @ -190,7 +175,7 @@ export class AddonModQuizPrefetchHandler extends CoreCourseModulePrefetchHandler | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|  | ||||
| @ -12,25 +12,33 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseResourcePrefetchHandlerBase } from '@core/course/classes/resource-prefetch-handler'; | ||||
| import { AddonModResourceProvider } from './resource'; | ||||
| import { AddonModResourceHelperProvider } from './helper'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| 
 | ||||
| /** | ||||
|  * Handler to prefetch resources. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModResourcePrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModResourcePrefetchHandler extends CoreCourseResourcePrefetchHandlerBase { | ||||
|     name = 'AddonModResource'; | ||||
|     modName = 'resource'; | ||||
|     component = AddonModResourceProvider.COMPONENT; | ||||
|     isResource = true; | ||||
| 
 | ||||
|     constructor(injector: Injector, protected resourceProvider: AddonModResourceProvider, | ||||
|             protected filepoolProvider: CoreFilepoolProvider, protected resourceHelper: AddonModResourceHelperProvider) { | ||||
|         super(injector); | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected resourceProvider: AddonModResourceProvider, | ||||
|             protected resourceHelper: AddonModResourceHelperProvider) { | ||||
| 
 | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -12,10 +12,17 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreFileProvider } from '@providers/file'; | ||||
| import { CoreTextUtilsProvider } from '@providers/utils/text'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler'; | ||||
| import { AddonModScormProvider } from './scorm'; | ||||
| 
 | ||||
| /** | ||||
| @ -45,15 +52,18 @@ export interface AddonModScormProgressEvent { | ||||
|  * Handler to prefetch SCORMs. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModScormPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModScormPrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModScorm'; | ||||
|     modName = 'scorm'; | ||||
|     component = AddonModScormProvider.COMPONENT; | ||||
|     updatesNames = /^configuration$|^.*files$|^tracks$/; | ||||
| 
 | ||||
|     constructor(injector: Injector, protected fileProvider: CoreFileProvider, protected textUtils: CoreTextUtilsProvider, | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected fileProvider: CoreFileProvider, protected textUtils: CoreTextUtilsProvider, | ||||
|              protected scormProvider: AddonModScormProvider) { | ||||
|         super(injector); | ||||
| 
 | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -359,15 +369,6 @@ export class AddonModScormPrefetchHandler extends CoreCourseModulePrefetchHandle | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Whether or not the handler is enabled on a site level. | ||||
|      * | ||||
|      * @return {boolean|Promise<boolean>} A boolean, or a promise resolved with a boolean, indicating if the handler is enabled. | ||||
|      */ | ||||
|     isEnabled(): boolean | Promise<boolean> { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a module. | ||||
|      * | ||||
|  | ||||
| @ -12,8 +12,15 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| 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 { AddonModSurveyHelperProvider } from './helper'; | ||||
| 
 | ||||
| @ -21,40 +28,18 @@ import { AddonModSurveyHelperProvider } from './helper'; | ||||
|  * Handler to prefetch surveys. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModSurveyPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModSurveyPrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModSurvey'; | ||||
|     modName = 'survey'; | ||||
|     component = AddonModSurveyProvider.COMPONENT; | ||||
|     updatesNames = /^configuration$|^.*files$|^answers$/; | ||||
| 
 | ||||
|     constructor(injector: Injector, protected surveyProvider: AddonModSurveyProvider, | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected surveyProvider: AddonModSurveyProvider, | ||||
|             protected surveyHelper: AddonModSurveyHelperProvider) { | ||||
|         super(injector); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download or prefetch the content. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {boolean} [prefetch] True to prefetch, false to download right away. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. This is to keep the files | ||||
|      *                           relative paths and make the package work in an iframe. Undefined to download the files | ||||
|      *                           in the filepool root survey. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. Data returned is not reliable. | ||||
|      */ | ||||
|     downloadOrPrefetch(module: any, courseId: number, prefetch?: boolean, dirPath?: string): Promise<any> { | ||||
|         const promises = []; | ||||
| 
 | ||||
|         promises.push(super.downloadOrPrefetch(module, courseId, prefetch)); | ||||
|         promises.push(this.surveyProvider.getSurvey(courseId, module.id).then((survey) => { | ||||
|             // If survey isn't answered, prefetch the questions.
 | ||||
|             if (!survey.surveydone) { | ||||
|                 promises.push(this.surveyProvider.getQuestions(survey.id)); | ||||
|             } | ||||
|         })); | ||||
| 
 | ||||
|         return Promise.all(promises); | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -102,4 +87,43 @@ export class AddonModSurveyPrefetchHandler extends CoreCourseModulePrefetchHandl | ||||
|     isEnabled(): boolean | Promise<boolean> { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a module. | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|         return this.prefetchPackage(module, courseId, single, this.prefetchSurvey.bind(this)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a survey. | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} single True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {String} siteId Site ID. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     protected prefetchSurvey(module: any, courseId: number, single: boolean, siteId: string): Promise<any> { | ||||
|         return this.surveyProvider.getSurvey(courseId, module.id).then((survey) => { | ||||
|             const promises = [], | ||||
|                 files = this.getIntroFilesFromInstance(module, survey); | ||||
| 
 | ||||
|             // Prefetch files.
 | ||||
|             promises.push(this.filepoolProvider.addFilesToQueue(siteId, files, AddonModSurveyProvider.COMPONENT, module.id)); | ||||
| 
 | ||||
|             // If survey isn't answered, prefetch the questions.
 | ||||
|             if (!survey.surveydone) { | ||||
|                 promises.push(this.surveyProvider.getQuestions(survey.id)); | ||||
|             } | ||||
| 
 | ||||
|             return Promise.all(promises); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -12,12 +12,17 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreGroupsProvider } from '@providers/groups'; | ||||
| import { CoreTextUtilsProvider } from '@providers/utils/text'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler'; | ||||
| import { CoreCourseHelperProvider } from '@core/course/providers/helper'; | ||||
| import { CoreGradesHelperProvider } from '@core/grades/providers/helper'; | ||||
| import { CoreUserProvider } from '@core/user/providers/user'; | ||||
| @ -27,31 +32,19 @@ import { AddonModWikiProvider } from './wiki'; | ||||
|  * Handler to prefetch wikis. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModWikiPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModWikiPrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModWiki'; | ||||
|     modName = 'wiki'; | ||||
|     component = AddonModWikiProvider.COMPONENT; | ||||
|     updatesNames = /^.*files$|^pages$/; | ||||
| 
 | ||||
|     constructor(protected injector: Injector, protected wikiProvider: AddonModWikiProvider, | ||||
|             protected textUtils: CoreTextUtilsProvider, protected courseProvider: CoreCourseProvider, | ||||
|             protected courseHelper: CoreCourseHelperProvider, protected filepoolProvider: CoreFilepoolProvider, | ||||
|             protected groupsProvider: CoreGroupsProvider, protected gradesHelper: CoreGradesHelperProvider, | ||||
|             protected userProvider: CoreUserProvider) { | ||||
|         super(injector); | ||||
|     } | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             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) { | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         // Same implementation for download or prefetch.
 | ||||
|         return this.prefetch(module, courseId, false, dirPath); | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -156,7 +149,7 @@ export class AddonModWikiPrefetchHandler extends CoreCourseModulePrefetchHandler | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|  | ||||
| @ -12,8 +12,15 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler'; | ||||
| import { CoreGroupsProvider } from '@providers/groups'; | ||||
| import { CoreUserProvider } from '@core/user/providers/user'; | ||||
| import { AddonModWorkshopProvider } from './workshop'; | ||||
| @ -23,32 +30,26 @@ import { AddonModWorkshopHelperProvider } from './helper'; | ||||
|  * Handler to prefetch workshops. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModWorkshopPrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class AddonModWorkshopPrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     name = 'AddonModWorkshop'; | ||||
|     modName = 'workshop'; | ||||
|     component = AddonModWorkshopProvider.COMPONENT; | ||||
|     updatesNames = new RegExp('^configuration$|^.*files$|^completion|^gradeitems$|^outcomes$|^submissions$|^assessments$' + | ||||
|             '|^assessmentgrades$|^usersubmissions$|^userassessments$|^userassessmentgrades$|^userassessmentgrades$'); | ||||
| 
 | ||||
|     constructor(injector: Injector, | ||||
|     constructor(translate: TranslateService, | ||||
|             appProvider: CoreAppProvider, | ||||
|             utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, | ||||
|             filepoolProvider: CoreFilepoolProvider, | ||||
|             sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, | ||||
|             private groupsProvider: CoreGroupsProvider, | ||||
|             private userProvider: CoreUserProvider, | ||||
|             private workshopProvider: AddonModWorkshopProvider, | ||||
|             private workshopHelper: AddonModWorkshopHelperProvider) { | ||||
|         super(injector); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         // Workshop cannot be downloaded right away, only prefetched.
 | ||||
|         return this.prefetch(module, courseId, false, dirPath); | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -210,7 +211,7 @@ export class AddonModWorkshopPrefetchHandler extends CoreCourseModulePrefetchHan | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|  | ||||
| @ -56,7 +56,8 @@ import { CoreDelegate } from '@classes/delegate'; | ||||
| import { CoreContentLinksHandlerBase } from '@core/contentlinks/classes/base-handler'; | ||||
| import { CoreContentLinksModuleGradeHandler } from '@core/contentlinks/classes/module-grade-handler'; | ||||
| import { CoreContentLinksModuleIndexHandler } from '@core/contentlinks/classes/module-index-handler'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler'; | ||||
| import { CoreCourseResourcePrefetchHandlerBase } from '@core/course/classes/resource-prefetch-handler'; | ||||
| 
 | ||||
| // Import all core modules that define components, directives and pipes.
 | ||||
| import { CoreComponentsModule } from '@components/components.module'; | ||||
| @ -257,7 +258,8 @@ export class CoreCompileProvider { | ||||
|         instance['CoreContentLinksHandlerBase'] = CoreContentLinksHandlerBase; | ||||
|         instance['CoreContentLinksModuleGradeHandler'] = CoreContentLinksModuleGradeHandler; | ||||
|         instance['CoreContentLinksModuleIndexHandler'] = CoreContentLinksModuleIndexHandler; | ||||
|         instance['CoreCourseModulePrefetchHandlerBase'] = CoreCourseModulePrefetchHandlerBase; | ||||
|         instance['CoreCourseActivityPrefetchHandlerBase'] = CoreCourseActivityPrefetchHandlerBase; | ||||
|         instance['CoreCourseResourcePrefetchHandlerBase'] = CoreCourseResourcePrefetchHandlerBase; | ||||
|         instance['CoreCourseUnsupportedModuleComponent'] = CoreCourseUnsupportedModuleComponent; | ||||
|         instance['CoreCourseFormatSingleActivityComponent'] = CoreCourseFormatSingleActivityComponent; | ||||
|         instance['CoreSitePluginsModuleIndexComponent'] = CoreSitePluginsModuleIndexComponent; | ||||
|  | ||||
							
								
								
									
										165
									
								
								src/core/course/classes/activity-prefetch-handler.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										165
									
								
								src/core/course/classes/activity-prefetch-handler.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,165 @@ | ||||
| // (C) Copyright 2015 Martin Dougiamas
 | ||||
| //
 | ||||
| // Licensed under the Apache License, Version 2.0 (the "License");
 | ||||
| // you may not use this file except in compliance with the License.
 | ||||
| // You may obtain a copy of the License at
 | ||||
| //
 | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| //
 | ||||
| // Unless required by applicable law or agreed to in writing, software
 | ||||
| // distributed under the License is distributed on an "AS IS" BASIS,
 | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { CoreConstants } from '../../constants'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from './module-prefetch-handler'; | ||||
| 
 | ||||
| /** | ||||
|  * A prefetch function to be passed to prefetchPackage. | ||||
|  * This function should NOT call storePackageStatus, downloadPackage or prefetchPakage from filepool. | ||||
|  * It receives the same params as prefetchPackage except the function itself. This includes all extra parameters sent after siteId. | ||||
|  * The string returned by this function will be stored as "extra" data in the filepool package. If you don't need to store | ||||
|  * extra data, don't return anything. | ||||
|  * | ||||
|  * @param {any} module Module. | ||||
|  * @param {number} courseId Course ID the module belongs to. | ||||
|  * @param {boolean} single True if we're downloading a single module, false if we're downloading a whole section. | ||||
|  * @param {string} siteId Site ID. If not defined, current site. | ||||
|  * @return {Promise<string>} Promise resolved when the prefetch finishes. The string returned will be stored as "extra" data in the | ||||
|  *                           filepool package. If you don't need to store extra data, don't return anything. | ||||
|  */ | ||||
| export type prefetchFunction = (module: any, courseId: number, single: boolean, siteId: string, ...args: any[]) => Promise<string>; | ||||
| 
 | ||||
| /** | ||||
|  * Base prefetch handler to be registered in CoreCourseModulePrefetchDelegate. It is useful to minimize the amount of | ||||
|  * functions that handlers need to implement. It also provides some helper features like preventing a module to be | ||||
|  * downloaded twice at the same time. | ||||
|  * | ||||
|  * If your handler inherits from this service, you just need to override the functions that you want to change. | ||||
|  * | ||||
|  * This class should be used for ACTIVITIES. You must override the prefetch function, and it's recommended to call | ||||
|  * prefetchPackage in there since it handles the package status. | ||||
|  */ | ||||
| export class CoreCourseActivityPrefetchHandlerBase extends CoreCourseModulePrefetchHandlerBase { | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         // Same implementation for download and prefetch.
 | ||||
|         return this.prefetch(module, courseId, false, dirPath); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a module. | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|         // To be overridden. It should call prefetchPackage
 | ||||
|         return Promise.resolve(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch the module, setting package status at start and finish. | ||||
|      * | ||||
|      * Example usage from a child instance: | ||||
|      *     return this.prefetchPackage(module, courseId, single, this.prefetchModule.bind(this), siteId, someParam, anotherParam); | ||||
|      * | ||||
|      * Then the function "prefetchModule" will receive params: | ||||
|      *     prefetchModule(module, courseId, single, siteId, someParam, anotherParam) | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {prefetchFunction} downloadFn Function to perform the prefetch. Please check the documentation of prefetchFunction. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @return {Promise<any>} Promise resolved when the module has been downloaded. Data returned is not reliable. | ||||
|      */ | ||||
|     prefetchPackage(module: any, courseId: number, single: boolean, downloadFn: prefetchFunction, siteId?: string, ...args: any[]) | ||||
|             : Promise<any> { | ||||
|         siteId = siteId || this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         if (!this.appProvider.isOnline()) { | ||||
|             // Cannot prefetch in offline.
 | ||||
|             return Promise.reject(this.translate.instant('core.networkerrormsg')); | ||||
|         } | ||||
| 
 | ||||
|         if (this.isDownloading(module.id, siteId)) { | ||||
|             // There's already a download ongoing for this module, return the promise.
 | ||||
|             return this.getOngoingDownload(module.id, siteId); | ||||
|         } | ||||
| 
 | ||||
|         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.
 | ||||
|             return downloadFn.apply(downloadFn, [module, courseId, single, siteId].concat(args)); | ||||
|         }).then((extra: any) => { | ||||
|             // Only accept string types.
 | ||||
|             if (typeof extra != 'string') { | ||||
|                 extra = ''; | ||||
|             } | ||||
| 
 | ||||
|             // Prefetch finished, mark as downloaded.
 | ||||
|             return this.setDownloaded(module.id, siteId, extra); | ||||
|         }).catch((error) => { | ||||
|             // Error prefetching, go back to previous status and reject the promise.
 | ||||
|             return this.setPreviousStatusAndReject(module.id, error, siteId); | ||||
|         }); | ||||
| 
 | ||||
|         return this.addOngoingDownload(module.id, prefetchPromise, siteId); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Mark the module as downloaded. | ||||
|      * | ||||
|      * @param {number} id Unique identifier per component. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @param {string} [extra] Extra data to store. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     setDownloaded(id: number, siteId?: string, extra?: string): Promise<any> { | ||||
|         siteId = siteId || this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         return this.filepoolProvider.storePackageStatus(siteId, CoreConstants.DOWNLOADED, this.component, id, extra); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Mark the module as downloading. | ||||
|      * | ||||
|      * @param {number} id Unique identifier per component. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     setDownloading(id: number, siteId?: string): Promise<any> { | ||||
|         siteId = siteId || this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         return this.filepoolProvider.storePackageStatus(siteId, CoreConstants.DOWNLOADING, this.component, id); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Set previous status and return a rejected promise. | ||||
|      * | ||||
|      * @param {number} id Unique identifier per component. | ||||
|      * @param {any} [error] Error to return. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @return {Promise<never>} Rejected promise. | ||||
|      */ | ||||
|     setPreviousStatusAndReject(id: number, error?: any, siteId?: string): Promise<never> { | ||||
|         siteId = siteId || this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         return this.filepoolProvider.setPackagePreviousStatus(siteId, this.component, id).then(() => { | ||||
|             return Promise.reject(error); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| @ -12,7 +12,6 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injector } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| @ -21,36 +20,11 @@ import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '../providers/course'; | ||||
| import { CoreCourseModulePrefetchHandler } from '../providers/module-prefetch-delegate'; | ||||
| import { CoreConstants } from '../../constants'; | ||||
| 
 | ||||
| /** | ||||
|  * A prefetch function to be passed to prefetchPackage. | ||||
|  * This function should NOT call storePackageStatus, downloadPackage or prefetchPakage from filepool. | ||||
|  * It receives the same params as prefetchPackage except the function itself. This includes all extra parameters sent after siteId. | ||||
|  * The string returned by this function will be stored as "extra" data in the filepool package. If you don't need to store | ||||
|  * extra data, don't return anything. | ||||
|  * | ||||
|  * @param {any} module Module. | ||||
|  * @param {number} courseId Course ID the module belongs to. | ||||
|  * @param {boolean} single True if we're downloading a single module, false if we're downloading a whole section. | ||||
|  * @param {string} siteId Site ID. If not defined, current site. | ||||
|  * @return {Promise<string>} Promise resolved when the prefetch finishes. The string returned will be stored as "extra" data in the | ||||
|  *                           filepool package. If you don't need to store extra data, don't return anything. | ||||
|  */ | ||||
| export type prefetchFunction = (module: any, courseId: number, single: boolean, siteId: string, ...args: any[]) => Promise<string>; | ||||
| 
 | ||||
| /** | ||||
|  * Base prefetch handler to be registered in CoreCourseModulePrefetchDelegate. It is useful to minimize the amount of | ||||
|  * functions that handlers need to implement. It also provides some helper features like preventing a module to be | ||||
|  * downloaded twice at the same time. | ||||
|  * | ||||
|  * If your handler inherits from this service, you just need to override the functions that you want to change. | ||||
|  * | ||||
|  * The implementation of this default handler is aimed for resources that only need to prefetch files, not WebService calls. | ||||
|  * | ||||
|  * By default, prefetching a module will only download its files (downloadOrPrefetch). This might be enough for resources. | ||||
|  * If you need to prefetch WebServices, then you need to override the "download" and "prefetch" functions. In this case, it's | ||||
|  * recommended to call the prefetchPackage function since it'll handle changing the status of the module. | ||||
|  * Base prefetch handler to be registered in CoreCourseModulePrefetchDelegate. Prefetch handlers should inherit either | ||||
|  * from CoreCourseModuleActivityPrefetchHandlerBase or CoreCourseModuleResourcePrefetchHandlerBase, depending on whether | ||||
|  * they are an activity or a resource. It's not recommended to inherit from this class directly. | ||||
|  */ | ||||
| export class CoreCourseModulePrefetchHandlerBase implements CoreCourseModulePrefetchHandler { | ||||
|     /** | ||||
| @ -78,37 +52,15 @@ export class CoreCourseModulePrefetchHandlerBase implements CoreCourseModulePref | ||||
|      */ | ||||
|     updatesNames = /^.*files$/; | ||||
| 
 | ||||
|     /** | ||||
|      * Whether the module is a resource (true) or an activity (false). | ||||
|      * @type {boolean} | ||||
|      */ | ||||
|     isResource: boolean; | ||||
| 
 | ||||
|     /** | ||||
|      * List of download promises to prevent downloading the module twice at the same time. | ||||
|      * @type {{[s: string]: {[s: string]: Promise<any>}}} | ||||
|      */ | ||||
|     protected downloadPromises: { [s: string]: { [s: string]: Promise<any> } } = {}; | ||||
| 
 | ||||
|     // List of services that will be injected using injector.
 | ||||
|     // It's done like this so subclasses don't have to send all the services to the parent in the constructor.
 | ||||
|     protected translate: TranslateService; | ||||
|     protected appProvider: CoreAppProvider; | ||||
|     protected courseProvider: CoreCourseProvider; | ||||
|     protected filepoolProvider: CoreFilepoolProvider; | ||||
|     protected sitesProvider: CoreSitesProvider; | ||||
|     protected domUtils: CoreDomUtilsProvider; | ||||
|     protected utils: CoreUtilsProvider; | ||||
| 
 | ||||
|     constructor(injector: Injector) { | ||||
|         this.translate = injector.get(TranslateService); | ||||
|         this.appProvider = injector.get(CoreAppProvider); | ||||
|         this.courseProvider = injector.get(CoreCourseProvider); | ||||
|         this.filepoolProvider = injector.get(CoreFilepoolProvider); | ||||
|         this.sitesProvider = injector.get(CoreSitesProvider); | ||||
|         this.domUtils = injector.get(CoreDomUtilsProvider); | ||||
|         this.utils = injector.get(CoreUtilsProvider); | ||||
|     } | ||||
|     constructor(protected translate: TranslateService, protected appProvider: CoreAppProvider, protected utils: CoreUtilsProvider, | ||||
|             protected courseProvider: CoreCourseProvider, protected filepoolProvider: CoreFilepoolProvider, | ||||
|             protected sitesProvider: CoreSitesProvider, protected domUtils: CoreDomUtilsProvider) { } | ||||
| 
 | ||||
|     /** | ||||
|      * Add an ongoing download to the downloadPromises list. When the promise finishes it will be removed. | ||||
| @ -139,57 +91,12 @@ export class CoreCourseModulePrefetchHandlerBase implements CoreCourseModulePref | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         return this.downloadOrPrefetch(module, courseId, false, dirPath); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download or prefetch the content. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {boolean} [prefetch] True to prefetch, false to download right away. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. This is to keep the files | ||||
|      *                           relative paths and make the package work in an iframe. Undefined to download the files | ||||
|      *                           in the filepool root folder. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. Data returned is not reliable. | ||||
|      */ | ||||
|     downloadOrPrefetch(module: any, courseId: number, prefetch?: boolean, dirPath?: string): Promise<any> { | ||||
|         if (!this.appProvider.isOnline()) { | ||||
|             // Cannot download in offline.
 | ||||
|             return Promise.reject(this.translate.instant('core.networkerrormsg')); | ||||
|         } | ||||
| 
 | ||||
|         const siteId = this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         // 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) => { | ||||
|             const downloadFn = prefetch ? this.filepoolProvider.prefetchPackage.bind(this.filepoolProvider) : | ||||
|                         this.filepoolProvider.downloadPackage.bind(this.filepoolProvider), | ||||
|                 contentFiles = this.getContentDownloadableFiles(module), | ||||
|                 promises = []; | ||||
| 
 | ||||
|             if (dirPath) { | ||||
|                 // Download intro files in filepool root folder.
 | ||||
|                 promises.push(this.filepoolProvider.downloadOrPrefetchFiles(siteId, introFiles, prefetch, false, | ||||
|                     this.component, module.id)); | ||||
| 
 | ||||
|                 // Download content files inside dirPath.
 | ||||
|                 promises.push(downloadFn(siteId, contentFiles, this.component, module.id, undefined, dirPath)); | ||||
|             } else { | ||||
|                 // No dirPath, download everything in filepool root folder.
 | ||||
|                 const files = introFiles.concat(contentFiles); | ||||
|                 promises.push(downloadFn(siteId, files, this.component, module.id)); | ||||
|             } | ||||
| 
 | ||||
|             return Promise.all(promises); | ||||
|         }); | ||||
|         // To be overridden.
 | ||||
|         return Promise.resolve(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -251,12 +158,8 @@ export class CoreCourseModulePrefetchHandlerBase implements CoreCourseModulePref | ||||
|      * @return {Promise<any[]>} Promise resolved with the list of files. | ||||
|      */ | ||||
|     getFiles(module: any, courseId: number, single?: boolean): Promise<any[]> { | ||||
|         // Load module contents if needed.
 | ||||
|         return this.loadContents(module, courseId).then(() => { | ||||
|             return this.getIntroFiles(module, courseId).then((files) => { | ||||
|                 return files.concat(this.getContentDownloadableFiles(module)); | ||||
|             }); | ||||
|         }); | ||||
|         // To be overridden.
 | ||||
|         return Promise.resolve([]); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -329,13 +232,8 @@ export class CoreCourseModulePrefetchHandlerBase implements CoreCourseModulePref | ||||
|      * @return {Promise<any>} Promise resolved when the data is invalidated. | ||||
|      */ | ||||
|     invalidateContent(moduleId: number, courseId: number): Promise<any> { | ||||
|         const promises = [], | ||||
|             siteId = this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         promises.push(this.courseProvider.invalidateModule(moduleId)); | ||||
|         promises.push(this.filepoolProvider.invalidateFilesByComponent(siteId, this.component, moduleId)); | ||||
| 
 | ||||
|         return Promise.all(promises); | ||||
|         // To be overridden.
 | ||||
|         return Promise.resolve(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -403,10 +301,7 @@ export class CoreCourseModulePrefetchHandlerBase implements CoreCourseModulePref | ||||
|      * @return {Promise}           Promise resolved when loaded. | ||||
|      */ | ||||
|     loadContents(module: any, courseId: number, ignoreCache?: boolean): Promise<void> { | ||||
|         if (this.isResource) { | ||||
|             return this.courseProvider.loadModuleContents(module, courseId, undefined, false, ignoreCache); | ||||
|         } | ||||
| 
 | ||||
|         // To be overridden.
 | ||||
|         return Promise.resolve(); | ||||
|     } | ||||
| 
 | ||||
| @ -416,104 +311,12 @@ export class CoreCourseModulePrefetchHandlerBase implements CoreCourseModulePref | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|         return this.downloadOrPrefetch(module, courseId, true, dirPath); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch the module, setting package status at start and finish. | ||||
|      * | ||||
|      * Example usage from a child instance: | ||||
|      *     return this.prefetchPackage(module, courseId, single, this.prefetchModule.bind(this), siteId, someParam, anotherParam); | ||||
|      * | ||||
|      * Then the function "prefetchModule" will receive params: | ||||
|      *     prefetchModule(module, courseId, single, siteId, someParam, anotherParam) | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {prefetchFunction} downloadFn Function to perform the prefetch. Please check the documentation of prefetchFunction. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @return {Promise<any>} Promise resolved when the module has been downloaded. Data returned is not reliable. | ||||
|      */ | ||||
|     prefetchPackage(module: any, courseId: number, single: boolean, downloadFn: prefetchFunction, siteId?: string, ...args: any[]) | ||||
|             : Promise<any> { | ||||
|         siteId = siteId || this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         if (!this.appProvider.isOnline()) { | ||||
|             // Cannot prefetch in offline.
 | ||||
|             return Promise.reject(this.translate.instant('core.networkerrormsg')); | ||||
|         } | ||||
| 
 | ||||
|         if (this.isDownloading(module.id, siteId)) { | ||||
|             // There's already a download ongoing for this module, return the promise.
 | ||||
|             return this.getOngoingDownload(module.id, siteId); | ||||
|         } | ||||
| 
 | ||||
|         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.
 | ||||
|             return downloadFn.apply(downloadFn, [module, courseId, single, siteId].concat(args)); | ||||
|         }).then((extra: any) => { | ||||
|             // Only accept string types.
 | ||||
|             if (typeof extra != 'string') { | ||||
|                 extra = ''; | ||||
|             } | ||||
| 
 | ||||
|             // Prefetch finished, mark as downloaded.
 | ||||
|             return this.setDownloaded(module.id, siteId, extra); | ||||
|         }).catch((error) => { | ||||
|             // Error prefetching, go back to previous status and reject the promise.
 | ||||
|             return this.setPreviousStatusAndReject(module.id, error, siteId); | ||||
|         }); | ||||
| 
 | ||||
|         return this.addOngoingDownload(module.id, prefetchPromise, siteId); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Mark the module as downloaded. | ||||
|      * | ||||
|      * @param {number} id Unique identifier per component. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @param {string} [extra] Extra data to store. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     setDownloaded(id: number, siteId?: string, extra?: string): Promise<any> { | ||||
|         siteId = siteId || this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         return this.filepoolProvider.storePackageStatus(siteId, CoreConstants.DOWNLOADED, this.component, id, extra); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Mark the module as downloading. | ||||
|      * | ||||
|      * @param {number} id Unique identifier per component. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     setDownloading(id: number, siteId?: string): Promise<any> { | ||||
|         siteId = siteId || this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         return this.filepoolProvider.storePackageStatus(siteId, CoreConstants.DOWNLOADING, this.component, id); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Set previous status and return a rejected promise. | ||||
|      * | ||||
|      * @param {number} id Unique identifier per component. | ||||
|      * @param {any} [error] Error to return. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @return {Promise<never>} Rejected promise. | ||||
|      */ | ||||
|     setPreviousStatusAndReject(id: number, error?: any, siteId?: string): Promise<never> { | ||||
|         siteId = siteId || this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         return this.filepoolProvider.setPackagePreviousStatus(siteId, this.component, id).then(() => { | ||||
|             return Promise.reject(error); | ||||
|         }); | ||||
|         // To be overridden.
 | ||||
|         return Promise.resolve(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
							
								
								
									
										151
									
								
								src/core/course/classes/resource-prefetch-handler.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								src/core/course/classes/resource-prefetch-handler.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,151 @@ | ||||
| // (C) Copyright 2015 Martin Dougiamas
 | ||||
| //
 | ||||
| // Licensed under the Apache License, Version 2.0 (the "License");
 | ||||
| // you may not use this file except in compliance with the License.
 | ||||
| // You may obtain a copy of the License at
 | ||||
| //
 | ||||
| //     http://www.apache.org/licenses/LICENSE-2.0
 | ||||
| //
 | ||||
| // Unless required by applicable law or agreed to in writing, software
 | ||||
| // distributed under the License is distributed on an "AS IS" BASIS,
 | ||||
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { CoreCourseModulePrefetchHandlerBase } from './module-prefetch-handler'; | ||||
| 
 | ||||
| /** | ||||
|  * Base prefetch handler to be registered in CoreCourseModulePrefetchDelegate. It is useful to minimize the amount of | ||||
|  * functions that handlers need to implement. It also provides some helper features like preventing a module to be | ||||
|  * downloaded twice at the same time. | ||||
|  * | ||||
|  * If your handler inherits from this service, you just need to override the functions that you want to change. | ||||
|  * | ||||
|  * This class should be used for RESOURCES whose main purpose is downloading files present in module.contents. | ||||
|  */ | ||||
| export class CoreCourseResourcePrefetchHandlerBase extends CoreCourseModulePrefetchHandlerBase { | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. | ||||
|      */ | ||||
|     download(module: any, courseId: number, dirPath?: string): Promise<any> { | ||||
|         return this.downloadOrPrefetch(module, courseId, false, dirPath); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download or prefetch the content. | ||||
|      * | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {boolean} [prefetch] True to prefetch, false to download right away. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. This is to keep the files | ||||
|      *                           relative paths and make the package work in an iframe. Undefined to download the files | ||||
|      *                           in the filepool root folder. | ||||
|      * @return {Promise<any>} Promise resolved when all content is downloaded. Data returned is not reliable. | ||||
|      */ | ||||
|     downloadOrPrefetch(module: any, courseId: number, prefetch?: boolean, dirPath?: string): Promise<any> { | ||||
|         if (!this.appProvider.isOnline()) { | ||||
|             // Cannot download in offline.
 | ||||
|             return Promise.reject(this.translate.instant('core.networkerrormsg')); | ||||
|         } | ||||
| 
 | ||||
|         const siteId = this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         if (this.isDownloading(module.id, siteId)) { | ||||
|             // There's already a download ongoing for this module, return the promise.
 | ||||
|             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 the intro files.
 | ||||
|             return this.getIntroFiles(module, courseId); | ||||
|         }).then((introFiles) => { | ||||
|             const downloadFn = prefetch ? this.filepoolProvider.prefetchPackage.bind(this.filepoolProvider) : | ||||
|                         this.filepoolProvider.downloadPackage.bind(this.filepoolProvider), | ||||
|                 contentFiles = this.getContentDownloadableFiles(module), | ||||
|                 promises = []; | ||||
| 
 | ||||
|             if (dirPath) { | ||||
|                 // Download intro files in filepool root folder.
 | ||||
|                 promises.push(this.filepoolProvider.downloadOrPrefetchFiles(siteId, introFiles, prefetch, false, | ||||
|                     this.component, module.id)); | ||||
| 
 | ||||
|                 // Download content files inside dirPath.
 | ||||
|                 promises.push(downloadFn(siteId, contentFiles, this.component, module.id, undefined, dirPath)); | ||||
|             } else { | ||||
|                 // No dirPath, download everything in filepool root folder.
 | ||||
|                 const files = introFiles.concat(contentFiles); | ||||
|                 promises.push(downloadFn(siteId, files, this.component, module.id)); | ||||
|             } | ||||
| 
 | ||||
|             return Promise.all(promises); | ||||
|         }); | ||||
| 
 | ||||
|         return this.addOngoingDownload(module.id, prefetchPromise, siteId); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get list of files. If not defined, we'll assume they're in module.contents. | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {Number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @return {Promise<any[]>} Promise resolved with the list of files. | ||||
|      */ | ||||
|     getFiles(module: any, courseId: number, single?: boolean): Promise<any[]> { | ||||
|         // Load module contents if needed.
 | ||||
|         return this.loadContents(module, courseId).then(() => { | ||||
|             return this.getIntroFiles(module, courseId).then((files) => { | ||||
|                 return files.concat(this.getContentDownloadableFiles(module)); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Invalidate the prefetched content. | ||||
|      * | ||||
|      * @param {number} moduleId The module ID. | ||||
|      * @param {number} courseId The course ID the module belongs to. | ||||
|      * @return {Promise<any>} Promise resolved when the data is invalidated. | ||||
|      */ | ||||
|     invalidateContent(moduleId: number, courseId: number): Promise<any> { | ||||
|         const promises = [], | ||||
|             siteId = this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         promises.push(this.courseProvider.invalidateModule(moduleId)); | ||||
|         promises.push(this.filepoolProvider.invalidateFilesByComponent(siteId, this.component, moduleId)); | ||||
| 
 | ||||
|         return Promise.all(promises); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Load module contents into module.contents if they aren't loaded already. | ||||
|      * | ||||
|      * @param {any} module Module to load the contents. | ||||
|      * @param {number} [courseId] The course ID. Recommended to speed up the process and minimize data usage. | ||||
|      * @param {boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). | ||||
|      * @return {Promise}           Promise resolved when loaded. | ||||
|      */ | ||||
|     loadContents(module: any, courseId: number, ignoreCache?: boolean): Promise<void> { | ||||
|         return this.courseProvider.loadModuleContents(module, courseId, undefined, false, ignoreCache); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a module. | ||||
|      * | ||||
|      * @param {any} module Module. | ||||
|      * @param {number} courseId Course ID the module belongs to. | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: any, courseId?: number, single?: boolean, dirPath?: string): Promise<any> { | ||||
|         return this.downloadOrPrefetch(module, courseId, true, dirPath); | ||||
|     } | ||||
| } | ||||
| @ -12,19 +12,30 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injector } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreSitePluginsProvider } from '../../providers/siteplugins'; | ||||
| import { CoreCourseModulePrefetchHandlerBase } from '@core/course/classes/module-prefetch-handler'; | ||||
| import { CoreCourseActivityPrefetchHandlerBase } from '@core/course/classes/activity-prefetch-handler'; | ||||
| 
 | ||||
| /** | ||||
|  * Handler to prefetch a module site plugin. | ||||
|  */ | ||||
| export class CoreSitePluginsModulePrefetchHandler extends CoreCourseModulePrefetchHandlerBase { | ||||
| export class CoreSitePluginsModulePrefetchHandler extends CoreCourseActivityPrefetchHandlerBase { | ||||
|     protected ROOT_CACHE_KEY = 'CoreSitePluginsModulePrefetchHandler:'; | ||||
| 
 | ||||
|     constructor(injector: Injector, protected sitePluginsProvider: CoreSitePluginsProvider, component: string, name: string, | ||||
|             modName: string, protected handlerSchema: any) { | ||||
|         super(injector); | ||||
|     protected isResource: boolean; | ||||
| 
 | ||||
|     constructor(translate: TranslateService, appProvider: CoreAppProvider, utils: CoreUtilsProvider, | ||||
|             courseProvider: CoreCourseProvider, filepoolProvider: CoreFilepoolProvider, sitesProvider: CoreSitesProvider, | ||||
|             domUtils: CoreDomUtilsProvider, protected sitePluginsProvider: CoreSitePluginsProvider, component: string, | ||||
|             name: string, modName: string, protected handlerSchema: any) { | ||||
| 
 | ||||
|         super(translate, appProvider, utils, courseProvider, filepoolProvider, sitesProvider, domUtils); | ||||
| 
 | ||||
|         this.component = component; | ||||
|         this.name = name; | ||||
| @ -63,7 +74,7 @@ export class CoreSitePluginsModulePrefetchHandler extends CoreCourseModulePrefet | ||||
|      * @param {boolean} [single] True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @param {boolean} [prefetch] True to prefetch, false to download right away. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     protected downloadPrefetchPlugin(module: any, courseId: number, single?: boolean, siteId?: string, prefetch?: boolean, | ||||
| @ -94,7 +105,7 @@ export class CoreSitePluginsModulePrefetchHandler extends CoreCourseModulePrefet | ||||
|      * @param {any} module The module object returned by WS. | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {boolean} [prefetch] True to prefetch, false to download right away. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. @see downloadOrPrefetch. | ||||
|      * @param {string} [dirPath] Path of the directory where to store all the content files. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     protected downloadOrPrefetchFiles(siteId: string, module: any, courseId: number, prefetch?: boolean, dirPath?: string) | ||||
| @ -169,4 +180,20 @@ export class CoreSitePluginsModulePrefetchHandler extends CoreCourseModulePrefet | ||||
|     isEnabled(): boolean | Promise<boolean> { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Load module contents into module.contents if they aren't loaded already. | ||||
|      * | ||||
|      * @param {any} module Module to load the contents. | ||||
|      * @param {number} [courseId] The course ID. Recommended to speed up the process and minimize data usage. | ||||
|      * @param {boolean} [ignoreCache] True if it should ignore cached data (it will always fail in offline or server down). | ||||
|      * @return {Promise}           Promise resolved when loaded. | ||||
|      */ | ||||
|     loadContents(module: any, courseId: number, ignoreCache?: boolean): Promise<void> { | ||||
|         if (this.isResource) { | ||||
|             return this.courseProvider.loadModuleContents(module, courseId, undefined, false, ignoreCache); | ||||
|         } | ||||
| 
 | ||||
|         return Promise.resolve(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -12,21 +12,24 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable, Injector } from '@angular/core'; | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { Http } from '@angular/http'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreAppProvider } from '@providers/app'; | ||||
| import { CoreEventsProvider } from '@providers/events'; | ||||
| import { CoreFilepoolProvider } from '@providers/filepool'; | ||||
| import { CoreLangProvider } from '@providers/lang'; | ||||
| import { CoreLoggerProvider } from '@providers/logger'; | ||||
| import { CoreSite } from '@classes/site'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreTextUtilsProvider } from '@providers/utils/text'; | ||||
| import { CoreUrlUtilsProvider } from '@providers/utils/url'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreSitePluginsProvider } from './siteplugins'; | ||||
| import { CoreCompileProvider } from '@core/compile/providers/compile'; | ||||
| import { CoreQuestionProvider } from '@core/question/providers/question'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| 
 | ||||
| // Delegates
 | ||||
| import { CoreMainMenuDelegate } from '@core/mainmenu/providers/delegate'; | ||||
| @ -75,7 +78,7 @@ import { CoreSitePluginsWorkshopAssessmentStrategyHandler } from '../classes/han | ||||
| export class CoreSitePluginsHelperProvider { | ||||
|     protected logger; | ||||
| 
 | ||||
|     constructor(logger: CoreLoggerProvider, private sitesProvider: CoreSitesProvider,  private injector: Injector, | ||||
|     constructor(logger: CoreLoggerProvider, private sitesProvider: CoreSitesProvider, private domUtils: CoreDomUtilsProvider, | ||||
|             private mainMenuDelegate: CoreMainMenuDelegate, private moduleDelegate: CoreCourseModuleDelegate, | ||||
|             private userDelegate: CoreUserDelegate, private langProvider: CoreLangProvider, private http: Http, | ||||
|             private sitePluginsProvider: CoreSitePluginsProvider, private prefetchDelegate: CoreCourseModulePrefetchDelegate, | ||||
| @ -87,8 +90,9 @@ export class CoreSitePluginsHelperProvider { | ||||
|             private questionBehaviourDelegate: CoreQuestionBehaviourDelegate, private questionProvider: CoreQuestionProvider, | ||||
|             private messageOutputDelegate: AddonMessageOutputDelegate, private accessRulesDelegate: AddonModQuizAccessRuleDelegate, | ||||
|             private assignSubmissionDelegate: AddonModAssignSubmissionDelegate, private translate: TranslateService, | ||||
|             private assignFeedbackDelegate: AddonModAssignFeedbackDelegate, | ||||
|             private workshopAssessmentStrategyDelegate: AddonWorkshopAssessmentStrategyDelegate) { | ||||
|             private assignFeedbackDelegate: AddonModAssignFeedbackDelegate, private appProvider: CoreAppProvider, | ||||
|             private workshopAssessmentStrategyDelegate: AddonWorkshopAssessmentStrategyDelegate, | ||||
|             private courseProvider: CoreCourseProvider) { | ||||
| 
 | ||||
|         this.logger = logger.getInstance('CoreSitePluginsHelperProvider'); | ||||
| 
 | ||||
| @ -735,8 +739,9 @@ export class CoreSitePluginsHelperProvider { | ||||
| 
 | ||||
|         if (handlerSchema.offlinefunctions && Object.keys(handlerSchema.offlinefunctions).length) { | ||||
|             // Register the prefetch handler.
 | ||||
|             this.prefetchDelegate.registerHandler(new CoreSitePluginsModulePrefetchHandler( | ||||
|                 this.injector, this.sitePluginsProvider, plugin.component, uniqueName, modName, handlerSchema)); | ||||
|             this.prefetchDelegate.registerHandler(new CoreSitePluginsModulePrefetchHandler(this.translate, this.appProvider, | ||||
|                 this.utils, this.courseProvider, this.filepoolProvider, this.sitesProvider, this.domUtils, | ||||
|                 this.sitePluginsProvider, plugin.component, uniqueName, modName, handlerSchema)); | ||||
|         } | ||||
| 
 | ||||
|         return modName; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user