@geode/opengeodeweb-front 10.34.0-rc.2 → 10.34.0-rc.21
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/.build/opengeodeweb_front_schemas.js +175 -0
- package/.build/server/utils/app_config.js +57 -0
- package/.build/server/utils/cleanup.js +135 -0
- package/.build/server/utils/cloud.js +156 -0
- package/.build/server/utils/microservices.js +153 -0
- package/.build/server/utils/path.js +108 -0
- package/.build/server/utils/scripts.js +134 -0
- package/.build/server/utils/server.js +44 -0
- package/.build/server/utils/server_config.js +51 -0
- package/.build/server/utils/stream.js +6 -0
- package/.build/server/utils/ws_client.js +100 -0
- package/.build/shared/app_mode.js +8 -0
- package/.build/shared/scripts.js +49 -0
- package/.build/shared/utils/call_raw.js +31 -0
- package/.build/shared/utils/call_schema.js +28 -0
- package/.build/shared/utils/fetch_raw.js +52 -0
- package/.build/shared/utils/fetch_schema.js +32 -0
- package/.build/shared/utils/file.js +14 -0
- package/.build/shared/utils/parse_boolean.js +23 -0
- package/.build/shared/utils/response_handlers/load.js +50 -0
- package/.build/shared/utils/types.js +1 -0
- package/.build/shared/utils/validate_schema.js +17 -0
- package/README.md +8 -0
- package/app/assets/{geode_objects.js → geode_objects.ts} +8 -1
- package/app/components/ActionButton.vue +28 -12
- package/app/components/Basic/Slider.vue +2 -2
- package/app/components/Basic/Switch.vue +2 -2
- package/app/components/CameraManager/List.vue +11 -11
- package/app/components/CameraManager/Saver.vue +8 -4
- package/app/components/CameraManager.vue +24 -12
- package/app/components/CameraOrientation.vue +31 -17
- package/app/components/ClippingPlaneCard.vue +13 -12
- package/app/components/ClippingPlanes.vue +31 -21
- package/app/components/CrsSelector.vue +26 -18
- package/app/components/DeleteDialog.vue +18 -16
- package/app/components/DragAndDrop.vue +55 -37
- package/app/components/DragAndDropInternal/DragAndDropInline.vue +31 -16
- package/app/components/DragAndDropInternal/DragAndDropOverlay.vue +32 -19
- package/app/components/ExtensionSelector.vue +34 -18
- package/app/components/FeedBack/ErrorBanner.vue +4 -3
- package/app/components/FeedBack/Snackers.vue +6 -5
- package/app/components/FetchingData.vue +8 -12
- package/app/components/FileSelector.vue +27 -17
- package/app/components/FileUploader.vue +51 -30
- package/app/components/GlassCard.vue +17 -13
- package/app/components/HybridRenderingView.vue +25 -12
- package/app/components/HybridViewerTooltip.vue +28 -26
- package/app/components/InfraConnected.vue +1 -1
- package/app/components/Launcher.vue +12 -10
- package/app/components/Loading/EcoMessages.vue +24 -13
- package/app/components/Loading/Header.vue +6 -7
- package/app/components/Loading/Progress.vue +6 -7
- package/app/components/Loading.vue +10 -14
- package/app/components/MissingFilesSelector.vue +35 -19
- package/app/components/ObjectSelector.vue +37 -21
- package/app/components/PackagesVersions.vue +16 -8
- package/app/components/Recaptcha.vue +17 -23
- package/app/components/RemoteRenderingView.vue +21 -15
- package/app/components/Ruler.vue +11 -9
- package/app/components/Screenshot.vue +25 -19
- package/app/components/SearchBar.vue +12 -6
- package/app/components/ShrinkFilter.vue +19 -14
- package/app/components/Step.vue +32 -12
- package/app/components/Stepper.vue +19 -7
- package/app/components/ToolPanel.vue +29 -13
- package/app/components/ViewToolbar.vue +53 -44
- package/app/components/Viewer/ContextMenu/CenterButton.vue +16 -9
- package/app/components/Viewer/ContextMenu/CircularItems.vue +13 -10
- package/app/components/Viewer/ContextMenu/ContextMenu.vue +40 -32
- package/app/components/Viewer/ContextMenu/ContextMenuItem.vue +31 -17
- package/app/components/Viewer/ContextMenu/InfoCard.vue +38 -22
- package/app/components/Viewer/EdgedCurve/PointsOptions.vue +8 -5
- package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +67 -48
- package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +74 -50
- package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +69 -50
- package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +47 -35
- package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +91 -51
- package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +74 -49
- package/app/components/Viewer/Generic/Model/BlocksOptions.vue +115 -53
- package/app/components/Viewer/Generic/Model/CornersOptions.vue +75 -37
- package/app/components/Viewer/Generic/Model/EdgesOptions.vue +13 -9
- package/app/components/Viewer/Generic/Model/LinesOptions.vue +110 -61
- package/app/components/Viewer/Generic/Model/ModelStyleCard.vue +32 -21
- package/app/components/Viewer/Generic/Model/ModelStyleOptions.vue +9 -5
- package/app/components/Viewer/Generic/Model/PointsOptions.vue +19 -13
- package/app/components/Viewer/Generic/Model/SurfacesOptions.vue +119 -49
- package/app/components/Viewer/Grid/2D/CellsOptions.vue +8 -5
- package/app/components/Viewer/Grid/2D/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Grid/2D/PointsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/CellsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/FacetsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/PointsOptions.vue +8 -5
- package/app/components/Viewer/ObjectTree/Base/CommonTreeView.vue +120 -76
- package/app/components/Viewer/ObjectTree/Base/Controls.vue +25 -10
- package/app/components/Viewer/ObjectTree/Base/ItemLabel.vue +42 -17
- package/app/components/Viewer/ObjectTree/Base/StickyHeader.vue +22 -9
- package/app/components/Viewer/ObjectTree/Base/TreeRow.vue +29 -14
- package/app/components/Viewer/ObjectTree/Box.vue +32 -15
- package/app/components/Viewer/ObjectTree/Layout.vue +55 -35
- package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +63 -34
- package/app/components/Viewer/ObjectTree/Views/{ModelCollections.vue → ModelTree.vue} +101 -39
- package/app/components/Viewer/Options/AttributeColorBar.vue +14 -6
- package/app/components/Viewer/Options/AttributeRangeSelector.vue +8 -4
- package/app/components/Viewer/Options/AttributeSelector.vue +64 -33
- package/app/components/Viewer/Options/ColorMapList.vue +52 -24
- package/app/components/Viewer/Options/ColorMapPicker.vue +15 -11
- package/app/components/Viewer/Options/ColorPicker.vue +239 -50
- package/app/components/Viewer/Options/ColoringTypeSelector.vue +87 -67
- package/app/components/Viewer/Options/ColormapQuickPicker.vue +16 -12
- package/app/components/Viewer/Options/OptionsSection.vue +7 -5
- package/app/components/Viewer/Options/Sliders/Size.vue +3 -3
- package/app/components/Viewer/Options/Sliders/Slider.vue +9 -6
- package/app/components/Viewer/Options/Sliders/Width.vue +3 -3
- package/app/components/Viewer/Options/TextureItem.vue +29 -22
- package/app/components/Viewer/Options/TexturesSelector.vue +23 -12
- package/app/components/Viewer/Options/VisibilitySwitch.vue +3 -3
- package/app/components/Viewer/OverlappingObjectsPicker.vue +27 -12
- package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +38 -26
- package/app/components/Viewer/Solid/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Solid/PointsOptions.vue +8 -5
- package/app/components/Viewer/Solid/PolygonsOptions.vue +8 -5
- package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +73 -48
- package/app/components/Viewer/Surface/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Surface/PointsOptions.vue +8 -5
- package/app/components/Viewer/Surface/PolygonsOptions.vue +79 -49
- package/app/components/Viewer/Surface/Triangulated/TrianglesOptions.vue +8 -5
- package/app/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue +8 -5
- package/app/components/Viewer/TetrahedralSolid/TrianglesOptions.vue +8 -5
- package/app/components/Viewer/Ui.vue +19 -14
- package/app/components/Wrapper.vue +16 -10
- package/app/components/ZScaling.vue +18 -10
- package/app/components/csv-preview/CsvPreviewer.vue +72 -50
- package/app/components/csv-preview/CsvSettings.vue +30 -50
- package/app/components/csv-preview/CsvTable.vue +34 -14
- package/app/composables/{batch_style.js → batch_style.ts} +9 -7
- package/app/composables/clipping_planes_widget.ts +204 -0
- package/app/composables/clipping_planes_widget_entries.ts +189 -0
- package/app/composables/copy_to_clipboard.ts +7 -0
- package/app/composables/global_attribute_style.ts +303 -0
- package/app/composables/hover_highlight.ts +127 -0
- package/app/composables/{model_collections.js → model_collections.ts} +28 -9
- package/app/composables/{model_components.js → model_components.ts} +28 -9
- package/app/composables/{project_manager.js → project_manager.ts} +77 -20
- package/app/composables/responsive_middle_truncate.ts +48 -0
- package/app/composables/{run_function_when_microservices_connected.js → run_function_when_microservices_connected.ts} +1 -1
- package/app/composables/stepper_tree.ts +79 -0
- package/app/composables/tree_filter.ts +194 -0
- package/app/composables/{tree_keyboard_nav.js → tree_keyboard_nav.ts} +62 -20
- package/app/composables/{tree_scroll.js → tree_scroll.ts} +61 -12
- package/app/composables/use_adaptive_styles.ts +186 -0
- package/app/composables/use_overlapping_picker.ts +263 -0
- package/app/composables/use_quick_colormap.ts +55 -0
- package/app/composables/virtual_tree.ts +271 -0
- package/app/composables/vtk_implicit_plane_widget.d.ts +2 -0
- package/app/plugins/{auto_store_register.js → auto_store_register.ts} +3 -5
- package/app/plugins/click_outside_ignore_snackbars.client.ts +36 -0
- package/app/stores/app.ts +252 -0
- package/app/stores/app_helpers/extension.ts +179 -0
- package/app/stores/{back.js → back.ts} +54 -28
- package/app/stores/camera_manager.ts +80 -0
- package/app/stores/{cloud.js → cloud.ts} +18 -13
- package/app/stores/data.ts +392 -0
- package/app/stores/data_helpers/collections.ts +138 -0
- package/app/stores/data_helpers/mesh.ts +169 -0
- package/app/stores/data_style.ts +167 -0
- package/app/stores/{feedback.js → feedback.ts} +19 -8
- package/app/stores/{hybrid_viewer.js → hybrid_viewer.ts} +49 -45
- package/app/stores/infra.ts +106 -0
- package/app/stores/{menu.js → menu.ts} +67 -36
- package/app/stores/treeview.ts +383 -0
- package/app/stores/{viewer.js → viewer.ts} +75 -42
- package/app/utils/attributes.ts +40 -0
- package/app/utils/clipping_planes.ts +222 -0
- package/app/utils/color_picker.js +54 -0
- package/app/utils/colormap.ts +102 -0
- package/app/utils/default_styles/{constants.js → constants.ts} +25 -12
- package/app/utils/default_styles/{index.js → index.ts} +4 -3
- package/app/utils/default_styles/meshes.ts +264 -0
- package/app/utils/default_styles/{models.js → models.ts} +106 -52
- package/app/utils/{extension.js → extension.ts} +63 -19
- package/app/utils/{import_workflow.js → import_workflow.ts} +39 -22
- package/app/utils/{log.js → log.ts} +12 -2
- package/app/utils/{name_cleaner.js → name_cleaner.ts} +6 -6
- package/app/utils/status.ts +19 -0
- package/app/utils/{stores.js → stores.ts} +5 -5
- package/app/utils/{string.js → string.ts} +6 -6
- package/app/utils/{treeview.js → treeview.ts} +4 -1
- package/internal/database/{base_database.js → base_database.ts} +7 -3
- package/internal/database/database.ts +102 -0
- package/internal/database/{extended_database.js → extended_database.ts} +5 -1
- package/internal/database/tables/camera_positions.ts +6 -0
- package/internal/database/tables/{data.js → data.ts} +3 -1
- package/internal/database/tables/data_style.ts +6 -0
- package/internal/database/tables/model_component_datastyle.ts +6 -0
- package/internal/database/tables/model_component_type_datastyle.ts +6 -0
- package/internal/database/tables/model_components.ts +6 -0
- package/internal/database/tables/model_components_relation.ts +6 -0
- package/internal/database/tables/table_definition.ts +5 -0
- package/internal/stores/data_style/mesh/cells/cell.ts +279 -0
- package/internal/stores/data_style/mesh/cells/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/cells/common.ts +50 -0
- package/internal/stores/data_style/mesh/cells/index.ts +161 -0
- package/internal/stores/data_style/mesh/cells/{textures.js → textures.ts} +14 -8
- package/internal/stores/data_style/mesh/cells/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/cells/visibility.ts +46 -0
- package/internal/stores/data_style/mesh/edges/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/edges/common.ts +41 -0
- package/internal/stores/data_style/mesh/edges/edge.ts +279 -0
- package/internal/stores/data_style/mesh/edges/index.ts +155 -0
- package/internal/stores/data_style/mesh/edges/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/edges/visibility.ts +45 -0
- package/internal/stores/data_style/mesh/edges/width.ts +42 -0
- package/internal/stores/data_style/mesh/{index.js → index.ts} +34 -14
- package/internal/stores/data_style/mesh/points/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/points/common.ts +51 -0
- package/internal/stores/data_style/mesh/points/index.ts +133 -0
- package/internal/stores/data_style/mesh/points/size.ts +43 -0
- package/internal/stores/data_style/mesh/points/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/points/visibility.ts +49 -0
- package/internal/stores/data_style/mesh/polygons/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/polygons/common.ts +50 -0
- package/internal/stores/data_style/mesh/polygons/index.ts +167 -0
- package/internal/stores/data_style/mesh/polygons/polygon.ts +282 -0
- package/internal/stores/data_style/mesh/polygons/{textures.js → textures.ts} +14 -8
- package/internal/stores/data_style/mesh/polygons/vertex.ts +288 -0
- package/internal/stores/data_style/mesh/polygons/visibility.ts +48 -0
- package/internal/stores/data_style/mesh/polyhedra/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/polyhedra/common.ts +41 -0
- package/internal/stores/data_style/mesh/polyhedra/index.ts +157 -0
- package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +294 -0
- package/internal/stores/data_style/mesh/polyhedra/vertex.ts +288 -0
- package/internal/stores/data_style/mesh/polyhedra/visibility.ts +48 -0
- package/internal/stores/data_style/model/blocks/{color.js → color.ts} +50 -13
- package/internal/stores/data_style/model/blocks/common.ts +67 -0
- package/internal/stores/data_style/model/blocks/{index.js → index.ts} +111 -66
- package/internal/stores/data_style/model/blocks/polyhedron.ts +363 -0
- package/internal/stores/data_style/model/blocks/vertex.ts +349 -0
- package/internal/stores/data_style/model/blocks/visibility.ts +37 -0
- package/internal/stores/data_style/model/color.ts +348 -0
- package/internal/stores/data_style/model/common.ts +262 -0
- package/internal/stores/data_style/model/corners/{color.js → color.ts} +49 -10
- package/internal/stores/data_style/model/corners/common.ts +71 -0
- package/internal/stores/data_style/model/corners/{index.js → index.ts} +86 -47
- package/internal/stores/data_style/model/corners/vertex.ts +315 -0
- package/internal/stores/data_style/model/corners/visibility.ts +39 -0
- package/internal/stores/data_style/model/edges/common.ts +29 -0
- package/internal/stores/data_style/model/edges/{index.js → index.ts} +2 -7
- package/internal/stores/data_style/model/edges/visibility.ts +55 -0
- package/internal/stores/data_style/model/{index.js → index.ts} +24 -11
- package/internal/stores/data_style/model/lines/{color.js → color.ts} +47 -10
- package/internal/stores/data_style/model/lines/common.ts +63 -0
- package/internal/stores/data_style/model/lines/edge.ts +343 -0
- package/internal/stores/data_style/model/lines/{index.js → index.ts} +108 -66
- package/internal/stores/data_style/model/lines/vertex.ts +344 -0
- package/internal/stores/data_style/model/lines/visibility.ts +37 -0
- package/internal/stores/data_style/model/points/common.ts +25 -0
- package/internal/stores/data_style/model/points/index.ts +35 -0
- package/internal/stores/data_style/model/points/size.ts +44 -0
- package/internal/stores/data_style/model/points/visibility.ts +46 -0
- package/internal/stores/data_style/model/selection.ts +138 -0
- package/internal/stores/data_style/model/surfaces/{color.js → color.ts} +47 -10
- package/internal/stores/data_style/model/surfaces/common.ts +69 -0
- package/internal/stores/data_style/model/surfaces/{index.js → index.ts} +113 -66
- package/internal/stores/data_style/model/surfaces/polygon.ts +347 -0
- package/internal/stores/data_style/model/surfaces/vertex.ts +351 -0
- package/internal/stores/data_style/model/surfaces/visibility.ts +37 -0
- package/internal/stores/data_style/model/{visibility.js → visibility.ts} +112 -32
- package/internal/stores/data_style/state.ts +281 -0
- package/internal/stores/data_style/types.ts +30 -0
- package/internal/stores/hybrid_viewer/brightness.ts +124 -0
- package/internal/stores/hybrid_viewer/camera.ts +326 -0
- package/internal/stores/hybrid_viewer/{camera_animation.js → camera_animation.ts} +30 -12
- package/internal/stores/hybrid_viewer/{constants.js → constants.ts} +2 -2
- package/internal/stores/hybrid_viewer/core.ts +64 -0
- package/internal/stores/hybrid_viewer/{filters.js → filters.ts} +10 -13
- package/internal/stores/hybrid_viewer/highlight.ts +183 -0
- package/internal/stores/hybrid_viewer/{ruler.js → ruler.ts} +50 -22
- package/internal/stores/hybrid_viewer/scene.ts +125 -0
- package/internal/stores/hybrid_viewer/viewport.ts +177 -0
- package/internal/stores/hybrid_viewer/vtk_types.ts +58 -0
- package/internal/utils/api_fetch.ts +133 -0
- package/internal/utils/upload_file.ts +115 -0
- package/internal/utils/viewer_call.ts +99 -0
- package/internal/utils/ws_client.ts +54 -0
- package/nuxt.config.ts +168 -0
- package/opengeodeweb_front_schemas.json +2 -2
- package/package.json +49 -13
- package/server/api/cloud/extensions/{run.post.js → run.post.ts} +16 -12
- package/server/api/local/app/project_folder_path.post.ts +33 -0
- package/server/api/local/app/run_back.post.ts +39 -0
- package/server/api/local/app/run_viewer.post.ts +39 -0
- package/server/api/local/extensions/{kill.post.js → kill.post.ts} +15 -8
- package/server/api/local/extensions/{run.post.js → run.post.ts} +17 -12
- package/server/api/local/extensions/upload.put.ts +71 -0
- package/server/api/microservice/app/{get_is_app_ready.get.js → get_is_app_ready.get.ts} +5 -5
- package/server/api/microservice/app/schemas/get_is_app_ready.json +1 -1
- package/server/api/microservice/app/set_app_base_url.post.ts +29 -0
- package/server/api/microservice/app/set_back_base_url.post.ts +26 -0
- package/server/api/microservice/app/set_is_app_ready.post.ts +29 -0
- package/server/api/microservice/app/set_viewer_base_url.post.ts +26 -0
- package/server/api/microservice/extensions/{download.post.js → download.post.ts} +13 -6
- package/server/api/serverless/run_cloud.post.ts +92 -0
- package/server/utils/{app_config.js → app_config.ts} +40 -18
- package/server/utils/{cleanup.js → cleanup.ts} +76 -29
- package/server/utils/{cloud.js → cloud.ts} +33 -17
- package/server/utils/{extension.js → extension.ts} +31 -4
- package/server/utils/{microservices.js → microservices.ts} +68 -27
- package/server/utils/{path.js → path.ts} +36 -17
- package/server/utils/{scripts.js → scripts.ts} +49 -33
- package/server/utils/{server.js → server.ts} +13 -6
- package/server/utils/server_config.ts +74 -0
- package/server/utils/stream.ts +6 -0
- package/server/utils/ws_client.ts +165 -0
- package/shared/{scripts.js → scripts.ts} +15 -10
- package/shared/utils/call_raw.ts +73 -0
- package/shared/utils/{call_schema.js → call_schema.ts} +15 -6
- package/shared/utils/fetch_raw.ts +125 -0
- package/shared/utils/{fetch_schema.js → fetch_schema.ts} +16 -7
- package/shared/utils/file.ts +22 -0
- package/shared/utils/{parse_boolean.js → parse_boolean.ts} +1 -1
- package/shared/utils/response_handlers/load.ts +109 -0
- package/shared/utils/types.ts +27 -0
- package/shared/utils/{validate_schema.js → validate_schema.ts} +3 -1
- package/.github/workflows/config.json +0 -5
- package/.github/workflows/deploy.yml +0 -15
- package/.github/workflows/manual_release.yml +0 -11
- package/.github/workflows/merge_request.yml +0 -9
- package/.github/workflows/pr_update.yml +0 -11
- package/.github/workflows/prepare_deploy.yml +0 -9
- package/.github/workflows/schedule.yml +0 -18
- package/.github/workflows/test.yml +0 -14
- package/.github/workflows/test_pr.yml +0 -12
- package/.oxlintrc.json +0 -150
- package/.releaserc +0 -11
- package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +0 -224
- package/app/composables/clipping_planes_widget.js +0 -249
- package/app/composables/global_attribute_style.js +0 -181
- package/app/composables/hover_highlight.js +0 -91
- package/app/composables/responsive_middle_truncate.js +0 -34
- package/app/composables/stepper_tree.js +0 -56
- package/app/composables/tree_filter.js +0 -138
- package/app/composables/use_adaptive_styles.js +0 -120
- package/app/composables/use_overlapping_picker.js +0 -169
- package/app/composables/use_quick_colormap.js +0 -32
- package/app/composables/virtual_tree.js +0 -191
- package/app/stores/app.js +0 -326
- package/app/stores/camera_manager.js +0 -57
- package/app/stores/data.js +0 -278
- package/app/stores/data_helpers/collections.js +0 -96
- package/app/stores/data_helpers/mesh.js +0 -122
- package/app/stores/data_style.js +0 -116
- package/app/stores/infra.js +0 -95
- package/app/stores/treeview.js +0 -290
- package/app/utils/attributes.js +0 -23
- package/app/utils/clipping_planes.js +0 -110
- package/app/utils/colormap.js +0 -64
- package/app/utils/default_styles/meshes.js +0 -191
- package/app/utils/status.js +0 -10
- package/commitlint.config.js +0 -20
- package/internal/database/database.js +0 -80
- package/internal/database/tables/camera_positions.js +0 -4
- package/internal/database/tables/data_style.js +0 -4
- package/internal/database/tables/model_component_datastyle.js +0 -4
- package/internal/database/tables/model_component_type_datastyle.js +0 -4
- package/internal/database/tables/model_components.js +0 -4
- package/internal/database/tables/model_components_relation.js +0 -4
- package/internal/stores/data_style/mesh/cells/cell.js +0 -196
- package/internal/stores/data_style/mesh/cells/common.js +0 -39
- package/internal/stores/data_style/mesh/cells/index.js +0 -81
- package/internal/stores/data_style/mesh/cells/vertex.js +0 -193
- package/internal/stores/data_style/mesh/cells/visibility.js +0 -35
- package/internal/stores/data_style/mesh/edges/common.js +0 -32
- package/internal/stores/data_style/mesh/edges/edge.js +0 -195
- package/internal/stores/data_style/mesh/edges/index.js +0 -81
- package/internal/stores/data_style/mesh/edges/vertex.js +0 -196
- package/internal/stores/data_style/mesh/edges/visibility.js +0 -34
- package/internal/stores/data_style/mesh/edges/width.js +0 -34
- package/internal/stores/data_style/mesh/points/common.js +0 -37
- package/internal/stores/data_style/mesh/points/index.js +0 -82
- package/internal/stores/data_style/mesh/points/size.js +0 -35
- package/internal/stores/data_style/mesh/points/vertex.js +0 -193
- package/internal/stores/data_style/mesh/points/visibility.js +0 -37
- package/internal/stores/data_style/mesh/polygons/common.js +0 -32
- package/internal/stores/data_style/mesh/polygons/index.js +0 -107
- package/internal/stores/data_style/mesh/polygons/polygon.js +0 -196
- package/internal/stores/data_style/mesh/polygons/vertex.js +0 -196
- package/internal/stores/data_style/mesh/polygons/visibility.js +0 -38
- package/internal/stores/data_style/mesh/polyhedra/common.js +0 -32
- package/internal/stores/data_style/mesh/polyhedra/index.js +0 -98
- package/internal/stores/data_style/mesh/polyhedra/polyhedron.js +0 -196
- package/internal/stores/data_style/mesh/polyhedra/vertex.js +0 -196
- package/internal/stores/data_style/mesh/polyhedra/visibility.js +0 -38
- package/internal/stores/data_style/model/blocks/common.js +0 -51
- package/internal/stores/data_style/model/blocks/polyhedron.js +0 -215
- package/internal/stores/data_style/model/blocks/vertex.js +0 -204
- package/internal/stores/data_style/model/blocks/visibility.js +0 -20
- package/internal/stores/data_style/model/color.js +0 -218
- package/internal/stores/data_style/model/common.js +0 -141
- package/internal/stores/data_style/model/corners/common.js +0 -51
- package/internal/stores/data_style/model/corners/vertex.js +0 -204
- package/internal/stores/data_style/model/corners/visibility.js +0 -20
- package/internal/stores/data_style/model/edges/common.js +0 -20
- package/internal/stores/data_style/model/edges/visibility.js +0 -38
- package/internal/stores/data_style/model/lines/common.js +0 -51
- package/internal/stores/data_style/model/lines/edge.js +0 -203
- package/internal/stores/data_style/model/lines/vertex.js +0 -204
- package/internal/stores/data_style/model/lines/visibility.js +0 -20
- package/internal/stores/data_style/model/points/common.js +0 -20
- package/internal/stores/data_style/model/points/index.js +0 -25
- package/internal/stores/data_style/model/points/size.js +0 -36
- package/internal/stores/data_style/model/points/visibility.js +0 -36
- package/internal/stores/data_style/model/selection.js +0 -89
- package/internal/stores/data_style/model/surfaces/common.js +0 -51
- package/internal/stores/data_style/model/surfaces/polygon.js +0 -215
- package/internal/stores/data_style/model/surfaces/vertex.js +0 -215
- package/internal/stores/data_style/model/surfaces/visibility.js +0 -20
- package/internal/stores/data_style/state.js +0 -197
- package/internal/stores/hybrid_viewer/brightness.js +0 -82
- package/internal/stores/hybrid_viewer/camera.js +0 -274
- package/internal/stores/hybrid_viewer/highlight.js +0 -170
- package/internal/stores/hybrid_viewer/scene.js +0 -136
- package/internal/stores/hybrid_viewer/viewport.js +0 -140
- package/internal/utils/api_fetch.js +0 -52
- package/internal/utils/upload_file.js +0 -57
- package/internal/utils/viewer_call.js +0 -49
- package/internal/utils/ws_client.js +0 -29
- package/nuxt.config.js +0 -106
- package/scripts/generate_geode_objects.js +0 -24
- package/server/api/local/app/project_folder_path.post.js +0 -29
- package/server/api/local/app/run_back.post.js +0 -33
- package/server/api/local/app/run_viewer.post.js +0 -33
- package/server/api/local/extensions/upload.put.js +0 -72
- package/server/api/microservice/app/set_app_base_url.post.js +0 -25
- package/server/api/microservice/app/set_back_base_url.post.js +0 -22
- package/server/api/microservice/app/set_is_app_ready.post.js +0 -25
- package/server/api/microservice/app/set_viewer_base_url.post.js +0 -22
- package/server/api/serverless/run_cloud.post.js +0 -44
- package/server/utils/server_config.js +0 -58
- package/server/utils/ws_client.js +0 -112
- package/shared/utils/call_raw.js +0 -46
- package/shared/utils/fetch_raw.js +0 -61
- package/shared/utils/file.js +0 -16
- package/shared/utils/response_handlers/load.js +0 -74
- package/tests/integration/data/uploads/test.og_brep +0 -0
- package/tests/integration/data/uploads/test.og_edc2d +0 -0
- package/tests/integration/data/uploads/test.og_edc3d +0 -0
- package/tests/integration/data/uploads/test.og_psf3d +0 -0
- package/tests/integration/data/uploads/test.og_rgd2d +0 -0
- package/tests/integration/data/uploads/test.og_rgd3d +0 -0
- package/tests/integration/data/uploads/test.vtu +0 -22
- package/tests/integration/setup.js +0 -92
- package/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +0 -343
- package/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +0 -254
- package/tests/integration/stores/data_style/mesh/index.nuxt.test.js +0 -62
- package/tests/integration/stores/data_style/mesh/points.nuxt.test.js +0 -201
- package/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +0 -260
- package/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +0 -267
- package/tests/integration/stores/data_style/model/blocks.nuxt.test.js +0 -397
- package/tests/integration/stores/data_style/model/corners.nuxt.test.js +0 -264
- package/tests/integration/stores/data_style/model/edges.nuxt.test.js +0 -71
- package/tests/integration/stores/data_style/model/index.nuxt.test.js +0 -92
- package/tests/integration/stores/data_style/model/lines.nuxt.test.js +0 -379
- package/tests/integration/stores/data_style/model/points.nuxt.test.js +0 -95
- package/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +0 -574
- package/tests/integration/stores/viewer.nuxt.test.js +0 -69
- package/tests/setup_indexeddb.js +0 -4
- package/tests/unit/components/CrsSelector.nuxt.test.js +0 -55
- package/tests/unit/components/DragAndDrop.nuxt.test.js +0 -89
- package/tests/unit/components/ExtensionSelector.nuxt.test.js +0 -65
- package/tests/unit/components/FeedBack/ErrorsBanner.nuxt.test.js +0 -41
- package/tests/unit/components/FeedBack/Snackers.nuxt.test.js +0 -49
- package/tests/unit/components/FileSelector.nuxt.test.js +0 -124
- package/tests/unit/components/FileUploader.nuxt.test.js +0 -69
- package/tests/unit/components/MissingFilesSelector.nuxt.test.js +0 -77
- package/tests/unit/components/ObjectSelector.nuxt.test.js +0 -118
- package/tests/unit/components/PackagesVersions.nuxt.test.js +0 -42
- package/tests/unit/components/Step.nuxt.test.js +0 -51
- package/tests/unit/components/Stepper.nuxt.test.js +0 -41
- package/tests/unit/components/ToolPanel.nuxt.test.js +0 -66
- package/tests/unit/composables/api_fetch.nuxt.test.js +0 -75
- package/tests/unit/composables/project_manager.nuxt.test.js +0 -299
- package/tests/unit/composables/run_function_when_microservices_connected.nuxt.test.js +0 -57
- package/tests/unit/composables/upload_file.nuxt.test.js +0 -45
- package/tests/unit/composables/virtual_tree.nuxt.test.js +0 -63
- package/tests/unit/plugins/project_load.nuxt.test.js +0 -98
- package/tests/unit/stores/app.nuxt.test.js +0 -189
- package/tests/unit/stores/back.nuxt.test.js +0 -147
- package/tests/unit/stores/cloud.nuxt.test.js +0 -90
- package/tests/unit/stores/data.nuxt.test.js +0 -162
- package/tests/unit/stores/feedback.nuxt.test.js +0 -90
- package/tests/unit/stores/infra.nuxt.test.js +0 -313
- package/tests/unit/stores/treeview.nuxt.test.js +0 -63
- package/tests/unit/stores/viewer.nuxt.test.js +0 -161
- package/tests/unit/utils/validate_schema.nuxt.test.js +0 -38
- package/tests/utils.js +0 -20
- package/tests/vitest.config.js +0 -67
- /package/server/api/local/app/{kill.post.js → kill.post.ts} +0 -0
- /package/shared/{app_mode.js → app_mode.ts} +0 -0
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ModelComponentStyle,
|
|
3
|
+
ModelComponentTypeStyle,
|
|
4
|
+
ObjectStyle,
|
|
5
|
+
} from "@ogw_internal/stores/data_style/types";
|
|
6
|
+
import type { Table } from "dexie";
|
|
7
|
+
import { database } from "@ogw_internal/database/database.js";
|
|
8
|
+
import { getDefaultStyle } from "@ogw_front/utils/default_styles";
|
|
9
|
+
import { useDataStore } from "@ogw_front/stores/data";
|
|
10
|
+
import { useDataStyleState } from "@ogw_internal/stores/data_style/state";
|
|
11
|
+
import { useMeshStyle } from "@ogw_internal/stores/data_style/mesh/index";
|
|
12
|
+
import { useModelStyle } from "@ogw_internal/stores/data_style/model/index";
|
|
13
|
+
|
|
14
|
+
interface DataStyleSnapshot {
|
|
15
|
+
readonly styles: Record<string, ObjectStyle>;
|
|
16
|
+
readonly componentStyles: Record<string, ModelComponentStyle>;
|
|
17
|
+
readonly modelComponentTypeStyles: Record<string, ModelComponentTypeStyle>;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// The database's table map is dynamically assembled at runtime (see internal/database/database.ts), so its exported type is a loose `{}`; cast it to the shape it actually has at runtime rather than widening every call site.
|
|
21
|
+
type DatabaseTables = Record<string, Table<Record<string, unknown>, string> | undefined>;
|
|
22
|
+
|
|
23
|
+
// `noUncheckedIndexedAccess` sees these as possibly undefined even though they're always registered before this store is used; guard defensively rather than asserting.
|
|
24
|
+
function requireTable<TableValue>(table: TableValue | undefined, name: string): TableValue {
|
|
25
|
+
if (table === undefined) {
|
|
26
|
+
throw new Error(`Database table not initialized: ${name}`);
|
|
27
|
+
}
|
|
28
|
+
return table;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
32
|
+
return typeof value === "object" && value !== null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// oxlint-disable-next-line max-lines-per-function
|
|
36
|
+
export const useDataStyleStore = defineStore("dataStyle", () => {
|
|
37
|
+
const dataStyleState = useDataStyleState();
|
|
38
|
+
const meshStyleStore = useMeshStyle();
|
|
39
|
+
const modelStyleStore = useModelStyle();
|
|
40
|
+
const dataStore = useDataStore();
|
|
41
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- the database Proxy is typed as `{}` at its export site; this cast documents its real runtime shape.
|
|
42
|
+
const typedDatabase = database as unknown as DatabaseTables;
|
|
43
|
+
const data_style_db = requireTable(typedDatabase.data_style, "data_style");
|
|
44
|
+
const model_component_type_datastyle_db = requireTable(
|
|
45
|
+
typedDatabase.model_component_type_datastyle,
|
|
46
|
+
"model_component_type_datastyle",
|
|
47
|
+
);
|
|
48
|
+
const component_datastyle_db = requireTable(
|
|
49
|
+
typedDatabase.model_component_datastyle,
|
|
50
|
+
"model_component_datastyle",
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
async function addDataStyle(id: string, geode_object: string): Promise<void> {
|
|
54
|
+
const defaultStyle = getDefaultStyle(geode_object);
|
|
55
|
+
await data_style_db.put(
|
|
56
|
+
structuredClone({ id, ...(isRecord(defaultStyle) ? defaultStyle : {}) }),
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function setVisibility(id: string, visibility: boolean): Promise<unknown> {
|
|
61
|
+
const item = await dataStore.item(id);
|
|
62
|
+
if (!(await dataStore.isItemViewable(item))) {
|
|
63
|
+
return dataStyleState.mutateStyle(id, { visibility });
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const { viewer_type } = item;
|
|
67
|
+
|
|
68
|
+
if (viewer_type === "mesh") {
|
|
69
|
+
return meshStyleStore.setMeshVisibility(id, visibility);
|
|
70
|
+
}
|
|
71
|
+
if (viewer_type === "model") {
|
|
72
|
+
return modelStyleStore.setModelVisibility(id, visibility);
|
|
73
|
+
}
|
|
74
|
+
throw new Error("Unknown viewer_type");
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async function applyDefaultStyle(id: string): Promise<unknown[]> {
|
|
78
|
+
const item = await dataStore.item(id);
|
|
79
|
+
if (!(await dataStore.isItemViewable(item))) {
|
|
80
|
+
throw new Error(`applyDefaultStyle called for non-viewable item: ${id}`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const { viewer_type } = item;
|
|
84
|
+
|
|
85
|
+
if (viewer_type === "mesh") {
|
|
86
|
+
return meshStyleStore.applyMeshStyle(id);
|
|
87
|
+
}
|
|
88
|
+
if (viewer_type === "model") {
|
|
89
|
+
return modelStyleStore.applyModelStyle(id);
|
|
90
|
+
}
|
|
91
|
+
throw new Error(`Unknown viewer_type: ${viewer_type}`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
function exportStores(): DataStyleSnapshot {
|
|
95
|
+
return {
|
|
96
|
+
styles: dataStyleState.styles.value,
|
|
97
|
+
componentStyles: dataStyleState.componentStyles.value,
|
|
98
|
+
modelComponentTypeStyles: dataStyleState.modelComponentTypeStyles.value,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// oxlint-disable-next-line prefer-readonly-parameter-types -- ObjectStyle (external type) has a mutable index signature and mutable nested StyleValues fields that can't be marked readonly from here.
|
|
103
|
+
async function importStores(snapshot: DataStyleSnapshot): Promise<void> {
|
|
104
|
+
const stylesSnapshot = snapshot.styles;
|
|
105
|
+
const componentStylesSnapshot = snapshot.componentStyles;
|
|
106
|
+
const modelComponentTypeStylesSnapshot = snapshot.modelComponentTypeStyles;
|
|
107
|
+
|
|
108
|
+
await dataStyleState.clear();
|
|
109
|
+
|
|
110
|
+
const style_promises = Object.entries(stylesSnapshot).map(
|
|
111
|
+
// oxlint-disable-next-line prefer-readonly-parameter-types -- same external ObjectStyle limitation as above.
|
|
112
|
+
async ([id, style]: readonly [string, ObjectStyle]) => {
|
|
113
|
+
const key = await data_style_db.put(structuredClone({ ...style, id }));
|
|
114
|
+
return key;
|
|
115
|
+
},
|
|
116
|
+
);
|
|
117
|
+
const component_style_promises = Object.values(componentStylesSnapshot).map(
|
|
118
|
+
async (style: ModelComponentStyle) => {
|
|
119
|
+
const key = await component_datastyle_db.put(structuredClone(style));
|
|
120
|
+
return key;
|
|
121
|
+
},
|
|
122
|
+
);
|
|
123
|
+
const model_component_type_style_promises = Object.values(modelComponentTypeStylesSnapshot).map(
|
|
124
|
+
async (style: ModelComponentTypeStyle) => {
|
|
125
|
+
const key = await model_component_type_datastyle_db.put(structuredClone(style));
|
|
126
|
+
return key;
|
|
127
|
+
},
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
await Promise.all([
|
|
131
|
+
...style_promises,
|
|
132
|
+
...component_style_promises,
|
|
133
|
+
...model_component_type_style_promises,
|
|
134
|
+
]);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async function applyAllStylesFromState(): Promise<void> {
|
|
138
|
+
const ids = Object.keys(dataStyleState.styles.value);
|
|
139
|
+
const promises = ids.map(async (id) => {
|
|
140
|
+
const meta = await dataStore.item(id);
|
|
141
|
+
if (!(await dataStore.isItemViewable(meta))) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const viewerType = meta.viewer_type;
|
|
145
|
+
if (viewerType === "mesh") {
|
|
146
|
+
await meshStyleStore.applyMeshStyle(id);
|
|
147
|
+
} else if (viewerType === "model") {
|
|
148
|
+
await modelStyleStore.applyModelStyle(id);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
await Promise.all(promises);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
addDataStyle,
|
|
156
|
+
applyDefaultStyle,
|
|
157
|
+
setVisibility,
|
|
158
|
+
exportStores,
|
|
159
|
+
importStores,
|
|
160
|
+
applyAllStylesFromState,
|
|
161
|
+
...dataStyleState,
|
|
162
|
+
...meshStyleStore,
|
|
163
|
+
...modelStyleStore,
|
|
164
|
+
};
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
export type { DataStyleSnapshot };
|
|
@@ -3,16 +3,27 @@ import { v4 as uuidv4 } from "uuid";
|
|
|
3
3
|
const MILLISECONDS_IN_SECOND = 1000;
|
|
4
4
|
const DEFAULT_FEEDBACKS_TIMEOUT_SECONDS = 10;
|
|
5
5
|
|
|
6
|
+
type FeedbackType = "error" | "success" | "warning";
|
|
7
|
+
|
|
8
|
+
interface Feedback {
|
|
9
|
+
id: string;
|
|
10
|
+
type: FeedbackType;
|
|
11
|
+
code?: number;
|
|
12
|
+
route?: string;
|
|
13
|
+
name?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
6
17
|
export const useFeedbackStore = defineStore("feedback", {
|
|
7
18
|
state: () => ({
|
|
8
|
-
feedbacks: [],
|
|
19
|
+
feedbacks: [] as Feedback[],
|
|
9
20
|
server_error: false,
|
|
10
21
|
feedbacks_timeout_miliseconds: DEFAULT_FEEDBACKS_TIMEOUT_SECONDS * MILLISECONDS_IN_SECOND,
|
|
11
22
|
}),
|
|
12
23
|
actions: {
|
|
13
|
-
|
|
24
|
+
add_error(code: number, route: string, name: string, description: string) {
|
|
14
25
|
const feedbackId = uuidv4();
|
|
15
|
-
|
|
26
|
+
this.feedbacks.push({
|
|
16
27
|
id: feedbackId,
|
|
17
28
|
type: "error",
|
|
18
29
|
code,
|
|
@@ -24,9 +35,9 @@ export const useFeedbackStore = defineStore("feedback", {
|
|
|
24
35
|
this.delete_feedback(feedbackId);
|
|
25
36
|
}, this.feedbacks_timeout_miliseconds);
|
|
26
37
|
},
|
|
27
|
-
|
|
38
|
+
add_success(description: string) {
|
|
28
39
|
const feedbackId = uuidv4();
|
|
29
|
-
|
|
40
|
+
this.feedbacks.push({
|
|
30
41
|
id: feedbackId,
|
|
31
42
|
type: "success",
|
|
32
43
|
description,
|
|
@@ -35,9 +46,9 @@ export const useFeedbackStore = defineStore("feedback", {
|
|
|
35
46
|
this.delete_feedback(feedbackId);
|
|
36
47
|
}, this.feedbacks_timeout_miliseconds);
|
|
37
48
|
},
|
|
38
|
-
|
|
49
|
+
add_warning(description: string) {
|
|
39
50
|
const feedbackId = uuidv4();
|
|
40
|
-
|
|
51
|
+
this.feedbacks.push({
|
|
41
52
|
id: feedbackId,
|
|
42
53
|
type: "warning",
|
|
43
54
|
description,
|
|
@@ -46,7 +57,7 @@ export const useFeedbackStore = defineStore("feedback", {
|
|
|
46
57
|
this.delete_feedback(feedbackId);
|
|
47
58
|
}, this.feedbacks_timeout_miliseconds);
|
|
48
59
|
},
|
|
49
|
-
delete_feedback(feedbackId) {
|
|
60
|
+
delete_feedback(feedbackId: string) {
|
|
50
61
|
this.feedbacks = this.feedbacks.filter((feedback) => feedback.id !== feedbackId);
|
|
51
62
|
},
|
|
52
63
|
delete_server_error() {
|
|
@@ -1,30 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type ViewStreamLike,
|
|
3
|
+
useHybridViewerViewport,
|
|
4
|
+
} from "@ogw_internal/stores/hybrid_viewer/viewport";
|
|
1
5
|
import {
|
|
2
6
|
applySnapshot,
|
|
3
7
|
getCameraOptions,
|
|
4
8
|
useHybridViewerCamera,
|
|
5
9
|
} from "@ogw_internal/stores/hybrid_viewer/camera";
|
|
6
10
|
import { BACKGROUND_COLOR } from "@ogw_internal/stores/hybrid_viewer/constants";
|
|
11
|
+
import type { CameraOptions } from "@ogw_internal/stores/hybrid_viewer/vtk_types";
|
|
7
12
|
import { useHybridViewerBrightness } from "@ogw_internal/stores/hybrid_viewer/brightness";
|
|
13
|
+
import { useHybridViewerCore } from "@ogw_internal/stores/hybrid_viewer/core";
|
|
8
14
|
import { useHybridViewerFilters } from "@ogw_internal/stores/hybrid_viewer/filters";
|
|
9
15
|
import { useHybridViewerHighlight } from "@ogw_internal/stores/hybrid_viewer/highlight";
|
|
10
16
|
import { useHybridViewerRuler } from "@ogw_internal/stores/hybrid_viewer/ruler";
|
|
11
17
|
import { useHybridViewerScene } from "@ogw_internal/stores/hybrid_viewer/scene";
|
|
12
|
-
import { useHybridViewerViewport } from "@ogw_internal/stores/hybrid_viewer/viewport";
|
|
13
18
|
import { newInstance as vtkGenericRenderWindow } from "@kitware/vtk.js/Rendering/Misc/GenericRenderWindow";
|
|
14
19
|
|
|
15
20
|
import { Status } from "@ogw_front/utils/status";
|
|
16
21
|
import { useViewerStore } from "@ogw_front/stores/viewer";
|
|
17
22
|
|
|
18
|
-
import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
|
|
19
|
-
|
|
20
23
|
// oxlint-disable max-lines-per-function, max-statements
|
|
21
24
|
export const useHybridViewerStore = defineStore("hybridViewer", () => {
|
|
22
25
|
const viewerStore = useViewerStore();
|
|
23
|
-
const genericRenderWindow
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const is_picking = ref(false);
|
|
27
|
-
let imageStyle = undefined;
|
|
26
|
+
const { genericRenderWindow, status, is_moving, is_picking, remoteRender } =
|
|
27
|
+
useHybridViewerCore();
|
|
28
|
+
let imageStyle: CSSStyleDeclaration | undefined = undefined;
|
|
28
29
|
|
|
29
30
|
const brightnessStore = useHybridViewerBrightness();
|
|
30
31
|
const sceneStore = useHybridViewerScene();
|
|
@@ -40,14 +41,19 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
|
|
|
40
41
|
if (!genericRenderWindow.value) {
|
|
41
42
|
return;
|
|
42
43
|
}
|
|
44
|
+
// oxlint-disable-next-line no-unsafe-assignment -- vtk.js has no types for getApiSpecificRenderWindow(); narrowed below.
|
|
43
45
|
const webGLRenderWindow = genericRenderWindow.value.getApiSpecificRenderWindow();
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- trusted vtk.js OpenGL render window API boundary.
|
|
47
|
+
const openGLRenderWindow = webGLRenderWindow as unknown as {
|
|
48
|
+
getCanvas: () => HTMLCanvasElement;
|
|
49
|
+
};
|
|
50
|
+
const canvas = openGLRenderWindow.getCanvas();
|
|
51
|
+
if (canvas.parentElement) {
|
|
46
52
|
canvas.parentElement.style.cursor = value ? "crosshair" : "default";
|
|
47
53
|
}
|
|
48
54
|
});
|
|
49
55
|
|
|
50
|
-
async function initHybridViewer() {
|
|
56
|
+
async function initHybridViewer(): Promise<void> {
|
|
51
57
|
if (status.value !== Status.NOT_CREATED) {
|
|
52
58
|
return;
|
|
53
59
|
}
|
|
@@ -56,19 +62,38 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
|
|
|
56
62
|
background: BACKGROUND_COLOR,
|
|
57
63
|
listenWindowResize: false,
|
|
58
64
|
});
|
|
59
|
-
const webGLRenderWindow =
|
|
65
|
+
const webGLRenderWindow =
|
|
66
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- trusted vtk.js OpenGL render window API boundary.
|
|
67
|
+
genericRenderWindow.value.getApiSpecificRenderWindow() as unknown as {
|
|
68
|
+
getReferenceByName: (name: string) => { style: CSSStyleDeclaration };
|
|
69
|
+
setBackgroundImage: (image: unknown) => void;
|
|
70
|
+
};
|
|
60
71
|
imageStyle = webGLRenderWindow.getReferenceByName("bgImage").style;
|
|
61
|
-
Object.assign(imageStyle, {
|
|
72
|
+
Object.assign(imageStyle, {
|
|
73
|
+
transition: "opacity 0.1s ease-in",
|
|
74
|
+
zIndex: 1,
|
|
75
|
+
});
|
|
62
76
|
await viewerStore.ws_connect();
|
|
63
|
-
|
|
77
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- trusted @kitware/vtk.js WebSocket client API boundary.
|
|
78
|
+
const clientApi = viewerStore.client as unknown as {
|
|
79
|
+
getImageStream: () => {
|
|
80
|
+
createViewStream: (id: string) => ViewStreamLike;
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
const imageStream = clientApi.getImageStream();
|
|
64
84
|
viewportStore.viewStream.value = imageStream.createViewStream("-1");
|
|
65
|
-
viewportStore.viewStream.value
|
|
85
|
+
viewportStore.viewStream.value?.onImageReady((event: { image: unknown }) => {
|
|
66
86
|
if (is_moving.value) {
|
|
67
87
|
return;
|
|
68
88
|
}
|
|
69
|
-
|
|
89
|
+
// oxlint-disable no-unsafe-type-assertion -- image payload shape is guaranteed by the viewer's onImageReady contract.
|
|
90
|
+
const latestImage = event.image as typeof brightnessStore.latestImage.value;
|
|
91
|
+
// oxlint-enable no-unsafe-type-assertion
|
|
92
|
+
brightnessStore.latestImage.value = latestImage;
|
|
70
93
|
webGLRenderWindow.setBackgroundImage(event.image);
|
|
71
|
-
imageStyle
|
|
94
|
+
if (imageStyle) {
|
|
95
|
+
imageStyle.opacity = "1";
|
|
96
|
+
}
|
|
72
97
|
});
|
|
73
98
|
const renderer = genericRenderWindow.value.getRenderer();
|
|
74
99
|
const camera = renderer.getActiveCamera();
|
|
@@ -79,36 +104,15 @@ export const useHybridViewerStore = defineStore("hybridViewer", () => {
|
|
|
79
104
|
status.value = Status.CREATED;
|
|
80
105
|
}
|
|
81
106
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return renderPromise;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
renderPromise = (async () => {
|
|
92
|
-
try {
|
|
93
|
-
const schema = viewer_schemas.opengeodeweb_viewer.viewer.render;
|
|
94
|
-
await viewerStore.request({ schema });
|
|
95
|
-
} finally {
|
|
96
|
-
renderPromise = undefined;
|
|
97
|
-
if (renderPending) {
|
|
98
|
-
renderPending = false;
|
|
99
|
-
await remoteRender();
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
})();
|
|
103
|
-
return renderPromise;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function exportStores() {
|
|
107
|
-
const renderer = genericRenderWindow.value.getRenderer();
|
|
108
|
-
const camera = renderer.getActiveCamera();
|
|
107
|
+
function exportStores(): {
|
|
108
|
+
zScale: number;
|
|
109
|
+
camera_options: CameraOptions | Record<string, unknown>;
|
|
110
|
+
} {
|
|
111
|
+
const renderer = genericRenderWindow.value?.getRenderer();
|
|
112
|
+
const camera = renderer?.getActiveCamera();
|
|
109
113
|
return {
|
|
110
114
|
zScale: sceneStore.zScale.value,
|
|
111
|
-
camera_options: getCameraOptions(camera)
|
|
115
|
+
camera_options: (camera ? getCameraOptions(camera) : undefined) ?? cameraStore.camera_options,
|
|
112
116
|
};
|
|
113
117
|
}
|
|
114
118
|
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { Status } from "@ogw_front/utils/status";
|
|
2
|
+
import { appMode } from "@ogw_shared/app_mode";
|
|
3
|
+
import { setAppBaseUrl } from "@ogw_shared/scripts";
|
|
4
|
+
import { useCloudStore } from "@ogw_front/stores/cloud";
|
|
5
|
+
|
|
6
|
+
interface ElectronApi {
|
|
7
|
+
electronAPI: {
|
|
8
|
+
project_folder_path: (args: { projectFolderPath: string }) => void;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
declare global {
|
|
13
|
+
// oxlint-disable-next-line no-var -- required for global augmentation
|
|
14
|
+
var electronAPI: ElectronApi["electronAPI"];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const useInfraStore = defineStore("infra", {
|
|
18
|
+
state: () => ({
|
|
19
|
+
app_mode: useRuntimeConfig().public.MODE,
|
|
20
|
+
status: Status.NOT_CREATED,
|
|
21
|
+
microservices: [] as Microservice[],
|
|
22
|
+
domain_name: globalThis.location.hostname,
|
|
23
|
+
}),
|
|
24
|
+
getters: {
|
|
25
|
+
microservices_connected(): boolean {
|
|
26
|
+
return this.microservices.every((store: Microservice) => store.status === Status.CONNECTED);
|
|
27
|
+
},
|
|
28
|
+
microservices_busy(): boolean {
|
|
29
|
+
return this.microservices.some((store: Microservice) => store.is_busy === true);
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
actions: {
|
|
33
|
+
register_microservice(store: Microservice) {
|
|
34
|
+
const store_name = store.$id;
|
|
35
|
+
|
|
36
|
+
if (
|
|
37
|
+
!this.microservices.some((microservice: Microservice) => microservice.$id === store_name)
|
|
38
|
+
) {
|
|
39
|
+
this.microservices.push(store);
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
unregister_microservice(microserviceId: string) {
|
|
43
|
+
this.microservices = this.microservices.filter(
|
|
44
|
+
(microservice: Microservice) => microservice.$id !== microserviceId,
|
|
45
|
+
);
|
|
46
|
+
},
|
|
47
|
+
async create_backend(email?: string) {
|
|
48
|
+
if (this.status === Status.CREATED) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
await navigator.locks.request("infra.create_backend", async () => {
|
|
52
|
+
if (this.status === Status.CREATED) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this.status = Status.CREATING;
|
|
56
|
+
if (this.app_mode === appMode.CLOUD) {
|
|
57
|
+
const cloudStore = useCloudStore();
|
|
58
|
+
await cloudStore.launch(email ?? "");
|
|
59
|
+
} else {
|
|
60
|
+
const { useAppStore } = await import("@ogw_front/stores/app");
|
|
61
|
+
const appStore = useAppStore();
|
|
62
|
+
await appStore.createProjectFolder();
|
|
63
|
+
if (this.app_mode === appMode.DESKTOP) {
|
|
64
|
+
globalThis.electronAPI.project_folder_path({
|
|
65
|
+
projectFolderPath: appStore.projectFolderPath,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
await setAppBaseUrl(appStore.base_url);
|
|
69
|
+
const microservices_with_launch = this.microservices.filter(
|
|
70
|
+
(store: Microservice) => store.launch,
|
|
71
|
+
);
|
|
72
|
+
const launch_promises = microservices_with_launch.map(async (store: Microservice) => {
|
|
73
|
+
const result = await store.launch?.({
|
|
74
|
+
projectFolderPath: appStore.projectFolderPath,
|
|
75
|
+
});
|
|
76
|
+
return result;
|
|
77
|
+
});
|
|
78
|
+
const { registerRunningExtensions } = await import("@ogw_front/utils/extension");
|
|
79
|
+
launch_promises.push(registerRunningExtensions());
|
|
80
|
+
await Promise.all(launch_promises);
|
|
81
|
+
}
|
|
82
|
+
this.status = Status.CREATED;
|
|
83
|
+
return this.create_connection();
|
|
84
|
+
});
|
|
85
|
+
return undefined;
|
|
86
|
+
},
|
|
87
|
+
async create_connection() {
|
|
88
|
+
await Promise.all(
|
|
89
|
+
this.microservices.map(async (store: Microservice) => {
|
|
90
|
+
await store.connect();
|
|
91
|
+
}),
|
|
92
|
+
);
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
share: {
|
|
96
|
+
omit: ["microservices"],
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
export interface Microservice {
|
|
101
|
+
$id: string;
|
|
102
|
+
status?: string;
|
|
103
|
+
is_busy?: boolean;
|
|
104
|
+
launch?: (params: Record<string, unknown>) => Promise<unknown>;
|
|
105
|
+
connect: () => Promise<void>;
|
|
106
|
+
}
|
|
@@ -1,42 +1,63 @@
|
|
|
1
1
|
// PointSet components
|
|
2
|
-
import PointSetPointsOptions from "@ogw_front/components/Viewer/PointSet/SpecificPointsOptions";
|
|
2
|
+
import PointSetPointsOptions from "@ogw_front/components/Viewer/PointSet/SpecificPointsOptions.vue";
|
|
3
3
|
|
|
4
4
|
// EdgedCurve components
|
|
5
|
-
import EdgedCurveEdgesOptions from "@ogw_front/components/Viewer/EdgedCurve/SpecificEdgesOptions";
|
|
6
|
-
import EdgedCurvePointsOptions from "@ogw_front/components/Viewer/EdgedCurve/PointsOptions";
|
|
5
|
+
import EdgedCurveEdgesOptions from "@ogw_front/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue";
|
|
6
|
+
import EdgedCurvePointsOptions from "@ogw_front/components/Viewer/EdgedCurve/PointsOptions.vue";
|
|
7
7
|
|
|
8
8
|
// Surface components
|
|
9
|
-
import SurfaceEdgesOptions from "@ogw_front/components/Viewer/Surface/EdgesOptions";
|
|
10
|
-
import SurfacePointsOptions from "@ogw_front/components/Viewer/Surface/PointsOptions";
|
|
11
|
-
import SurfacePolygonsOptions from "@ogw_front/components/Viewer/Surface/PolygonsOptions";
|
|
9
|
+
import SurfaceEdgesOptions from "@ogw_front/components/Viewer/Surface/EdgesOptions.vue";
|
|
10
|
+
import SurfacePointsOptions from "@ogw_front/components/Viewer/Surface/PointsOptions.vue";
|
|
11
|
+
import SurfacePolygonsOptions from "@ogw_front/components/Viewer/Surface/PolygonsOptions.vue";
|
|
12
12
|
|
|
13
13
|
// TriangulatedSurface components
|
|
14
|
-
import TriangulatedSurfaceTrianglesOptions from "@ogw_front/components/Viewer/Surface/Triangulated/TrianglesOptions";
|
|
14
|
+
import TriangulatedSurfaceTrianglesOptions from "@ogw_front/components/Viewer/Surface/Triangulated/TrianglesOptions.vue";
|
|
15
15
|
|
|
16
16
|
// Grid 2D components
|
|
17
|
-
import Grid2DCellsOptions from "@ogw_front/components/Viewer/Grid/2D/CellsOptions";
|
|
18
|
-
import Grid2DEdgesOptions from "@ogw_front/components/Viewer/Grid/2D/EdgesOptions";
|
|
19
|
-
import Grid2DPointsOptions from "@ogw_front/components/Viewer/Grid/2D/PointsOptions";
|
|
17
|
+
import Grid2DCellsOptions from "@ogw_front/components/Viewer/Grid/2D/CellsOptions.vue";
|
|
18
|
+
import Grid2DEdgesOptions from "@ogw_front/components/Viewer/Grid/2D/EdgesOptions.vue";
|
|
19
|
+
import Grid2DPointsOptions from "@ogw_front/components/Viewer/Grid/2D/PointsOptions.vue";
|
|
20
20
|
|
|
21
21
|
// Grid 3D components
|
|
22
|
-
import Grid3DCellsOptions from "@ogw_front/components/Viewer/Grid/3D/CellsOptions";
|
|
23
|
-
import Grid3DEdgesOptions from "@ogw_front/components/Viewer/Grid/3D/EdgesOptions";
|
|
24
|
-
import Grid3DPointsOptions from "@ogw_front/components/Viewer/Grid/3D/PointsOptions";
|
|
22
|
+
import Grid3DCellsOptions from "@ogw_front/components/Viewer/Grid/3D/CellsOptions.vue";
|
|
23
|
+
import Grid3DEdgesOptions from "@ogw_front/components/Viewer/Grid/3D/EdgesOptions.vue";
|
|
24
|
+
import Grid3DPointsOptions from "@ogw_front/components/Viewer/Grid/3D/PointsOptions.vue";
|
|
25
25
|
|
|
26
26
|
// Solid components
|
|
27
|
-
import SolidEdgesOptions from "@ogw_front/components/Viewer/Solid/EdgesOptions";
|
|
28
|
-
import SolidPointsOptions from "@ogw_front/components/Viewer/Solid/PointsOptions";
|
|
29
|
-
import SolidPolygonsOptions from "@ogw_front/components/Viewer/Solid/PolygonsOptions";
|
|
30
|
-
import SolidPolyhedraOptions from "@ogw_front/components/Viewer/Solid/SpecificPolyhedraOptions";
|
|
27
|
+
import SolidEdgesOptions from "@ogw_front/components/Viewer/Solid/EdgesOptions.vue";
|
|
28
|
+
import SolidPointsOptions from "@ogw_front/components/Viewer/Solid/PointsOptions.vue";
|
|
29
|
+
import SolidPolygonsOptions from "@ogw_front/components/Viewer/Solid/PolygonsOptions.vue";
|
|
30
|
+
import SolidPolyhedraOptions from "@ogw_front/components/Viewer/Solid/SpecificPolyhedraOptions.vue";
|
|
31
31
|
|
|
32
32
|
// TetrahedralSolid components
|
|
33
|
-
import TetrahedralSolidTetrahedraOptions from "@ogw_front/components/Viewer/TetrahedralSolid/TetrahedraOptions";
|
|
34
|
-
import TetrahedralSolidTrianglesOptions from "@ogw_front/components/Viewer/TetrahedralSolid/TrianglesOptions";
|
|
33
|
+
import TetrahedralSolidTetrahedraOptions from "@ogw_front/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue";
|
|
34
|
+
import TetrahedralSolidTrianglesOptions from "@ogw_front/components/Viewer/TetrahedralSolid/TrianglesOptions.vue";
|
|
35
35
|
|
|
36
36
|
// Model components
|
|
37
|
-
import ModelEdgesOptions from "@ogw_front/components/Viewer/Generic/Model/EdgesOptions";
|
|
38
|
-
import ModelPointsOptions from "@ogw_front/components/Viewer/Generic/Model/PointsOptions";
|
|
39
|
-
import ModelStyleOptions from "@ogw_front/components/Viewer/Generic/Model/ModelStyleOptions";
|
|
37
|
+
import ModelEdgesOptions from "@ogw_front/components/Viewer/Generic/Model/EdgesOptions.vue";
|
|
38
|
+
import ModelPointsOptions from "@ogw_front/components/Viewer/Generic/Model/PointsOptions.vue";
|
|
39
|
+
import ModelStyleOptions from "@ogw_front/components/Viewer/Generic/Model/ModelStyleOptions.vue";
|
|
40
|
+
|
|
41
|
+
import type { Component } from "vue";
|
|
42
|
+
|
|
43
|
+
type MenuItems = Component[];
|
|
44
|
+
|
|
45
|
+
interface MenuMetaData {
|
|
46
|
+
viewer_type?: string;
|
|
47
|
+
geode_object_type?: string;
|
|
48
|
+
[key: string]: unknown;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
interface OpenMenuOptions {
|
|
52
|
+
readonly id: string;
|
|
53
|
+
readonly x: number | undefined;
|
|
54
|
+
readonly y: number | undefined;
|
|
55
|
+
readonly width: number;
|
|
56
|
+
readonly height: number;
|
|
57
|
+
readonly top: number;
|
|
58
|
+
readonly left: number;
|
|
59
|
+
readonly meta_data: MenuMetaData | undefined;
|
|
60
|
+
}
|
|
40
61
|
|
|
41
62
|
const PointSet_menu = [PointSetPointsOptions];
|
|
42
63
|
|
|
@@ -85,7 +106,7 @@ const StructuralModel_menu = [ModelEdgesOptions, ModelPointsOptions, ModelStyleO
|
|
|
85
106
|
|
|
86
107
|
const ModelComponent_menu = [ModelEdgesOptions, ModelPointsOptions, ModelStyleOptions];
|
|
87
108
|
|
|
88
|
-
const menusData = {
|
|
109
|
+
const menusData: Record<string, Record<string, MenuItems>> = {
|
|
89
110
|
mesh: {
|
|
90
111
|
EdgedCurve2D: EdgedCurve_menu,
|
|
91
112
|
EdgedCurve3D: EdgedCurve_menu,
|
|
@@ -122,24 +143,33 @@ const menusData = {
|
|
|
122
143
|
export const useMenuStore = defineStore("menu", () => {
|
|
123
144
|
const menus = shallowRef(menusData);
|
|
124
145
|
const display_menu = ref(false);
|
|
125
|
-
const current_id = ref(undefined);
|
|
146
|
+
const current_id = ref<string | undefined>(undefined);
|
|
126
147
|
const menuX = ref(0);
|
|
127
148
|
const menuY = ref(0);
|
|
128
149
|
const containerWidth = ref(window.innerWidth);
|
|
129
150
|
const containerHeight = ref(window.innerHeight);
|
|
130
151
|
const containerTop = ref(0);
|
|
131
152
|
const containerLeft = ref(0);
|
|
132
|
-
const active_item_index = ref(undefined);
|
|
133
|
-
const current_meta_data = ref({});
|
|
134
|
-
|
|
135
|
-
function getMenuItems(
|
|
136
|
-
|
|
153
|
+
const active_item_index = ref<number | undefined>(undefined);
|
|
154
|
+
const current_meta_data = ref<MenuMetaData>({});
|
|
155
|
+
|
|
156
|
+
function getMenuItems(
|
|
157
|
+
objectType: string | undefined,
|
|
158
|
+
geodeObject: string | undefined,
|
|
159
|
+
): MenuItems {
|
|
160
|
+
if (
|
|
161
|
+
objectType === undefined ||
|
|
162
|
+
objectType === "" ||
|
|
163
|
+
geodeObject === undefined ||
|
|
164
|
+
geodeObject === "" ||
|
|
165
|
+
!menus.value[objectType]
|
|
166
|
+
) {
|
|
137
167
|
return [];
|
|
138
168
|
}
|
|
139
|
-
return menus.value[objectType][geodeObject]
|
|
169
|
+
return menus.value[objectType]?.[geodeObject] ?? [];
|
|
140
170
|
}
|
|
141
171
|
|
|
142
|
-
function closeMenu() {
|
|
172
|
+
function closeMenu(): void {
|
|
143
173
|
active_item_index.value = undefined;
|
|
144
174
|
current_id.value = undefined;
|
|
145
175
|
current_meta_data.value = {};
|
|
@@ -148,8 +178,9 @@ export const useMenuStore = defineStore("menu", () => {
|
|
|
148
178
|
display_menu.value = false;
|
|
149
179
|
}
|
|
150
180
|
|
|
151
|
-
|
|
152
|
-
|
|
181
|
+
function openMenu(options: OpenMenuOptions): void {
|
|
182
|
+
const { id, x, y, width, height, top, left, meta_data } = options;
|
|
183
|
+
closeMenu();
|
|
153
184
|
|
|
154
185
|
if (meta_data) {
|
|
155
186
|
const items = getMenuItems(meta_data.viewer_type, meta_data.geode_object_type);
|
|
@@ -159,7 +190,7 @@ export const useMenuStore = defineStore("menu", () => {
|
|
|
159
190
|
}
|
|
160
191
|
|
|
161
192
|
current_id.value = id;
|
|
162
|
-
current_meta_data.value = meta_data
|
|
193
|
+
current_meta_data.value = meta_data ?? {};
|
|
163
194
|
|
|
164
195
|
if (x !== undefined && y !== undefined) {
|
|
165
196
|
menuX.value = x;
|
|
@@ -174,12 +205,12 @@ export const useMenuStore = defineStore("menu", () => {
|
|
|
174
205
|
display_menu.value = true;
|
|
175
206
|
}
|
|
176
207
|
|
|
177
|
-
function setMenuPosition(x, y) {
|
|
208
|
+
function setMenuPosition(x: number, y: number): void {
|
|
178
209
|
menuX.value = x;
|
|
179
210
|
menuY.value = y;
|
|
180
211
|
}
|
|
181
212
|
|
|
182
|
-
function toggleItemOptions(index) {
|
|
213
|
+
function toggleItemOptions(index: number): void {
|
|
183
214
|
if (active_item_index.value === index) {
|
|
184
215
|
active_item_index.value = undefined;
|
|
185
216
|
} else {
|