MOBILE-4616 lesson: Move lesson constants to a file
This commit is contained in:
		
							parent
							
								
									af4e07df36
								
							
						
					
					
						commit
						62f097dc92
					
				| @ -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<void> { | ||||
|         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}`, | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										54
									
								
								src/addons/mod/lesson/constants.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								src/addons/mod/lesson/constants.ts
									
									
									
									
									
										Normal file
									
								
							| @ -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#@'; | ||||
| @ -53,4 +53,4 @@ const routes: Routes = [ | ||||
|         AddonModLessonUserRetakePage, | ||||
|     ], | ||||
| }) | ||||
| export class AddonModLessonLazyModule {} | ||||
| export default class AddonModLessonLazyModule {} | ||||
|  | ||||
| @ -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); | ||||
|             }, | ||||
|         }, | ||||
|     ], | ||||
|  | ||||
| @ -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<void> { | ||||
|         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(); | ||||
|         } | ||||
|  | ||||
| @ -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.
 | ||||
|  | ||||
| @ -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, | ||||
|                     }, | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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; | ||||
|                 } | ||||
| 
 | ||||
|  | ||||
| @ -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) { | ||||
|  | ||||
| @ -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); | ||||
| 
 | ||||
| /** | ||||
|  | ||||
| @ -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<AddonModLessonPageAttemptRecord[]> { | ||||
|         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); | ||||
|         } | ||||
|  | ||||
| @ -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<AddonModLessonSyncResult> { | ||||
| 
 | ||||
|     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<AddonModLessonSyncResult> { | ||||
|         // Sync offline logs.
 | ||||
|         await CoreUtils.ignoreErrors( | ||||
|             CoreCourseLogHelper.syncActivity(AddonModLessonProvider.COMPONENT, lessonId, siteId), | ||||
|             CoreCourseLogHelper.syncActivity(ADDON_MOD_LESSON_COMPONENT, lessonId, siteId), | ||||
|         ); | ||||
| 
 | ||||
|         const result: AddonModLessonSyncResult = { | ||||
|  | ||||
| @ -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, <number> 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<AddonModLessonLaunchAttemptWSResponse>('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 = (<any> 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 = <AddonModLessonProcessPageResponse> 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.
 | ||||
| }; | ||||
|  | ||||
							
								
								
									
										20
									
								
								src/core/features/grades/constants.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								src/core/features/grades/constants.ts
									
									
									
									
									
										Normal file
									
								
							| @ -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.
 | ||||
| } | ||||
| @ -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'; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user