diff --git a/src/addons/calendar/components/filter/filter.ts b/src/addons/calendar/components/filter/filter.ts index c13e6e372..8c1330e68 100644 --- a/src/addons/calendar/components/filter/filter.ts +++ b/src/addons/calendar/components/filter/filter.ts @@ -19,6 +19,7 @@ import { ModalController } from '@singletons'; import { CoreEvents } from '@singletons/events'; import { AddonCalendarEventType, AddonCalendarProvider } from '../../services/calendar'; import { AddonCalendarFilter, AddonCalendarEventIcons } from '../../services/calendar-helper'; +import { ALL_COURSES_ID } from '@features/courses/services/courses-helper'; /** * Component to display the events filter that includes events types and a list of courses. @@ -30,7 +31,7 @@ import { AddonCalendarFilter, AddonCalendarEventIcons } from '../../services/cal }) export class AddonCalendarFilterComponent implements OnInit { - @Input() courses: Partial[] = []; + @Input() courses: CoreEnrolledCourseData[] = []; @Input() filter: AddonCalendarFilter = { filtered: false, courseId: undefined, @@ -45,7 +46,7 @@ export class AddonCalendarFilterComponent implements OnInit { courseId = -1; typeIcons: AddonCalendarEventIcons[] = []; types: string[] = []; - sortedCourses: Partial[] = []; + sortedCourses: CoreEnrolledCourseData[] = []; constructor() { CoreUtils.enumKeys(AddonCalendarEventType).forEach((name) => { @@ -60,10 +61,18 @@ export class AddonCalendarFilterComponent implements OnInit { * @inheritdoc */ ngOnInit(): void { - this.courseId = this.filter.courseId || -1; + this.courseId = this.filter.courseId || ALL_COURSES_ID; + this.sortedCourses = Array.from(this.courses).sort((a, b) => { + if (a.id === ALL_COURSES_ID) { + return -1; + } - this.sortedCourses = Array.from(this.courses) - .sort((a, b) => (a.shortname?.toLowerCase() ?? '').localeCompare(b.shortname?.toLowerCase() ?? '')); + if (b.id === ALL_COURSES_ID) { + return 1; + } + + return (a.shortname?.toLowerCase() ?? '').localeCompare(b.shortname?.toLowerCase() ?? ''); + }); } /** diff --git a/src/addons/calendar/pages/day/day.ts b/src/addons/calendar/pages/day/day.ts index 9a84da8f1..4ad52ea63 100644 --- a/src/addons/calendar/pages/day/day.ts +++ b/src/addons/calendar/pages/day/day.ts @@ -489,7 +489,7 @@ type PreloadedDay = DayBasicData & CoreSwipeSlidesDynamicItem & { */ class AddonCalendarDaySlidesItemsManagerSource extends CoreSwipeSlidesDynamicItemsManagerSource { - courses: Partial[] = []; + courses: CoreEnrolledCourseData[] = []; eventsSources: Set = new Set(); // Offline events classified in month & day. offlineEvents: Record> = {}; diff --git a/src/addons/calendar/pages/index/index.ts b/src/addons/calendar/pages/index/index.ts index 07e4545a8..cd48d82d1 100644 --- a/src/addons/calendar/pages/index/index.ts +++ b/src/addons/calendar/pages/index/index.ts @@ -62,7 +62,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { year?: number; month?: number; canCreate = false; - courses: Partial[] = []; + courses: CoreEnrolledCourseData[] = []; loaded = false; hasOffline = false; isOnline = false; diff --git a/src/core/features/courses/services/courses-helper.ts b/src/core/features/courses/services/courses-helper.ts index 74a7b5640..b794816d0 100644 --- a/src/core/features/courses/services/courses-helper.ts +++ b/src/core/features/courses/services/courses-helper.ts @@ -31,6 +31,9 @@ import { firstValueFrom, zipIncludingComplete } from '@/core/utils/rxjs'; import { catchError, map } from 'rxjs/operators'; import { chainRequests, WSObservable } from '@classes/site'; +// Id for a course item representing all courses (for example, for course filters). +export const ALL_COURSES_ID = -1; + /** * Helper to gather some common courses functions. */ @@ -45,14 +48,17 @@ export class CoreCoursesHelperProvider { * @param courseId Course ID to get the category. * @returns Promise resolved with the list of courses and the category. */ - async getCoursesForPopover(courseId?: number): Promise<{courses: Partial[]; categoryId?: number}> { - const courses: Partial[] = await CoreCourses.getUserCourses(false); + async getCoursesForPopover(courseId?: number): Promise<{courses: CoreEnrolledCourseData[]; categoryId?: number}> { + const courses: CoreEnrolledCourseData[] = await CoreCourses.getUserCourses(false); // Add "All courses". courses.unshift({ - id: -1, + id: ALL_COURSES_ID, fullname: Translate.instant('core.fulllistofcourses'), + shortname: Translate.instant('core.fulllistofcourses'), categoryid: -1, + summary: '', + summaryformat: 1, }); let categoryId: number | undefined;