@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.
- package/dist/cjs/Procedure/Adapters/procedureAdapter.js +1 -0
- package/dist/cjs/Procedure/Adapters/procedureAdapter.js.map +1 -1
- package/dist/cjs/Procedure/Entities/ProcedureEntity.js +9 -0
- package/dist/cjs/Procedure/Entities/ProcedureEntity.js.map +1 -1
- package/dist/cjs/Procedure/Factories/ProcedureFeatureFactory.js +2 -0
- package/dist/cjs/Procedure/Factories/ProcedureFeatureFactory.js.map +1 -1
- package/dist/cjs/Procedure/Mocks/MockProcedureEntity.js +7 -0
- package/dist/cjs/Procedure/Mocks/MockProcedureEntity.js.map +1 -1
- package/dist/cjs/Procedure/PM/ProcedurePM.js +3 -0
- package/dist/cjs/Procedure/PM/ProcedurePM.js.map +1 -1
- package/dist/cjs/Procedure/PM/ProcedurePM.test.js +2 -0
- package/dist/cjs/Procedure/PM/ProcedurePM.test.js.map +1 -1
- package/dist/cjs/Procedure/UCs/RecordProcedureSessionUC.js +133 -0
- package/dist/cjs/Procedure/UCs/RecordProcedureSessionUC.js.map +1 -0
- package/dist/cjs/Procedure/UCs/RecordProcedureSessionUC.test.js +283 -0
- package/dist/cjs/Procedure/UCs/RecordProcedureSessionUC.test.js.map +1 -0
- package/dist/cjs/Procedure/UCs/SerializeProcedure.js +2 -1
- package/dist/cjs/Procedure/UCs/SerializeProcedure.js.map +1 -1
- package/dist/cjs/Procedure/UCs/index.js +1 -0
- package/dist/cjs/Procedure/UCs/index.js.map +1 -1
- package/dist/cjs/Procedure/types.js +2 -0
- package/dist/cjs/Procedure/types.js.map +1 -1
- package/dist/esm/Procedure/Adapters/procedureAdapter.js +1 -0
- package/dist/esm/Procedure/Adapters/procedureAdapter.js.map +1 -1
- package/dist/esm/Procedure/Entities/ProcedureEntity.js +9 -0
- package/dist/esm/Procedure/Entities/ProcedureEntity.js.map +1 -1
- package/dist/esm/Procedure/Factories/ProcedureFeatureFactory.js +2 -0
- package/dist/esm/Procedure/Factories/ProcedureFeatureFactory.js.map +1 -1
- package/dist/esm/Procedure/Mocks/MockProcedureEntity.js +7 -0
- package/dist/esm/Procedure/Mocks/MockProcedureEntity.js.map +1 -1
- package/dist/esm/Procedure/PM/ProcedurePM.js +3 -0
- package/dist/esm/Procedure/PM/ProcedurePM.js.map +1 -1
- package/dist/esm/Procedure/PM/ProcedurePM.test.js +2 -0
- package/dist/esm/Procedure/PM/ProcedurePM.test.js.map +1 -1
- package/dist/esm/Procedure/UCs/RecordProcedureSessionUC.js +128 -0
- package/dist/esm/Procedure/UCs/RecordProcedureSessionUC.js.map +1 -0
- package/dist/esm/Procedure/UCs/RecordProcedureSessionUC.test.js +281 -0
- package/dist/esm/Procedure/UCs/RecordProcedureSessionUC.test.js.map +1 -0
- package/dist/esm/Procedure/UCs/SerializeProcedure.js +2 -1
- package/dist/esm/Procedure/UCs/SerializeProcedure.js.map +1 -1
- package/dist/esm/Procedure/UCs/index.js +1 -0
- package/dist/esm/Procedure/UCs/index.js.map +1 -1
- package/dist/esm/Procedure/types.js +1 -1
- package/dist/esm/Procedure/types.js.map +1 -1
- package/dist/types/Procedure/Adapters/procedureAdapter.d.ts.map +1 -1
- package/dist/types/Procedure/Entities/ProcedureEntity.d.ts +2 -0
- package/dist/types/Procedure/Entities/ProcedureEntity.d.ts.map +1 -1
- package/dist/types/Procedure/Factories/ProcedureFeatureFactory.d.ts.map +1 -1
- package/dist/types/Procedure/Mocks/MockProcedureEntity.d.ts +3 -0
- package/dist/types/Procedure/Mocks/MockProcedureEntity.d.ts.map +1 -1
- package/dist/types/Procedure/UCs/RecordProcedureSessionUC.d.ts +9 -0
- package/dist/types/Procedure/UCs/RecordProcedureSessionUC.d.ts.map +1 -0
- package/dist/types/Procedure/UCs/RecordProcedureSessionUC.test.d.ts +2 -0
- package/dist/types/Procedure/UCs/RecordProcedureSessionUC.test.d.ts.map +1 -0
- package/dist/types/Procedure/UCs/SerializeProcedure.d.ts.map +1 -1
- package/dist/types/Procedure/UCs/index.d.ts +1 -0
- package/dist/types/Procedure/UCs/index.d.ts.map +1 -1
- package/dist/types/Procedure/types.d.ts +2 -0
- package/dist/types/Procedure/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/Procedure/CONTEXT.md +21 -0
|
@@ -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":";;;
|
|
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":";;;
|
|
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":";;;AAiBA,0CAEC;AAnBD,sCAKqB;AACrB,iEAA8D;AAC9D,mDAAgD;AAGhD,MAAsB,WAAY,SAAQ,kBAAwB;;AAAlE,kCAKC;AAJiB,gBAAI,GAAG,aAAa,CAAC;AAE9B,eAAG,GAAG,CAAC,UAAyB,EAA2B,EAAE,CAClE,IAAA,4BAAqB,EAAC,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAGxD,SAAgB,eAAe,CAAC,SAAoB;IAClD,OAAO,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,cAAe,SAAQ,WAAW;IACtC,IAAY,eAAe;QACzB,OAAO,iCAAe,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,IAAY,WAAW;QACrB,OAAO,yBAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED,WAAW,CAAC,CAAc,EAAE,CAAc;QACxC,OAAO,CACL,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;YACzD,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,YAAY;YACjC,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;YAC3B,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YACrB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;YACjE,CAAC,CAAC,gBAAgB,KAAK,CAAC,CAAC,gBAAgB;YACzC,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;YAC7B,CAAC,CAAC,iBAAiB,KAAK,CAAC,CAAC,iBAAiB;YAC3C,CAAC,CAAC,iBAAiB,KAAK,CAAC,CAAC,iBAAiB;YAC3C,CAAC,CAAC,kBAAkB,KAAK,CAAC,CAAC,kBAAkB;YAC7C,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC;YACvE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;YACnD,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,CAChC,CAAC;IACJ,CAAC;
|
|
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"]}
|