MOBILE-3629 course: Add courseId param to course route

main
Pau Ferrer Ocaña 2021-03-10 13:55:00 +01:00
parent 70809d79ec
commit cbdcb8bd8f
30 changed files with 80 additions and 71 deletions

View File

@ -19,8 +19,8 @@ import { conditionalRoutes } from '@/app/app-routing.module';
import { CoreScreen } from '@services/screen'; import { CoreScreen } from '@services/screen';
import { CoreSharedModule } from '@/core/shared.module'; import { CoreSharedModule } from '@/core/shared.module';
import { AddonBadgesIssuedBadgePage } from './pages/issued-badge/issued-badge'; import { AddonBadgesIssuedBadgePage } from './pages/issued-badge/issued-badge.page';
import { AddonBadgesUserBadgesPage } from './pages/user-badges/user-badges'; import { AddonBadgesUserBadgesPage } from './pages/user-badges/user-badges.page';
const mobileRoutes: Routes = [ const mobileRoutes: Routes = [
{ {

View File

@ -20,8 +20,9 @@ import { CoreDomUtils } from '@services/utils/dom';
import { CoreSites } from '@services/sites'; import { CoreSites } from '@services/sites';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CorePageItemsListManager } from '@classes/page-items-list-manager'; import { CorePageItemsListManager } from '@classes/page-items-list-manager';
import { ActivatedRoute, ActivatedRouteSnapshot, Params } from '@angular/router'; import { ActivatedRouteSnapshot, Params } from '@angular/router';
import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { CoreSplitViewComponent } from '@components/split-view/split-view';
import { CoreNavigator } from '@services/navigator';
/** /**
* Page that displays the list of calendar events. * Page that displays the list of calendar events.
@ -37,9 +38,9 @@ export class AddonBadgesUserBadgesPage implements AfterViewInit, OnDestroy {
@ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent; @ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent;
constructor(route: ActivatedRoute) { constructor() {
const courseId = parseInt(route.snapshot.queryParams.courseId ?? 0); // Use 0 for site badges. const courseId = CoreNavigator.getRouteNumberParam('courseId') ?? 0; // Use 0 for site badges.
const userId = parseInt(route.snapshot.queryParams.userId ?? CoreSites.getCurrentSiteUserId()); const userId = CoreNavigator.getRouteNumberParam('userId') ?? CoreSites.getCurrentSiteUserId();
this.badges = new AddonBadgesUserBadgesManager(AddonBadgesUserBadgesPage, courseId, userId); this.badges = new AddonBadgesUserBadgesManager(AddonBadgesUserBadgesPage, courseId, userId);
} }

View File

@ -131,9 +131,8 @@ export class AddonBlockActivityModulesComponent extends CoreBlockBaseComponent i
* @param entry Selected entry. * @param entry Selected entry.
*/ */
gotoCoureListModType(entry: AddonBlockActivityModuleEntry): void { gotoCoureListModType(entry: AddonBlockActivityModuleEntry): void {
CoreNavigator.navigateToSitePath('course/list-mod-type', { CoreNavigator.navigateToSitePath('course/' + this.getCourseId() + '/list-mod-type', {
params: { params: {
courseId: this.getCourseId(),
modName: entry.modName, modName: entry.modName,
title: entry.name, title: entry.name,
}, },

View File

@ -61,9 +61,8 @@ export class CoreContentLinksModuleListHandler extends CoreContentLinksHandlerBa
return [{ return [{
action: (siteId): void => { action: (siteId): void => {
CoreNavigator.navigateToSitePath('course/list-mod-type', { CoreNavigator.navigateToSitePath('course/' + params.id + '/list-mod-type', {
params: { params: {
courseId: params.id,
modName: this.modName, modName: this.modName,
title: this.title || Translate.instant('addon.mod_' + this.modName + '.modulenameplural'), title: this.title || Translate.instant('addon.mod_' + this.modName + '.modulenameplural'),
}, },

View File

@ -22,18 +22,23 @@ const routes: Routes = [
pathMatch: 'full', pathMatch: 'full',
}, },
{ {
path: 'index', path: ':courseId',
loadChildren: () => import('./pages/index/index.module').then( m => m.CoreCourseIndexPageModule), loadChildren: () => import('./pages/index/index.module').then( m => m.CoreCourseIndexPageModule),
}, },
{ {
path: 'unsupported-module', path: ':courseId/unsupported-module',
loadChildren: () => import('./pages/unsupported-module/unsupported-module.module') loadChildren: () => import('./pages/unsupported-module/unsupported-module.module')
.then( m => m.CoreCourseUnsupportedModulePageModule), .then( m => m.CoreCourseUnsupportedModulePageModule),
}, },
{ {
path: 'list-mod-type', path: ':courseId/list-mod-type',
loadChildren: () => import('./pages/list-mod-type/list-mod-type.module').then(m => m.CoreCourseListModTypePageModule), loadChildren: () => import('./pages/list-mod-type/list-mod-type.module').then(m => m.CoreCourseListModTypePageModule),
}, },
{
path: ':courseId/preview',
loadChildren: () =>
import('./pages/preview/preview.module').then(m => m.CoreCoursePreviewPageModule),
},
]; ];
@NgModule({ @NgModule({

View File

@ -460,7 +460,10 @@ export class CoreCourseContentsPage implements OnInit, OnDestroy {
* Open the course summary * Open the course summary
*/ */
openCourseSummary(): void { openCourseSummary(): void {
CoreNavigator.navigateToSitePath('/courses/preview', { params: { course: this.course, avoidOpenCourse: true } }); CoreNavigator.navigateToSitePath(
'/course/' + this.course.id + '/preview',
{ params: { course: this.course, avoidOpenCourse: true } },
);
} }
/** /**

View File

@ -17,7 +17,7 @@ import { RouterModule, ROUTES, Routes } from '@angular/router';
import { resolveModuleRoutes } from '@/app/app-routing.module'; import { resolveModuleRoutes } from '@/app/app-routing.module';
import { CoreSharedModule } from '@/core/shared.module'; import { CoreSharedModule } from '@/core/shared.module';
import { CoreCourseIndexPage } from './index'; import { CoreCourseIndexPage } from './index.page';
import { COURSE_INDEX_ROUTES } from './index-routing.module'; import { COURSE_INDEX_ROUTES } from './index-routing.module';
function buildRoutes(injector: Injector): Routes { function buildRoutes(injector: Injector): Routes {

View File

@ -123,7 +123,6 @@ export class CoreCourseIndexPage implements OnInit, OnDestroy {
handlers.forEach((handler, index) => { handlers.forEach((handler, index) => {
handler.data.page = CoreTextUtils.concatenatePaths(this.currentPagePath, handler.data.page); handler.data.page = CoreTextUtils.concatenatePaths(this.currentPagePath, handler.data.page);
handler.data.pageParams = handler.data.pageParams || {}; handler.data.pageParams = handler.data.pageParams || {};
handler.data.pageParams.courseId = this.course!.id;
// Check if this handler should be the first selected tab. // Check if this handler should be the first selected tab.
if (this.firstTabName && handler.name == this.firstTabName) { if (this.firstTabName && handler.name == this.firstTabName) {

View File

@ -16,7 +16,7 @@ import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
import { CoreSharedModule } from '@/core/shared.module'; import { CoreSharedModule } from '@/core/shared.module';
import { CoreCourseListModTypePage } from './list-mod-type'; import { CoreCourseListModTypePage } from './list-mod-type.page';
import { CoreCourseComponentsModule } from '@features/course/components/components.module'; import { CoreCourseComponentsModule } from '@features/course/components/components.module';
const routes: Routes = [ const routes: Routes = [

View File

@ -13,8 +13,8 @@
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
</ion-refresher> </ion-refresher>
<core-loading [hideUntil]="dataLoaded"> <core-loading [hideUntil]="dataLoaded">
<div class="core-course-thumb-parallax"> <div *ngIf="courseImageUrl" class="core-course-thumb-parallax">
<div *ngIf="courseImageUrl" (click)="openCourse()" class="core-course-thumb"> <div (click)="openCourse()" class="core-course-thumb">
<img [src]="courseImageUrl" core-external-content alt=""/> <img [src]="courseImageUrl" core-external-content alt=""/>
</div> </div>
</div> </div>

View File

@ -16,13 +16,12 @@ import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
import { CoreSharedModule } from '@/core/shared.module'; import { CoreSharedModule } from '@/core/shared.module';
import { CoreCoursesCoursePreviewPage } from './course-preview'; import { CoreCoursePreviewPage } from './preview.page';
import { CoreCoursesComponentsModule } from '../../components/components.module';
const routes: Routes = [ const routes: Routes = [
{ {
path: '', path: '',
component: CoreCoursesCoursePreviewPage, component: CoreCoursePreviewPage,
}, },
]; ];
@ -30,11 +29,10 @@ const routes: Routes = [
imports: [ imports: [
RouterModule.forChild(routes), RouterModule.forChild(routes),
CoreSharedModule, CoreSharedModule,
CoreCoursesComponentsModule,
], ],
declarations: [ declarations: [
CoreCoursesCoursePreviewPage, CoreCoursePreviewPage,
], ],
exports: [RouterModule], exports: [RouterModule],
}) })
export class CoreCoursesCoursePreviewPageModule { } export class CoreCoursePreviewPageModule { }

View File

@ -15,7 +15,7 @@
import { Component, OnDestroy, NgZone, OnInit } from '@angular/core'; import { Component, OnDestroy, NgZone, OnInit } from '@angular/core';
import { ModalController, IonRefresher } from '@ionic/angular'; import { ModalController, IonRefresher } from '@ionic/angular';
import { CoreApp } from '@services/app'; import { CoreApp } from '@services/app';
import { CoreEventCourseStatusChanged, CoreEventObserver, CoreEvents } from '@singletons/events'; import { CoreEventObserver, CoreEvents } from '@singletons/events';
import { CoreSites } from '@services/sites'; import { CoreSites } from '@services/sites';
import { CoreDomUtils } from '@services/utils/dom'; import { CoreDomUtils } from '@services/utils/dom';
import { CoreTextUtils } from '@services/utils/text'; import { CoreTextUtils } from '@services/utils/text';
@ -32,18 +32,18 @@ import { CoreCourse, CoreCourseProvider } from '@features/course/services/course
import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/services/course-helper'; import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/services/course-helper';
import { Translate } from '@singletons'; import { Translate } from '@singletons';
import { CoreConstants } from '@/core/constants'; import { CoreConstants } from '@/core/constants';
import { CoreCoursesSelfEnrolPasswordComponent } from '../../components/self-enrol-password/self-enrol-password'; import { CoreCoursesSelfEnrolPasswordComponent } from '../../../courses/components/self-enrol-password/self-enrol-password';
import { CoreNavigator } from '@services/navigator'; import { CoreNavigator } from '@services/navigator';
/** /**
* Page that allows "previewing" a course and enrolling in it if enabled and not enrolled. * Page that allows "previewing" a course and enrolling in it if enabled and not enrolled.
*/ */
@Component({ @Component({
selector: 'page-core-courses-course-preview', selector: 'page-core-course-preview',
templateUrl: 'course-preview.html', templateUrl: 'preview.html',
styleUrls: ['course-preview.scss'], styleUrls: ['preview.scss'],
}) })
export class CoreCoursesCoursePreviewPage implements OnInit, OnDestroy { export class CoreCoursePreviewPage implements OnInit, OnDestroy {
course?: CoreCourseSearchedData; course?: CoreCourseSearchedData;
isEnrolled = false; isEnrolled = false;
@ -84,7 +84,7 @@ export class CoreCoursesCoursePreviewPage implements OnInit, OnDestroy {
if (this.downloadCourseEnabled) { if (this.downloadCourseEnabled) {
// Listen for status change in course. // Listen for status change in course.
this.courseStatusObserver = CoreEvents.on(CoreEvents.COURSE_STATUS_CHANGED, (data: CoreEventCourseStatusChanged) => { this.courseStatusObserver = CoreEvents.on(CoreEvents.COURSE_STATUS_CHANGED, (data) => {
if (data.courseId == this.course!.id || data.courseId == CoreCourseProvider.ALL_COURSES_CLEARED) { if (data.courseId == this.course!.id || data.courseId == CoreCourseProvider.ALL_COURSES_CLEARED) {
this.updateCourseStatus(data.status); this.updateCourseStatus(data.status);
} }

View File

@ -16,7 +16,7 @@ import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; import { RouterModule, Routes } from '@angular/router';
import { CoreSharedModule } from '@/core/shared.module'; import { CoreSharedModule } from '@/core/shared.module';
import { CoreCourseUnsupportedModulePage } from './unsupported-module'; import { CoreCourseUnsupportedModulePage } from './unsupported-module.page';
import { CoreCourseComponentsModule } from '@features/course/components/components.module'; import { CoreCourseComponentsModule } from '@features/course/components/components.module';
const routes: Routes = [ const routes: Routes = [

View File

@ -1848,7 +1848,7 @@ export class CoreCourseHelperProvider {
params = params || {}; params = params || {};
Object.assign(params, { course: course }); Object.assign(params, { course: course });
await CoreNavigator.navigateToSitePath('course', { siteId, params }); await CoreNavigator.navigateToSitePath('course/' + course.id, { siteId, params });
} }
} }

View File

@ -177,7 +177,7 @@ export class CoreCourseFormatDefaultHandler implements CoreCourseFormatHandler {
Object.assign(params, { course: course }); Object.assign(params, { course: course });
// Don't return the .push promise, we don't want to display a loading modal during the page transition. // Don't return the .push promise, we don't want to display a loading modal during the page transition.
CoreNavigator.navigateToSitePath('course', { params }); CoreNavigator.navigateToSitePath('course/' + course.id, { params });
} }
/** /**

View File

@ -64,9 +64,9 @@ export class CoreCourseModuleDefaultHandler implements CoreCourseModuleHandler {
event.stopPropagation(); event.stopPropagation();
options = options || {}; options = options || {};
options.params = { module, courseId }; options.params = { module };
CoreNavigator.navigateToSitePath('course/unsupported-module', options); CoreNavigator.navigateToSitePath('course/' + courseId + '/unsupported-module', options);
}, },
}; };

View File

@ -94,7 +94,10 @@ export class CoreCoursesCourseListItemComponent implements OnInit {
if (this.isEnrolled) { if (this.isEnrolled) {
CoreCourseHelper.openCourse(this.course); CoreCourseHelper.openCourse(this.course);
} else { } else {
CoreNavigator.navigate('courses/preview', { params: { course: this.course } }); CoreNavigator.navigate(
'/course/' + this.course.id + '/preview',
{ params: { course: this.course } },
);
} }
} }

View File

@ -50,12 +50,6 @@ const routes: Routes = [
import('./pages/my-courses/my-courses.module') import('./pages/my-courses/my-courses.module')
.then(m => m.CoreCoursesMyCoursesPageModule), .then(m => m.CoreCoursesMyCoursesPageModule),
}, },
{
path: 'preview',
loadChildren: () =>
import('./pages/course-preview/course-preview.module')
.then(m => m.CoreCoursesCoursePreviewPageModule),
},
]; ];
@NgModule({ @NgModule({

View File

@ -59,18 +59,14 @@ export class CoreCoursesEnrolPushClickHandlerService implements CorePushNotifica
const params: Params = { const params: Params = {
course: result.course, course: result.course,
}; };
let page: string; let page = 'course/' + courseId;
if (notification.contexturl?.indexOf('user/index.php') != -1) { if (notification.contexturl?.indexOf('user/index.php') != -1) {
// Open the participants tab. // Open the participants tab.
page = 'course'; params.selectedTab = 'participants'; // @todo: Set this when participants is done.
params.selectedTab = 'user_participants'; // @todo: Set this when participants is done. } else if (!result.enrolled) {
} else if (result.enrolled) {
// User is still enrolled, open the course.
page = 'course';
} else {
// User not enrolled anymore, open the preview page. // User not enrolled anymore, open the preview page.
page = 'courses/preview';; page += '/preview';
} }
await CoreNavigator.navigateToSitePath(page, { params, siteId: notification.site }); await CoreNavigator.navigateToSitePath(page, { params, siteId: notification.site });

View File

@ -75,14 +75,11 @@ export class CoreCoursesRequestPushClickHandlerService implements CorePushNotifi
const params: Params = { const params: Params = {
course: result.course, course: result.course,
}; };
let page: string; let page = 'course/' + courseId;
if (result.enrolled) { if (!result.enrolled) {
// User is still enrolled, open the course.
page = 'course';
} else {
// User not enrolled (shouldn't happen), open the preview page. // User not enrolled (shouldn't happen), open the preview page.
page = 'courses/preview'; page += '/preview';
} }
await CoreNavigator.navigateToSitePath(page, { params, siteId: notification.site }); await CoreNavigator.navigateToSitePath(page, { params, siteId: notification.site });

View File

@ -21,8 +21,8 @@ import { CoreSharedModule } from '@/core/shared.module';
import { CoreGradesCoursePage } from './pages/course/course.page'; import { CoreGradesCoursePage } from './pages/course/course.page';
import { CoreGradesCoursePageModule } from './pages/course/course.module'; import { CoreGradesCoursePageModule } from './pages/course/course.module';
import { CoreGradesCoursesPage } from './pages/courses/courses'; import { CoreGradesCoursesPage } from './pages/courses/courses.page';
import { CoreGradesGradePage } from './pages/grade/grade'; import { CoreGradesGradePage } from './pages/grade/grade.page';
const mobileRoutes: Routes = [ const mobileRoutes: Routes = [
{ {

View File

@ -16,10 +16,11 @@ import { AfterViewInit, Component, OnDestroy, ViewChild } from '@angular/core';
import { ActivatedRouteSnapshot } from '@angular/router'; import { ActivatedRouteSnapshot } from '@angular/router';
import { CorePageItemsListManager } from '@classes/page-items-list-manager'; import { CorePageItemsListManager } from '@classes/page-items-list-manager';
import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { CoreSplitViewComponent, CoreSplitViewMode } from '@components/split-view/split-view';
import { CoreGrades } from '@features/grades/services/grades'; import { CoreGrades } from '@features/grades/services/grades';
import { CoreGradesGradeOverviewWithCourseData, CoreGradesHelper } from '@features/grades/services/grades-helper'; import { CoreGradesGradeOverviewWithCourseData, CoreGradesHelper } from '@features/grades/services/grades-helper';
import { IonRefresher } from '@ionic/angular'; import { IonRefresher } from '@ionic/angular';
import { CoreNavigator } from '@services/navigator';
import { CoreDomUtils } from '@services/utils/dom'; import { CoreDomUtils } from '@services/utils/dom';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
@ -33,13 +34,27 @@ import { CoreUtils } from '@services/utils/utils';
export class CoreGradesCoursesPage implements OnDestroy, AfterViewInit { export class CoreGradesCoursesPage implements OnDestroy, AfterViewInit {
courses: CoreGradesCoursesManager = new CoreGradesCoursesManager(CoreGradesCoursesPage); courses: CoreGradesCoursesManager = new CoreGradesCoursesManager(CoreGradesCoursesPage);
splitViewMode?: CoreSplitViewMode;
@ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent; @ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent;
constructor() {
const userId = CoreNavigator.getRouteNumberParam('userId');
const courseId = CoreNavigator.getRouteNumberParam('courseId');
// If courseId and userId is set, show only the content page.
this.splitViewMode = courseId && userId ? undefined : CoreSplitViewMode.ContentOnly;
}
/** /**
* @inheritdoc * @inheritdoc
*/ */
async ngAfterViewInit(): Promise<void> { async ngAfterViewInit(): Promise<void> {
if (this.splitViewMode) {
// Won't be shown, do nothing.
return;
}
await this.fetchInitialCourses(); await this.fetchInitialCourses();
this.courses.start(this.splitView); this.courses.start(this.splitView);

View File

@ -11,7 +11,7 @@
<ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content>
</ion-refresher> </ion-refresher>
<core-loading [hideUntil]="gradeLoaded"> <core-loading [hideUntil]="gradeLoaded">
<core-empty-box *ngIf="!grade" icon="stats" [message]="'core.grades.nogradesreturned' | translate"></core-empty-box> <core-empty-box *ngIf="!grade" icon="fas-chart-bar" [message]="'core.grades.nogradesreturned' | translate"></core-empty-box>
<ion-list *ngIf="grade"> <ion-list *ngIf="grade">
<ion-item *ngIf="grade.itemname && grade.link" class="ion-text-wrap" detail="true" [href]="grade.link" core-link <ion-item *ngIf="grade.itemname && grade.link" class="ion-text-wrap" detail="true" [href]="grade.link" core-link

View File

@ -12,7 +12,6 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
import { ActivatedRoute } from '@angular/router';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { IonRefresher } from '@ionic/angular'; import { IonRefresher } from '@ionic/angular';
@ -21,6 +20,7 @@ import { CoreGrades } from '@features/grades/services/grades';
import { CoreGradesFormattedRow, CoreGradesHelper } from '@features/grades/services/grades-helper'; import { CoreGradesFormattedRow, CoreGradesHelper } from '@features/grades/services/grades-helper';
import { CoreSites } from '@services/sites'; import { CoreSites } from '@services/sites';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreNavigator } from '@services/navigator';
/** /**
* Page that displays activity grade. * Page that displays activity grade.
@ -37,10 +37,10 @@ export class CoreGradesGradePage implements OnInit {
grade?: CoreGradesFormattedRow | null; grade?: CoreGradesFormattedRow | null;
gradeLoaded = false; gradeLoaded = false;
constructor(route: ActivatedRoute) { constructor() {
this.courseId = parseInt(route.snapshot.params.courseId ?? route.snapshot.parent?.params.courseId); this.courseId = CoreNavigator.getRouteNumberParam('courseId')!;
this.gradeId = parseInt(route.snapshot.params.gradeId); this.gradeId = CoreNavigator.getRouteNumberParam('gradeId')!;
this.userId = parseInt(route.snapshot.queryParams.userId ?? CoreSites.getCurrentSiteUserId()); this.userId = CoreNavigator.getRouteNumberParam('userId') ?? CoreSites.getCurrentSiteUserId();
} }
/** /**

View File

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router'; import { ActivatedRouteSnapshot } from '@angular/router';
import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
import { IonRefresher } from '@ionic/angular'; import { IonRefresher } from '@ionic/angular';
@ -43,8 +43,8 @@ export class CoreUserParticipantsPage implements OnInit, AfterViewInit, OnDestro
@ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent; @ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent;
constructor(route: ActivatedRoute) { constructor() {
const courseId = parseInt(route.snapshot.queryParams.courseId); const courseId = CoreNavigator.getRouteNumberParam('courseId')!;
this.participants = new CoreUserParticipantsManager(CoreUserParticipantsPage, courseId); this.participants = new CoreUserParticipantsManager(CoreUserParticipantsPage, courseId);
} }

View File

@ -18,7 +18,7 @@ import { RouterModule, Routes } from '@angular/router';
import { CoreSharedModule } from '@/core/shared.module'; import { CoreSharedModule } from '@/core/shared.module';
import { CoreSearchComponentsModule } from '@features/search/components/components.module'; import { CoreSearchComponentsModule } from '@features/search/components/components.module';
import { CoreUserParticipantsPage } from './pages/participants/participants'; import { CoreUserParticipantsPage } from './pages/participants/participants.page';
const routes: Routes = [ const routes: Routes = [
{ {