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 027d0480e..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';
@@ -31,14 +32,15 @@ import { CoreDomUtils } from '@services/utils/dom';
})
export class AddonCourseCompletionReportPage implements OnInit {
- protected courseId!: number;
protected userId!: number;
+ courseId!: number;
completionLoaded = false;
completion?: AddonCourseCompletionCourseCompletionStatus;
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);
diff --git a/src/core/features/user/services/handlers/profile-link.ts b/src/core/features/user/services/handlers/profile-link.ts
index a4b6ce399..34ddfcf1d 100644
--- a/src/core/features/user/services/handlers/profile-link.ts
+++ b/src/core/features/user/services/handlers/profile-link.ts
@@ -17,6 +17,7 @@ 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';
/**
@@ -27,7 +28,7 @@ export class CoreUserProfileLinkHandlerService extends CoreContentLinksHandlerBa
name = 'CoreUserProfileLinkHandler';
// Match user/view.php and user/profile.php but NOT grade/report/user/.
- pattern = /((\/user\/view\.php)|(\/user\/profile\.php)).*([?&]id=\d+)/;
+ pattern = /(\/user\/view\.php)|(\/user\/profile\.php)/;
/**
* @inheritdoc
@@ -37,11 +38,18 @@ export class CoreUserProfileLinkHandlerService extends CoreContentLinksHandlerBa
url: string,
params: Record,
): CoreContentLinksAction[] | Promise {
+
return [{
- action: (siteId): void => {
+ action: async (siteId): Promise => {
+ let userId = params.id ? parseInt(params.id, 10) : 0;
+ if (!userId) {
+ const site = await CoreSites.getSite(siteId);
+ userId = site.getUserId();
+ }
+
const pageParams = {
courseId: params.course,
- userId: parseInt(params.id, 10),
+ userId,
};
CoreNavigator.navigateToSitePath('/user', { params: pageParams, siteId });
@@ -53,7 +61,7 @@ export class CoreUserProfileLinkHandlerService extends CoreContentLinksHandlerBa
* @inheritdoc
*/
async isEnabled(siteId: string, url: string): Promise {
- return url.indexOf('/grade/report/') == -1;
+ return url.indexOf('/grade/report/') === -1;
}
}