From 62f097dc920576730efb3e4272db1ed845fc3d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 12 Jul 2024 10:22:20 +0200 Subject: [PATCH] MOBILE-4616 lesson: Move lesson constants to a file --- .../mod/lesson/components/index/index.ts | 21 ++- src/addons/mod/lesson/constants.ts | 54 ++++++ src/addons/mod/lesson/lesson-lazy.module.ts | 2 +- src/addons/mod/lesson/lesson.module.ts | 10 +- src/addons/mod/lesson/pages/player/player.ts | 16 +- .../lesson/pages/user-retake/user-retake.ts | 4 +- .../lesson/services/handlers/grade-link.ts | 4 +- .../mod/lesson/services/handlers/module.ts | 5 +- .../mod/lesson/services/handlers/prefetch.ts | 8 +- .../lesson/services/handlers/report-link.ts | 6 +- .../mod/lesson/services/lesson-helper.ts | 19 +- .../mod/lesson/services/lesson-offline.ts | 7 +- src/addons/mod/lesson/services/lesson-sync.ts | 11 +- src/addons/mod/lesson/services/lesson.ts | 169 ++++++++---------- src/core/features/grades/constants.ts | 20 +++ src/core/features/grades/services/grades.ts | 15 +- 16 files changed, 213 insertions(+), 158 deletions(-) create mode 100644 src/addons/mod/lesson/constants.ts create mode 100644 src/core/features/grades/constants.ts diff --git a/src/addons/mod/lesson/components/index/index.ts b/src/addons/mod/lesson/components/index/index.ts index 13eb4b2d0..d5ad92415 100644 --- a/src/addons/mod/lesson/components/index/index.ts +++ b/src/addons/mod/lesson/components/index/index.ts @@ -36,19 +36,22 @@ import { AddonModLessonGetAccessInformationWSResponse, AddonModLessonLessonWSData, AddonModLessonPreventAccessReason, - AddonModLessonProvider, } from '../../services/lesson'; import { AddonModLessonOffline } from '../../services/lesson-offline'; import { AddonModLessonAutoSyncData, AddonModLessonSync, - AddonModLessonSyncProvider, AddonModLessonSyncResult, } from '../../services/lesson-sync'; -import { AddonModLessonModuleHandlerService } from '../../services/handlers/module'; import { CoreTime } from '@singletons/time'; import { CoreError } from '@classes/errors/error'; import { Translate } from '@singletons'; +import { + ADDON_MOD_LESSON_AUTO_SYNCED, + ADDON_MOD_LESSON_COMPONENT, + ADDON_MOD_LESSON_DATA_SENT_EVENT, + ADDON_MOD_LESSON_PAGE_NAME, +} from '../../constants'; /** * Component that displays a lesson entry page. @@ -65,7 +68,7 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo @Input() group = 0; // The group to display. @Input() action?: string; // The "action" to display first. - component = AddonModLessonProvider.COMPONENT; + component = ADDON_MOD_LESSON_COMPONENT; pluginName = 'lesson'; lesson?: AddonModLessonLessonWSData; // The lesson. @@ -86,7 +89,7 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo hightimeReadable?: string; // High time in a readable format. lowtimeReadable?: string; // Low time in a readable format. - protected syncEventName = AddonModLessonSyncProvider.AUTO_SYNCED; + protected syncEventName = ADDON_MOD_LESSON_AUTO_SYNCED; protected accessInfo?: AddonModLessonGetAccessInformationWSResponse; // Lesson access info. protected password?: string; // The password for the lesson. protected hasPlayed = false; // Whether the user has gone to the lesson player (attempted). @@ -411,7 +414,7 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo } await CoreNavigator.navigateToSitePath( - `${AddonModLessonModuleHandlerService.PAGE_NAME}/${this.courseId}/${this.module.id}/player`, + `${ADDON_MOD_LESSON_PAGE_NAME}/${this.courseId}/${this.module.id}/player`, { params: { pageId: pageId, @@ -424,7 +427,7 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo this.hasPlayed = true; this.dataSentObserver?.off(); - this.dataSentObserver = CoreEvents.on(AddonModLessonProvider.DATA_SENT_EVENT, (data) => { + this.dataSentObserver = CoreEvents.on(ADDON_MOD_LESSON_DATA_SENT_EVENT, (data) => { if (data.lessonId !== this.lesson?.id || data.type === 'launch') { // Ignore launch sending because it only affects timers. return; @@ -480,7 +483,7 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo } await CoreNavigator.navigateToSitePath( - `${AddonModLessonModuleHandlerService.PAGE_NAME}/${this.courseId}/${this.module.id}/player`, + `${ADDON_MOD_LESSON_PAGE_NAME}/${this.courseId}/${this.module.id}/player`, { params: { pageId: this.retakeToReview.pageid, @@ -705,7 +708,7 @@ export class AddonModLessonIndexComponent extends CoreCourseModuleMainActivityCo */ async openRetake(userId: number): Promise { CoreNavigator.navigateToSitePath( - `${AddonModLessonModuleHandlerService.PAGE_NAME}/${this.courseId}/${this.module.id}/user-retake/${userId}`, + `${ADDON_MOD_LESSON_PAGE_NAME}/${this.courseId}/${this.module.id}/user-retake/${userId}`, ); } diff --git a/src/addons/mod/lesson/constants.ts b/src/addons/mod/lesson/constants.ts new file mode 100644 index 000000000..98280315b --- /dev/null +++ b/src/addons/mod/lesson/constants.ts @@ -0,0 +1,54 @@ +// (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. + +export const ADDON_MOD_LESSON_COMPONENT = 'mmaModLesson'; + +export const ADDON_MOD_LESSON_PAGE_NAME = 'mod_lesson'; + +export const ADDON_MOD_LESSON_AUTO_SYNCED = 'addon_mod_lesson_autom_synced'; +export const ADDON_MOD_LESSON_DATA_SENT_EVENT = 'addon_mod_lesson_data_sent'; + +export const enum AddonModLessonJumpTo { + THISPAGE = 0, // This page. + UNSEENPAGE = 1, // Next page -> any page not seen before. + UNANSWEREDPAGE = 2, // Next page -> any page not answered correctly. + NEXTPAGE = -1, // Jump to Next Page. + EOL = -9, // End of Lesson. + UNSEENBRANCHPAGE = -50, // Jump to an unseen page within a branch and end of branch or end of lesson. + RANDOMPAGE = -60, // Jump to a random page within a branch and end of branch or end of lesson. + RANDOMBRANCH = -70, // Jump to a random Branch. + CLUSTERJUMP = -80, // Cluster Jump. +} + +// Type of page: question or structure (content). +export const enum AddonModLessonPageType { + QUESTION = 0, + STRUCTURE = 1, +} + +// Type of question pages. +export const enum AddonModLessonPageSubtype { + SHORTANSWER = 1, + TRUEFALSE = 2, + MULTICHOICE = 3, + MATCHING = 5, + NUMERICAL = 8, + ESSAY = 10, + BRANCHTABLE = 20, // Content page. + ENDOFBRANCH = 21, + CLUSTER = 30, + ENDOFCLUSTER = 31 +} + +export const ADDON_MOD_LESSON_OTHER_ANSWERS = '@#wronganswer#@'; diff --git a/src/addons/mod/lesson/lesson-lazy.module.ts b/src/addons/mod/lesson/lesson-lazy.module.ts index 749b6547f..b34ec5667 100644 --- a/src/addons/mod/lesson/lesson-lazy.module.ts +++ b/src/addons/mod/lesson/lesson-lazy.module.ts @@ -53,4 +53,4 @@ const routes: Routes = [ AddonModLessonUserRetakePage, ], }) -export class AddonModLessonLazyModule {} +export default class AddonModLessonLazyModule {} diff --git a/src/addons/mod/lesson/lesson.module.ts b/src/addons/mod/lesson/lesson.module.ts index dd05e9f6e..b0d915237 100644 --- a/src/addons/mod/lesson/lesson.module.ts +++ b/src/addons/mod/lesson/lesson.module.ts @@ -27,17 +27,17 @@ import { SITE_SCHEMA, OFFLINE_SITE_SCHEMA, SYNC_SITE_SCHEMA } from './services/d import { AddonModLessonGradeLinkHandler } from './services/handlers/grade-link'; import { AddonModLessonIndexLinkHandler } from './services/handlers/index-link'; import { AddonModLessonListLinkHandler } from './services/handlers/list-link'; -import { AddonModLessonModuleHandler, AddonModLessonModuleHandlerService } from './services/handlers/module'; +import { AddonModLessonModuleHandler } from './services/handlers/module'; import { AddonModLessonPrefetchHandler } from './services/handlers/prefetch'; import { AddonModLessonPushClickHandler } from './services/handlers/push-click'; import { AddonModLessonReportLinkHandler } from './services/handlers/report-link'; import { AddonModLessonSyncCronHandler } from './services/handlers/sync-cron'; -import { AddonModLessonProvider } from './services/lesson'; +import { ADDON_MOD_LESSON_COMPONENT, ADDON_MOD_LESSON_PAGE_NAME } from './constants'; const routes: Routes = [ { - path: AddonModLessonModuleHandlerService.PAGE_NAME, - loadChildren: () => import('./lesson-lazy.module').then(m => m.AddonModLessonLazyModule), + path: ADDON_MOD_LESSON_PAGE_NAME, + loadChildren: () => import('./lesson-lazy.module'), }, ]; @@ -64,7 +64,7 @@ const routes: Routes = [ CoreContentLinksDelegate.registerHandler(AddonModLessonReportLinkHandler.instance); CorePushNotificationsDelegate.registerClickHandler(AddonModLessonPushClickHandler.instance); - CoreCourseHelper.registerModuleReminderClick(AddonModLessonProvider.COMPONENT); + CoreCourseHelper.registerModuleReminderClick(ADDON_MOD_LESSON_COMPONENT); }, }, ], diff --git a/src/addons/mod/lesson/pages/player/player.ts b/src/addons/mod/lesson/pages/player/player.ts index 668baf5ee..a17c77825 100644 --- a/src/addons/mod/lesson/pages/player/player.ts +++ b/src/addons/mod/lesson/pages/player/player.ts @@ -43,7 +43,6 @@ import { AddonModLessonPossibleJumps, AddonModLessonProcessPageOptions, AddonModLessonProcessPageResponse, - AddonModLessonProvider, } from '../../services/lesson'; import { AddonModLessonActivityLink, @@ -55,6 +54,7 @@ import { AddonModLessonOffline } from '../../services/lesson-offline'; import { AddonModLessonSync } from '../../services/lesson-sync'; import { CoreFormFields, CoreForms } from '@singletons/form'; import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics'; +import { ADDON_MOD_LESSON_COMPONENT, AddonModLessonJumpTo } from '../../constants'; /** * Page that allows attempting and reviewing a lesson. @@ -69,8 +69,8 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { @ViewChild(IonContent) content?: IonContent; @ViewChild('questionFormEl') formElement?: ElementRef; - component = AddonModLessonProvider.COMPONENT; - readonly LESSON_EOL = AddonModLessonProvider.LESSON_EOL; + component = ADDON_MOD_LESSON_COMPONENT; + readonly LESSON_EOL = AddonModLessonJumpTo.EOL; questionForm?: FormGroup; // The FormGroup for question pages. title?: string; // The page title. lesson?: AddonModLessonLessonWSData; // The lesson object. @@ -449,7 +449,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { } } - this.logPageLoaded(AddonModLessonProvider.LESSON_EOL, Translate.instant('addon.mod_lesson.congratulations')); + this.logPageLoaded(AddonModLessonJumpTo.EOL, Translate.instant('addon.mod_lesson.congratulations')); } /** @@ -466,7 +466,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { CoreNavigator.back(); return; - } else if (pageId == AddonModLessonProvider.LESSON_EOL) { + } else if (pageId == AddonModLessonJumpTo.EOL) { // End of lesson reached. return this.finishRetake(); } @@ -496,7 +496,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { const finished = await AddonModLessonOffline.hasFinishedRetake(this.lesson!.id); if (finished) { // Always show EOL page. - pageId = AddonModLessonProvider.LESSON_EOL; + pageId = AddonModLessonJumpTo.EOL; } } @@ -556,7 +556,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { * @returns Promise resolved when done. */ protected async loadPage(pageId: number): Promise { - if (pageId == AddonModLessonProvider.LESSON_EOL) { + if (pageId == AddonModLessonJumpTo.EOL) { // End of lesson reached. return this.finishRetake(); } else if (!this.lesson) { @@ -580,7 +580,7 @@ export class AddonModLessonPlayerPage implements OnInit, OnDestroy, CanLeave { options, ); - if (data.newpageid == AddonModLessonProvider.LESSON_EOL) { + if (data.newpageid == AddonModLessonJumpTo.EOL) { // End of lesson reached. return this.finishRetake(); } diff --git a/src/addons/mod/lesson/pages/user-retake/user-retake.ts b/src/addons/mod/lesson/pages/user-retake/user-retake.ts index 0405044dc..ba3cc1028 100644 --- a/src/addons/mod/lesson/pages/user-retake/user-retake.ts +++ b/src/addons/mod/lesson/pages/user-retake/user-retake.ts @@ -28,13 +28,13 @@ import { AddonModLessonAttemptsOverviewsStudentWSData, AddonModLessonGetUserAttemptWSResponse, AddonModLessonLessonWSData, - AddonModLessonProvider, AddonModLessonUserAttemptAnswerData, AddonModLessonUserAttemptAnswerPageWSData, } from '../../services/lesson'; import { AddonModLessonAnswerData, AddonModLessonHelper } from '../../services/lesson-helper'; import { CoreTime } from '@singletons/time'; import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics'; +import { ADDON_MOD_LESSON_COMPONENT } from '../../constants'; /** * Page that displays a retake made by a certain user. @@ -46,7 +46,7 @@ import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics'; }) export class AddonModLessonUserRetakePage implements OnInit { - component = AddonModLessonProvider.COMPONENT; + component = ADDON_MOD_LESSON_COMPONENT; lesson?: AddonModLessonLessonWSData; // The lesson the retake belongs to. courseId!: number; // Course ID the lesson belongs to. selectedRetake?: number; // The retake to see. diff --git a/src/addons/mod/lesson/services/handlers/grade-link.ts b/src/addons/mod/lesson/services/handlers/grade-link.ts index bc77ca7da..97dc7ab9d 100644 --- a/src/addons/mod/lesson/services/handlers/grade-link.ts +++ b/src/addons/mod/lesson/services/handlers/grade-link.ts @@ -22,7 +22,7 @@ import { CoreSitesReadingStrategy } from '@services/sites'; import { CoreDomUtils } from '@services/utils/dom'; import { makeSingleton } from '@singletons'; import { AddonModLesson } from '../lesson'; -import { AddonModLessonModuleHandlerService } from './module'; +import { ADDON_MOD_LESSON_PAGE_NAME } from '../../constants'; /** * Handler to treat links to lesson grade. @@ -69,7 +69,7 @@ export class AddonModLessonGradeLinkHandlerService extends CoreContentLinksModul if (accessInfo.canviewreports) { // User can view reports, go to view the report. CoreNavigator.navigateToSitePath( - AddonModLessonModuleHandlerService.PAGE_NAME + `/${module.course}/${module.id}/user-retake/${userId}`, + ADDON_MOD_LESSON_PAGE_NAME + `/${module.course}/${module.id}/user-retake/${userId}`, { siteId, }, diff --git a/src/addons/mod/lesson/services/handlers/module.ts b/src/addons/mod/lesson/services/handlers/module.ts index 16763acc1..32a3157f1 100644 --- a/src/addons/mod/lesson/services/handlers/module.ts +++ b/src/addons/mod/lesson/services/handlers/module.ts @@ -18,6 +18,7 @@ import { CoreConstants, ModPurpose } from '@/core/constants'; import { CoreCourseModuleHandler } from '@features/course/services/module-delegate'; import { makeSingleton } from '@singletons'; import { CoreModuleHandlerBase } from '@features/course/classes/module-base-handler'; +import { ADDON_MOD_LESSON_PAGE_NAME } from '../../constants'; /** * Handler to support lesson modules. @@ -25,11 +26,9 @@ import { CoreModuleHandlerBase } from '@features/course/classes/module-base-hand @Injectable({ providedIn: 'root' }) export class AddonModLessonModuleHandlerService extends CoreModuleHandlerBase implements CoreCourseModuleHandler { - static readonly PAGE_NAME = 'mod_lesson'; - name = 'AddonModLesson'; modName = 'lesson'; - protected pageName = AddonModLessonModuleHandlerService.PAGE_NAME; + protected pageName = ADDON_MOD_LESSON_PAGE_NAME; supportedFeatures = { [CoreConstants.FEATURE_GROUPS]: true, diff --git a/src/addons/mod/lesson/services/handlers/prefetch.ts b/src/addons/mod/lesson/services/handlers/prefetch.ts index f9a7e124e..852a07d58 100644 --- a/src/addons/mod/lesson/services/handlers/prefetch.ts +++ b/src/addons/mod/lesson/services/handlers/prefetch.ts @@ -30,9 +30,9 @@ import { AddonModLessonGetAccessInformationWSResponse, AddonModLessonLessonWSData, AddonModLessonPasswordOptions, - AddonModLessonProvider, } from '../lesson'; import { AddonModLessonSync, AddonModLessonSyncResult } from '../lesson-sync'; +import { ADDON_MOD_LESSON_COMPONENT, AddonModLessonJumpTo, AddonModLessonPageSubtype } from '../../constants'; /** * Handler to prefetch lessons. @@ -42,7 +42,7 @@ export class AddonModLessonPrefetchHandlerService extends CoreCourseActivityPref name = 'AddonModLesson'; modName = 'lesson'; - component = AddonModLessonProvider.COMPONENT; + component = ADDON_MOD_LESSON_COMPONENT; // Don't check timers to decrease positives. If a user performs some action it will be reflected in other items. updatesNames = /^configuration$|^.*files$|^grades$|^gradeitems$|^pages$|^answers$|^questionattempts$|^pagesviewed$/; @@ -351,7 +351,7 @@ export class AddonModLessonPrefetchHandlerService extends CoreCourseActivityPref const promises = pages.map(async (data) => { // Check if any page has a RANDOMBRANCH jump. if (!hasRandomBranch) { - hasRandomBranch = data.jumps.some((jump) => jump === AddonModLessonProvider.LESSON_RANDOMBRANCH); + hasRandomBranch = data.jumps.some((jump) => jump === AddonModLessonJumpTo.RANDOMBRANCH); } // Get the page data. We don't pass accessInfo because we don't need to calculate the offline data. @@ -464,7 +464,7 @@ export class AddonModLessonPrefetchHandlerService extends CoreCourseActivityPref // Download embedded files in essays. const files: CoreWSFile[] = []; attempt.answerpages.forEach((answerPage) => { - if (!answerPage.page || answerPage.page.qtype != AddonModLessonProvider.LESSON_PAGE_ESSAY) { + if (!answerPage.page || answerPage.page.qtype !== AddonModLessonPageSubtype.ESSAY) { return; } diff --git a/src/addons/mod/lesson/services/handlers/report-link.ts b/src/addons/mod/lesson/services/handlers/report-link.ts index 92d432b18..de1955316 100644 --- a/src/addons/mod/lesson/services/handlers/report-link.ts +++ b/src/addons/mod/lesson/services/handlers/report-link.ts @@ -21,7 +21,7 @@ import { CoreNavigator } from '@services/navigator'; import { CoreSitesReadingStrategy } from '@services/sites'; import { CoreDomUtils } from '@services/utils/dom'; import { makeSingleton } from '@singletons'; -import { AddonModLessonModuleHandlerService } from './module'; +import { ADDON_MOD_LESSON_PAGE_NAME } from '../../constants'; /** * Handler to treat links to lesson report. @@ -106,7 +106,7 @@ export class AddonModLessonReportLinkHandlerService extends CoreContentLinksHand }; CoreNavigator.navigateToSitePath( - `${AddonModLessonModuleHandlerService.PAGE_NAME}/${module.course}/${module.id}`, + `${ADDON_MOD_LESSON_PAGE_NAME}/${module.course}/${module.id}`, { params, siteId }, ); } catch (error) { @@ -145,7 +145,7 @@ export class AddonModLessonReportLinkHandlerService extends CoreContentLinksHand }; CoreNavigator.navigateToSitePath( - AddonModLessonModuleHandlerService.PAGE_NAME + `/${module.course}/${module.id}/user-retake/${userId}`, + ADDON_MOD_LESSON_PAGE_NAME + `/${module.course}/${module.id}/user-retake/${userId}`, { params, siteId }, ); } catch (error) { diff --git a/src/addons/mod/lesson/services/lesson-helper.ts b/src/addons/mod/lesson/services/lesson-helper.ts index 7c7666792..9398f2b74 100644 --- a/src/addons/mod/lesson/services/lesson-helper.ts +++ b/src/addons/mod/lesson/services/lesson-helper.ts @@ -24,10 +24,10 @@ import { AddonModLesson, AddonModLessonAttemptsOverviewsAttemptWSData, AddonModLessonGetPageDataWSResponse, - AddonModLessonProvider, } from './lesson'; import { CoreTime } from '@singletons/time'; import { CoreUtils } from '@services/utils/utils'; +import { AddonModLessonPageSubtype } from '../constants'; /** * Helper service that provides some features for quiz. @@ -161,7 +161,7 @@ export class AddonModLessonHelperProvider { // Cannot find contents element. if (AddonModLesson.isQuestionPage(data.page?.type || -1) || - data.page?.qtype == AddonModLessonProvider.LESSON_PAGE_BRANCHTABLE) { + data.page?.qtype == AddonModLessonPageSubtype.BRANCHTABLE) { // Return page.contents to prevent having duplicated elements (some elements like videos might not work). return data.page?.contents || ''; } else { @@ -202,19 +202,19 @@ export class AddonModLessonHelperProvider { } switch (pageData.page?.qtype) { - case AddonModLessonProvider.LESSON_PAGE_TRUEFALSE: - case AddonModLessonProvider.LESSON_PAGE_MULTICHOICE: + case AddonModLessonPageSubtype.TRUEFALSE: + case AddonModLessonPageSubtype.MULTICHOICE: return this.getMultiChoiceQuestionData(questionForm, question, fieldContainer); - case AddonModLessonProvider.LESSON_PAGE_NUMERICAL: - case AddonModLessonProvider.LESSON_PAGE_SHORTANSWER: + case AddonModLessonPageSubtype.NUMERICAL: + case AddonModLessonPageSubtype.SHORTANSWER: return this.getInputQuestionData(questionForm, question, fieldContainer, pageData.page.qtype); - case AddonModLessonProvider.LESSON_PAGE_ESSAY: { + case AddonModLessonPageSubtype.ESSAY: { return this.getEssayQuestionData(questionForm, question, fieldContainer); } - case AddonModLessonProvider.LESSON_PAGE_MATCHING: { + case AddonModLessonPageSubtype.MATCHING: { return this.getMatchingQuestionData(questionForm, question, fieldContainer); } } @@ -332,7 +332,7 @@ export class AddonModLessonHelperProvider { // Init the control. questionForm.addControl(input.name, this.formBuilder.control({ - value: questionType === AddonModLessonProvider.LESSON_PAGE_NUMERICAL ? CoreUtils.formatFloat(input.value) : input.value, + value: questionType === AddonModLessonPageSubtype.NUMERICAL ? CoreUtils.formatFloat(input.value) : input.value, disabled: input.readOnly, })); @@ -597,7 +597,6 @@ export class AddonModLessonHelperProvider { } } - export const AddonModLessonHelper = makeSingleton(AddonModLessonHelperProvider); /** diff --git a/src/addons/mod/lesson/services/lesson-offline.ts b/src/addons/mod/lesson/services/lesson-offline.ts index 24af2b3f7..5e50397db 100644 --- a/src/addons/mod/lesson/services/lesson-offline.ts +++ b/src/addons/mod/lesson/services/lesson-offline.ts @@ -26,7 +26,8 @@ import { RETAKES_TABLE_NAME, } from './database/lesson'; -import { AddonModLessonPageWSData, AddonModLessonProvider } from './lesson'; +import { AddonModLessonPageWSData } from './lesson'; +import { AddonModLessonPageType } from '../constants'; /** * Service to handle offline lesson. @@ -256,7 +257,7 @@ export class AddonModLessonOfflineProvider { ): Promise { const attempts = pageId ? await this.getRetakeAttemptsForPage(lessonId, retake, pageId, siteId) : - await this.getRetakeAttemptsForType(lessonId, retake, AddonModLessonProvider.TYPE_QUESTION, siteId); + await this.getRetakeAttemptsForType(lessonId, retake, AddonModLessonPageType.QUESTION, siteId); if (correct) { return attempts.filter((attempt) => !!attempt.correct); @@ -514,7 +515,7 @@ export class AddonModLessonOfflineProvider { await site.getDb().insertRecord(PAGE_ATTEMPTS_TABLE_NAME, entry); - if (page.type == AddonModLessonProvider.TYPE_QUESTION) { + if (page.type == AddonModLessonPageType.QUESTION) { // It's a question page, set it as last question page attempted. await this.setLastQuestionPageAttempted(lessonId, courseId, retake, page.id, siteId); } diff --git a/src/addons/mod/lesson/services/lesson-sync.ts b/src/addons/mod/lesson/services/lesson-sync.ts index adf4eb126..22da5ab5a 100644 --- a/src/addons/mod/lesson/services/lesson-sync.ts +++ b/src/addons/mod/lesson/services/lesson-sync.ts @@ -29,8 +29,9 @@ import { makeSingleton, Translate } from '@singletons'; import { CoreEvents } from '@singletons/events'; import { AddonModLessonRetakeFinishedInSyncDBRecord, RETAKES_FINISHED_SYNC_TABLE_NAME } from './database/lesson'; import { AddonModLessonGetPasswordResult, AddonModLessonPrefetchHandler } from './handlers/prefetch'; -import { AddonModLesson, AddonModLessonLessonWSData, AddonModLessonProvider } from './lesson'; +import { AddonModLesson, AddonModLessonLessonWSData } from './lesson'; import { AddonModLessonOffline, AddonModLessonPageAttemptRecord } from './lesson-offline'; +import { ADDON_MOD_LESSON_AUTO_SYNCED, ADDON_MOD_LESSON_COMPONENT } from '../constants'; /** * Service to sync lesson. @@ -38,8 +39,6 @@ import { AddonModLessonOffline, AddonModLessonPageAttemptRecord } from './lesson @Injectable({ providedIn: 'root' }) export class AddonModLessonSyncProvider extends CoreCourseActivitySyncBaseProvider { - static readonly AUTO_SYNCED = 'addon_mod_lesson_autom_synced'; - protected componentTranslatableString = 'lesson'; constructor() { @@ -144,7 +143,7 @@ export class AddonModLessonSyncProvider extends CoreCourseActivitySyncBaseProvid if (result?.updated) { // Sync successful, send event. - CoreEvents.trigger(AddonModLessonSyncProvider.AUTO_SYNCED, { + CoreEvents.trigger(ADDON_MOD_LESSON_AUTO_SYNCED, { lessonId: lesson.id, warnings: result.warnings, }, siteId); @@ -196,7 +195,7 @@ export class AddonModLessonSyncProvider extends CoreCourseActivitySyncBaseProvid } // Verify that lesson isn't blocked. - if (!ignoreBlock && CoreSync.isBlocked(AddonModLessonProvider.COMPONENT, lessonId, siteId)) { + if (!ignoreBlock && CoreSync.isBlocked(ADDON_MOD_LESSON_COMPONENT, lessonId, siteId)) { this.logger.debug('Cannot sync lesson ' + lessonId + ' because it is blocked.'); throw new CoreSyncBlockedError(Translate.instant('core.errorsyncblocked', { $a: this.componentTranslate })); @@ -226,7 +225,7 @@ export class AddonModLessonSyncProvider extends CoreCourseActivitySyncBaseProvid ): Promise { // Sync offline logs. await CoreUtils.ignoreErrors( - CoreCourseLogHelper.syncActivity(AddonModLessonProvider.COMPONENT, lessonId, siteId), + CoreCourseLogHelper.syncActivity(ADDON_MOD_LESSON_COMPONENT, lessonId, siteId), ); const result: AddonModLessonSyncResult = { diff --git a/src/addons/mod/lesson/services/lesson.ts b/src/addons/mod/lesson/services/lesson.ts index 37ce3389d..1fc068f10 100644 --- a/src/addons/mod/lesson/services/lesson.ts +++ b/src/addons/mod/lesson/services/lesson.ts @@ -17,7 +17,6 @@ import { CoreError } from '@classes/errors/error'; import { CoreSite } from '@classes/sites/site'; import { CoreCourseCommonModWSOptions } from '@features/course/services/course'; import { CoreCourseLogHelper } from '@features/course/services/log-helper'; -import { CoreGradesProvider } from '@features/grades/services/grades'; import { CoreSites, CoreSitesCommonWSOptions, CoreSitesReadingStrategy } from '@services/sites'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreTextUtils } from '@services/utils/text'; @@ -27,10 +26,18 @@ import { makeSingleton, Translate } from '@singletons'; import { CoreEvents } from '@singletons/events'; import { AddonModLessonPasswordDBRecord, PASSWORD_TABLE_NAME } from './database/lesson'; import { AddonModLessonOffline, AddonModLessonPageAttemptRecord } from './lesson-offline'; -import { AddonModLessonAutoSyncData, AddonModLessonSyncProvider } from './lesson-sync'; +import { AddonModLessonAutoSyncData } from './lesson-sync'; import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; - -const ROOT_CACHE_KEY = 'mmaModLesson:'; +import { + ADDON_MOD_LESSON_AUTO_SYNCED, + ADDON_MOD_LESSON_COMPONENT, + ADDON_MOD_LESSON_DATA_SENT_EVENT, + ADDON_MOD_LESSON_OTHER_ANSWERS, + AddonModLessonJumpTo, + AddonModLessonPageType, + AddonModLessonPageSubtype, +} from '../constants'; +import { CoreGradeType } from '@features/grades/constants'; declare module '@singletons/events' { @@ -40,8 +47,8 @@ declare module '@singletons/events' { * @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation */ export interface CoreEventsData { - [AddonModLessonProvider.DATA_SENT_EVENT]: AddonModLessonDataSentData; - [AddonModLessonSyncProvider.AUTO_SYNCED]: AddonModLessonAutoSyncData; + [ADDON_MOD_LESSON_DATA_SENT_EVENT]: AddonModLessonDataSentData; + [ADDON_MOD_LESSON_AUTO_SYNCED]: AddonModLessonAutoSyncData; } } @@ -61,37 +68,9 @@ declare module '@singletons/events' { @Injectable({ providedIn: 'root' }) export class AddonModLessonProvider { - static readonly COMPONENT = 'mmaModLesson'; - static readonly DATA_SENT_EVENT = 'addon_mod_lesson_data_sent'; + protected static readonly ROOT_CACHE_KEY = 'mmaModLesson:'; - static readonly LESSON_THISPAGE = 0; // This page. - static readonly LESSON_UNSEENPAGE = 1; // Next page -> any page not seen before. - static readonly LESSON_UNANSWEREDPAGE = 2; // Next page -> any page not answered correctly. - static readonly LESSON_NEXTPAGE = -1; // Jump to Next Page. - static readonly LESSON_EOL = -9; // End of Lesson. - static readonly LESSON_UNSEENBRANCHPAGE = -50; // Jump to an unseen page within a branch and end of branch or end of lesson. - static readonly LESSON_RANDOMPAGE = -60; // Jump to a random page within a branch and end of branch or end of lesson. - static readonly LESSON_RANDOMBRANCH = -70; // Jump to a random Branch. - static readonly LESSON_CLUSTERJUMP = -80; // Cluster Jump. - - // Type of page: question or structure (content). - static readonly TYPE_QUESTION = 0; - static readonly TYPE_STRUCTURE = 1; - - // Type of question pages. - static readonly LESSON_PAGE_SHORTANSWER = 1; - static readonly LESSON_PAGE_TRUEFALSE = 2; - static readonly LESSON_PAGE_MULTICHOICE = 3; - static readonly LESSON_PAGE_MATCHING = 5; - static readonly LESSON_PAGE_NUMERICAL = 8; - static readonly LESSON_PAGE_ESSAY = 10; - static readonly LESSON_PAGE_BRANCHTABLE = 20; // Content page. - static readonly LESSON_PAGE_ENDOFBRANCH = 21; - static readonly LESSON_PAGE_CLUSTER = 30; - static readonly LESSON_PAGE_ENDOFCLUSTER = 31; - - static readonly MULTIANSWER_DELIMITER = '@^#|'; // Constant used as a delimiter when parsing multianswer questions. - static readonly LESSON_OTHER_ANSWERS = '@#wronganswer#@'; + protected static readonly MULTIANSWER_DELIMITER = '@^#|'; // Constant used as a delimiter when parsing multianswer questions. /** * Add an answer and its response to a feedback string (HTML). @@ -359,33 +338,33 @@ export class AddonModLessonProvider { }; switch (pageData.page!.qtype) { - case AddonModLessonProvider.LESSON_PAGE_BRANCHTABLE: + case AddonModLessonPageSubtype.BRANCHTABLE: // Load the new page immediately. result.inmediatejump = true; result.newpageid = this.getNewPageId(pageData.page!.id, data.jumpto, jumps); break; - case AddonModLessonProvider.LESSON_PAGE_ESSAY: + case AddonModLessonPageSubtype.ESSAY: this.checkAnswerEssay(pageData, data, result); break; - case AddonModLessonProvider.LESSON_PAGE_MATCHING: + case AddonModLessonPageSubtype.MATCHING: this.checkAnswerMatching(pageData, data, result); break; - case AddonModLessonProvider.LESSON_PAGE_MULTICHOICE: + case AddonModLessonPageSubtype.MULTICHOICE: this.checkAnswerMultichoice(lesson, pageData, data, pageIndex, result); break; - case AddonModLessonProvider.LESSON_PAGE_NUMERICAL: + case AddonModLessonPageSubtype.NUMERICAL: this.checkAnswerNumerical(lesson, pageData, data, pageIndex, result); break; - case AddonModLessonProvider.LESSON_PAGE_SHORTANSWER: + case AddonModLessonPageSubtype.SHORTANSWER: this.checkAnswerShort(lesson, pageData, data, pageIndex, result); break; - case AddonModLessonProvider.LESSON_PAGE_TRUEFALSE: + case AddonModLessonPageSubtype.TRUEFALSE: this.checkAnswerTruefalse(lesson, pageData, data, pageIndex, result); break; default: @@ -912,7 +891,7 @@ export class AddonModLessonProvider { // Double check that this is the OTHER_ANSWERS answer. if (typeof lastAnswer.answer == 'string' && - lastAnswer.answer.indexOf(AddonModLessonProvider.LESSON_OTHER_ANSWERS) != -1) { + lastAnswer.answer.indexOf(ADDON_MOD_LESSON_OTHER_ANSWERS) !== -1) { result.newpageid = lastAnswer.jumpto || 0; result.response = lastAnswer.response || ''; @@ -961,7 +940,7 @@ export class AddonModLessonProvider { const response = await this.finishRetakeOnline(lesson.id, options); - CoreEvents.trigger(AddonModLessonProvider.DATA_SENT_EVENT, { + CoreEvents.trigger(ADDON_MOD_LESSON_DATA_SENT_EVENT, { lessonId: lesson.id, type: 'finish', courseId: courseId, @@ -1128,7 +1107,7 @@ export class AddonModLessonProvider { this.addResultValueEolPage(result, 'displayscorewithoutessays', entryData, true); } - if (lesson.grade !== undefined && lesson.grade != CoreGradesProvider.TYPE_NONE) { + if (lesson.grade !== undefined && lesson.grade !== CoreGradeType.NONE) { entryData.grade = CoreTextUtils.roundToDecimals(gradeInfo.grade * lesson.grade / 100, 1); entryData.total = lesson.grade; this.addResultValueEolPage(result, 'yourcurrentgradeisoutof', entryData, true); @@ -1147,7 +1126,7 @@ export class AddonModLessonProvider { } } else { // Display for teacher. - if (lesson.grade != CoreGradesProvider.TYPE_NONE) { + if (lesson.grade !== CoreGradeType.NONE) { this.addResultValueEolPage(result, 'displayofgrade', true, true); } } @@ -1182,7 +1161,7 @@ export class AddonModLessonProvider { const preSets: CoreSiteWSPreSets = { cacheKey: this.getAccessInformationCacheKey(lessonId), updateFrequency: CoreSite.FREQUENCY_OFTEN, - component: AddonModLessonProvider.COMPONENT, + component: ADDON_MOD_LESSON_COMPONENT, componentId: options.cmId, ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. }; @@ -1197,7 +1176,7 @@ export class AddonModLessonProvider { * @returns Cache key. */ protected getAccessInformationCacheKey(lessonId: number): string { - return ROOT_CACHE_KEY + 'accessInfo:' + lessonId; + return AddonModLessonProvider.ROOT_CACHE_KEY + 'accessInfo:' + lessonId; } /** @@ -1213,7 +1192,7 @@ export class AddonModLessonProvider { retake: number, options: CoreCourseCommonModWSOptions = {}, ): Promise<{online: AddonModLessonWSContentPageViewed[]; offline: AddonModLessonPageAttemptRecord[]}> { - const type = AddonModLessonProvider.TYPE_STRUCTURE; + const type = AddonModLessonPageType.STRUCTURE; const [online, offline] = await Promise.all([ this.getContentPagesViewedOnline(lessonId, retake, options), @@ -1246,7 +1225,7 @@ export class AddonModLessonProvider { * @returns Cache key. */ protected getContentPagesViewedCommonCacheKey(lessonId: number): string { - return ROOT_CACHE_KEY + 'contentPagesViewed:' + lessonId; + return AddonModLessonProvider.ROOT_CACHE_KEY + 'contentPagesViewed:' + lessonId; } /** @@ -1298,7 +1277,7 @@ export class AddonModLessonProvider { }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getContentPagesViewedCacheKey(lessonId, retake), - component: AddonModLessonProvider.COMPONENT, + component: ADDON_MOD_LESSON_COMPONENT, componentId: options.cmId, ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. }; @@ -1431,7 +1410,7 @@ export class AddonModLessonProvider { const preSets: CoreSiteWSPreSets = { cacheKey: this.getLessonDataCacheKey(courseId), updateFrequency: CoreSite.FREQUENCY_RARELY, - component: AddonModLessonProvider.COMPONENT, + component: ADDON_MOD_LESSON_COMPONENT, ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. }; @@ -1469,7 +1448,7 @@ export class AddonModLessonProvider { * @returns Cache key. */ protected getLessonDataCacheKey(courseId: number): string { - return ROOT_CACHE_KEY + 'lesson:' + courseId; + return AddonModLessonProvider.ROOT_CACHE_KEY + 'lesson:' + courseId; } /** @@ -1492,7 +1471,7 @@ export class AddonModLessonProvider { }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getLessonWithPasswordCacheKey(lessonId), - component: AddonModLessonProvider.COMPONENT, + component: ADDON_MOD_LESSON_COMPONENT, componentId: options.cmId, ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. }; @@ -1525,7 +1504,7 @@ export class AddonModLessonProvider { * @returns Cache key. */ protected getLessonWithPasswordCacheKey(lessonId: number): string { - return ROOT_CACHE_KEY + 'lessonWithPswrd:' + lessonId; + return AddonModLessonProvider.ROOT_CACHE_KEY + 'lessonWithPswrd:' + lessonId; } /** @@ -1661,7 +1640,7 @@ export class AddonModLessonProvider { }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getPageDataCacheKey(lesson.id, pageId), - component: AddonModLessonProvider.COMPONENT, + component: ADDON_MOD_LESSON_COMPONENT, componentId: options.cmId, ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. }; @@ -1712,7 +1691,7 @@ export class AddonModLessonProvider { * @returns Cache key. */ protected getPageDataCommonCacheKey(lessonId: number): string { - return ROOT_CACHE_KEY + 'pageData:' + lessonId; + return AddonModLessonProvider.ROOT_CACHE_KEY + 'pageData:' + lessonId; } /** @@ -1732,7 +1711,7 @@ export class AddonModLessonProvider { const preSets: CoreSiteWSPreSets = { cacheKey: this.getPagesCacheKey(lessonId), updateFrequency: CoreSite.FREQUENCY_SOMETIMES, - component: AddonModLessonProvider.COMPONENT, + component: ADDON_MOD_LESSON_COMPONENT, componentId: options.cmId, ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. }; @@ -1753,7 +1732,7 @@ export class AddonModLessonProvider { * @returns Cache key. */ protected getPagesCacheKey(lessonId: number): string { - return ROOT_CACHE_KEY + 'pages:' + lessonId; + return AddonModLessonProvider.ROOT_CACHE_KEY + 'pages:' + lessonId; } /** @@ -1775,7 +1754,7 @@ export class AddonModLessonProvider { }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getPagesPossibleJumpsCacheKey(lessonId), - component: AddonModLessonProvider.COMPONENT, + component: ADDON_MOD_LESSON_COMPONENT, componentId: options.cmId, ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. }; @@ -1806,7 +1785,7 @@ export class AddonModLessonProvider { * @returns Cache key. */ protected getPagesPossibleJumpsCacheKey(lessonId: number): string { - return ROOT_CACHE_KEY + 'pagesJumps:' + lessonId; + return AddonModLessonProvider.ROOT_CACHE_KEY + 'pagesJumps:' + lessonId; } /** @@ -1905,7 +1884,7 @@ export class AddonModLessonProvider { const messages: AddonModLessonMessageWSData[] = []; if (!accessInfo.canmanage) { - if (page.qtype == AddonModLessonProvider.LESSON_PAGE_BRANCHTABLE && lesson.minquestions) { + if (page.qtype === AddonModLessonPageSubtype.BRANCHTABLE && lesson.minquestions) { // Tell student how many questions they have seen, how many are required and their grade. const retake = accessInfo.attemptscount; @@ -1923,7 +1902,7 @@ export class AddonModLessonProvider { if (!options.review && !lesson.retake) { this.addMessage(messages, 'addon.mod_lesson.numberofcorrectanswers', { $a: gradeInfo.earned }); - if (lesson.grade !== undefined && lesson.grade != CoreGradesProvider.TYPE_NONE) { + if (lesson.grade !== undefined && lesson.grade !== CoreGradeType.NONE) { this.addMessage(messages, 'addon.mod_lesson.yourcurrentgradeisoutof', { $a: { grade: CoreTextUtils.roundToDecimals(gradeInfo.grade * lesson.grade / 100, 1), total: lesson.grade, @@ -2001,7 +1980,7 @@ export class AddonModLessonProvider { * @returns Cache key. */ protected getQuestionsAttemptsCommonCacheKey(lessonId: number): string { - return ROOT_CACHE_KEY + 'questionsAttempts:' + lessonId; + return AddonModLessonProvider.ROOT_CACHE_KEY + 'questionsAttempts:' + lessonId; } /** @@ -2030,7 +2009,7 @@ export class AddonModLessonProvider { }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getQuestionsAttemptsCacheKey(lessonId, retake, userId), - component: AddonModLessonProvider.COMPONENT, + component: ADDON_MOD_LESSON_COMPONENT, componentId: options.cmId, ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. }; @@ -2081,7 +2060,7 @@ export class AddonModLessonProvider { const preSets = { cacheKey: this.getRetakesOverviewCacheKey(lessonId, groupId), updateFrequency: CoreSite.FREQUENCY_OFTEN, - component: AddonModLessonProvider.COMPONENT, + component: ADDON_MOD_LESSON_COMPONENT, componentId: options.cmId, ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. }; @@ -2113,7 +2092,7 @@ export class AddonModLessonProvider { * @returns Cache key. */ protected getRetakesOverviewCommonCacheKey(lessonId: number): string { - return ROOT_CACHE_KEY + 'retakesOverview:' + lessonId; + return AddonModLessonProvider.ROOT_CACHE_KEY + 'retakesOverview:' + lessonId; } /** @@ -2173,7 +2152,7 @@ export class AddonModLessonProvider { }; const preSets: CoreSiteWSPreSets = { cacheKey: this.getTimersCacheKey(lessonId, userId), - component: AddonModLessonProvider.COMPONENT, + component: ADDON_MOD_LESSON_COMPONENT, componentId: options.cmId, ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. }; @@ -2201,7 +2180,7 @@ export class AddonModLessonProvider { * @returns Cache key. */ protected getTimersCommonCacheKey(lessonId: number): string { - return ROOT_CACHE_KEY + 'timers:' + lessonId; + return AddonModLessonProvider.ROOT_CACHE_KEY + 'timers:' + lessonId; } /** @@ -2295,7 +2274,7 @@ export class AddonModLessonProvider { const preSets: CoreSiteWSPreSets = { cacheKey: this.getUserRetakeCacheKey(lessonId, userId, retake), updateFrequency: CoreSite.FREQUENCY_SOMETIMES, - component: AddonModLessonProvider.COMPONENT, + component: ADDON_MOD_LESSON_COMPONENT, componentId: options.cmId, ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. }; @@ -2333,7 +2312,7 @@ export class AddonModLessonProvider { * @returns Cache key. */ protected getUserRetakeLessonCacheKey(lessonId: number): string { - return ROOT_CACHE_KEY + 'userRetake:' + lessonId; + return AddonModLessonProvider.ROOT_CACHE_KEY + 'userRetake:' + lessonId; } /** @@ -2390,15 +2369,15 @@ export class AddonModLessonProvider { if (!jumpTo) { // Same page return false; - } else if (jumpTo == AddonModLessonProvider.LESSON_NEXTPAGE) { + } else if (jumpTo == AddonModLessonJumpTo.NEXTPAGE) { return true; - } else if (jumpTo == AddonModLessonProvider.LESSON_UNSEENBRANCHPAGE) { + } else if (jumpTo == AddonModLessonJumpTo.UNSEENBRANCHPAGE) { return true; - } else if (jumpTo == AddonModLessonProvider.LESSON_RANDOMPAGE) { + } else if (jumpTo == AddonModLessonJumpTo.RANDOMPAGE) { return true; - } else if (jumpTo == AddonModLessonProvider.LESSON_CLUSTERJUMP) { + } else if (jumpTo == AddonModLessonJumpTo.CLUSTERJUMP) { return true; - } else if (jumpTo == AddonModLessonProvider.LESSON_EOL) { + } else if (jumpTo == AddonModLessonJumpTo.EOL) { return true; } @@ -2719,7 +2698,7 @@ export class AddonModLessonProvider { * @returns True if question page, false if content page. */ isQuestionPage(type: number): boolean { - return type == AddonModLessonProvider.TYPE_QUESTION; + return type === AddonModLessonPageType.QUESTION; } /** @@ -2754,7 +2733,7 @@ export class AddonModLessonProvider { const response = await site.write('mod_lesson_launch_attempt', params); - CoreEvents.trigger(AddonModLessonProvider.DATA_SENT_EVENT, { + CoreEvents.trigger(ADDON_MOD_LESSON_DATA_SENT_EVENT, { lessonId: id, type: 'launch', }, CoreSites.getCurrentSiteId()); @@ -2769,7 +2748,7 @@ export class AddonModLessonProvider { * @returns True if left during timed, false otherwise. */ leftDuringTimed(info?: AddonModLessonGetAccessInformationWSResponse): boolean { - return !!(info?.lastpageseen && info.lastpageseen != AddonModLessonProvider.LESSON_EOL && info.leftduringtimedsession); + return !!(info?.lastpageseen && info.lastpageseen != AddonModLessonJumpTo.EOL && info.leftduringtimedsession); } /** @@ -2789,8 +2768,8 @@ export class AddonModLessonProvider { for (const jumpto in jumps[pageId]) { const jumptoNum = Number(jumpto); - if (jumptoNum == AddonModLessonProvider.LESSON_CLUSTERJUMP || - jumptoNum == AddonModLessonProvider.LESSON_UNSEENBRANCHPAGE) { + if (jumptoNum == AddonModLessonJumpTo.CLUSTERJUMP || + jumptoNum == AddonModLessonJumpTo.UNSEENBRANCHPAGE) { return true; } } @@ -2885,7 +2864,7 @@ export class AddonModLessonProvider { if (lesson.custom) { // If essay question, handle it, otherwise add to score. - if (options.pageIndex[lastAttempt.pageid].qtype == AddonModLessonProvider.LESSON_PAGE_ESSAY) { + if (options.pageIndex[lastAttempt.pageid].qtype === AddonModLessonPageSubtype.ESSAY) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const score: number | undefined = ( lastAttempt.useranswer)?.score; if (score !== undefined) { @@ -2902,7 +2881,7 @@ export class AddonModLessonProvider { }); // If essay question, increase numbers. - if (options.pageIndex[lastAttempt.pageid].qtype == AddonModLessonProvider.LESSON_PAGE_ESSAY) { + if (options.pageIndex[lastAttempt.pageid].qtype === AddonModLessonPageSubtype.ESSAY) { result.nmanual++; result.manualpoints++; } @@ -2967,7 +2946,7 @@ export class AddonModLessonProvider { await CoreCourseLogHelper.log( 'mod_lesson_view_lesson', params, - AddonModLessonProvider.COMPONENT, + ADDON_MOD_LESSON_COMPONENT, id, siteId, ); @@ -3002,7 +2981,7 @@ export class AddonModLessonProvider { if (!options.offline) { const response = await this.processPageOnline(lesson.id, pageId, data, options); - CoreEvents.trigger(AddonModLessonProvider.DATA_SENT_EVENT, { + CoreEvents.trigger(ADDON_MOD_LESSON_DATA_SENT_EVENT, { lessonId: lesson.id, type: 'process', courseId: courseId, @@ -3158,7 +3137,7 @@ export class AddonModLessonProvider { // Processes inmediate jumps. if (result.inmediatejump) { - if (pageData.page?.qtype == AddonModLessonProvider.LESSON_PAGE_BRANCHTABLE) { + if (pageData.page?.qtype === AddonModLessonPageSubtype.BRANCHTABLE) { // Store the content page data. In Moodle this is stored in a separate table, during checkAnswer. await AddonModLessonOffline.processPage( lesson.id, @@ -3204,7 +3183,7 @@ export class AddonModLessonProvider { if (lesson.maxattempts && lesson.maxattempts > 0 && nAttempts >= lesson.maxattempts) { result.maxattemptsreached = true; result.feedback = Translate.instant('addon.mod_lesson.maximumnumberofattemptsreached'); - result.newpageid = AddonModLessonProvider.LESSON_NEXTPAGE; + result.newpageid = AddonModLessonJumpTo.NEXTPAGE; return result; } @@ -3238,7 +3217,7 @@ export class AddonModLessonProvider { if (lesson.maxattempts > 1) { // Don't bother with message if only one attempt. result.maxattemptsreached = true; } - result.newpageid = AddonModLessonProvider.LESSON_NEXTPAGE; + result.newpageid = AddonModLessonJumpTo.NEXTPAGE; } else if (lesson.maxattempts && lesson.maxattempts > 1) { // Don't show message if only one attempt or unlimited. result.attemptsremaining = lesson.maxattempts - nAttempts; } @@ -3382,15 +3361,15 @@ export class AddonModLessonProvider { viewedPagesIds: number[], ): number { - if (page.qtype != AddonModLessonProvider.LESSON_PAGE_ENDOFCLUSTER && - page.qtype != AddonModLessonProvider.LESSON_PAGE_ENDOFBRANCH) { + if (page.qtype !== AddonModLessonPageSubtype.ENDOFCLUSTER && + page.qtype !== AddonModLessonPageSubtype.ENDOFBRANCH) { // Add this page as a valid page. validPages[page.id] = 1; } - if (page.qtype == AddonModLessonProvider.LESSON_PAGE_CLUSTER) { + if (page.qtype === AddonModLessonPageSubtype.CLUSTER) { // Get list of pages in the cluster. - const subPages = this.getSubpagesOf(pages, page.id, [AddonModLessonProvider.LESSON_PAGE_ENDOFCLUSTER]); + const subPages = this.getSubpagesOf(pages, page.id, [AddonModLessonPageSubtype.ENDOFCLUSTER]); subPages.forEach((subPage) => { const position = viewedPagesIds.indexOf(subPage.id); @@ -3817,7 +3796,7 @@ export type AddonModLessonPageWSData = { lessonid: number; // The id of the lesson this page belongs to. prevpageid: number; // The id of the page before this one. nextpageid: number; // The id of the next page in the page sequence. - qtype: number; // Identifies the page type of this page. + qtype: AddonModLessonPageSubtype; // Identifies the page type of this page. qoption: number; // Used to record page type specific options. layout: number; // Used to record page specific layout selections. display: number; // Used to record page specific display selections. @@ -3827,7 +3806,7 @@ export type AddonModLessonPageWSData = { contents?: string; // The contents of this page. contentsformat?: number; // Contents format (1 = HTML, 0 = MOODLE, 2 = PLAIN or 4 = MARKDOWN). displayinmenublock: boolean; // Toggles display in the left menu block. - type: number; // The type of the page [question | structure]. + type: AddonModLessonPageType; // The type of the page [question | structure]. typeid: number; // The unique identifier for the page type. typestring: string; // The string that describes this page type. }; diff --git a/src/core/features/grades/constants.ts b/src/core/features/grades/constants.ts new file mode 100644 index 000000000..141ffae54 --- /dev/null +++ b/src/core/features/grades/constants.ts @@ -0,0 +1,20 @@ +// (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. + +export const enum CoreGradeType { + NONE = 0, // Moodle's GRADE_TYPE_NONE. + VALUE = 1, // Moodle's GRADE_TYPE_VALUE. + SCALE = 2, // Moodle's GRADE_TYPE_SCALE. + TEXT = 3, // Moodle's GRADE_TYPE_TEXT. +} diff --git a/src/core/features/grades/services/grades.ts b/src/core/features/grades/services/grades.ts index 789fe0df2..24e8a3c86 100644 --- a/src/core/features/grades/services/grades.ts +++ b/src/core/features/grades/services/grades.ts @@ -21,6 +21,7 @@ import { CoreWSExternalWarning } from '@services/ws'; import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; import { CoreError } from '@classes/errors/error'; import { SafeNumber } from '@/core/utils/types'; +import { CoreGradeType } from '../constants'; /** * Service to provide grade functionalities. @@ -28,12 +29,12 @@ import { SafeNumber } from '@/core/utils/types'; @Injectable({ providedIn: 'root' }) export class CoreGradesProvider { - static readonly TYPE_NONE = 0; // Moodle's GRADE_TYPE_NONE. - static readonly TYPE_VALUE = 1; // Moodle's GRADE_TYPE_VALUE. - static readonly TYPE_SCALE = 2; // Moodle's GRADE_TYPE_SCALE. - static readonly TYPE_TEXT = 3; // Moodle's GRADE_TYPE_TEXT. + static readonly TYPE_NONE = CoreGradeType.NONE; + static readonly TYPE_VALUE = CoreGradeType.VALUE; + static readonly TYPE_SCALE = CoreGradeType.SCALE; + static readonly TYPE_TEXT = CoreGradeType.TEXT; - protected readonly ROOT_CACHE_KEY = 'mmGrades:'; + protected static readonly ROOT_CACHE_KEY = 'mmGrades:'; protected logger: CoreLogger; @@ -73,7 +74,7 @@ export class CoreGradesProvider { * @returns Cache key. */ protected getCourseGradesPrefixCacheKey(courseId: number): string { - return this.ROOT_CACHE_KEY + 'items:' + courseId + ':'; + return CoreGradesProvider.ROOT_CACHE_KEY + 'items:' + courseId + ':'; } /** @@ -92,7 +93,7 @@ export class CoreGradesProvider { * @returns Cache key. */ protected getCoursesGradesCacheKey(): string { - return this.ROOT_CACHE_KEY + 'coursesgrades'; + return CoreGradesProvider.ROOT_CACHE_KEY + 'coursesgrades'; } /**