@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,392 @@
|
|
|
1
|
+
// oxlint-disable eslint/max-lines
|
|
2
|
+
// Third party imports
|
|
3
|
+
import { type Table, liveQuery } from "dexie";
|
|
4
|
+
import type { Observable } from "rxjs";
|
|
5
|
+
import { useObservable } from "@vueuse/rxjs";
|
|
6
|
+
import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
|
|
7
|
+
|
|
8
|
+
// Local imports
|
|
9
|
+
import { type ModelComponentRecord, useDataMesh } from "./data_helpers/mesh.js";
|
|
10
|
+
import { database } from "@ogw_internal/database/database.js";
|
|
11
|
+
import { useDataCollections } from "./data_helpers/collections.js";
|
|
12
|
+
import { useViewerStore } from "@ogw_front/stores/viewer";
|
|
13
|
+
|
|
14
|
+
interface DataItem {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
viewer_type: string;
|
|
18
|
+
geode_object_type: string;
|
|
19
|
+
visible: boolean;
|
|
20
|
+
created_at: string;
|
|
21
|
+
is_viewable?: boolean;
|
|
22
|
+
binary_light_viewable?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface ModelComponentInput {
|
|
26
|
+
geode_id: string;
|
|
27
|
+
type: string;
|
|
28
|
+
viewer_id: string | number;
|
|
29
|
+
name: string;
|
|
30
|
+
is_active: boolean;
|
|
31
|
+
boundaries?: string[];
|
|
32
|
+
internals?: string[];
|
|
33
|
+
items?: string[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface NewDataItem {
|
|
37
|
+
id: string;
|
|
38
|
+
name?: string;
|
|
39
|
+
viewer_type: string;
|
|
40
|
+
geode_object_type: string;
|
|
41
|
+
is_viewable?: boolean;
|
|
42
|
+
binary_light_viewable?: string;
|
|
43
|
+
mesh_components?: ModelComponentInput[];
|
|
44
|
+
collection_components?: ModelComponentInput[];
|
|
45
|
+
nb_vertices?: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface ModelComponentRelationRecord {
|
|
49
|
+
id: string;
|
|
50
|
+
parent: string;
|
|
51
|
+
child: string;
|
|
52
|
+
type: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
interface ViewableItemLike {
|
|
56
|
+
is_viewable?: boolean;
|
|
57
|
+
binary_light_viewable?: string;
|
|
58
|
+
geode_object_type?: string;
|
|
59
|
+
id?: string;
|
|
60
|
+
title?: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const viewer_generic_schemas = viewer_schemas.opengeodeweb_viewer.generic;
|
|
64
|
+
// 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.
|
|
65
|
+
type DatabaseTables = Record<string, unknown>;
|
|
66
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- see comment above.
|
|
67
|
+
const typedDatabase = database as unknown as DatabaseTables;
|
|
68
|
+
function checkItemViewable(item: ViewableItemLike | undefined | null): boolean {
|
|
69
|
+
if (!item || typeof item !== "object") {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
if (item.is_viewable !== undefined) {
|
|
73
|
+
return item.is_viewable;
|
|
74
|
+
}
|
|
75
|
+
if (item.binary_light_viewable !== undefined) {
|
|
76
|
+
return item.binary_light_viewable !== "not_viewable";
|
|
77
|
+
}
|
|
78
|
+
if (
|
|
79
|
+
item.geode_object_type === "HorizonStack3D" ||
|
|
80
|
+
item.id === "HorizonStack3D" ||
|
|
81
|
+
item.title === "HorizonStack3D"
|
|
82
|
+
) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
function isItemViewable(itemOrId: string | ViewableItemLike): boolean | Promise<boolean> {
|
|
88
|
+
if (typeof itemOrId === "string") {
|
|
89
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime; see comment above.
|
|
90
|
+
return (typedDatabase.data as Table<DataItem, string>).get(itemOrId).then(checkItemViewable);
|
|
91
|
+
}
|
|
92
|
+
return checkItemViewable(itemOrId);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// oxlint-disable-next-line max-lines-per-function, max-statements
|
|
96
|
+
export const useDataStore = defineStore("data", () => {
|
|
97
|
+
const viewerStore = useViewerStore();
|
|
98
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime; see comment above.
|
|
99
|
+
const data_db = typedDatabase.data as Table<DataItem, string>;
|
|
100
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime; see comment above.
|
|
101
|
+
const model_components_db = typedDatabase.model_components as Table<ModelComponentRecord, string>;
|
|
102
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime; see comment above.
|
|
103
|
+
const model_components_relation_db = typedDatabase.model_components_relation as Table<
|
|
104
|
+
ModelComponentRelationRecord,
|
|
105
|
+
string
|
|
106
|
+
>;
|
|
107
|
+
const {
|
|
108
|
+
formatedMeshComponents,
|
|
109
|
+
refFormatedMeshComponents,
|
|
110
|
+
getMeshComponentsByType,
|
|
111
|
+
getAllMeshComponents,
|
|
112
|
+
fetchAllMeshComponents,
|
|
113
|
+
getMeshComponentGeodeIds,
|
|
114
|
+
getCornersGeodeIds,
|
|
115
|
+
getLinesGeodeIds,
|
|
116
|
+
getSurfacesGeodeIds,
|
|
117
|
+
getBlocksGeodeIds,
|
|
118
|
+
} = useDataMesh();
|
|
119
|
+
const {
|
|
120
|
+
hasCollectionComponents,
|
|
121
|
+
getAllCollectionComponents,
|
|
122
|
+
fetchAllCollectionComponents,
|
|
123
|
+
formatedCollectionComponents,
|
|
124
|
+
refFormatedCollectionComponents,
|
|
125
|
+
} = useDataCollections();
|
|
126
|
+
async function item(id: string): Promise<DataItem> {
|
|
127
|
+
const data_item = await data_db.get(id);
|
|
128
|
+
if (!data_item) {
|
|
129
|
+
throw new Error(`Item not found: ${id}`);
|
|
130
|
+
}
|
|
131
|
+
return data_item;
|
|
132
|
+
}
|
|
133
|
+
async function allItems(): Promise<DataItem[]> {
|
|
134
|
+
const items = await data_db.toArray();
|
|
135
|
+
return items;
|
|
136
|
+
}
|
|
137
|
+
function refItem(id: string): Ref<DataItem | undefined> {
|
|
138
|
+
// Dexie's liveQuery() returns Dexie's own minimal Observable shape, not an
|
|
139
|
+
// Actual rxjs Observable instance (useObservable's declared parameter type);
|
|
140
|
+
// The two are structurally close enough at runtime (vueuse only calls
|
|
141
|
+
// `.subscribe`) but not identical, hence the cast.
|
|
142
|
+
return useObservable(
|
|
143
|
+
liveQuery(async () => {
|
|
144
|
+
const data_item = await data_db.get(id);
|
|
145
|
+
return data_item;
|
|
146
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- trusted vueuse/Dexie Observable boundary; see comment above.
|
|
147
|
+
}) as unknown as Observable<DataItem | undefined>,
|
|
148
|
+
{
|
|
149
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- placeholder until the live query resolves; consumers must treat this as possibly incomplete.
|
|
150
|
+
initialValue: {} as DataItem,
|
|
151
|
+
},
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
function refAllItems(): Ref<DataItem[]> {
|
|
155
|
+
return useObservable(
|
|
156
|
+
liveQuery(async () => {
|
|
157
|
+
const items = await data_db.toArray();
|
|
158
|
+
return items;
|
|
159
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- trusted vueuse/Dexie Observable boundary; see comment above.
|
|
160
|
+
}) as unknown as Observable<DataItem[]>,
|
|
161
|
+
{
|
|
162
|
+
initialValue: [] as DataItem[],
|
|
163
|
+
},
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
async function meshComponentType(modelId: string, geode_id: string): Promise<string | undefined> {
|
|
167
|
+
const component = await model_components_db
|
|
168
|
+
.where("[id+geode_id]")
|
|
169
|
+
.equals([modelId, geode_id])
|
|
170
|
+
.first();
|
|
171
|
+
return component?.type;
|
|
172
|
+
}
|
|
173
|
+
async function registerObject(id: string, name: string): Promise<unknown> {
|
|
174
|
+
const schema = viewer_generic_schemas.register;
|
|
175
|
+
const params = {
|
|
176
|
+
id,
|
|
177
|
+
name,
|
|
178
|
+
};
|
|
179
|
+
const result = await viewerStore.request({
|
|
180
|
+
schema,
|
|
181
|
+
params,
|
|
182
|
+
timeout: 0,
|
|
183
|
+
});
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
async function deregisterObject(id: string): Promise<unknown> {
|
|
187
|
+
const schema = viewer_generic_schemas.deregister;
|
|
188
|
+
const params = {
|
|
189
|
+
id,
|
|
190
|
+
};
|
|
191
|
+
const result = await viewerStore.request({
|
|
192
|
+
schema,
|
|
193
|
+
params,
|
|
194
|
+
});
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
// NewDataItem has mutable array fields (mesh_components, collection_components), so it can't
|
|
198
|
+
// Satisfy prefer-readonly-parameter-types deeply; same pattern as app/utils/import_workflow.ts.
|
|
199
|
+
async function addItem(new_item: NewDataItem): Promise<string> {
|
|
200
|
+
const itemData: DataItem = {
|
|
201
|
+
id: new_item.id,
|
|
202
|
+
name: new_item.name ?? new_item.id,
|
|
203
|
+
viewer_type: new_item.viewer_type,
|
|
204
|
+
geode_object_type: new_item.geode_object_type,
|
|
205
|
+
visible: true,
|
|
206
|
+
created_at: new Date().toISOString(),
|
|
207
|
+
is_viewable: new_item.is_viewable,
|
|
208
|
+
};
|
|
209
|
+
if (new_item.binary_light_viewable !== undefined && new_item.binary_light_viewable !== null) {
|
|
210
|
+
itemData.binary_light_viewable = new_item.binary_light_viewable;
|
|
211
|
+
}
|
|
212
|
+
const id = await data_db.put(itemData);
|
|
213
|
+
return id;
|
|
214
|
+
}
|
|
215
|
+
// NewDataItem has mutable array fields (mesh_components, collection_components), so it can't
|
|
216
|
+
// Satisfy prefer-readonly-parameter-types deeply; same pattern as app/utils/import_workflow.ts.
|
|
217
|
+
async function addComponents(new_item: NewDataItem): Promise<string> {
|
|
218
|
+
const allComponents: ModelComponentRecord[] = [];
|
|
219
|
+
// ModelComponentInput has mutable array fields (boundaries, internals, items), so a readonly
|
|
220
|
+
// Array of it can't satisfy prefer-readonly-parameter-types deeply; same limitation as above.
|
|
221
|
+
function addModelComponents(components: readonly ModelComponentInput[]): void {
|
|
222
|
+
for (const component of components) {
|
|
223
|
+
allComponents.push({
|
|
224
|
+
id: new_item.id,
|
|
225
|
+
geode_id: component.geode_id,
|
|
226
|
+
type: component.type,
|
|
227
|
+
viewer_id: component.viewer_id,
|
|
228
|
+
name: component.name,
|
|
229
|
+
is_active: component.is_active,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (new_item.mesh_components) {
|
|
234
|
+
addModelComponents(new_item.mesh_components);
|
|
235
|
+
}
|
|
236
|
+
if (new_item.collection_components) {
|
|
237
|
+
addModelComponents(new_item.collection_components);
|
|
238
|
+
}
|
|
239
|
+
const lastKey = await model_components_db.bulkPut(allComponents);
|
|
240
|
+
return lastKey;
|
|
241
|
+
}
|
|
242
|
+
// NewDataItem has mutable array fields (mesh_components, collection_components), so it can't
|
|
243
|
+
// Satisfy prefer-readonly-parameter-types deeply; same pattern as app/utils/import_workflow.ts.
|
|
244
|
+
async function addComponentRelations(new_item: NewDataItem): Promise<string> {
|
|
245
|
+
const relations: ModelComponentRelationRecord[] = [];
|
|
246
|
+
function addModelComponentRelations(
|
|
247
|
+
components: readonly string[],
|
|
248
|
+
parent: string,
|
|
249
|
+
type: string,
|
|
250
|
+
): void {
|
|
251
|
+
for (const child of components) {
|
|
252
|
+
relations.push({
|
|
253
|
+
id: new_item.id,
|
|
254
|
+
parent,
|
|
255
|
+
child,
|
|
256
|
+
type,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (new_item.mesh_components) {
|
|
261
|
+
for (const component of new_item.mesh_components) {
|
|
262
|
+
if (component.boundaries) {
|
|
263
|
+
addModelComponentRelations(component.boundaries, component.geode_id, "boundary");
|
|
264
|
+
}
|
|
265
|
+
if (component.internals) {
|
|
266
|
+
addModelComponentRelations(component.internals, component.geode_id, "internal");
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (new_item.collection_components) {
|
|
271
|
+
for (const component of new_item.collection_components) {
|
|
272
|
+
if (component.items) {
|
|
273
|
+
addModelComponentRelations(component.items, component.geode_id, "collection");
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const lastKey = await model_components_relation_db.bulkPut(relations);
|
|
278
|
+
return lastKey;
|
|
279
|
+
}
|
|
280
|
+
async function getComponentByViewerId(
|
|
281
|
+
modelId: string,
|
|
282
|
+
viewer_id: string | number,
|
|
283
|
+
): Promise<ModelComponentRecord | undefined> {
|
|
284
|
+
const component = await model_components_db
|
|
285
|
+
.where("viewer_id")
|
|
286
|
+
.equals(Number(viewer_id))
|
|
287
|
+
.and((model_component: ModelComponentRecord) => model_component.id === modelId)
|
|
288
|
+
.first();
|
|
289
|
+
return component;
|
|
290
|
+
}
|
|
291
|
+
async function deleteModelComponents(modelId: string): Promise<void> {
|
|
292
|
+
await model_components_db.where("id").equals(modelId).delete();
|
|
293
|
+
await model_components_relation_db.where("id").equals(modelId).delete();
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
async function deleteItem(id: string): Promise<void> {
|
|
297
|
+
await data_db.delete(id);
|
|
298
|
+
await deleteModelComponents(id);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
async function updateItem(id: string, changes: Partial<DataItem>): Promise<void> {
|
|
302
|
+
await data_db.update(id, changes);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
async function getAllModelComponentsViewerIds(modelId: string): Promise<number[]> {
|
|
306
|
+
const components = await model_components_db.where("id").equals(modelId).toArray();
|
|
307
|
+
return components.map((component: ModelComponentRecord) =>
|
|
308
|
+
Math.trunc(Number(component.viewer_id)),
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
async function getMeshComponentsViewerIds(
|
|
312
|
+
modelId: string,
|
|
313
|
+
meshComponentGeodeIds: readonly string[],
|
|
314
|
+
): Promise<number[]> {
|
|
315
|
+
const components = await model_components_db
|
|
316
|
+
.where("[id+geode_id]")
|
|
317
|
+
.anyOf(meshComponentGeodeIds.map((geode_id) => [modelId, geode_id]))
|
|
318
|
+
.toArray();
|
|
319
|
+
return components.map((component: ModelComponentRecord) =>
|
|
320
|
+
Math.trunc(Number(component.viewer_id)),
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
async function exportStores(): Promise<{
|
|
324
|
+
items: DataItem[];
|
|
325
|
+
modelComponents: ModelComponentRecord[];
|
|
326
|
+
modelComponentsRelations: ModelComponentRelationRecord[];
|
|
327
|
+
}> {
|
|
328
|
+
const items = await data_db.toArray();
|
|
329
|
+
const modelComponents = await model_components_db.toArray();
|
|
330
|
+
const modelComponentsRelations = await model_components_relation_db.toArray();
|
|
331
|
+
return {
|
|
332
|
+
items,
|
|
333
|
+
modelComponents,
|
|
334
|
+
modelComponentsRelations,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
async function clear(): Promise<void> {
|
|
339
|
+
await data_db.clear();
|
|
340
|
+
await model_components_db.clear();
|
|
341
|
+
await model_components_relation_db.clear();
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Dexie's bulkPut expects mutable arrays, so this snapshot parameter can't deeply satisfy
|
|
345
|
+
// The prefer-readonly-parameter-types rule; same pattern as app/utils/import_workflow.ts.
|
|
346
|
+
async function importStores(snapshot: {
|
|
347
|
+
readonly modelComponents: readonly ModelComponentRecord[];
|
|
348
|
+
readonly modelComponentsRelations: readonly ModelComponentRelationRecord[];
|
|
349
|
+
}): Promise<void> {
|
|
350
|
+
await clear();
|
|
351
|
+
await model_components_db.bulkPut(snapshot.modelComponents);
|
|
352
|
+
await model_components_relation_db.bulkPut(snapshot.modelComponentsRelations);
|
|
353
|
+
}
|
|
354
|
+
return {
|
|
355
|
+
refAllItems,
|
|
356
|
+
item,
|
|
357
|
+
allItems,
|
|
358
|
+
refItem,
|
|
359
|
+
isItemViewable,
|
|
360
|
+
meshComponentType,
|
|
361
|
+
registerObject,
|
|
362
|
+
deregisterObject,
|
|
363
|
+
addItem,
|
|
364
|
+
addComponents,
|
|
365
|
+
addComponentRelations,
|
|
366
|
+
deleteItem,
|
|
367
|
+
updateItem,
|
|
368
|
+
getAllModelComponentsViewerIds,
|
|
369
|
+
getMeshComponentsViewerIds,
|
|
370
|
+
getComponentByViewerId,
|
|
371
|
+
exportStores,
|
|
372
|
+
importStores,
|
|
373
|
+
clear,
|
|
374
|
+
formatedMeshComponents,
|
|
375
|
+
refFormatedMeshComponents,
|
|
376
|
+
getMeshComponentsByType,
|
|
377
|
+
getAllMeshComponents,
|
|
378
|
+
fetchAllMeshComponents,
|
|
379
|
+
getMeshComponentGeodeIds,
|
|
380
|
+
getCornersGeodeIds,
|
|
381
|
+
getLinesGeodeIds,
|
|
382
|
+
getSurfacesGeodeIds,
|
|
383
|
+
getBlocksGeodeIds,
|
|
384
|
+
hasCollectionComponents,
|
|
385
|
+
getAllCollectionComponents,
|
|
386
|
+
fetchAllCollectionComponents,
|
|
387
|
+
formatedCollectionComponents,
|
|
388
|
+
refFormatedCollectionComponents,
|
|
389
|
+
};
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
export type { DataItem, NewDataItem, ModelComponentInput, ModelComponentRelationRecord };
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { type FormattedComponent, type ModelComponentRecord, useDataMesh } from "./mesh.js";
|
|
2
|
+
import { MESH_COMPONENT_TYPES } from "@ogw_front/utils/default_styles";
|
|
3
|
+
import type { Observable } from "rxjs";
|
|
4
|
+
import type { Ref } from "vue";
|
|
5
|
+
import { getTable } from "@ogw_internal/database/database.js";
|
|
6
|
+
import { liveQuery } from "dexie";
|
|
7
|
+
import { useObservable } from "@vueuse/rxjs";
|
|
8
|
+
|
|
9
|
+
interface ModelComponentRelationRecord {
|
|
10
|
+
id: string;
|
|
11
|
+
parent: string;
|
|
12
|
+
child: string;
|
|
13
|
+
type: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface CollectionComponent extends FormattedComponent {
|
|
17
|
+
readonly children: readonly FormattedComponent[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface CollectionComponentGroup {
|
|
21
|
+
id: string;
|
|
22
|
+
title: string;
|
|
23
|
+
readonly children: readonly CollectionComponent[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function pluralize(type: string): string {
|
|
27
|
+
if (type.endsWith("y")) {
|
|
28
|
+
return `${type.slice(0, -1)}ies`;
|
|
29
|
+
}
|
|
30
|
+
return `${type}s`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// oxlint-disable-next-line eslint/max-lines-per-function
|
|
34
|
+
export function useDataCollections(): {
|
|
35
|
+
hasCollectionComponents: typeof hasCollectionComponents;
|
|
36
|
+
getAllCollectionComponents: typeof getAllCollectionComponents;
|
|
37
|
+
fetchAllCollectionComponents: typeof fetchAllCollectionComponents;
|
|
38
|
+
formatedCollectionComponents: typeof formatedCollectionComponents;
|
|
39
|
+
refFormatedCollectionComponents: typeof refFormatedCollectionComponents;
|
|
40
|
+
} {
|
|
41
|
+
const model_components_db = getTable<ModelComponentRecord>("model_components");
|
|
42
|
+
const model_components_relation_db = getTable<ModelComponentRelationRecord>(
|
|
43
|
+
"model_components_relation",
|
|
44
|
+
);
|
|
45
|
+
const { getAllMeshComponents } = useDataMesh();
|
|
46
|
+
|
|
47
|
+
async function hasCollectionComponents(modelId: string): Promise<boolean> {
|
|
48
|
+
const count = await model_components_db
|
|
49
|
+
.where("id")
|
|
50
|
+
.equals(modelId)
|
|
51
|
+
.and((component: ModelComponentRecord) => !MESH_COMPONENT_TYPES.includes(component.type))
|
|
52
|
+
.count();
|
|
53
|
+
return count > 0;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function getAllCollectionComponents(modelId: string): Promise<FormattedComponent[]> {
|
|
57
|
+
const items = await model_components_db.where("id").equals(modelId).toArray();
|
|
58
|
+
return items
|
|
59
|
+
.filter((component: ModelComponentRecord) => !MESH_COMPONENT_TYPES.includes(component.type))
|
|
60
|
+
.map((component: ModelComponentRecord) => ({
|
|
61
|
+
id: component.geode_id,
|
|
62
|
+
title: component.name,
|
|
63
|
+
category: component.type,
|
|
64
|
+
viewer_id: Number(component.viewer_id),
|
|
65
|
+
is_active: component.is_active,
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function fetchAllCollectionComponents(
|
|
70
|
+
modelId: string,
|
|
71
|
+
): Promise<Record<string, CollectionComponent[]>> {
|
|
72
|
+
const components = await getAllCollectionComponents(modelId);
|
|
73
|
+
const relations = await model_components_relation_db.where("id").equals(modelId).toArray();
|
|
74
|
+
const allMeshComponents = await getAllMeshComponents(modelId);
|
|
75
|
+
const meshComponentsById: Record<string, FormattedComponent> = {};
|
|
76
|
+
for (const meshComponent of allMeshComponents) {
|
|
77
|
+
meshComponentsById[meshComponent.id] = meshComponent;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const byType: Record<string, CollectionComponent[]> = {};
|
|
81
|
+
for (const component of components) {
|
|
82
|
+
byType[component.category] ??= [];
|
|
83
|
+
const itemRelations = relations.filter(
|
|
84
|
+
(relation: ModelComponentRelationRecord) =>
|
|
85
|
+
relation.parent === component.id && relation.type === "collection",
|
|
86
|
+
);
|
|
87
|
+
const children = itemRelations
|
|
88
|
+
.map((relation: ModelComponentRelationRecord) => meshComponentsById[relation.child])
|
|
89
|
+
.filter((child): child is FormattedComponent => Boolean(child));
|
|
90
|
+
byType[component.category]?.push({
|
|
91
|
+
...component,
|
|
92
|
+
children,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return byType;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function formatedCollectionComponents(
|
|
99
|
+
modelId: string,
|
|
100
|
+
): Promise<CollectionComponentGroup[]> {
|
|
101
|
+
const byType = await fetchAllCollectionComponents(modelId);
|
|
102
|
+
const collectionTypes = Object.keys(byType);
|
|
103
|
+
|
|
104
|
+
return collectionTypes
|
|
105
|
+
.filter((type) => (byType[type]?.length ?? 0) > 0)
|
|
106
|
+
.map((type) => ({
|
|
107
|
+
id: type,
|
|
108
|
+
title: pluralize(type),
|
|
109
|
+
children: byType[type] ?? [],
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function refFormatedCollectionComponents(
|
|
114
|
+
modelId: string,
|
|
115
|
+
): Ref<CollectionComponentGroup[] | undefined> {
|
|
116
|
+
return useObservable(
|
|
117
|
+
// Dexie's liveQuery returns its own Observable-like type, not rxjs's Observable, so bridging needs a cast.
|
|
118
|
+
liveQuery(async () => {
|
|
119
|
+
const groups = await formatedCollectionComponents(modelId);
|
|
120
|
+
return groups;
|
|
121
|
+
// oxlint-disable-next-line no-unsafe-type-assertion
|
|
122
|
+
}) as unknown as Observable<CollectionComponentGroup[]>,
|
|
123
|
+
{
|
|
124
|
+
initialValue: undefined,
|
|
125
|
+
},
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
hasCollectionComponents,
|
|
131
|
+
getAllCollectionComponents,
|
|
132
|
+
fetchAllCollectionComponents,
|
|
133
|
+
formatedCollectionComponents,
|
|
134
|
+
refFormatedCollectionComponents,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export type { CollectionComponent, CollectionComponentGroup, ModelComponentRelationRecord };
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { type Table, liveQuery } from "dexie";
|
|
2
|
+
import type { Observable } from "rxjs";
|
|
3
|
+
import { database } from "@ogw_internal/database/database.js";
|
|
4
|
+
import { useObservable } from "@vueuse/rxjs";
|
|
5
|
+
|
|
6
|
+
interface ModelComponentRecord {
|
|
7
|
+
id: string;
|
|
8
|
+
geode_id: string;
|
|
9
|
+
type: string;
|
|
10
|
+
viewer_id: string | number;
|
|
11
|
+
name: string;
|
|
12
|
+
is_active: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface FormattedComponent {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly title: string;
|
|
18
|
+
readonly category: string;
|
|
19
|
+
readonly viewer_id: number;
|
|
20
|
+
readonly is_active: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface FormattedComponentGroup {
|
|
24
|
+
id: string;
|
|
25
|
+
title: string;
|
|
26
|
+
readonly children: readonly FormattedComponent[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function toFormattedComponent(meshComponent: ModelComponentRecord): FormattedComponent {
|
|
30
|
+
return {
|
|
31
|
+
id: meshComponent.geode_id,
|
|
32
|
+
title: meshComponent.name,
|
|
33
|
+
category: meshComponent.type,
|
|
34
|
+
viewer_id: Math.trunc(Number(meshComponent.viewer_id)),
|
|
35
|
+
is_active: meshComponent.is_active,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// oxlint-disable-next-line eslint/max-lines-per-function
|
|
40
|
+
export function useDataMesh(): {
|
|
41
|
+
formatedMeshComponents: typeof formatedMeshComponents;
|
|
42
|
+
refFormatedMeshComponents: typeof refFormatedMeshComponents;
|
|
43
|
+
getMeshComponentsByType: typeof getMeshComponentsByType;
|
|
44
|
+
getAllMeshComponents: typeof getAllMeshComponents;
|
|
45
|
+
fetchAllMeshComponents: typeof fetchAllMeshComponents;
|
|
46
|
+
getMeshComponentGeodeIds: typeof getMeshComponentGeodeIds;
|
|
47
|
+
getCornersGeodeIds: typeof getCornersGeodeIds;
|
|
48
|
+
getLinesGeodeIds: typeof getLinesGeodeIds;
|
|
49
|
+
getSurfacesGeodeIds: typeof getSurfacesGeodeIds;
|
|
50
|
+
getBlocksGeodeIds: typeof getBlocksGeodeIds;
|
|
51
|
+
} {
|
|
52
|
+
// oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime.
|
|
53
|
+
const model_components_db = database.model_components as unknown as Table<
|
|
54
|
+
ModelComponentRecord,
|
|
55
|
+
string
|
|
56
|
+
>;
|
|
57
|
+
|
|
58
|
+
async function formatedMeshComponents(modelId: string): Promise<FormattedComponentGroup[]> {
|
|
59
|
+
const items = await model_components_db.where("id").equals(modelId).toArray();
|
|
60
|
+
const componentTitles: Record<string, string> = {
|
|
61
|
+
Corner: "Corners",
|
|
62
|
+
Line: "Lines",
|
|
63
|
+
Surface: "Surfaces",
|
|
64
|
+
Block: "Blocks",
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const componentsByType: Record<string, ModelComponentRecord[]> = {};
|
|
68
|
+
for (const component_item of items) {
|
|
69
|
+
if (componentTitles[component_item.type] !== undefined) {
|
|
70
|
+
componentsByType[component_item.type] ??= [];
|
|
71
|
+
componentsByType[component_item.type]?.push(component_item);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return Object.keys(componentTitles)
|
|
76
|
+
.filter((type) => componentsByType[type])
|
|
77
|
+
.map((type) => ({
|
|
78
|
+
id: type,
|
|
79
|
+
title: componentTitles[type] ?? type,
|
|
80
|
+
children: (componentsByType[type] ?? []).map((item: ModelComponentRecord) =>
|
|
81
|
+
toFormattedComponent(item),
|
|
82
|
+
),
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function refFormatedMeshComponents(modelId: string): Ref<FormattedComponentGroup[] | undefined> {
|
|
87
|
+
return useObservable(
|
|
88
|
+
liveQuery(async () => {
|
|
89
|
+
const components = await formatedMeshComponents(modelId);
|
|
90
|
+
return components;
|
|
91
|
+
// oxlint-disable-next-line no-unsafe-type-assertion
|
|
92
|
+
}) as unknown as Observable<FormattedComponentGroup[]>,
|
|
93
|
+
{
|
|
94
|
+
initialValue: undefined,
|
|
95
|
+
},
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function getMeshComponentsByType(
|
|
100
|
+
modelId: string,
|
|
101
|
+
type: string,
|
|
102
|
+
): Promise<FormattedComponent[]> {
|
|
103
|
+
const components = await model_components_db
|
|
104
|
+
.where("[id+type]")
|
|
105
|
+
.equals([modelId, type])
|
|
106
|
+
.toArray();
|
|
107
|
+
return components.map((item: ModelComponentRecord) => toFormattedComponent(item));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async function getAllMeshComponents(modelId: string): Promise<FormattedComponent[]> {
|
|
111
|
+
const items = await model_components_db.where("id").equals(modelId).toArray();
|
|
112
|
+
return items.map((item: ModelComponentRecord) => toFormattedComponent(item));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function fetchAllMeshComponents(
|
|
116
|
+
modelId: string,
|
|
117
|
+
): Promise<Record<string, FormattedComponent[]>> {
|
|
118
|
+
const components = await getAllMeshComponents(modelId);
|
|
119
|
+
const byType: Record<string, FormattedComponent[]> = {};
|
|
120
|
+
for (const component of components) {
|
|
121
|
+
byType[component.category] ??= [];
|
|
122
|
+
byType[component.category]?.push(component);
|
|
123
|
+
}
|
|
124
|
+
return byType;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function getMeshComponentGeodeIds(modelId: string, type: string): Promise<string[]> {
|
|
128
|
+
const components = await model_components_db
|
|
129
|
+
.where("[id+type]")
|
|
130
|
+
.equals([modelId, type])
|
|
131
|
+
.toArray();
|
|
132
|
+
return components.map((component: ModelComponentRecord) => component.geode_id);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function getCornersGeodeIds(modelId: string): Promise<string[]> {
|
|
136
|
+
const geodeIds = await getMeshComponentGeodeIds(modelId, "Corner");
|
|
137
|
+
return geodeIds;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
async function getLinesGeodeIds(modelId: string): Promise<string[]> {
|
|
141
|
+
const geodeIds = await getMeshComponentGeodeIds(modelId, "Line");
|
|
142
|
+
return geodeIds;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function getSurfacesGeodeIds(modelId: string): Promise<string[]> {
|
|
146
|
+
const geodeIds = await getMeshComponentGeodeIds(modelId, "Surface");
|
|
147
|
+
return geodeIds;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async function getBlocksGeodeIds(modelId: string): Promise<string[]> {
|
|
151
|
+
const geodeIds = await getMeshComponentGeodeIds(modelId, "Block");
|
|
152
|
+
return geodeIds;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return {
|
|
156
|
+
formatedMeshComponents,
|
|
157
|
+
refFormatedMeshComponents,
|
|
158
|
+
getMeshComponentsByType,
|
|
159
|
+
getAllMeshComponents,
|
|
160
|
+
fetchAllMeshComponents,
|
|
161
|
+
getMeshComponentGeodeIds,
|
|
162
|
+
getCornersGeodeIds,
|
|
163
|
+
getLinesGeodeIds,
|
|
164
|
+
getSurfacesGeodeIds,
|
|
165
|
+
getBlocksGeodeIds,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export type { ModelComponentRecord, FormattedComponent, FormattedComponentGroup };
|