@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.
Files changed (499) hide show
  1. package/.build/opengeodeweb_front_schemas.js +175 -0
  2. package/.build/server/utils/app_config.js +57 -0
  3. package/.build/server/utils/cleanup.js +135 -0
  4. package/.build/server/utils/cloud.js +156 -0
  5. package/.build/server/utils/microservices.js +153 -0
  6. package/.build/server/utils/path.js +108 -0
  7. package/.build/server/utils/scripts.js +134 -0
  8. package/.build/server/utils/server.js +44 -0
  9. package/.build/server/utils/server_config.js +51 -0
  10. package/.build/server/utils/stream.js +6 -0
  11. package/.build/server/utils/ws_client.js +100 -0
  12. package/.build/shared/app_mode.js +8 -0
  13. package/.build/shared/scripts.js +49 -0
  14. package/.build/shared/utils/call_raw.js +31 -0
  15. package/.build/shared/utils/call_schema.js +28 -0
  16. package/.build/shared/utils/fetch_raw.js +52 -0
  17. package/.build/shared/utils/fetch_schema.js +32 -0
  18. package/.build/shared/utils/file.js +14 -0
  19. package/.build/shared/utils/parse_boolean.js +23 -0
  20. package/.build/shared/utils/response_handlers/load.js +50 -0
  21. package/.build/shared/utils/types.js +1 -0
  22. package/.build/shared/utils/validate_schema.js +17 -0
  23. package/README.md +8 -0
  24. package/app/assets/{geode_objects.js → geode_objects.ts} +8 -1
  25. package/app/components/ActionButton.vue +28 -12
  26. package/app/components/Basic/Slider.vue +2 -2
  27. package/app/components/Basic/Switch.vue +2 -2
  28. package/app/components/CameraManager/List.vue +11 -11
  29. package/app/components/CameraManager/Saver.vue +8 -4
  30. package/app/components/CameraManager.vue +24 -12
  31. package/app/components/CameraOrientation.vue +31 -17
  32. package/app/components/ClippingPlaneCard.vue +13 -12
  33. package/app/components/ClippingPlanes.vue +31 -21
  34. package/app/components/CrsSelector.vue +26 -18
  35. package/app/components/DeleteDialog.vue +18 -16
  36. package/app/components/DragAndDrop.vue +55 -37
  37. package/app/components/DragAndDropInternal/DragAndDropInline.vue +31 -16
  38. package/app/components/DragAndDropInternal/DragAndDropOverlay.vue +32 -19
  39. package/app/components/ExtensionSelector.vue +34 -18
  40. package/app/components/FeedBack/ErrorBanner.vue +4 -3
  41. package/app/components/FeedBack/Snackers.vue +6 -5
  42. package/app/components/FetchingData.vue +8 -12
  43. package/app/components/FileSelector.vue +27 -17
  44. package/app/components/FileUploader.vue +51 -30
  45. package/app/components/GlassCard.vue +17 -13
  46. package/app/components/HybridRenderingView.vue +25 -12
  47. package/app/components/HybridViewerTooltip.vue +28 -26
  48. package/app/components/InfraConnected.vue +1 -1
  49. package/app/components/Launcher.vue +12 -10
  50. package/app/components/Loading/EcoMessages.vue +24 -13
  51. package/app/components/Loading/Header.vue +6 -7
  52. package/app/components/Loading/Progress.vue +6 -7
  53. package/app/components/Loading.vue +10 -14
  54. package/app/components/MissingFilesSelector.vue +35 -19
  55. package/app/components/ObjectSelector.vue +37 -21
  56. package/app/components/PackagesVersions.vue +16 -8
  57. package/app/components/Recaptcha.vue +17 -23
  58. package/app/components/RemoteRenderingView.vue +21 -15
  59. package/app/components/Ruler.vue +11 -9
  60. package/app/components/Screenshot.vue +25 -19
  61. package/app/components/SearchBar.vue +12 -6
  62. package/app/components/ShrinkFilter.vue +19 -14
  63. package/app/components/Step.vue +32 -12
  64. package/app/components/Stepper.vue +19 -7
  65. package/app/components/ToolPanel.vue +29 -13
  66. package/app/components/ViewToolbar.vue +53 -44
  67. package/app/components/Viewer/ContextMenu/CenterButton.vue +16 -9
  68. package/app/components/Viewer/ContextMenu/CircularItems.vue +13 -10
  69. package/app/components/Viewer/ContextMenu/ContextMenu.vue +40 -32
  70. package/app/components/Viewer/ContextMenu/ContextMenuItem.vue +31 -17
  71. package/app/components/Viewer/ContextMenu/InfoCard.vue +38 -22
  72. package/app/components/Viewer/EdgedCurve/PointsOptions.vue +8 -5
  73. package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +67 -48
  74. package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +74 -50
  75. package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +69 -50
  76. package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +47 -35
  77. package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +91 -51
  78. package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +74 -49
  79. package/app/components/Viewer/Generic/Model/BlocksOptions.vue +115 -53
  80. package/app/components/Viewer/Generic/Model/CornersOptions.vue +75 -37
  81. package/app/components/Viewer/Generic/Model/EdgesOptions.vue +13 -9
  82. package/app/components/Viewer/Generic/Model/LinesOptions.vue +110 -61
  83. package/app/components/Viewer/Generic/Model/ModelStyleCard.vue +32 -21
  84. package/app/components/Viewer/Generic/Model/ModelStyleOptions.vue +9 -5
  85. package/app/components/Viewer/Generic/Model/PointsOptions.vue +19 -13
  86. package/app/components/Viewer/Generic/Model/SurfacesOptions.vue +119 -49
  87. package/app/components/Viewer/Grid/2D/CellsOptions.vue +8 -5
  88. package/app/components/Viewer/Grid/2D/EdgesOptions.vue +8 -5
  89. package/app/components/Viewer/Grid/2D/PointsOptions.vue +8 -5
  90. package/app/components/Viewer/Grid/3D/CellsOptions.vue +8 -5
  91. package/app/components/Viewer/Grid/3D/EdgesOptions.vue +8 -5
  92. package/app/components/Viewer/Grid/3D/FacetsOptions.vue +8 -5
  93. package/app/components/Viewer/Grid/3D/PointsOptions.vue +8 -5
  94. package/app/components/Viewer/ObjectTree/Base/CommonTreeView.vue +120 -76
  95. package/app/components/Viewer/ObjectTree/Base/Controls.vue +25 -10
  96. package/app/components/Viewer/ObjectTree/Base/ItemLabel.vue +42 -17
  97. package/app/components/Viewer/ObjectTree/Base/StickyHeader.vue +22 -9
  98. package/app/components/Viewer/ObjectTree/Base/TreeRow.vue +29 -14
  99. package/app/components/Viewer/ObjectTree/Box.vue +32 -15
  100. package/app/components/Viewer/ObjectTree/Layout.vue +55 -35
  101. package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +63 -34
  102. package/app/components/Viewer/ObjectTree/Views/{ModelCollections.vue → ModelTree.vue} +101 -39
  103. package/app/components/Viewer/Options/AttributeColorBar.vue +14 -6
  104. package/app/components/Viewer/Options/AttributeRangeSelector.vue +8 -4
  105. package/app/components/Viewer/Options/AttributeSelector.vue +64 -33
  106. package/app/components/Viewer/Options/ColorMapList.vue +52 -24
  107. package/app/components/Viewer/Options/ColorMapPicker.vue +15 -11
  108. package/app/components/Viewer/Options/ColorPicker.vue +239 -50
  109. package/app/components/Viewer/Options/ColoringTypeSelector.vue +87 -67
  110. package/app/components/Viewer/Options/ColormapQuickPicker.vue +16 -12
  111. package/app/components/Viewer/Options/OptionsSection.vue +7 -5
  112. package/app/components/Viewer/Options/Sliders/Size.vue +3 -3
  113. package/app/components/Viewer/Options/Sliders/Slider.vue +9 -6
  114. package/app/components/Viewer/Options/Sliders/Width.vue +3 -3
  115. package/app/components/Viewer/Options/TextureItem.vue +29 -22
  116. package/app/components/Viewer/Options/TexturesSelector.vue +23 -12
  117. package/app/components/Viewer/Options/VisibilitySwitch.vue +3 -3
  118. package/app/components/Viewer/OverlappingObjectsPicker.vue +27 -12
  119. package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +38 -26
  120. package/app/components/Viewer/Solid/EdgesOptions.vue +8 -5
  121. package/app/components/Viewer/Solid/PointsOptions.vue +8 -5
  122. package/app/components/Viewer/Solid/PolygonsOptions.vue +8 -5
  123. package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +73 -48
  124. package/app/components/Viewer/Surface/EdgesOptions.vue +8 -5
  125. package/app/components/Viewer/Surface/PointsOptions.vue +8 -5
  126. package/app/components/Viewer/Surface/PolygonsOptions.vue +79 -49
  127. package/app/components/Viewer/Surface/Triangulated/TrianglesOptions.vue +8 -5
  128. package/app/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue +8 -5
  129. package/app/components/Viewer/TetrahedralSolid/TrianglesOptions.vue +8 -5
  130. package/app/components/Viewer/Ui.vue +19 -14
  131. package/app/components/Wrapper.vue +16 -10
  132. package/app/components/ZScaling.vue +18 -10
  133. package/app/components/csv-preview/CsvPreviewer.vue +72 -50
  134. package/app/components/csv-preview/CsvSettings.vue +30 -50
  135. package/app/components/csv-preview/CsvTable.vue +34 -14
  136. package/app/composables/{batch_style.js → batch_style.ts} +9 -7
  137. package/app/composables/clipping_planes_widget.ts +204 -0
  138. package/app/composables/clipping_planes_widget_entries.ts +189 -0
  139. package/app/composables/copy_to_clipboard.ts +7 -0
  140. package/app/composables/global_attribute_style.ts +303 -0
  141. package/app/composables/hover_highlight.ts +127 -0
  142. package/app/composables/{model_collections.js → model_collections.ts} +28 -9
  143. package/app/composables/{model_components.js → model_components.ts} +28 -9
  144. package/app/composables/{project_manager.js → project_manager.ts} +77 -20
  145. package/app/composables/responsive_middle_truncate.ts +48 -0
  146. package/app/composables/{run_function_when_microservices_connected.js → run_function_when_microservices_connected.ts} +1 -1
  147. package/app/composables/stepper_tree.ts +79 -0
  148. package/app/composables/tree_filter.ts +194 -0
  149. package/app/composables/{tree_keyboard_nav.js → tree_keyboard_nav.ts} +62 -20
  150. package/app/composables/{tree_scroll.js → tree_scroll.ts} +61 -12
  151. package/app/composables/use_adaptive_styles.ts +186 -0
  152. package/app/composables/use_overlapping_picker.ts +263 -0
  153. package/app/composables/use_quick_colormap.ts +55 -0
  154. package/app/composables/virtual_tree.ts +271 -0
  155. package/app/composables/vtk_implicit_plane_widget.d.ts +2 -0
  156. package/app/plugins/{auto_store_register.js → auto_store_register.ts} +3 -5
  157. package/app/plugins/click_outside_ignore_snackbars.client.ts +36 -0
  158. package/app/stores/app.ts +252 -0
  159. package/app/stores/app_helpers/extension.ts +179 -0
  160. package/app/stores/{back.js → back.ts} +54 -28
  161. package/app/stores/camera_manager.ts +80 -0
  162. package/app/stores/{cloud.js → cloud.ts} +18 -13
  163. package/app/stores/data.ts +392 -0
  164. package/app/stores/data_helpers/collections.ts +138 -0
  165. package/app/stores/data_helpers/mesh.ts +169 -0
  166. package/app/stores/data_style.ts +167 -0
  167. package/app/stores/{feedback.js → feedback.ts} +19 -8
  168. package/app/stores/{hybrid_viewer.js → hybrid_viewer.ts} +49 -45
  169. package/app/stores/infra.ts +106 -0
  170. package/app/stores/{menu.js → menu.ts} +67 -36
  171. package/app/stores/treeview.ts +383 -0
  172. package/app/stores/{viewer.js → viewer.ts} +75 -42
  173. package/app/utils/attributes.ts +40 -0
  174. package/app/utils/clipping_planes.ts +222 -0
  175. package/app/utils/color_picker.js +54 -0
  176. package/app/utils/colormap.ts +102 -0
  177. package/app/utils/default_styles/{constants.js → constants.ts} +25 -12
  178. package/app/utils/default_styles/{index.js → index.ts} +4 -3
  179. package/app/utils/default_styles/meshes.ts +264 -0
  180. package/app/utils/default_styles/{models.js → models.ts} +106 -52
  181. package/app/utils/{extension.js → extension.ts} +63 -19
  182. package/app/utils/{import_workflow.js → import_workflow.ts} +39 -22
  183. package/app/utils/{log.js → log.ts} +12 -2
  184. package/app/utils/{name_cleaner.js → name_cleaner.ts} +6 -6
  185. package/app/utils/status.ts +19 -0
  186. package/app/utils/{stores.js → stores.ts} +5 -5
  187. package/app/utils/{string.js → string.ts} +6 -6
  188. package/app/utils/{treeview.js → treeview.ts} +4 -1
  189. package/internal/database/{base_database.js → base_database.ts} +7 -3
  190. package/internal/database/database.ts +102 -0
  191. package/internal/database/{extended_database.js → extended_database.ts} +5 -1
  192. package/internal/database/tables/camera_positions.ts +6 -0
  193. package/internal/database/tables/{data.js → data.ts} +3 -1
  194. package/internal/database/tables/data_style.ts +6 -0
  195. package/internal/database/tables/model_component_datastyle.ts +6 -0
  196. package/internal/database/tables/model_component_type_datastyle.ts +6 -0
  197. package/internal/database/tables/model_components.ts +6 -0
  198. package/internal/database/tables/model_components_relation.ts +6 -0
  199. package/internal/database/tables/table_definition.ts +5 -0
  200. package/internal/stores/data_style/mesh/cells/cell.ts +279 -0
  201. package/internal/stores/data_style/mesh/cells/{color.js → color.ts} +13 -7
  202. package/internal/stores/data_style/mesh/cells/common.ts +50 -0
  203. package/internal/stores/data_style/mesh/cells/index.ts +161 -0
  204. package/internal/stores/data_style/mesh/cells/{textures.js → textures.ts} +14 -8
  205. package/internal/stores/data_style/mesh/cells/vertex.ts +285 -0
  206. package/internal/stores/data_style/mesh/cells/visibility.ts +46 -0
  207. package/internal/stores/data_style/mesh/edges/{color.js → color.ts} +13 -7
  208. package/internal/stores/data_style/mesh/edges/common.ts +41 -0
  209. package/internal/stores/data_style/mesh/edges/edge.ts +279 -0
  210. package/internal/stores/data_style/mesh/edges/index.ts +155 -0
  211. package/internal/stores/data_style/mesh/edges/vertex.ts +285 -0
  212. package/internal/stores/data_style/mesh/edges/visibility.ts +45 -0
  213. package/internal/stores/data_style/mesh/edges/width.ts +42 -0
  214. package/internal/stores/data_style/mesh/{index.js → index.ts} +34 -14
  215. package/internal/stores/data_style/mesh/points/{color.js → color.ts} +13 -7
  216. package/internal/stores/data_style/mesh/points/common.ts +51 -0
  217. package/internal/stores/data_style/mesh/points/index.ts +133 -0
  218. package/internal/stores/data_style/mesh/points/size.ts +43 -0
  219. package/internal/stores/data_style/mesh/points/vertex.ts +285 -0
  220. package/internal/stores/data_style/mesh/points/visibility.ts +49 -0
  221. package/internal/stores/data_style/mesh/polygons/{color.js → color.ts} +13 -7
  222. package/internal/stores/data_style/mesh/polygons/common.ts +50 -0
  223. package/internal/stores/data_style/mesh/polygons/index.ts +167 -0
  224. package/internal/stores/data_style/mesh/polygons/polygon.ts +282 -0
  225. package/internal/stores/data_style/mesh/polygons/{textures.js → textures.ts} +14 -8
  226. package/internal/stores/data_style/mesh/polygons/vertex.ts +288 -0
  227. package/internal/stores/data_style/mesh/polygons/visibility.ts +48 -0
  228. package/internal/stores/data_style/mesh/polyhedra/{color.js → color.ts} +13 -7
  229. package/internal/stores/data_style/mesh/polyhedra/common.ts +41 -0
  230. package/internal/stores/data_style/mesh/polyhedra/index.ts +157 -0
  231. package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +294 -0
  232. package/internal/stores/data_style/mesh/polyhedra/vertex.ts +288 -0
  233. package/internal/stores/data_style/mesh/polyhedra/visibility.ts +48 -0
  234. package/internal/stores/data_style/model/blocks/{color.js → color.ts} +50 -13
  235. package/internal/stores/data_style/model/blocks/common.ts +67 -0
  236. package/internal/stores/data_style/model/blocks/{index.js → index.ts} +111 -66
  237. package/internal/stores/data_style/model/blocks/polyhedron.ts +363 -0
  238. package/internal/stores/data_style/model/blocks/vertex.ts +349 -0
  239. package/internal/stores/data_style/model/blocks/visibility.ts +37 -0
  240. package/internal/stores/data_style/model/color.ts +348 -0
  241. package/internal/stores/data_style/model/common.ts +262 -0
  242. package/internal/stores/data_style/model/corners/{color.js → color.ts} +49 -10
  243. package/internal/stores/data_style/model/corners/common.ts +71 -0
  244. package/internal/stores/data_style/model/corners/{index.js → index.ts} +86 -47
  245. package/internal/stores/data_style/model/corners/vertex.ts +315 -0
  246. package/internal/stores/data_style/model/corners/visibility.ts +39 -0
  247. package/internal/stores/data_style/model/edges/common.ts +29 -0
  248. package/internal/stores/data_style/model/edges/{index.js → index.ts} +2 -7
  249. package/internal/stores/data_style/model/edges/visibility.ts +55 -0
  250. package/internal/stores/data_style/model/{index.js → index.ts} +24 -11
  251. package/internal/stores/data_style/model/lines/{color.js → color.ts} +47 -10
  252. package/internal/stores/data_style/model/lines/common.ts +63 -0
  253. package/internal/stores/data_style/model/lines/edge.ts +343 -0
  254. package/internal/stores/data_style/model/lines/{index.js → index.ts} +108 -66
  255. package/internal/stores/data_style/model/lines/vertex.ts +344 -0
  256. package/internal/stores/data_style/model/lines/visibility.ts +37 -0
  257. package/internal/stores/data_style/model/points/common.ts +25 -0
  258. package/internal/stores/data_style/model/points/index.ts +35 -0
  259. package/internal/stores/data_style/model/points/size.ts +44 -0
  260. package/internal/stores/data_style/model/points/visibility.ts +46 -0
  261. package/internal/stores/data_style/model/selection.ts +138 -0
  262. package/internal/stores/data_style/model/surfaces/{color.js → color.ts} +47 -10
  263. package/internal/stores/data_style/model/surfaces/common.ts +69 -0
  264. package/internal/stores/data_style/model/surfaces/{index.js → index.ts} +113 -66
  265. package/internal/stores/data_style/model/surfaces/polygon.ts +347 -0
  266. package/internal/stores/data_style/model/surfaces/vertex.ts +351 -0
  267. package/internal/stores/data_style/model/surfaces/visibility.ts +37 -0
  268. package/internal/stores/data_style/model/{visibility.js → visibility.ts} +112 -32
  269. package/internal/stores/data_style/state.ts +281 -0
  270. package/internal/stores/data_style/types.ts +30 -0
  271. package/internal/stores/hybrid_viewer/brightness.ts +124 -0
  272. package/internal/stores/hybrid_viewer/camera.ts +326 -0
  273. package/internal/stores/hybrid_viewer/{camera_animation.js → camera_animation.ts} +30 -12
  274. package/internal/stores/hybrid_viewer/{constants.js → constants.ts} +2 -2
  275. package/internal/stores/hybrid_viewer/core.ts +64 -0
  276. package/internal/stores/hybrid_viewer/{filters.js → filters.ts} +10 -13
  277. package/internal/stores/hybrid_viewer/highlight.ts +183 -0
  278. package/internal/stores/hybrid_viewer/{ruler.js → ruler.ts} +50 -22
  279. package/internal/stores/hybrid_viewer/scene.ts +125 -0
  280. package/internal/stores/hybrid_viewer/viewport.ts +177 -0
  281. package/internal/stores/hybrid_viewer/vtk_types.ts +58 -0
  282. package/internal/utils/api_fetch.ts +133 -0
  283. package/internal/utils/upload_file.ts +115 -0
  284. package/internal/utils/viewer_call.ts +99 -0
  285. package/internal/utils/ws_client.ts +54 -0
  286. package/nuxt.config.ts +168 -0
  287. package/opengeodeweb_front_schemas.json +2 -2
  288. package/package.json +49 -13
  289. package/server/api/cloud/extensions/{run.post.js → run.post.ts} +16 -12
  290. package/server/api/local/app/project_folder_path.post.ts +33 -0
  291. package/server/api/local/app/run_back.post.ts +39 -0
  292. package/server/api/local/app/run_viewer.post.ts +39 -0
  293. package/server/api/local/extensions/{kill.post.js → kill.post.ts} +15 -8
  294. package/server/api/local/extensions/{run.post.js → run.post.ts} +17 -12
  295. package/server/api/local/extensions/upload.put.ts +71 -0
  296. package/server/api/microservice/app/{get_is_app_ready.get.js → get_is_app_ready.get.ts} +5 -5
  297. package/server/api/microservice/app/schemas/get_is_app_ready.json +1 -1
  298. package/server/api/microservice/app/set_app_base_url.post.ts +29 -0
  299. package/server/api/microservice/app/set_back_base_url.post.ts +26 -0
  300. package/server/api/microservice/app/set_is_app_ready.post.ts +29 -0
  301. package/server/api/microservice/app/set_viewer_base_url.post.ts +26 -0
  302. package/server/api/microservice/extensions/{download.post.js → download.post.ts} +13 -6
  303. package/server/api/serverless/run_cloud.post.ts +92 -0
  304. package/server/utils/{app_config.js → app_config.ts} +40 -18
  305. package/server/utils/{cleanup.js → cleanup.ts} +76 -29
  306. package/server/utils/{cloud.js → cloud.ts} +33 -17
  307. package/server/utils/{extension.js → extension.ts} +31 -4
  308. package/server/utils/{microservices.js → microservices.ts} +68 -27
  309. package/server/utils/{path.js → path.ts} +36 -17
  310. package/server/utils/{scripts.js → scripts.ts} +49 -33
  311. package/server/utils/{server.js → server.ts} +13 -6
  312. package/server/utils/server_config.ts +74 -0
  313. package/server/utils/stream.ts +6 -0
  314. package/server/utils/ws_client.ts +165 -0
  315. package/shared/{scripts.js → scripts.ts} +15 -10
  316. package/shared/utils/call_raw.ts +73 -0
  317. package/shared/utils/{call_schema.js → call_schema.ts} +15 -6
  318. package/shared/utils/fetch_raw.ts +125 -0
  319. package/shared/utils/{fetch_schema.js → fetch_schema.ts} +16 -7
  320. package/shared/utils/file.ts +22 -0
  321. package/shared/utils/{parse_boolean.js → parse_boolean.ts} +1 -1
  322. package/shared/utils/response_handlers/load.ts +109 -0
  323. package/shared/utils/types.ts +27 -0
  324. package/shared/utils/{validate_schema.js → validate_schema.ts} +3 -1
  325. package/.github/workflows/config.json +0 -5
  326. package/.github/workflows/deploy.yml +0 -15
  327. package/.github/workflows/manual_release.yml +0 -11
  328. package/.github/workflows/merge_request.yml +0 -9
  329. package/.github/workflows/pr_update.yml +0 -11
  330. package/.github/workflows/prepare_deploy.yml +0 -9
  331. package/.github/workflows/schedule.yml +0 -18
  332. package/.github/workflows/test.yml +0 -14
  333. package/.github/workflows/test_pr.yml +0 -12
  334. package/.oxlintrc.json +0 -150
  335. package/.releaserc +0 -11
  336. package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +0 -224
  337. package/app/composables/clipping_planes_widget.js +0 -249
  338. package/app/composables/global_attribute_style.js +0 -181
  339. package/app/composables/hover_highlight.js +0 -91
  340. package/app/composables/responsive_middle_truncate.js +0 -34
  341. package/app/composables/stepper_tree.js +0 -56
  342. package/app/composables/tree_filter.js +0 -138
  343. package/app/composables/use_adaptive_styles.js +0 -120
  344. package/app/composables/use_overlapping_picker.js +0 -169
  345. package/app/composables/use_quick_colormap.js +0 -32
  346. package/app/composables/virtual_tree.js +0 -191
  347. package/app/stores/app.js +0 -326
  348. package/app/stores/camera_manager.js +0 -57
  349. package/app/stores/data.js +0 -278
  350. package/app/stores/data_helpers/collections.js +0 -96
  351. package/app/stores/data_helpers/mesh.js +0 -122
  352. package/app/stores/data_style.js +0 -116
  353. package/app/stores/infra.js +0 -95
  354. package/app/stores/treeview.js +0 -290
  355. package/app/utils/attributes.js +0 -23
  356. package/app/utils/clipping_planes.js +0 -110
  357. package/app/utils/colormap.js +0 -64
  358. package/app/utils/default_styles/meshes.js +0 -191
  359. package/app/utils/status.js +0 -10
  360. package/commitlint.config.js +0 -20
  361. package/internal/database/database.js +0 -80
  362. package/internal/database/tables/camera_positions.js +0 -4
  363. package/internal/database/tables/data_style.js +0 -4
  364. package/internal/database/tables/model_component_datastyle.js +0 -4
  365. package/internal/database/tables/model_component_type_datastyle.js +0 -4
  366. package/internal/database/tables/model_components.js +0 -4
  367. package/internal/database/tables/model_components_relation.js +0 -4
  368. package/internal/stores/data_style/mesh/cells/cell.js +0 -196
  369. package/internal/stores/data_style/mesh/cells/common.js +0 -39
  370. package/internal/stores/data_style/mesh/cells/index.js +0 -81
  371. package/internal/stores/data_style/mesh/cells/vertex.js +0 -193
  372. package/internal/stores/data_style/mesh/cells/visibility.js +0 -35
  373. package/internal/stores/data_style/mesh/edges/common.js +0 -32
  374. package/internal/stores/data_style/mesh/edges/edge.js +0 -195
  375. package/internal/stores/data_style/mesh/edges/index.js +0 -81
  376. package/internal/stores/data_style/mesh/edges/vertex.js +0 -196
  377. package/internal/stores/data_style/mesh/edges/visibility.js +0 -34
  378. package/internal/stores/data_style/mesh/edges/width.js +0 -34
  379. package/internal/stores/data_style/mesh/points/common.js +0 -37
  380. package/internal/stores/data_style/mesh/points/index.js +0 -82
  381. package/internal/stores/data_style/mesh/points/size.js +0 -35
  382. package/internal/stores/data_style/mesh/points/vertex.js +0 -193
  383. package/internal/stores/data_style/mesh/points/visibility.js +0 -37
  384. package/internal/stores/data_style/mesh/polygons/common.js +0 -32
  385. package/internal/stores/data_style/mesh/polygons/index.js +0 -107
  386. package/internal/stores/data_style/mesh/polygons/polygon.js +0 -196
  387. package/internal/stores/data_style/mesh/polygons/vertex.js +0 -196
  388. package/internal/stores/data_style/mesh/polygons/visibility.js +0 -38
  389. package/internal/stores/data_style/mesh/polyhedra/common.js +0 -32
  390. package/internal/stores/data_style/mesh/polyhedra/index.js +0 -98
  391. package/internal/stores/data_style/mesh/polyhedra/polyhedron.js +0 -196
  392. package/internal/stores/data_style/mesh/polyhedra/vertex.js +0 -196
  393. package/internal/stores/data_style/mesh/polyhedra/visibility.js +0 -38
  394. package/internal/stores/data_style/model/blocks/common.js +0 -51
  395. package/internal/stores/data_style/model/blocks/polyhedron.js +0 -215
  396. package/internal/stores/data_style/model/blocks/vertex.js +0 -204
  397. package/internal/stores/data_style/model/blocks/visibility.js +0 -20
  398. package/internal/stores/data_style/model/color.js +0 -218
  399. package/internal/stores/data_style/model/common.js +0 -141
  400. package/internal/stores/data_style/model/corners/common.js +0 -51
  401. package/internal/stores/data_style/model/corners/vertex.js +0 -204
  402. package/internal/stores/data_style/model/corners/visibility.js +0 -20
  403. package/internal/stores/data_style/model/edges/common.js +0 -20
  404. package/internal/stores/data_style/model/edges/visibility.js +0 -38
  405. package/internal/stores/data_style/model/lines/common.js +0 -51
  406. package/internal/stores/data_style/model/lines/edge.js +0 -203
  407. package/internal/stores/data_style/model/lines/vertex.js +0 -204
  408. package/internal/stores/data_style/model/lines/visibility.js +0 -20
  409. package/internal/stores/data_style/model/points/common.js +0 -20
  410. package/internal/stores/data_style/model/points/index.js +0 -25
  411. package/internal/stores/data_style/model/points/size.js +0 -36
  412. package/internal/stores/data_style/model/points/visibility.js +0 -36
  413. package/internal/stores/data_style/model/selection.js +0 -89
  414. package/internal/stores/data_style/model/surfaces/common.js +0 -51
  415. package/internal/stores/data_style/model/surfaces/polygon.js +0 -215
  416. package/internal/stores/data_style/model/surfaces/vertex.js +0 -215
  417. package/internal/stores/data_style/model/surfaces/visibility.js +0 -20
  418. package/internal/stores/data_style/state.js +0 -197
  419. package/internal/stores/hybrid_viewer/brightness.js +0 -82
  420. package/internal/stores/hybrid_viewer/camera.js +0 -274
  421. package/internal/stores/hybrid_viewer/highlight.js +0 -170
  422. package/internal/stores/hybrid_viewer/scene.js +0 -136
  423. package/internal/stores/hybrid_viewer/viewport.js +0 -140
  424. package/internal/utils/api_fetch.js +0 -52
  425. package/internal/utils/upload_file.js +0 -57
  426. package/internal/utils/viewer_call.js +0 -49
  427. package/internal/utils/ws_client.js +0 -29
  428. package/nuxt.config.js +0 -106
  429. package/scripts/generate_geode_objects.js +0 -24
  430. package/server/api/local/app/project_folder_path.post.js +0 -29
  431. package/server/api/local/app/run_back.post.js +0 -33
  432. package/server/api/local/app/run_viewer.post.js +0 -33
  433. package/server/api/local/extensions/upload.put.js +0 -72
  434. package/server/api/microservice/app/set_app_base_url.post.js +0 -25
  435. package/server/api/microservice/app/set_back_base_url.post.js +0 -22
  436. package/server/api/microservice/app/set_is_app_ready.post.js +0 -25
  437. package/server/api/microservice/app/set_viewer_base_url.post.js +0 -22
  438. package/server/api/serverless/run_cloud.post.js +0 -44
  439. package/server/utils/server_config.js +0 -58
  440. package/server/utils/ws_client.js +0 -112
  441. package/shared/utils/call_raw.js +0 -46
  442. package/shared/utils/fetch_raw.js +0 -61
  443. package/shared/utils/file.js +0 -16
  444. package/shared/utils/response_handlers/load.js +0 -74
  445. package/tests/integration/data/uploads/test.og_brep +0 -0
  446. package/tests/integration/data/uploads/test.og_edc2d +0 -0
  447. package/tests/integration/data/uploads/test.og_edc3d +0 -0
  448. package/tests/integration/data/uploads/test.og_psf3d +0 -0
  449. package/tests/integration/data/uploads/test.og_rgd2d +0 -0
  450. package/tests/integration/data/uploads/test.og_rgd3d +0 -0
  451. package/tests/integration/data/uploads/test.vtu +0 -22
  452. package/tests/integration/setup.js +0 -92
  453. package/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +0 -343
  454. package/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +0 -254
  455. package/tests/integration/stores/data_style/mesh/index.nuxt.test.js +0 -62
  456. package/tests/integration/stores/data_style/mesh/points.nuxt.test.js +0 -201
  457. package/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +0 -260
  458. package/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +0 -267
  459. package/tests/integration/stores/data_style/model/blocks.nuxt.test.js +0 -397
  460. package/tests/integration/stores/data_style/model/corners.nuxt.test.js +0 -264
  461. package/tests/integration/stores/data_style/model/edges.nuxt.test.js +0 -71
  462. package/tests/integration/stores/data_style/model/index.nuxt.test.js +0 -92
  463. package/tests/integration/stores/data_style/model/lines.nuxt.test.js +0 -379
  464. package/tests/integration/stores/data_style/model/points.nuxt.test.js +0 -95
  465. package/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +0 -574
  466. package/tests/integration/stores/viewer.nuxt.test.js +0 -69
  467. package/tests/setup_indexeddb.js +0 -4
  468. package/tests/unit/components/CrsSelector.nuxt.test.js +0 -55
  469. package/tests/unit/components/DragAndDrop.nuxt.test.js +0 -89
  470. package/tests/unit/components/ExtensionSelector.nuxt.test.js +0 -65
  471. package/tests/unit/components/FeedBack/ErrorsBanner.nuxt.test.js +0 -41
  472. package/tests/unit/components/FeedBack/Snackers.nuxt.test.js +0 -49
  473. package/tests/unit/components/FileSelector.nuxt.test.js +0 -124
  474. package/tests/unit/components/FileUploader.nuxt.test.js +0 -69
  475. package/tests/unit/components/MissingFilesSelector.nuxt.test.js +0 -77
  476. package/tests/unit/components/ObjectSelector.nuxt.test.js +0 -118
  477. package/tests/unit/components/PackagesVersions.nuxt.test.js +0 -42
  478. package/tests/unit/components/Step.nuxt.test.js +0 -51
  479. package/tests/unit/components/Stepper.nuxt.test.js +0 -41
  480. package/tests/unit/components/ToolPanel.nuxt.test.js +0 -66
  481. package/tests/unit/composables/api_fetch.nuxt.test.js +0 -75
  482. package/tests/unit/composables/project_manager.nuxt.test.js +0 -299
  483. package/tests/unit/composables/run_function_when_microservices_connected.nuxt.test.js +0 -57
  484. package/tests/unit/composables/upload_file.nuxt.test.js +0 -45
  485. package/tests/unit/composables/virtual_tree.nuxt.test.js +0 -63
  486. package/tests/unit/plugins/project_load.nuxt.test.js +0 -98
  487. package/tests/unit/stores/app.nuxt.test.js +0 -189
  488. package/tests/unit/stores/back.nuxt.test.js +0 -147
  489. package/tests/unit/stores/cloud.nuxt.test.js +0 -90
  490. package/tests/unit/stores/data.nuxt.test.js +0 -162
  491. package/tests/unit/stores/feedback.nuxt.test.js +0 -90
  492. package/tests/unit/stores/infra.nuxt.test.js +0 -313
  493. package/tests/unit/stores/treeview.nuxt.test.js +0 -63
  494. package/tests/unit/stores/viewer.nuxt.test.js +0 -161
  495. package/tests/unit/utils/validate_schema.nuxt.test.js +0 -38
  496. package/tests/utils.js +0 -20
  497. package/tests/vitest.config.js +0 -67
  498. /package/server/api/local/app/{kill.post.js → kill.post.ts} +0 -0
  499. /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
- export function useModelCollections(viewId) {
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((category) => category.id === newCategory.id);
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
- export function useModelComponents(viewId) {
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((category) => category.id === newCategory.id);
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 {