MOBILE-2309 contentlinks: Implement base handlers
This commit is contained in:
		
							parent
							
								
									1cfd38229f
								
							
						
					
					
						commit
						b3d0457540
					
				
							
								
								
									
										111
									
								
								src/core/contentlinks/classes/base-handler.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								src/core/contentlinks/classes/base-handler.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,111 @@ | ||||
| // (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 { CoreContentLinksHandler, CoreContentLinksAction } from '../providers/delegate'; | ||||
| 
 | ||||
| /** | ||||
|  * Base handler to be registered in CoreContentLinksHandler. It is useful to minimize the amount of | ||||
|  * functions that handlers need to implement. | ||||
|  * | ||||
|  * It allows you to specify a "pattern" (RegExp) that will be used to check if the handler handles a URL and to get its site URL. | ||||
|  */ | ||||
| export class CoreContentLinksHandlerBase implements CoreContentLinksHandler { | ||||
|     /** | ||||
|      * A name to identify the handler. | ||||
|      * @type {string} | ||||
|      */ | ||||
|     name = 'CoreContentLinksHandlerBase'; | ||||
| 
 | ||||
|     /** | ||||
|      * Handler's priority. The highest priority is treated first. | ||||
|      * @type {number} | ||||
|      */ | ||||
|     priority = 0; | ||||
| 
 | ||||
|     /** | ||||
|      * Whether the isEnabled function should be called for all the users in a site. It should be true only if the isEnabled call | ||||
|      * can return different values for different users in same site. | ||||
|      * @type {boolean} | ||||
|      */ | ||||
|     checkAllUsers = false; | ||||
| 
 | ||||
|     /** | ||||
|      * Name of the feature this handler is related to. | ||||
|      * It will be used to check if the feature is disabled (@see CoreSite.isFeatureDisabled). | ||||
|      * @type {string} | ||||
|      */ | ||||
|     featureName = ''; | ||||
| 
 | ||||
|     /** | ||||
|      * A pattern to use to detect if the handler handles a URL and to get its site URL. Required if "handles" and | ||||
|      * "getSiteUrl" functions aren't overridden. | ||||
|      * @type {RexExp} | ||||
|      */ | ||||
|     pattern?: RegExp; | ||||
| 
 | ||||
|     constructor() {} | ||||
| 
 | ||||
|     /** | ||||
|      * Get the list of actions for a link (url). | ||||
|      * | ||||
|      * @param {string[]} siteIds List of sites the URL belongs to. | ||||
|      * @param {string} url The URL to treat. | ||||
|      * @param {any} params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1} | ||||
|      * @param {number} [courseId] Course ID related to the URL. Optional but recommended. | ||||
|      * @return {CoreContentLinksAction[]|Promise<CoreContentLinksAction[]>} List of (or promise resolved with list of) actions. | ||||
|      */ | ||||
|     getActions(siteIds: string[], url: string, params: any, courseId?: number) : | ||||
|             CoreContentLinksAction[]|Promise<CoreContentLinksAction[]> { | ||||
|         return []; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Check if a URL is handled by this handler. | ||||
|      * | ||||
|      * @param {string} url The URL to check. | ||||
|      * @return {boolean} Whether the URL is handled by this handler | ||||
|      */ | ||||
|     handles(url: string) : boolean { | ||||
|         return this.pattern && url.search(this.pattern) >= 0; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * If the URL is handled by this handler, return the site URL. | ||||
|      * | ||||
|      * @param {string} url The URL to check. | ||||
|      * @return {string} Site URL if it is handled, undefined otherwise. | ||||
|      */ | ||||
|     getSiteUrl(url: string) : string { | ||||
|         if (this.pattern) { | ||||
|             var position = url.search(this.pattern); | ||||
|             if (position > -1) { | ||||
|                 return url.substr(0, position); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Check if the handler is enabled for a certain site (site + user) and a URL. | ||||
|      * If not defined, defaults to true. | ||||
|      * | ||||
|      * @param {string} siteId The site ID. | ||||
|      * @param {string} url The URL to treat. | ||||
|      * @param {any} params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1} | ||||
|      * @param {number} [courseId] Course ID related to the URL. Optional but recommended. | ||||
|      * @return {boolean|Promise<boolean>} Whether the handler is enabled for the URL and site. | ||||
|      */ | ||||
|     isEnabled(siteId: string, url: string, params: any, courseId?: number) : boolean|Promise<boolean> { | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										101
									
								
								src/core/contentlinks/classes/module-grade-handler.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								src/core/contentlinks/classes/module-grade-handler.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,101 @@ | ||||
| // (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 { CoreContentLinksAction } from '../providers/delegate'; | ||||
| import { CoreContentLinksHandlerBase } from './base-handler'; | ||||
| import { CoreSitesProvider } from '../../../providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '../../../providers/utils/dom'; | ||||
| import { CoreCourseHelperProvider } from '../../course/providers/helper'; | ||||
| 
 | ||||
| /** | ||||
|  * Handler to handle URLs pointing to the grade of a module. | ||||
|  */ | ||||
| export class CoreContentLinksModuleGradeHandler extends CoreContentLinksHandlerBase { | ||||
| 
 | ||||
|     /** | ||||
|      * Name of the addon as it's registered in course delegate. It'll be used to check if it's disabled. | ||||
|      * @type {string} | ||||
|      */ | ||||
|     addon: string; | ||||
| 
 | ||||
|     /** | ||||
|      * Name of the module (assign, book, ...). | ||||
|      * @type {string} | ||||
|      */ | ||||
|     modName: string; | ||||
| 
 | ||||
|     /** | ||||
|      * Whether the module can be reviewed in the app. If true, the handler needs to implement the goToReview function. | ||||
|      * @type {boolean} | ||||
|      */ | ||||
|     canReview: boolean; | ||||
| 
 | ||||
|     constructor(protected courseHelper: CoreCourseHelperProvider, protected domUtils: CoreDomUtilsProvider, | ||||
|             protected sitesProvider: CoreSitesProvider) { | ||||
|         super(); | ||||
| 
 | ||||
|         // Match the grade.php URL with an id param.
 | ||||
|         this.pattern = new RegExp('\/mod\/' + this.modName + '\/grade\.php.*([\&\?]id=\\d+)'); | ||||
|         this.featureName = '$mmCourseDelegate_' + this.addon; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get the list of actions for a link (url). | ||||
|      * | ||||
|      * @param {string[]} siteIds List of sites the URL belongs to. | ||||
|      * @param {string} url The URL to treat. | ||||
|      * @param {any} params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1} | ||||
|      * @param {number} [courseId] Course ID related to the URL. Optional but recommended. | ||||
|      * @return {CoreContentLinksAction[]|Promise<CoreContentLinksAction[]>} List of (or promise resolved with list of) actions. | ||||
|      */ | ||||
|     getActions(siteIds: string[], url: string, params: any, courseId?: number) : | ||||
|             CoreContentLinksAction[]|Promise<CoreContentLinksAction[]> { | ||||
| 
 | ||||
|         courseId = courseId || params.courseid || params.cid; | ||||
|         return [{ | ||||
|             action: (siteId) : void => { | ||||
|                 // Check if userid is the site's current user.
 | ||||
|                 const modal = this.domUtils.showModalLoading(); | ||||
|                 this.sitesProvider.getSite(siteId).then((site) => { | ||||
|                     if (!params.userid || params.userid == site.getUserId()) { | ||||
|                         // No user specified or current user. Navigate to module.
 | ||||
|                         this.courseHelper.navigateToModule(parseInt(params.id, 10), siteId, courseId); | ||||
|                     } else if (this.canReview) { | ||||
|                         // Use the goToReview function.
 | ||||
|                         this.goToReview(url, params, courseId, siteId); | ||||
|                     } else { | ||||
|                         // Not current user and cannot review it in the app, open it in browser.
 | ||||
|                         site.openInBrowserWithAutoLogin(url); | ||||
|                     } | ||||
|                 }).finally(() => { | ||||
|                     modal.dismiss(); | ||||
|                 }); | ||||
|             } | ||||
|         }]; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Go to the page to review. | ||||
|      * | ||||
|      * @param {string} url The URL to treat. | ||||
|      * @param {any} params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1} | ||||
|      * @param {number} courseId Course ID related to the URL. | ||||
|      * @param {string} siteId List of sites the URL belongs to. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     protected goToReview(url: string, params: any, courseId: number, siteId: string) : Promise<any> { | ||||
|         // This function should be overridden.
 | ||||
|         return Promise.resolve(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										63
									
								
								src/core/contentlinks/classes/module-index-handler.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								src/core/contentlinks/classes/module-index-handler.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,63 @@ | ||||
| // (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 { CoreContentLinksAction } from '../providers/delegate'; | ||||
| import { CoreContentLinksHandlerBase } from './base-handler'; | ||||
| import { CoreCourseHelperProvider } from '../../course/providers/helper'; | ||||
| 
 | ||||
| /** | ||||
|  * Handler to handle URLs pointing to the index of a module. | ||||
|  */ | ||||
| export class CoreContentLinksModuleIndexHandler extends CoreContentLinksHandlerBase { | ||||
| 
 | ||||
|     /** | ||||
|      * Name of the addon as it's registered in course delegate. It'll be used to check if it's disabled. | ||||
|      * @type {string} | ||||
|      */ | ||||
|     addon: string; | ||||
| 
 | ||||
|     /** | ||||
|      * Name of the module (assign, book, ...). | ||||
|      * @type {string} | ||||
|      */ | ||||
|     modName: string; | ||||
| 
 | ||||
|     constructor(private courseHelper: CoreCourseHelperProvider) { | ||||
|         super(); | ||||
| 
 | ||||
|         // Match the view.php URL with an id param.
 | ||||
|         this.pattern = new RegExp('\/mod\/' + this.modName + '\/view\.php.*([\&\?]id=\\d+)'); | ||||
|         this.featureName = '$mmCourseDelegate_' + this.addon; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get the list of actions for a link (url). | ||||
|      * | ||||
|      * @param {string[]} siteIds List of sites the URL belongs to. | ||||
|      * @param {string} url The URL to treat. | ||||
|      * @param {any} params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1} | ||||
|      * @param {number} [courseId] Course ID related to the URL. Optional but recommended. | ||||
|      * @return {CoreContentLinksAction[]|Promise<CoreContentLinksAction[]>} List of (or promise resolved with list of) actions. | ||||
|      */ | ||||
|     getActions(siteIds: string[], url: string, params: any, courseId?: number) : | ||||
|             CoreContentLinksAction[]|Promise<CoreContentLinksAction[]> { | ||||
| 
 | ||||
|         courseId = courseId || params.courseid || params.cid; | ||||
|         return [{ | ||||
|             action: (siteId) => { | ||||
|                 this.courseHelper.navigateToModule(parseInt(params.id, 10), siteId, courseId); | ||||
|             } | ||||
|         }]; | ||||
|     } | ||||
| } | ||||
| @ -68,7 +68,6 @@ export interface CoreContentLinksHandler { | ||||
|      */ | ||||
|     handles(url: string) : boolean; | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * If the URL is handled by this handler, return the site URL. | ||||
|      * | ||||
|  | ||||
| @ -42,6 +42,7 @@ export class CoreCourseFormatComponent implements OnInit, OnChanges, OnDestroy { | ||||
|     @Input() course: any; // The course to render.
 | ||||
|     @Input() sections: any[]; // List of course sections.
 | ||||
|     @Input() downloadEnabled?: boolean; // Whether the download of sections and modules is enabled.
 | ||||
|     @Input() initialSectionId: number; // The section to load first.
 | ||||
|     @Output() completionChanged?: EventEmitter<void>; // Will emit an event when any module completion changes.
 | ||||
| 
 | ||||
|     // Get the containers where to inject dynamic components. We use a setter because they might be inside a *ngIf.
 | ||||
| @ -142,11 +143,24 @@ export class CoreCourseFormatComponent implements OnInit, OnChanges, OnDestroy { | ||||
|     ngOnChanges(changes: {[name: string]: SimpleChange}) { | ||||
|         if (changes.sections && this.sections) { | ||||
|             if (!this.selectedSection) { | ||||
|                 // There is no selected section yet, calculate which one to get.
 | ||||
|                 this.cfDelegate.getCurrentSection(this.course, this.sections).then((section) => { | ||||
|                     this.loaded = true; | ||||
|                     this.sectionChanged(section); | ||||
|                 }); | ||||
|                 // There is no selected section yet, calculate which one to load.
 | ||||
|                 if (this.initialSectionId) { | ||||
|                     // We have an input indicating the section ID to load. Search the section.
 | ||||
|                     for (let i = 0; i < this.sections.length; i++) { | ||||
|                         let section = this.sections[i]; | ||||
|                         if (section.id == this.initialSectionId) { | ||||
|                             this.loaded = true; | ||||
|                             this.sectionChanged(section); | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                 } else { | ||||
|                     // No section specified, get current section.
 | ||||
|                     this.cfDelegate.getCurrentSection(this.course, this.sections).then((section) => { | ||||
|                         this.loaded = true; | ||||
|                         this.sectionChanged(section); | ||||
|                     }); | ||||
|                 } | ||||
|             } else { | ||||
|                 // We have a selected section, but the list has changed. Search the section in the list.
 | ||||
|                 let newSection; | ||||
| @ -214,6 +228,7 @@ export class CoreCourseFormatComponent implements OnInit, OnChanges, OnDestroy { | ||||
|             // Set the Input data.
 | ||||
|             this.componentInstances[type].course = this.course; | ||||
|             this.componentInstances[type].sections = this.sections; | ||||
|             this.componentInstances[type].initialSectionId = this.initialSectionId; | ||||
|             this.componentInstances[type].downloadEnabled = this.downloadEnabled; | ||||
| 
 | ||||
|             this.cdr.detectChanges(); // The instances are used in ngIf, tell Angular that something has changed.
 | ||||
|  | ||||
| @ -21,6 +21,6 @@ | ||||
|             <a aria-selected="true">{{ 'core.course.contents' | translate }}</a> | ||||
|             <a *ngFor="let handler of courseHandlers">{{ handler.data.title || translate }}</a> | ||||
|         </div> | ||||
|         <core-course-format [course]="course" [sections]="sections" [downloadEnabled]="downloadEnabled" (completionChanged)="onCompletionChange()"></core-course-format> | ||||
|         <core-course-format [course]="course" [sections]="sections" [initialSectionId]="sectionId" [downloadEnabled]="downloadEnabled" (completionChanged)="onCompletionChange()"></core-course-format> | ||||
|     </core-loading> | ||||
| </ion-content> | ||||
|  | ||||
| @ -13,7 +13,7 @@ | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Component, ViewChild, OnDestroy } from '@angular/core'; | ||||
| import { IonicPage, NavParams, Content } from 'ionic-angular'; | ||||
| import { IonicPage, NavParams, Content, NavController } from 'ionic-angular'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreEventsProvider } from '../../../../providers/events'; | ||||
| import { CoreSitesProvider } from '../../../../providers/sites'; | ||||
| @ -39,6 +39,7 @@ export class CoreCourseSectionPage implements OnDestroy { | ||||
|     title: string; | ||||
|     course: any; | ||||
|     sections: any[]; | ||||
|     sectionId: number; | ||||
|     courseHandlers: CoreCoursesHandlerToDisplay[]; | ||||
|     dataLoaded: boolean; | ||||
|     downloadEnabled: boolean; | ||||
| @ -47,18 +48,17 @@ export class CoreCourseSectionPage implements OnDestroy { | ||||
|         prefetchCourseIcon: 'spinner' | ||||
|     }; | ||||
| 
 | ||||
|     protected moduleId; | ||||
|     protected completionObserver; | ||||
|     protected courseStatusObserver; | ||||
|     protected isDestroyed = false; | ||||
| 
 | ||||
|     constructor(navParams: NavParams, private courseProvider: CoreCourseProvider, private domUtils: CoreDomUtilsProvider, | ||||
|     constructor(private navParams: NavParams, private courseProvider: CoreCourseProvider, private domUtils: CoreDomUtilsProvider, | ||||
|             private courseFormatDelegate: CoreCourseFormatDelegate, private coursesDelegate: CoreCoursesDelegate, | ||||
|             private translate: TranslateService, private courseHelper: CoreCourseHelperProvider, eventsProvider: CoreEventsProvider, | ||||
|             private textUtils: CoreTextUtilsProvider, private coursesProvider: CoreCoursesProvider, | ||||
|             sitesProvider: CoreSitesProvider) { | ||||
|             sitesProvider: CoreSitesProvider, private navCtrl: NavController) { | ||||
|         this.course = navParams.get('course'); | ||||
|         this.moduleId = navParams.get('moduleId'); | ||||
|         this.sectionId = navParams.get('sectionId'); | ||||
| 
 | ||||
|         // Get the title to display. We dont't have sections yet.
 | ||||
|         this.title = courseFormatDelegate.getCourseTitle(this.course); | ||||
| @ -81,9 +81,14 @@ export class CoreCourseSectionPage implements OnDestroy { | ||||
|      * View loaded. | ||||
|      */ | ||||
|     ionViewDidLoad() { | ||||
| 
 | ||||
|         let module = this.navParams.get('module'); | ||||
|         if (module) { | ||||
|             this.courseHelper.openModule(this.navCtrl, module, this.course.id, this.sectionId); | ||||
|         } | ||||
| 
 | ||||
|         this.loadData().finally(() => { | ||||
|             this.dataLoaded = true; | ||||
|             delete this.moduleId; // Only load module automatically the first time.
 | ||||
| 
 | ||||
|             // Determine the course prefetch status.
 | ||||
|             this.determineCoursePrefetchIcon().then(() => { | ||||
| @ -133,7 +138,7 @@ export class CoreCourseSectionPage implements OnDestroy { | ||||
|             promises.push(promise.then((completionStatus) => { | ||||
|                 // Get all the sections.
 | ||||
|                 promises.push(this.courseProvider.getSections(this.course.id, false, true).then((sections) => { | ||||
|                     this.courseHelper.addHandlerDataForModules(sections, this.course.id, this.moduleId, completionStatus); | ||||
|                     this.courseHelper.addHandlerDataForModules(sections, this.course.id, completionStatus); | ||||
| 
 | ||||
|                     // Format the name of each section and check if it has content.
 | ||||
|                     this.sections = sections.map((section) => { | ||||
|  | ||||
| @ -13,6 +13,7 @@ | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { NavController } from 'ionic-angular'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreFilepoolProvider } from '../../../providers/filepool'; | ||||
| import { CoreSitesProvider } from '../../../providers/sites'; | ||||
| @ -21,10 +22,13 @@ import { CoreTextUtilsProvider } from '../../../providers/utils/text'; | ||||
| import { CoreTimeUtilsProvider } from '../../../providers/utils/time'; | ||||
| import { CoreUtilsProvider } from '../../../providers/utils/utils'; | ||||
| import { CoreCoursesDelegate, CoreCoursesHandlerToDisplay } from '../../courses/providers/delegate'; | ||||
| import { CoreSiteHomeProvider } from '../../sitehome/providers/sitehome'; | ||||
| import { CoreCourseProvider } from './course'; | ||||
| import { CoreCourseModuleDelegate } from './module-delegate'; | ||||
| import { CoreCourseModulePrefetchDelegate, CoreCourseModulePrefetchHandler } from './module-prefetch-delegate'; | ||||
| import { CoreLoginHelperProvider } from '../../login/providers/helper'; | ||||
| import { CoreConstants } from '../../constants'; | ||||
| import { CoreSite } from '../../../classes/site'; | ||||
| import * as moment from 'moment'; | ||||
| 
 | ||||
| /** | ||||
| @ -109,7 +113,8 @@ export class CoreCourseHelperProvider { | ||||
|             private moduleDelegate: CoreCourseModuleDelegate, private prefetchDelegate: CoreCourseModulePrefetchDelegate, | ||||
|             private filepoolProvider: CoreFilepoolProvider, private sitesProvider: CoreSitesProvider, | ||||
|             private textUtils: CoreTextUtilsProvider, private timeUtils: CoreTimeUtilsProvider, | ||||
|             private utils: CoreUtilsProvider, private translate: TranslateService, private coursesDelegate: CoreCoursesDelegate) {} | ||||
|             private utils: CoreUtilsProvider, private translate: TranslateService, private coursesDelegate: CoreCoursesDelegate, | ||||
|             private loginHelper: CoreLoginHelperProvider, private siteHomeProvider: CoreSiteHomeProvider) {} | ||||
| 
 | ||||
|     /** | ||||
|      * This function treats every module on the sections provided to load the handler data, treat completion | ||||
| @ -117,11 +122,10 @@ export class CoreCourseHelperProvider { | ||||
|      * | ||||
|      * @param {any[]} sections List of sections to treat modules. | ||||
|      * @param {number} courseId Course ID of the modules. | ||||
|      * @param {number} [moduleId] Module to navigate to if needed. | ||||
|      * @param {any[]} [completionStatus] List of completion status. | ||||
|      * @return {boolean} Whether the sections have content. | ||||
|      */ | ||||
|     addHandlerDataForModules(sections: any[], courseId: number, moduleId?: number, completionStatus?: any) { | ||||
|     addHandlerDataForModules(sections: any[], courseId: number, completionStatus?: any) { | ||||
|         let hasContent = false; | ||||
| 
 | ||||
|         sections.forEach((section) => { | ||||
| @ -139,11 +143,6 @@ export class CoreCourseHelperProvider { | ||||
|                     module.completionstatus = completionStatus[module.id]; | ||||
|                     module.completionstatus.courseId = courseId; | ||||
|                 } | ||||
| 
 | ||||
|                 if (module.id == moduleId) { | ||||
|                     // This is the module we're looking for. Open it.
 | ||||
|                     module.handlerData.action(new Event('click'), module, courseId); | ||||
|                 } | ||||
|             }); | ||||
|         }); | ||||
| 
 | ||||
| @ -578,6 +577,86 @@ export class CoreCourseHelperProvider { | ||||
|         return 'Section-' + section.id; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Navigate to a module. | ||||
|      * | ||||
|      * @param {number} moduleId Module's ID. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @param {number} [courseId] Course ID. If not defined we'll try to retrieve it from the site. | ||||
|      * @param {number} [sectionId] Section the module belongs to. If not defined we'll try to retrieve it from the site. | ||||
|      * @return {Promise<void>} Promise resolved when done. | ||||
|      */ | ||||
|     navigateToModule(moduleId: number, siteId?: string, courseId?: number, sectionId?: number) : Promise<void> { | ||||
|         siteId = siteId || this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         let modal = this.domUtils.showModalLoading(), | ||||
|             promise, | ||||
|             site: CoreSite; | ||||
| 
 | ||||
|         if (courseId && sectionId) { | ||||
|             // No need to retrieve more data.
 | ||||
|             promise = Promise.resolve(); | ||||
|         } else if (!courseId) { | ||||
|             // We don't have courseId.
 | ||||
|             promise = this.courseProvider.getModuleBasicInfo(moduleId, siteId).then((module) => { | ||||
|                 courseId = module.course; | ||||
|                 sectionId = module.section; | ||||
|             }); | ||||
|         } else { | ||||
|             // We don't have sectionId but we have courseId.
 | ||||
|             promise = this.courseProvider.getModuleSectionId(moduleId, siteId).then((id) => { | ||||
|                 sectionId = id; | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
|         return promise.then(() => { | ||||
|             // Get the site.
 | ||||
|             return this.sitesProvider.getSite(siteId); | ||||
|         }).then((s) => { | ||||
|             site = s; | ||||
| 
 | ||||
|             // Get the module.
 | ||||
|             return this.courseProvider.getModule(moduleId, courseId, sectionId, false, false, siteId); | ||||
|         }).then((module) => { | ||||
|             const params = { | ||||
|                 course: {id: courseId}, | ||||
|                 module: module, | ||||
|                 sectionId: sectionId | ||||
|             }; | ||||
| 
 | ||||
|             module.handlerData = this.moduleDelegate.getModuleDataFor(module.modname, module, courseId, sectionId); | ||||
| 
 | ||||
|             if (courseId == site.getSiteHomeId()) { | ||||
|                 // Check if site home is available.
 | ||||
|                 return this.siteHomeProvider.isAvailable().then(() => { | ||||
|                     this.loginHelper.redirect('CoreSiteHomeIndexPage', params, siteId); | ||||
|                 }); | ||||
|             } else { | ||||
|                 this.loginHelper.redirect('CoreCourseSectionPage', params, siteId); | ||||
|             } | ||||
|         }).catch((error) => { | ||||
|             this.domUtils.showErrorModalDefault(error, 'core.course.errorgetmodule', true); | ||||
|         }).finally(() => { | ||||
|             modal.dismiss(); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Open a module. | ||||
|      * | ||||
|      * @param {NavController} navCtrl The NavController to use. | ||||
|      * @param {any} module The module to open. | ||||
|      * @param {number} courseId The course ID of the module. | ||||
|      * @param {number} [sectionId] The section ID of the module. | ||||
|      */ | ||||
|     openModule(navCtrl: NavController, module: any, courseId: number, sectionId?: number) : void { | ||||
|         if (!module.handlerData) { | ||||
|             module.handlerData = this.moduleDelegate.getModuleDataFor(module.modname, module, courseId, sectionId); | ||||
|         } | ||||
| 
 | ||||
|         module.handlerData.action(new Event('click'), navCtrl, module, courseId, {animate: false}); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Prefetch all the activities in a course and also the course addons. | ||||
|      * | ||||
|  | ||||
| @ -13,7 +13,7 @@ | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Injectable } from '@angular/core'; | ||||
| import { NavController } from 'ionic-angular'; | ||||
| import { NavController, NavOptions } from 'ionic-angular'; | ||||
| import { CoreEventsProvider } from '../../../providers/events'; | ||||
| import { CoreLoggerProvider } from '../../../providers/logger'; | ||||
| import { CoreSitesProvider } from '../../../providers/sites'; | ||||
| @ -104,8 +104,9 @@ export interface CoreCourseModuleHandlerData { | ||||
|      * @param {NavController} navCtrl NavController instance. | ||||
|      * @param {any} module The module object. | ||||
|      * @param {number} courseId The course ID. | ||||
|      * @param {NavOptions} [options] Options for the navigation. | ||||
|      */ | ||||
|     action?(event: Event, navCtrl: NavController, module: any, courseId: number) : void; | ||||
|     action?(event: Event, navCtrl: NavController, module: any, courseId: number, options?: NavOptions) : void; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
| @ -208,11 +209,11 @@ export class CoreCourseModuleDelegate { | ||||
|             icon: this.courseProvider.getModuleIconSrc(module.modname), | ||||
|             title: module.name, | ||||
|             class: 'core-course-default-handler core-course-module-' + module.modname + '-handler', | ||||
|             action: (event: Event, navCtrl: NavController, module: any, courseId: number) => { | ||||
|             action: (event: Event, navCtrl: NavController, module: any, courseId: number, options?: NavOptions) => { | ||||
|                 event.preventDefault(); | ||||
|                 event.stopPropagation(); | ||||
| 
 | ||||
|                 navCtrl.push('CoreCourseUnsupportedModulePage', {module: module}); | ||||
|                 navCtrl.push('CoreCourseUnsupportedModulePage', {module: module}, options); | ||||
|             } | ||||
|         }; | ||||
| 
 | ||||
|  | ||||
| @ -28,8 +28,6 @@ import { CoreCourseModulePrefetchDelegate } from '../../../course/providers/modu | ||||
|     templateUrl: 'index.html', | ||||
| }) | ||||
| export class CoreSiteHomeIndexComponent implements OnInit { | ||||
|     @Input() moduleId?: number; | ||||
| 
 | ||||
|     dataLoaded: boolean; | ||||
|     section: any; | ||||
|     block: any; | ||||
| @ -134,8 +132,7 @@ export class CoreSiteHomeIndexComponent implements OnInit { | ||||
|                 this.block.hasContent = this.courseHelper.sectionHasContent(this.block); | ||||
|             } | ||||
| 
 | ||||
|             this.hasContent = this.courseHelper.addHandlerDataForModules(this.sectionsLoaded, this.siteHomeId, this.moduleId) || | ||||
|                               this.hasContent; | ||||
|             this.hasContent = this.courseHelper.addHandlerDataForModules(this.sectionsLoaded, this.siteHomeId) || this.hasContent; | ||||
| 
 | ||||
|             // Add log in Moodle.
 | ||||
|             this.courseProvider.logView(this.siteHomeId); | ||||
|  | ||||
| @ -3,4 +3,4 @@ | ||||
|         <ion-title>{{ 'core.sitehome.sitehome' | translate }}</ion-title> | ||||
|     </ion-navbar> | ||||
| </ion-header> | ||||
| <core-sitehome-index [moduleId]="moduleId"></core-sitehome-index> | ||||
| <core-sitehome-index></core-sitehome-index> | ||||
|  | ||||
| @ -13,7 +13,9 @@ | ||||
| // limitations under the License.
 | ||||
| 
 | ||||
| import { Component } from '@angular/core'; | ||||
| import { IonicPage, NavParams } from 'ionic-angular'; | ||||
| import { IonicPage, NavParams, NavController } from 'ionic-angular'; | ||||
| import { CoreSitesProvider } from '../../../../providers/sites'; | ||||
| import { CoreCourseHelperProvider } from '../../../course/providers/helper'; | ||||
| 
 | ||||
| /** | ||||
|  * Page that displays site home index. | ||||
| @ -25,9 +27,11 @@ import { IonicPage, NavParams } from 'ionic-angular'; | ||||
| }) | ||||
| export class CoreSiteHomeIndexPage { | ||||
| 
 | ||||
|     moduleId: number; | ||||
| 
 | ||||
|     constructor(navParams: NavParams) { | ||||
|         this.moduleId = navParams.get('moduleId'); | ||||
|     constructor(navParams: NavParams, navCtrl: NavController, courseHelper: CoreCourseHelperProvider, | ||||
|             sitesProvider: CoreSitesProvider) { | ||||
|         let module = navParams.get('module'); | ||||
|         if (module) { | ||||
|             courseHelper.openModule(navCtrl, module, sitesProvider.getCurrentSite().getSiteHomeId()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user