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);