@vived/host 4.5.3 → 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/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/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/package.json +3 -3
|
@@ -53,6 +53,31 @@ class AppEntityImp extends AppEntity {
|
|
|
53
53
|
get id() {
|
|
54
54
|
return this.appObject.id;
|
|
55
55
|
}
|
|
56
|
+
get name() {
|
|
57
|
+
return this._memoizedName.val;
|
|
58
|
+
}
|
|
59
|
+
set name(val) {
|
|
60
|
+
this._memoizedName.val = val;
|
|
61
|
+
}
|
|
62
|
+
get description() {
|
|
63
|
+
return this._memoizedDescription.val;
|
|
64
|
+
}
|
|
65
|
+
set description(val) {
|
|
66
|
+
this._memoizedDescription.val = val;
|
|
67
|
+
}
|
|
68
|
+
get image_url() {
|
|
69
|
+
return this._memoizedImageUrl.val;
|
|
70
|
+
}
|
|
71
|
+
set image_url(val) {
|
|
72
|
+
this._memoizedImageUrl.val = val;
|
|
73
|
+
}
|
|
74
|
+
get imageAssetId() {
|
|
75
|
+
const value = this._memoizedImageAssetId.val;
|
|
76
|
+
return value === "" ? undefined : value;
|
|
77
|
+
}
|
|
78
|
+
set imageAssetId(val) {
|
|
79
|
+
this._memoizedImageAssetId.val = val ?? "";
|
|
80
|
+
}
|
|
56
81
|
get latestVersion() {
|
|
57
82
|
return core_1.Version.GetLatest(this.versions);
|
|
58
83
|
}
|
|
@@ -105,9 +130,10 @@ class AppEntityImp extends AppEntity {
|
|
|
105
130
|
}
|
|
106
131
|
constructor(appObject) {
|
|
107
132
|
super(appObject, AppEntity.type);
|
|
108
|
-
this.
|
|
109
|
-
this.
|
|
110
|
-
this.
|
|
133
|
+
this._memoizedName = new core_1.MemoizedString("", this.notifyOnChange);
|
|
134
|
+
this._memoizedDescription = new core_1.MemoizedString("", this.notifyOnChange);
|
|
135
|
+
this._memoizedImageUrl = new core_1.MemoizedString("", this.notifyOnChange);
|
|
136
|
+
this._memoizedImageAssetId = new core_1.MemoizedString("", this.notifyOnChange);
|
|
111
137
|
this.versions = [];
|
|
112
138
|
this._state = AppState.INIT;
|
|
113
139
|
this._assignedToOwner = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppEntity.js","sourceRoot":"","sources":["../../../../src/Apps/Entities/AppEntity.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"AppEntity.js","sourceRoot":"","sources":["../../../../src/Apps/Entities/AppEntity.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo,\r\n Version,\r\n MemoizedString\r\n} from \"@vived/core\";\r\n\r\n/**\r\n * Enum representing the possible states of an application\r\n *\r\n * @enum {string}\r\n * @property {string} INIT - Initial state before app loading starts\r\n * @property {string} LOADING - App is currently loading resources\r\n * @property {string} READY - App is loaded and ready to use\r\n * @property {string} ERROR - App encountered an error during loading\r\n */\r\nexport enum AppState {\r\n INIT = \"INIT\",\r\n LOADING = \"LOADING\",\r\n READY = \"READY\",\r\n ERROR = \"ERROR\"\r\n}\r\n\r\n/**\r\n * AppEntity - Core entity representing an application in the system\r\n *\r\n * This abstract class defines the properties and behaviors of an application.\r\n * It manages app state, versioning, mounting status, and error handling.\r\n *\r\n * @extends AppObjectEntity from @vived/core\r\n */\r\nexport abstract class AppEntity extends AppObjectEntity {\r\n /** Type identifier for the AppEntity component */\r\n static type = \"AppEntity\";\r\n\r\n static get(id: string, appObjects: AppObjectRepo) {\r\n const ao = appObjects.get(id);\r\n if (!ao) {\r\n appObjects.submitWarning(\r\n \"AppEntity.get\",\r\n `Unable to find app object by ID: ${id}`\r\n );\r\n return;\r\n }\r\n\r\n return ao.getComponent<AppEntity>(AppEntity.type);\r\n }\r\n\r\n abstract get id(): string;\r\n abstract name: string;\r\n abstract description: string;\r\n abstract image_url: string;\r\n abstract imageAssetId: string | undefined;\r\n abstract versions: Version[];\r\n abstract get latestVersion(): Version | undefined;\r\n abstract errorMessage?: string;\r\n abstract get hasError(): boolean;\r\n abstract state: AppState;\r\n abstract assignedToOwner: boolean;\r\n\r\n abstract get isMounted(): boolean;\r\n abstract appAssetFolderURL?: string;\r\n abstract get updateIsAvailable(): boolean | undefined;\r\n abstract styles: string[];\r\n abstract mountedVersion: Version | undefined;\r\n}\r\n\r\n/**\r\n * Factory function to create a new AppEntity instance\r\n *\r\n * @param appObject - The app object to attach the entity to\r\n * @returns A concrete implementation of AppEntity\r\n */\r\nexport function makeAppEntity(appObject: AppObject): AppEntity {\r\n return new AppEntityImp(appObject);\r\n}\r\n\r\nclass AppEntityImp extends AppEntity {\r\n get id() {\r\n return this.appObject.id;\r\n }\r\n\r\n private _memoizedName: MemoizedString = new MemoizedString(\r\n \"\",\r\n this.notifyOnChange\r\n );\r\n\r\n get name(): string {\r\n return this._memoizedName.val;\r\n }\r\n\r\n set name(val: string) {\r\n this._memoizedName.val = val;\r\n }\r\n\r\n private _memoizedDescription: MemoizedString = new MemoizedString(\r\n \"\",\r\n this.notifyOnChange\r\n );\r\n\r\n get description(): string {\r\n return this._memoizedDescription.val;\r\n }\r\n\r\n set description(val: string) {\r\n this._memoizedDescription.val = val;\r\n }\r\n\r\n private _memoizedImageUrl: MemoizedString = new MemoizedString(\r\n \"\",\r\n this.notifyOnChange\r\n );\r\n\r\n get image_url(): string {\r\n return this._memoizedImageUrl.val;\r\n }\r\n\r\n set image_url(val: string) {\r\n this._memoizedImageUrl.val = val;\r\n }\r\n\r\n private _memoizedImageAssetId = new MemoizedString(\"\", this.notifyOnChange);\r\n\r\n get imageAssetId(): string | undefined {\r\n const value = this._memoizedImageAssetId.val;\r\n return value === \"\" ? undefined : value;\r\n }\r\n\r\n set imageAssetId(val: string | undefined) {\r\n this._memoizedImageAssetId.val = val ?? \"\";\r\n }\r\n\r\n versions: Version[] = [];\r\n\r\n get latestVersion(): Version | undefined {\r\n return Version.GetLatest(this.versions);\r\n }\r\n\r\n private _mountedVersion: Version | undefined;\r\n get mountedVersion() {\r\n return this._mountedVersion;\r\n }\r\n set mountedVersion(val: Version | undefined) {\r\n if (this._mountedVersion === val) return;\r\n\r\n this._mountedVersion = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n get updateIsAvailable(): boolean | undefined {\r\n if (this._mountedVersion === undefined) return undefined;\r\n if (this.latestVersion === undefined) return undefined;\r\n\r\n return Version.AreEqual(this._mountedVersion, this.latestVersion)\r\n ? false\r\n : true;\r\n }\r\n\r\n private _state: AppState = AppState.INIT;\r\n get state() {\r\n return this._state;\r\n }\r\n set state(val: AppState) {\r\n this._state = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n private _assignedToOwner: boolean = false;\r\n get assignedToOwner(): boolean {\r\n return this._assignedToOwner;\r\n }\r\n set assignedToOwner(val: boolean) {\r\n this._assignedToOwner = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n get isMounted(): boolean {\r\n return this._mountedVersion === undefined ? false : true;\r\n }\r\n\r\n styles: string[] = [];\r\n appAssetFolderURL: string | undefined;\r\n\r\n private _errorMsg?: string;\r\n get errorMessage() {\r\n return this._errorMsg;\r\n }\r\n set errorMessage(val: string | undefined) {\r\n if (this._errorMsg === val) return;\r\n\r\n this._errorMsg = val;\r\n this.notifyOnChange();\r\n }\r\n get hasError(): boolean {\r\n return this._errorMsg === undefined ? false : true;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, AppEntity.type);\r\n }\r\n}\r\n"]}
|
|
@@ -4,6 +4,7 @@ exports.AppPM = exports.defaultAppVM = void 0;
|
|
|
4
4
|
exports.makeAppPM = makeAppPM;
|
|
5
5
|
const core_1 = require("@vived/core");
|
|
6
6
|
const AppEntity_1 = require("../Entities/AppEntity");
|
|
7
|
+
const AssetEntity_1 = require("../../Assets/Entities/AssetEntity");
|
|
7
8
|
/**
|
|
8
9
|
* Default empty AppVM for initialization
|
|
9
10
|
*/
|
|
@@ -11,7 +12,8 @@ exports.defaultAppVM = {
|
|
|
11
12
|
id: "",
|
|
12
13
|
description: "",
|
|
13
14
|
imageURL: "",
|
|
14
|
-
name: ""
|
|
15
|
+
name: "",
|
|
16
|
+
isFetching: false
|
|
15
17
|
};
|
|
16
18
|
/**
|
|
17
19
|
* Presentation Manager for App entities
|
|
@@ -79,8 +81,23 @@ class AppPMImp extends AppPM {
|
|
|
79
81
|
return false;
|
|
80
82
|
if (a.imageURL !== b.imageURL)
|
|
81
83
|
return false;
|
|
84
|
+
if (a.isFetching !== b.isFetching)
|
|
85
|
+
return false;
|
|
82
86
|
return true;
|
|
83
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Retrieves the asset entity for the image
|
|
90
|
+
*
|
|
91
|
+
* @returns The image asset entity or undefined if not found
|
|
92
|
+
*/
|
|
93
|
+
getImageAsset() {
|
|
94
|
+
if (!this.app?.imageAssetId)
|
|
95
|
+
return undefined;
|
|
96
|
+
const assetAO = this.appObject.appObjectRepo.get(this.app.imageAssetId);
|
|
97
|
+
if (!assetAO)
|
|
98
|
+
return undefined;
|
|
99
|
+
return AssetEntity_1.AssetEntity.get(assetAO);
|
|
100
|
+
}
|
|
84
101
|
/**
|
|
85
102
|
* Creates a new AppPM instance
|
|
86
103
|
*
|
|
@@ -95,15 +112,39 @@ class AppPMImp extends AppPM {
|
|
|
95
112
|
this.onEntityChange = () => {
|
|
96
113
|
if (!this.app)
|
|
97
114
|
return;
|
|
115
|
+
let imageURL = this.app.image_url;
|
|
116
|
+
let isFetching = false;
|
|
117
|
+
// Check for an image asset and use its blob URL if available
|
|
118
|
+
const imageAsset = this.getImageAsset();
|
|
119
|
+
if (imageAsset) {
|
|
120
|
+
if (imageAsset.fetchError) {
|
|
121
|
+
// If there's an error fetching the asset, return empty string for imageURL
|
|
122
|
+
imageURL = "";
|
|
123
|
+
}
|
|
124
|
+
else if (imageAsset.isFetchingFile) {
|
|
125
|
+
// If the asset is being fetched, set isFetching to true and use the default image_url
|
|
126
|
+
isFetching = true;
|
|
127
|
+
}
|
|
128
|
+
else if (imageAsset.blobURL) {
|
|
129
|
+
// If the asset has a blob URL, use it
|
|
130
|
+
imageURL = imageAsset.blobURL || imageURL;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
98
133
|
const vm = {
|
|
99
134
|
description: this.app.description,
|
|
100
135
|
id: this.app.id,
|
|
101
|
-
imageURL
|
|
102
|
-
name: this.app.name
|
|
136
|
+
imageURL,
|
|
137
|
+
name: this.app.name,
|
|
138
|
+
isFetching
|
|
103
139
|
};
|
|
104
140
|
this.doUpdateView(vm);
|
|
105
141
|
};
|
|
106
142
|
this.app?.addChangeObserver(this.onEntityChange);
|
|
143
|
+
// Also listen for changes to the image asset if it exists
|
|
144
|
+
const imageAsset = this.getImageAsset();
|
|
145
|
+
if (imageAsset) {
|
|
146
|
+
imageAsset.addChangeObserver(this.onEntityChange);
|
|
147
|
+
}
|
|
107
148
|
this.onEntityChange();
|
|
108
149
|
}
|
|
109
150
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppPM.js","sourceRoot":"","sources":["../../../../src/Apps/PMs/AppPM.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"AppPM.js","sourceRoot":"","sources":["../../../../src/Apps/PMs/AppPM.ts"],"names":[],"mappings":"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","sourcesContent":["import { AppObject, AppObjectPM, AppObjectRepo } from \"@vived/core\";\r\nimport { AppEntity } from \"../Entities/AppEntity\";\r\nimport { AssetEntity } from \"../../Assets/Entities/AssetEntity\";\r\n\r\n/**\r\n * View Model for App information\r\n * Represents the data needed by the view to display an app\r\n */\r\nexport interface AppVM {\r\n /** Unique identifier for the app */\r\n id: string;\r\n /** Display name of the app */\r\n name: string;\r\n /** Description text for the app */\r\n description: string;\r\n /** URL to the app's thumbnail or preview image */\r\n imageURL: string;\r\n /** Whether the image asset is currently being fetched */\r\n isFetching: boolean;\r\n}\r\n\r\n/**\r\n * Default empty AppVM for initialization\r\n */\r\nexport const defaultAppVM: AppVM = {\r\n id: \"\",\r\n description: \"\",\r\n imageURL: \"\",\r\n name: \"\",\r\n isFetching: false\r\n};\r\n\r\n/**\r\n * Presentation Manager for App entities\r\n *\r\n * The AppPM is responsible for:\r\n * - Converting the AppEntity data into a view-friendly format (AppVM)\r\n * - Notifying the view when app data changes\r\n * - Providing comparison utilities for view models\r\n *\r\n * Usage:\r\n * 1. Retrieve an instance with `AppPM.get(appId, appObjects)`\r\n * 2. Subscribe to view updates with `pm.addViewUpdateObserver(callback)`\r\n * 3. Access current view data with `pm.lastVM`\r\n */\r\nexport abstract class AppPM extends AppObjectPM<AppVM> {\r\n static type = \"AppPM\";\r\n\r\n /**\r\n * Retrieves an AppPM instance for a specific app by ID\r\n *\r\n * @param id - The unique identifier of the app\r\n * @param appObjects - The repository of app objects\r\n * @returns The AppPM instance or undefined if not found\r\n */\r\n static get(id: string, appObjects: AppObjectRepo) {\r\n const ao = appObjects.get(id);\r\n if (!ao) {\r\n return;\r\n }\r\n\r\n return ao.getComponent<AppPM>(AppPM.type);\r\n }\r\n}\r\n\r\n/**\r\n * Creates a new AppPM instance\r\n *\r\n * @param appObject - The app object to associate with this PM\r\n * @returns A new AppPM instance\r\n */\r\nexport function makeAppPM(appObject: AppObject): AppPM {\r\n return new AppPMImp(appObject);\r\n}\r\n\r\n/**\r\n * Implementation of the AppPM abstract class\r\n * Handles the connection between AppEntity and view\r\n */\r\nclass AppPMImp extends AppPM {\r\n /**\r\n * Gets the associated AppEntity\r\n */\r\n private get app() {\r\n return this.getCachedLocalComponent<AppEntity>(AppEntity.type);\r\n }\r\n\r\n /**\r\n * Compares two AppVM instances for equality\r\n * Used to determine if the view needs to update\r\n *\r\n * @param a - First AppVM to compare\r\n * @param b - Second AppVM to compare\r\n * @returns True if view models are equal, false otherwise\r\n */\r\n vmsAreEqual(a: AppVM, b: AppVM): boolean {\r\n if (a.description !== b.description) return false;\r\n if (a.name !== b.name) return false;\r\n if (a.imageURL !== b.imageURL) return false;\r\n if (a.isFetching !== b.isFetching) return false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Retrieves the asset entity for the image\r\n *\r\n * @returns The image asset entity or undefined if not found\r\n */\r\n private getImageAsset(): AssetEntity | undefined {\r\n if (!this.app?.imageAssetId) return undefined;\r\n\r\n const assetAO = this.appObject.appObjectRepo.get(this.app.imageAssetId);\r\n if (!assetAO) return undefined;\r\n\r\n return AssetEntity.get(assetAO);\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 onEntityChange = () => {\r\n if (!this.app) return;\r\n\r\n let imageURL = this.app.image_url;\r\n let isFetching = false;\r\n\r\n // Check for an image asset and use its blob URL if available\r\n const imageAsset = this.getImageAsset();\r\n if (imageAsset) {\r\n if (imageAsset.fetchError) {\r\n // If there's an error fetching the asset, return empty string for imageURL\r\n imageURL = \"\";\r\n } else if (imageAsset.isFetchingFile) {\r\n // If the asset is being fetched, set isFetching to true and use the default image_url\r\n isFetching = true;\r\n } else if (imageAsset.blobURL) {\r\n // If the asset has a blob URL, use it\r\n imageURL = imageAsset.blobURL || imageURL;\r\n }\r\n }\r\n\r\n const vm: AppVM = {\r\n description: this.app.description,\r\n id: this.app.id,\r\n imageURL,\r\n name: this.app.name,\r\n isFetching\r\n };\r\n\r\n this.doUpdateView(vm);\r\n };\r\n\r\n /**\r\n * Creates a new AppPM 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, AppPM.type);\r\n\r\n this.app?.addChangeObserver(this.onEntityChange);\r\n\r\n // Also listen for changes to the image asset if it exists\r\n const imageAsset = this.getImageAsset();\r\n if (imageAsset) {\r\n imageAsset.addChangeObserver(this.onEntityChange);\r\n }\r\n\r\n this.onEntityChange();\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.assetFileAdapter = void 0;
|
|
4
|
+
const AssetFilePM_1 = require("../PMs/AssetFilePM");
|
|
5
|
+
/**
|
|
6
|
+
* Adapter for connecting AssetFilePM to UI components
|
|
7
|
+
* Provides the interface for React components to subscribe to AssetFileVM updates
|
|
8
|
+
*/
|
|
9
|
+
exports.assetFileAdapter = {
|
|
10
|
+
/**
|
|
11
|
+
* Default view model used before subscription is established
|
|
12
|
+
*/
|
|
13
|
+
defaultVM: AssetFilePM_1.defaultAssetFileVM,
|
|
14
|
+
/**
|
|
15
|
+
* Subscribe a view function to updates from the presentation manager
|
|
16
|
+
*
|
|
17
|
+
* @param id - ID of the asset to observe
|
|
18
|
+
* @param appObjects - Repository of app objects
|
|
19
|
+
* @param setVM - Callback function that will receive view model updates
|
|
20
|
+
*/
|
|
21
|
+
subscribe: (id, appObjects, setVM) => {
|
|
22
|
+
const pm = AssetFilePM_1.AssetFilePM.getByID(id, appObjects);
|
|
23
|
+
if (!pm) {
|
|
24
|
+
appObjects.submitError("assetFileAdapter", "Unable to find AssetFilePM");
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
pm.addView(setVM);
|
|
28
|
+
},
|
|
29
|
+
/**
|
|
30
|
+
* Unsubscribe a view function from updates
|
|
31
|
+
*
|
|
32
|
+
* @param id - ID of the asset to stop observing
|
|
33
|
+
* @param appObjects - Repository of app objects
|
|
34
|
+
* @param setVM - Callback function to remove from updates
|
|
35
|
+
*/
|
|
36
|
+
unsubscribe: (id, appObjects, setVM) => {
|
|
37
|
+
const pm = AssetFilePM_1.AssetFilePM.getByID(id, appObjects);
|
|
38
|
+
if (!pm) {
|
|
39
|
+
appObjects.submitError("assetFileAdapter", "Unable to find AssetFilePM");
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
pm.removeView(setVM);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=assetFileAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assetFileAdapter.js","sourceRoot":"","sources":["../../../../src/Assets/Adapters/assetFileAdapter.ts"],"names":[],"mappings":";;;AAEA,oDAI4B;AAE5B;;;GAGG;AACU,QAAA,gBAAgB,GAA2B;IACtD;;OAEG;IACH,SAAS,EAAE,gCAAkB;IAE7B;;;;;;OAMG;IACH,SAAS,EAAE,CACT,EAAU,EACV,UAAyB,EACzB,KAAgC,EAChC,EAAE;QACF,MAAM,EAAE,GAAG,yBAAW,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,UAAU,CAAC,WAAW,CAAC,kBAAkB,EAAE,4BAA4B,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QACD,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED;;;;;;OAMG;IACH,WAAW,EAAE,CACX,EAAU,EACV,UAAyB,EACzB,KAAgC,EAChC,EAAE;QACF,MAAM,EAAE,GAAG,yBAAW,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,UAAU,CAAC,WAAW,CAAC,kBAAkB,EAAE,4BAA4B,CAAC,CAAC;YACzE,OAAO;QACT,CAAC;QACD,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;CACF,CAAC","sourcesContent":["// filepath: c:\\Users\\amosp\\Documents\\WebGL\\vivedlearning_host\\src\\Assets\\Adapters\\assetFileAdapter.ts\r\nimport { AppObjectRepo, PmAdapter } from \"@vived/core\";\r\nimport {\r\n AssetFilePM,\r\n AssetFileVM,\r\n defaultAssetFileVM\r\n} from \"../PMs/AssetFilePM\";\r\n\r\n/**\r\n * Adapter for connecting AssetFilePM to UI components\r\n * Provides the interface for React components to subscribe to AssetFileVM updates\r\n */\r\nexport const assetFileAdapter: PmAdapter<AssetFileVM> = {\r\n /**\r\n * Default view model used before subscription is established\r\n */\r\n defaultVM: defaultAssetFileVM,\r\n\r\n /**\r\n * Subscribe a view function to updates from the presentation manager\r\n *\r\n * @param id - ID of the asset to observe\r\n * @param appObjects - Repository of app objects\r\n * @param setVM - Callback function that will receive view model updates\r\n */\r\n subscribe: (\r\n id: string,\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: AssetFileVM) => void\r\n ) => {\r\n const pm = AssetFilePM.getByID(id, appObjects);\r\n if (!pm) {\r\n appObjects.submitError(\"assetFileAdapter\", \"Unable to find AssetFilePM\");\r\n return;\r\n }\r\n pm.addView(setVM);\r\n },\r\n\r\n /**\r\n * Unsubscribe a view function from updates\r\n *\r\n * @param id - ID of the asset to stop observing\r\n * @param appObjects - Repository of app objects\r\n * @param setVM - Callback function to remove from updates\r\n */\r\n unsubscribe: (\r\n id: string,\r\n appObjects: AppObjectRepo,\r\n setVM: (vm: AssetFileVM) => void\r\n ) => {\r\n const pm = AssetFilePM.getByID(id, appObjects);\r\n if (!pm) {\r\n appObjects.submitError(\"assetFileAdapter\", \"Unable to find AssetFilePM\");\r\n return;\r\n }\r\n pm.removeView(setVM);\r\n }\r\n};\r\n"]}
|
|
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./appAssetListAdapter"), exports);
|
|
18
18
|
__exportStar(require("./assetAdapter"), exports);
|
|
19
|
+
__exportStar(require("./assetFileAdapter"), exports);
|
|
19
20
|
__exportStar(require("./editingAppAssetAdapter"), exports);
|
|
20
21
|
__exportStar(require("./showArchivedAppAssetAdapter"), exports);
|
|
21
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Assets/Adapters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,iDAA+B;AAC/B,2DAAyC;AACzC,gEAA8C","sourcesContent":["export * from \"./appAssetListAdapter\";\r\nexport * from \"./assetAdapter\";\r\nexport * from \"./editingAppAssetAdapter\";\r\nexport * from \"./showArchivedAppAssetAdapter\";\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Assets/Adapters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,iDAA+B;AAC/B,qDAAmC;AACnC,2DAAyC;AACzC,gEAA8C","sourcesContent":["export * from \"./appAssetListAdapter\";\r\nexport * from \"./assetAdapter\";\r\nexport * from \"./assetFileAdapter\";\r\nexport * from \"./editingAppAssetAdapter\";\r\nexport * from \"./showArchivedAppAssetAdapter\";\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupAssetsForSandbox.js","sourceRoot":"","sources":["../../../../src/Assets/Factories/setupAssetsForSandbox.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"setupAssetsForSandbox.js","sourceRoot":"","sources":["../../../../src/Assets/Factories/setupAssetsForSandbox.ts"],"names":[],"mappings":";;AA8BA,sDAuBC;AApDD,0CAKqB;AACrB,gCAMgB;AAChB,gCAcgB;AAEhB,SAAgB,qBAAqB,CAAC,UAAyB;IAC7D,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAC/D,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAEzD,WAAW;IACX,MAAM,SAAS,GAAG,IAAA,wBAAa,EAAC,WAAW,CAAC,CAAC;IAC7C,SAAS,CAAC,YAAY,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACtD,IAAA,wBAAa,EAAC,WAAW,CAAC,CAAC;IAE3B,MAAM;IACN,IAAA,sBAAgB,EAAC,WAAW,CAAC,CAAC;IAC9B,IAAA,2BAAqB,EAAC,WAAW,CAAC,CAAC;IACnC,IAAA,wBAAkB,EAAC,WAAW,CAAC,CAAC;IAChC,IAAA,oBAAc,EAAC,WAAW,CAAC,CAAC;IAC5B,IAAA,wBAAkB,EAAC,WAAW,CAAC,CAAC;IAChC,IAAA,oBAAc,EAAC,WAAW,CAAC,CAAC;IAC5B,IAAA,uBAAiB,EAAC,WAAW,CAAC,CAAC;IAC/B,IAAA,uBAAiB,EAAC,WAAW,CAAC,CAAC;IAE/B,MAAM;IACN,IAAA,wBAAkB,EAAC,WAAW,CAAC,CAAC;IAChC,IAAA,gCAA0B,EAAC,WAAW,CAAC,CAAC;IACxC,IAAA,2BAAqB,EAAC,WAAW,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAyB;IACjD,OAAO,SAAS,YAAY,CAAC,EAAU;QACrC,MAAM,EAAE,GAAG,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAEtC,WAAW;QACX,MAAM,MAAM,GAAG,IAAA,0BAAe,EAAC,EAAE,CAAC,CAAC;QAEnC,MAAM;QACN,IAAA,wBAAkB,EAAC,EAAE,CAAC,CAAC;QACvB,IAAA,uBAAiB,EAAC,EAAE,CAAC,CAAC;QACtB,IAAA,6BAAuB,EAAC,EAAE,CAAC,CAAC;QAC5B,IAAA,2BAAqB,EAAC,EAAE,CAAC,CAAC;QAC1B,IAAA,8BAAwB,EAAC,EAAE,CAAC,CAAC;QAE7B,MAAM;QACN,IAAA,iBAAW,EAAC,EAAE,CAAC,CAAC;QAChB,IAAA,qBAAe,EAAC,EAAE,CAAC,CAAC,CAAC,+BAA+B;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import { AppObjectRepo } from \"@vived/core\";\r\nimport {\r\n AssetEntity,\r\n makeAppAssets,\r\n makeAssetEntity,\r\n makeAssetRepo\r\n} from \"../Entities\";\r\nimport {\r\n makeAppAssetListPM,\r\n makeAssetFilePM,\r\n makeAssetPM,\r\n makeEditingAppAssetPM,\r\n makeShowArchivedAppAssetPM\r\n} from \"../PMs\";\r\nimport {\r\n makeArchiveAssetUC,\r\n makeDeleteAssetUC,\r\n makeDownloadAssetFileUC,\r\n makeEditAppAsset,\r\n makeGetAppAssetUC,\r\n makeGetAssetBlobURLUC,\r\n makeGetAssetFileUC,\r\n makeGetAssetUC,\r\n makeNewAppAssetUC,\r\n makeNewAssetUC,\r\n makePrefetchAssets,\r\n makeUpdateAppAssetMetaUC,\r\n makeUpdateAssetFileUC\r\n} from \"../UCs\";\r\n\r\nexport function setupAssetsForSandbox(appObjects: AppObjectRepo) {\r\n const assetRepoAO = appObjects.getOrCreate(\"Asset Repository\");\r\n const appAssetsAO = appObjects.getOrCreate(\"App Assets\");\r\n\r\n // Entities\r\n const assetRepo = makeAssetRepo(assetRepoAO);\r\n assetRepo.assetFactory = makeAssetFactory(appObjects);\r\n makeAppAssets(appAssetsAO);\r\n\r\n // UCs\r\n makeEditAppAsset(assetRepoAO);\r\n makeGetAssetBlobURLUC(assetRepoAO);\r\n makeGetAssetFileUC(assetRepoAO);\r\n makeGetAssetUC(assetRepoAO);\r\n makePrefetchAssets(assetRepoAO);\r\n makeNewAssetUC(assetRepoAO);\r\n makeNewAppAssetUC(appAssetsAO);\r\n makeGetAppAssetUC(appAssetsAO);\r\n\r\n // PMs\r\n makeAppAssetListPM(appAssetsAO);\r\n makeShowArchivedAppAssetPM(appAssetsAO);\r\n makeEditingAppAssetPM(appAssetsAO);\r\n}\r\n\r\nfunction makeAssetFactory(appObjects: AppObjectRepo) {\r\n return function assetFactory(id: string): AssetEntity {\r\n const ao = appObjects.getOrCreate(id);\r\n\r\n // Entities\r\n const entity = makeAssetEntity(ao);\r\n\r\n // UCs\r\n makeArchiveAssetUC(ao);\r\n makeDeleteAssetUC(ao);\r\n makeDownloadAssetFileUC(ao);\r\n makeUpdateAssetFileUC(ao);\r\n makeUpdateAppAssetMetaUC(ao);\r\n\r\n // PMs\r\n makeAssetPM(ao);\r\n makeAssetFilePM(ao); // Add our new PM to each asset\r\n return entity;\r\n };\r\n}\r\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AssetFilePMMock = void 0;
|
|
4
|
+
const AssetFilePM_1 = require("../PMs/AssetFilePM");
|
|
5
|
+
/**
|
|
6
|
+
* Mock implementation of AssetFilePM for testing
|
|
7
|
+
* Provides Jest mock functions for testing adapters and other components
|
|
8
|
+
*/
|
|
9
|
+
class AssetFilePMMock extends AssetFilePM_1.AssetFilePM {
|
|
10
|
+
/**
|
|
11
|
+
* Creates a new AssetFilePMMock instance
|
|
12
|
+
*
|
|
13
|
+
* @param appObject - The app object to associate with this mock PM
|
|
14
|
+
*/
|
|
15
|
+
constructor(appObject) {
|
|
16
|
+
super(appObject, AssetFilePM_1.AssetFilePM.type);
|
|
17
|
+
/**
|
|
18
|
+
* Mock implementation of vmsAreEqual for testing
|
|
19
|
+
*/
|
|
20
|
+
this.vmsAreEqual = jest.fn();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.AssetFilePMMock = AssetFilePMMock;
|
|
24
|
+
//# sourceMappingURL=AssetFilePMMock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssetFilePMMock.js","sourceRoot":"","sources":["../../../../src/Assets/Mocks/AssetFilePMMock.ts"],"names":[],"mappings":";;;AAEA,oDAAiD;AAEjD;;;GAGG;AACH,MAAa,eAAgB,SAAQ,yBAAW;IAM9C;;;;OAIG;IACH,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,yBAAW,CAAC,IAAI,CAAC,CAAC;QAXrC;;WAEG;QACH,gBAAW,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IASxB,CAAC;CACF;AAdD,0CAcC","sourcesContent":["// filepath: c:\\Users\\amosp\\Documents\\WebGL\\vivedlearning_host\\src\\Assets\\Mocks\\AssetFilePMMock.ts\r\nimport { AppObject } from \"@vived/core\";\r\nimport { AssetFilePM } from \"../PMs/AssetFilePM\";\r\n\r\n/**\r\n * Mock implementation of AssetFilePM for testing\r\n * Provides Jest mock functions for testing adapters and other components\r\n */\r\nexport class AssetFilePMMock extends AssetFilePM {\r\n /**\r\n * Mock implementation of vmsAreEqual for testing\r\n */\r\n vmsAreEqual = jest.fn();\r\n\r\n /**\r\n * Creates a new AssetFilePMMock instance\r\n *\r\n * @param appObject - The app object to associate with this mock PM\r\n */\r\n constructor(appObject: AppObject) {\r\n super(appObject, AssetFilePM.type);\r\n }\r\n}\r\n"]}
|
|
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./AppAssetListPMMock"), exports);
|
|
18
18
|
__exportStar(require("./AssetPMMock"), exports);
|
|
19
|
+
__exportStar(require("./AssetFilePMMock"), exports);
|
|
19
20
|
__exportStar(require("./EditingAppAssetPMMock"), exports);
|
|
20
21
|
__exportStar(require("./MockArchiveAsset"), exports);
|
|
21
22
|
__exportStar(require("./MockDeleteAssetUC"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Assets/Mocks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,gDAA8B;AAC9B,0DAAwC;AACxC,qDAAmC;AACnC,sDAAoC;AACpC,4DAA0C;AAC1C,uDAAqC;AACrC,uDAAqC;AACrC,0DAAwC;AACxC,uDAAqC;AACrC,mDAAiC;AACjC,oDAAkC;AAClC,mDAAiC;AACjC,uDAAqC;AACrC,0DAAwC;AACxC,6DAA2C;AAC3C,+DAA6C","sourcesContent":["export * from \"./AppAssetListPMMock\";\r\nexport * from \"./AssetPMMock\";\r\nexport * from \"./EditingAppAssetPMMock\";\r\nexport * from \"./MockArchiveAsset\";\r\nexport * from \"./MockDeleteAssetUC\";\r\nexport * from \"./MockDownloadAssetFileUC\";\r\nexport * from \"./MockEditAppAssetUC\";\r\nexport * from \"./MockGetAppAssetsUC\";\r\nexport * from \"./MockGetAssetBlobURLUC\";\r\nexport * from \"./MockGetAssetFileUC\";\r\nexport * from \"./MockGetAssetUC\";\r\nexport * from \"./MockNewAppAsset\";\r\nexport * from \"./MockNewAssetUC\";\r\nexport * from \"./MockPrefetchAssets\";\r\nexport * from \"./MockUpdateAssetFileUC\";\r\nexport * from \"./MockUpdateAppAssetMetaUC\";\r\nexport * from \"./ShowArchivedAppAssetPMMock\";\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Assets/Mocks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,gDAA8B;AAC9B,oDAAkC;AAClC,0DAAwC;AACxC,qDAAmC;AACnC,sDAAoC;AACpC,4DAA0C;AAC1C,uDAAqC;AACrC,uDAAqC;AACrC,0DAAwC;AACxC,uDAAqC;AACrC,mDAAiC;AACjC,oDAAkC;AAClC,mDAAiC;AACjC,uDAAqC;AACrC,0DAAwC;AACxC,6DAA2C;AAC3C,+DAA6C","sourcesContent":["export * from \"./AppAssetListPMMock\";\r\nexport * from \"./AssetPMMock\";\r\nexport * from \"./AssetFilePMMock\";\r\nexport * from \"./EditingAppAssetPMMock\";\r\nexport * from \"./MockArchiveAsset\";\r\nexport * from \"./MockDeleteAssetUC\";\r\nexport * from \"./MockDownloadAssetFileUC\";\r\nexport * from \"./MockEditAppAssetUC\";\r\nexport * from \"./MockGetAppAssetsUC\";\r\nexport * from \"./MockGetAssetBlobURLUC\";\r\nexport * from \"./MockGetAssetFileUC\";\r\nexport * from \"./MockGetAssetUC\";\r\nexport * from \"./MockNewAppAsset\";\r\nexport * from \"./MockNewAssetUC\";\r\nexport * from \"./MockPrefetchAssets\";\r\nexport * from \"./MockUpdateAssetFileUC\";\r\nexport * from \"./MockUpdateAppAssetMetaUC\";\r\nexport * from \"./ShowArchivedAppAssetPMMock\";\r\n"]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AssetFilePM = exports.defaultAssetFileVM = void 0;
|
|
4
|
+
exports.makeAssetFilePM = makeAssetFilePM;
|
|
5
|
+
// filepath: c:\Users\amosp\Documents\WebGL\vivedlearning_host\src\Assets\PMs\AssetFilePM.ts
|
|
6
|
+
const core_1 = require("@vived/core");
|
|
7
|
+
const AssetEntity_1 = require("../Entities/AssetEntity");
|
|
8
|
+
/**
|
|
9
|
+
* Default empty AssetFileVM for initialization
|
|
10
|
+
*/
|
|
11
|
+
exports.defaultAssetFileVM = {
|
|
12
|
+
blobURL: undefined,
|
|
13
|
+
isFetchingFile: false,
|
|
14
|
+
fileHasBeenFetched: false,
|
|
15
|
+
fetchError: undefined
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Presentation Manager for Asset file status
|
|
19
|
+
*
|
|
20
|
+
* The AssetFilePM is responsible for:
|
|
21
|
+
* - Converting the file-related properties of AssetEntity into a view-friendly format (AssetFileVM)
|
|
22
|
+
* - Notifying the view when asset file status changes
|
|
23
|
+
* - Providing comparison utilities for view models
|
|
24
|
+
*
|
|
25
|
+
* Usage:
|
|
26
|
+
* 1. Retrieve an instance with `AssetFilePM.getByID(assetId, appObjects)`
|
|
27
|
+
* 2. Subscribe to view updates with `pm.addView(callback)`
|
|
28
|
+
* 3. Access current view data with `pm.lastVM`
|
|
29
|
+
*/
|
|
30
|
+
class AssetFilePM extends core_1.AppObjectPM {
|
|
31
|
+
/**
|
|
32
|
+
* Retrieves an AssetFilePM instance for a specific asset by ID
|
|
33
|
+
*
|
|
34
|
+
* @param assetID - The unique identifier of the asset
|
|
35
|
+
* @param appObjects - The repository of app objects
|
|
36
|
+
* @returns The AssetFilePM instance or undefined if not found
|
|
37
|
+
*/
|
|
38
|
+
static getByID(assetID, appObjects) {
|
|
39
|
+
const appObject = appObjects.get(assetID);
|
|
40
|
+
if (!appObject) {
|
|
41
|
+
appObjects.submitWarning("AssetFilePM.getByID", "Unable to find app object by ID " + assetID);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const pm = appObject.getComponent(AssetFilePM.type);
|
|
45
|
+
if (!pm) {
|
|
46
|
+
appObjects.submitWarning("AssetFilePM.getByID", "App Object does not have a AssetFilePM");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
return pm;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.AssetFilePM = AssetFilePM;
|
|
53
|
+
AssetFilePM.type = "AssetFilePM";
|
|
54
|
+
/**
|
|
55
|
+
* Creates a new AssetFilePM instance
|
|
56
|
+
*
|
|
57
|
+
* @param appObject - The app object to associate with this PM
|
|
58
|
+
* @returns A new AssetFilePM instance
|
|
59
|
+
*/
|
|
60
|
+
function makeAssetFilePM(appObject) {
|
|
61
|
+
return new AssetFilePMImp(appObject);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Implementation of the AssetFilePM abstract class
|
|
65
|
+
* Handles the connection between AssetEntity file properties and view
|
|
66
|
+
*/
|
|
67
|
+
class AssetFilePMImp extends AssetFilePM {
|
|
68
|
+
get asset() {
|
|
69
|
+
return this.getCachedLocalComponent(AssetEntity_1.AssetEntity.type);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Compares two AssetFileVM instances for equality
|
|
73
|
+
* Used to determine if the view needs to update
|
|
74
|
+
*
|
|
75
|
+
* @param a - First AssetFileVM to compare
|
|
76
|
+
* @param b - Second AssetFileVM to compare
|
|
77
|
+
* @returns True if view models are equal, false otherwise
|
|
78
|
+
*/
|
|
79
|
+
vmsAreEqual(a, b) {
|
|
80
|
+
if (a.blobURL !== b.blobURL)
|
|
81
|
+
return false;
|
|
82
|
+
if (a.isFetchingFile !== b.isFetchingFile)
|
|
83
|
+
return false;
|
|
84
|
+
if (a.fileHasBeenFetched !== b.fileHasBeenFetched)
|
|
85
|
+
return false;
|
|
86
|
+
// Handle errors comparison (both undefined, or same message)
|
|
87
|
+
if (a.fetchError !== b.fetchError) {
|
|
88
|
+
if (a.fetchError === undefined && b.fetchError !== undefined)
|
|
89
|
+
return false;
|
|
90
|
+
if (a.fetchError !== undefined && b.fetchError === undefined)
|
|
91
|
+
return false;
|
|
92
|
+
if (a.fetchError !== undefined &&
|
|
93
|
+
b.fetchError !== undefined &&
|
|
94
|
+
a.fetchError.message !== b.fetchError.message)
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Cleans up resources and removes observers when the PM is disposed
|
|
101
|
+
*/
|
|
102
|
+
dispose() {
|
|
103
|
+
if (this.asset) {
|
|
104
|
+
this.asset.removeChangeObserver(this.onAssetChange);
|
|
105
|
+
}
|
|
106
|
+
super.dispose();
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Creates a new AssetFilePMImp instance
|
|
110
|
+
*
|
|
111
|
+
* @param appObject - The app object to associate with this PM
|
|
112
|
+
*/
|
|
113
|
+
constructor(appObject) {
|
|
114
|
+
super(appObject, AssetFilePM.type);
|
|
115
|
+
/**
|
|
116
|
+
* Observer callback that updates the view model when the entity changes
|
|
117
|
+
* Transforms entity data into view model format
|
|
118
|
+
*/
|
|
119
|
+
this.onAssetChange = () => {
|
|
120
|
+
if (!this.asset)
|
|
121
|
+
return;
|
|
122
|
+
const vm = {
|
|
123
|
+
blobURL: this.asset.blobURL,
|
|
124
|
+
isFetchingFile: this.asset.isFetchingFile,
|
|
125
|
+
fileHasBeenFetched: this.asset.fileHasBeenFetched,
|
|
126
|
+
fetchError: this.asset.fetchError
|
|
127
|
+
};
|
|
128
|
+
this.doUpdateView(vm);
|
|
129
|
+
};
|
|
130
|
+
this.asset?.addChangeObserver(this.onAssetChange);
|
|
131
|
+
this.onAssetChange();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# 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"]}
|
|
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./AppAssetListPM"), exports);
|
|
18
18
|
__exportStar(require("./AssetPM"), exports);
|
|
19
|
+
__exportStar(require("./AssetFilePM"), exports);
|
|
19
20
|
__exportStar(require("./EditingAppAssetPM"), exports);
|
|
20
21
|
__exportStar(require("./ShowArchivedAppAssetPM"), exports);
|
|
21
22
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Assets/PMs/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,4CAA0B;AAC1B,sDAAoC;AACpC,2DAAyC","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,mDAAiC;AACjC,4CAA0B;AAC1B,gDAA8B;AAC9B,sDAAoC;AACpC,2DAAyC","sourcesContent":["export * from \"./AppAssetListPM\";\r\nexport * from \"./AssetPM\";\r\nexport * from \"./AssetFilePM\";\r\nexport * from \"./EditingAppAssetPM\";\r\nexport * from \"./ShowArchivedAppAssetPM\";\r\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AppObjectEntity, Version } from "@vived/core";
|
|
1
|
+
import { AppObjectEntity, Version, MemoizedString } from "@vived/core";
|
|
2
2
|
/**
|
|
3
3
|
* Enum representing the possible states of an application
|
|
4
4
|
*
|
|
@@ -48,6 +48,31 @@ class AppEntityImp extends AppEntity {
|
|
|
48
48
|
get id() {
|
|
49
49
|
return this.appObject.id;
|
|
50
50
|
}
|
|
51
|
+
get name() {
|
|
52
|
+
return this._memoizedName.val;
|
|
53
|
+
}
|
|
54
|
+
set name(val) {
|
|
55
|
+
this._memoizedName.val = val;
|
|
56
|
+
}
|
|
57
|
+
get description() {
|
|
58
|
+
return this._memoizedDescription.val;
|
|
59
|
+
}
|
|
60
|
+
set description(val) {
|
|
61
|
+
this._memoizedDescription.val = val;
|
|
62
|
+
}
|
|
63
|
+
get image_url() {
|
|
64
|
+
return this._memoizedImageUrl.val;
|
|
65
|
+
}
|
|
66
|
+
set image_url(val) {
|
|
67
|
+
this._memoizedImageUrl.val = val;
|
|
68
|
+
}
|
|
69
|
+
get imageAssetId() {
|
|
70
|
+
const value = this._memoizedImageAssetId.val;
|
|
71
|
+
return value === "" ? undefined : value;
|
|
72
|
+
}
|
|
73
|
+
set imageAssetId(val) {
|
|
74
|
+
this._memoizedImageAssetId.val = val ?? "";
|
|
75
|
+
}
|
|
51
76
|
get latestVersion() {
|
|
52
77
|
return Version.GetLatest(this.versions);
|
|
53
78
|
}
|
|
@@ -100,9 +125,10 @@ class AppEntityImp extends AppEntity {
|
|
|
100
125
|
}
|
|
101
126
|
constructor(appObject) {
|
|
102
127
|
super(appObject, AppEntity.type);
|
|
103
|
-
this.
|
|
104
|
-
this.
|
|
105
|
-
this.
|
|
128
|
+
this._memoizedName = new MemoizedString("", this.notifyOnChange);
|
|
129
|
+
this._memoizedDescription = new MemoizedString("", this.notifyOnChange);
|
|
130
|
+
this._memoizedImageUrl = new MemoizedString("", this.notifyOnChange);
|
|
131
|
+
this._memoizedImageAssetId = new MemoizedString("", this.notifyOnChange);
|
|
106
132
|
this.versions = [];
|
|
107
133
|
this._state = AppState.INIT;
|
|
108
134
|
this._assignedToOwner = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppEntity.js","sourceRoot":"","sources":["../../../../src/Apps/Entities/AppEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAEf,OAAO,
|
|
1
|
+
{"version":3,"file":"AppEntity.js","sourceRoot":"","sources":["../../../../src/Apps/Entities/AppEntity.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n AppObject,\r\n AppObjectEntity,\r\n AppObjectRepo,\r\n Version,\r\n MemoizedString\r\n} from \"@vived/core\";\r\n\r\n/**\r\n * Enum representing the possible states of an application\r\n *\r\n * @enum {string}\r\n * @property {string} INIT - Initial state before app loading starts\r\n * @property {string} LOADING - App is currently loading resources\r\n * @property {string} READY - App is loaded and ready to use\r\n * @property {string} ERROR - App encountered an error during loading\r\n */\r\nexport enum AppState {\r\n INIT = \"INIT\",\r\n LOADING = \"LOADING\",\r\n READY = \"READY\",\r\n ERROR = \"ERROR\"\r\n}\r\n\r\n/**\r\n * AppEntity - Core entity representing an application in the system\r\n *\r\n * This abstract class defines the properties and behaviors of an application.\r\n * It manages app state, versioning, mounting status, and error handling.\r\n *\r\n * @extends AppObjectEntity from @vived/core\r\n */\r\nexport abstract class AppEntity extends AppObjectEntity {\r\n /** Type identifier for the AppEntity component */\r\n static type = \"AppEntity\";\r\n\r\n static get(id: string, appObjects: AppObjectRepo) {\r\n const ao = appObjects.get(id);\r\n if (!ao) {\r\n appObjects.submitWarning(\r\n \"AppEntity.get\",\r\n `Unable to find app object by ID: ${id}`\r\n );\r\n return;\r\n }\r\n\r\n return ao.getComponent<AppEntity>(AppEntity.type);\r\n }\r\n\r\n abstract get id(): string;\r\n abstract name: string;\r\n abstract description: string;\r\n abstract image_url: string;\r\n abstract imageAssetId: string | undefined;\r\n abstract versions: Version[];\r\n abstract get latestVersion(): Version | undefined;\r\n abstract errorMessage?: string;\r\n abstract get hasError(): boolean;\r\n abstract state: AppState;\r\n abstract assignedToOwner: boolean;\r\n\r\n abstract get isMounted(): boolean;\r\n abstract appAssetFolderURL?: string;\r\n abstract get updateIsAvailable(): boolean | undefined;\r\n abstract styles: string[];\r\n abstract mountedVersion: Version | undefined;\r\n}\r\n\r\n/**\r\n * Factory function to create a new AppEntity instance\r\n *\r\n * @param appObject - The app object to attach the entity to\r\n * @returns A concrete implementation of AppEntity\r\n */\r\nexport function makeAppEntity(appObject: AppObject): AppEntity {\r\n return new AppEntityImp(appObject);\r\n}\r\n\r\nclass AppEntityImp extends AppEntity {\r\n get id() {\r\n return this.appObject.id;\r\n }\r\n\r\n private _memoizedName: MemoizedString = new MemoizedString(\r\n \"\",\r\n this.notifyOnChange\r\n );\r\n\r\n get name(): string {\r\n return this._memoizedName.val;\r\n }\r\n\r\n set name(val: string) {\r\n this._memoizedName.val = val;\r\n }\r\n\r\n private _memoizedDescription: MemoizedString = new MemoizedString(\r\n \"\",\r\n this.notifyOnChange\r\n );\r\n\r\n get description(): string {\r\n return this._memoizedDescription.val;\r\n }\r\n\r\n set description(val: string) {\r\n this._memoizedDescription.val = val;\r\n }\r\n\r\n private _memoizedImageUrl: MemoizedString = new MemoizedString(\r\n \"\",\r\n this.notifyOnChange\r\n );\r\n\r\n get image_url(): string {\r\n return this._memoizedImageUrl.val;\r\n }\r\n\r\n set image_url(val: string) {\r\n this._memoizedImageUrl.val = val;\r\n }\r\n\r\n private _memoizedImageAssetId = new MemoizedString(\"\", this.notifyOnChange);\r\n\r\n get imageAssetId(): string | undefined {\r\n const value = this._memoizedImageAssetId.val;\r\n return value === \"\" ? undefined : value;\r\n }\r\n\r\n set imageAssetId(val: string | undefined) {\r\n this._memoizedImageAssetId.val = val ?? \"\";\r\n }\r\n\r\n versions: Version[] = [];\r\n\r\n get latestVersion(): Version | undefined {\r\n return Version.GetLatest(this.versions);\r\n }\r\n\r\n private _mountedVersion: Version | undefined;\r\n get mountedVersion() {\r\n return this._mountedVersion;\r\n }\r\n set mountedVersion(val: Version | undefined) {\r\n if (this._mountedVersion === val) return;\r\n\r\n this._mountedVersion = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n get updateIsAvailable(): boolean | undefined {\r\n if (this._mountedVersion === undefined) return undefined;\r\n if (this.latestVersion === undefined) return undefined;\r\n\r\n return Version.AreEqual(this._mountedVersion, this.latestVersion)\r\n ? false\r\n : true;\r\n }\r\n\r\n private _state: AppState = AppState.INIT;\r\n get state() {\r\n return this._state;\r\n }\r\n set state(val: AppState) {\r\n this._state = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n private _assignedToOwner: boolean = false;\r\n get assignedToOwner(): boolean {\r\n return this._assignedToOwner;\r\n }\r\n set assignedToOwner(val: boolean) {\r\n this._assignedToOwner = val;\r\n this.notifyOnChange();\r\n }\r\n\r\n get isMounted(): boolean {\r\n return this._mountedVersion === undefined ? false : true;\r\n }\r\n\r\n styles: string[] = [];\r\n appAssetFolderURL: string | undefined;\r\n\r\n private _errorMsg?: string;\r\n get errorMessage() {\r\n return this._errorMsg;\r\n }\r\n set errorMessage(val: string | undefined) {\r\n if (this._errorMsg === val) return;\r\n\r\n this._errorMsg = val;\r\n this.notifyOnChange();\r\n }\r\n get hasError(): boolean {\r\n return this._errorMsg === undefined ? false : true;\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, AppEntity.type);\r\n }\r\n}\r\n"]}
|