// (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 { PopoverController } from '@ionic/angular'; import { CoreUtils } from '@services/utils/utils'; import { CoreSites } from '@services/sites'; import { CoreCourses, CoreCourseSearchedData, CoreCourseUserAdminOrNavOptionIndexed, CoreEnrolledCourseData } from './courses'; import { makeSingleton } from '@singletons/core.singletons'; // import { AddonCourseCompletionProvider } from '@addon/coursecompletion/providers/coursecompletion'; // import { CoreCoursePickerMenuPopoverComponent } from '@components/course-picker-menu/course-picker-menu-popover'; /** * Helper to gather some common courses functions. */ @Injectable({ providedIn: 'root', }) export class CoreCoursesHelperProvider { /** * Get the courses to display the course picker popover. If a courseId is specified, it will also return its categoryId. * * @param courseId Course ID to get the category. * @return Promise resolved with the list of courses and the category. */ async getCoursesForPopover(): Promise { // @todo params and logic } /** * Given a course object returned by core_enrol_get_users_courses and another one returned by core_course_get_courses_by_field, * load some extra data to the first one. * * @param course Course returned by core_enrol_get_users_courses. * @param courseByField Course returned by core_course_get_courses_by_field. * @param addCategoryName Whether add category name or not. */ loadCourseExtraInfo( course: CoreEnrolledCourseDataWithExtraInfo, courseByField: CoreCourseSearchedData, addCategoryName: boolean = false, ): void { if (courseByField) { course.displayname = courseByField.displayname; course.categoryname = addCategoryName ? courseByField.categoryname : undefined; if (courseByField.overviewfiles && courseByField.overviewfiles[0]) { course.courseImage = courseByField.overviewfiles[0].fileurl; } else { delete course.courseImage; } } else { delete course.displayname; delete course.courseImage; } } /** * Given a list of courses returned by core_enrol_get_users_courses, load some extra data using the WebService * core_course_get_courses_by_field if available. * * @param courses List of courses. * @param loadCategoryNames Whether load category names or not. * @return Promise resolved when done. */ async loadCoursesExtraInfo(courses: CoreEnrolledCourseDataWithExtraInfo[], loadCategoryNames: boolean = false): Promise { if (!courses.length ) { // No courses or cannot get the data, stop. return; } let coursesInfo = {}; let courseInfoAvailable = false; const site = CoreSites.instance.getCurrentSite(); const promises: Promise[] = []; const colors: (string | undefined)[] = []; if (site?.isVersionGreaterEqualThan('3.8')) { promises.push(site.getConfig().then((configs) => { for (let x = 0; x < 10; x++) { colors[x] = configs['core_admin_coursecolor' + (x + 1)] || undefined; } return; }).catch(() => { // Ignore errors. })); } if (CoreCourses.instance.isGetCoursesByFieldAvailable() && (loadCategoryNames || (typeof courses[0].overviewfiles == 'undefined' && typeof courses[0].displayname == 'undefined'))) { const courseIds = courses.map((course) => course.id).join(','); courseInfoAvailable = true; // Get the extra data for the courses. promises.push(CoreCourses.instance.getCoursesByField('ids', courseIds).then((coursesInfos) => { coursesInfo = CoreUtils.instance.arrayToObject(coursesInfos, 'id'); return; })); } await Promise.all(promises); courses.forEach((course) => { this.loadCourseExtraInfo(course, courseInfoAvailable ? coursesInfo[course.id] : course, loadCategoryNames); if (!course.courseImage) { course.colorNumber = course.id % 10; course.color = colors.length ? colors[course.colorNumber] : undefined; } }); } /** * Get user courses with admin and nav options. * * @param sort Sort courses after get them. If sort is not defined it won't be sorted. * @param slice Slice results to get the X first one. If slice > 0 it will be done after sorting. * @param filter Filter using some field. * @param loadCategoryNames Whether load category names or not. * @return Courses filled with options. */ async getUserCoursesWithOptions(): Promise { // @todo params and logic } /** * Show a context menu to select a course, and return the courseId and categoryId of the selected course (-1 for all courses). * Returns an empty object if popover closed without picking a course. * * @param event Click event. * @param courses List of courses, from CoreCoursesHelperProvider.getCoursesForPopover. * @param courseId The course to select at start. * @return Promise resolved with the course ID and category ID. */ async selectCourse(): Promise { // @todo params and logic } } export class CoreCoursesHelper extends makeSingleton(CoreCoursesHelperProvider) { } /** * Enrolled course data with extra rendering info. */ export type CoreEnrolledCourseDataWithExtraInfo = CoreEnrolledCourseData & { colorNumber?: number; // Color index number. color?: string; // Color RGB. courseImage?: string; // Course thumbnail. categoryname?: string; // Category name, }; /** * Enrolled course data with admin and navigation option availability. */ export type CoreEnrolledCourseDataWithOptions = CoreEnrolledCourseData & { navOptions?: CoreCourseUserAdminOrNavOptionIndexed; admOptions?: CoreCourseUserAdminOrNavOptionIndexed; }; /** * Enrolled course data with admin and navigation option availability and extra rendering info. */ export type CoreEnrolledCourseDataWithExtraInfoAndOptions = CoreEnrolledCourseDataWithExtraInfo & CoreEnrolledCourseDataWithOptions;