diff --git a/src/core/contentlinks/classes/base-handler.ts b/src/core/contentlinks/classes/base-handler.ts new file mode 100644 index 000000000..15b7c156a --- /dev/null +++ b/src/core/contentlinks/classes/base-handler.ts @@ -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} List of (or promise resolved with list of) actions. + */ + getActions(siteIds: string[], url: string, params: any, courseId?: number) : + CoreContentLinksAction[]|Promise { + 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} Whether the handler is enabled for the URL and site. + */ + isEnabled(siteId: string, url: string, params: any, courseId?: number) : boolean|Promise { + return true; + } +} diff --git a/src/core/contentlinks/classes/module-grade-handler.ts b/src/core/contentlinks/classes/module-grade-handler.ts new file mode 100644 index 000000000..15866a9a5 --- /dev/null +++ b/src/core/contentlinks/classes/module-grade-handler.ts @@ -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} List of (or promise resolved with list of) actions. + */ + getActions(siteIds: string[], url: string, params: any, courseId?: number) : + CoreContentLinksAction[]|Promise { + + 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} Promise resolved when done. + */ + protected goToReview(url: string, params: any, courseId: number, siteId: string) : Promise { + // This function should be overridden. + return Promise.resolve(); + } +} diff --git a/src/core/contentlinks/classes/module-index-handler.ts b/src/core/contentlinks/classes/module-index-handler.ts new file mode 100644 index 000000000..1d7a5819f --- /dev/null +++ b/src/core/contentlinks/classes/module-index-handler.ts @@ -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} List of (or promise resolved with list of) actions. + */ + getActions(siteIds: string[], url: string, params: any, courseId?: number) : + CoreContentLinksAction[]|Promise { + + courseId = courseId || params.courseid || params.cid; + return [{ + action: (siteId) => { + this.courseHelper.navigateToModule(parseInt(params.id, 10), siteId, courseId); + } + }]; + } +} diff --git a/src/core/contentlinks/providers/delegate.ts b/src/core/contentlinks/providers/delegate.ts index d355f96ee..b9fbced5d 100644 --- a/src/core/contentlinks/providers/delegate.ts +++ b/src/core/contentlinks/providers/delegate.ts @@ -68,7 +68,6 @@ export interface CoreContentLinksHandler { */ handles(url: string) : boolean; - /** * If the URL is handled by this handler, return the site URL. * diff --git a/src/core/course/components/format/format.ts b/src/core/course/components/format/format.ts index f6ff16cdb..fd7fd2d30 100644 --- a/src/core/course/components/format/format.ts +++ b/src/core/course/components/format/format.ts @@ -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; // 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. diff --git a/src/core/course/pages/section/section.html b/src/core/course/pages/section/section.html index 6d64c169e..f81e941c9 100644 --- a/src/core/course/pages/section/section.html +++ b/src/core/course/pages/section/section.html @@ -21,6 +21,6 @@ {{ 'core.course.contents' | translate }} {{ handler.data.title || translate }} - + diff --git a/src/core/course/pages/section/section.ts b/src/core/course/pages/section/section.ts index 91ad41c80..94b107cfa 100644 --- a/src/core/course/pages/section/section.ts +++ b/src/core/course/pages/section/section.ts @@ -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) => { diff --git a/src/core/course/providers/helper.ts b/src/core/course/providers/helper.ts index 1ba282c95..226ca0d19 100644 --- a/src/core/course/providers/helper.ts +++ b/src/core/course/providers/helper.ts @@ -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} Promise resolved when done. + */ + navigateToModule(moduleId: number, siteId?: string, courseId?: number, sectionId?: number) : Promise { + 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. * diff --git a/src/core/course/providers/module-delegate.ts b/src/core/course/providers/module-delegate.ts index 6dd1a7700..de195f394 100644 --- a/src/core/course/providers/module-delegate.ts +++ b/src/core/course/providers/module-delegate.ts @@ -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); } }; diff --git a/src/core/sitehome/components/index/index.ts b/src/core/sitehome/components/index/index.ts index 2f677e15c..88d052376 100644 --- a/src/core/sitehome/components/index/index.ts +++ b/src/core/sitehome/components/index/index.ts @@ -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); diff --git a/src/core/sitehome/pages/index/index.html b/src/core/sitehome/pages/index/index.html index e5d6b3299..0c0c35973 100644 --- a/src/core/sitehome/pages/index/index.html +++ b/src/core/sitehome/pages/index/index.html @@ -3,4 +3,4 @@ {{ 'core.sitehome.sitehome' | translate }} - + diff --git a/src/core/sitehome/pages/index/index.ts b/src/core/sitehome/pages/index/index.ts index 58ad7dcdd..1208b8a77 100644 --- a/src/core/sitehome/pages/index/index.ts +++ b/src/core/sitehome/pages/index/index.ts @@ -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()); + } } }