diff --git a/src/addon/badges/providers/push-click-handler.ts b/src/addon/badges/providers/push-click-handler.ts index 555a99240..1aabf4f28 100644 --- a/src/addon/badges/providers/push-click-handler.ts +++ b/src/addon/badges/providers/push-click-handler.ts @@ -37,9 +37,10 @@ export class AddonBadgesPushClickHandler implements CorePushNotificationsClickHa * @return {boolean} Whether the notification click is handled by this handler */ handles(notification: any): boolean | Promise { - // @todo: Support 'badgecreatornotice' once we receive the hash or contexturl. + const data = notification.customdata || {}; + if (this.utils.isTrueOrOne(notification.notif) && notification.moodlecomponent == 'moodle' && - notification.name == 'badgerecipientnotice') { + (notification.name == 'badgerecipientnotice' || (notification.name == 'badgecreatornotice' && data.hash))) { return this.badgesProvider.isPluginEnabled(notification.site); } @@ -53,8 +54,14 @@ export class AddonBadgesPushClickHandler implements CorePushNotificationsClickHa * @return {Promise} Promise resolved when done. */ handleClick(notification: any): Promise { - // @todo: Go to the badge page once we receive the hash or contexturl. + const data = notification.customdata || {}; + if (data.hash) { + // We have the hash, open the badge directly. + return this.loginHelper.redirect('AddonBadgesIssuedBadgePage', {courseId: 0, badgeHash: data.hash}, notification.site); + } + + // No hash, open the list of user badges. return this.badgesProvider.invalidateUserBadges(0, Number(notification.usertoid), notification.site).catch(() => { // Ignore errors. }).then(() => { diff --git a/src/addon/blog/providers/index-link-handler.ts b/src/addon/blog/providers/index-link-handler.ts index 176aec76e..189fad7a3 100644 --- a/src/addon/blog/providers/index-link-handler.ts +++ b/src/addon/blog/providers/index-link-handler.ts @@ -24,7 +24,7 @@ import { AddonBlogProvider } from './blog'; @Injectable() export class AddonBlogIndexLinkHandler extends CoreContentLinksHandlerBase { name = 'AddonBlogIndexLinkHandler'; - featureName = 'CoreUserDelegate_AddonBlog'; + featureName = 'CoreUserDelegate_AddonBlog:blogs'; pattern = /\/blog\/index\.php/; constructor(private blogProvider: AddonBlogProvider, private loginHelper: CoreLoginHelperProvider) { diff --git a/src/addon/mod/forum/providers/discussion-link-handler.ts b/src/addon/mod/forum/providers/discussion-link-handler.ts index f4962baf0..d1c5399be 100644 --- a/src/addon/mod/forum/providers/discussion-link-handler.ts +++ b/src/addon/mod/forum/providers/discussion-link-handler.ts @@ -38,16 +38,26 @@ export class AddonModForumDiscussionLinkHandler extends CoreContentLinksHandlerB * @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. + * @param {any} [data] Extra data to handle the URL. * @return {CoreContentLinksAction[]|Promise} List of (or promise resolved with list of) actions. */ - getActions(siteIds: string[], url: string, params: any, courseId?: number): + getActions(siteIds: string[], url: string, params: any, courseId?: number, data?: any): CoreContentLinksAction[] | Promise { + data = data || {}; + return [{ action: (siteId, navCtrl?): void => { - const pageParams = { + const pageParams: any = { courseId: courseId || parseInt(params.courseid, 10) || parseInt(params.cid, 10), discussionId: parseInt(params.d, 10), + cmId: data.cmid && parseInt(data.cmid, 10), + forumId: data.instance && parseInt(data.instance, 10) }; + + if (data.postid || params.urlHash) { + pageParams.postId = parseInt(data.postid || params.urlHash.replace('p', '')); + } + this.linkHelper.goInSite(navCtrl, 'AddonModForumDiscussionPage', pageParams, siteId); } }]; diff --git a/src/addon/mod/forum/providers/push-click-handler.ts b/src/addon/mod/forum/providers/push-click-handler.ts index 4a224a843..01cff72f8 100644 --- a/src/addon/mod/forum/providers/push-click-handler.ts +++ b/src/addon/mod/forum/providers/push-click-handler.ts @@ -50,13 +50,16 @@ export class AddonModForumPushClickHandler implements CorePushNotificationsClick */ handleClick(notification: any): Promise { const contextUrlParams = this.urlUtils.extractUrlParams(notification.contexturl), + data = notification.customdata || {}, pageParams: any = { courseId: Number(notification.courseid), - discussionId: Number(contextUrlParams.d), + discussionId: Number(contextUrlParams.d || data.discussionid), + cmId: Number(data.cmid), + forumId: Number(data.instance) }; - if (contextUrlParams.urlHash) { - pageParams.postId = Number(contextUrlParams.urlHash.replace('p', '')); + if (data.postid || contextUrlParams.urlHash) { + pageParams.postId = Number(data.postid || contextUrlParams.urlHash.replace('p', '')); } return this.forumProvider.invalidateDiscussionPosts(pageParams.discussionId, notification.site).catch(() => { diff --git a/src/addon/mod/lesson/providers/push-click-handler.ts b/src/addon/mod/lesson/providers/push-click-handler.ts index 841298c52..649436683 100644 --- a/src/addon/mod/lesson/providers/push-click-handler.ts +++ b/src/addon/mod/lesson/providers/push-click-handler.ts @@ -14,12 +14,9 @@ import { Injectable } from '@angular/core'; import { CoreUtilsProvider } from '@providers/utils/utils'; -import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { CorePushNotificationsClickHandler } from '@core/pushnotifications/providers/delegate'; -import { CoreLoginHelperProvider } from '@core/login/providers/helper'; -import { CoreCourseHelperProvider } from '@core/course/providers/helper'; import { CoreGradesProvider } from '@core/grades/providers/grades'; -import { AddonModLessonProvider } from './lesson'; +import { CoreGradesHelperProvider } from '@core/grades/providers/helper'; /** * Handler for lesson push notifications clicks. @@ -30,9 +27,8 @@ export class AddonModLessonPushClickHandler implements CorePushNotificationsClic priority = 200; featureName = 'CoreCourseModuleDelegate_AddonModLesson'; - constructor(private utils: CoreUtilsProvider, private lessonProvider: AddonModLessonProvider, - private loginHelper: CoreLoginHelperProvider, private domUtils: CoreDomUtilsProvider, - private courseHelper: CoreCourseHelperProvider, private gradesProvider: CoreGradesProvider) {} + constructor(private utils: CoreUtilsProvider, private gradesHelper: CoreGradesHelperProvider, + private gradesProvider: CoreGradesProvider) {} /** * Check if a notification click is handled by this handler. @@ -44,7 +40,7 @@ export class AddonModLessonPushClickHandler implements CorePushNotificationsClic if (this.utils.isTrueOrOne(notification.notif) && notification.moodlecomponent == 'mod_lesson' && notification.name == 'graded_essay') { - return this.lessonProvider.isPluginEnabled(notification.site); + return this.gradesProvider.isPluginEnabledForCourse(Number(notification.courseid), notification.site); } return false; @@ -59,59 +55,8 @@ export class AddonModLessonPushClickHandler implements CorePushNotificationsClic handleClick(notification: any): Promise { const data = notification.customdata || {}, courseId = Number(notification.courseid), - moduleId = Number(data.cmid), - modal = this.domUtils.showModalLoading(); - let promise; + moduleId = Number(data.cmid); - if (moduleId) { - // Try to open the module grade directly. Check if it's possible. - promise = this.gradesProvider.isGradeItemsAvalaible(notification.site).catch(() => { - return false; - }); - } else { - promise = Promise.resolve(false); - } - - return promise.then((getGrades) => { - - if (getGrades) { - return this.gradesProvider.getGradeItems(courseId, undefined, undefined, notification.site).then((items) => { - // Find the item of th module. - const item = items.find((item) => { - return moduleId == item.cmid; - }); - - if (item) { - // Open the item directly. - const pageParams: any = { - courseId: courseId, - gradeId: item.id - }; - - this.loginHelper.redirect('CoreGradesGradePage', pageParams, notification.site); - } - - return Promise.reject(null); - }); - } else { - return Promise.reject(null); - } - - }).catch(() => { - // Cannot get grade items or there's no need to. Open the course with the grades tab selected. - return this.courseHelper.getCourse(courseId, notification.site).then((result) => { - const pageParams: any = { - course: result.course, - selectedTab: 'CoreGrades' - }; - - this.loginHelper.redirect('CoreCourseSectionPage', pageParams, notification.site); - }); - }).catch(() => { - // Cannot get course for some reason, just open the grades page. - return this.loginHelper.redirect('CoreGradesCoursePage', {course: {id: courseId}}, notification.site); - }).finally(() => { - modal.dismiss(); - }); + return this.gradesHelper.goToGrades(courseId, undefined, moduleId, undefined, notification.site); } } diff --git a/src/addon/mod/quiz/providers/push-click-handler.ts b/src/addon/mod/quiz/providers/push-click-handler.ts index 2373bd622..43397a59b 100644 --- a/src/addon/mod/quiz/providers/push-click-handler.ts +++ b/src/addon/mod/quiz/providers/push-click-handler.ts @@ -54,12 +54,13 @@ export class AddonModQuizPushClickHandler implements CorePushNotificationsClickH */ handleClick(notification: any): Promise { const contextUrlParams = this.urlUtils.extractUrlParams(notification.contexturl), + data = notification.customdata || {}, courseId = Number(notification.courseid); if (notification.name == 'submission') { // A student made a submission, go to view the attempt. return this.quizHelper.handleReviewLink(undefined, Number(contextUrlParams.attempt), Number(contextUrlParams.page), - courseId, undefined, notification.site); + courseId, Number(data.instance), notification.site); } else { // Open the activity. const moduleId = Number(contextUrlParams.id); diff --git a/src/addon/mod/quiz/providers/review-link-handler.ts b/src/addon/mod/quiz/providers/review-link-handler.ts index b5d36dfc3..516499fd0 100644 --- a/src/addon/mod/quiz/providers/review-link-handler.ts +++ b/src/addon/mod/quiz/providers/review-link-handler.ts @@ -38,19 +38,22 @@ export class AddonModQuizReviewLinkHandler extends CoreContentLinksHandlerBase { * @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. + * @param {any} [data] Extra data to handle the URL. * @return {CoreContentLinksAction[]|Promise} List of (or promise resolved with list of) actions. */ - getActions(siteIds: string[], url: string, params: any, courseId?: number): + getActions(siteIds: string[], url: string, params: any, courseId?: number, data?: any): CoreContentLinksAction[] | Promise { courseId = courseId || params.courseid || params.cid; + data = data || {}; return [{ action: (siteId, navCtrl?): void => { const attemptId = parseInt(params.attempt, 10), - page = parseInt(params.page, 10); + page = parseInt(params.page, 10), + quizId = data.instance && parseInt(data.instance, 10); - this.quizHelper.handleReviewLink(navCtrl, attemptId, page, courseId, undefined, siteId); + this.quizHelper.handleReviewLink(navCtrl, attemptId, page, courseId, quizId, siteId); } }]; } diff --git a/src/addon/notifications/components/actions/actions.ts b/src/addon/notifications/components/actions/actions.ts index 459ebdb8c..7835d3829 100644 --- a/src/addon/notifications/components/actions/actions.ts +++ b/src/addon/notifications/components/actions/actions.ts @@ -13,7 +13,9 @@ // limitations under the License. import { Component, Input, OnInit } from '@angular/core'; +import { NavController } from 'ionic-angular'; import { CoreContentLinksDelegate, CoreContentLinksAction } from '@core/contentlinks/providers/delegate'; +import { CoreSitesProvider } from '@providers/sites'; /** * Component that displays the actions for a notification. @@ -25,17 +27,42 @@ import { CoreContentLinksDelegate, CoreContentLinksAction } from '@core/contentl export class AddonNotificationsActionsComponent implements OnInit { @Input() contextUrl: string; @Input() courseId: number; + @Input() data?: any; // Extra data to handle the URL. actions: CoreContentLinksAction[] = []; - constructor(private contentLinksDelegate: CoreContentLinksDelegate) {} + constructor(private contentLinksDelegate: CoreContentLinksDelegate, private sitesProvider: CoreSitesProvider) {} /** * Component being initialized. */ ngOnInit(): void { - this.contentLinksDelegate.getActionsFor(this.contextUrl, this.courseId).then((actions) => { + if (!this.contextUrl) { + // No contexturl, nothing to do. + return; + } + + this.contentLinksDelegate.getActionsFor(this.contextUrl, this.courseId, undefined, this.data).then((actions) => { + if (!actions.length) { + // URL is not supported. Add an action to open it in browser. + actions.push({ + message: 'core.view', + icon: 'eye', + action: this.defaultAction.bind(this) + }); + } + this.actions = actions; }); } + + /** + * Default action. Open in browser. + * + * @param {string} siteId Site ID to use. + * @param {NavController} [navCtrl] NavController. + */ + protected defaultAction(siteId: string, navCtrl?: NavController): void { + this.sitesProvider.getCurrentSite().openInBrowserWithAutoLogin(this.contextUrl); + } } diff --git a/src/addon/notifications/pages/list/list.html b/src/addon/notifications/pages/list/list.html index 19b3805cd..b931c6768 100644 --- a/src/addon/notifications/pages/list/list.html +++ b/src/addon/notifications/pages/list/list.html @@ -27,7 +27,7 @@

- + diff --git a/src/addon/notifications/providers/notifications.ts b/src/addon/notifications/providers/notifications.ts index d268cff1a..64a19c10f 100644 --- a/src/addon/notifications/providers/notifications.ts +++ b/src/addon/notifications/providers/notifications.ts @@ -16,6 +16,7 @@ import { Injectable } from '@angular/core'; import { CoreAppProvider } from '@providers/app'; import { CoreLoggerProvider } from '@providers/logger'; import { CoreSitesProvider } from '@providers/sites'; +import { CoreTextUtilsProvider } from '@providers/utils/text'; import { CoreTimeUtilsProvider } from '@providers/utils/time'; import { CoreUserProvider } from '@core/user/providers/user'; import { CoreEmulatorHelperProvider } from '@core/emulator/providers/helper'; @@ -37,7 +38,8 @@ export class AddonNotificationsProvider { constructor(logger: CoreLoggerProvider, private appProvider: CoreAppProvider, private sitesProvider: CoreSitesProvider, private timeUtils: CoreTimeUtilsProvider, private userProvider: CoreUserProvider, - private emulatorHelper: CoreEmulatorHelperProvider, private messageProvider: AddonMessagesProvider) { + private emulatorHelper: CoreEmulatorHelperProvider, private messageProvider: AddonMessagesProvider, + private textUtils: CoreTextUtilsProvider) { this.logger = logger.getInstance('AddonNotificationsProvider'); } @@ -57,11 +59,27 @@ export class AddonNotificationsProvider { notification.mobiletext = notification.fullmessage; } - // Try to set courseid the notification belongs to. - const cid = notification.fullmessagehtml.match(/course\/view\.php\?id=([^"]*)/); - if (cid && cid[1]) { - notification.courseid = cid[1]; + notification.moodlecomponent = notification.component; + notification.notification = 1; + notification.notif = 1; + if (typeof read != 'undefined') { + notification.read = read; } + + if (typeof notification.customdata == 'string') { + notification.customdata = this.textUtils.parseJSON(notification.customdata, {}); + } + + // Try to set courseid the notification belongs to. + if (notification.customdata && notification.customdata.courseid) { + notification.courseid = notification.customdata.courseid; + } else { + const cid = notification.fullmessagehtml.match(/course\/view\.php\?id=([^"]*)/); + if (cid && cid[1]) { + notification.courseid = cid[1]; + } + } + if (notification.useridfrom > 0) { // Try to get the profile picture of the user. return this.userProvider.getProfile(notification.useridfrom, notification.courseid, true).then((user) => { @@ -73,13 +91,6 @@ export class AddonNotificationsProvider { }); } - notification.moodlecomponent = notification.component; - notification.notification = 1; - notification.notif = 1; - if (typeof read != 'undefined') { - notification.read = read; - } - return Promise.resolve(notification); }); diff --git a/src/core/contentlinks/providers/delegate.ts b/src/core/contentlinks/providers/delegate.ts index 21b1da364..b753ac02e 100644 --- a/src/core/contentlinks/providers/delegate.ts +++ b/src/core/contentlinks/providers/delegate.ts @@ -56,9 +56,10 @@ export interface CoreContentLinksHandler { * @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. + * @param {any} [data] Extra data to handle the URL. * @return {CoreContentLinksAction[]|Promise} List of (or promise resolved with list of) actions. */ - getActions(siteIds: string[], url: string, params: any, courseId?: number): + getActions(siteIds: string[], url: string, params: any, courseId?: number, data?: any): CoreContentLinksAction[] | Promise; /** @@ -157,9 +158,10 @@ export class CoreContentLinksDelegate { * @param {string} url URL to handle. * @param {number} [courseId] Course ID related to the URL. Optional but recommended. * @param {string} [username] Username to use to filter sites. + * @param {any} [data] Extra data to handle the URL. * @return {Promise} Promise resolved with the actions. */ - getActionsFor(url: string, courseId?: number, username?: string): Promise { + getActionsFor(url: string, courseId?: number, username?: string, data?: any): Promise { if (!url) { return Promise.resolve([]); } @@ -187,7 +189,7 @@ export class CoreContentLinksDelegate { return; } - return Promise.resolve(handler.getActions(siteIds, url, params, courseId)).then((actions) => { + return Promise.resolve(handler.getActions(siteIds, url, params, courseId, data)).then((actions) => { if (actions && actions.length) { // Set default values if any value isn't supplied. actions.forEach((action) => { diff --git a/src/core/contentlinks/providers/helper.ts b/src/core/contentlinks/providers/helper.ts index e36e5a20b..6b0dfa3ab 100644 --- a/src/core/contentlinks/providers/helper.ts +++ b/src/core/contentlinks/providers/helper.ts @@ -23,6 +23,7 @@ import { CoreSitesProvider } from '@providers/sites'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { CoreTextUtilsProvider } from '@providers/utils/text'; import { CoreUrlUtilsProvider } from '@providers/utils/url'; +import { CoreUtilsProvider } from '@providers/utils/utils'; import { CoreLoginHelperProvider } from '@core/login/providers/helper'; import { CoreContentLinksDelegate, CoreContentLinksAction } from './delegate'; import { CoreConstants } from '@core/constants'; @@ -40,7 +41,7 @@ export class CoreContentLinksHelperProvider { private contentLinksDelegate: CoreContentLinksDelegate, private appProvider: CoreAppProvider, private domUtils: CoreDomUtilsProvider, private urlUtils: CoreUrlUtilsProvider, private translate: TranslateService, private initDelegate: CoreInitDelegate, eventsProvider: CoreEventsProvider, private textUtils: CoreTextUtilsProvider, - private sitePluginsProvider: CoreSitePluginsProvider, private zone: NgZone) { + private sitePluginsProvider: CoreSitePluginsProvider, private zone: NgZone, private utils: CoreUtilsProvider) { this.logger = logger.getInstance('CoreContentLinksHelperProvider'); // Listen for app launched URLs. If we receive one, check if it's a content link. @@ -88,18 +89,23 @@ export class CoreContentLinksHelperProvider { * @param {string} pageName Name of the page to go. * @param {any} [pageParams] Params to send to the page. * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when done. */ - goInSite(navCtrl: NavController, pageName: string, pageParams: any, siteId?: string): void { + goInSite(navCtrl: NavController, pageName: string, pageParams: any, siteId?: string): Promise { siteId = siteId || this.sitesProvider.getCurrentSiteId(); + const deferred = this.utils.promiseDefer(); + // Execute the code in the Angular zone, so change detection doesn't stop working. this.zone.run(() => { if (navCtrl && siteId == this.sitesProvider.getCurrentSiteId()) { - navCtrl.push(pageName, pageParams); + navCtrl.push(pageName, pageParams).then(deferred.resolve, deferred.reject); } else { - this.loginHelper.redirect(pageName, pageParams, siteId); + this.loginHelper.redirect(pageName, pageParams, siteId).then(deferred.resolve, deferred.reject); } }); + + return deferred.promise; } /** diff --git a/src/core/grades/providers/helper.ts b/src/core/grades/providers/helper.ts index 8f206340d..6403ddc36 100644 --- a/src/core/grades/providers/helper.ts +++ b/src/core/grades/providers/helper.ts @@ -13,6 +13,7 @@ // limitations under the License. import { Injectable } from '@angular/core'; +import { NavController } from 'ionic-angular'; import { CoreLoggerProvider } from '@providers/logger'; import { CoreSitesProvider } from '@providers/sites'; import { CoreCoursesProvider } from '@core/courses/providers/courses'; @@ -22,6 +23,9 @@ import { CoreTextUtilsProvider } from '@providers/utils/text'; import { CoreUrlUtilsProvider } from '@providers/utils/url'; import { CoreUtilsProvider } from '@providers/utils/utils'; import { CoreDomUtilsProvider } from '@providers/utils/dom'; +import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper'; +import { CoreLoginHelperProvider } from '@core/login/providers/helper'; +import { CoreCourseHelperProvider } from '@core/course/providers/helper'; /** * Service that provides some features regarding grades information. @@ -33,7 +37,9 @@ export class CoreGradesHelperProvider { constructor(logger: CoreLoggerProvider, private coursesProvider: CoreCoursesProvider, private gradesProvider: CoreGradesProvider, private sitesProvider: CoreSitesProvider, private textUtils: CoreTextUtilsProvider, private courseProvider: CoreCourseProvider, - private domUtils: CoreDomUtilsProvider, private urlUtils: CoreUrlUtilsProvider, private utils: CoreUtilsProvider) { + private domUtils: CoreDomUtilsProvider, private urlUtils: CoreUrlUtilsProvider, private utils: CoreUtilsProvider, + private linkHelper: CoreContentLinksHelperProvider, private loginHelper: CoreLoginHelperProvider, + private courseHelper: CoreCourseHelperProvider) { this.logger = logger.getInstance('CoreGradesHelperProvider'); } @@ -381,6 +387,95 @@ export class CoreGradesHelperProvider { return []; } + /** + * Go to view grades. + * + * @param {number} courseId Course ID t oview. + * @param {number} [userId] User to view. If not defined, current user. + * @param {number} [moduleId] Module to view. If not defined, view all course grades. + * @param {NavController} [navCtrl] NavController to use. + * @param {string} [siteId] Site ID. If not defined, current site. + * @return {Promise} Promise resolved when done. + */ + goToGrades(courseId: number, userId?: number, moduleId?: number, navCtrl?: NavController, siteId?: string): Promise { + + const modal = this.domUtils.showModalLoading(); + let currentUserId; + + return this.sitesProvider.getSite(siteId).then((site) => { + siteId = site.id; + currentUserId = site.getUserId(); + + if (moduleId) { + // Try to open the module grade directly. Check if it's possible. + return this.gradesProvider.isGradeItemsAvalaible(siteId).then((getGrades) => { + if (!getGrades) { + return Promise.reject(null); + } + }); + } else { + return Promise.reject(null); + } + + }).then(() => { + + // Can get grades. Do it. + return this.gradesProvider.getGradeItems(courseId, userId, undefined, siteId).then((items) => { + // Find the item of the module. + const item = items.find((item) => { + return moduleId == item.cmid; + }); + + if (item) { + // Open the item directly. + const pageParams: any = { + courseId: courseId, + userId: userId, + gradeId: item.id + }; + + return this.linkHelper.goInSite(navCtrl, 'CoreGradesGradePage', pageParams, siteId).catch(() => { + // Ignore errors. + }); + } + + return Promise.reject(null); + }); + + }).catch(() => { + + // Cannot get grade items or there's no need to. + if (userId && userId != currentUserId) { + // View another user grades. Open the grades page directly. + const pageParams = { + course: {id: courseId}, + userId: userId + }; + + return this.linkHelper.goInSite(navCtrl, 'CoreGradesCoursePage', pageParams, siteId).catch(() => { + // Ignore errors. + }); + } + + // View own grades. Open the course with the grades tab selected. + return this.courseHelper.getCourse(courseId, siteId).then((result) => { + const pageParams: any = { + course: result.course, + selectedTab: 'CoreGrades' + }; + + return this.loginHelper.redirect('CoreCourseSectionPage', pageParams, siteId).catch(() => { + // Ignore errors. + }); + }); + }).catch(() => { + // Cannot get course for some reason, just open the grades page. + return this.linkHelper.goInSite(navCtrl, 'CoreGradesCoursePage', {course: {id: courseId}}, siteId); + }).finally(() => { + modal.dismiss(); + }); + } + /** * Invalidate the grade items for a certain module. * diff --git a/src/core/grades/providers/user-link-handler.ts b/src/core/grades/providers/user-link-handler.ts index 62ff332d6..738c1c0db 100644 --- a/src/core/grades/providers/user-link-handler.ts +++ b/src/core/grades/providers/user-link-handler.ts @@ -15,11 +15,8 @@ import { Injectable } from '@angular/core'; import { CoreContentLinksHandlerBase } from '@core/contentlinks/classes/base-handler'; import { CoreContentLinksAction } from '@core/contentlinks/providers/delegate'; -import { CoreCourseHelperProvider } from '@core/course/providers/helper'; -import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper'; -import { CoreLoginHelperProvider } from '@core/login/providers/helper'; -import { CoreDomUtilsProvider } from '@providers/utils/dom'; import { CoreGradesProvider } from './grades'; +import { CoreGradesHelperProvider } from './helper'; /** * Handler to treat links to user grades. @@ -29,9 +26,7 @@ export class CoreGradesUserLinkHandler extends CoreContentLinksHandlerBase { name = 'CoreGradesUserLinkHandler'; pattern = /\/grade\/report\/user\/index.php/; - constructor(private linkHelper: CoreContentLinksHelperProvider, private gradesProvider: CoreGradesProvider, - private domUtils: CoreDomUtilsProvider, private courseHelper: CoreCourseHelperProvider, - private loginHelper: CoreLoginHelperProvider) { + constructor(private gradesProvider: CoreGradesProvider, private gradesHelper: CoreGradesHelperProvider) { super(); } @@ -42,43 +37,20 @@ export class CoreGradesUserLinkHandler extends CoreContentLinksHandlerBase { * @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. + * @param {any} [data] Extra data to handle the URL. * @return {CoreContentLinksAction[]|Promise} List of (or promise resolved with list of) actions. */ - getActions(siteIds: string[], url: string, params: any, courseId?: number): + getActions(siteIds: string[], url: string, params: any, courseId?: number, data?: any): CoreContentLinksAction[] | Promise { courseId = courseId || params.id; + data = data || {}; return [{ action: (siteId, navCtrl?): void => { - const userId = params.userid ? parseInt(params.userid, 10) : false; + const userId = params.userid && parseInt(params.userid, 10), + moduleId = data.cmid && parseInt(data.cmid, 10); - if (userId) { - // Open the grades page directly. - const pageParams = { - course: {id: courseId}, - userId: userId, - }; - - this.linkHelper.goInSite(navCtrl, 'CoreGradesCoursePage', pageParams, siteId); - } else { - // No userid, open the course with the grades tab selected. - const modal = this.domUtils.showModalLoading(); - - this.courseHelper.getCourse(courseId, siteId).then((result) => { - const pageParams: any = { - course: result.course, - selectedTab: 'CoreGrades' - }; - - // Use redirect to prevent loops in the navigation. - return this.loginHelper.redirect('CoreCourseSectionPage', pageParams, siteId); - }).catch(() => { - // Cannot get course for some reason, just open the grades page. - return this.linkHelper.goInSite(navCtrl, 'CoreGradesCoursePage', {course: {id: courseId}}, siteId); - }).finally(() => { - modal.dismiss(); - }); - } + this.gradesHelper.goToGrades(courseId, userId, moduleId, navCtrl, siteId); } }]; }