@geode/opengeodeweb-front 10.6.2 → 10.6.3-rc.1
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/.eslintrc.cjs +1 -1
- package/.oxlintrc.json +3 -22
- package/app/assets/geode_objects.js +26 -26
- package/app/components/Carousel.vue +62 -66
- package/app/components/CrsSelector.vue +48 -52
- package/app/components/DeleteDialog.vue +21 -37
- package/app/components/DragAndDrop.vue +35 -41
- package/app/components/ExtensionSelector.vue +50 -63
- package/app/components/FeedBack/ErrorBanner.vue +7 -10
- package/app/components/FeedBack/Snackers.vue +12 -14
- package/app/components/FetchingData.vue +1 -6
- package/app/components/FileSelector.vue +41 -47
- package/app/components/FileUploader.vue +62 -79
- package/app/components/GlassCard.vue +19 -19
- package/app/components/HybridRenderingView.vue +37 -38
- package/app/components/InfraConnected.vue +3 -3
- package/app/components/Inspector/InspectionButton.vue +27 -31
- package/app/components/Inspector/ResultPanel.vue +13 -24
- package/app/components/Launcher.vue +13 -13
- package/app/components/Loading.vue +63 -69
- package/app/components/MissingFilesSelector.vue +53 -73
- package/app/components/ObjectSelector.vue +81 -99
- package/app/components/PackagesVersions.vue +27 -30
- package/app/components/Recaptcha.vue +60 -71
- package/app/components/RemoteRenderingView.vue +102 -108
- package/app/components/Screenshot.vue +36 -42
- package/app/components/SearchBar.vue +5 -5
- package/app/components/Step.vue +37 -44
- package/app/components/Stepper.vue +29 -35
- package/app/components/VeaseViewToolbar.vue +69 -78
- package/app/components/ViewToolbar.vue +41 -45
- package/app/components/Viewer/BreadCrumb.vue +18 -30
- package/app/components/Viewer/ContextMenu.vue +176 -179
- package/app/components/Viewer/ContextMenuItem.vue +105 -117
- package/app/components/Viewer/EdgedCurve/PointsOptions.vue +6 -9
- package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +82 -93
- package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +84 -99
- package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +83 -98
- package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +62 -73
- package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +84 -108
- package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +82 -105
- package/app/components/Viewer/Generic/Model/EdgesOptions.vue +19 -23
- package/app/components/Viewer/Generic/Model/PointsOptions.vue +26 -30
- package/app/components/Viewer/Grid/2D/CellsOptions.vue +5 -5
- package/app/components/Viewer/Grid/2D/EdgesOptions.vue +6 -9
- package/app/components/Viewer/Grid/2D/PointsOptions.vue +6 -9
- package/app/components/Viewer/Grid/3D/CellsOptions.vue +5 -5
- package/app/components/Viewer/Grid/3D/EdgesOptions.vue +6 -9
- package/app/components/Viewer/Grid/3D/FacetsOptions.vue +5 -5
- package/app/components/Viewer/Grid/3D/PointsOptions.vue +6 -9
- package/app/components/Viewer/HybridSolid/EdgesOptions.vue +6 -9
- package/app/components/Viewer/HybridSolid/PointsOptions.vue +6 -9
- package/app/components/Viewer/HybridSolid/PolygonsOptions.vue +6 -9
- package/app/components/Viewer/HybridSolid/PolyhedraOptions.vue +6 -9
- package/app/components/Viewer/Options/AttributeColorBar.vue +8 -8
- package/app/components/Viewer/Options/AttributeSelector.vue +73 -78
- package/app/components/Viewer/Options/ColorMapList.vue +115 -140
- package/app/components/Viewer/Options/ColorMapPicker.vue +128 -142
- package/app/components/Viewer/Options/ColorPicker.vue +9 -9
- package/app/components/Viewer/Options/ColoringTypeSelector.vue +77 -91
- package/app/components/Viewer/Options/TextureItem.vue +54 -58
- package/app/components/Viewer/Options/TexturesSelector.vue +22 -26
- package/app/components/Viewer/Options/VisibilitySwitch.vue +1 -1
- package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +61 -68
- package/app/components/Viewer/PolygonalSurface/EdgesOptions.vue +6 -9
- package/app/components/Viewer/PolygonalSurface/PointsOptions.vue +6 -9
- package/app/components/Viewer/PolygonalSurface/SpecificPolygonsOptions.vue +83 -103
- package/app/components/Viewer/Solid/EdgesOptions.vue +6 -9
- package/app/components/Viewer/Solid/PointsOptions.vue +6 -9
- package/app/components/Viewer/Solid/PolygonsOptions.vue +6 -9
- package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +82 -105
- package/app/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue +5 -5
- package/app/components/Viewer/TetrahedralSolid/TrianglesOptions.vue +5 -5
- package/app/components/Viewer/Tree/ObjectTree.vue +80 -89
- package/app/components/Viewer/TreeComponent.vue +43 -49
- package/app/components/Viewer/TreeObject.vue +48 -50
- package/app/components/Viewer/TriangulatedSurface/EdgesOptions.vue +6 -9
- package/app/components/Viewer/TriangulatedSurface/PointsOptions.vue +5 -5
- package/app/components/Viewer/TriangulatedSurface/TrianglesOptions.vue +5 -5
- package/app/components/Wrapper.vue +8 -8
- package/app/components/ZScaling.vue +18 -27
- package/app/composables/project_manager.js +57 -67
- package/app/composables/run_function_when_microservices_connected.js +8 -8
- package/app/plugins/auto_store_register.js +11 -13
- package/app/stores/app.js +118 -138
- package/app/stores/data.js +52 -68
- package/app/stores/data_style.js +36 -36
- package/app/stores/feedback.js +17 -20
- package/app/stores/geode.js +54 -55
- package/app/stores/hybrid_viewer.js +164 -177
- package/app/stores/infra.js +45 -55
- package/app/stores/lambda.js +26 -26
- package/app/stores/menu.js +78 -85
- package/app/stores/treeview.js +57 -65
- package/app/stores/viewer.js +92 -104
- package/app/utils/colormap.js +3 -3
- package/app/utils/config.js +16 -22
- package/app/utils/default_styles.js +50 -62
- package/app/utils/extension.js +44 -44
- package/app/utils/file_import_workflow.js +50 -64
- package/app/utils/local/app_mode.js +2 -2
- package/app/utils/local/cleanup.js +66 -72
- package/app/utils/local/microservices.js +61 -71
- package/app/utils/local/path.js +16 -19
- package/app/utils/local/scripts.js +22 -22
- package/app/utils/recaptcha.js +6 -6
- package/app/utils/server.js +21 -24
- package/app/utils/status.js +2 -2
- package/app/utils/treeview.js +4 -4
- package/app/utils/validate_schema.js +7 -7
- package/commitlint.config.js +2 -2
- package/eslint.config.js +4 -4
- package/internal/database/database.js +38 -46
- package/internal/database/extended_database.js +9 -10
- package/internal/database/tables/data.js +2 -3
- package/internal/database/tables/model_components.js +1 -1
- package/internal/database/tables/model_components_relation.js +1 -1
- package/internal/stores/data_style/mesh/cells/cell.js +47 -63
- package/internal/stores/data_style/mesh/cells/color.js +11 -16
- package/internal/stores/data_style/mesh/cells/common.js +6 -6
- package/internal/stores/data_style/mesh/cells/index.js +37 -47
- package/internal/stores/data_style/mesh/cells/textures.js +11 -12
- package/internal/stores/data_style/mesh/cells/vertex.js +47 -58
- package/internal/stores/data_style/mesh/cells/visibility.js +11 -16
- package/internal/stores/data_style/mesh/edges/color.js +11 -16
- package/internal/stores/data_style/mesh/edges/common.js +6 -6
- package/internal/stores/data_style/mesh/edges/edge.js +47 -63
- package/internal/stores/data_style/mesh/edges/index.js +38 -52
- package/internal/stores/data_style/mesh/edges/vertex.js +47 -58
- package/internal/stores/data_style/mesh/edges/visibility.js +11 -16
- package/internal/stores/data_style/mesh/edges/width.js +11 -16
- package/internal/stores/data_style/mesh/index.js +34 -34
- package/internal/stores/data_style/mesh/points/color.js +11 -16
- package/internal/stores/data_style/mesh/points/common.js +6 -6
- package/internal/stores/data_style/mesh/points/index.js +35 -49
- package/internal/stores/data_style/mesh/points/size.js +11 -16
- package/internal/stores/data_style/mesh/points/vertex.js +47 -58
- package/internal/stores/data_style/mesh/points/visibility.js +11 -16
- package/internal/stores/data_style/mesh/polygons/color.js +11 -16
- package/internal/stores/data_style/mesh/polygons/common.js +6 -6
- package/internal/stores/data_style/mesh/polygons/index.js +36 -45
- package/internal/stores/data_style/mesh/polygons/polygon.js +45 -56
- package/internal/stores/data_style/mesh/polygons/textures.js +11 -16
- package/internal/stores/data_style/mesh/polygons/vertex.js +47 -58
- package/internal/stores/data_style/mesh/polygons/visibility.js +11 -16
- package/internal/stores/data_style/mesh/polyhedra/color.js +11 -16
- package/internal/stores/data_style/mesh/polyhedra/common.js +6 -6
- package/internal/stores/data_style/mesh/polyhedra/index.js +29 -42
- package/internal/stores/data_style/mesh/polyhedra/polyhedron.js +43 -47
- package/internal/stores/data_style/mesh/polyhedra/vertex.js +47 -58
- package/internal/stores/data_style/mesh/polyhedra/visibility.js +11 -17
- package/internal/stores/data_style/model/blocks/color.js +21 -24
- package/internal/stores/data_style/model/blocks/common.js +6 -6
- package/internal/stores/data_style/model/blocks/index.js +13 -17
- package/internal/stores/data_style/model/blocks/visibility.js +21 -24
- package/internal/stores/data_style/model/corners/color.js +21 -24
- package/internal/stores/data_style/model/corners/common.js +6 -6
- package/internal/stores/data_style/model/corners/index.js +14 -18
- package/internal/stores/data_style/model/corners/visibility.js +21 -25
- package/internal/stores/data_style/model/edges/common.js +4 -4
- package/internal/stores/data_style/model/edges/index.js +7 -7
- package/internal/stores/data_style/model/edges/visibility.js +11 -15
- package/internal/stores/data_style/model/index.js +84 -100
- package/internal/stores/data_style/model/lines/color.js +21 -24
- package/internal/stores/data_style/model/lines/common.js +6 -6
- package/internal/stores/data_style/model/lines/index.js +13 -17
- package/internal/stores/data_style/model/lines/visibility.js +21 -24
- package/internal/stores/data_style/model/points/common.js +4 -4
- package/internal/stores/data_style/model/points/index.js +9 -9
- package/internal/stores/data_style/model/points/size.js +11 -11
- package/internal/stores/data_style/model/points/visibility.js +11 -15
- package/internal/stores/data_style/model/surfaces/color.js +21 -24
- package/internal/stores/data_style/model/surfaces/common.js +6 -6
- package/internal/stores/data_style/model/surfaces/index.js +14 -22
- package/internal/stores/data_style/model/surfaces/visibility.js +18 -22
- package/internal/stores/data_style/state.js +11 -11
- package/internal/utils/api_fetch.js +24 -34
- package/internal/utils/upload_file.js +19 -24
- package/internal/utils/viewer_call.js +23 -36
- package/nuxt.config.js +7 -11
- package/package.json +3 -3
- package/scripts/generate_geode_objects.js +14 -16
- package/server/api/app/kill.post.js +4 -4
- package/server/api/app/project_folder_path.post.js +11 -11
- package/server/api/app/run_back.post.js +12 -12
- package/server/api/app/run_viewer.post.js +12 -12
- package/server/api/extensions/run.post.js +34 -41
- package/server/api/extensions/upload.put.js +48 -62
- package/tests/integration/setup.js +43 -53
- package/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +90 -116
- package/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +81 -107
- package/tests/integration/stores/data_style/mesh/index.nuxt.test.js +38 -41
- package/tests/integration/stores/data_style/mesh/points.nuxt.test.js +85 -101
- package/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +89 -113
- package/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +81 -105
- package/tests/integration/stores/data_style/model/blocks.nuxt.test.js +56 -73
- package/tests/integration/stores/data_style/model/corners.nuxt.test.js +59 -76
- package/tests/integration/stores/data_style/model/edges.nuxt.test.js +39 -42
- package/tests/integration/stores/data_style/model/index.nuxt.test.js +31 -34
- package/tests/integration/stores/data_style/model/lines.nuxt.test.js +60 -73
- package/tests/integration/stores/data_style/model/points.nuxt.test.js +52 -55
- package/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +59 -80
- package/tests/integration/stores/viewer.nuxt.test.js +35 -38
- package/tests/setup_indexeddb.js +2 -2
- package/tests/unit/components/CrsSelector.nuxt.test.js +28 -28
- package/tests/unit/components/ExtensionSelector.nuxt.test.js +33 -35
- package/tests/unit/components/FeedBack/ErrorsBanner.nuxt.test.js +23 -23
- package/tests/unit/components/FeedBack/Snackers.nuxt.test.js +18 -18
- package/tests/unit/components/FileSelector.nuxt.test.js +57 -59
- package/tests/unit/components/FileUploader.nuxt.test.js +35 -39
- package/tests/unit/components/Inspector/InspectionButton.nuxt.test.js +28 -28
- package/tests/unit/components/Inspector/ResultPanel.nuxt.test.js +22 -27
- package/tests/unit/components/Launcher.nuxt.test.js +20 -22
- package/tests/unit/components/MissingFilesSelector.nuxt.test.js +37 -37
- package/tests/unit/components/ObjectSelector.nuxt.test.js +62 -62
- package/tests/unit/components/PackagesVersions.nuxt.test.js +16 -16
- package/tests/unit/components/Step.nuxt.test.js +18 -19
- package/tests/unit/components/Stepper.nuxt.test.js +18 -18
- package/tests/unit/composables/api_fetch.nuxt.test.js +34 -36
- package/tests/unit/composables/project_manager.nuxt.test.js +93 -112
- package/tests/unit/composables/run_function_when_microservices_connected.nuxt.test.js +36 -36
- package/tests/unit/composables/upload_file.nuxt.test.js +27 -29
- package/tests/unit/plugins/project_load.nuxt.test.js +31 -33
- package/tests/unit/stores/app.nuxt.test.js +90 -92
- package/tests/unit/stores/feedback.nuxt.test.js +47 -57
- package/tests/unit/stores/geode.nuxt.test.js +111 -115
- package/tests/unit/stores/infra.nuxt.test.js +148 -148
- package/tests/unit/stores/lambda.nuxt.test.js +72 -74
- package/tests/unit/stores/treeview.nuxt.test.js +19 -21
- package/tests/unit/stores/viewer.nuxt.test.js +109 -122
- package/tests/unit/utils/recaptcha.nuxt.test.js +25 -29
- package/tests/unit/utils/validate_schema.nuxt.test.js +17 -17
- package/tests/utils.js +11 -11
- package/tests/vitest.config.js +9 -9
- package/vuetify_config.js +2 -2
package/app/utils/extension.js
CHANGED
|
@@ -1,90 +1,90 @@
|
|
|
1
1
|
// Node.js imports
|
|
2
2
|
|
|
3
3
|
// Third party imports
|
|
4
|
-
import _ from "lodash"
|
|
4
|
+
import _ from "lodash";
|
|
5
5
|
|
|
6
6
|
// Local imports
|
|
7
|
-
import { useAppStore } from "@ogw_front/stores/app"
|
|
8
|
-
import { useInfraStore } from "@ogw_front/stores/infra"
|
|
7
|
+
import { useAppStore } from "@ogw_front/stores/app";
|
|
8
|
+
import { useInfraStore } from "@ogw_front/stores/infra";
|
|
9
9
|
|
|
10
10
|
async function importExtensionFile(file) {
|
|
11
|
-
await uploadExtension(file)
|
|
12
|
-
return registerRunningExtensions()
|
|
11
|
+
await uploadExtension(file);
|
|
12
|
+
return registerRunningExtensions();
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
async function registerRunningExtensions() {
|
|
16
|
-
const appStore = useAppStore()
|
|
17
|
-
const infraStore = useInfraStore()
|
|
18
|
-
const { extensionsArray } = await runExtensions()
|
|
16
|
+
const appStore = useAppStore();
|
|
17
|
+
const infraStore = useInfraStore();
|
|
18
|
+
const { extensionsArray } = await runExtensions();
|
|
19
19
|
|
|
20
20
|
return Promise.all(
|
|
21
21
|
extensionsArray.map(async (extension) => {
|
|
22
|
-
const { name, version, frontendContent, port } = extension
|
|
22
|
+
const { name, version, frontendContent, port } = extension;
|
|
23
23
|
const blob = new Blob([frontendContent], {
|
|
24
24
|
type: "application/javascript",
|
|
25
|
-
})
|
|
26
|
-
const blobUrl = URL.createObjectURL(blob)
|
|
27
|
-
const extensionModule = await appStore.loadExtension(blobUrl)
|
|
28
|
-
console.log("[ExtensionManager] Extension loaded:", id)
|
|
25
|
+
});
|
|
26
|
+
const blobUrl = URL.createObjectURL(blob);
|
|
27
|
+
const extensionModule = await appStore.loadExtension(blobUrl);
|
|
28
|
+
console.log("[ExtensionManager] Extension loaded:", id);
|
|
29
29
|
|
|
30
30
|
if (extensionModule.metadata?.store) {
|
|
31
|
-
const storeFactory = extensionModule.metadata.store
|
|
32
|
-
const store = storeFactory()
|
|
31
|
+
const storeFactory = extensionModule.metadata.store;
|
|
32
|
+
const store = storeFactory();
|
|
33
33
|
store.$patch((state) => {
|
|
34
|
-
state.default_local_port = port
|
|
35
|
-
})
|
|
36
|
-
appStore.registerStore(store)
|
|
37
|
-
console.log("[ExtensionManager] Store registered:", store.$id)
|
|
38
|
-
await store.connect()
|
|
39
|
-
console.log("[ExtensionManager] Microservice connected:", store.$id)
|
|
40
|
-
infraStore.register_microservice(store)
|
|
34
|
+
state.default_local_port = port;
|
|
35
|
+
});
|
|
36
|
+
appStore.registerStore(store);
|
|
37
|
+
console.log("[ExtensionManager] Store registered:", store.$id);
|
|
38
|
+
await store.connect();
|
|
39
|
+
console.log("[ExtensionManager] Microservice connected:", store.$id);
|
|
40
|
+
infraStore.register_microservice(store);
|
|
41
41
|
}
|
|
42
42
|
return {
|
|
43
43
|
name,
|
|
44
44
|
version,
|
|
45
45
|
extensionModule,
|
|
46
|
-
}
|
|
46
|
+
};
|
|
47
47
|
}),
|
|
48
|
-
)
|
|
48
|
+
);
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
async function unloadExtension(extensionId) {
|
|
52
|
-
const appStore = useAppStore()
|
|
53
|
-
console.log("[ExtensionManager] Unloading extension:", extensionId)
|
|
52
|
+
const appStore = useAppStore();
|
|
53
|
+
console.log("[ExtensionManager] Unloading extension:", extensionId);
|
|
54
54
|
|
|
55
|
-
const extensionData = appStore.getExtension(extensionId)
|
|
55
|
+
const extensionData = appStore.getExtension(extensionId);
|
|
56
56
|
if (!extensionData) {
|
|
57
|
-
console.warn("[ExtensionManager] Extension not found:", extensionId)
|
|
58
|
-
return false
|
|
57
|
+
console.warn("[ExtensionManager] Extension not found:", extensionId);
|
|
58
|
+
return false;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
// Get the store if it exists
|
|
62
|
-
const storeFactory = extensionData.metadata?.store
|
|
62
|
+
const storeFactory = extensionData.metadata?.store;
|
|
63
63
|
if (storeFactory) {
|
|
64
|
-
const store = storeFactory()
|
|
64
|
+
const store = storeFactory();
|
|
65
65
|
// Stop the microservice if possible
|
|
66
66
|
if (typeof store.kill === "function") {
|
|
67
|
-
await store.kill()
|
|
67
|
+
await store.kill();
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
// Unload from AppStore
|
|
72
|
-
appStore.unloadExtension(extensionId)
|
|
72
|
+
appStore.unloadExtension(extensionId);
|
|
73
73
|
|
|
74
|
-
console.log("[ExtensionManager] Extension unloaded:", extensionId)
|
|
75
|
-
return true
|
|
74
|
+
console.log("[ExtensionManager] Extension unloaded:", extensionId);
|
|
75
|
+
return true;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
async function uploadExtension(file) {
|
|
79
|
-
const appStore = useAppStore()
|
|
80
|
-
await appStore.upload(file)
|
|
79
|
+
const appStore = useAppStore();
|
|
80
|
+
await appStore.upload(file);
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
function runExtensions() {
|
|
84
|
-
const appStore = useAppStore()
|
|
85
|
-
const { projectFolderPath } = appStore
|
|
86
|
-
const { PROJECT: projectName } = useRuntimeConfig().public
|
|
87
|
-
const params = { projectFolderPath, projectName }
|
|
84
|
+
const appStore = useAppStore();
|
|
85
|
+
const { projectFolderPath } = appStore;
|
|
86
|
+
const { PROJECT: projectName } = useRuntimeConfig().public;
|
|
87
|
+
const params = { projectFolderPath, projectName };
|
|
88
88
|
|
|
89
89
|
const schema = {
|
|
90
90
|
$id: "/api/extensions/run",
|
|
@@ -96,9 +96,9 @@ function runExtensions() {
|
|
|
96
96
|
},
|
|
97
97
|
required: ["projectFolderPath", "projectName"],
|
|
98
98
|
additionalProperties: false,
|
|
99
|
-
}
|
|
99
|
+
};
|
|
100
100
|
|
|
101
|
-
return appStore.request(schema, params)
|
|
101
|
+
return appStore.request(schema, params);
|
|
102
102
|
}
|
|
103
103
|
|
|
104
104
|
export {
|
|
@@ -107,4 +107,4 @@ export {
|
|
|
107
107
|
uploadExtension,
|
|
108
108
|
registerRunningExtensions,
|
|
109
109
|
runExtensions,
|
|
110
|
-
}
|
|
110
|
+
};
|
|
@@ -1,73 +1,62 @@
|
|
|
1
1
|
// oxlint-disable promise/prefer-await-to-then
|
|
2
2
|
// Third party imports
|
|
3
|
-
import back_schemas from "@geode/opengeodeweb-back/opengeodeweb_back_schemas.json"
|
|
3
|
+
import back_schemas from "@geode/opengeodeweb-back/opengeodeweb_back_schemas.json";
|
|
4
4
|
|
|
5
5
|
// Local imports
|
|
6
|
-
import { useDataStore } from "@ogw_front/stores/data"
|
|
7
|
-
import { useDataStyleStore } from "@ogw_front/stores/data_style"
|
|
8
|
-
import { useGeodeStore } from "@ogw_front/stores/geode"
|
|
9
|
-
import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer"
|
|
10
|
-
import { useTreeviewStore } from "@ogw_front/stores/treeview"
|
|
6
|
+
import { useDataStore } from "@ogw_front/stores/data";
|
|
7
|
+
import { useDataStyleStore } from "@ogw_front/stores/data_style";
|
|
8
|
+
import { useGeodeStore } from "@ogw_front/stores/geode";
|
|
9
|
+
import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
|
|
10
|
+
import { useTreeviewStore } from "@ogw_front/stores/treeview";
|
|
11
11
|
|
|
12
|
-
const SECOND = 1000
|
|
12
|
+
const SECOND = 1000;
|
|
13
13
|
|
|
14
14
|
async function importWorkflow(files) {
|
|
15
|
-
console.log("importWorkflow", { files })
|
|
16
|
-
const start = Date.now()
|
|
17
|
-
const promise_array = []
|
|
15
|
+
console.log("importWorkflow", { files });
|
|
16
|
+
const start = Date.now();
|
|
17
|
+
const promise_array = [];
|
|
18
18
|
for (const file of files) {
|
|
19
|
-
const { filename, geode_object_type } = file
|
|
20
|
-
console.log({ filename }, { geode_object_type })
|
|
21
|
-
promise_array.push(importFile(filename, geode_object_type))
|
|
19
|
+
const { filename, geode_object_type } = file;
|
|
20
|
+
console.log({ filename }, { geode_object_type });
|
|
21
|
+
promise_array.push(importFile(filename, geode_object_type));
|
|
22
22
|
}
|
|
23
|
-
const results = await Promise.all(promise_array)
|
|
24
|
-
const hybridViewerStore = useHybridViewerStore()
|
|
25
|
-
hybridViewerStore.remoteRender()
|
|
26
|
-
console.log("importWorkflow completed in", (Date.now() - start) / SECOND)
|
|
27
|
-
return results
|
|
23
|
+
const results = await Promise.all(promise_array);
|
|
24
|
+
const hybridViewerStore = useHybridViewerStore();
|
|
25
|
+
hybridViewerStore.remoteRender();
|
|
26
|
+
console.log("importWorkflow completed in", (Date.now() - start) / SECOND);
|
|
27
|
+
return results;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
function buildImportItemFromPayloadApi(value, geode_object_type) {
|
|
31
|
-
console.log("buildImportItemFromPayloadApi", { value, geode_object_type })
|
|
31
|
+
console.log("buildImportItemFromPayloadApi", { value, geode_object_type });
|
|
32
32
|
return {
|
|
33
33
|
...value,
|
|
34
|
-
}
|
|
34
|
+
};
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
async function importItem(item) {
|
|
38
|
-
const dataStore = useDataStore()
|
|
39
|
-
const dataStyleStore = useDataStyleStore()
|
|
40
|
-
const hybridViewerStore = useHybridViewerStore()
|
|
41
|
-
const treeviewStore = useTreeviewStore()
|
|
42
|
-
const registerTask = dataStore.registerObject(item.id)
|
|
43
|
-
const addDataTask = dataStore.addItem(item)
|
|
38
|
+
const dataStore = useDataStore();
|
|
39
|
+
const dataStyleStore = useDataStyleStore();
|
|
40
|
+
const hybridViewerStore = useHybridViewerStore();
|
|
41
|
+
const treeviewStore = useTreeviewStore();
|
|
42
|
+
const registerTask = dataStore.registerObject(item.id);
|
|
43
|
+
const addDataTask = dataStore.addItem(item);
|
|
44
44
|
|
|
45
45
|
const addDataComponentsTask =
|
|
46
|
-
item.viewer_type === "model"
|
|
47
|
-
? dataStore.addComponents(item)
|
|
48
|
-
: Promise.resolve()
|
|
46
|
+
item.viewer_type === "model" ? dataStore.addComponents(item) : Promise.resolve();
|
|
49
47
|
const addDataRelationsTask =
|
|
50
|
-
item.viewer_type === "model"
|
|
51
|
-
? dataStore.addComponentRelations(item)
|
|
52
|
-
: Promise.resolve()
|
|
48
|
+
item.viewer_type === "model" ? dataStore.addComponentRelations(item) : Promise.resolve();
|
|
53
49
|
const addTreeviewTask = treeviewStore.addItem(
|
|
54
50
|
item.geode_object_type,
|
|
55
51
|
item.name,
|
|
56
52
|
item.id,
|
|
57
53
|
item.viewer_type,
|
|
58
|
-
)
|
|
59
|
-
const addStyleTask = dataStyleStore.addDataStyle(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
hybridViewerStore.addItem(item.id),
|
|
65
|
-
)
|
|
66
|
-
const applyStyleTask = Promise.all([
|
|
67
|
-
registerTask,
|
|
68
|
-
addDataComponentsTask,
|
|
69
|
-
addStyleTask,
|
|
70
|
-
]).then(() => dataStyleStore.applyDefaultStyle(item.id))
|
|
54
|
+
);
|
|
55
|
+
const addStyleTask = dataStyleStore.addDataStyle(item.id, item.geode_object_type);
|
|
56
|
+
const addViewerTask = addDataTask.then(() => hybridViewerStore.addItem(item.id));
|
|
57
|
+
const applyStyleTask = Promise.all([registerTask, addDataComponentsTask, addStyleTask]).then(() =>
|
|
58
|
+
dataStyleStore.applyDefaultStyle(item.id),
|
|
59
|
+
);
|
|
71
60
|
await Promise.all([
|
|
72
61
|
registerTask,
|
|
73
62
|
addDataTask,
|
|
@@ -77,32 +66,29 @@ async function importItem(item) {
|
|
|
77
66
|
addDataRelationsTask,
|
|
78
67
|
addViewerTask,
|
|
79
68
|
applyStyleTask,
|
|
80
|
-
])
|
|
81
|
-
return item.id
|
|
69
|
+
]);
|
|
70
|
+
return item.id;
|
|
82
71
|
}
|
|
83
72
|
|
|
84
73
|
async function importFile(filename, geode_object_type) {
|
|
85
|
-
const geodeStore = useGeodeStore()
|
|
86
|
-
const response = await geodeStore.request(
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
filename,
|
|
91
|
-
},
|
|
92
|
-
)
|
|
74
|
+
const geodeStore = useGeodeStore();
|
|
75
|
+
const response = await geodeStore.request(back_schemas.opengeodeweb_back.save_viewable_file, {
|
|
76
|
+
geode_object_type,
|
|
77
|
+
filename,
|
|
78
|
+
});
|
|
93
79
|
|
|
94
|
-
const item = buildImportItemFromPayloadApi(response, geode_object_type)
|
|
95
|
-
return importItem(item)
|
|
80
|
+
const item = buildImportItemFromPayloadApi(response, geode_object_type);
|
|
81
|
+
return importItem(item);
|
|
96
82
|
}
|
|
97
83
|
|
|
98
84
|
async function importWorkflowFromSnapshot(items) {
|
|
99
|
-
console.log("[importWorkflowFromSnapshot] start", { count: items?.length })
|
|
100
|
-
const hybridViewerStore = useHybridViewerStore()
|
|
85
|
+
console.log("[importWorkflowFromSnapshot] start", { count: items?.length });
|
|
86
|
+
const hybridViewerStore = useHybridViewerStore();
|
|
101
87
|
|
|
102
|
-
const ids = await Promise.all(items.map((item) => importItem(item)))
|
|
103
|
-
hybridViewerStore.remoteRender()
|
|
104
|
-
console.log("[importWorkflowFromSnapshot] done", { ids })
|
|
105
|
-
return ids
|
|
88
|
+
const ids = await Promise.all(items.map((item) => importItem(item)));
|
|
89
|
+
hybridViewerStore.remoteRender();
|
|
90
|
+
console.log("[importWorkflowFromSnapshot] done", { ids });
|
|
91
|
+
return ids;
|
|
106
92
|
}
|
|
107
93
|
|
|
108
|
-
export { importFile, importWorkflow, importWorkflowFromSnapshot, importItem }
|
|
94
|
+
export { importFile, importWorkflow, importWorkflowFromSnapshot, importItem };
|
|
@@ -1,151 +1,145 @@
|
|
|
1
1
|
// Node imports
|
|
2
|
-
import fs from "node:fs"
|
|
3
|
-
import path from "node:path"
|
|
4
|
-
import { setTimeout } from "node:timers/promises"
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { setTimeout } from "node:timers/promises";
|
|
5
5
|
|
|
6
6
|
// Third party imports
|
|
7
|
-
import { WebSocket } from "ws"
|
|
8
|
-
import pTimeout from "p-timeout"
|
|
9
|
-
import { rimraf } from "rimraf"
|
|
7
|
+
import { WebSocket } from "ws";
|
|
8
|
+
import pTimeout from "p-timeout";
|
|
9
|
+
import { rimraf } from "rimraf";
|
|
10
10
|
|
|
11
|
-
const MAX_DELETE_FOLDER_RETRIES = 5
|
|
11
|
+
const MAX_DELETE_FOLDER_RETRIES = 5;
|
|
12
12
|
|
|
13
13
|
async function deleteFolderRecursive(folderPath) {
|
|
14
14
|
if (!fs.existsSync(folderPath)) {
|
|
15
|
-
console.log(`Folder ${folderPath} does not exist.`)
|
|
16
|
-
return
|
|
15
|
+
console.log(`Folder ${folderPath} does not exist.`);
|
|
16
|
+
return;
|
|
17
17
|
}
|
|
18
18
|
for (let i = 0; i <= MAX_DELETE_FOLDER_RETRIES; i += 1) {
|
|
19
19
|
try {
|
|
20
|
-
console.log(`Deleting folder: ${folderPath}`)
|
|
20
|
+
console.log(`Deleting folder: ${folderPath}`);
|
|
21
21
|
// oxlint-disable-next-line no-await-in-loop
|
|
22
|
-
await rimraf(folderPath)
|
|
23
|
-
console.log(`Deleted folder: ${folderPath}`)
|
|
24
|
-
return
|
|
22
|
+
await rimraf(folderPath);
|
|
23
|
+
console.log(`Deleted folder: ${folderPath}`);
|
|
24
|
+
return;
|
|
25
25
|
} catch (error) {
|
|
26
|
-
console.error(`Error deleting folder ${folderPath}:`, error)
|
|
26
|
+
console.error(`Error deleting folder ${folderPath}:`, error);
|
|
27
27
|
// Wait before retrying
|
|
28
|
-
const MILLISECONDS_PER_RETRY = 1000
|
|
29
|
-
const DELAY = MILLISECONDS_PER_RETRY * (i + 1)
|
|
28
|
+
const MILLISECONDS_PER_RETRY = 1000;
|
|
29
|
+
const DELAY = MILLISECONDS_PER_RETRY * (i + 1);
|
|
30
30
|
// oxlint-disable-next-line no-await-in-loop
|
|
31
|
-
await setTimeout(DELAY)
|
|
32
|
-
console.log("Retrying delete folder")
|
|
31
|
+
await setTimeout(DELAY);
|
|
32
|
+
console.log("Retrying delete folder");
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
function killHttpMicroservice(microservice) {
|
|
38
|
-
console.log("killHttpMicroservice", { ...microservice })
|
|
39
|
-
const failMessage = `Failed to kill ${microservice.name}
|
|
38
|
+
console.log("killHttpMicroservice", { ...microservice });
|
|
39
|
+
const failMessage = `Failed to kill ${microservice.name}`;
|
|
40
40
|
async function do_kill() {
|
|
41
41
|
try {
|
|
42
42
|
await fetch(microservice.url, {
|
|
43
43
|
method: microservice.method,
|
|
44
|
-
})
|
|
45
|
-
throw new Error(failMessage)
|
|
44
|
+
});
|
|
45
|
+
throw new Error(failMessage);
|
|
46
46
|
} catch (error) {
|
|
47
|
-
console.log(`${microservice.name} closed`, error)
|
|
47
|
+
console.log(`${microservice.name} closed`, error);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
return pTimeout(do_kill(), {
|
|
51
51
|
milliseconds: 5000,
|
|
52
52
|
message: failMessage,
|
|
53
|
-
})
|
|
53
|
+
});
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
function killWebsocketMicroservice(microservice) {
|
|
57
|
-
console.log("killWebsocketMicroservice", { ...microservice })
|
|
58
|
-
const failMessage = `Failed to kill ${microservice.name}
|
|
59
|
-
const successMessage = `Disconnected from ${microservice.name} WebSocket server
|
|
57
|
+
console.log("killWebsocketMicroservice", { ...microservice });
|
|
58
|
+
const failMessage = `Failed to kill ${microservice.name}`;
|
|
59
|
+
const successMessage = `Disconnected from ${microservice.name} WebSocket server`;
|
|
60
60
|
function do_kill() {
|
|
61
61
|
// oxlint-disable-next-line promise/avoid-new
|
|
62
62
|
return new Promise((resolve) => {
|
|
63
|
-
const socket = new WebSocket(microservice.url)
|
|
63
|
+
const socket = new WebSocket(microservice.url);
|
|
64
64
|
socket.on("open", () => {
|
|
65
|
-
console.log("Connected to WebSocket server")
|
|
65
|
+
console.log("Connected to WebSocket server");
|
|
66
66
|
socket.send(
|
|
67
67
|
JSON.stringify({
|
|
68
68
|
id: "system:hello",
|
|
69
69
|
method: "wslink.hello",
|
|
70
70
|
args: [{ secret: "wslink-secret" }],
|
|
71
71
|
}),
|
|
72
|
-
)
|
|
73
|
-
})
|
|
72
|
+
);
|
|
73
|
+
});
|
|
74
74
|
socket.on("message", (data) => {
|
|
75
|
-
const message = data.toString()
|
|
76
|
-
console.log("Received from server:", message)
|
|
75
|
+
const message = data.toString();
|
|
76
|
+
console.log("Received from server:", message);
|
|
77
77
|
if (message.includes("hello")) {
|
|
78
78
|
socket.send(
|
|
79
79
|
JSON.stringify({
|
|
80
80
|
id: "application.exit",
|
|
81
81
|
method: "application.exit",
|
|
82
82
|
}),
|
|
83
|
-
)
|
|
84
|
-
console.log(successMessage)
|
|
85
|
-
socket.close()
|
|
86
|
-
resolve()
|
|
83
|
+
);
|
|
84
|
+
console.log(successMessage);
|
|
85
|
+
socket.close();
|
|
86
|
+
resolve();
|
|
87
87
|
}
|
|
88
|
-
})
|
|
88
|
+
});
|
|
89
89
|
socket.on("close", () => {
|
|
90
|
-
console.log(successMessage)
|
|
91
|
-
resolve()
|
|
92
|
-
})
|
|
90
|
+
console.log(successMessage);
|
|
91
|
+
resolve();
|
|
92
|
+
});
|
|
93
93
|
socket.on("error", (error) => {
|
|
94
|
-
console.error("WebSocket error:", error)
|
|
95
|
-
socket.close()
|
|
96
|
-
resolve()
|
|
97
|
-
})
|
|
98
|
-
})
|
|
94
|
+
console.error("WebSocket error:", error);
|
|
95
|
+
socket.close();
|
|
96
|
+
resolve();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
99
|
}
|
|
100
100
|
return pTimeout(do_kill(), {
|
|
101
101
|
milliseconds: 5000,
|
|
102
102
|
message: failMessage,
|
|
103
|
-
})
|
|
103
|
+
});
|
|
104
104
|
}
|
|
105
105
|
|
|
106
106
|
function killMicroservice(microservice) {
|
|
107
107
|
if (microservice.type === "back") {
|
|
108
|
-
return killHttpMicroservice(microservice)
|
|
109
|
-
} else if (microservice.type === "viewer") {
|
|
110
|
-
return killWebsocketMicroservice(microservice)
|
|
111
|
-
} else {
|
|
112
|
-
throw new Error(`Unknown microservice type: ${microservice.type}`)
|
|
108
|
+
return killHttpMicroservice(microservice);
|
|
113
109
|
}
|
|
110
|
+
if (microservice.type === "viewer") {
|
|
111
|
+
return killWebsocketMicroservice(microservice);
|
|
112
|
+
}
|
|
113
|
+
throw new Error(`Unknown microservice type: ${microservice.type}`);
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
function killMicroservices(microservices) {
|
|
117
|
-
console.log("killMicroservices", { microservices })
|
|
117
|
+
console.log("killMicroservices", { microservices });
|
|
118
118
|
return Promise.all(
|
|
119
|
-
microservices.map(
|
|
120
|
-
|
|
121
|
-
),
|
|
122
|
-
)
|
|
119
|
+
microservices.map(async (microservice) => await killMicroservice(microservice)),
|
|
120
|
+
);
|
|
123
121
|
}
|
|
124
122
|
|
|
125
123
|
function projectMicroservices(projectFolderPath) {
|
|
126
|
-
console.log("projectMicroservices", { projectFolderPath })
|
|
127
|
-
const filePath = microservicesMetadatasPath(projectFolderPath)
|
|
124
|
+
console.log("projectMicroservices", { projectFolderPath });
|
|
125
|
+
const filePath = microservicesMetadatasPath(projectFolderPath);
|
|
128
126
|
|
|
129
127
|
if (!fs.existsSync(filePath)) {
|
|
130
|
-
const microservicesMetadatas = { microservices: [] }
|
|
131
|
-
fs.writeFileSync(
|
|
132
|
-
filePath,
|
|
133
|
-
JSON.stringify(microservicesMetadatas, undefined, 2),
|
|
134
|
-
"utf8",
|
|
135
|
-
)
|
|
128
|
+
const microservicesMetadatas = { microservices: [] };
|
|
129
|
+
fs.writeFileSync(filePath, JSON.stringify(microservicesMetadatas, undefined, 2), "utf8");
|
|
136
130
|
}
|
|
137
|
-
const content = JSON.parse(fs.readFileSync(filePath, "utf8"))
|
|
138
|
-
return content.microservices
|
|
131
|
+
const content = JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
132
|
+
return content.microservices;
|
|
139
133
|
}
|
|
140
134
|
|
|
141
135
|
async function cleanupBackend(projectFolderPath) {
|
|
142
|
-
const microservices = projectMicroservices(projectFolderPath)
|
|
143
|
-
await killMicroservices(microservices)
|
|
144
|
-
await deleteFolderRecursive(projectFolderPath)
|
|
136
|
+
const microservices = projectMicroservices(projectFolderPath);
|
|
137
|
+
await killMicroservices(microservices);
|
|
138
|
+
await deleteFolderRecursive(projectFolderPath);
|
|
145
139
|
}
|
|
146
140
|
|
|
147
141
|
function microservicesMetadatasPath(projectFolderPath) {
|
|
148
|
-
return path.join(projectFolderPath, "microservices.json")
|
|
142
|
+
return path.join(projectFolderPath, "microservices.json");
|
|
149
143
|
}
|
|
150
144
|
|
|
151
|
-
export { cleanupBackend, microservicesMetadatasPath }
|
|
145
|
+
export { cleanupBackend, microservicesMetadatasPath };
|