@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,303 @@
|
|
|
1
|
+
import type { JsonRpcSchema } from "@ogw_shared/utils/types";
|
|
2
|
+
import back_schemas from "@geode/opengeodeweb-back/opengeodeweb_back_schemas.json";
|
|
3
|
+
import { getAttributeRange } from "@ogw_front/utils/attributes";
|
|
4
|
+
import { useBackStore } from "@ogw_front/stores/back";
|
|
5
|
+
import { useDataStyleStore } from "@ogw_front/stores/data_style";
|
|
6
|
+
import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
|
|
7
|
+
|
|
8
|
+
interface ComponentNameEntry {
|
|
9
|
+
getterKey: string;
|
|
10
|
+
setterKey: string;
|
|
11
|
+
key: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
interface ActiveComponent extends ComponentNameEntry {
|
|
15
|
+
activeColoring: string;
|
|
16
|
+
attributeType: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// This composable resolves a batch of dynamically-named getter/setter methods on the data style store (e.g. "meshPointsVertexAttributeRange", "setMeshPointsVertexAttributeRange", ...) - the store's real, fully-typed surface has no index signature for this, so dynamic lookups go through this type guard instead of an unsafe cast of the whole store (which mixes these methods with state refs and other members), matching how these methods are actually shaped (getters take an id and return a value, setters take an id plus arbitrary arguments).
|
|
20
|
+
type DynamicStoreMethod = (...args: readonly unknown[]) => unknown;
|
|
21
|
+
|
|
22
|
+
function isDynamicStoreMethod(value: unknown): value is DynamicStoreMethod {
|
|
23
|
+
return typeof value === "function";
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function getDynamicStoreMethod(store: object, key: string): DynamicStoreMethod | undefined {
|
|
27
|
+
const value: unknown = Reflect.get(store, key);
|
|
28
|
+
return isDynamicStoreMethod(value) ? value : undefined;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface AttributeStyleComponent {
|
|
32
|
+
coloring?: { active?: string };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
interface AttributeResponse {
|
|
36
|
+
readonly attributes?: readonly {
|
|
37
|
+
readonly attribute_name?: string;
|
|
38
|
+
readonly min_values?: readonly number[];
|
|
39
|
+
readonly max_values?: readonly number[];
|
|
40
|
+
readonly min_value?: number;
|
|
41
|
+
readonly max_value?: number;
|
|
42
|
+
}[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function isColoringValue(
|
|
46
|
+
value: unknown,
|
|
47
|
+
): value is NonNullable<AttributeStyleComponent["coloring"]> {
|
|
48
|
+
return typeof value === "object" && value !== null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function isJsonRpcSchema(value: unknown): value is JsonRpcSchema {
|
|
52
|
+
return (
|
|
53
|
+
typeof value === "object" && value !== null && "$id" in value && typeof value.$id === "string"
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function isAttributeResponse(value: unknown): value is AttributeResponse {
|
|
58
|
+
return typeof value === "object" && value !== null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function isNumberArray(value: unknown): value is number[] {
|
|
62
|
+
return Array.isArray(value) && value.every((item) => typeof item === "number");
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function isStringOrUndefined(value: unknown): value is string | undefined {
|
|
66
|
+
return value === undefined || typeof value === "string";
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function isNumberOrUndefined(value: unknown): value is number | undefined {
|
|
70
|
+
return value === undefined || typeof value === "number";
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function useGlobalAttributeStyle(dataIdRef: Ref<string | undefined>): {
|
|
74
|
+
currentColormap: typeof currentColormap;
|
|
75
|
+
currentRange: typeof currentRange;
|
|
76
|
+
applyGlobalColormap: typeof applyGlobalColormap;
|
|
77
|
+
resetGlobalRange: typeof resetGlobalRange;
|
|
78
|
+
} {
|
|
79
|
+
const dataStyleStore = useDataStyleStore();
|
|
80
|
+
const hybridViewerStore = useHybridViewerStore();
|
|
81
|
+
const backStore = useBackStore();
|
|
82
|
+
|
|
83
|
+
const componentNames: ComponentNameEntry[] = [
|
|
84
|
+
{ getterKey: "meshPoints", setterKey: "MeshPoints", key: "points" },
|
|
85
|
+
{ getterKey: "meshEdges", setterKey: "MeshEdges", key: "edges" },
|
|
86
|
+
{ getterKey: "meshPolygons", setterKey: "MeshPolygons", key: "polygons" },
|
|
87
|
+
{ getterKey: "meshCells", setterKey: "MeshCells", key: "cells" },
|
|
88
|
+
{ getterKey: "meshPolyhedra", setterKey: "MeshPolyhedra", key: "polyhedra" },
|
|
89
|
+
];
|
|
90
|
+
|
|
91
|
+
function getActiveComponents(targetId: string): ActiveComponent[] {
|
|
92
|
+
const style = dataStyleStore.getStyle(targetId);
|
|
93
|
+
const activeComponents: ActiveComponent[] = [];
|
|
94
|
+
for (const { key, getterKey, setterKey } of componentNames) {
|
|
95
|
+
let componentStyle: Record<string, unknown> | undefined = undefined;
|
|
96
|
+
switch (key) {
|
|
97
|
+
case "points": {
|
|
98
|
+
componentStyle = style.points;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case "edges": {
|
|
102
|
+
componentStyle = style.edges;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case "polygons": {
|
|
106
|
+
componentStyle = style.polygons;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
case "cells": {
|
|
110
|
+
componentStyle = style.cells;
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case "polyhedra": {
|
|
114
|
+
componentStyle = style.polyhedra;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
default: {
|
|
118
|
+
componentStyle = undefined;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
if (componentStyle === undefined) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const { coloring } = componentStyle;
|
|
126
|
+
if (!isColoringValue(coloring)) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const { active: activeColoring } = coloring;
|
|
131
|
+
if (
|
|
132
|
+
activeColoring === undefined ||
|
|
133
|
+
!["vertex", "edge", "polygon", "cell", "polyhedron"].includes(activeColoring)
|
|
134
|
+
) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const attributeType = `${activeColoring.charAt(0).toUpperCase()}${activeColoring.slice(1)}Attribute`;
|
|
139
|
+
activeComponents.push({ activeColoring, attributeType, getterKey, setterKey, key });
|
|
140
|
+
}
|
|
141
|
+
return activeComponents;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const currentColormap = computed((): string => {
|
|
145
|
+
const targetId = dataIdRef.value;
|
|
146
|
+
if (targetId === undefined || targetId === "") {
|
|
147
|
+
return "batlow";
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
for (const comp of getActiveComponents(targetId)) {
|
|
151
|
+
const getterName = `${comp.getterKey}${comp.attributeType}ColorMap`;
|
|
152
|
+
const getter = getDynamicStoreMethod(dataStyleStore, getterName);
|
|
153
|
+
if (getter) {
|
|
154
|
+
const colorMap = getter(targetId);
|
|
155
|
+
if (typeof colorMap === "string" && colorMap.length > 0) {
|
|
156
|
+
return colorMap;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return "batlow";
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
async function applyCurrentRange(newValue: readonly [number, number]): Promise<void> {
|
|
165
|
+
const targetId = dataIdRef.value;
|
|
166
|
+
if (targetId === undefined || targetId === "") {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
let updated = false;
|
|
171
|
+
for (const comp of getActiveComponents(targetId)) {
|
|
172
|
+
const setterName = `set${comp.setterKey}${comp.attributeType}Range`;
|
|
173
|
+
const setter = getDynamicStoreMethod(dataStyleStore, setterName);
|
|
174
|
+
if (setter) {
|
|
175
|
+
setter(targetId, newValue[0], newValue[1]);
|
|
176
|
+
updated = true;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (updated) {
|
|
180
|
+
await hybridViewerStore.remoteRender();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const currentRange = computed<readonly [number, number]>({
|
|
185
|
+
get(): readonly [number, number] {
|
|
186
|
+
const targetId = dataIdRef.value;
|
|
187
|
+
if (targetId === undefined || targetId === "") {
|
|
188
|
+
return [0, 1];
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
for (const comp of getActiveComponents(targetId)) {
|
|
192
|
+
const getterName = `${comp.getterKey}${comp.attributeType}Range`;
|
|
193
|
+
const getter = getDynamicStoreMethod(dataStyleStore, getterName);
|
|
194
|
+
if (getter) {
|
|
195
|
+
const rawRange = getter(targetId);
|
|
196
|
+
const range = isNumberArray(rawRange) ? rawRange : undefined;
|
|
197
|
+
if (range && range.length === 2) {
|
|
198
|
+
return [range[0] ?? 0, range[1] ?? 1];
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return [0, 1];
|
|
203
|
+
},
|
|
204
|
+
// Vue's WritableComputedOptions setter is strictly `(v: T) => void`, so the async render call is delegated to a helper (see the same trade-off in `app/composables/hover_highlight.ts`'s `onHoverEnter`).
|
|
205
|
+
set: (newValue: readonly [number, number]): void => {
|
|
206
|
+
/* oxlint-disable-next-line promise/prefer-await-to-then -- setter cannot be async; see comment above. */
|
|
207
|
+
applyCurrentRange(newValue).catch(() => undefined);
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
async function applyGlobalColormap(newMap: string): Promise<void> {
|
|
212
|
+
const targetId = dataIdRef.value;
|
|
213
|
+
if (targetId === undefined || targetId === "") {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const promises: Promise<unknown>[] = [];
|
|
218
|
+
|
|
219
|
+
for (const comp of getActiveComponents(targetId)) {
|
|
220
|
+
const setterName = `set${comp.setterKey}${comp.attributeType}ColorMap`;
|
|
221
|
+
const setter = getDynamicStoreMethod(dataStyleStore, setterName);
|
|
222
|
+
|
|
223
|
+
if (setter) {
|
|
224
|
+
promises.push(Promise.resolve(setter(targetId, newMap)));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
await Promise.all(promises);
|
|
229
|
+
await hybridViewerStore.remoteRender();
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
async function resetGlobalRange(): Promise<void> {
|
|
233
|
+
const targetId = dataIdRef.value;
|
|
234
|
+
if (targetId === undefined || targetId === "") {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const requestPromises: Promise<unknown>[] = [];
|
|
239
|
+
|
|
240
|
+
for (const comp of getActiveComponents(targetId)) {
|
|
241
|
+
const { activeColoring, attributeType, getterKey, setterKey } = comp;
|
|
242
|
+
|
|
243
|
+
const nameGetter = getDynamicStoreMethod(dataStyleStore, `${getterKey}${attributeType}Name`);
|
|
244
|
+
const itemGetter = getDynamicStoreMethod(dataStyleStore, `${getterKey}${attributeType}Item`);
|
|
245
|
+
if (!nameGetter || !itemGetter) {
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const rawAttrName = nameGetter(targetId);
|
|
250
|
+
const attrName = isStringOrUndefined(rawAttrName) ? rawAttrName : undefined;
|
|
251
|
+
const rawAttrItem = itemGetter(targetId);
|
|
252
|
+
const attrItem = (isNumberOrUndefined(rawAttrItem) ? rawAttrItem : undefined) ?? 0;
|
|
253
|
+
|
|
254
|
+
if (attrName === undefined || attrName === "") {
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const schemaName = `${activeColoring}_attribute_names`;
|
|
259
|
+
const backSchemas = back_schemas.opengeodeweb_back as Record<string, unknown>;
|
|
260
|
+
const schema = backSchemas[schemaName];
|
|
261
|
+
if (schema === undefined || !isJsonRpcSchema(schema)) {
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
requestPromises.push(
|
|
266
|
+
backStore.request(
|
|
267
|
+
{
|
|
268
|
+
schema,
|
|
269
|
+
params: { id: targetId },
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
response_function: async (response: unknown): Promise<void> => {
|
|
273
|
+
if (!isAttributeResponse(response)) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
const attributes = response.attributes ?? [];
|
|
277
|
+
const currentAttribute = attributes.find((attr) => attr.attribute_name === attrName);
|
|
278
|
+
if (currentAttribute) {
|
|
279
|
+
const { min, max } = getAttributeRange(currentAttribute, attrItem);
|
|
280
|
+
|
|
281
|
+
const setterName = `set${setterKey}${attributeType}Range`;
|
|
282
|
+
const setter = getDynamicStoreMethod(dataStyleStore, setterName);
|
|
283
|
+
if (setter) {
|
|
284
|
+
setter(targetId, min, max);
|
|
285
|
+
await hybridViewerStore.remoteRender();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
},
|
|
290
|
+
),
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
await Promise.all(requestPromises);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return {
|
|
298
|
+
currentColormap,
|
|
299
|
+
currentRange,
|
|
300
|
+
applyGlobalColormap,
|
|
301
|
+
resetGlobalRange,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { JsonRpcSchema } from "@ogw_shared/utils/types";
|
|
2
|
+
import { useDataStore } from "@ogw_front/stores/data";
|
|
3
|
+
import { useViewerStore } from "@ogw_front/stores/viewer";
|
|
4
|
+
import vtk_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
|
|
5
|
+
|
|
6
|
+
const HOVER_DELAY = 200;
|
|
7
|
+
|
|
8
|
+
type HighlightType = "mesh" | "model";
|
|
9
|
+
type BlockIdsProvider = readonly number[] | (() => readonly number[] | Promise<readonly number[]>);
|
|
10
|
+
|
|
11
|
+
export function useHoverhighlight(): {
|
|
12
|
+
onHoverEnter: typeof onHoverEnter;
|
|
13
|
+
onHoverLeave: typeof onHoverLeave;
|
|
14
|
+
} {
|
|
15
|
+
const viewerStore = useViewerStore();
|
|
16
|
+
const dataStore = useDataStore();
|
|
17
|
+
let timer: ReturnType<typeof setTimeout> | undefined = undefined;
|
|
18
|
+
let currentId: string | undefined = undefined;
|
|
19
|
+
let currentType: HighlightType | undefined = undefined;
|
|
20
|
+
|
|
21
|
+
function onHoverEnter(
|
|
22
|
+
id: string,
|
|
23
|
+
block_ids_provider: BlockIdsProvider = [],
|
|
24
|
+
type: HighlightType = "model",
|
|
25
|
+
immediate = false,
|
|
26
|
+
): void {
|
|
27
|
+
if (timer) {
|
|
28
|
+
clearTimeout(timer);
|
|
29
|
+
timer = undefined;
|
|
30
|
+
}
|
|
31
|
+
const schema = vtk_schemas.opengeodeweb_viewer[type].highlight;
|
|
32
|
+
|
|
33
|
+
async function highlightAction(): Promise<void> {
|
|
34
|
+
currentId = id;
|
|
35
|
+
currentType = type;
|
|
36
|
+
|
|
37
|
+
if (!(await dataStore.isItemViewable(id))) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let block_ids: number[] = [
|
|
42
|
+
...(typeof block_ids_provider === "function"
|
|
43
|
+
? await block_ids_provider()
|
|
44
|
+
: block_ids_provider),
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
block_ids = (Array.isArray(block_ids) ? block_ids : [])
|
|
48
|
+
.map((blockId) => Math.trunc(blockId))
|
|
49
|
+
.filter((blockId) => !Number.isNaN(blockId));
|
|
50
|
+
|
|
51
|
+
if (currentId !== id) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const params = {
|
|
56
|
+
id,
|
|
57
|
+
visibility: true,
|
|
58
|
+
...(type === "model" && { block_ids }),
|
|
59
|
+
};
|
|
60
|
+
try {
|
|
61
|
+
await viewerStore.request({ schema, params });
|
|
62
|
+
} catch (error) {
|
|
63
|
+
console.error(`Highlight failed for ${type} ${id}:`, error);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function runHighlightAction(): Promise<void> {
|
|
68
|
+
try {
|
|
69
|
+
await highlightAction();
|
|
70
|
+
} catch {
|
|
71
|
+
// Ignore
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (immediate) {
|
|
76
|
+
// oxlint-disable-next-line typescript/no-floating-promises -- runHighlightAction catches its own errors internally.
|
|
77
|
+
runHighlightAction();
|
|
78
|
+
} else {
|
|
79
|
+
timer = setTimeout(() => {
|
|
80
|
+
// oxlint-disable-next-line typescript/no-floating-promises -- runHighlightAction catches its own errors internally.
|
|
81
|
+
runHighlightAction();
|
|
82
|
+
}, HOVER_DELAY);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async function unhighlightAction(
|
|
87
|
+
type: HighlightType,
|
|
88
|
+
id: string,
|
|
89
|
+
request: {
|
|
90
|
+
schema: JsonRpcSchema;
|
|
91
|
+
params?: Record<string, unknown>;
|
|
92
|
+
timeout?: number;
|
|
93
|
+
},
|
|
94
|
+
): Promise<void> {
|
|
95
|
+
try {
|
|
96
|
+
await viewerStore.request(request);
|
|
97
|
+
} catch (error) {
|
|
98
|
+
console.error(`Unhighlight failed for ${type} ${id}:`, error);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function onHoverLeave(id: string): void {
|
|
103
|
+
if (timer) {
|
|
104
|
+
clearTimeout(timer);
|
|
105
|
+
timer = undefined;
|
|
106
|
+
}
|
|
107
|
+
if (currentId === id && currentType) {
|
|
108
|
+
const schema = vtk_schemas.opengeodeweb_viewer[currentType].highlight;
|
|
109
|
+
const params = {
|
|
110
|
+
id,
|
|
111
|
+
visibility: false,
|
|
112
|
+
...(currentType === "model" && { block_ids: [] }),
|
|
113
|
+
};
|
|
114
|
+
// oxlint-disable-next-line typescript/no-floating-promises -- unhighlightAction catches its own errors internally.
|
|
115
|
+
unhighlightAction(currentType, id, { schema, params });
|
|
116
|
+
currentId = undefined;
|
|
117
|
+
currentType = undefined;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (currentId === undefined) {
|
|
121
|
+
currentId = undefined;
|
|
122
|
+
currentType = undefined;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return { onHoverEnter, onHoverLeave };
|
|
127
|
+
}
|
|
@@ -1,16 +1,33 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
CollectionComponent,
|
|
3
|
+
CollectionComponentGroup,
|
|
4
|
+
} from "@ogw_front/stores/data_helpers/collections";
|
|
1
5
|
import { compareSelections } from "@ogw_front/utils/treeview";
|
|
2
6
|
import { useDataStore } from "@ogw_front/stores/data";
|
|
3
7
|
import { useDataStyleStore } from "@ogw_front/stores/data_style";
|
|
4
8
|
import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
|
|
5
9
|
|
|
6
|
-
|
|
10
|
+
// The `watch` callback receives the freshly-fetched collection groups purely for reading (matching against and copying into `localCategories`, never mutated in place), so it's typed with its own fully-readonly mirror of `CollectionComponentGroup` rather than that (intentionally mutable, see `existing.title` below) store type directly.
|
|
11
|
+
interface ReadonlyCollectionComponentGroup {
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly title: string;
|
|
14
|
+
readonly children: readonly CollectionComponent[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function useModelCollections(viewId: string): {
|
|
18
|
+
items: typeof items;
|
|
19
|
+
collectionsCache: typeof collectionsCache;
|
|
20
|
+
localCategories: typeof localCategories;
|
|
21
|
+
selection: typeof selection;
|
|
22
|
+
updateVisibility: typeof updateVisibility;
|
|
23
|
+
} {
|
|
7
24
|
const dataStore = useDataStore();
|
|
8
25
|
const dataStyleStore = useDataStyleStore();
|
|
9
26
|
const hybridViewerStore = useHybridViewerStore();
|
|
10
27
|
|
|
11
28
|
const items = dataStore.refFormatedCollectionComponents(viewId);
|
|
12
|
-
const collectionsCache = ref(undefined);
|
|
13
|
-
const localCategories = ref([]);
|
|
29
|
+
const collectionsCache = ref<Record<string, CollectionComponent[]> | undefined>(undefined);
|
|
30
|
+
const localCategories = ref<CollectionComponentGroup[]>([]);
|
|
14
31
|
|
|
15
32
|
onMounted(async () => {
|
|
16
33
|
const data = await dataStore.fetchAllCollectionComponents(viewId);
|
|
@@ -19,7 +36,7 @@ export function useModelCollections(viewId) {
|
|
|
19
36
|
|
|
20
37
|
watch(
|
|
21
38
|
items,
|
|
22
|
-
async (newItems) => {
|
|
39
|
+
async (newItems: readonly ReadonlyCollectionComponentGroup[] | undefined) => {
|
|
23
40
|
if (!newItems) {
|
|
24
41
|
localCategories.value = [];
|
|
25
42
|
return;
|
|
@@ -28,8 +45,10 @@ export function useModelCollections(viewId) {
|
|
|
28
45
|
const data = await dataStore.fetchAllCollectionComponents(viewId);
|
|
29
46
|
collectionsCache.value = markRaw(data);
|
|
30
47
|
|
|
31
|
-
localCategories.value = newItems.map((newCategory) => {
|
|
32
|
-
const existing = localCategories.value.find(
|
|
48
|
+
localCategories.value = newItems.map((newCategory: ReadonlyCollectionComponentGroup) => {
|
|
49
|
+
const existing = localCategories.value.find(
|
|
50
|
+
(category: ReadonlyCollectionComponentGroup) => category.id === newCategory.id,
|
|
51
|
+
);
|
|
33
52
|
if (existing) {
|
|
34
53
|
existing.title = newCategory.title || newCategory.id;
|
|
35
54
|
return existing;
|
|
@@ -45,9 +64,9 @@ export function useModelCollections(viewId) {
|
|
|
45
64
|
|
|
46
65
|
const selection = dataStyleStore.visibleMeshComponents(viewId);
|
|
47
66
|
|
|
48
|
-
async function updateVisibility(current) {
|
|
67
|
+
async function updateVisibility(current: readonly string[]): Promise<void> {
|
|
49
68
|
const previous = selection.value;
|
|
50
|
-
const { added, removed } = compareSelections(current, previous);
|
|
69
|
+
const { added, removed } = compareSelections([...current], previous);
|
|
51
70
|
|
|
52
71
|
if (added.length === 0 && removed.length === 0) {
|
|
53
72
|
return;
|
|
@@ -59,7 +78,7 @@ export function useModelCollections(viewId) {
|
|
|
59
78
|
if (removed.length > 0) {
|
|
60
79
|
await dataStyleStore.setModelComponentsVisibility(viewId, removed, false);
|
|
61
80
|
}
|
|
62
|
-
hybridViewerStore.remoteRender();
|
|
81
|
+
await hybridViewerStore.remoteRender();
|
|
63
82
|
}
|
|
64
83
|
|
|
65
84
|
return {
|
|
@@ -1,16 +1,33 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
FormattedComponent,
|
|
3
|
+
FormattedComponentGroup,
|
|
4
|
+
} from "@ogw_front/stores/data_helpers/mesh";
|
|
1
5
|
import { compareSelections } from "@ogw_front/utils/treeview";
|
|
2
6
|
import { useDataStore } from "@ogw_front/stores/data";
|
|
3
7
|
import { useDataStyleStore } from "@ogw_front/stores/data_style";
|
|
4
8
|
import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
|
|
5
9
|
|
|
6
|
-
|
|
10
|
+
// The `watch` callback receives the freshly-fetched component groups purely for reading (matching against and copying into `localCategories`, never mutated in place), so it's typed with its own fully-readonly mirror of `FormattedComponentGroup` rather than that (intentionally mutable, see `existing.title` below) store type directly.
|
|
11
|
+
interface ReadonlyFormattedComponentGroup {
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly title: string;
|
|
14
|
+
readonly children: readonly FormattedComponent[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function useModelComponents(viewId: string): {
|
|
18
|
+
items: typeof items;
|
|
19
|
+
componentsCache: typeof componentsCache;
|
|
20
|
+
localCategories: typeof localCategories;
|
|
21
|
+
selection: typeof selection;
|
|
22
|
+
updateVisibility: typeof updateVisibility;
|
|
23
|
+
} {
|
|
7
24
|
const dataStore = useDataStore();
|
|
8
25
|
const dataStyleStore = useDataStyleStore();
|
|
9
26
|
const hybridViewerStore = useHybridViewerStore();
|
|
10
27
|
|
|
11
28
|
const items = dataStore.refFormatedMeshComponents(viewId);
|
|
12
|
-
const componentsCache = ref(undefined);
|
|
13
|
-
const localCategories = ref([]);
|
|
29
|
+
const componentsCache = ref<Record<string, FormattedComponent[]> | undefined>(undefined);
|
|
30
|
+
const localCategories = ref<FormattedComponentGroup[]>([]);
|
|
14
31
|
|
|
15
32
|
onMounted(async () => {
|
|
16
33
|
const data = await dataStore.fetchAllMeshComponents(viewId);
|
|
@@ -19,7 +36,7 @@ export function useModelComponents(viewId) {
|
|
|
19
36
|
|
|
20
37
|
watch(
|
|
21
38
|
items,
|
|
22
|
-
async (newItems) => {
|
|
39
|
+
async (newItems: readonly ReadonlyFormattedComponentGroup[] | undefined) => {
|
|
23
40
|
if (!newItems) {
|
|
24
41
|
localCategories.value = [];
|
|
25
42
|
return;
|
|
@@ -28,8 +45,10 @@ export function useModelComponents(viewId) {
|
|
|
28
45
|
const data = await dataStore.fetchAllMeshComponents(viewId);
|
|
29
46
|
componentsCache.value = markRaw(data);
|
|
30
47
|
|
|
31
|
-
localCategories.value = newItems.map((newCategory) => {
|
|
32
|
-
const existing = localCategories.value.find(
|
|
48
|
+
localCategories.value = newItems.map((newCategory: ReadonlyFormattedComponentGroup) => {
|
|
49
|
+
const existing = localCategories.value.find(
|
|
50
|
+
(category: ReadonlyFormattedComponentGroup) => category.id === newCategory.id,
|
|
51
|
+
);
|
|
33
52
|
if (existing) {
|
|
34
53
|
existing.title = newCategory.title || newCategory.id;
|
|
35
54
|
return existing;
|
|
@@ -45,9 +64,9 @@ export function useModelComponents(viewId) {
|
|
|
45
64
|
|
|
46
65
|
const selection = dataStyleStore.visibleMeshComponents(viewId);
|
|
47
66
|
|
|
48
|
-
async function updateVisibility(current) {
|
|
67
|
+
async function updateVisibility(current: readonly string[]): Promise<void> {
|
|
49
68
|
const previous = selection.value;
|
|
50
|
-
const { added, removed } = compareSelections(current, previous);
|
|
69
|
+
const { added, removed } = compareSelections([...current], previous);
|
|
51
70
|
|
|
52
71
|
if (added.length === 0 && removed.length === 0) {
|
|
53
72
|
return;
|
|
@@ -59,7 +78,7 @@ export function useModelComponents(viewId) {
|
|
|
59
78
|
if (removed.length > 0) {
|
|
60
79
|
await dataStyleStore.setModelComponentsVisibility(viewId, removed, false);
|
|
61
80
|
}
|
|
62
|
-
hybridViewerStore.remoteRender();
|
|
81
|
+
await hybridViewerStore.remoteRender();
|
|
63
82
|
}
|
|
64
83
|
|
|
65
84
|
return {
|