From ebc0344c60706f937420968d9d56a26e4db5059a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 25 Nov 2022 23:06:44 +0100 Subject: [PATCH] MOBILE-4081 completion: Add link handler to block completion status --- .../coursecompletion.module.ts | 3 + .../coursecompletion/pages/report/report.html | 7 ++ .../coursecompletion/pages/report/report.ts | 4 + .../services/coursecompletion.ts | 2 +- .../handlers/completionstatus-link.ts | 80 +++++++++++++++++++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 src/addons/coursecompletion/services/handlers/completionstatus-link.ts diff --git a/src/addons/coursecompletion/coursecompletion.module.ts b/src/addons/coursecompletion/coursecompletion.module.ts index 63fea73a7..d58a4fdc5 100644 --- a/src/addons/coursecompletion/coursecompletion.module.ts +++ b/src/addons/coursecompletion/coursecompletion.module.ts @@ -14,11 +14,13 @@ import { APP_INITIALIZER, NgModule, Type } from '@angular/core'; import { Routes } from '@angular/router'; +import { CoreContentLinksDelegate } from '@features/contentlinks/services/contentlinks-delegate'; import { CoreCourseIndexRoutingModule } from '@features/course/pages/index/index-routing.module'; import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; import { CoreMainMenuTabRoutingModule } from '@features/mainmenu/mainmenu-tab-routing.module'; import { CoreUserDelegate } from '@features/user/services/user-delegate'; import { AddonCourseCompletionProvider } from './services/coursecompletion'; +import { AddonCourseCompletionStatusLinkHandler } from './services/handlers/completionstatus-link'; import { AddonCourseCompletionCourseOptionHandler } from './services/handlers/course-option'; import { AddonCourseCompletionUserHandler } from './services/handlers/user'; @@ -45,6 +47,7 @@ const routes: Routes = [ useValue: () => { CoreUserDelegate.registerHandler(AddonCourseCompletionUserHandler.instance); CoreCourseOptionsDelegate.registerHandler(AddonCourseCompletionCourseOptionHandler.instance); + CoreContentLinksDelegate.registerHandler(AddonCourseCompletionStatusLinkHandler.instance); }, }, ], diff --git a/src/addons/coursecompletion/pages/report/report.html b/src/addons/coursecompletion/pages/report/report.html index 4c29301db..e9c516500 100644 --- a/src/addons/coursecompletion/pages/report/report.html +++ b/src/addons/coursecompletion/pages/report/report.html @@ -13,6 +13,13 @@ + + + +

{{user!.fullname}}

+
+
+ diff --git a/src/addons/coursecompletion/pages/report/report.ts b/src/addons/coursecompletion/pages/report/report.ts index dabbf0c54..1087e4095 100644 --- a/src/addons/coursecompletion/pages/report/report.ts +++ b/src/addons/coursecompletion/pages/report/report.ts @@ -17,6 +17,7 @@ import { AddonCourseCompletionCourseCompletionStatus, } from '@addons/coursecompletion/services/coursecompletion'; import { Component, OnInit } from '@angular/core'; +import { CoreUser, CoreUserProfile } from '@features/user/services/user'; import { IonRefresher } from '@ionic/angular'; import { CoreNavigator } from '@services/navigator'; import { CoreSites } from '@services/sites'; @@ -39,6 +40,7 @@ export class AddonCourseCompletionReportPage implements OnInit { showSelfComplete = false; tracked = true; // Whether completion is tracked. statusText?: string; + user?: CoreUserProfile; /** * @inheritdoc @@ -67,6 +69,8 @@ export class AddonCourseCompletionReportPage implements OnInit { */ protected async fetchCompletion(): Promise { try { + this.user = await CoreUser.getProfile(this.userId, this.courseId, true); + this.completion = await AddonCourseCompletion.getCompletion(this.courseId, this.userId); this.statusText = AddonCourseCompletion.getCompletedStatusText(this.completion); diff --git a/src/addons/coursecompletion/services/coursecompletion.ts b/src/addons/coursecompletion/services/coursecompletion.ts index 488c1d7af..1bfe05acd 100644 --- a/src/addons/coursecompletion/services/coursecompletion.ts +++ b/src/addons/coursecompletion/services/coursecompletion.ts @@ -224,7 +224,7 @@ export class AddonCourseCompletionProvider { // Check if user wants to view his own completion. try { - if (!userId || userId == currentUserId) { + if (!userId || userId === currentUserId) { // Viewing own completion. Get the course to check if it has completion criteria. const course = await CoreCourses.getUserCourse(courseId, true); diff --git a/src/addons/coursecompletion/services/handlers/completionstatus-link.ts b/src/addons/coursecompletion/services/handlers/completionstatus-link.ts new file mode 100644 index 000000000..2c218be0e --- /dev/null +++ b/src/addons/coursecompletion/services/handlers/completionstatus-link.ts @@ -0,0 +1,80 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// 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 { Injectable } from '@angular/core'; + +import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler'; +import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate'; +import { CoreNavigator } from '@services/navigator'; +import { CoreSites } from '@services/sites'; +import { makeSingleton } from '@singletons'; +import { AddonCourseCompletion } from '../coursecompletion'; + +/** + * Handler to treat links to user course completion status. + */ +@Injectable({ providedIn: 'root' }) +export class AddonCourseCompletionStatusLinkHandlerService extends CoreContentLinksHandlerBase { + + name = 'AddonCourseCompletionStatusLinkHandler'; + pattern = /\/blocks\/completionstatus\/details\.php.*([?&](course|user)=\d+)/; + + /** + * @inheritdoc + */ + getActions( + siteIds: string[], + url: string, + params: Record, + ): CoreContentLinksAction[] | Promise { + + return [{ + action: async (siteId): Promise => { + let userId = params.user ? parseInt(params.user, 10) : undefined; + const courseId = parseInt(params.course, 10); + if (!userId) { + const site = await CoreSites.getSite(siteId); + userId = site.getUserId(); + } + + const pageParams = { + courseId, + userId, + }; + + CoreNavigator.navigateToSitePath( + '/coursecompletion', + { params: pageParams, siteId }, + ); + }, + }]; + } + + /** + * @inheritdoc + */ + async isEnabled(siteId: string, url: string, params: Record): Promise { + let userId = params.user ? parseInt(params.user, 10) : undefined; + const courseId = parseInt(params.course, 10); + if (!userId) { + const site = await CoreSites.getSite(siteId); + userId = site.getUserId(); + } + + return AddonCourseCompletion.isPluginViewEnabledForUser(courseId, userId, siteId); + } + +} + +export const AddonCourseCompletionStatusLinkHandler = makeSingleton(AddonCourseCompletionStatusLinkHandlerService);