@vived/app 6.3.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/cjs/Procedure/Adapters/procedureAdapter.js +1 -0
  2. package/dist/cjs/Procedure/Adapters/procedureAdapter.js.map +1 -1
  3. package/dist/cjs/Procedure/Entities/ProcedureEntity.js +9 -0
  4. package/dist/cjs/Procedure/Entities/ProcedureEntity.js.map +1 -1
  5. package/dist/cjs/Procedure/Factories/ProcedureFeatureFactory.js +2 -0
  6. package/dist/cjs/Procedure/Factories/ProcedureFeatureFactory.js.map +1 -1
  7. package/dist/cjs/Procedure/Mocks/MockProcedureEntity.js +7 -0
  8. package/dist/cjs/Procedure/Mocks/MockProcedureEntity.js.map +1 -1
  9. package/dist/cjs/Procedure/PM/ProcedurePM.js +3 -0
  10. package/dist/cjs/Procedure/PM/ProcedurePM.js.map +1 -1
  11. package/dist/cjs/Procedure/PM/ProcedurePM.test.js +2 -0
  12. package/dist/cjs/Procedure/PM/ProcedurePM.test.js.map +1 -1
  13. package/dist/cjs/Procedure/UCs/RecordProcedureSessionUC.js +133 -0
  14. package/dist/cjs/Procedure/UCs/RecordProcedureSessionUC.js.map +1 -0
  15. package/dist/cjs/Procedure/UCs/RecordProcedureSessionUC.test.js +283 -0
  16. package/dist/cjs/Procedure/UCs/RecordProcedureSessionUC.test.js.map +1 -0
  17. package/dist/cjs/Procedure/UCs/SerializeProcedure.js +2 -1
  18. package/dist/cjs/Procedure/UCs/SerializeProcedure.js.map +1 -1
  19. package/dist/cjs/Procedure/UCs/index.js +1 -0
  20. package/dist/cjs/Procedure/UCs/index.js.map +1 -1
  21. package/dist/cjs/Procedure/types.js +2 -0
  22. package/dist/cjs/Procedure/types.js.map +1 -1
  23. package/dist/esm/Procedure/Adapters/procedureAdapter.js +1 -0
  24. package/dist/esm/Procedure/Adapters/procedureAdapter.js.map +1 -1
  25. package/dist/esm/Procedure/Entities/ProcedureEntity.js +9 -0
  26. package/dist/esm/Procedure/Entities/ProcedureEntity.js.map +1 -1
  27. package/dist/esm/Procedure/Factories/ProcedureFeatureFactory.js +2 -0
  28. package/dist/esm/Procedure/Factories/ProcedureFeatureFactory.js.map +1 -1
  29. package/dist/esm/Procedure/Mocks/MockProcedureEntity.js +7 -0
  30. package/dist/esm/Procedure/Mocks/MockProcedureEntity.js.map +1 -1
  31. package/dist/esm/Procedure/PM/ProcedurePM.js +3 -0
  32. package/dist/esm/Procedure/PM/ProcedurePM.js.map +1 -1
  33. package/dist/esm/Procedure/PM/ProcedurePM.test.js +2 -0
  34. package/dist/esm/Procedure/PM/ProcedurePM.test.js.map +1 -1
  35. package/dist/esm/Procedure/UCs/RecordProcedureSessionUC.js +128 -0
  36. package/dist/esm/Procedure/UCs/RecordProcedureSessionUC.js.map +1 -0
  37. package/dist/esm/Procedure/UCs/RecordProcedureSessionUC.test.js +281 -0
  38. package/dist/esm/Procedure/UCs/RecordProcedureSessionUC.test.js.map +1 -0
  39. package/dist/esm/Procedure/UCs/SerializeProcedure.js +2 -1
  40. package/dist/esm/Procedure/UCs/SerializeProcedure.js.map +1 -1
  41. package/dist/esm/Procedure/UCs/index.js +1 -0
  42. package/dist/esm/Procedure/UCs/index.js.map +1 -1
  43. package/dist/esm/Procedure/types.js +1 -1
  44. package/dist/esm/Procedure/types.js.map +1 -1
  45. package/dist/types/Procedure/Adapters/procedureAdapter.d.ts.map +1 -1
  46. package/dist/types/Procedure/Entities/ProcedureEntity.d.ts +2 -0
  47. package/dist/types/Procedure/Entities/ProcedureEntity.d.ts.map +1 -1
  48. package/dist/types/Procedure/Factories/ProcedureFeatureFactory.d.ts.map +1 -1
  49. package/dist/types/Procedure/Mocks/MockProcedureEntity.d.ts +3 -0
  50. package/dist/types/Procedure/Mocks/MockProcedureEntity.d.ts.map +1 -1
  51. package/dist/types/Procedure/UCs/RecordProcedureSessionUC.d.ts +9 -0
  52. package/dist/types/Procedure/UCs/RecordProcedureSessionUC.d.ts.map +1 -0
  53. package/dist/types/Procedure/UCs/RecordProcedureSessionUC.test.d.ts +2 -0
  54. package/dist/types/Procedure/UCs/RecordProcedureSessionUC.test.d.ts.map +1 -0
  55. package/dist/types/Procedure/UCs/SerializeProcedure.d.ts.map +1 -1
  56. package/dist/types/Procedure/UCs/index.d.ts +1 -0
  57. package/dist/types/Procedure/UCs/index.d.ts.map +1 -1
  58. package/dist/types/Procedure/types.d.ts +2 -0
  59. package/dist/types/Procedure/types.d.ts.map +1 -1
  60. package/package.json +1 -1
  61. package/src/Procedure/CONTEXT.md +21 -0
@@ -9,6 +9,7 @@ class ProcedureAdapter {
9
9
  orderMatters: true,
10
10
  showHints: true,
11
11
  isQuiz: false,
12
+ isRecording: false,
12
13
  userEventLog: [],
13
14
  currentStepIndex: 0,
14
15
  isComplete: false,
@@ -1 +1 @@
1
- {"version":3,"file":"procedureAdapter.js","sourceRoot":"","sources":["../../../../src/Procedure/Adapters/procedureAdapter.ts"],"names":[],"mappings":";;;AACA,mDAAgD;AAGhD,MAAM,gBAAgB;IAAtB;QACE,cAAS,GAAgB;YACvB,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,KAAK;YACb,YAAY,EAAE,EAAE;YAChB,gBAAgB,EAAE,CAAC;YACnB,UAAU,EAAE,KAAK;YACjB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,IAAI;YACvB,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,EAAE;YACnB,0BAA0B,EACxB,mDAAmD;YACrD,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,KAAK;SACnB,CAAC;IAmBJ,CAAC;IAjBC,SAAS,CAAC,UAAyB,EAAE,KAAgC;QACnE,MAAM,WAAW,GAAG,yBAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,WAAW,CAAC,MAAM;gBAAE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,WAAW,CACT,UAAyB,EACzB,KAAgC;QAEhC,MAAM,WAAW,GAAG,yBAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;CACF;AAEY,QAAA,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC","sourcesContent":["import { SingletonPmAdapter, AppObjectRepo } from \"@vived/core\";\r\nimport { ProcedurePM } from \"../PM/ProcedurePM\";\r\nimport { ProcedureVM } from \"../types\";\r\n\r\nclass ProcedureAdapter implements SingletonPmAdapter<ProcedureVM> {\r\n defaultVM: ProcedureVM = {\r\n eventIds: [],\r\n orderMatters: true,\r\n showHints: true,\r\n isQuiz: false,\r\n userEventLog: [],\r\n currentStepIndex: 0,\r\n isComplete: false,\r\n validationMessage: null,\r\n nextExpectedEvent: null,\r\n progressPercentage: 0,\r\n availableEvents: [],\r\n authoringValidationMessage:\r\n \"At least one event must be added to the procedure\",\r\n score: null,\r\n isSubmitted: false,\r\n };\r\n\r\n subscribe(appObjects: AppObjectRepo, setVM: (vm: ProcedureVM) => void): void {\r\n const procedurePM = ProcedurePM.get(appObjects);\r\n if (procedurePM) {\r\n procedurePM.addView(setVM);\r\n if (procedurePM.lastVM) setVM(procedurePM.lastVM);\r\n }\r\n }\r\n\r\n unsubscribe(\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: ProcedureVM) => void,\r\n ): void {\r\n const procedurePM = ProcedurePM.get(appObjects);\r\n if (procedurePM) {\r\n procedurePM.removeView(setVM);\r\n }\r\n }\r\n}\r\n\r\nexport const procedureAdapter = new ProcedureAdapter();\r\n"]}
1
+ {"version":3,"file":"procedureAdapter.js","sourceRoot":"","sources":["../../../../src/Procedure/Adapters/procedureAdapter.ts"],"names":[],"mappings":";;;AACA,mDAAgD;AAGhD,MAAM,gBAAgB;IAAtB;QACE,cAAS,GAAgB;YACvB,QAAQ,EAAE,EAAE;YACZ,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,KAAK;YACb,WAAW,EAAE,KAAK;YAClB,YAAY,EAAE,EAAE;YAChB,gBAAgB,EAAE,CAAC;YACnB,UAAU,EAAE,KAAK;YACjB,iBAAiB,EAAE,IAAI;YACvB,iBAAiB,EAAE,IAAI;YACvB,kBAAkB,EAAE,CAAC;YACrB,eAAe,EAAE,EAAE;YACnB,0BAA0B,EACxB,mDAAmD;YACrD,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,KAAK;SACnB,CAAC;IAmBJ,CAAC;IAjBC,SAAS,CAAC,UAAyB,EAAE,KAAgC;QACnE,MAAM,WAAW,GAAG,yBAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,WAAW,CAAC,MAAM;gBAAE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,WAAW,CACT,UAAyB,EACzB,KAAgC;QAEhC,MAAM,WAAW,GAAG,yBAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;CACF;AAEY,QAAA,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC","sourcesContent":["import { SingletonPmAdapter, AppObjectRepo } from \"@vived/core\";\r\nimport { ProcedurePM } from \"../PM/ProcedurePM\";\r\nimport { ProcedureVM } from \"../types\";\r\n\r\nclass ProcedureAdapter implements SingletonPmAdapter<ProcedureVM> {\r\n defaultVM: ProcedureVM = {\r\n eventIds: [],\r\n orderMatters: true,\r\n showHints: true,\r\n isQuiz: false,\r\n isRecording: false,\r\n userEventLog: [],\r\n currentStepIndex: 0,\r\n isComplete: false,\r\n validationMessage: null,\r\n nextExpectedEvent: null,\r\n progressPercentage: 0,\r\n availableEvents: [],\r\n authoringValidationMessage:\r\n \"At least one event must be added to the procedure\",\r\n score: null,\r\n isSubmitted: false,\r\n };\r\n\r\n subscribe(appObjects: AppObjectRepo, setVM: (vm: ProcedureVM) => void): void {\r\n const procedurePM = ProcedurePM.get(appObjects);\r\n if (procedurePM) {\r\n procedurePM.addView(setVM);\r\n if (procedurePM.lastVM) setVM(procedurePM.lastVM);\r\n }\r\n }\r\n\r\n unsubscribe(\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: ProcedureVM) => void,\r\n ): void {\r\n const procedurePM = ProcedurePM.get(appObjects);\r\n if (procedurePM) {\r\n procedurePM.removeView(setVM);\r\n }\r\n }\r\n}\r\n\r\nexport const procedureAdapter = new ProcedureAdapter();\r\n"]}
@@ -185,6 +185,13 @@ class ProcedureEntityImp extends ProcedureEntity {
185
185
  this._isQuiz = isQuiz;
186
186
  this.updateState();
187
187
  }
188
+ get isRecording() {
189
+ return this._isRecording;
190
+ }
191
+ setIsRecording(value) {
192
+ this._isRecording = value;
193
+ this.updateState();
194
+ }
188
195
  getProgressPercentage() {
189
196
  if (this._eventIds.length === 0)
190
197
  return 0;
@@ -257,6 +264,7 @@ class ProcedureEntityImp extends ProcedureEntity {
257
264
  validationMessage: this._validationMessage,
258
265
  score: this._score,
259
266
  isSubmitted: this._isSubmitted,
267
+ isRecording: this._isRecording,
260
268
  });
261
269
  this.memoizedState.val = stateHash;
262
270
  }
@@ -266,6 +274,7 @@ class ProcedureEntityImp extends ProcedureEntity {
266
274
  this._orderMatters = true;
267
275
  this._showHints = true;
268
276
  this._isQuiz = false;
277
+ this._isRecording = false;
269
278
  this._userEventLog = [];
270
279
  this._currentStepIndex = 0;
271
280
  this._validationMessage = null;
@@ -1 +1 @@
1
- {"version":3,"file":"ProcedureEntity.js","sourceRoot":"","sources":["../../../../src/Procedure/Entities/ProcedureEntity.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo,\r\n getSingletonComponent,\r\n MemoizedString,\r\n} from \"@vived/core\";\r\nimport { Challenge } from \"../../Challenge\";\r\n\r\nexport abstract class ProcedureEntity\r\n extends AppObjectEntity\r\n implements Challenge\r\n{\r\n static readonly type = \"ProcedureEntity\";\r\n\r\n readonly challengeID = \"PROCEDURE\";\r\n name = \"Procedure\";\r\n abstract get helpHeading(): string;\r\n abstract get consumerHelpText(): string;\r\n authorHelpText =\r\n \"Create step-by-step procedures by selecting events that users must emit.\";\r\n\r\n abstract get eventIds(): string[];\r\n abstract get orderMatters(): boolean;\r\n abstract get showHints(): boolean;\r\n abstract get isQuiz(): boolean;\r\n abstract get userEventLog(): string[];\r\n abstract get currentStepIndex(): number;\r\n abstract get isComplete(): boolean;\r\n abstract get validationMessage(): string | null;\r\n abstract get score(): {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null;\r\n abstract get isSubmitted(): boolean;\r\n\r\n abstract addEventId(eventId: string): void;\r\n abstract removeEventId(eventId: string): void;\r\n abstract clearEventIds(): void;\r\n abstract recordUserEvent(eventId: string): void;\r\n abstract validateProgress(): string | null;\r\n abstract getNextExpectedEvent(): string | null;\r\n abstract reset(): void;\r\n abstract moveEventUp(index: number): void;\r\n abstract moveEventDown(index: number): void;\r\n abstract getAuthoringValidationMessage(): string | null;\r\n\r\n abstract setOrderMatters(orderMatters: boolean): void;\r\n abstract setShowHints(showHints: boolean): void;\r\n abstract setIsQuiz(isQuiz: boolean): void;\r\n\r\n abstract getProgressPercentage(): number;\r\n abstract calculateScore(): {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n };\r\n abstract submit(): void;\r\n\r\n static get = (appObjects: AppObjectRepo): ProcedureEntity | undefined =>\r\n getSingletonComponent(ProcedureEntity.type, appObjects);\r\n}\r\n\r\nexport function makeProcedureEntity(appObject: AppObject): ProcedureEntity {\r\n return new ProcedureEntityImp(appObject);\r\n}\r\n\r\nclass ProcedureEntityImp extends ProcedureEntity {\r\n private _eventIds: string[] = [];\r\n private _orderMatters = true;\r\n private _showHints = true;\r\n private _isQuiz = false;\r\n private _userEventLog: string[] = [];\r\n private _currentStepIndex = 0;\r\n private _validationMessage: string | null = null;\r\n private _score: {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null = null;\r\n private _isSubmitted = false;\r\n\r\n get helpHeading(): string {\r\n if (this._isQuiz) return \"Procedure Challenge\";\r\n else return \"Procedure Training\";\r\n }\r\n\r\n get consumerHelpText(): string {\r\n if (this._isQuiz)\r\n return \"Complete the procedure challenge on your own and get scored after submitting.\";\r\n else return \"Follow the steps in order to complete the training procedure.\";\r\n }\r\n\r\n private memoizedState = new MemoizedString(\"\", this.notifyOnChange);\r\n\r\n get eventIds(): string[] {\r\n return [...this._eventIds];\r\n }\r\n\r\n get orderMatters(): boolean {\r\n return this._orderMatters;\r\n }\r\n\r\n get showHints(): boolean {\r\n return this._showHints;\r\n }\r\n\r\n get isQuiz(): boolean {\r\n return this._isQuiz;\r\n }\r\n\r\n get userEventLog(): string[] {\r\n return [...this._userEventLog];\r\n }\r\n\r\n get currentStepIndex(): number {\r\n return this._currentStepIndex;\r\n }\r\n\r\n get isComplete(): boolean {\r\n if (this._eventIds.length === 0) return false;\r\n\r\n if (this._orderMatters) {\r\n return this._currentStepIndex >= this._eventIds.length;\r\n } else {\r\n const requiredEvents = new Set(this._eventIds);\r\n const emittedEvents = new Set(this._userEventLog);\r\n return Array.from(requiredEvents).every((event) =>\r\n emittedEvents.has(event),\r\n );\r\n }\r\n }\r\n\r\n get validationMessage(): string | null {\r\n return this._validationMessage;\r\n }\r\n\r\n get score(): {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null {\r\n return this._score;\r\n }\r\n\r\n get isSubmitted(): boolean {\r\n return this._isSubmitted;\r\n }\r\n\r\n addEventId(eventId: string): void {\r\n if (this._eventIds.includes(eventId)) {\r\n this._validationMessage = `Event '${eventId}' is already in the procedure`;\r\n this.updateState();\r\n return;\r\n }\r\n\r\n this._eventIds.push(eventId);\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n removeEventId(eventId: string): void {\r\n const index = this._eventIds.indexOf(eventId);\r\n if (index === -1) {\r\n this._validationMessage = `Event '${eventId}' is not in the procedure`;\r\n this.updateState();\r\n return;\r\n }\r\n\r\n this._eventIds.splice(index, 1);\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n clearEventIds(): void {\r\n this._eventIds = [];\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n moveEventUp(index: number): void {\r\n if (index <= 0 || index >= this._eventIds.length) {\r\n this._validationMessage = \"Cannot move event up - invalid position\";\r\n this.updateState();\r\n return;\r\n }\r\n\r\n const temp = this._eventIds[index];\r\n this._eventIds[index] = this._eventIds[index - 1];\r\n this._eventIds[index - 1] = temp;\r\n\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n moveEventDown(index: number): void {\r\n if (index < 0 || index >= this._eventIds.length - 1) {\r\n this._validationMessage = \"Cannot move event down - invalid position\";\r\n this.updateState();\r\n return;\r\n }\r\n\r\n const temp = this._eventIds[index];\r\n this._eventIds[index] = this._eventIds[index + 1];\r\n this._eventIds[index + 1] = temp;\r\n\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n recordUserEvent(eventId: string): void {\r\n if (!this._eventIds.includes(eventId)) {\r\n return;\r\n }\r\n\r\n this._userEventLog.push(eventId);\r\n\r\n if (this._orderMatters) {\r\n if (this._currentStepIndex < this._eventIds.length) {\r\n const expectedEvent = this._eventIds[this._currentStepIndex];\r\n if (eventId === expectedEvent) {\r\n this._currentStepIndex++;\r\n this._validationMessage = null;\r\n } else {\r\n this._validationMessage = `Expected '${expectedEvent}', but got '${eventId}'`;\r\n }\r\n }\r\n }\r\n\r\n this.updateState();\r\n }\r\n\r\n validateProgress(): string | null {\r\n if (this._eventIds.length === 0) {\r\n return \"At least one event must be added to the procedure\";\r\n }\r\n\r\n if (this.isComplete) {\r\n return null;\r\n }\r\n\r\n if (this._orderMatters && this._validationMessage) {\r\n return this._validationMessage;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getNextExpectedEvent(): string | null {\r\n if (!this._showHints || this._eventIds.length === 0) {\r\n return null;\r\n }\r\n\r\n if (this._orderMatters) {\r\n if (this._currentStepIndex < this._eventIds.length) {\r\n return this._eventIds[this._currentStepIndex];\r\n }\r\n } else {\r\n const emittedEvents = new Set(this._userEventLog);\r\n return (\r\n this._eventIds.find((eventId) => !emittedEvents.has(eventId)) || null\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n reset(): void {\r\n this._userEventLog = [];\r\n this._currentStepIndex = 0;\r\n this._validationMessage = null;\r\n this._score = null;\r\n this._isSubmitted = false;\r\n this.updateState();\r\n }\r\n\r\n setOrderMatters(orderMatters: boolean): void {\r\n this._orderMatters = orderMatters;\r\n this.updateState();\r\n }\r\n\r\n setShowHints(showHints: boolean): void {\r\n this._showHints = showHints;\r\n this.updateState();\r\n }\r\n\r\n setIsQuiz(isQuiz: boolean): void {\r\n this._isQuiz = isQuiz;\r\n this.updateState();\r\n }\r\n\r\n getProgressPercentage(): number {\r\n if (this._eventIds.length === 0) return 0;\r\n\r\n if (this._orderMatters) {\r\n return Math.round((this._currentStepIndex / this._eventIds.length) * 100);\r\n } else {\r\n const requiredEvents = new Set(this._eventIds);\r\n const emittedEvents = new Set(this._userEventLog);\r\n const completedCount = Array.from(requiredEvents).filter((event) =>\r\n emittedEvents.has(event),\r\n ).length;\r\n return Math.round((completedCount / this._eventIds.length) * 100);\r\n }\r\n }\r\n\r\n calculateScore(): {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } {\r\n if (this._eventIds.length === 0) {\r\n return { percentage: 0, comparison: [] };\r\n }\r\n\r\n const comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[] = [];\r\n let correctCount = 0;\r\n\r\n if (this._orderMatters) {\r\n for (let i = 0; i < this._eventIds.length; i++) {\r\n const eventId = this._eventIds[i];\r\n const expected = true;\r\n const actual =\r\n i < this._userEventLog.length && this._userEventLog[i] === eventId;\r\n const correct = actual;\r\n\r\n comparison.push({ eventId, expected, actual, correct });\r\n if (correct) correctCount++;\r\n }\r\n } else {\r\n const emittedEvents = new Set(this._userEventLog);\r\n for (const eventId of this._eventIds) {\r\n const expected = true;\r\n const actual = emittedEvents.has(eventId);\r\n const correct = actual;\r\n\r\n comparison.push({ eventId, expected, actual, correct });\r\n if (correct) correctCount++;\r\n }\r\n }\r\n\r\n const percentage = Math.round(\r\n (correctCount / this._eventIds.length) * 100,\r\n );\r\n return { percentage, comparison };\r\n }\r\n\r\n submit(): void {\r\n if (!this._isQuiz) {\r\n this._validationMessage = \"Cannot submit: not in quiz mode\";\r\n this.updateState();\r\n return;\r\n }\r\n\r\n this._score = this.calculateScore();\r\n this._isSubmitted = true;\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n getAuthoringValidationMessage(): string | null {\r\n if (this._eventIds.length === 0) {\r\n return \"At least one event must be added to the procedure\";\r\n }\r\n return this._validationMessage;\r\n }\r\n\r\n private updateState(): void {\r\n const stateHash = JSON.stringify({\r\n eventIds: this._eventIds,\r\n orderMatters: this._orderMatters,\r\n showHints: this._showHints,\r\n isQuiz: this._isQuiz,\r\n userEventLog: this._userEventLog,\r\n currentStepIndex: this._currentStepIndex,\r\n validationMessage: this._validationMessage,\r\n score: this._score,\r\n isSubmitted: this._isSubmitted,\r\n });\r\n\r\n this.memoizedState.val = stateHash;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ProcedureEntity.type);\r\n this.appObjects.registerSingleton(this);\r\n this.updateState();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ProcedureEntity.js","sourceRoot":"","sources":["../../../../src/Procedure/Entities/ProcedureEntity.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo,\r\n getSingletonComponent,\r\n MemoizedString,\r\n} from \"@vived/core\";\r\nimport { Challenge } from \"../../Challenge\";\r\n\r\nexport abstract class ProcedureEntity\r\n extends AppObjectEntity\r\n implements Challenge\r\n{\r\n static readonly type = \"ProcedureEntity\";\r\n\r\n readonly challengeID = \"PROCEDURE\";\r\n name = \"Procedure\";\r\n abstract get helpHeading(): string;\r\n abstract get consumerHelpText(): string;\r\n authorHelpText =\r\n \"Create step-by-step procedures by selecting events that users must emit.\";\r\n\r\n abstract get eventIds(): string[];\r\n abstract get orderMatters(): boolean;\r\n abstract get showHints(): boolean;\r\n abstract get isQuiz(): boolean;\r\n abstract get userEventLog(): string[];\r\n abstract get currentStepIndex(): number;\r\n abstract get isComplete(): boolean;\r\n abstract get validationMessage(): string | null;\r\n abstract get score(): {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null;\r\n abstract get isSubmitted(): boolean;\r\n\r\n abstract addEventId(eventId: string): void;\r\n abstract removeEventId(eventId: string): void;\r\n abstract clearEventIds(): void;\r\n abstract recordUserEvent(eventId: string): void;\r\n abstract validateProgress(): string | null;\r\n abstract getNextExpectedEvent(): string | null;\r\n abstract reset(): void;\r\n abstract moveEventUp(index: number): void;\r\n abstract moveEventDown(index: number): void;\r\n abstract getAuthoringValidationMessage(): string | null;\r\n\r\n abstract setOrderMatters(orderMatters: boolean): void;\r\n abstract setShowHints(showHints: boolean): void;\r\n abstract setIsQuiz(isQuiz: boolean): void;\r\n\r\n abstract get isRecording(): boolean;\r\n abstract setIsRecording(value: boolean): void;\r\n\r\n abstract getProgressPercentage(): number;\r\n abstract calculateScore(): {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n };\r\n abstract submit(): void;\r\n\r\n static get = (appObjects: AppObjectRepo): ProcedureEntity | undefined =>\r\n getSingletonComponent(ProcedureEntity.type, appObjects);\r\n}\r\n\r\nexport function makeProcedureEntity(appObject: AppObject): ProcedureEntity {\r\n return new ProcedureEntityImp(appObject);\r\n}\r\n\r\nclass ProcedureEntityImp extends ProcedureEntity {\r\n private _eventIds: string[] = [];\r\n private _orderMatters = true;\r\n private _showHints = true;\r\n private _isQuiz = false;\r\n private _isRecording = false;\r\n private _userEventLog: string[] = [];\r\n private _currentStepIndex = 0;\r\n private _validationMessage: string | null = null;\r\n private _score: {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null = null;\r\n private _isSubmitted = false;\r\n\r\n get helpHeading(): string {\r\n if (this._isQuiz) return \"Procedure Challenge\";\r\n else return \"Procedure Training\";\r\n }\r\n\r\n get consumerHelpText(): string {\r\n if (this._isQuiz)\r\n return \"Complete the procedure challenge on your own and get scored after submitting.\";\r\n else return \"Follow the steps in order to complete the training procedure.\";\r\n }\r\n\r\n private memoizedState = new MemoizedString(\"\", this.notifyOnChange);\r\n\r\n get eventIds(): string[] {\r\n return [...this._eventIds];\r\n }\r\n\r\n get orderMatters(): boolean {\r\n return this._orderMatters;\r\n }\r\n\r\n get showHints(): boolean {\r\n return this._showHints;\r\n }\r\n\r\n get isQuiz(): boolean {\r\n return this._isQuiz;\r\n }\r\n\r\n get userEventLog(): string[] {\r\n return [...this._userEventLog];\r\n }\r\n\r\n get currentStepIndex(): number {\r\n return this._currentStepIndex;\r\n }\r\n\r\n get isComplete(): boolean {\r\n if (this._eventIds.length === 0) return false;\r\n\r\n if (this._orderMatters) {\r\n return this._currentStepIndex >= this._eventIds.length;\r\n } else {\r\n const requiredEvents = new Set(this._eventIds);\r\n const emittedEvents = new Set(this._userEventLog);\r\n return Array.from(requiredEvents).every((event) =>\r\n emittedEvents.has(event),\r\n );\r\n }\r\n }\r\n\r\n get validationMessage(): string | null {\r\n return this._validationMessage;\r\n }\r\n\r\n get score(): {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null {\r\n return this._score;\r\n }\r\n\r\n get isSubmitted(): boolean {\r\n return this._isSubmitted;\r\n }\r\n\r\n addEventId(eventId: string): void {\r\n if (this._eventIds.includes(eventId)) {\r\n this._validationMessage = `Event '${eventId}' is already in the procedure`;\r\n this.updateState();\r\n return;\r\n }\r\n\r\n this._eventIds.push(eventId);\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n removeEventId(eventId: string): void {\r\n const index = this._eventIds.indexOf(eventId);\r\n if (index === -1) {\r\n this._validationMessage = `Event '${eventId}' is not in the procedure`;\r\n this.updateState();\r\n return;\r\n }\r\n\r\n this._eventIds.splice(index, 1);\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n clearEventIds(): void {\r\n this._eventIds = [];\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n moveEventUp(index: number): void {\r\n if (index <= 0 || index >= this._eventIds.length) {\r\n this._validationMessage = \"Cannot move event up - invalid position\";\r\n this.updateState();\r\n return;\r\n }\r\n\r\n const temp = this._eventIds[index];\r\n this._eventIds[index] = this._eventIds[index - 1];\r\n this._eventIds[index - 1] = temp;\r\n\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n moveEventDown(index: number): void {\r\n if (index < 0 || index >= this._eventIds.length - 1) {\r\n this._validationMessage = \"Cannot move event down - invalid position\";\r\n this.updateState();\r\n return;\r\n }\r\n\r\n const temp = this._eventIds[index];\r\n this._eventIds[index] = this._eventIds[index + 1];\r\n this._eventIds[index + 1] = temp;\r\n\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n recordUserEvent(eventId: string): void {\r\n if (!this._eventIds.includes(eventId)) {\r\n return;\r\n }\r\n\r\n this._userEventLog.push(eventId);\r\n\r\n if (this._orderMatters) {\r\n if (this._currentStepIndex < this._eventIds.length) {\r\n const expectedEvent = this._eventIds[this._currentStepIndex];\r\n if (eventId === expectedEvent) {\r\n this._currentStepIndex++;\r\n this._validationMessage = null;\r\n } else {\r\n this._validationMessage = `Expected '${expectedEvent}', but got '${eventId}'`;\r\n }\r\n }\r\n }\r\n\r\n this.updateState();\r\n }\r\n\r\n validateProgress(): string | null {\r\n if (this._eventIds.length === 0) {\r\n return \"At least one event must be added to the procedure\";\r\n }\r\n\r\n if (this.isComplete) {\r\n return null;\r\n }\r\n\r\n if (this._orderMatters && this._validationMessage) {\r\n return this._validationMessage;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getNextExpectedEvent(): string | null {\r\n if (!this._showHints || this._eventIds.length === 0) {\r\n return null;\r\n }\r\n\r\n if (this._orderMatters) {\r\n if (this._currentStepIndex < this._eventIds.length) {\r\n return this._eventIds[this._currentStepIndex];\r\n }\r\n } else {\r\n const emittedEvents = new Set(this._userEventLog);\r\n return (\r\n this._eventIds.find((eventId) => !emittedEvents.has(eventId)) || null\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n reset(): void {\r\n this._userEventLog = [];\r\n this._currentStepIndex = 0;\r\n this._validationMessage = null;\r\n this._score = null;\r\n this._isSubmitted = false;\r\n this.updateState();\r\n }\r\n\r\n setOrderMatters(orderMatters: boolean): void {\r\n this._orderMatters = orderMatters;\r\n this.updateState();\r\n }\r\n\r\n setShowHints(showHints: boolean): void {\r\n this._showHints = showHints;\r\n this.updateState();\r\n }\r\n\r\n setIsQuiz(isQuiz: boolean): void {\r\n this._isQuiz = isQuiz;\r\n this.updateState();\r\n }\r\n\r\n get isRecording(): boolean {\r\n return this._isRecording;\r\n }\r\n\r\n setIsRecording(value: boolean): void {\r\n this._isRecording = value;\r\n this.updateState();\r\n }\r\n\r\n getProgressPercentage(): number {\r\n if (this._eventIds.length === 0) return 0;\r\n\r\n if (this._orderMatters) {\r\n return Math.round((this._currentStepIndex / this._eventIds.length) * 100);\r\n } else {\r\n const requiredEvents = new Set(this._eventIds);\r\n const emittedEvents = new Set(this._userEventLog);\r\n const completedCount = Array.from(requiredEvents).filter((event) =>\r\n emittedEvents.has(event),\r\n ).length;\r\n return Math.round((completedCount / this._eventIds.length) * 100);\r\n }\r\n }\r\n\r\n calculateScore(): {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } {\r\n if (this._eventIds.length === 0) {\r\n return { percentage: 0, comparison: [] };\r\n }\r\n\r\n const comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[] = [];\r\n let correctCount = 0;\r\n\r\n if (this._orderMatters) {\r\n for (let i = 0; i < this._eventIds.length; i++) {\r\n const eventId = this._eventIds[i];\r\n const expected = true;\r\n const actual =\r\n i < this._userEventLog.length && this._userEventLog[i] === eventId;\r\n const correct = actual;\r\n\r\n comparison.push({ eventId, expected, actual, correct });\r\n if (correct) correctCount++;\r\n }\r\n } else {\r\n const emittedEvents = new Set(this._userEventLog);\r\n for (const eventId of this._eventIds) {\r\n const expected = true;\r\n const actual = emittedEvents.has(eventId);\r\n const correct = actual;\r\n\r\n comparison.push({ eventId, expected, actual, correct });\r\n if (correct) correctCount++;\r\n }\r\n }\r\n\r\n const percentage = Math.round(\r\n (correctCount / this._eventIds.length) * 100,\r\n );\r\n return { percentage, comparison };\r\n }\r\n\r\n submit(): void {\r\n if (!this._isQuiz) {\r\n this._validationMessage = \"Cannot submit: not in quiz mode\";\r\n this.updateState();\r\n return;\r\n }\r\n\r\n this._score = this.calculateScore();\r\n this._isSubmitted = true;\r\n this._validationMessage = null;\r\n this.updateState();\r\n }\r\n\r\n getAuthoringValidationMessage(): string | null {\r\n if (this._eventIds.length === 0) {\r\n return \"At least one event must be added to the procedure\";\r\n }\r\n return this._validationMessage;\r\n }\r\n\r\n private updateState(): void {\r\n const stateHash = JSON.stringify({\r\n eventIds: this._eventIds,\r\n orderMatters: this._orderMatters,\r\n showHints: this._showHints,\r\n isQuiz: this._isQuiz,\r\n userEventLog: this._userEventLog,\r\n currentStepIndex: this._currentStepIndex,\r\n validationMessage: this._validationMessage,\r\n score: this._score,\r\n isSubmitted: this._isSubmitted,\r\n isRecording: this._isRecording,\r\n });\r\n\r\n this.memoizedState.val = stateHash;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ProcedureEntity.type);\r\n this.appObjects.registerSingleton(this);\r\n this.updateState();\r\n }\r\n}\r\n"]}
@@ -18,6 +18,7 @@ const SetProcedureShowHintsUC_1 = require("../UCs/SetProcedureShowHintsUC");
18
18
  const SetProcedureIsQuizUC_1 = require("../UCs/SetProcedureIsQuizUC");
19
19
  const SubmitProcedureQuizUC_1 = require("../UCs/SubmitProcedureQuizUC");
20
20
  const UpdateProcedureEventsUCHook_1 = require("../UCs/UpdateProcedureEventsUCHook");
21
+ const RecordProcedureSessionUC_1 = require("../UCs/RecordProcedureSessionUC");
21
22
  const ProcedurePM_1 = require("../PM/ProcedurePM");
22
23
  class ProcedureFeatureFactory extends core_1.DomainFactory {
23
24
  constructor() {
@@ -41,6 +42,7 @@ class ProcedureFeatureFactory extends core_1.DomainFactory {
41
42
  (0, SetProcedureIsQuizUC_1.makeSetProcedureIsQuizUC)(this.appObject);
42
43
  (0, SubmitProcedureQuizUC_1.makeSubmitProcedureQuizUC)(this.appObject);
43
44
  (0, UpdateProcedureEventsUCHook_1.makeUpdateProcedureEventsUCHook)(this.appObject);
45
+ (0, RecordProcedureSessionUC_1.makeRecordProcedureSessionUC)(this.appObject);
44
46
  }
45
47
  setupPMs() {
46
48
  (0, ProcedurePM_1.makeProcedurePM)(this.appObject);
@@ -1 +1 @@
1
- {"version":3,"file":"ProcedureFeatureFactory.js","sourceRoot":"","sources":["../../../../src/Procedure/Factories/ProcedureFeatureFactory.ts"],"names":[],"mappings":"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","sourcesContent":["import { DomainFactory, AppObjectRepo } from \"@vived/core\";\r\nimport { ChallengeEntity } from \"../../Challenge\";\r\nimport {\r\n makeProcedureEntity,\r\n ProcedureEntity,\r\n} from \"../Entities/ProcedureEntity\";\r\nimport { makeHintRegistry } from \"../Entities/HintRegistry\";\r\nimport { makeAddProcedureEventUC } from \"../UCs/AddProcedureEventUC\";\r\nimport { makeRecordProcedureEventUC } from \"../UCs/RecordProcedureEventUC\";\r\nimport { makeResetProcedureProgressUC } from \"../UCs/ResetProcedureProgressUC\";\r\nimport { makeSerializeProcedure } from \"../UCs/SerializeProcedure\";\r\nimport { makeRemoveProcedureEventUC } from \"../UCs/RemoveProcedureEventUC\";\r\nimport { makeMoveProcedureEventUpUC } from \"../UCs/MoveProcedureEventUpUC\";\r\nimport { makeMoveProcedureEventDownUC } from \"../UCs/MoveProcedureEventDownUC\";\r\nimport { makeSetProcedureOrderMattersUC } from \"../UCs/SetProcedureOrderMattersUC\";\r\nimport { makeSetProcedureShowHintsUC } from \"../UCs/SetProcedureShowHintsUC\";\r\nimport { makeSetProcedureIsQuizUC } from \"../UCs/SetProcedureIsQuizUC\";\r\nimport { makeSubmitProcedureQuizUC } from \"../UCs/SubmitProcedureQuizUC\";\r\nimport { makeUpdateProcedureEventsUCHook } from \"../UCs/UpdateProcedureEventsUCHook\";\r\nimport { makeProcedurePM, ProcedurePM } from \"../PM/ProcedurePM\";\r\n\r\nexport class ProcedureFeatureFactory extends DomainFactory {\r\n factoryName = \"ProcedureFeatureFactory\";\r\n\r\n setupEntities(): void {\r\n makeProcedureEntity(this.appObject);\r\n makeHintRegistry(this.appObject);\r\n }\r\n\r\n setupUCs(): void {\r\n makeAddProcedureEventUC(this.appObject);\r\n makeRecordProcedureEventUC(this.appObject);\r\n makeResetProcedureProgressUC(this.appObject);\r\n makeSerializeProcedure(this.appObject);\r\n makeRemoveProcedureEventUC(this.appObject);\r\n makeMoveProcedureEventUpUC(this.appObject);\r\n makeMoveProcedureEventDownUC(this.appObject);\r\n makeSetProcedureOrderMattersUC(this.appObject);\r\n makeSetProcedureShowHintsUC(this.appObject);\r\n makeSetProcedureIsQuizUC(this.appObject);\r\n makeSubmitProcedureQuizUC(this.appObject);\r\n makeUpdateProcedureEventsUCHook(this.appObject);\r\n }\r\n\r\n setupPMs(): void {\r\n makeProcedurePM(this.appObject);\r\n }\r\n\r\n finalSetup(): void {\r\n this.registerProcedureChallenge();\r\n }\r\n\r\n private registerProcedureChallenge(): void {\r\n const challengeEntity = ChallengeEntity.get(this.appObjects);\r\n const procedureEntity = this.getProcedureEntity();\r\n\r\n if (!challengeEntity) {\r\n this.warn(\r\n \"ChallengeEntity not found - Procedure challenge will not be available in selection\",\r\n );\r\n return;\r\n }\r\n\r\n if (!procedureEntity) {\r\n this.warn(\"ProcedureEntity not found - cannot register challenge\");\r\n return;\r\n }\r\n\r\n try {\r\n challengeEntity.registerChallenge(procedureEntity);\r\n } catch (error) {\r\n this.warn(`Failed to register Procedure challenge: ${error}`);\r\n }\r\n }\r\n\r\n getProcedureEntity(): ProcedureEntity | undefined {\r\n return ProcedureEntity.get(this.appObjects);\r\n }\r\n\r\n getProcedurePM(): ProcedurePM | undefined {\r\n return ProcedurePM.get(this.appObjects);\r\n }\r\n}\r\n\r\nexport const ProcedureFeatureComponents = {\r\n procedureEntityType: ProcedureEntity.type,\r\n procedurePMType: ProcedurePM.type,\r\n};\r\n\r\nexport function makeProcedureFeatureFactory(\r\n appObjects: AppObjectRepo,\r\n): ProcedureFeatureFactory {\r\n const appObject = appObjects.getOrCreate(\"Procedure\");\r\n return new ProcedureFeatureFactory(appObject);\r\n}\r\n"]}
1
+ {"version":3,"file":"ProcedureFeatureFactory.js","sourceRoot":"","sources":["../../../../src/Procedure/Factories/ProcedureFeatureFactory.ts"],"names":[],"mappings":"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","sourcesContent":["import { DomainFactory, AppObjectRepo } from \"@vived/core\";\r\nimport { ChallengeEntity } from \"../../Challenge\";\r\nimport {\r\n makeProcedureEntity,\r\n ProcedureEntity,\r\n} from \"../Entities/ProcedureEntity\";\r\nimport { makeHintRegistry } from \"../Entities/HintRegistry\";\r\nimport { makeAddProcedureEventUC } from \"../UCs/AddProcedureEventUC\";\r\nimport { makeRecordProcedureEventUC } from \"../UCs/RecordProcedureEventUC\";\r\nimport { makeResetProcedureProgressUC } from \"../UCs/ResetProcedureProgressUC\";\r\nimport { makeSerializeProcedure } from \"../UCs/SerializeProcedure\";\r\nimport { makeRemoveProcedureEventUC } from \"../UCs/RemoveProcedureEventUC\";\r\nimport { makeMoveProcedureEventUpUC } from \"../UCs/MoveProcedureEventUpUC\";\r\nimport { makeMoveProcedureEventDownUC } from \"../UCs/MoveProcedureEventDownUC\";\r\nimport { makeSetProcedureOrderMattersUC } from \"../UCs/SetProcedureOrderMattersUC\";\r\nimport { makeSetProcedureShowHintsUC } from \"../UCs/SetProcedureShowHintsUC\";\r\nimport { makeSetProcedureIsQuizUC } from \"../UCs/SetProcedureIsQuizUC\";\r\nimport { makeSubmitProcedureQuizUC } from \"../UCs/SubmitProcedureQuizUC\";\r\nimport { makeUpdateProcedureEventsUCHook } from \"../UCs/UpdateProcedureEventsUCHook\";\r\nimport { makeRecordProcedureSessionUC } from \"../UCs/RecordProcedureSessionUC\";\r\nimport { makeProcedurePM, ProcedurePM } from \"../PM/ProcedurePM\";\r\n\r\nexport class ProcedureFeatureFactory extends DomainFactory {\r\n factoryName = \"ProcedureFeatureFactory\";\r\n\r\n setupEntities(): void {\r\n makeProcedureEntity(this.appObject);\r\n makeHintRegistry(this.appObject);\r\n }\r\n\r\n setupUCs(): void {\r\n makeAddProcedureEventUC(this.appObject);\r\n makeRecordProcedureEventUC(this.appObject);\r\n makeResetProcedureProgressUC(this.appObject);\r\n makeSerializeProcedure(this.appObject);\r\n makeRemoveProcedureEventUC(this.appObject);\r\n makeMoveProcedureEventUpUC(this.appObject);\r\n makeMoveProcedureEventDownUC(this.appObject);\r\n makeSetProcedureOrderMattersUC(this.appObject);\r\n makeSetProcedureShowHintsUC(this.appObject);\r\n makeSetProcedureIsQuizUC(this.appObject);\r\n makeSubmitProcedureQuizUC(this.appObject);\r\n makeUpdateProcedureEventsUCHook(this.appObject);\r\n makeRecordProcedureSessionUC(this.appObject);\r\n }\r\n\r\n setupPMs(): void {\r\n makeProcedurePM(this.appObject);\r\n }\r\n\r\n finalSetup(): void {\r\n this.registerProcedureChallenge();\r\n }\r\n\r\n private registerProcedureChallenge(): void {\r\n const challengeEntity = ChallengeEntity.get(this.appObjects);\r\n const procedureEntity = this.getProcedureEntity();\r\n\r\n if (!challengeEntity) {\r\n this.warn(\r\n \"ChallengeEntity not found - Procedure challenge will not be available in selection\",\r\n );\r\n return;\r\n }\r\n\r\n if (!procedureEntity) {\r\n this.warn(\"ProcedureEntity not found - cannot register challenge\");\r\n return;\r\n }\r\n\r\n try {\r\n challengeEntity.registerChallenge(procedureEntity);\r\n } catch (error) {\r\n this.warn(`Failed to register Procedure challenge: ${error}`);\r\n }\r\n }\r\n\r\n getProcedureEntity(): ProcedureEntity | undefined {\r\n return ProcedureEntity.get(this.appObjects);\r\n }\r\n\r\n getProcedurePM(): ProcedurePM | undefined {\r\n return ProcedurePM.get(this.appObjects);\r\n }\r\n}\r\n\r\nexport const ProcedureFeatureComponents = {\r\n procedureEntityType: ProcedureEntity.type,\r\n procedurePMType: ProcedurePM.type,\r\n};\r\n\r\nexport function makeProcedureFeatureFactory(\r\n appObjects: AppObjectRepo,\r\n): ProcedureFeatureFactory {\r\n const appObject = appObjects.getOrCreate(\"Procedure\");\r\n return new ProcedureFeatureFactory(appObject);\r\n}\r\n"]}
@@ -22,6 +22,9 @@ class MockProcedureEntity extends ProcedureEntity_1.ProcedureEntity {
22
22
  get isQuiz() {
23
23
  return this._isQuiz;
24
24
  }
25
+ get isRecording() {
26
+ return this._isRecording;
27
+ }
25
28
  get userEventLog() {
26
29
  return this._userEventLog;
27
30
  }
@@ -46,6 +49,7 @@ class MockProcedureEntity extends ProcedureEntity_1.ProcedureEntity {
46
49
  this._orderMatters = true;
47
50
  this._showHints = true;
48
51
  this._isQuiz = false;
52
+ this._isRecording = false;
49
53
  this._userEventLog = [];
50
54
  this._currentStepIndex = 0;
51
55
  this._isComplete = false;
@@ -78,6 +82,9 @@ class MockProcedureEntity extends ProcedureEntity_1.ProcedureEntity {
78
82
  this.setIsQuiz = jest.fn((v) => {
79
83
  this._isQuiz = v;
80
84
  });
85
+ this.setIsRecording = jest.fn((v) => {
86
+ this._isRecording = v;
87
+ });
81
88
  this.getProgressPercentage = jest.fn(() => 0);
82
89
  this.calculateScore = jest.fn(() => ({ percentage: 0, comparison: [] }));
83
90
  this.submit = jest.fn();
@@ -1 +1 @@
1
- {"version":3,"file":"MockProcedureEntity.js","sourceRoot":"","sources":["../../../../src/Procedure/Mocks/MockProcedureEntity.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\r\nimport { ProcedureEntity } from \"../Entities/ProcedureEntity\";\r\n\r\nexport class MockProcedureEntity extends ProcedureEntity {\r\n private _eventIds: string[] = [];\r\n private _orderMatters = true;\r\n private _showHints = true;\r\n private _isQuiz = false;\r\n private _userEventLog: string[] = [];\r\n private _currentStepIndex = 0;\r\n private _isComplete = false;\r\n private _validationMessage: string | null = null;\r\n private _score: {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null = null;\r\n private _isSubmitted = false;\r\n\r\n get helpHeading(): string {\r\n return \"Procedure Challenge\";\r\n }\r\n get consumerHelpText(): string {\r\n return \"\";\r\n }\r\n get eventIds() {\r\n return this._eventIds;\r\n }\r\n get orderMatters() {\r\n return this._orderMatters;\r\n }\r\n get showHints() {\r\n return this._showHints;\r\n }\r\n get isQuiz() {\r\n return this._isQuiz;\r\n }\r\n get userEventLog() {\r\n return this._userEventLog;\r\n }\r\n get currentStepIndex() {\r\n return this._currentStepIndex;\r\n }\r\n get isComplete() {\r\n return this._isComplete;\r\n }\r\n get validationMessage() {\r\n return this._validationMessage;\r\n }\r\n get score() {\r\n return this._score;\r\n }\r\n get isSubmitted() {\r\n return this._isSubmitted;\r\n }\r\n\r\n addEventId = jest.fn((id: string) => {\r\n this._eventIds.push(id);\r\n });\r\n removeEventId = jest.fn();\r\n clearEventIds = jest.fn(() => {\r\n this._eventIds = [];\r\n });\r\n recordUserEvent = jest.fn();\r\n validateProgress = jest.fn(() => null);\r\n getNextExpectedEvent = jest.fn(() => null);\r\n reset = jest.fn(() => {\r\n this._userEventLog = [];\r\n this._currentStepIndex = 0;\r\n });\r\n moveEventUp = jest.fn();\r\n moveEventDown = jest.fn();\r\n getAuthoringValidationMessage = jest.fn(() => null);\r\n setOrderMatters = jest.fn((v: boolean) => {\r\n this._orderMatters = v;\r\n });\r\n setShowHints = jest.fn((v: boolean) => {\r\n this._showHints = v;\r\n });\r\n setIsQuiz = jest.fn((v: boolean) => {\r\n this._isQuiz = v;\r\n });\r\n getProgressPercentage = jest.fn(() => 0);\r\n calculateScore = jest.fn(() => ({ percentage: 0, comparison: [] }));\r\n submit = jest.fn();\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ProcedureEntity.type);\r\n }\r\n}\r\n\r\nexport function makeMockProcedureEntity(appObjects: AppObjectRepo) {\r\n return new MockProcedureEntity(\r\n appObjects.getOrCreate(\"MockProcedureEntity\"),\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"MockProcedureEntity.js","sourceRoot":"","sources":["../../../../src/Procedure/Mocks/MockProcedureEntity.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectRepo } from \"@vived/core\";\r\nimport { ProcedureEntity } from \"../Entities/ProcedureEntity\";\r\n\r\nexport class MockProcedureEntity extends ProcedureEntity {\r\n private _eventIds: string[] = [];\r\n private _orderMatters = true;\r\n private _showHints = true;\r\n private _isQuiz = false;\r\n private _isRecording = false;\r\n private _userEventLog: string[] = [];\r\n private _currentStepIndex = 0;\r\n private _isComplete = false;\r\n private _validationMessage: string | null = null;\r\n private _score: {\r\n percentage: number;\r\n comparison: {eventId: string; expected: boolean; actual: boolean; correct: boolean}[];\r\n } | null = null;\r\n private _isSubmitted = false;\r\n\r\n get helpHeading(): string {\r\n return \"Procedure Challenge\";\r\n }\r\n get consumerHelpText(): string {\r\n return \"\";\r\n }\r\n get eventIds() {\r\n return this._eventIds;\r\n }\r\n get orderMatters() {\r\n return this._orderMatters;\r\n }\r\n get showHints() {\r\n return this._showHints;\r\n }\r\n get isQuiz() {\r\n return this._isQuiz;\r\n }\r\n get isRecording() {\r\n return this._isRecording;\r\n }\r\n get userEventLog() {\r\n return this._userEventLog;\r\n }\r\n get currentStepIndex() {\r\n return this._currentStepIndex;\r\n }\r\n get isComplete() {\r\n return this._isComplete;\r\n }\r\n get validationMessage() {\r\n return this._validationMessage;\r\n }\r\n get score() {\r\n return this._score;\r\n }\r\n get isSubmitted() {\r\n return this._isSubmitted;\r\n }\r\n\r\n addEventId = jest.fn((id: string) => {\r\n this._eventIds.push(id);\r\n });\r\n removeEventId = jest.fn();\r\n clearEventIds = jest.fn(() => {\r\n this._eventIds = [];\r\n });\r\n recordUserEvent = jest.fn();\r\n validateProgress = jest.fn(() => null);\r\n getNextExpectedEvent = jest.fn(() => null);\r\n reset = jest.fn(() => {\r\n this._userEventLog = [];\r\n this._currentStepIndex = 0;\r\n });\r\n moveEventUp = jest.fn();\r\n moveEventDown = jest.fn();\r\n getAuthoringValidationMessage = jest.fn(() => null);\r\n setOrderMatters = jest.fn((v: boolean) => {\r\n this._orderMatters = v;\r\n });\r\n setShowHints = jest.fn((v: boolean) => {\r\n this._showHints = v;\r\n });\r\n setIsQuiz = jest.fn((v: boolean) => {\r\n this._isQuiz = v;\r\n });\r\n setIsRecording = jest.fn((v: boolean) => {\r\n this._isRecording = v;\r\n });\r\n getProgressPercentage = jest.fn(() => 0);\r\n calculateScore = jest.fn(() => ({ percentage: 0, comparison: [] }));\r\n submit = jest.fn();\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ProcedureEntity.type);\r\n }\r\n}\r\n\r\nexport function makeMockProcedureEntity(appObjects: AppObjectRepo) {\r\n return new MockProcedureEntity(\r\n appObjects.getOrCreate(\"MockProcedureEntity\"),\r\n );\r\n}\r\n"]}
@@ -25,6 +25,7 @@ class ProcedurePMImp extends ProcedurePM {
25
25
  a.orderMatters === b.orderMatters &&
26
26
  a.showHints === b.showHints &&
27
27
  a.isQuiz === b.isQuiz &&
28
+ a.isRecording === b.isRecording &&
28
29
  JSON.stringify(a.userEventLog) === JSON.stringify(b.userEventLog) &&
29
30
  a.currentStepIndex === b.currentStepIndex &&
30
31
  a.isComplete === b.isComplete &&
@@ -41,6 +42,7 @@ class ProcedurePMImp extends ProcedurePM {
41
42
  orderMatters: true,
42
43
  showHints: true,
43
44
  isQuiz: false,
45
+ isRecording: false,
44
46
  userEventLog: [],
45
47
  currentStepIndex: 0,
46
48
  isComplete: false,
@@ -70,6 +72,7 @@ class ProcedurePMImp extends ProcedurePM {
70
72
  orderMatters: procedureEntity.orderMatters,
71
73
  showHints: procedureEntity.showHints,
72
74
  isQuiz: procedureEntity.isQuiz,
75
+ isRecording: procedureEntity.isRecording,
73
76
  userEventLog: procedureEntity.userEventLog,
74
77
  currentStepIndex: procedureEntity.currentStepIndex,
75
78
  isComplete: procedureEntity.isComplete,
@@ -1 +1 @@
1
- {"version":3,"file":"ProcedurePM.js","sourceRoot":"","sources":["../../../../src/Procedure/PM/ProcedurePM.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo,\r\n getSingletonComponent,\r\n} from \"@vived/core\";\r\nimport { ProcedureEntity } from \"../Entities/ProcedureEntity\";\r\nimport { EventEntity } from \"../../EventSystem\";\r\nimport { ProcedureVM } from \"../types\";\r\n\r\nexport abstract class ProcedurePM extends AppObjectPM<ProcedureVM> {\r\n static readonly type = \"ProcedurePM\";\r\n\r\n static get = (appObjects: AppObjectRepo): ProcedurePM | undefined =>\r\n getSingletonComponent(ProcedurePM.type, appObjects);\r\n}\r\n\r\nexport function makeProcedurePM(appObject: AppObject): ProcedurePM {\r\n return new ProcedurePMImp(appObject);\r\n}\r\n\r\nclass ProcedurePMImp extends ProcedurePM {\r\n private get procedureEntity(): ProcedureEntity | undefined {\r\n return ProcedureEntity.get(this.appObjects);\r\n }\r\n\r\n private get eventEntity(): EventEntity | undefined {\r\n return EventEntity.get(this.appObjects);\r\n }\r\n\r\n vmsAreEqual(a: ProcedureVM, b: ProcedureVM): boolean {\r\n return (\r\n JSON.stringify(a.eventIds) === JSON.stringify(b.eventIds) &&\r\n a.orderMatters === b.orderMatters &&\r\n a.showHints === b.showHints &&\r\n a.isQuiz === b.isQuiz &&\r\n JSON.stringify(a.userEventLog) === JSON.stringify(b.userEventLog) &&\r\n a.currentStepIndex === b.currentStepIndex &&\r\n a.isComplete === b.isComplete &&\r\n a.validationMessage === b.validationMessage &&\r\n a.nextExpectedEvent === b.nextExpectedEvent &&\r\n a.progressPercentage === b.progressPercentage &&\r\n JSON.stringify(a.availableEvents) === JSON.stringify(b.availableEvents) &&\r\n JSON.stringify(a.score) === JSON.stringify(b.score) &&\r\n a.isSubmitted === b.isSubmitted\r\n );\r\n }\r\n\r\n onEntityChange = (): void => {\r\n const procedureEntity = this.procedureEntity;\r\n if (!procedureEntity) {\r\n this.doUpdateView(this.getDefaultVM());\r\n return;\r\n }\r\n\r\n const eventEntity = this.eventEntity;\r\n const availableEvents = eventEntity\r\n ? eventEntity.getRegisteredEvents()\r\n : [];\r\n\r\n const viewModel: ProcedureVM = {\r\n eventIds: procedureEntity.eventIds,\r\n orderMatters: procedureEntity.orderMatters,\r\n showHints: procedureEntity.showHints,\r\n isQuiz: procedureEntity.isQuiz,\r\n userEventLog: procedureEntity.userEventLog,\r\n currentStepIndex: procedureEntity.currentStepIndex,\r\n isComplete: procedureEntity.isComplete,\r\n validationMessage: procedureEntity.validationMessage,\r\n nextExpectedEvent: procedureEntity.getNextExpectedEvent(),\r\n progressPercentage: procedureEntity.getProgressPercentage(),\r\n availableEvents,\r\n authoringValidationMessage:\r\n procedureEntity.getAuthoringValidationMessage(),\r\n score: procedureEntity.score,\r\n isSubmitted: procedureEntity.isSubmitted,\r\n };\r\n\r\n this.doUpdateView(viewModel);\r\n };\r\n\r\n private getDefaultVM(): ProcedureVM {\r\n return {\r\n eventIds: [],\r\n orderMatters: true,\r\n showHints: true,\r\n isQuiz: false,\r\n userEventLog: [],\r\n currentStepIndex: 0,\r\n isComplete: false,\r\n validationMessage: null,\r\n nextExpectedEvent: null,\r\n progressPercentage: 0,\r\n availableEvents: [],\r\n authoringValidationMessage:\r\n \"At least one event must be added to the procedure\",\r\n score: null,\r\n isSubmitted: false,\r\n };\r\n }\r\n\r\n dispose = (): void => {\r\n super.dispose();\r\n this.procedureEntity?.removeChangeObserver(this.onEntityChange);\r\n this.eventEntity?.removeChangeObserver(this.onEntityChange);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ProcedurePM.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n\r\n this.procedureEntity?.addChangeObserver(this.onEntityChange);\r\n this.eventEntity?.addChangeObserver(this.onEntityChange);\r\n\r\n this.onEntityChange();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"ProcedurePM.js","sourceRoot":"","sources":["../../../../src/Procedure/PM/ProcedurePM.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo,\r\n getSingletonComponent,\r\n} from \"@vived/core\";\r\nimport { ProcedureEntity } from \"../Entities/ProcedureEntity\";\r\nimport { EventEntity } from \"../../EventSystem\";\r\nimport { ProcedureVM } from \"../types\";\r\n\r\nexport abstract class ProcedurePM extends AppObjectPM<ProcedureVM> {\r\n static readonly type = \"ProcedurePM\";\r\n\r\n static get = (appObjects: AppObjectRepo): ProcedurePM | undefined =>\r\n getSingletonComponent(ProcedurePM.type, appObjects);\r\n}\r\n\r\nexport function makeProcedurePM(appObject: AppObject): ProcedurePM {\r\n return new ProcedurePMImp(appObject);\r\n}\r\n\r\nclass ProcedurePMImp extends ProcedurePM {\r\n private get procedureEntity(): ProcedureEntity | undefined {\r\n return ProcedureEntity.get(this.appObjects);\r\n }\r\n\r\n private get eventEntity(): EventEntity | undefined {\r\n return EventEntity.get(this.appObjects);\r\n }\r\n\r\n vmsAreEqual(a: ProcedureVM, b: ProcedureVM): boolean {\r\n return (\r\n JSON.stringify(a.eventIds) === JSON.stringify(b.eventIds) &&\r\n a.orderMatters === b.orderMatters &&\r\n a.showHints === b.showHints &&\r\n a.isQuiz === b.isQuiz &&\r\n a.isRecording === b.isRecording &&\r\n JSON.stringify(a.userEventLog) === JSON.stringify(b.userEventLog) &&\r\n a.currentStepIndex === b.currentStepIndex &&\r\n a.isComplete === b.isComplete &&\r\n a.validationMessage === b.validationMessage &&\r\n a.nextExpectedEvent === b.nextExpectedEvent &&\r\n a.progressPercentage === b.progressPercentage &&\r\n JSON.stringify(a.availableEvents) === JSON.stringify(b.availableEvents) &&\r\n JSON.stringify(a.score) === JSON.stringify(b.score) &&\r\n a.isSubmitted === b.isSubmitted\r\n );\r\n }\r\n\r\n onEntityChange = (): void => {\r\n const procedureEntity = this.procedureEntity;\r\n if (!procedureEntity) {\r\n this.doUpdateView(this.getDefaultVM());\r\n return;\r\n }\r\n\r\n const eventEntity = this.eventEntity;\r\n const availableEvents = eventEntity\r\n ? eventEntity.getRegisteredEvents()\r\n : [];\r\n\r\n const viewModel: ProcedureVM = {\r\n eventIds: procedureEntity.eventIds,\r\n orderMatters: procedureEntity.orderMatters,\r\n showHints: procedureEntity.showHints,\r\n isQuiz: procedureEntity.isQuiz,\r\n isRecording: procedureEntity.isRecording,\r\n userEventLog: procedureEntity.userEventLog,\r\n currentStepIndex: procedureEntity.currentStepIndex,\r\n isComplete: procedureEntity.isComplete,\r\n validationMessage: procedureEntity.validationMessage,\r\n nextExpectedEvent: procedureEntity.getNextExpectedEvent(),\r\n progressPercentage: procedureEntity.getProgressPercentage(),\r\n availableEvents,\r\n authoringValidationMessage:\r\n procedureEntity.getAuthoringValidationMessage(),\r\n score: procedureEntity.score,\r\n isSubmitted: procedureEntity.isSubmitted,\r\n };\r\n\r\n this.doUpdateView(viewModel);\r\n };\r\n\r\n private getDefaultVM(): ProcedureVM {\r\n return {\r\n eventIds: [],\r\n orderMatters: true,\r\n showHints: true,\r\n isQuiz: false,\r\n isRecording: false,\r\n userEventLog: [],\r\n currentStepIndex: 0,\r\n isComplete: false,\r\n validationMessage: null,\r\n nextExpectedEvent: null,\r\n progressPercentage: 0,\r\n availableEvents: [],\r\n authoringValidationMessage:\r\n \"At least one event must be added to the procedure\",\r\n score: null,\r\n isSubmitted: false,\r\n };\r\n }\r\n\r\n dispose = (): void => {\r\n super.dispose();\r\n this.procedureEntity?.removeChangeObserver(this.onEntityChange);\r\n this.eventEntity?.removeChangeObserver(this.onEntityChange);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ProcedurePM.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n\r\n this.procedureEntity?.addChangeObserver(this.onEntityChange);\r\n this.eventEntity?.addChangeObserver(this.onEntityChange);\r\n\r\n this.onEntityChange();\r\n }\r\n}\r\n"]}
@@ -62,6 +62,7 @@ describe("ProcedurePM", () => {
62
62
  orderMatters: true,
63
63
  showHints: true,
64
64
  isQuiz: false,
65
+ isRecording: false,
65
66
  userEventLog: [],
66
67
  currentStepIndex: 0,
67
68
  isComplete: false,
@@ -82,6 +83,7 @@ describe("ProcedurePM", () => {
82
83
  orderMatters: true,
83
84
  showHints: true,
84
85
  isQuiz: false,
86
+ isRecording: false,
85
87
  userEventLog: [],
86
88
  currentStepIndex: 0,
87
89
  isComplete: false,
@@ -1 +1 @@
1
- {"version":3,"file":"ProcedurePM.test.js","sourceRoot":"","sources":["../../../../src/Procedure/PM/ProcedurePM.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObjectRepo, makeAppObjectRepo } from \"@vived/core\";\r\nimport { ProcedureEntity, makeProcedureEntity } from \"../Entities/ProcedureEntity\";\r\nimport { ProcedurePM, makeProcedurePM } from \"./ProcedurePM\";\r\nimport { ProcedureVM } from \"../types\";\r\n\r\ndescribe(\"ProcedurePM\", () => {\r\n let appObjects: AppObjectRepo;\r\n let procedureEntity: ProcedureEntity;\r\n let procedurePM: ProcedurePM;\r\n\r\n beforeEach(() => {\r\n appObjects = makeAppObjectRepo();\r\n const appObject = appObjects.getOrCreate(\"Procedure\");\r\n\r\n procedureEntity = makeProcedureEntity(appObject);\r\n procedurePM = makeProcedurePM(appObject);\r\n });\r\n\r\n it(\"can be retrieved via static get method\", () => {\r\n const retrieved = ProcedurePM.get(appObjects);\r\n expect(retrieved).toBe(procedurePM);\r\n });\r\n\r\n it(\"registers itself as singleton\", () => {\r\n expect(ProcedurePM.get(appObjects)).toBe(procedurePM);\r\n });\r\n\r\n it(\"generates correct initial view model\", () => {\r\n const vm = procedurePM.lastVM;\r\n\r\n expect(vm).toBeDefined();\r\n expect(vm!.eventIds).toEqual([]);\r\n expect(vm!.orderMatters).toBe(true);\r\n expect(vm!.showHints).toBe(true);\r\n expect(vm!.isQuiz).toBe(false);\r\n expect(vm!.userEventLog).toEqual([]);\r\n expect(vm!.currentStepIndex).toBe(0);\r\n expect(vm!.isComplete).toBe(false);\r\n expect(vm!.validationMessage).toBe(null);\r\n expect(vm!.nextExpectedEvent).toBe(null);\r\n expect(vm!.progressPercentage).toBe(0);\r\n expect(vm!.availableEvents).toEqual([]);\r\n });\r\n\r\n it(\"reflects entity state changes in view model\", () => {\r\n procedureEntity.addEventId(\"test_event_1\");\r\n procedureEntity.addEventId(\"test_event_2\");\r\n procedureEntity.setOrderMatters(false);\r\n procedureEntity.setShowHints(false);\r\n procedureEntity.setIsQuiz(true);\r\n\r\n const vm = procedurePM.lastVM;\r\n\r\n expect(vm!.eventIds).toEqual([\"test_event_1\", \"test_event_2\"]);\r\n expect(vm!.orderMatters).toBe(false);\r\n expect(vm!.showHints).toBe(false);\r\n expect(vm!.isQuiz).toBe(true);\r\n });\r\n\r\n it(\"updates view model when user progress changes\", () => {\r\n procedureEntity.addEventId(\"event_1\");\r\n procedureEntity.addEventId(\"event_2\");\r\n\r\n procedureEntity.recordUserEvent(\"event_1\");\r\n\r\n const vm = procedurePM.lastVM;\r\n expect(vm!.userEventLog).toEqual([\"event_1\"]);\r\n expect(vm!.currentStepIndex).toBe(1);\r\n expect(vm!.progressPercentage).toBe(50);\r\n });\r\n\r\n it(\"correctly identifies equal view models\", () => {\r\n const vm1: ProcedureVM = {\r\n eventIds: [\"event_1\"],\r\n orderMatters: true,\r\n showHints: true,\r\n isQuiz: false,\r\n userEventLog: [],\r\n currentStepIndex: 0,\r\n isComplete: false,\r\n validationMessage: null,\r\n nextExpectedEvent: \"event_1\",\r\n progressPercentage: 0,\r\n availableEvents: [],\r\n authoringValidationMessage: null,\r\n score: null,\r\n isSubmitted: false,\r\n };\r\n\r\n const vm2: ProcedureVM = { ...vm1 };\r\n\r\n expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(true);\r\n });\r\n\r\n it(\"correctly identifies different view models\", () => {\r\n const vm1: ProcedureVM = {\r\n eventIds: [\"event_1\"],\r\n orderMatters: true,\r\n showHints: true,\r\n isQuiz: false,\r\n userEventLog: [],\r\n currentStepIndex: 0,\r\n isComplete: false,\r\n validationMessage: null,\r\n nextExpectedEvent: \"event_1\",\r\n progressPercentage: 0,\r\n availableEvents: [],\r\n authoringValidationMessage: null,\r\n score: null,\r\n isSubmitted: false,\r\n };\r\n\r\n const vm2: ProcedureVM = {\r\n ...vm1,\r\n orderMatters: false,\r\n };\r\n\r\n expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(false);\r\n });\r\n\r\n it(\"provides default view model when entity is missing\", () => {\r\n const isolatedAppObjects = makeAppObjectRepo();\r\n const isolatedAppObject = isolatedAppObjects.getOrCreate(\"Isolated\");\r\n const isolatedPM = makeProcedurePM(isolatedAppObject);\r\n\r\n const vm = isolatedPM.lastVM;\r\n\r\n expect(vm).toBeDefined();\r\n expect(vm!.eventIds).toEqual([]);\r\n expect(vm!.orderMatters).toBe(true);\r\n expect(vm!.showHints).toBe(true);\r\n expect(vm!.isQuiz).toBe(false);\r\n });\r\n\r\n it(\"notifies subscribers when entity changes\", () => {\r\n let notificationCount = 0;\r\n let lastVM: ProcedureVM | null = null;\r\n\r\n const mockView = (vm: ProcedureVM) => {\r\n notificationCount++;\r\n lastVM = vm;\r\n };\r\n\r\n procedurePM.addView(mockView);\r\n\r\n expect(notificationCount).toBeGreaterThan(0);\r\n const initialCount = notificationCount;\r\n\r\n procedureEntity.addEventId(\"new_event\");\r\n\r\n expect(notificationCount).toBeGreaterThan(initialCount);\r\n expect(lastVM!.eventIds).toContain(\"new_event\");\r\n\r\n procedurePM.removeView(mockView);\r\n });\r\n});\r\n"]}
1
+ {"version":3,"file":"ProcedurePM.test.js","sourceRoot":"","sources":["../../../../src/Procedure/PM/ProcedurePM.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObjectRepo, makeAppObjectRepo } from \"@vived/core\";\r\nimport { ProcedureEntity, makeProcedureEntity } from \"../Entities/ProcedureEntity\";\r\nimport { ProcedurePM, makeProcedurePM } from \"./ProcedurePM\";\r\nimport { ProcedureVM } from \"../types\";\r\n\r\ndescribe(\"ProcedurePM\", () => {\r\n let appObjects: AppObjectRepo;\r\n let procedureEntity: ProcedureEntity;\r\n let procedurePM: ProcedurePM;\r\n\r\n beforeEach(() => {\r\n appObjects = makeAppObjectRepo();\r\n const appObject = appObjects.getOrCreate(\"Procedure\");\r\n\r\n procedureEntity = makeProcedureEntity(appObject);\r\n procedurePM = makeProcedurePM(appObject);\r\n });\r\n\r\n it(\"can be retrieved via static get method\", () => {\r\n const retrieved = ProcedurePM.get(appObjects);\r\n expect(retrieved).toBe(procedurePM);\r\n });\r\n\r\n it(\"registers itself as singleton\", () => {\r\n expect(ProcedurePM.get(appObjects)).toBe(procedurePM);\r\n });\r\n\r\n it(\"generates correct initial view model\", () => {\r\n const vm = procedurePM.lastVM;\r\n\r\n expect(vm).toBeDefined();\r\n expect(vm!.eventIds).toEqual([]);\r\n expect(vm!.orderMatters).toBe(true);\r\n expect(vm!.showHints).toBe(true);\r\n expect(vm!.isQuiz).toBe(false);\r\n expect(vm!.userEventLog).toEqual([]);\r\n expect(vm!.currentStepIndex).toBe(0);\r\n expect(vm!.isComplete).toBe(false);\r\n expect(vm!.validationMessage).toBe(null);\r\n expect(vm!.nextExpectedEvent).toBe(null);\r\n expect(vm!.progressPercentage).toBe(0);\r\n expect(vm!.availableEvents).toEqual([]);\r\n });\r\n\r\n it(\"reflects entity state changes in view model\", () => {\r\n procedureEntity.addEventId(\"test_event_1\");\r\n procedureEntity.addEventId(\"test_event_2\");\r\n procedureEntity.setOrderMatters(false);\r\n procedureEntity.setShowHints(false);\r\n procedureEntity.setIsQuiz(true);\r\n\r\n const vm = procedurePM.lastVM;\r\n\r\n expect(vm!.eventIds).toEqual([\"test_event_1\", \"test_event_2\"]);\r\n expect(vm!.orderMatters).toBe(false);\r\n expect(vm!.showHints).toBe(false);\r\n expect(vm!.isQuiz).toBe(true);\r\n });\r\n\r\n it(\"updates view model when user progress changes\", () => {\r\n procedureEntity.addEventId(\"event_1\");\r\n procedureEntity.addEventId(\"event_2\");\r\n\r\n procedureEntity.recordUserEvent(\"event_1\");\r\n\r\n const vm = procedurePM.lastVM;\r\n expect(vm!.userEventLog).toEqual([\"event_1\"]);\r\n expect(vm!.currentStepIndex).toBe(1);\r\n expect(vm!.progressPercentage).toBe(50);\r\n });\r\n\r\n it(\"correctly identifies equal view models\", () => {\r\n const vm1: ProcedureVM = {\r\n eventIds: [\"event_1\"],\r\n orderMatters: true,\r\n showHints: true,\r\n isQuiz: false,\r\n isRecording: false,\r\n userEventLog: [],\r\n currentStepIndex: 0,\r\n isComplete: false,\r\n validationMessage: null,\r\n nextExpectedEvent: \"event_1\",\r\n progressPercentage: 0,\r\n availableEvents: [],\r\n authoringValidationMessage: null,\r\n score: null,\r\n isSubmitted: false,\r\n };\r\n\r\n const vm2: ProcedureVM = { ...vm1 };\r\n\r\n expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(true);\r\n });\r\n\r\n it(\"correctly identifies different view models\", () => {\r\n const vm1: ProcedureVM = {\r\n eventIds: [\"event_1\"],\r\n orderMatters: true,\r\n showHints: true,\r\n isQuiz: false,\r\n isRecording: false,\r\n userEventLog: [],\r\n currentStepIndex: 0,\r\n isComplete: false,\r\n validationMessage: null,\r\n nextExpectedEvent: \"event_1\",\r\n progressPercentage: 0,\r\n availableEvents: [],\r\n authoringValidationMessage: null,\r\n score: null,\r\n isSubmitted: false,\r\n };\r\n\r\n const vm2: ProcedureVM = {\r\n ...vm1,\r\n orderMatters: false,\r\n };\r\n\r\n expect(procedurePM.vmsAreEqual(vm1, vm2)).toBe(false);\r\n });\r\n\r\n it(\"provides default view model when entity is missing\", () => {\r\n const isolatedAppObjects = makeAppObjectRepo();\r\n const isolatedAppObject = isolatedAppObjects.getOrCreate(\"Isolated\");\r\n const isolatedPM = makeProcedurePM(isolatedAppObject);\r\n\r\n const vm = isolatedPM.lastVM;\r\n\r\n expect(vm).toBeDefined();\r\n expect(vm!.eventIds).toEqual([]);\r\n expect(vm!.orderMatters).toBe(true);\r\n expect(vm!.showHints).toBe(true);\r\n expect(vm!.isQuiz).toBe(false);\r\n });\r\n\r\n it(\"notifies subscribers when entity changes\", () => {\r\n let notificationCount = 0;\r\n let lastVM: ProcedureVM | null = null;\r\n\r\n const mockView = (vm: ProcedureVM) => {\r\n notificationCount++;\r\n lastVM = vm;\r\n };\r\n\r\n procedurePM.addView(mockView);\r\n\r\n expect(notificationCount).toBeGreaterThan(0);\r\n const initialCount = notificationCount;\r\n\r\n procedureEntity.addEventId(\"new_event\");\r\n\r\n expect(notificationCount).toBeGreaterThan(initialCount);\r\n expect(lastVM!.eventIds).toContain(\"new_event\");\r\n\r\n procedurePM.removeView(mockView);\r\n });\r\n});\r\n"]}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecordProcedureSessionUC = void 0;
4
+ exports.makeRecordProcedureSessionUC = makeRecordProcedureSessionUC;
5
+ const core_1 = require("@vived/core");
6
+ const BaseApp_1 = require("../../BaseApp");
7
+ const Challenge_1 = require("../../Challenge");
8
+ const EventSystem_1 = require("../../EventSystem");
9
+ const StateMachine_1 = require("../../StateMachine");
10
+ const UndoRedo_1 = require("../../UndoRedo");
11
+ const AddProcedureEventUC_1 = require("./AddProcedureEventUC");
12
+ const ProcedureEntity_1 = require("../Entities/ProcedureEntity");
13
+ const types_1 = require("../types");
14
+ class RecordProcedureSessionUC extends core_1.AppObjectUC {
15
+ }
16
+ exports.RecordProcedureSessionUC = RecordProcedureSessionUC;
17
+ RecordProcedureSessionUC.type = "RecordProcedureSessionUC";
18
+ RecordProcedureSessionUC.get = (appObjects) => appObjects
19
+ .getOrCreate("Procedure")
20
+ .getComponent(RecordProcedureSessionUC.type);
21
+ function makeRecordProcedureSessionUC(appObject) {
22
+ return new RecordProcedureSessionUCImp(appObject);
23
+ }
24
+ class RecordProcedureSessionUCImp extends RecordProcedureSessionUC {
25
+ get procedureEntity() {
26
+ return ProcedureEntity_1.ProcedureEntity.get(this.appObjects);
27
+ }
28
+ get baseAppState() {
29
+ return BaseApp_1.BaseAppState.get(this.appObjects);
30
+ }
31
+ get challengeEntity() {
32
+ return Challenge_1.ChallengeEntity.get(this.appObjects);
33
+ }
34
+ get eventEntity() {
35
+ return EventSystem_1.EventEntity.get(this.appObjects);
36
+ }
37
+ get stateMachine() {
38
+ return StateMachine_1.StateMachineEntity.get(this.appObjects);
39
+ }
40
+ dispose() {
41
+ if (this.procedureEntity?.isRecording) {
42
+ this.eventEntity?.removeEmissionListener(this.onEmission);
43
+ this.baseAppState?.removeChangeObserver(this.onAuthoringChanged);
44
+ this.challengeEntity?.removeChangeObserver(this.onChallengeChanged);
45
+ }
46
+ this.savedState = undefined;
47
+ super.dispose();
48
+ }
49
+ constructor(appObject) {
50
+ super(appObject, RecordProcedureSessionUC.type);
51
+ this.startRecording = () => {
52
+ if (!this.baseAppState?.isAuthoring)
53
+ return;
54
+ if (this.challengeEntity?.selectedChallenge !== "PROCEDURE")
55
+ return;
56
+ const procedureEntity = this.procedureEntity;
57
+ if (!procedureEntity) {
58
+ this.warn("ProcedureEntity not found - cannot start recording");
59
+ return;
60
+ }
61
+ if (procedureEntity.isRecording)
62
+ return;
63
+ const eventEntity = this.eventEntity;
64
+ if (!eventEntity) {
65
+ this.warn("EventEntity not found - cannot start recording");
66
+ return;
67
+ }
68
+ const stateMachine = this.stateMachine;
69
+ if (stateMachine) {
70
+ this.savedState = stateMachine.getSerializedStates();
71
+ }
72
+ else {
73
+ this.warn("StateMachineEntity not found - scene state will not be restored on stop");
74
+ }
75
+ procedureEntity.setIsRecording(true);
76
+ eventEntity.addEmissionListener(this.onEmission);
77
+ this.baseAppState?.addChangeObserver(this.onAuthoringChanged);
78
+ this.challengeEntity?.addChangeObserver(this.onChallengeChanged);
79
+ };
80
+ this.stopRecording = () => {
81
+ const procedureEntity = this.procedureEntity;
82
+ if (!procedureEntity?.isRecording)
83
+ return;
84
+ procedureEntity.setIsRecording(false);
85
+ this.eventEntity?.removeEmissionListener(this.onEmission);
86
+ this.baseAppState?.removeChangeObserver(this.onAuthoringChanged);
87
+ this.challengeEntity?.removeChangeObserver(this.onChallengeChanged);
88
+ if (this.savedState) {
89
+ const stateMachine = this.stateMachine;
90
+ if (stateMachine) {
91
+ const merged = {
92
+ ...this.savedState,
93
+ systems: [...this.savedState.systems],
94
+ };
95
+ const currentProcedure = stateMachine
96
+ .getSerializedStates()
97
+ .systems.find((s) => s.name === types_1.PROCEDURE_SYSTEM_NAME);
98
+ if (currentProcedure) {
99
+ const idx = merged.systems.findIndex((s) => s.name === types_1.PROCEDURE_SYSTEM_NAME);
100
+ if (idx >= 0) {
101
+ merged.systems[idx] = currentProcedure;
102
+ }
103
+ else {
104
+ merged.systems.push(currentProcedure);
105
+ }
106
+ }
107
+ stateMachine.setSerializedStates(merged, stateMachine.restoreDurationS);
108
+ (0, UndoRedo_1.clearUndoStack)(this.appObjects);
109
+ }
110
+ else {
111
+ this.warn("StateMachineEntity not found at stop - scene state not restored");
112
+ }
113
+ this.savedState = undefined;
114
+ }
115
+ };
116
+ this.onEmission = (eventId) => {
117
+ if (!this.procedureEntity?.isRecording)
118
+ return;
119
+ AddProcedureEventUC_1.AddProcedureEventUC.get(this.appObjects)?.addEvent(eventId);
120
+ };
121
+ this.onAuthoringChanged = () => {
122
+ if (!this.baseAppState?.isAuthoring) {
123
+ this.stopRecording();
124
+ }
125
+ };
126
+ this.onChallengeChanged = () => {
127
+ if (this.challengeEntity?.selectedChallenge !== "PROCEDURE") {
128
+ this.stopRecording();
129
+ }
130
+ };
131
+ }
132
+ }
133
+ //# sourceMappingURL=RecordProcedureSessionUC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordProcedureSessionUC.js","sourceRoot":"","sources":["../../../../src/Procedure/UCs/RecordProcedureSessionUC.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectUC, AppObjectRepo } from \"@vived/core\";\r\nimport { BaseAppState } from \"../../BaseApp\";\r\nimport { ChallengeEntity } from \"../../Challenge\";\r\nimport { EventEntity } from \"../../EventSystem\";\r\nimport { StateMachineEntity, SerializedStates } from \"../../StateMachine\";\r\nimport { clearUndoStack } from \"../../UndoRedo\";\r\nimport { AddProcedureEventUC } from \"./AddProcedureEventUC\";\r\nimport { ProcedureEntity } from \"../Entities/ProcedureEntity\";\r\nimport { PROCEDURE_SYSTEM_NAME } from \"../types\";\r\n\r\nexport abstract class RecordProcedureSessionUC extends AppObjectUC\r\n{\r\n\tstatic readonly type = \"RecordProcedureSessionUC\";\r\n\r\n\tabstract startRecording(): void;\r\n\tabstract stopRecording(): void;\r\n\r\n\tstatic get = (appObjects: AppObjectRepo): RecordProcedureSessionUC | undefined =>\r\n\t\tappObjects\r\n\t\t\t.getOrCreate(\"Procedure\")\r\n\t\t\t.getComponent<RecordProcedureSessionUC>(RecordProcedureSessionUC.type);\r\n}\r\n\r\nexport function makeRecordProcedureSessionUC(\r\n\tappObject: AppObject\r\n): RecordProcedureSessionUC\r\n{\r\n\treturn new RecordProcedureSessionUCImp(appObject);\r\n}\r\n\r\nclass RecordProcedureSessionUCImp extends RecordProcedureSessionUC\r\n{\r\n\tprivate savedState: SerializedStates | undefined;\r\n\r\n\tprivate get procedureEntity(): ProcedureEntity | undefined\r\n\t{\r\n\t\treturn ProcedureEntity.get(this.appObjects);\r\n\t}\r\n\r\n\tprivate get baseAppState(): BaseAppState | undefined\r\n\t{\r\n\t\treturn BaseAppState.get(this.appObjects);\r\n\t}\r\n\r\n\tprivate get challengeEntity(): ChallengeEntity | undefined\r\n\t{\r\n\t\treturn ChallengeEntity.get(this.appObjects);\r\n\t}\r\n\r\n\tprivate get eventEntity(): EventEntity | undefined\r\n\t{\r\n\t\treturn EventEntity.get(this.appObjects);\r\n\t}\r\n\r\n\tprivate get stateMachine(): StateMachineEntity | undefined\r\n\t{\r\n\t\treturn StateMachineEntity.get(this.appObjects);\r\n\t}\r\n\r\n\tstartRecording = (): void =>\r\n\t{\r\n\t\tif (!this.baseAppState?.isAuthoring) return;\r\n\t\tif (this.challengeEntity?.selectedChallenge !== \"PROCEDURE\") return;\r\n\r\n\t\tconst procedureEntity = this.procedureEntity;\r\n\t\tif (!procedureEntity)\r\n\t\t{\r\n\t\t\tthis.warn(\"ProcedureEntity not found - cannot start recording\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (procedureEntity.isRecording) return;\r\n\r\n\t\tconst eventEntity = this.eventEntity;\r\n\t\tif (!eventEntity)\r\n\t\t{\r\n\t\t\tthis.warn(\"EventEntity not found - cannot start recording\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst stateMachine = this.stateMachine;\r\n\t\tif (stateMachine)\r\n\t\t{\r\n\t\t\tthis.savedState = stateMachine.getSerializedStates();\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tthis.warn(\"StateMachineEntity not found - scene state will not be restored on stop\");\r\n\t\t}\r\n\r\n\t\tprocedureEntity.setIsRecording(true);\r\n\t\teventEntity.addEmissionListener(this.onEmission);\r\n\t\tthis.baseAppState?.addChangeObserver(this.onAuthoringChanged);\r\n\t\tthis.challengeEntity?.addChangeObserver(this.onChallengeChanged);\r\n\t};\r\n\r\n\tstopRecording = (): void =>\r\n\t{\r\n\t\tconst procedureEntity = this.procedureEntity;\r\n\t\tif (!procedureEntity?.isRecording) return;\r\n\r\n\t\tprocedureEntity.setIsRecording(false);\r\n\t\tthis.eventEntity?.removeEmissionListener(this.onEmission);\r\n\t\tthis.baseAppState?.removeChangeObserver(this.onAuthoringChanged);\r\n\t\tthis.challengeEntity?.removeChangeObserver(this.onChallengeChanged);\r\n\r\n\t\tif (this.savedState)\r\n\t\t{\r\n\t\t\tconst stateMachine = this.stateMachine;\r\n\t\t\tif (stateMachine)\r\n\t\t\t{\r\n\t\t\t\tconst merged: SerializedStates = {\r\n\t\t\t\t\t...this.savedState,\r\n\t\t\t\t\tsystems: [...this.savedState.systems],\r\n\t\t\t\t};\r\n\r\n\t\t\t\tconst currentProcedure = stateMachine\r\n\t\t\t\t\t.getSerializedStates()\r\n\t\t\t\t\t.systems.find((s) => s.name === PROCEDURE_SYSTEM_NAME);\r\n\r\n\t\t\t\tif (currentProcedure)\r\n\t\t\t\t{\r\n\t\t\t\t\tconst idx = merged.systems.findIndex(\r\n\t\t\t\t\t\t(s) => s.name === PROCEDURE_SYSTEM_NAME\r\n\t\t\t\t\t);\r\n\t\t\t\t\tif (idx >= 0)\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tmerged.systems[idx] = currentProcedure;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tmerged.systems.push(currentProcedure);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tstateMachine.setSerializedStates(merged, stateMachine.restoreDurationS);\r\n\t\t\t\tclearUndoStack(this.appObjects);\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\tthis.warn(\"StateMachineEntity not found at stop - scene state not restored\");\r\n\t\t\t}\r\n\r\n\t\t\tthis.savedState = undefined;\r\n\t\t}\r\n\t};\r\n\r\n\tprivate onEmission = (eventId: string): void =>\r\n\t{\r\n\t\tif (!this.procedureEntity?.isRecording) return;\r\n\t\tAddProcedureEventUC.get(this.appObjects)?.addEvent(eventId);\r\n\t};\r\n\r\n\tprivate onAuthoringChanged = (): void =>\r\n\t{\r\n\t\tif (!this.baseAppState?.isAuthoring)\r\n\t\t{\r\n\t\t\tthis.stopRecording();\r\n\t\t}\r\n\t};\r\n\r\n\tprivate onChallengeChanged = (): void =>\r\n\t{\r\n\t\tif (this.challengeEntity?.selectedChallenge !== \"PROCEDURE\")\r\n\t\t{\r\n\t\t\tthis.stopRecording();\r\n\t\t}\r\n\t};\r\n\r\n\tdispose(): void\r\n\t{\r\n\t\tif (this.procedureEntity?.isRecording)\r\n\t\t{\r\n\t\t\tthis.eventEntity?.removeEmissionListener(this.onEmission);\r\n\t\t\tthis.baseAppState?.removeChangeObserver(this.onAuthoringChanged);\r\n\t\t\tthis.challengeEntity?.removeChangeObserver(this.onChallengeChanged);\r\n\t\t}\r\n\t\tthis.savedState = undefined;\r\n\t\tsuper.dispose();\r\n\t}\r\n\r\n\tconstructor(appObject: AppObject)\r\n\t{\r\n\t\tsuper(appObject, RecordProcedureSessionUC.type);\r\n\t}\r\n}\r\n"]}