@vived/host 4.5.2 → 4.6.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/Apps/Entities/AppEntity.js +29 -3
- package/dist/cjs/Apps/Entities/AppEntity.js.map +1 -1
- package/dist/cjs/Apps/PMs/AppPM.js +44 -3
- package/dist/cjs/Apps/PMs/AppPM.js.map +1 -1
- package/dist/cjs/Assets/Adapters/assetFileAdapter.js +45 -0
- package/dist/cjs/Assets/Adapters/assetFileAdapter.js.map +1 -0
- package/dist/cjs/Assets/Adapters/index.js +1 -0
- package/dist/cjs/Assets/Adapters/index.js.map +1 -1
- package/dist/cjs/Assets/Factories/setupAssetsForSandbox.js +1 -0
- package/dist/cjs/Assets/Factories/setupAssetsForSandbox.js.map +1 -1
- package/dist/cjs/Assets/Mocks/AssetFilePMMock.js +24 -0
- package/dist/cjs/Assets/Mocks/AssetFilePMMock.js.map +1 -0
- package/dist/cjs/Assets/Mocks/index.js +1 -0
- package/dist/cjs/Assets/Mocks/index.js.map +1 -1
- package/dist/cjs/Assets/PMs/AssetFilePM.js +134 -0
- package/dist/cjs/Assets/PMs/AssetFilePM.js.map +1 -0
- package/dist/cjs/Assets/PMs/index.js +1 -0
- package/dist/cjs/Assets/PMs/index.js.map +1 -1
- package/dist/cjs/ChallengeResults/Entities/ChallengeResults.js.map +1 -1
- package/dist/cjs/ChallengeResults/PMs/ChallengeResultsListPM.js +28 -5
- package/dist/cjs/ChallengeResults/PMs/ChallengeResultsListPM.js.map +1 -1
- package/dist/cjs/ChallengeResults/PMs/ChallengeScoreListPM.js +9 -3
- package/dist/cjs/ChallengeResults/PMs/ChallengeScoreListPM.js.map +1 -1
- package/dist/cjs/ChallengeResults/PMs/HasChallengeResultsPM.js +20 -1
- package/dist/cjs/ChallengeResults/PMs/HasChallengeResultsPM.js.map +1 -1
- package/dist/cjs/Handler/UCs/index.js +0 -1
- package/dist/cjs/Handler/UCs/index.js.map +1 -1
- package/dist/esm/Apps/Entities/AppEntity.js +30 -4
- package/dist/esm/Apps/Entities/AppEntity.js.map +1 -1
- package/dist/esm/Apps/PMs/AppPM.js +44 -3
- package/dist/esm/Apps/PMs/AppPM.js.map +1 -1
- package/dist/esm/Assets/Adapters/assetFileAdapter.js +42 -0
- package/dist/esm/Assets/Adapters/assetFileAdapter.js.map +1 -0
- package/dist/esm/Assets/Adapters/index.js +1 -0
- package/dist/esm/Assets/Adapters/index.js.map +1 -1
- package/dist/esm/Assets/Factories/setupAssetsForSandbox.js +2 -1
- package/dist/esm/Assets/Factories/setupAssetsForSandbox.js.map +1 -1
- package/dist/esm/Assets/Mocks/AssetFilePMMock.js +20 -0
- package/dist/esm/Assets/Mocks/AssetFilePMMock.js.map +1 -0
- package/dist/esm/Assets/Mocks/index.js +1 -0
- package/dist/esm/Assets/Mocks/index.js.map +1 -1
- package/dist/esm/Assets/PMs/AssetFilePM.js +129 -0
- package/dist/esm/Assets/PMs/AssetFilePM.js.map +1 -0
- package/dist/esm/Assets/PMs/index.js +1 -0
- package/dist/esm/Assets/PMs/index.js.map +1 -1
- package/dist/esm/ChallengeResults/Entities/ChallengeResults.js.map +1 -1
- package/dist/esm/ChallengeResults/PMs/ChallengeResultsListPM.js +28 -5
- package/dist/esm/ChallengeResults/PMs/ChallengeResultsListPM.js.map +1 -1
- package/dist/esm/ChallengeResults/PMs/ChallengeScoreListPM.js +9 -3
- package/dist/esm/ChallengeResults/PMs/ChallengeScoreListPM.js.map +1 -1
- package/dist/esm/ChallengeResults/PMs/HasChallengeResultsPM.js +20 -1
- package/dist/esm/ChallengeResults/PMs/HasChallengeResultsPM.js.map +1 -1
- package/dist/esm/Handler/UCs/index.js +0 -1
- package/dist/esm/Handler/UCs/index.js.map +1 -1
- package/dist/types/Apps/Entities/AppEntity.d.ts +1 -0
- package/dist/types/Apps/Entities/AppEntity.d.ts.map +1 -1
- package/dist/types/Apps/PMs/AppPM.d.ts +2 -0
- package/dist/types/Apps/PMs/AppPM.d.ts.map +1 -1
- package/dist/types/Assets/Adapters/assetFileAdapter.d.ts +8 -0
- package/dist/types/Assets/Adapters/assetFileAdapter.d.ts.map +1 -0
- package/dist/types/Assets/Adapters/index.d.ts +1 -0
- package/dist/types/Assets/Adapters/index.d.ts.map +1 -1
- package/dist/types/Assets/Factories/setupAssetsForSandbox.d.ts.map +1 -1
- package/dist/types/Assets/Mocks/AssetFilePMMock.d.ts +19 -0
- package/dist/types/Assets/Mocks/AssetFilePMMock.d.ts.map +1 -0
- package/dist/types/Assets/Mocks/index.d.ts +1 -0
- package/dist/types/Assets/Mocks/index.d.ts.map +1 -1
- package/dist/types/Assets/PMs/AssetFilePM.d.ts +51 -0
- package/dist/types/Assets/PMs/AssetFilePM.d.ts.map +1 -0
- package/dist/types/Assets/PMs/index.d.ts +1 -0
- package/dist/types/Assets/PMs/index.d.ts.map +1 -1
- package/dist/types/ChallengeResults/Entities/ChallengeResults.d.ts.map +1 -1
- package/dist/types/ChallengeResults/PMs/ChallengeResultsListPM.d.ts +2 -2
- package/dist/types/ChallengeResults/PMs/ChallengeResultsListPM.d.ts.map +1 -1
- package/dist/types/ChallengeResults/PMs/ChallengeScoreListPM.d.ts.map +1 -1
- package/dist/types/ChallengeResults/PMs/HasChallengeResultsPM.d.ts.map +1 -1
- package/dist/types/Handler/UCs/index.d.ts +0 -1
- package/dist/types/Handler/UCs/index.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
// filepath: c:\Users\amosp\Documents\WebGL\vivedlearning_host\src\Assets\PMs\AssetFilePM.ts
|
|
2
|
+
import { AppObjectPM } from "@vived/core";
|
|
3
|
+
import { AssetEntity } from "../Entities/AssetEntity";
|
|
4
|
+
/**
|
|
5
|
+
* Default empty AssetFileVM for initialization
|
|
6
|
+
*/
|
|
7
|
+
export const defaultAssetFileVM = {
|
|
8
|
+
blobURL: undefined,
|
|
9
|
+
isFetchingFile: false,
|
|
10
|
+
fileHasBeenFetched: false,
|
|
11
|
+
fetchError: undefined
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Presentation Manager for Asset file status
|
|
15
|
+
*
|
|
16
|
+
* The AssetFilePM is responsible for:
|
|
17
|
+
* - Converting the file-related properties of AssetEntity into a view-friendly format (AssetFileVM)
|
|
18
|
+
* - Notifying the view when asset file status changes
|
|
19
|
+
* - Providing comparison utilities for view models
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* 1. Retrieve an instance with `AssetFilePM.getByID(assetId, appObjects)`
|
|
23
|
+
* 2. Subscribe to view updates with `pm.addView(callback)`
|
|
24
|
+
* 3. Access current view data with `pm.lastVM`
|
|
25
|
+
*/
|
|
26
|
+
export class AssetFilePM extends AppObjectPM {
|
|
27
|
+
/**
|
|
28
|
+
* Retrieves an AssetFilePM instance for a specific asset by ID
|
|
29
|
+
*
|
|
30
|
+
* @param assetID - The unique identifier of the asset
|
|
31
|
+
* @param appObjects - The repository of app objects
|
|
32
|
+
* @returns The AssetFilePM instance or undefined if not found
|
|
33
|
+
*/
|
|
34
|
+
static getByID(assetID, appObjects) {
|
|
35
|
+
const appObject = appObjects.get(assetID);
|
|
36
|
+
if (!appObject) {
|
|
37
|
+
appObjects.submitWarning("AssetFilePM.getByID", "Unable to find app object by ID " + assetID);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const pm = appObject.getComponent(AssetFilePM.type);
|
|
41
|
+
if (!pm) {
|
|
42
|
+
appObjects.submitWarning("AssetFilePM.getByID", "App Object does not have a AssetFilePM");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
return pm;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
AssetFilePM.type = "AssetFilePM";
|
|
49
|
+
/**
|
|
50
|
+
* Creates a new AssetFilePM instance
|
|
51
|
+
*
|
|
52
|
+
* @param appObject - The app object to associate with this PM
|
|
53
|
+
* @returns A new AssetFilePM instance
|
|
54
|
+
*/
|
|
55
|
+
export function makeAssetFilePM(appObject) {
|
|
56
|
+
return new AssetFilePMImp(appObject);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Implementation of the AssetFilePM abstract class
|
|
60
|
+
* Handles the connection between AssetEntity file properties and view
|
|
61
|
+
*/
|
|
62
|
+
class AssetFilePMImp extends AssetFilePM {
|
|
63
|
+
get asset() {
|
|
64
|
+
return this.getCachedLocalComponent(AssetEntity.type);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Compares two AssetFileVM instances for equality
|
|
68
|
+
* Used to determine if the view needs to update
|
|
69
|
+
*
|
|
70
|
+
* @param a - First AssetFileVM to compare
|
|
71
|
+
* @param b - Second AssetFileVM to compare
|
|
72
|
+
* @returns True if view models are equal, false otherwise
|
|
73
|
+
*/
|
|
74
|
+
vmsAreEqual(a, b) {
|
|
75
|
+
if (a.blobURL !== b.blobURL)
|
|
76
|
+
return false;
|
|
77
|
+
if (a.isFetchingFile !== b.isFetchingFile)
|
|
78
|
+
return false;
|
|
79
|
+
if (a.fileHasBeenFetched !== b.fileHasBeenFetched)
|
|
80
|
+
return false;
|
|
81
|
+
// Handle errors comparison (both undefined, or same message)
|
|
82
|
+
if (a.fetchError !== b.fetchError) {
|
|
83
|
+
if (a.fetchError === undefined && b.fetchError !== undefined)
|
|
84
|
+
return false;
|
|
85
|
+
if (a.fetchError !== undefined && b.fetchError === undefined)
|
|
86
|
+
return false;
|
|
87
|
+
if (a.fetchError !== undefined &&
|
|
88
|
+
b.fetchError !== undefined &&
|
|
89
|
+
a.fetchError.message !== b.fetchError.message)
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Cleans up resources and removes observers when the PM is disposed
|
|
96
|
+
*/
|
|
97
|
+
dispose() {
|
|
98
|
+
if (this.asset) {
|
|
99
|
+
this.asset.removeChangeObserver(this.onAssetChange);
|
|
100
|
+
}
|
|
101
|
+
super.dispose();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Creates a new AssetFilePMImp instance
|
|
105
|
+
*
|
|
106
|
+
* @param appObject - The app object to associate with this PM
|
|
107
|
+
*/
|
|
108
|
+
constructor(appObject) {
|
|
109
|
+
super(appObject, AssetFilePM.type);
|
|
110
|
+
/**
|
|
111
|
+
* Observer callback that updates the view model when the entity changes
|
|
112
|
+
* Transforms entity data into view model format
|
|
113
|
+
*/
|
|
114
|
+
this.onAssetChange = () => {
|
|
115
|
+
if (!this.asset)
|
|
116
|
+
return;
|
|
117
|
+
const vm = {
|
|
118
|
+
blobURL: this.asset.blobURL,
|
|
119
|
+
isFetchingFile: this.asset.isFetchingFile,
|
|
120
|
+
fileHasBeenFetched: this.asset.fileHasBeenFetched,
|
|
121
|
+
fetchError: this.asset.fetchError
|
|
122
|
+
};
|
|
123
|
+
this.doUpdateView(vm);
|
|
124
|
+
};
|
|
125
|
+
this.asset?.addChangeObserver(this.onAssetChange);
|
|
126
|
+
this.onAssetChange();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=AssetFilePM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetFilePM.js","sourceRoot":"","sources":["../../../../src/Assets/PMs/AssetFilePM.ts"],"names":[],"mappings":"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","sourcesContent":["// filepath: c:\\Users\\amosp\\Documents\\WebGL\\vivedlearning_host\\src\\Assets\\PMs\\AssetFilePM.ts\r\nimport { AppObject, AppObjectPM, AppObjectRepo } from \"@vived/core\";\r\nimport { AssetEntity } from \"../Entities/AssetEntity\";\r\n\r\n/**\r\n * View Model for Asset file information\r\n * Represents the data needed by the view to display asset file status\r\n */\r\nexport interface AssetFileVM {\r\n /** URL to the asset's file blob for direct access */\r\n blobURL: string | undefined;\r\n /** Whether the asset file is currently being fetched */\r\n isFetchingFile: boolean;\r\n /** Whether the asset file has been successfully fetched */\r\n fileHasBeenFetched: boolean;\r\n /** Error that occurred during file fetching, if any */\r\n fetchError: Error | undefined;\r\n}\r\n\r\n/**\r\n * Default empty AssetFileVM for initialization\r\n */\r\nexport const defaultAssetFileVM: AssetFileVM = {\r\n blobURL: undefined,\r\n isFetchingFile: false,\r\n fileHasBeenFetched: false,\r\n fetchError: undefined\r\n};\r\n\r\n/**\r\n * Presentation Manager for Asset file status\r\n *\r\n * The AssetFilePM is responsible for:\r\n * - Converting the file-related properties of AssetEntity into a view-friendly format (AssetFileVM)\r\n * - Notifying the view when asset file status changes\r\n * - Providing comparison utilities for view models\r\n *\r\n * Usage:\r\n * 1. Retrieve an instance with `AssetFilePM.getByID(assetId, appObjects)`\r\n * 2. Subscribe to view updates with `pm.addView(callback)`\r\n * 3. Access current view data with `pm.lastVM`\r\n */\r\nexport abstract class AssetFilePM extends AppObjectPM<AssetFileVM> {\r\n static type = \"AssetFilePM\";\r\n\r\n /**\r\n * Retrieves an AssetFilePM instance for a specific asset by ID\r\n *\r\n * @param assetID - The unique identifier of the asset\r\n * @param appObjects - The repository of app objects\r\n * @returns The AssetFilePM instance or undefined if not found\r\n */\r\n static getByID(\r\n assetID: string,\r\n appObjects: AppObjectRepo\r\n ): AssetFilePM | undefined {\r\n const appObject = appObjects.get(assetID);\r\n if (!appObject) {\r\n appObjects.submitWarning(\r\n \"AssetFilePM.getByID\",\r\n \"Unable to find app object by ID \" + assetID\r\n );\r\n return;\r\n }\r\n\r\n const pm = appObject.getComponent<AssetFilePM>(AssetFilePM.type);\r\n if (!pm) {\r\n appObjects.submitWarning(\r\n \"AssetFilePM.getByID\",\r\n \"App Object does not have a AssetFilePM\"\r\n );\r\n return;\r\n }\r\n return pm;\r\n }\r\n}\r\n\r\n/**\r\n * Creates a new AssetFilePM instance\r\n *\r\n * @param appObject - The app object to associate with this PM\r\n * @returns A new AssetFilePM instance\r\n */\r\nexport function makeAssetFilePM(appObject: AppObject): AssetFilePM {\r\n return new AssetFilePMImp(appObject);\r\n}\r\n\r\n/**\r\n * Implementation of the AssetFilePM abstract class\r\n * Handles the connection between AssetEntity file properties and view\r\n */\r\nclass AssetFilePMImp extends AssetFilePM {\r\n private get asset() {\r\n\t\treturn this.getCachedLocalComponent<AssetEntity>(AssetEntity.type);\r\n\t}\r\n\r\n /**\r\n * Compares two AssetFileVM instances for equality\r\n * Used to determine if the view needs to update\r\n *\r\n * @param a - First AssetFileVM to compare\r\n * @param b - Second AssetFileVM to compare\r\n * @returns True if view models are equal, false otherwise\r\n */\r\n vmsAreEqual(a: AssetFileVM, b: AssetFileVM): boolean {\r\n if (a.blobURL !== b.blobURL) return false;\r\n if (a.isFetchingFile !== b.isFetchingFile) return false;\r\n if (a.fileHasBeenFetched !== b.fileHasBeenFetched) return false;\r\n\r\n // Handle errors comparison (both undefined, or same message)\r\n if (a.fetchError !== b.fetchError) {\r\n if (a.fetchError === undefined && b.fetchError !== undefined)\r\n return false;\r\n if (a.fetchError !== undefined && b.fetchError === undefined)\r\n return false;\r\n if (\r\n a.fetchError !== undefined &&\r\n b.fetchError !== undefined &&\r\n a.fetchError.message !== b.fetchError.message\r\n )\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Observer callback that updates the view model when the entity changes\r\n * Transforms entity data into view model format\r\n */\r\n private onAssetChange = () => {\r\n if (!this.asset) return;\r\n\r\n const vm: AssetFileVM = {\r\n blobURL: this.asset.blobURL,\r\n isFetchingFile: this.asset.isFetchingFile,\r\n fileHasBeenFetched: this.asset.fileHasBeenFetched,\r\n fetchError: this.asset.fetchError\r\n };\r\n\r\n this.doUpdateView(vm);\r\n };\r\n\r\n /**\r\n * Cleans up resources and removes observers when the PM is disposed\r\n */\r\n dispose(): void {\r\n if (this.asset) {\r\n this.asset.removeChangeObserver(this.onAssetChange);\r\n }\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Creates a new AssetFilePMImp instance\r\n *\r\n * @param appObject - The app object to associate with this PM\r\n */\r\n constructor(appObject: AppObject) {\r\n super(appObject, AssetFilePM.type);\r\n\r\n this.asset?.addChangeObserver(this.onAssetChange);\r\n this.onAssetChange();\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Assets/PMs/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC","sourcesContent":["export * from \"./AppAssetListPM\";\r\nexport * from \"./AssetPM\";\r\nexport * from \"./EditingAppAssetPM\";\r\nexport * from \"./ShowArchivedAppAssetPM\"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Assets/PMs/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC","sourcesContent":["export * from \"./AppAssetListPM\";\r\nexport * from \"./AssetPM\";\r\nexport * from \"./AssetFilePM\";\r\nexport * from \"./EditingAppAssetPM\";\r\nexport * from \"./ShowArchivedAppAssetPM\";\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChallengeResults.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Entities/ChallengeResults.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\n\r\nexport type ChallengeResultType =\r\n | \"HIT\"\r\n | \"MULTIHIT\"\r\n | \"QUALITY\"\r\n | \"SCORE\"\r\n | \"PROGRESS\";\r\n\r\nexport interface ChallengeResult {\r\n slideID: string;\r\n tries: number;\r\n message: string;\r\n type: ChallengeResultType;\r\n resultData:\r\n | ChallengeResultHitData\r\n | ChallengeResultMultiHitData\r\n | ChallengeResultQualityData\r\n | ChallengeResultScoreData\r\n | ChallengeResultProgressData;\r\n}\r\n\r\nexport interface ChallengeResultHitData {\r\n success: boolean;\r\n}\r\n\r\nexport interface ChallengeResultProgressData {\r\n maxProgress: number;\r\n}\r\n\r\nexport interface ChallengeResultMultiHitData {\r\n hits: number;\r\n misses: number;\r\n unanswered: number;\r\n}\r\n\r\nexport interface ChallengeResultQualityData {\r\n stars: number;\r\n maxStars: number;\r\n}\r\n\r\nexport interface ChallengeResultScoreData {\r\n score: number;\r\n maxScore: number;\r\n}\r\n\r\nexport abstract class ChallengeResultsEntity extends AppObjectEntity {\r\n static type = \"ChallengeResultsEntity\";\r\n\r\n abstract get results(): ChallengeResult[];\r\n abstract submitHitResult: (\r\n slideID: string,\r\n success: boolean,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitMultiHitResult: (\r\n slideID: string,\r\n hits: number,\r\n misses: number,\r\n unanswered: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitQualityResult: (\r\n slideID: string,\r\n stars: number,\r\n maxStars: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitScoreResult: (\r\n slideID: string,\r\n score: number,\r\n maxScore: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitProgressResult: (\r\n slideID: string,\r\n maxProgress: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract getResultForSlide: (slideID: string) => ChallengeResult | undefined;\r\n\r\n abstract getScoreForSlide: (slideID: string) => number;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeChallengeResults(\r\n appObject: AppObject\r\n): ChallengeResultsEntity {\r\n return new ChallengeResultsImp(appObject);\r\n}\r\n\r\nclass ChallengeResultsImp extends ChallengeResultsEntity {\r\n private resultLookup = new Map<string, ChallengeResult>();\r\n\r\n get results(): ChallengeResult[] {\r\n return Array.from(this.resultLookup.values());\r\n }\r\n\r\n submitHitResult = (\r\n slideID: string,\r\n success: boolean,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultHitData = {\r\n success\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"HIT\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitMultiHitResult = (\r\n slideID: string,\r\n hits: number,\r\n misses: number,\r\n unanswered: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultMultiHitData = {\r\n hits,\r\n misses,\r\n unanswered\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"MULTIHIT\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitQualityResult = (\r\n slideID: string,\r\n stars: number,\r\n maxStars: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultQualityData = {\r\n stars,\r\n maxStars\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"QUALITY\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitScoreResult = (\r\n slideID: string,\r\n score: number,\r\n maxScore: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultScoreData = {\r\n score,\r\n maxScore\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"SCORE\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n getResultForSlide = (slideID: string): ChallengeResult | undefined => {\r\n return this.resultLookup.get(slideID);\r\n };\r\n\r\n getScoreForSlide = (slideID: string): number => {\r\n const result = this.getResultForSlide(slideID);\r\n if (!result) {\r\n return 0;\r\n }\r\n\r\n switch (result.type) {\r\n case \"HIT\": {\r\n const hitData = result.resultData as ChallengeResultHitData;\r\n return hitData.success ? 1 : 0;\r\n }\r\n case \"MULTIHIT\": {\r\n const multiHitData = result.resultData as ChallengeResultMultiHitData;\r\n const total = multiHitData.hits + multiHitData.unanswered;\r\n return total > 0 ? multiHitData.hits / total : 0;\r\n }\r\n case \"QUALITY\": {\r\n const qualityData = result.resultData as ChallengeResultQualityData;\r\n return qualityData.maxStars > 0\r\n ? qualityData.stars / qualityData.maxStars\r\n : 0;\r\n }\r\n case \"SCORE\": {\r\n const scoreData = result.resultData as ChallengeResultScoreData;\r\n return scoreData.maxScore > 0\r\n ? scoreData.score / scoreData.maxScore\r\n : 0;\r\n }\r\n case \"PROGRESS\": {\r\n const progressData = result.resultData as ChallengeResultProgressData;\r\n return progressData.maxProgress / 100;\r\n }\r\n default:\r\n return 0;\r\n }\r\n };\r\n\r\n submitProgressResult = (\r\n slideID: string,\r\n maxProgress: number,\r\n message: string\r\n ): void => {\r\n const currentResult = this.getResultForSlide(slideID);\r\n if (\r\n currentResult &&\r\n (currentResult.resultData as ChallengeResultProgressData).maxProgress >\r\n maxProgress\r\n ) {\r\n return;\r\n }\r\n\r\n const resultData: ChallengeResultProgressData = {\r\n maxProgress\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries: 1,\r\n type: \"PROGRESS\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ChallengeResultsEntity.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"ChallengeResults.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/Entities/ChallengeResults.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo\r\n} from \"@vived/core\";\r\n\r\nexport type ChallengeResultType =\r\n | \"HIT\"\r\n | \"MULTIHIT\"\r\n | \"QUALITY\"\r\n | \"SCORE\"\r\n | \"PROGRESS\"\r\n\r\nexport interface ChallengeResult {\r\n slideID: string;\r\n tries: number;\r\n message: string;\r\n type: ChallengeResultType;\r\n resultData:\r\n | ChallengeResultHitData\r\n | ChallengeResultMultiHitData\r\n | ChallengeResultQualityData\r\n | ChallengeResultScoreData\r\n | ChallengeResultProgressData;\r\n}\r\n\r\nexport interface ChallengeResultHitData {\r\n success: boolean;\r\n}\r\n\r\nexport interface ChallengeResultProgressData {\r\n maxProgress: number;\r\n}\r\n\r\nexport interface ChallengeResultMultiHitData {\r\n hits: number;\r\n misses: number;\r\n unanswered: number;\r\n}\r\n\r\nexport interface ChallengeResultQualityData {\r\n stars: number;\r\n maxStars: number;\r\n}\r\n\r\nexport interface ChallengeResultScoreData {\r\n score: number;\r\n maxScore: number;\r\n}\r\n\r\nexport abstract class ChallengeResultsEntity extends AppObjectEntity {\r\n static type = \"ChallengeResultsEntity\";\r\n\r\n abstract get results(): ChallengeResult[];\r\n abstract submitHitResult: (\r\n slideID: string,\r\n success: boolean,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitMultiHitResult: (\r\n slideID: string,\r\n hits: number,\r\n misses: number,\r\n unanswered: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitQualityResult: (\r\n slideID: string,\r\n stars: number,\r\n maxStars: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitScoreResult: (\r\n slideID: string,\r\n score: number,\r\n maxScore: number,\r\n tries: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract submitProgressResult: (\r\n slideID: string,\r\n maxProgress: number,\r\n message: string\r\n ) => void;\r\n\r\n abstract getResultForSlide: (slideID: string) => ChallengeResult | undefined;\r\n\r\n abstract getScoreForSlide: (slideID: string) => number;\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeChallengeResults(\r\n appObject: AppObject\r\n): ChallengeResultsEntity {\r\n return new ChallengeResultsImp(appObject);\r\n}\r\n\r\nclass ChallengeResultsImp extends ChallengeResultsEntity {\r\n private resultLookup = new Map<string, ChallengeResult>();\r\n\r\n get results(): ChallengeResult[] {\r\n return Array.from(this.resultLookup.values());\r\n }\r\n\r\n submitHitResult = (\r\n slideID: string,\r\n success: boolean,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultHitData = {\r\n success\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"HIT\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitMultiHitResult = (\r\n slideID: string,\r\n hits: number,\r\n misses: number,\r\n unanswered: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultMultiHitData = {\r\n hits,\r\n misses,\r\n unanswered\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"MULTIHIT\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitQualityResult = (\r\n slideID: string,\r\n stars: number,\r\n maxStars: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultQualityData = {\r\n stars,\r\n maxStars\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"QUALITY\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n submitScoreResult = (\r\n slideID: string,\r\n score: number,\r\n maxScore: number,\r\n tries: number,\r\n message: string\r\n ): void => {\r\n const resultData: ChallengeResultScoreData = {\r\n score,\r\n maxScore\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries,\r\n type: \"SCORE\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n getResultForSlide = (slideID: string): ChallengeResult | undefined => {\r\n return this.resultLookup.get(slideID);\r\n };\r\n\r\n getScoreForSlide = (slideID: string): number => {\r\n const result = this.getResultForSlide(slideID);\r\n if (!result) {\r\n return 0;\r\n }\r\n\r\n switch (result.type) {\r\n case \"HIT\": {\r\n const hitData = result.resultData as ChallengeResultHitData;\r\n return hitData.success ? 1 : 0;\r\n }\r\n case \"MULTIHIT\": {\r\n const multiHitData = result.resultData as ChallengeResultMultiHitData;\r\n const total = multiHitData.hits + multiHitData.unanswered;\r\n return total > 0 ? multiHitData.hits / total : 0;\r\n }\r\n case \"QUALITY\": {\r\n const qualityData = result.resultData as ChallengeResultQualityData;\r\n return qualityData.maxStars > 0\r\n ? qualityData.stars / qualityData.maxStars\r\n : 0;\r\n }\r\n case \"SCORE\": {\r\n const scoreData = result.resultData as ChallengeResultScoreData;\r\n return scoreData.maxScore > 0\r\n ? scoreData.score / scoreData.maxScore\r\n : 0;\r\n }\r\n case \"PROGRESS\": {\r\n const progressData = result.resultData as ChallengeResultProgressData;\r\n return progressData.maxProgress / 100;\r\n }\r\n default:\r\n return 0;\r\n }\r\n };\r\n\r\n submitProgressResult = (\r\n slideID: string,\r\n maxProgress: number,\r\n message: string\r\n ): void => {\r\n const currentResult = this.getResultForSlide(slideID);\r\n if (\r\n currentResult &&\r\n (currentResult.resultData as ChallengeResultProgressData).maxProgress >\r\n maxProgress\r\n ) {\r\n return;\r\n }\r\n\r\n const resultData: ChallengeResultProgressData = {\r\n maxProgress\r\n };\r\n const result: ChallengeResult = {\r\n slideID,\r\n message,\r\n resultData,\r\n tries: 1,\r\n type: \"PROGRESS\"\r\n };\r\n\r\n this.resultLookup.set(slideID, result);\r\n this.notifyOnChange();\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ChallengeResultsEntity.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { AppObjectPM } from "@vived/core";
|
|
2
2
|
import { HostStateMachine } from "../../StateMachine/Entities/HostStateMachine";
|
|
3
3
|
import { ChallengeResultsEntity } from "../Entities/ChallengeResults";
|
|
4
|
+
import { ChallengeResponse } from "../../StateMachine";
|
|
4
5
|
export class ChallengeResultsListPM extends AppObjectPM {
|
|
5
6
|
static get(appObjects) {
|
|
6
7
|
return appObjects.getSingleton(ChallengeResultsListPM.type);
|
|
@@ -36,12 +37,19 @@ class ChallengeResultsPMImp extends ChallengeResultsListPM {
|
|
|
36
37
|
if (!this.results || !this.stateMachine)
|
|
37
38
|
return;
|
|
38
39
|
const organizedResults = [];
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
// Get all states from state machine
|
|
41
|
+
const stateIds = this.stateMachine.states;
|
|
42
|
+
// Process each state
|
|
43
|
+
stateIds.forEach((stateId) => {
|
|
44
|
+
const state = this.stateMachine.getStateByID(stateId);
|
|
45
|
+
if (!state)
|
|
46
|
+
return;
|
|
47
|
+
const stateIndex = this.stateMachine.getStateIndex(stateId) ?? -1;
|
|
48
|
+
const result = this.results.getResultForSlide(stateId);
|
|
49
|
+
// If state has a result, add it with all result data
|
|
50
|
+
if (result) {
|
|
43
51
|
const vm = {
|
|
44
|
-
id:
|
|
52
|
+
id: stateId,
|
|
45
53
|
slideName: state.name,
|
|
46
54
|
attempts: result.tries,
|
|
47
55
|
resultType: result.type,
|
|
@@ -51,11 +59,26 @@ class ChallengeResultsPMImp extends ChallengeResultsListPM {
|
|
|
51
59
|
};
|
|
52
60
|
organizedResults.push(vm);
|
|
53
61
|
}
|
|
62
|
+
// If state has no result but has expected response that's not NONE, add it with partial data
|
|
63
|
+
else if (state.expectedResponse !== undefined &&
|
|
64
|
+
state.expectedResponse !== ChallengeResponse.NONE) {
|
|
65
|
+
const vm = {
|
|
66
|
+
id: stateId,
|
|
67
|
+
slideName: state.name,
|
|
68
|
+
attempts: 0,
|
|
69
|
+
stateIndex,
|
|
70
|
+
message: "Incomplete"
|
|
71
|
+
};
|
|
72
|
+
organizedResults.push(vm);
|
|
73
|
+
}
|
|
54
74
|
});
|
|
55
75
|
this.doUpdateView(organizedResults);
|
|
56
76
|
};
|
|
57
77
|
this.doUpdateView([]);
|
|
58
78
|
this.results?.addChangeObserver(this.onEntityChange);
|
|
79
|
+
this.stateMachine?.addChangeObserver(this.onEntityChange);
|
|
80
|
+
// Initial update
|
|
81
|
+
this.onEntityChange();
|
|
59
82
|
this.appObjects.registerSingleton(this);
|
|
60
83
|
}
|
|
61
84
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChallengeResultsListPM.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/PMs/ChallengeResultsListPM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,WAAW,EAAiB,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,EAML,sBAAsB,EAEvB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"ChallengeResultsListPM.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/PMs/ChallengeResultsListPM.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectPM, AppObjectRepo } from \"@vived/core\";\r\nimport { HostStateMachine } from \"../../StateMachine/Entities/HostStateMachine\";\r\nimport {\r\n ChallengeResultHitData,\r\n ChallengeResultMultiHitData,\r\n ChallengeResultProgressData,\r\n ChallengeResultQualityData,\r\n ChallengeResultScoreData,\r\n ChallengeResultsEntity,\r\n ChallengeResultType\r\n} from \"../Entities/ChallengeResults\";\r\nimport { ChallengeResponse } from \"../../StateMachine\";\r\n\r\nexport interface ChallengeResultVM {\r\n id: string;\r\n slideName: string;\r\n attempts: number;\r\n message: string;\r\n resultType?: ChallengeResultType;\r\n stateIndex: number;\r\n resultData?:\r\n | ChallengeResultHitData\r\n | ChallengeResultMultiHitData\r\n | ChallengeResultQualityData\r\n | ChallengeResultScoreData\r\n | ChallengeResultProgressData;\r\n}\r\n\r\nexport abstract class ChallengeResultsListPM extends AppObjectPM<\r\n ChallengeResultVM[]\r\n> {\r\n static type = \"ChallengeResultsListPM\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return appObjects.getSingleton<ChallengeResultsListPM>(\r\n ChallengeResultsListPM.type\r\n );\r\n }\r\n}\r\n\r\nexport function makeChallengeResultsPM(\r\n appObject: AppObject\r\n): ChallengeResultsListPM {\r\n return new ChallengeResultsPMImp(appObject);\r\n}\r\n\r\nclass ChallengeResultsPMImp extends ChallengeResultsListPM {\r\n private get results() {\r\n return this.getCachedSingleton<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type\r\n );\r\n }\r\n\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n vmsAreEqual(a: ChallengeResultVM[], b: ChallengeResultVM[]): boolean {\r\n if (a.length !== b.length) return false;\r\n\r\n let areEqual = true;\r\n a.forEach((aResult, i) => {\r\n const bResult = b[i];\r\n if (aResult.id !== bResult.id) areEqual = false;\r\n else if (aResult.attempts !== bResult.attempts) areEqual = false;\r\n });\r\n return areEqual;\r\n }\r\n\r\n onEntityChange = (): void => {\r\n if (!this.results || !this.stateMachine) return;\r\n\r\n const organizedResults: ChallengeResultVM[] = [];\r\n\r\n // Get all states from state machine\r\n const stateIds = this.stateMachine.states;\r\n\r\n // Process each state\r\n stateIds.forEach((stateId) => {\r\n const state = this.stateMachine!.getStateByID(stateId);\r\n if (!state) return;\r\n\r\n const stateIndex = this.stateMachine!.getStateIndex(stateId) ?? -1;\r\n const result = this.results!.getResultForSlide(stateId);\r\n\r\n // If state has a result, add it with all result data\r\n if (result) {\r\n const vm: ChallengeResultVM = {\r\n id: stateId,\r\n slideName: state.name,\r\n attempts: result.tries,\r\n resultType: result.type,\r\n message: result.message,\r\n stateIndex,\r\n resultData: result.resultData\r\n };\r\n\r\n organizedResults.push(vm);\r\n }\r\n // If state has no result but has expected response that's not NONE, add it with partial data\r\n else if (\r\n state.expectedResponse !== undefined &&\r\n state.expectedResponse !== ChallengeResponse.NONE\r\n ) {\r\n const vm: ChallengeResultVM = {\r\n id: stateId,\r\n slideName: state.name,\r\n attempts: 0,\r\n stateIndex,\r\n message: \"Incomplete\"\r\n };\r\n\r\n organizedResults.push(vm);\r\n }\r\n });\r\n\r\n this.doUpdateView(organizedResults);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ChallengeResultsListPM.type);\r\n this.doUpdateView([]);\r\n this.results?.addChangeObserver(this.onEntityChange);\r\n this.stateMachine?.addChangeObserver(this.onEntityChange);\r\n\r\n // Initial update\r\n this.onEntityChange();\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AppObjectPM, getSingletonComponent } from "@vived/core";
|
|
2
2
|
import { HostStateMachine } from "../../StateMachine/Entities/HostStateMachine";
|
|
3
|
+
import { ChallengeResponse } from "../../StateMachine/Entities/HostStateEntity";
|
|
3
4
|
import { ChallengeResultsEntity } from "../Entities/ChallengeResults";
|
|
4
5
|
export class ChallengeScoreListPM extends AppObjectPM {
|
|
5
6
|
static get(appObjects) {
|
|
@@ -40,10 +41,15 @@ class ChallengeScoreListPMImp extends ChallengeScoreListPM {
|
|
|
40
41
|
const stateIds = this.stateMachine.states;
|
|
41
42
|
// Process each state
|
|
42
43
|
stateIds.forEach((slideId, index) => {
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
return;
|
|
44
|
+
// Check if slide has a result or an expected response that's not NONE
|
|
45
|
+
const hasResult = this.challengeResults.getResultForSlide(slideId);
|
|
46
46
|
const state = this.stateMachine.getStateByID(slideId);
|
|
47
|
+
if (!hasResult &&
|
|
48
|
+
(!state ||
|
|
49
|
+
state.expectedResponse === undefined ||
|
|
50
|
+
state.expectedResponse === ChallengeResponse.NONE)) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
47
53
|
if (state) {
|
|
48
54
|
// Get score for this slide using the method from ChallengeResults
|
|
49
55
|
const score = this.challengeResults.getScoreForSlide(slideId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChallengeScoreListPM.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/PMs/ChallengeScoreListPM.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAEX,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAQtE,MAAM,OAAgB,oBAAqB,SAAQ,WAA2B;IAG5E,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,oBAAoB,CAAC,IAAI,EACzB,UAAU,CACX,CAAC;IACJ,CAAC;;AAPe,yBAAI,GAAG,sBAAsB,CAAC;AAUhD,MAAM,UAAU,wBAAwB,CACtC,SAAoB;IAEpB,OAAO,IAAI,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,uBAAwB,SAAQ,oBAAoB;IACxD,IAAY,gBAAgB;QAC1B,OAAO,IAAI,CAAC,kBAAkB,CAC5B,sBAAsB,CAAC,IAAI,CAC5B,CAAC;IACJ,CAAC;IAED,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED,WAAW,CAAC,CAAiB,EAAE,CAAiB;QAC9C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gBAAE,OAAO,KAAK,CAAC;YACtC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;gBAAE,OAAO,KAAK,CAAC;YACxD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;
|
|
1
|
+
{"version":3,"file":"ChallengeScoreListPM.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/PMs/ChallengeScoreListPM.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 { HostStateMachine } from \"../../StateMachine/Entities/HostStateMachine\";\r\nimport { ChallengeResponse } from \"../../StateMachine/Entities/HostStateEntity\";\r\nimport { ChallengeResultsEntity } from \"../Entities/ChallengeResults\";\r\n\r\nexport interface SlideScoreVM {\r\n id: string;\r\n displayName: string;\r\n score: number;\r\n}\r\n\r\nexport abstract class ChallengeScoreListPM extends AppObjectPM<SlideScoreVM[]> {\r\n static readonly type = \"ChallengeScoreListPM\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<ChallengeScoreListPM>(\r\n ChallengeScoreListPM.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeChallengeScoreListPM(\r\n appObject: AppObject\r\n): ChallengeScoreListPM {\r\n return new ChallengeScoreListPMImp(appObject);\r\n}\r\n\r\nclass ChallengeScoreListPMImp extends ChallengeScoreListPM {\r\n private get challengeResults() {\r\n return this.getCachedSingleton<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type\r\n );\r\n }\r\n\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n vmsAreEqual(a: SlideScoreVM[], b: SlideScoreVM[]): boolean {\r\n if (a.length !== b.length) return false;\r\n\r\n for (let i = 0; i < a.length; i++) {\r\n if (a[i].id !== b[i].id) return false;\r\n if (a[i].displayName !== b[i].displayName) return false;\r\n if (a[i].score !== b[i].score) return false;\r\n }\r\n return true;\r\n }\r\n\r\n onEntityChange = (): void => {\r\n if (!this.challengeResults || !this.stateMachine) return;\r\n\r\n const slideScores: SlideScoreVM[] = [];\r\n\r\n // Get all states from state machine\r\n const stateIds = this.stateMachine.states;\r\n\r\n // Process each state\r\n stateIds.forEach((slideId, index) => {\r\n // Check if slide has a result or an expected response that's not NONE\r\n const hasResult = this.challengeResults!.getResultForSlide(slideId);\r\n const state = this.stateMachine!.getStateByID(slideId);\r\n\r\n if (\r\n !hasResult &&\r\n (!state ||\r\n state.expectedResponse === undefined ||\r\n state.expectedResponse === ChallengeResponse.NONE)\r\n ) {\r\n return;\r\n }\r\n\r\n if (state) {\r\n // Get score for this slide using the method from ChallengeResults\r\n const score = this.challengeResults!.getScoreForSlide(slideId);\r\n\r\n // Format the display name\r\n const displayName = `Slide ${index + 1}: ${state.name}`;\r\n\r\n // Add to results\r\n slideScores.push({\r\n id: slideId,\r\n displayName,\r\n score\r\n });\r\n }\r\n });\r\n\r\n this.doUpdateView(slideScores);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, ChallengeScoreListPM.type);\r\n\r\n // Initialize with empty array\r\n this.doUpdateView([]);\r\n\r\n // Subscribe to changes in entities\r\n this.challengeResults?.addChangeObserver(this.onEntityChange);\r\n this.stateMachine?.addChangeObserver(this.onEntityChange);\r\n\r\n // Initial update\r\n this.onEntityChange();\r\n\r\n // Register as singleton\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { AppObjectPM, getSingletonComponent } from "@vived/core";
|
|
2
2
|
import { ChallengeResultsEntity } from "../Entities";
|
|
3
|
+
import { HostStateMachine } from "../../StateMachine/Entities/HostStateMachine";
|
|
4
|
+
import { ChallengeResponse } from "../../StateMachine/Entities/HostStateEntity";
|
|
3
5
|
export class HasChallengeResultsPM extends AppObjectPM {
|
|
4
6
|
static get(appObjects) {
|
|
5
7
|
return getSingletonComponent(HasChallengeResultsPM.type, appObjects);
|
|
@@ -13,6 +15,9 @@ class HasChallengeResultsPMImp extends HasChallengeResultsPM {
|
|
|
13
15
|
get resultsEntity() {
|
|
14
16
|
return this.getCachedSingleton(ChallengeResultsEntity.type);
|
|
15
17
|
}
|
|
18
|
+
get stateMachine() {
|
|
19
|
+
return this.getCachedSingleton(HostStateMachine.type);
|
|
20
|
+
}
|
|
16
21
|
vmsAreEqual(a, b) {
|
|
17
22
|
return a === b;
|
|
18
23
|
}
|
|
@@ -21,11 +26,25 @@ class HasChallengeResultsPMImp extends HasChallengeResultsPM {
|
|
|
21
26
|
this.onEntityChange = () => {
|
|
22
27
|
if (!this.resultsEntity)
|
|
23
28
|
return;
|
|
24
|
-
|
|
29
|
+
let hasAssessmentResults = this.resultsEntity.results?.length > 0 || false;
|
|
30
|
+
// If no results are found, check for expected responses in states
|
|
31
|
+
if (!hasAssessmentResults && this.stateMachine) {
|
|
32
|
+
const stateIds = this.stateMachine.states;
|
|
33
|
+
for (const stateId of stateIds) {
|
|
34
|
+
const state = this.stateMachine.getStateByID(stateId);
|
|
35
|
+
if (state &&
|
|
36
|
+
state.expectedResponse !== undefined &&
|
|
37
|
+
state.expectedResponse !== ChallengeResponse.NONE) {
|
|
38
|
+
hasAssessmentResults = true;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
25
43
|
this.doUpdateView(hasAssessmentResults);
|
|
26
44
|
};
|
|
27
45
|
this.appObjects.registerSingleton(this);
|
|
28
46
|
this.resultsEntity?.addChangeObserver(this.onEntityChange);
|
|
47
|
+
this.stateMachine?.addChangeObserver(this.onEntityChange);
|
|
29
48
|
this.onEntityChange();
|
|
30
49
|
}
|
|
31
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HasChallengeResultsPM.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/PMs/HasChallengeResultsPM.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"HasChallengeResultsPM.js","sourceRoot":"","sources":["../../../../src/ChallengeResults/PMs/HasChallengeResultsPM.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EAEX,qBAAqB,EACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAEhF,MAAM,OAAgB,qBAAsB,SAAQ,WAAoB;IAGtE,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,qBAAqB,CAAC,IAAI,EAC1B,UAAU,CACX,CAAC;IACJ,CAAC;;AAPM,0BAAI,GAAG,uBAAuB,CAAC;AAUxC,MAAM,UAAU,yBAAyB,CACvC,SAAoB;IAEpB,OAAO,IAAI,wBAAwB,CAAC,SAAS,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,wBAAyB,SAAQ,qBAAqB;IAC1D,IAAY,aAAa;QACvB,OAAO,IAAI,CAAC,kBAAkB,CAC5B,sBAAsB,CAAC,IAAI,CAC5B,CAAC;IACJ,CAAC;IAED,IAAY,YAAY;QACtB,OAAO,IAAI,CAAC,kBAAkB,CAAmB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED,WAAW,CAAC,CAAU,EAAE,CAAU;QAChC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IA2BD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC;QA1BvC,mBAAc,GAAG,GAAS,EAAE;YAClC,IAAI,CAAC,IAAI,CAAC,aAAa;gBAAE,OAAO;YAEhC,IAAI,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC;YAE3E,kEAAkE;YAClE,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;gBAE1C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtD,IACE,KAAK;wBACL,KAAK,CAAC,gBAAgB,KAAK,SAAS;wBACpC,KAAK,CAAC,gBAAgB,KAAK,iBAAiB,CAAC,IAAI,EACjD,CAAC;wBACD,oBAAoB,GAAG,IAAI,CAAC;wBAC5B,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;QAC1C,CAAC,CAAC;QAKA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,aAAa,EAAE,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,EAAE,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;CACF","sourcesContent":["import {\r\n AppObject,\r\n AppObjectPM,\r\n AppObjectRepo,\r\n getSingletonComponent\r\n} from \"@vived/core\";\r\nimport { ChallengeResultsEntity } from \"../Entities\";\r\nimport { HostStateMachine } from \"../../StateMachine/Entities/HostStateMachine\";\r\nimport { ChallengeResponse } from \"../../StateMachine/Entities/HostStateEntity\";\r\n\r\nexport abstract class HasChallengeResultsPM extends AppObjectPM<boolean> {\r\n static type = \"HasChallengeResultsPM\";\r\n\r\n static get(appObjects: AppObjectRepo) {\r\n return getSingletonComponent<HasChallengeResultsPM>(\r\n HasChallengeResultsPM.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeHasChallengeResultsPM(\r\n appObject: AppObject\r\n): HasChallengeResultsPM {\r\n return new HasChallengeResultsPMImp(appObject);\r\n}\r\n\r\nclass HasChallengeResultsPMImp extends HasChallengeResultsPM {\r\n private get resultsEntity() {\r\n return this.getCachedSingleton<ChallengeResultsEntity>(\r\n ChallengeResultsEntity.type\r\n );\r\n }\r\n\r\n private get stateMachine() {\r\n return this.getCachedSingleton<HostStateMachine>(HostStateMachine.type);\r\n }\r\n\r\n vmsAreEqual(a: boolean, b: boolean): boolean {\r\n return a === b;\r\n }\r\n\r\n private onEntityChange = (): void => {\r\n if (!this.resultsEntity) return;\r\n\r\n let hasAssessmentResults = this.resultsEntity.results?.length > 0 || false;\r\n\r\n // If no results are found, check for expected responses in states\r\n if (!hasAssessmentResults && this.stateMachine) {\r\n const stateIds = this.stateMachine.states;\r\n\r\n for (const stateId of stateIds) {\r\n const state = this.stateMachine.getStateByID(stateId);\r\n if (\r\n state &&\r\n state.expectedResponse !== undefined &&\r\n state.expectedResponse !== ChallengeResponse.NONE\r\n ) {\r\n hasAssessmentResults = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n this.doUpdateView(hasAssessmentResults);\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, HasChallengeResultsPM.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n this.resultsEntity?.addChangeObserver(this.onEntityChange);\r\n this.stateMachine?.addChangeObserver(this.onEntityChange);\r\n this.onEntityChange();\r\n }\r\n}\r\n"]}
|
|
@@ -25,7 +25,6 @@ export * from "./ShowSpinnerHandler";
|
|
|
25
25
|
export * from "./StartZSpaceHandler";
|
|
26
26
|
export * from "./StopZSpaceHandler";
|
|
27
27
|
export * from "./SubmitActivityAssetHandler";
|
|
28
|
-
export * from "./SubmitExpectedResultHandler";
|
|
29
28
|
export * from "./SubmitLogHandler";
|
|
30
29
|
export * from "./SubmitResultHandler";
|
|
31
30
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Handler/UCs/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sCAAsC,CAAC;AACrD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Handler/UCs/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sCAAsC,CAAC;AACrD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC","sourcesContent":["export * from \"./CallbackAssetDTO\";\r\nexport * from \"./CloseAssetSystemPlugin\";\r\nexport * from \"./GetAssetBlobURLHandler\";\r\nexport * from \"./GetAssetFolderURLHandler\";\r\nexport * from \"./GetAssetMetaHandler\";\r\nexport * from \"./GetAssetsForOwnerHandler\";\r\nexport * from \"./GetLinkedAssetsHandler\";\r\nexport * from \"./GoToNextStateHandler\";\r\nexport * from \"./GoToPreviousStateHandler\";\r\nexport * from \"./HasNextStateHandler\";\r\nexport * from \"./HasPreviousStateHandler\";\r\nexport * from \"./IsAssetFetchedHandler\";\r\nexport * from \"./IsZSpaceAvailableHandler\";\r\nexport * from \"./NewActivityAssetHandler\";\r\nexport * from \"./OnAppIsReadyHandler\";\r\nexport * from \"./OnStateChangeHandler\";\r\nexport * from \"./OnStateCompleteHandler\";\r\nexport * from \"./RegisterExternalStyleSheetsHandler\";\r\nexport * from \"./RestoreCurrentStateHandler\";\r\nexport * from \"./ShowAlertHandler\";\r\nexport * from \"./ShowConfirmHandler\";\r\nexport * from \"./ShowMarkDownEditorHandler\";\r\nexport * from \"./ShowSelectModelHandler\";\r\nexport * from \"./ShowSpinnerHandler\";\r\nexport * from \"./StartZSpaceHandler\";\r\nexport * from \"./StopZSpaceHandler\";\r\nexport * from \"./SubmitActivityAssetHandler\";\r\nexport * from \"./SubmitLogHandler\";\r\nexport * from \"./SubmitResultHandler\";\r\n"]}
|
|
@@ -30,6 +30,7 @@ export declare abstract class AppEntity extends AppObjectEntity {
|
|
|
30
30
|
abstract name: string;
|
|
31
31
|
abstract description: string;
|
|
32
32
|
abstract image_url: string;
|
|
33
|
+
abstract imageAssetId: string | undefined;
|
|
33
34
|
abstract versions: Version[];
|
|
34
35
|
abstract get latestVersion(): Version | undefined;
|
|
35
36
|
abstract errorMessage?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppEntity.d.ts","sourceRoot":"","sources":["../../../../src/Apps/Entities/AppEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EACf,aAAa,EACb,OAAO,
|
|
1
|
+
{"version":3,"file":"AppEntity.d.ts","sourceRoot":"","sources":["../../../../src/Apps/Entities/AppEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,eAAe,EACf,aAAa,EACb,OAAO,EAER,MAAM,aAAa,CAAC;AAErB;;;;;;;;GAQG;AACH,oBAAY,QAAQ;IAClB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,KAAK,UAAU;CAChB;AAED;;;;;;;GAOG;AACH,8BAAsB,SAAU,SAAQ,eAAe;IACrD,kDAAkD;IAClD,MAAM,CAAC,IAAI,SAAe;IAE1B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa;IAahD,QAAQ,KAAK,EAAE,IAAI,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC7B,QAAQ,KAAK,aAAa,IAAI,OAAO,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAElC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,KAAK,iBAAiB,IAAI,OAAO,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9C;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAE7D"}
|
|
@@ -12,6 +12,8 @@ export interface AppVM {
|
|
|
12
12
|
description: string;
|
|
13
13
|
/** URL to the app's thumbnail or preview image */
|
|
14
14
|
imageURL: string;
|
|
15
|
+
/** Whether the image asset is currently being fetched */
|
|
16
|
+
isFetching: boolean;
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
17
19
|
* Default empty AppVM for initialization
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppPM.d.ts","sourceRoot":"","sources":["../../../../src/Apps/PMs/AppPM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"AppPM.d.ts","sourceRoot":"","sources":["../../../../src/Apps/PMs/AppPM.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIpE;;;GAGG;AACH,MAAM,WAAW,KAAK;IACpB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,8BAAsB,KAAM,SAAQ,WAAW,CAAC,KAAK,CAAC;IACpD,MAAM,CAAC,IAAI,SAAW;IAEtB;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa;CAQjD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,SAAS,GAAG,KAAK,CAErD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { PmAdapter } from "@vived/core";
|
|
2
|
+
import { AssetFileVM } from "../PMs/AssetFilePM";
|
|
3
|
+
/**
|
|
4
|
+
* Adapter for connecting AssetFilePM to UI components
|
|
5
|
+
* Provides the interface for React components to subscribe to AssetFileVM updates
|
|
6
|
+
*/
|
|
7
|
+
export declare const assetFileAdapter: PmAdapter<AssetFileVM>;
|
|
8
|
+
//# sourceMappingURL=assetFileAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assetFileAdapter.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Adapters/assetFileAdapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,SAAS,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAEL,WAAW,EAEZ,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,WAAW,CA6CnD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Adapters/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,0BAA0B,CAAC;AACzC,cAAc,+BAA+B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupAssetsForSandbox.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Factories/setupAssetsForSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"setupAssetsForSandbox.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Factories/setupAssetsForSandbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AA8B5C,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,aAAa,QAuB9D"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { AppObject } from "@vived/core";
|
|
2
|
+
import { AssetFilePM } from "../PMs/AssetFilePM";
|
|
3
|
+
/**
|
|
4
|
+
* Mock implementation of AssetFilePM for testing
|
|
5
|
+
* Provides Jest mock functions for testing adapters and other components
|
|
6
|
+
*/
|
|
7
|
+
export declare class AssetFilePMMock extends AssetFilePM {
|
|
8
|
+
/**
|
|
9
|
+
* Mock implementation of vmsAreEqual for testing
|
|
10
|
+
*/
|
|
11
|
+
vmsAreEqual: jest.Mock<any, any, any>;
|
|
12
|
+
/**
|
|
13
|
+
* Creates a new AssetFilePMMock instance
|
|
14
|
+
*
|
|
15
|
+
* @param appObject - The app object to associate with this mock PM
|
|
16
|
+
*/
|
|
17
|
+
constructor(appObject: AppObject);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=AssetFilePMMock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetFilePMMock.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Mocks/AssetFilePMMock.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,WAAW;IAC9C;;OAEG;IACH,WAAW,2BAAa;IAExB;;;;OAIG;gBACS,SAAS,EAAE,SAAS;CAGjC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/Assets/Mocks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { AppObject, AppObjectPM, AppObjectRepo } from "@vived/core";
|
|
2
|
+
/**
|
|
3
|
+
* View Model for Asset file information
|
|
4
|
+
* Represents the data needed by the view to display asset file status
|
|
5
|
+
*/
|
|
6
|
+
export interface AssetFileVM {
|
|
7
|
+
/** URL to the asset's file blob for direct access */
|
|
8
|
+
blobURL: string | undefined;
|
|
9
|
+
/** Whether the asset file is currently being fetched */
|
|
10
|
+
isFetchingFile: boolean;
|
|
11
|
+
/** Whether the asset file has been successfully fetched */
|
|
12
|
+
fileHasBeenFetched: boolean;
|
|
13
|
+
/** Error that occurred during file fetching, if any */
|
|
14
|
+
fetchError: Error | undefined;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Default empty AssetFileVM for initialization
|
|
18
|
+
*/
|
|
19
|
+
export declare const defaultAssetFileVM: AssetFileVM;
|
|
20
|
+
/**
|
|
21
|
+
* Presentation Manager for Asset file status
|
|
22
|
+
*
|
|
23
|
+
* The AssetFilePM is responsible for:
|
|
24
|
+
* - Converting the file-related properties of AssetEntity into a view-friendly format (AssetFileVM)
|
|
25
|
+
* - Notifying the view when asset file status changes
|
|
26
|
+
* - Providing comparison utilities for view models
|
|
27
|
+
*
|
|
28
|
+
* Usage:
|
|
29
|
+
* 1. Retrieve an instance with `AssetFilePM.getByID(assetId, appObjects)`
|
|
30
|
+
* 2. Subscribe to view updates with `pm.addView(callback)`
|
|
31
|
+
* 3. Access current view data with `pm.lastVM`
|
|
32
|
+
*/
|
|
33
|
+
export declare abstract class AssetFilePM extends AppObjectPM<AssetFileVM> {
|
|
34
|
+
static type: string;
|
|
35
|
+
/**
|
|
36
|
+
* Retrieves an AssetFilePM instance for a specific asset by ID
|
|
37
|
+
*
|
|
38
|
+
* @param assetID - The unique identifier of the asset
|
|
39
|
+
* @param appObjects - The repository of app objects
|
|
40
|
+
* @returns The AssetFilePM instance or undefined if not found
|
|
41
|
+
*/
|
|
42
|
+
static getByID(assetID: string, appObjects: AppObjectRepo): AssetFilePM | undefined;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Creates a new AssetFilePM instance
|
|
46
|
+
*
|
|
47
|
+
* @param appObject - The app object to associate with this PM
|
|
48
|
+
* @returns A new AssetFilePM instance
|
|
49
|
+
*/
|
|
50
|
+
export declare function makeAssetFilePM(appObject: AppObject): AssetFilePM;
|
|
51
|
+
//# sourceMappingURL=AssetFilePM.d.ts.map
|