commit
						ee3bf7c2e5
					
				| @ -40,6 +40,7 @@ export class AddonBlockCalendarUpcomingHandlerService extends CoreBlockBaseHandl | ||||
|      */ | ||||
|     getDisplayData(block: CoreCourseBlock, contextLevel: string, instanceId: number): CoreBlockHandlerData { | ||||
|         const linkParams: Params = contextLevel == 'course' ? { courseId: instanceId } : {}; | ||||
|         linkParams.upcoming = true; | ||||
| 
 | ||||
|         return { | ||||
|             title: 'addon.block_calendarupcoming.pluginname', | ||||
|  | ||||
| @ -21,10 +21,14 @@ import { CoreCommentsComponentsModule } from '@features/comments/components/comp | ||||
| 
 | ||||
| import { CoreTagComponentsModule } from '@features/tag/components/components.module'; | ||||
| import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; | ||||
| import { AddonBlogMainMenuHandlerService } from './services/handlers/mainmenu'; | ||||
| 
 | ||||
| function buildRoutes(injector: Injector): Routes { | ||||
|     return [ | ||||
|         ...buildTabMainRoutes(injector, { | ||||
|             data: { | ||||
|                 mainMenuTabRoot: AddonBlogMainMenuHandlerService.PAGE_NAME, | ||||
|             }, | ||||
|             component: AddonBlogEntriesPage, | ||||
|         }), | ||||
|     ]; | ||||
|  | ||||
| @ -16,6 +16,7 @@ import { Injector, NgModule } from '@angular/core'; | ||||
| import { Route, RouterModule, ROUTES, Routes } from '@angular/router'; | ||||
| 
 | ||||
| import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; | ||||
| import { AddonCalendarMainMenuHandlerService } from './services/handlers/mainmenu'; | ||||
| 
 | ||||
| export const AddonCalendarEditRoute: Route = { | ||||
|     path: 'edit/:eventId', | ||||
| @ -33,14 +34,14 @@ function buildRoutes(injector: Injector): Routes { | ||||
|         { | ||||
|             path: 'index', | ||||
|             data: { | ||||
|                 isMainMenuRoot: true, | ||||
|                 mainMenuTabRoot: AddonCalendarMainMenuHandlerService.PAGE_NAME, | ||||
|             }, | ||||
|             loadChildren: () => import('@/addons/calendar/pages/index/index.module').then(m => m.AddonCalendarIndexPageModule), | ||||
|         }, | ||||
|         { | ||||
|             path: 'list', | ||||
|             data: { | ||||
|                 isMainMenuRoot: true, | ||||
|                 mainMenuTabRoot: AddonCalendarMainMenuHandlerService.PAGE_NAME, | ||||
|             }, | ||||
|             loadChildren: () => import('@/addons/calendar/pages/list/list.module').then(m => m.AddonCalendarListPageModule), | ||||
|         }, | ||||
|  | ||||
| @ -25,11 +25,15 @@ import { AddonCompetencyCompetencyPage } from './pages/competency/competency'; | ||||
| import { AddonCompetencyCompetencySummaryPage } from './pages/competencysummary/competencysummary'; | ||||
| import { AddonCompetencyCourseCompetenciesPage } from './pages/coursecompetencies/coursecompetencies.page'; | ||||
| import { AddonCompetencyCourseCompetenciesPageModule } from './pages/coursecompetencies/coursecompetencies.module'; | ||||
| import { AddonCompetencyMainMenuHandlerService } from './services/handlers/mainmenu'; | ||||
| 
 | ||||
| const mobileRoutes: Routes = [ | ||||
|     { | ||||
|         path: '', | ||||
|         pathMatch: 'full', | ||||
|         data: { | ||||
|             mainMenuTabRoot: AddonCompetencyMainMenuHandlerService.PAGE_NAME, | ||||
|         }, | ||||
|         component: AddonCompetencyPlanListPage, | ||||
|     }, | ||||
|     { | ||||
| @ -75,6 +79,9 @@ const tabletRoutes: Routes = [ | ||||
|     }, | ||||
|     { | ||||
|         path: '', | ||||
|         data: { | ||||
|             mainMenuTabRoot: AddonCompetencyMainMenuHandlerService.PAGE_NAME, | ||||
|         }, | ||||
|         component: AddonCompetencyPlanListPage, | ||||
|         children: [ | ||||
|             { | ||||
|  | ||||
| @ -22,12 +22,13 @@ import { CoreSharedModule } from '@/core/shared.module'; | ||||
| import { CoreSearchComponentsModule } from '@features/search/components/components.module'; | ||||
| 
 | ||||
| import { AddonMessagesDiscussions35Page } from './discussions.page'; | ||||
| import { AddonMessagesMainMenuHandlerService } from '@addons/messages/services/handlers/mainmenu'; | ||||
| 
 | ||||
| const mobileRoutes: Routes = [ | ||||
|     { | ||||
|         path: '', | ||||
|         data: { | ||||
|             isMainMenuRoot: true, | ||||
|             mainMenuTabRoot: AddonMessagesMainMenuHandlerService.PAGE_NAME, | ||||
|         }, | ||||
|         component: AddonMessagesDiscussions35Page, | ||||
|     }, | ||||
| @ -38,7 +39,7 @@ const tabletRoutes: Routes = [ | ||||
|     { | ||||
|         path: '', | ||||
|         data: { | ||||
|             isMainMenuRoot: true, | ||||
|             mainMenuTabRoot: AddonMessagesMainMenuHandlerService.PAGE_NAME, | ||||
|         }, | ||||
|         component: AddonMessagesDiscussions35Page, | ||||
|         children: [ | ||||
|  | ||||
| @ -21,12 +21,13 @@ import { CoreScreen } from '@services/screen'; | ||||
| import { CoreSharedModule } from '@/core/shared.module'; | ||||
| 
 | ||||
| import { AddonMessagesGroupConversationsPage } from './group-conversations.page'; | ||||
| import { AddonMessagesMainMenuHandlerService } from '@addons/messages/services/handlers/mainmenu'; | ||||
| 
 | ||||
| const mobileRoutes: Routes = [ | ||||
|     { | ||||
|         path: '', | ||||
|         data: { | ||||
|             isMainMenuRoot: true, | ||||
|             mainMenuTabRoot: AddonMessagesMainMenuHandlerService.PAGE_NAME, | ||||
|         }, | ||||
|         component: AddonMessagesGroupConversationsPage, | ||||
|     }, | ||||
| @ -37,7 +38,7 @@ const tabletRoutes: Routes = [ | ||||
|     { | ||||
|         path: '', | ||||
|         data: { | ||||
|             isMainMenuRoot: true, | ||||
|             mainMenuTabRoot: AddonMessagesMainMenuHandlerService.PAGE_NAME, | ||||
|         }, | ||||
|         component: AddonMessagesGroupConversationsPage, | ||||
|         children: [ | ||||
|  | ||||
| @ -211,13 +211,9 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a module. | ||||
|      * | ||||
|      * @param module Module. | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @return Promise resolved when done. | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number): Promise<void> { | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchAssign.bind(this, module, courseId)); | ||||
|     } | ||||
| 
 | ||||
| @ -226,12 +222,11 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref | ||||
|      * | ||||
|      * @param module Module. | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param siteId Site ID. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     protected async prefetchAssign(module: CoreCourseAnyModuleData, courseId?: number): Promise<void> { | ||||
|     protected async prefetchAssign(module: CoreCourseAnyModuleData, courseId: number, siteId: string): Promise<void> { | ||||
|         const userId = CoreSites.getCurrentSiteUserId(); | ||||
|         courseId = courseId || module.course || CoreSites.getCurrentSiteHomeId(); | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
|         const options: CoreSitesCommonWSOptions = { | ||||
|             readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, | ||||
|  | ||||
| @ -17,7 +17,7 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/ | ||||
| import { CoreCourse, CoreCourseAnyModuleData, CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||
| import { CoreUser } from '@features/user/services/user'; | ||||
| import { CoreGroups } from '@services/groups'; | ||||
| import { CoreSites, CoreSitesReadingStrategy } from '@services/sites'; | ||||
| import { CoreSitesReadingStrategy } from '@services/sites'; | ||||
| import { CoreUtils } from '@services/utils/utils'; | ||||
| import { makeSingleton } from '@singletons'; | ||||
| import { AddonModChat, AddonModChatProvider, AddonModChatSession } from '../chat'; | ||||
| @ -64,7 +64,7 @@ export class AddonModChatPrefetchHandlerService extends CoreCourseActivityPrefet | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number): Promise<void> { | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchChat.bind(this, module, courseId)); | ||||
|     } | ||||
| 
 | ||||
| @ -73,10 +73,10 @@ export class AddonModChatPrefetchHandlerService extends CoreCourseActivityPrefet | ||||
|      * | ||||
|      * @param module The module object returned by WS. | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param siteId Site ID. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     protected async prefetchChat(module: CoreCourseAnyModuleData, courseId: number): Promise<void> { | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
|     protected async prefetchChat(module: CoreCourseAnyModuleData, courseId: number, siteId: string): Promise<void> { | ||||
|         const options = { | ||||
|             readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, | ||||
|             siteId, | ||||
|  | ||||
| @ -17,7 +17,7 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/ | ||||
| import { CoreCourseAnyModuleData, CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||
| import { CoreUser } from '@features/user/services/user'; | ||||
| import { CoreFilepool } from '@services/filepool'; | ||||
| import { CoreSites, CoreSitesReadingStrategy } from '@services/sites'; | ||||
| import { CoreSitesReadingStrategy } from '@services/sites'; | ||||
| import { CoreUtils } from '@services/utils/utils'; | ||||
| import { CoreWSFile } from '@services/ws'; | ||||
| import { makeSingleton } from '@singletons'; | ||||
| @ -38,7 +38,7 @@ export class AddonModChoicePrefetchHandlerService extends CoreCourseActivityPref | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number, single?: boolean): Promise<void> { | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number, single?: boolean): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchChoice.bind(this, module, courseId, !!single)); | ||||
|     } | ||||
| 
 | ||||
| @ -55,10 +55,8 @@ export class AddonModChoicePrefetchHandlerService extends CoreCourseActivityPref | ||||
|         module: CoreCourseAnyModuleData, | ||||
|         courseId: number, | ||||
|         single: boolean, | ||||
|         siteId?: string, | ||||
|         siteId: string, | ||||
|     ): Promise<void> { | ||||
|         siteId = siteId || CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
|         const commonOptions = { | ||||
|             readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, | ||||
|             siteId, | ||||
|  | ||||
| @ -212,7 +212,7 @@ export class AddonModDataPrefetchHandlerService extends CoreCourseActivityPrefet | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number): Promise<void> { | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchDatabase.bind(this, module, courseId)); | ||||
|     } | ||||
| 
 | ||||
| @ -221,12 +221,10 @@ export class AddonModDataPrefetchHandlerService extends CoreCourseActivityPrefet | ||||
|      * | ||||
|      * @param module Module. | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param siteId Site ID. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     protected async prefetchDatabase(module: CoreCourseAnyModuleData, courseId?: number): Promise<void> { | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
|         courseId = courseId || module.course || CoreSites.getCurrentSiteHomeId(); | ||||
| 
 | ||||
|     protected async prefetchDatabase(module: CoreCourseAnyModuleData, courseId: number, siteId: string): Promise<void> { | ||||
|         const options = { | ||||
|             cmId: module.id, | ||||
|             readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, | ||||
|  | ||||
| @ -17,7 +17,7 @@ import { CoreCourseActivityPrefetchHandlerBase } from '@features/course/classes/ | ||||
| import { CoreCourseAnyModuleData, CoreCourseCommonModWSOptions } from '@features/course/services/course'; | ||||
| import { CoreFilepool } from '@services/filepool'; | ||||
| import { CoreGroups } from '@services/groups'; | ||||
| import { CoreSites, CoreSitesReadingStrategy } from '@services/sites'; | ||||
| import { CoreSitesReadingStrategy } from '@services/sites'; | ||||
| import { CoreTimeUtils } from '@services/utils/time'; | ||||
| import { CoreUtils } from '@services/utils/utils'; | ||||
| import { CoreWSFile } from '@services/ws'; | ||||
| @ -122,7 +122,7 @@ export class AddonModFeedbackPrefetchHandlerService extends CoreCourseActivityPr | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number): Promise<void> { | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchFeedback.bind(this, module, courseId)); | ||||
|     } | ||||
| 
 | ||||
| @ -131,10 +131,10 @@ export class AddonModFeedbackPrefetchHandlerService extends CoreCourseActivityPr | ||||
|      * | ||||
|      * @param module Module. | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param siteId Site ID. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     protected async prefetchFeedback(module: CoreCourseAnyModuleData, courseId: number): Promise<void> { | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
|     protected async prefetchFeedback(module: CoreCourseAnyModuleData, courseId: number, siteId: string): Promise<void> { | ||||
|         const commonOptions = { | ||||
|             readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, | ||||
|             siteId, | ||||
|  | ||||
| @ -171,15 +171,9 @@ export class AddonModForumPrefetchHandlerService extends CoreCourseActivityPrefe | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a module. | ||||
|      * | ||||
|      * @param module Module. | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param single True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param dirPath Path of the directory where to store all the content files. | ||||
|      * @return Promise resolved when done. | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number, single?: boolean): Promise<void> { | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number, single?: boolean): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchForum.bind(this, module, courseId, single)); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -97,7 +97,7 @@ export class AddonModGlossaryPrefetchHandlerService extends CoreCourseActivityPr | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number): Promise<void> { | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchGlossary.bind(this, module, courseId)); | ||||
|     } | ||||
| 
 | ||||
| @ -110,8 +110,6 @@ export class AddonModGlossaryPrefetchHandlerService extends CoreCourseActivityPr | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     protected async prefetchGlossary(module: CoreCourseAnyModuleData, courseId: number, siteId: string): Promise<void> { | ||||
|         siteId = siteId || CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
|         const options = { | ||||
|             cmId: module.id, | ||||
|             readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, | ||||
|  | ||||
| @ -76,7 +76,7 @@ export class AddonModH5PActivityPrefetchHandlerService extends CoreCourseActivit | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number): Promise<void> { | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchActivity.bind(this, module, courseId)); | ||||
|     } | ||||
| 
 | ||||
| @ -91,10 +91,8 @@ export class AddonModH5PActivityPrefetchHandlerService extends CoreCourseActivit | ||||
|     protected async prefetchActivity( | ||||
|         module: CoreCourseAnyModuleData, | ||||
|         courseId: number, | ||||
|         siteId?: string, | ||||
|         siteId: string, | ||||
|     ): Promise<void> { | ||||
|         siteId = siteId || CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
|         const h5pActivity = await AddonModH5PActivity.getH5PActivity(courseId, module.id, { | ||||
|             readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, | ||||
|             siteId, | ||||
|  | ||||
| @ -231,17 +231,10 @@ export class AddonModLessonPrefetchHandlerService extends CoreCourseActivityPref | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch a module. | ||||
|      * | ||||
|      * @param module Module. | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param single True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param dirPath Path of the directory where to store all the content files. | ||||
|      * @return Promise resolved when done. | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number, single?: boolean, dirPath?: string): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchLesson.bind(this, module, courseId, single)); | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number, single?: boolean): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchLesson.bind(this, module, courseId, !!single)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -250,12 +243,15 @@ export class AddonModLessonPrefetchHandlerService extends CoreCourseActivityPref | ||||
|      * @param module Module. | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param single True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param siteId Site ID. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     protected async prefetchLesson(module: CoreCourseAnyModuleData, courseId?: number, single?: boolean): Promise<void> { | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
|         courseId = courseId || module.course || CoreSites.getCurrentSiteHomeId(); | ||||
| 
 | ||||
|     protected async prefetchLesson( | ||||
|         module: CoreCourseAnyModuleData, | ||||
|         courseId: number, | ||||
|         single: boolean, | ||||
|         siteId: string, | ||||
|     ): Promise<void> { | ||||
|         const commonOptions = { | ||||
|             readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, | ||||
|             siteId, | ||||
|  | ||||
| @ -269,7 +269,7 @@ export class AddonModQuizPrefetchHandlerService extends CoreCourseActivityPrefet | ||||
|      */ | ||||
|     async prefetch( | ||||
|         module: SyncedModule, | ||||
|         courseId?: number, | ||||
|         courseId: number, | ||||
|         single?: boolean, | ||||
|         dirPath?: string, | ||||
|         canStart: boolean = true, | ||||
| @ -282,9 +282,7 @@ export class AddonModQuizPrefetchHandlerService extends CoreCourseActivityPrefet | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchQuiz.bind(this, module, courseId, single, siteId, canStart)); | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchQuiz.bind(this, module, courseId, !!single, canStart)); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -293,16 +291,16 @@ export class AddonModQuizPrefetchHandlerService extends CoreCourseActivityPrefet | ||||
|      * @param module Module. | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param single True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param siteId Site ID. | ||||
|      * @param canStart If true, start a new attempt if needed. | ||||
|      * @param siteId Site ID. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     protected async prefetchQuiz( | ||||
|         module: CoreCourseAnyModuleData, | ||||
|         courseId: number, | ||||
|         single: boolean, | ||||
|         siteId: string, | ||||
|         canStart: boolean, | ||||
|         siteId: string, | ||||
|     ): Promise<void> { | ||||
|         const commonOptions = { | ||||
|             readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, | ||||
|  | ||||
| @ -47,12 +47,10 @@ export class AddonModScormPrefetchHandlerService extends CoreCourseActivityPrefe | ||||
|         dirPath?: string, | ||||
|         onProgress?: AddonModScormProgressCallback, | ||||
|     ): Promise<void> { | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
|         return this.prefetchPackage( | ||||
|             module, | ||||
|             courseId, | ||||
|             this.downloadOrPrefetchScorm.bind(this, module, courseId, true, siteId, false, onProgress), | ||||
|             this.downloadOrPrefetchScorm.bind(this, module, courseId, true, false, onProgress), | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
| @ -62,18 +60,18 @@ export class AddonModScormPrefetchHandlerService extends CoreCourseActivityPrefe | ||||
|      * @param module Module. | ||||
|      * @param courseId Course ID the module belongs to. | ||||
|      * @param single True if we're downloading a single module, false if we're downloading a whole section. | ||||
|      * @param siteId Site ID. | ||||
|      * @param prefetch True to prefetch, false to download right away. | ||||
|      * @param onProgress Function to call on progress. | ||||
|      * @param siteId Site ID. | ||||
|      * @return Promise resolved with the "extra" data to store: the hash of the file. | ||||
|      */ | ||||
|     protected async downloadOrPrefetchScorm( | ||||
|         module: CoreCourseAnyModuleData, | ||||
|         courseId: number, | ||||
|         single: boolean, | ||||
|         siteId: string, | ||||
|         prefetch: boolean, | ||||
|         onProgress?: AddonModScormProgressCallback, | ||||
|         onProgress: AddonModScormProgressCallback | undefined, | ||||
|         siteId: string, | ||||
|     ): Promise<string> { | ||||
| 
 | ||||
|         const scorm = await this.getScorm(module, courseId, siteId); | ||||
| @ -370,12 +368,10 @@ export class AddonModScormPrefetchHandlerService extends CoreCourseActivityPrefe | ||||
|         dirPath?: string, | ||||
|         onProgress?: AddonModScormProgressCallback, | ||||
|     ): Promise<void> { | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
|         return this.prefetchPackage( | ||||
|             module, | ||||
|             courseId, | ||||
|             this.downloadOrPrefetchScorm.bind(this, module, courseId, single, siteId, true, onProgress), | ||||
|             this.downloadOrPrefetchScorm.bind(this, module, courseId, single, true, onProgress), | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -78,38 +78,41 @@ | ||||
|                 </ng-container> | ||||
| 
 | ||||
|                 <!-- Subquestion --> | ||||
|                 <ion-radio-group [(ngModel)]="answers[question.name]" [required]="question.required" [name]="question.name"> | ||||
|                     <ion-row *ngIf="question.parent !== 0" class="ion-align-items-center ion-padding-horizontal" [class.even]="isEven"> | ||||
|                 <ng-container *ngIf="question.parent !== 0"> | ||||
|                     <ion-radio-group [(ngModel)]="answers[question.name]" [required]="question.required" [name]="question.name"> | ||||
|                         <ion-row *ngIf="question.parent !== 0" class="ion-align-items-center ion-padding-horizontal" | ||||
|                             [class.even]="isEven"> | ||||
| 
 | ||||
|                         <ion-col size="7"> | ||||
|                             <ion-label id="addon-mod_survey-{{question.id}}"> | ||||
|                                 <span [core-mark-required]="question.required"> | ||||
|                                     <strong>{{question.num}}.</strong> {{ question.text }} | ||||
|                                 </span> | ||||
|                             </ion-label> | ||||
|                         </ion-col> | ||||
|                             <ion-col size="7"> | ||||
|                                 <ion-label id="addon-mod_survey-{{question.id}}"> | ||||
|                                     <span [core-mark-required]="question.required"> | ||||
|                                         <strong>{{question.num}}.</strong> {{ question.text }} | ||||
|                                     </span> | ||||
|                                 </ion-label> | ||||
|                             </ion-col> | ||||
| 
 | ||||
|                         <!-- Tablet view: radio buttons --> | ||||
|                         <ion-col class="ion-hide-md-down ion-text-center" size="1" | ||||
|                             *ngFor="let option of question.optionsArray; let value=index;" | ||||
|                             > | ||||
|                             <!-- Empty slot to avoid errors on migration tslint checks --> | ||||
|                             <ion-radio [value]="value + 1" [attr.aria-label]="question.num + '. '+question.text + ': ' + option"> | ||||
|                             </ion-radio> | ||||
|                         </ion-col> | ||||
|                         <ion-col class="ion-hide-md-up" size="5"> | ||||
|                             <ion-select class="ion-padding" [(ngModel)]="answers[question.name]" [required]="question.required" | ||||
|                                 [attr.aria-labelledby]="'addon-mod_survey-'+question.id" interface="action-sheet" | ||||
|                                 [name]="question.name"> | ||||
|                                 <ion-select-option value="-1" selected disabled>{{ 'core.choose' | translate }}</ion-select-option> | ||||
|                                 <ion-select-option *ngFor="let option of question.optionsArray; let value=index;" | ||||
|                                     [value]="value +1"> | ||||
|                                     {{option}} | ||||
|                                 </ion-select-option> | ||||
|                             </ion-select> | ||||
|                         </ion-col> | ||||
|                     </ion-row> | ||||
|                 </ion-radio-group> | ||||
|                             <!-- Tablet view: radio buttons --> | ||||
|                             <ion-col class="ion-hide-md-down ion-text-center" size="1" | ||||
|                                 *ngFor="let option of question.optionsArray; let value=index;" | ||||
|                                 > | ||||
|                                 <!-- Empty slot to avoid errors on migration tslint checks --> | ||||
|                                 <ion-radio [value]="value + 1" [attr.aria-label]="question.num + '. '+question.text + ': ' + option"> | ||||
|                                 </ion-radio> | ||||
|                             </ion-col> | ||||
|                             <ion-col class="ion-hide-md-up" size="5"> | ||||
|                                 <ion-select class="ion-padding" [(ngModel)]="answers[question.name]" [required]="question.required" | ||||
|                                     [attr.aria-labelledby]="'addon-mod_survey-'+question.id" interface="action-sheet" | ||||
|                                     [name]="question.name"> | ||||
|                                     <ion-select-option value="-1" selected disabled>{{ 'core.choose' | translate }}</ion-select-option> | ||||
|                                     <ion-select-option *ngFor="let option of question.optionsArray; let value=index;" | ||||
|                                         [value]="value +1"> | ||||
|                                         {{option}} | ||||
|                                     </ion-select-option> | ||||
|                                 </ion-select> | ||||
|                             </ion-col> | ||||
|                         </ion-row> | ||||
|                     </ion-radio-group> | ||||
|                 </ng-container> | ||||
| 
 | ||||
|                 <!-- Single question (don't belong to a category) --> | ||||
|                 <ng-container *ngIf="(!question.multiArray || question.multiArray.length == 0) && question.parent === 0"> | ||||
|  | ||||
| @ -67,7 +67,7 @@ export class AddonModSurveyPrefetchHandlerService extends CoreCourseActivityPref | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number): Promise<void> { | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchSurvey.bind(this, module, courseId)); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -130,7 +130,7 @@ export class AddonModWikiPrefetchHandlerService extends CoreCourseActivityPrefet | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     async prefetch(module: CoreCourseAnyModuleData, courseId?: number, single?: boolean): Promise<void> { | ||||
|     async prefetch(module: CoreCourseAnyModuleData, courseId: number, single?: boolean): Promise<void> { | ||||
|         // Get the download time of the package before starting the download (otherwise we'd always get current time).
 | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
| @ -138,7 +138,12 @@ export class AddonModWikiPrefetchHandlerService extends CoreCourseActivityPrefet | ||||
| 
 | ||||
|         const downloadTime = data?.downloadTime || 0; | ||||
| 
 | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchWiki.bind(this, module, courseId, single, downloadTime, siteId)); | ||||
|         return this.prefetchPackage( | ||||
|             module, | ||||
|             courseId, | ||||
|             this.prefetchWiki.bind(this, module, courseId, !!single, downloadTime), | ||||
|             siteId, | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -210,7 +210,7 @@ export class AddonModWorkshopPrefetchHandlerService extends CoreCourseActivityPr | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number): Promise<void> { | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number): Promise<void> { | ||||
|         return this.prefetchPackage(module, courseId, this.prefetchWorkshop.bind(this, module, courseId)); | ||||
|     } | ||||
| 
 | ||||
| @ -258,9 +258,6 @@ export class AddonModWorkshopPrefetchHandlerService extends CoreCourseActivityPr | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     protected async prefetchWorkshop(module: CoreCourseAnyModuleData, courseId: number, siteId: string): Promise<void> { | ||||
| 
 | ||||
|         siteId = siteId || CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
|         const userIds: number[] = []; | ||||
|         const commonOptions = { | ||||
|             readingStrategy: CoreSitesReadingStrategy.ONLY_NETWORK, | ||||
|  | ||||
| @ -16,13 +16,14 @@ import { Injector, NgModule } from '@angular/core'; | ||||
| import { RouterModule, ROUTES, Routes } from '@angular/router'; | ||||
| 
 | ||||
| import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; | ||||
| import { AddonNotificationsMainMenuHandlerService } from './services/handlers/mainmenu'; | ||||
| 
 | ||||
| function buildRoutes(injector: Injector): Routes { | ||||
|     return [ | ||||
|         { | ||||
|             path: 'list', | ||||
|             data: { | ||||
|                 isMainMenuRoot: true, | ||||
|                 mainMenuTabRoot: AddonNotificationsMainMenuHandlerService.PAGE_NAME, | ||||
|             }, | ||||
|             loadChildren: () => import('./pages/list/list.module').then(m => m.AddonNotificationsListPageModule), | ||||
|         }, | ||||
|  | ||||
| @ -16,13 +16,14 @@ import { Injector, NgModule } from '@angular/core'; | ||||
| import { RouterModule, ROUTES, Routes } from '@angular/router'; | ||||
| 
 | ||||
| import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; | ||||
| import { AddonPrivateFilesMainMenuHandlerService } from './services/handlers/mainmenu'; | ||||
| 
 | ||||
| function buildRoutes(injector: Injector): Routes { | ||||
|     return [ | ||||
|         { | ||||
|             path: 'root', | ||||
|             data: { | ||||
|                 isMainMenuRoot: true, | ||||
|                 mainMenuTabRoot: AddonPrivateFilesMainMenuHandlerService.PAGE_NAME, | ||||
|             }, | ||||
|             loadChildren: () => import('./pages/index/index.module').then(m => m.AddonPrivateFilesIndexPageModule), | ||||
|         }, | ||||
|  | ||||
| @ -78,8 +78,8 @@ export class CoreCourseActivityPrefetchHandlerBase extends CoreCourseModulePrefe | ||||
|      */ | ||||
|     async prefetchPackage( | ||||
|         module: CoreCourseAnyModuleData, | ||||
|         courseId: number | undefined, | ||||
|         downloadFunction: () => Promise<string>, | ||||
|         courseId: number, | ||||
|         downloadFunction: (siteId: string) => Promise<string>, | ||||
|         siteId?: string, | ||||
|     ): Promise<void> { | ||||
|         siteId = siteId || CoreSites.getCurrentSiteId(); | ||||
| @ -111,8 +111,8 @@ export class CoreCourseActivityPrefetchHandlerBase extends CoreCourseModulePrefe | ||||
|     protected async changeStatusAndPrefetch( | ||||
|         module: CoreCourseAnyModuleData, | ||||
|         courseId: number | undefined, | ||||
|         downloadFunction: () => Promise<string>, | ||||
|         siteId?: string, | ||||
|         downloadFunction: (siteId: string) => Promise<string>, | ||||
|         siteId: string, | ||||
|     ): Promise<void> { | ||||
|         try { | ||||
|             await this.setDownloading(module.id, siteId); | ||||
| @ -125,7 +125,7 @@ export class CoreCourseActivityPrefetchHandlerBase extends CoreCourseModulePrefe | ||||
|             ]); | ||||
| 
 | ||||
|             // Call the download function.
 | ||||
|             let extra = await downloadFunction(); | ||||
|             let extra = await downloadFunction(siteId); | ||||
| 
 | ||||
|             // Only accept string types.
 | ||||
|             if (typeof extra != 'string') { | ||||
|  | ||||
| @ -12,7 +12,6 @@ | ||||
| // See the License for the specific language governing permissions and
 | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { CoreError } from '@classes/errors/error'; | ||||
| import { CoreNetworkError } from '@classes/errors/network-error'; | ||||
| import { CoreFilterHelper } from '@features/filter/services/filter-helper'; | ||||
| import { CoreApp } from '@services/app'; | ||||
| @ -191,12 +190,7 @@ export class CoreCourseResourcePrefetchHandlerBase extends CoreCourseModulePrefe | ||||
|      * @param dirPath Path of the directory where to store all the content files. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: CoreCourseWSModule, courseId?: number, single?: boolean, dirPath?: string): Promise<void> { | ||||
|         courseId = courseId || module.course; | ||||
|         if (!courseId) { | ||||
|             throw new CoreError('Course ID not supplied.'); | ||||
|         } | ||||
| 
 | ||||
|     prefetch(module: CoreCourseWSModule, courseId: number, single?: boolean, dirPath?: string): Promise<void> { | ||||
|         return this.downloadOrPrefetch(module, courseId, true, dirPath); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -182,7 +182,7 @@ export class CoreCourseModulePrefetchDelegateService extends CoreDelegate<CoreCo | ||||
|             if (!CoreFilepool.getPackageDownloadPromise(siteId, handler.component, module.id)) { | ||||
|                 // Not handled, the app was probably restarted or something weird happened.
 | ||||
|                 // Re-start download (files already on queue or already downloaded will be skipped).
 | ||||
|                 handler.prefetch(module); | ||||
|                 handler.prefetch(module, module.course!); | ||||
|             } | ||||
|         } else if (handler.determineStatus) { | ||||
|             // The handler implements a determineStatus function. Apply it.
 | ||||
| @ -1403,7 +1403,7 @@ export interface CoreCourseModulePrefetchHandler extends CoreDelegateHandler { | ||||
|      * @param dirPath Path of the directory where to store all the content files. | ||||
|      * @return Promise resolved when done. | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number, single?: boolean, dirPath?: string): Promise<void>; | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number, single?: boolean, dirPath?: string): Promise<void>; | ||||
| 
 | ||||
|     /** | ||||
|      * Download the module. | ||||
|  | ||||
| @ -23,10 +23,14 @@ import { CoreGradesCoursePage } from './pages/course/course.page'; | ||||
| import { CoreGradesCoursePageModule } from './pages/course/course.module'; | ||||
| import { CoreGradesCoursesPage } from './pages/courses/courses.page'; | ||||
| import { CoreGradesGradePage } from './pages/grade/grade.page'; | ||||
| import { CoreGradesMainMenuHandlerService } from './services/handlers/mainmenu'; | ||||
| 
 | ||||
| const mobileRoutes: Routes = [ | ||||
|     { | ||||
|         path: '', | ||||
|         data: { | ||||
|             mainMenuTabRoot: CoreGradesMainMenuHandlerService.PAGE_NAME, | ||||
|         }, | ||||
|         component: CoreGradesCoursesPage, | ||||
|     }, | ||||
|     { | ||||
| @ -42,6 +46,9 @@ const mobileRoutes: Routes = [ | ||||
| const tabletRoutes: Routes = [ | ||||
|     { | ||||
|         path: '', | ||||
|         data: { | ||||
|             mainMenuTabRoot: CoreGradesMainMenuHandlerService.PAGE_NAME, | ||||
|         }, | ||||
|         component: CoreGradesCoursesPage, | ||||
|         children: [ | ||||
|             { | ||||
|  | ||||
| @ -21,6 +21,7 @@ import { CoreSharedModule } from '@/core/shared.module'; | ||||
| import { CoreMainMenuHomePage } from './home'; | ||||
| import { MAIN_MENU_HOME_ROUTES } from './home-routing.module'; | ||||
| import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; | ||||
| import { CoreMainMenuHomeHandlerService } from '@features/mainmenu/services/handlers/mainmenu'; | ||||
| 
 | ||||
| function buildRoutes(injector: Injector): Routes { | ||||
|     const routes = resolveModuleRoutes(injector, MAIN_MENU_HOME_ROUTES); | ||||
| @ -29,7 +30,7 @@ function buildRoutes(injector: Injector): Routes { | ||||
|         ...buildTabMainRoutes(injector, { | ||||
|             path: '', | ||||
|             data: { | ||||
|                 isMainMenuRoot: true, | ||||
|                 mainMenuTabRoot: CoreMainMenuHomeHandlerService.PAGE_NAME, | ||||
|             }, | ||||
|             component: CoreMainMenuHomePage, | ||||
|             children: routes.children, | ||||
|  | ||||
| @ -176,12 +176,12 @@ export class CoreMainMenuPage implements OnInit, OnDestroy { | ||||
|         e.stopImmediatePropagation(); | ||||
| 
 | ||||
|         // Current tab was clicked. Check if user is already at root level.
 | ||||
|         const mainMenuRootRoute = CoreNavigator.getCurrentRoute({ routeData: { isMainMenuRoot: true } }); | ||||
|         if (mainMenuRootRoute) { | ||||
|         const isMainMenuRoot = await this.currentRouteIsMainMenuRoot(); | ||||
|         if (isMainMenuRoot) { | ||||
|             return; // Already at root level, nothing to do.
 | ||||
|         } | ||||
| 
 | ||||
|         // Current route doesn't define isMainMenuRoot. Check if the current path is the tab one.
 | ||||
|         // Maybe the route isn't defined as it should. Check if the current path is the tab one.
 | ||||
|         const currentPath = CoreNavigator.getCurrentPath(); | ||||
|         if (currentPath == `/main/${page}`) { | ||||
|             return; // Already at root level, nothing to do.
 | ||||
| @ -227,8 +227,8 @@ export class CoreMainMenuPage implements OnInit, OnDestroy { | ||||
|         event.detail.register(-10, async (processNextHandler: () => void) => { | ||||
|             // This callback can be called at the same time as Ionic's back navigation callback.
 | ||||
|             // Check if user is already at the root of a tab.
 | ||||
|             const mainMenuRootRoute = CoreNavigator.getCurrentRoute({ routeData: { isMainMenuRoot: true } }); | ||||
|             if (!mainMenuRootRoute) { | ||||
|             const isMainMenuRoot = await this.currentRouteIsMainMenuRoot(); | ||||
|             if (!isMainMenuRoot) { | ||||
|                 return; // Not at root level, let Ionic handle the navigation.
 | ||||
|             } | ||||
| 
 | ||||
| @ -257,6 +257,16 @@ export class CoreMainMenuPage implements OnInit, OnDestroy { | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Check if current route is the root of the current main menu tab. | ||||
|      * | ||||
|      * @return Promise. | ||||
|      */ | ||||
|     protected async currentRouteIsMainMenuRoot(): Promise<boolean> { | ||||
|         // Check if the current route is the root of the current main menu tab.
 | ||||
|         return !!CoreNavigator.getCurrentRoute({ routeData: { mainMenuTabRoot: CoreNavigator.getCurrentMainMenuTab() } }); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  | ||||
| @ -18,6 +18,7 @@ import { RouterModule, ROUTES } from '@angular/router'; | ||||
| import { CoreSharedModule } from '@/core/shared.module'; | ||||
| import { CoreMainMenuMorePage } from './more'; | ||||
| import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; | ||||
| import { CoreMainMenuProvider } from '@features/mainmenu/services/mainmenu'; | ||||
| 
 | ||||
| @NgModule({ | ||||
|     imports: [ | ||||
| @ -31,7 +32,7 @@ import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.modu | ||||
|             useFactory: (injector: Injector) => buildTabMainRoutes(injector, { | ||||
|                 component: CoreMainMenuMorePage, | ||||
|                 data: { | ||||
|                     isMainMenuRoot: true, | ||||
|                     mainMenuTabRoot: CoreMainMenuProvider.MORE_PAGE_NAME, | ||||
|                 }, | ||||
|             }), | ||||
|         }, | ||||
|  | ||||
| @ -222,14 +222,11 @@ export class CoreSitePluginsModulePrefetchHandler extends CoreCourseActivityPref | ||||
|     /** | ||||
|      * @inheritdoc | ||||
|      */ | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId?: number, single?: boolean, dirPath?: string): Promise<void> { | ||||
|         const siteId = CoreSites.getCurrentSiteId(); | ||||
| 
 | ||||
|     prefetch(module: CoreCourseAnyModuleData, courseId: number, single?: boolean, dirPath?: string): Promise<void> { | ||||
|         return this.prefetchPackage( | ||||
|             module, | ||||
|             courseId, | ||||
|             this.downloadPrefetchPlugin.bind(this, module, courseId, true, dirPath, siteId), | ||||
|             siteId, | ||||
|             this.downloadPrefetchPlugin.bind(this, module, courseId, true, dirPath), | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -16,6 +16,7 @@ import { Injector, NgModule } from '@angular/core'; | ||||
| import { Route, RouterModule, ROUTES, Routes } from '@angular/router'; | ||||
| 
 | ||||
| import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; | ||||
| import { CoreTagMainMenuHandlerService } from './services/handlers/mainmenu'; | ||||
| 
 | ||||
| export const CoreTagIndexAreaRoute: Route = { | ||||
|     path: 'index-area', | ||||
| @ -32,7 +33,7 @@ function buildRoutes(injector: Injector): Routes { | ||||
|         { | ||||
|             path: 'search', | ||||
|             data: { | ||||
|                 isMainMenuRoot: true, | ||||
|                 mainMenuTabRoot: CoreTagMainMenuHandlerService.PAGE_NAME, | ||||
|             }, | ||||
|             loadChildren: () => import('@features/tag//pages/search/search.page.module').then(m => m.CoreTagSearchPageModule), | ||||
|         }, | ||||
|  | ||||
| @ -629,6 +629,10 @@ export class CoreAppProvider { | ||||
|      * @param color RGB color to use as status bar background. If not set the css variable will be read. | ||||
|      */ | ||||
|     setStatusBarColor(color?: string): void { | ||||
|         if (!this.isMobile()) { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         if (!color) { | ||||
|             // Get the default color to change it.
 | ||||
|             const element = document.querySelector('ion-header ion-toolbar'); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user