@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,183 @@
1
+ import { HOVER_DEBOUNCE_MS, HOVER_TIMEOUT_MS } from "./constants";
2
+ import type { HoverComponentInfo, HoverData } from "./vtk_types";
3
+ import type { IndexableType } from "dexie";
4
+ import { database } from "@ogw_internal/database/database.js";
5
+ import { useHybridViewerCore } from "./core";
6
+ import { useHybridViewerScene } from "./scene";
7
+ import { useViewerStore } from "@ogw_front/stores/viewer";
8
+ import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
9
+
10
+ // The dynamic/RPC-shaped payload of the viewer's "highlight" schema response.
11
+ interface HighlightResponse {
12
+ id?: string;
13
+ picked_id?: number;
14
+ field_type?: string;
15
+ geode_id?: string | null;
16
+ attributes?: Record<string, unknown>;
17
+ }
18
+
19
+ // Shared via createSharedComposable (rather than merged into the parent hybridViewer store) so sibling slices, e.g. ruler.ts and viewport.ts, can read hover state/clearHoverHighlight/hoverHighlight directly without importing the parent store and creating a cycle. A Pinia store would work too but its $id/$patch/... properties would leak into the composed store's spread and collapse its inferred type.
20
+ const useHybridViewerHighlight = createSharedComposable(() => {
21
+ const is_hover_highlight = ref(false);
22
+ const hover_highlight_field_type = ref("CELL");
23
+ const hoverData = ref<HoverData | undefined>(undefined);
24
+ const hoverPosition = ref({
25
+ x: 0,
26
+ y: 0,
27
+ });
28
+ const hoverTimeoutRef = ref<ReturnType<typeof setTimeout> | undefined>(undefined);
29
+ const currentHoverId = ref<string | undefined>(undefined);
30
+
31
+ function clearHoverData(): void {
32
+ if (hoverTimeoutRef.value) {
33
+ clearTimeout(hoverTimeoutRef.value);
34
+ hoverTimeoutRef.value = undefined;
35
+ }
36
+ hoverData.value = undefined;
37
+ currentHoverId.value = undefined;
38
+ }
39
+
40
+ function requestHoverHighlight(
41
+ event: MouseEvent,
42
+ onResponse: (response: unknown) => void | Promise<void>,
43
+ ): void {
44
+ if (!is_hover_highlight.value) {
45
+ return;
46
+ }
47
+ const { genericRenderWindow } = useHybridViewerCore();
48
+ const { hybridDb } = useHybridViewerScene();
49
+ const container = genericRenderWindow.value?.getContainer();
50
+ if (!container) {
51
+ return;
52
+ }
53
+ const viewerStore = useViewerStore();
54
+ const rect = container.getBoundingClientRect();
55
+ const schema = viewer_schemas.opengeodeweb_viewer.viewer.highlight;
56
+ const params = {
57
+ x: Math.round(event.clientX - rect.left),
58
+ y: Math.round(rect.height - (event.clientY - rect.top)),
59
+ field_type: hover_highlight_field_type.value,
60
+ ids: Object.keys(hybridDb),
61
+ };
62
+ viewerStore
63
+ .request(
64
+ {
65
+ schema,
66
+ params,
67
+ },
68
+ {
69
+ response_function: onResponse,
70
+ },
71
+ )
72
+ // oxlint-disable-next-line promise/prefer-await-to-then -- fire-and-forget inside a sync caller; see codebase convention in global_attribute_style.ts.
73
+ .catch(() => undefined);
74
+ }
75
+
76
+ const hoverHighlight = useDebounceFn((event: MouseEvent) => {
77
+ const { genericRenderWindow } = useHybridViewerCore();
78
+ const containerElement = genericRenderWindow.value?.getContainer();
79
+ const relativeMousePosition = containerElement
80
+ ? {
81
+ x: event.clientX - containerElement.getBoundingClientRect().left,
82
+ y: event.clientY - containerElement.getBoundingClientRect().top,
83
+ }
84
+ : {
85
+ x: event.clientX,
86
+ y: event.clientY,
87
+ };
88
+ requestHoverHighlight(event, async (rawResponse: unknown) => {
89
+ // oxlint-disable-next-line no-unsafe-type-assertion -- trusted viewer RPC response boundary.
90
+ const response = rawResponse as HighlightResponse | undefined;
91
+ if (
92
+ !is_hover_highlight.value ||
93
+ response === undefined ||
94
+ response.id === undefined ||
95
+ response.picked_id === undefined ||
96
+ response.picked_id === -1
97
+ ) {
98
+ clearHoverData();
99
+ return;
100
+ }
101
+ const hoverKey = `${response.id}_${response.field_type}_${response.picked_id}`;
102
+ if (currentHoverId.value === hoverKey) {
103
+ return;
104
+ }
105
+ if (hoverTimeoutRef.value) {
106
+ clearTimeout(hoverTimeoutRef.value);
107
+ hoverTimeoutRef.value = undefined;
108
+ }
109
+ hoverData.value = undefined;
110
+ currentHoverId.value = hoverKey;
111
+ let componentInfo: HoverComponentInfo | undefined = undefined;
112
+ let modelName: string | undefined = undefined;
113
+ const modelRecord = (await database.data?.get(response.id)) as { name?: string } | undefined;
114
+ if (modelRecord) {
115
+ modelName = modelRecord.name;
116
+ }
117
+ const modelComponentsTable = database.model_components;
118
+ if (response.geode_id !== undefined && response.geode_id !== null && modelComponentsTable) {
119
+ const components = modelComponentsTable.where("[id+geode_id]");
120
+ const query = components.equals([response.id, response.geode_id] as IndexableType);
121
+ const component = (await query.first()) as
122
+ | { name?: string; geode_id?: string; type?: string }
123
+ | undefined;
124
+ if (component) {
125
+ componentInfo = {
126
+ name: component.name ?? "",
127
+ id: component.geode_id ?? "",
128
+ type: component.type ?? "",
129
+ };
130
+ }
131
+ }
132
+ const newHoverData: HoverData = {
133
+ modelId: response.id,
134
+ modelName,
135
+ blockName: response.geode_id ?? undefined,
136
+ pickedId: response.picked_id,
137
+ fieldType: response.field_type,
138
+ component: componentInfo,
139
+ attributes: response.attributes ?? {},
140
+ };
141
+ hoverTimeoutRef.value = setTimeout(() => {
142
+ hoverPosition.value = relativeMousePosition;
143
+ hoverData.value = newHoverData;
144
+ hoverTimeoutRef.value = undefined;
145
+ }, HOVER_TIMEOUT_MS);
146
+ });
147
+ }, HOVER_DEBOUNCE_MS);
148
+
149
+ function requestClearHoverHighlight(): void {
150
+ const { hybridDb } = useHybridViewerScene();
151
+ const viewerStore = useViewerStore();
152
+ const schema = viewer_schemas.opengeodeweb_viewer.viewer.highlight;
153
+ const params = {
154
+ x: -1,
155
+ y: -1,
156
+ field_type: hover_highlight_field_type.value,
157
+ ids: Object.keys(hybridDb),
158
+ };
159
+ viewerStore
160
+ .request({
161
+ schema,
162
+ params,
163
+ })
164
+ // oxlint-disable-next-line promise/prefer-await-to-then -- fire-and-forget inside a sync caller; see codebase convention in global_attribute_style.ts.
165
+ .catch(() => undefined);
166
+ }
167
+
168
+ function clearHoverHighlight(): void {
169
+ clearHoverData();
170
+ requestClearHoverHighlight();
171
+ }
172
+
173
+ return {
174
+ is_hover_highlight,
175
+ hover_highlight_field_type,
176
+ hoverData,
177
+ hoverPosition,
178
+ clearHoverHighlight,
179
+ hoverHighlight,
180
+ };
181
+ });
182
+
183
+ export { useHybridViewerHighlight };
@@ -1,20 +1,37 @@
1
- import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
1
+ import { useHybridViewerCore } from "./core";
2
+ import { useHybridViewerHighlight } from "./highlight";
3
+ import { useHybridViewerScene } from "./scene";
2
4
  import { useViewerStore } from "@ogw_front/stores/viewer";
3
5
  import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
4
6
 
5
- function useHybridViewerRuler() {
7
+ interface RulerHoverState {
8
+ active: boolean;
9
+ fieldType: string;
10
+ }
11
+
12
+ function useHybridViewerRuler(): {
13
+ is_ruler_active: Ref<boolean>;
14
+ ruler_snap: Ref<boolean>;
15
+ ruler_point1: Ref<number[] | undefined>;
16
+ ruler_point2: Ref<number[] | undefined>;
17
+ ruler_distance: Ref<number | undefined>;
18
+ ruler_awaiting_point: Ref<number>;
19
+ handleRulerClick: (x: number, y: number) => Promise<void>;
20
+ applyRuler: () => Promise<void>;
21
+ clearRuler: () => Promise<void>;
22
+ deactivateRuler: () => void;
23
+ } {
6
24
  const is_ruler_active = ref(false);
7
25
  const ruler_snap = ref(false);
8
- const ruler_point1 = ref(undefined);
9
- const ruler_point2 = ref(undefined);
10
- const ruler_distance = ref(undefined);
26
+ const ruler_point1 = ref<number[] | undefined>(undefined);
27
+ const ruler_point2 = ref<number[] | undefined>(undefined);
28
+ const ruler_distance = ref<number | undefined>(undefined);
11
29
  const ruler_awaiting_point = ref(1);
12
- const ruler_previous_hover_state = ref({ active: false, fieldType: "CELL" });
30
+ const ruler_previous_hover_state = ref<RulerHoverState>({ active: false, fieldType: "CELL" });
13
31
 
14
- function updateRulerSnapHighlight() {
15
- const hybridViewerStore = useHybridViewerStore();
16
- const { is_hover_highlight, hover_highlight_field_type } = storeToRefs(hybridViewerStore);
17
- const { clearHoverHighlight } = hybridViewerStore;
32
+ function updateRulerSnapHighlight(): void {
33
+ const { is_hover_highlight, hover_highlight_field_type, clearHoverHighlight } =
34
+ useHybridViewerHighlight();
18
35
 
19
36
  if (is_ruler_active.value && ruler_snap.value) {
20
37
  ruler_previous_hover_state.value = {
@@ -34,25 +51,28 @@ function useHybridViewerRuler() {
34
51
 
35
52
  watch([is_ruler_active, ruler_snap], updateRulerSnapHighlight);
36
53
 
37
- async function applyRuler() {
54
+ async function applyRuler(): Promise<void> {
38
55
  if (!ruler_point1.value) {
39
56
  return;
40
57
  }
41
58
  const points = ruler_point2.value
42
59
  ? [ruler_point1.value, ruler_point2.value]
43
60
  : [ruler_point1.value];
44
- const { remoteRender } = useHybridViewerStore();
61
+ const { remoteRender } = useHybridViewerCore();
45
62
  const viewerStore = useViewerStore();
46
63
  const schema = viewer_schemas.opengeodeweb_viewer.viewer.ruler;
47
- const response = await viewerStore.request({ schema, params: { points } });
64
+ // oxlint-disable-next-line no-unsafe-type-assertion -- response shape is defined by the ruler schema.
65
+ const response = (await viewerStore.request({ schema, params: { points } })) as {
66
+ distance?: number;
67
+ };
48
68
  ruler_distance.value = response.distance;
49
69
  await remoteRender();
50
70
  }
51
71
 
52
- async function handleRulerClick(x, y) {
53
- const { hybridDb } = useHybridViewerStore();
72
+ async function handleRulerClick(x: number, y: number): Promise<void> {
73
+ const { hybridDb } = useHybridViewerScene();
54
74
  const viewerStore = useViewerStore();
55
- let coords = undefined;
75
+ let coords: number[] | undefined = undefined;
56
76
  if (ruler_snap.value) {
57
77
  const schema = viewer_schemas.opengeodeweb_viewer.viewer.highlight;
58
78
  const params = {
@@ -61,12 +81,20 @@ function useHybridViewerRuler() {
61
81
  field_type: "POINT",
62
82
  ids: Object.keys(hybridDb),
63
83
  };
64
- const response = await viewerStore.request({ schema, params });
84
+ // oxlint-disable-next-line no-unsafe-type-assertion -- response shape is defined by the highlight schema.
85
+ const response = (await viewerStore.request({ schema, params })) as {
86
+ attributes?: { coordinates?: number[] };
87
+ };
65
88
  coords = response.attributes?.coordinates;
66
89
  } else {
67
90
  const schema = viewer_schemas.opengeodeweb_viewer.viewer.get_point_position;
68
91
  const params = { x: Math.round(x), y: Math.round(y) };
69
- const response = await viewerStore.request({ schema, params });
92
+ // oxlint-disable-next-line no-unsafe-type-assertion -- response shape is defined by the get_point_position schema.
93
+ const response = (await viewerStore.request({ schema, params })) as {
94
+ x: number;
95
+ y: number;
96
+ z: number;
97
+ };
70
98
  coords = [response.x, response.y, response.z];
71
99
  }
72
100
  if (!coords) {
@@ -85,19 +113,19 @@ function useHybridViewerRuler() {
85
113
  await applyRuler();
86
114
  }
87
115
 
88
- function deactivateRuler() {
89
- const { clearHoverHighlight } = useHybridViewerStore();
116
+ function deactivateRuler(): void {
117
+ const { clearHoverHighlight } = useHybridViewerHighlight();
90
118
  is_ruler_active.value = false;
91
119
  clearHoverHighlight();
92
120
  }
93
121
 
94
- async function clearRuler() {
122
+ async function clearRuler(): Promise<void> {
95
123
  ruler_point1.value = undefined;
96
124
  ruler_point2.value = undefined;
97
125
  ruler_distance.value = undefined;
98
126
  ruler_awaiting_point.value = 1;
99
127
  deactivateRuler();
100
- const { remoteRender } = useHybridViewerStore();
128
+ const { remoteRender } = useHybridViewerCore();
101
129
  const viewerStore = useViewerStore();
102
130
  const schema = viewer_schemas.opengeodeweb_viewer.viewer.reset_ruler;
103
131
  await viewerStore.request({ schema });
@@ -0,0 +1,125 @@
1
+ import type { HybridDb, vtkActor as VtkActorInstance } from "./vtk_types";
2
+ import { requireRenderWindow, useHybridViewerCore } from "./core";
3
+ import { ACTOR_COLOR } from "./constants";
4
+ import { useDataStore } from "@ogw_front/stores/data";
5
+ import { useViewerStore } from "@ogw_front/stores/viewer";
6
+ import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
7
+ import { newInstance as vtkActor } from "@kitware/vtk.js/Rendering/Core/Actor";
8
+ import { newInstance as vtkMapper } from "@kitware/vtk.js/Rendering/Core/Mapper";
9
+ import type vtkPolyData from "@kitware/vtk.js/Common/DataModel/PolyData";
10
+ import { newInstance as vtkXMLPolyDataReader } from "@kitware/vtk.js/IO/XML/XMLPolyDataReader";
11
+
12
+ // Shared via createSharedComposable (rather than merged into the parent hybridViewer store) so sibling slices, e.g. camera.ts and ruler.ts, can read hybridDb/setZScaling directly without importing the parent store and creating a cycle. A Pinia store would work too but its $id/$patch/... properties would leak into the composed store's spread and collapse its inferred type.
13
+ const useHybridViewerScene = createSharedComposable(() => {
14
+ const hybridDb = reactive<HybridDb>({});
15
+ const zScale = ref(1);
16
+
17
+ async function addItem(id: string): Promise<void> {
18
+ const { genericRenderWindow } = useHybridViewerCore();
19
+ if (!genericRenderWindow.value) {
20
+ return;
21
+ }
22
+ const dataStore = useDataStore();
23
+ const isViewable = await dataStore.isItemViewable(id);
24
+ if (!isViewable) {
25
+ return;
26
+ }
27
+ const value = await dataStore.item(id);
28
+ const reader = vtkXMLPolyDataReader();
29
+ reader.parseAsArrayBuffer(new TextEncoder().encode(value.binary_light_viewable).buffer);
30
+ const actor = vtkActor();
31
+ const mapper = vtkMapper();
32
+ // oxlint-disable-next-line no-unsafe-type-assertion -- vtk.js's algorithm interface types getOutputData as `any`; this reader always produces polydata.
33
+ const polydata = reader.getOutputData(0) as unknown as vtkPolyData;
34
+ mapper.setInputData(polydata);
35
+ const property = actor.getProperty();
36
+ property.setColor(ACTOR_COLOR);
37
+ actor.setMapper(mapper);
38
+ const renderer = genericRenderWindow.value.getRenderer();
39
+ if (hybridDb[id]) {
40
+ renderer.removeActor(hybridDb[id].actor);
41
+ }
42
+ const actors = renderer.getActors();
43
+ const isFirst = actors.length === 0;
44
+ renderer.addActor(actor);
45
+ if (isFirst) {
46
+ renderer.resetCamera();
47
+ }
48
+ hybridDb[id] = {
49
+ actor,
50
+ polydata,
51
+ mapper,
52
+ };
53
+ }
54
+
55
+ function removeItem(id: string): void {
56
+ const { genericRenderWindow } = useHybridViewerCore();
57
+ if (!hybridDb[id]) {
58
+ return;
59
+ }
60
+ const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
61
+ renderer.removeActor(hybridDb[id].actor);
62
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
63
+ renderWindow.render();
64
+ Reflect.deleteProperty(hybridDb, id);
65
+ }
66
+
67
+ function setVisibility(id: string, visibility: boolean): void {
68
+ const { genericRenderWindow } = useHybridViewerCore();
69
+ if (!hybridDb[id]) {
70
+ return;
71
+ }
72
+ hybridDb[id].actor.setVisibility(visibility);
73
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
74
+ renderWindow.render();
75
+ }
76
+
77
+ async function setZScaling(z_scale: number): Promise<void> {
78
+ const { genericRenderWindow, remoteRender } = useHybridViewerCore();
79
+ zScale.value = z_scale;
80
+ const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
81
+ // oxlint-disable-next-line no-unsafe-type-assertion -- renderer.getActors() is typed as vtkProp[] in vtk.js, but this scene only ever adds vtkActor instances.
82
+ for (const actor of renderer.getActors() as VtkActorInstance[]) {
83
+ const scale = actor.getScale();
84
+ actor.setScale(scale[0] ?? 1, scale[1] ?? 1, z_scale);
85
+ }
86
+ renderer.resetCamera();
87
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
88
+ renderWindow.render();
89
+ const viewerStore = useViewerStore();
90
+ const schema = viewer_schemas.opengeodeweb_viewer.viewer.set_z_scaling;
91
+ const params = {
92
+ z_scale,
93
+ };
94
+ await viewerStore.request({
95
+ schema,
96
+ params,
97
+ });
98
+ await remoteRender();
99
+ }
100
+
101
+ function clear(): void {
102
+ const { genericRenderWindow } = useHybridViewerCore();
103
+ const renderer = requireRenderWindow(genericRenderWindow).getRenderer();
104
+ for (const actor of renderer.getActors()) {
105
+ renderer.removeActor(actor);
106
+ }
107
+ const renderWindow = requireRenderWindow(genericRenderWindow).getRenderWindow();
108
+ renderWindow.render();
109
+ for (const id of Object.keys(hybridDb)) {
110
+ Reflect.deleteProperty(hybridDb, id);
111
+ }
112
+ }
113
+
114
+ return {
115
+ hybridDb,
116
+ zScale,
117
+ addItem,
118
+ removeItem,
119
+ setVisibility,
120
+ setZScaling,
121
+ clear,
122
+ };
123
+ });
124
+
125
+ export { useHybridViewerScene };
@@ -0,0 +1,177 @@
1
+ import type { Vector3, ViewStreamLike } from "./vtk_types";
2
+ import { centerCameraOnPosition, useHybridViewerCamera } from "./camera";
3
+ import { Status } from "@ogw_front/utils/status";
4
+ import { WHEEL_TIME_OUT_MS } from "./constants";
5
+ import { useHybridViewerCore } from "./core";
6
+ import { useHybridViewerHighlight } from "./highlight";
7
+ import { useViewerStore } from "@ogw_front/stores/viewer";
8
+ import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
9
+
10
+ type ContainerRef = Ref<{ $el: HTMLElement } | undefined>;
11
+
12
+ interface HybridViewerViewport {
13
+ setContainer: (container: ContainerRef | undefined) => void;
14
+ resize: (width: number, height: number) => Promise<void>;
15
+ viewStream: Ref<ViewStreamLike | undefined>;
16
+ }
17
+
18
+ async function resize(width: number, height: number): Promise<void> {
19
+ const { genericRenderWindow, remoteRender, status, viewStream } = useHybridViewerCore();
20
+ const viewerStore = useViewerStore();
21
+ if (viewerStore.status !== Status.CONNECTED || status.value !== Status.CREATED) {
22
+ return;
23
+ }
24
+ const renderWindow = genericRenderWindow.value;
25
+ if (!renderWindow) {
26
+ return;
27
+ }
28
+ // oxlint-disable-next-line no-unsafe-assignment -- vtk.js has no types for getApiSpecificRenderWindow(); narrowed below.
29
+ const webGLRenderWindow = renderWindow.getApiSpecificRenderWindow();
30
+ // oxlint-disable-next-line no-unsafe-type-assertion -- trusted vtk.js OpenGL render window API boundary.
31
+ const openGLRenderWindow = webGLRenderWindow as unknown as {
32
+ getCanvas: () => HTMLCanvasElement;
33
+ setSize: (width: number, height: number) => void;
34
+ };
35
+ const canvas = openGLRenderWindow.getCanvas();
36
+ canvas.width = width;
37
+ canvas.height = height;
38
+ await nextTick();
39
+ openGLRenderWindow.setSize(width, height);
40
+ if (viewStream.value) {
41
+ viewStream.value.setSize(width, height);
42
+ }
43
+ renderWindow.getRenderWindow().render();
44
+ await remoteRender();
45
+ }
46
+
47
+ function performClickPicking(event: MouseEvent, containerElement: HTMLElement): void {
48
+ const { genericRenderWindow } = useHybridViewerCore();
49
+ const { syncRemoteCamera } = useHybridViewerCamera();
50
+ const viewerStore = useViewerStore();
51
+ const rect = containerElement.getBoundingClientRect();
52
+ const schema = viewer_schemas.opengeodeweb_viewer.viewer.get_point_position;
53
+ const params = {
54
+ x: Math.round(event.clientX - rect.left),
55
+ y: Math.round(rect.height - (event.clientY - rect.top)),
56
+ };
57
+ void viewerStore.request(
58
+ {
59
+ schema,
60
+ params,
61
+ },
62
+ {
63
+ response_function: (response: unknown) => {
64
+ // oxlint-disable-next-line no-unsafe-type-assertion -- response shape is defined by the get_point_position schema.
65
+ const { x, y, z } = response as { x: number; y: number; z: number };
66
+ const pickedPos: Vector3 = [x, y, z];
67
+ if (!genericRenderWindow.value || !pickedPos.some((val) => val !== 0)) {
68
+ return;
69
+ }
70
+ const renderer = genericRenderWindow.value.getRenderer();
71
+ const camera = renderer.getActiveCamera();
72
+ centerCameraOnPosition(camera, pickedPos);
73
+ genericRenderWindow.value.getRenderWindow().render();
74
+ syncRemoteCamera();
75
+ },
76
+ },
77
+ );
78
+ }
79
+
80
+ function setContainer(container: ContainerRef | undefined): void {
81
+ if (!container || !container.value) {
82
+ return;
83
+ }
84
+ const containerElement = container.value.$el;
85
+ const { genericRenderWindow, is_picking, is_moving } = useHybridViewerCore();
86
+ const { syncRemoteCamera } = useHybridViewerCamera();
87
+ const { hoverHighlight } = useHybridViewerHighlight();
88
+ if (!genericRenderWindow.value) {
89
+ return;
90
+ }
91
+ genericRenderWindow.value.setContainer(containerElement);
92
+ // oxlint-disable-next-line no-unsafe-assignment -- vtk.js has no types for getApiSpecificRenderWindow(); narrowed below.
93
+ const webGLRenderWindow = genericRenderWindow.value.getApiSpecificRenderWindow();
94
+ // oxlint-disable-next-line no-unsafe-type-assertion -- trusted vtk.js OpenGL render window API boundary.
95
+ const openGLRenderWindow = webGLRenderWindow as unknown as {
96
+ setUseBackgroundImage: (value: boolean) => void;
97
+ getReferenceByName: (name: string) => { style: CSSStyleDeclaration } | undefined;
98
+ };
99
+ openGLRenderWindow.setUseBackgroundImage(true);
100
+ const imageStyle = openGLRenderWindow.getReferenceByName("bgImage")?.style;
101
+ Object.assign(imageStyle ?? {}, {
102
+ transition: "opacity 0.1s ease-in",
103
+ zIndex: 1,
104
+ });
105
+ void resize(containerElement.offsetWidth, containerElement.offsetHeight);
106
+ let has_dragged = false;
107
+ useMousePressed({
108
+ target: containerElement,
109
+ onPressed: (event: MouseEvent | TouchEvent | DragEvent) => {
110
+ if (!(event instanceof MouseEvent)) {
111
+ return;
112
+ }
113
+ if (event.button !== 0 && event.button !== 1) {
114
+ return;
115
+ }
116
+ if (event.button === 0 && is_picking.value) {
117
+ performClickPicking(event, containerElement);
118
+ is_picking.value = false;
119
+ return;
120
+ }
121
+ is_moving.value = true;
122
+ has_dragged = false;
123
+ event.stopPropagation();
124
+ },
125
+ onReleased: () => {
126
+ is_moving.value = false;
127
+ if (has_dragged && genericRenderWindow.value) {
128
+ const renderer = genericRenderWindow.value.getRenderer();
129
+ renderer.resetCameraClippingRange();
130
+ syncRemoteCamera();
131
+ }
132
+ has_dragged = false;
133
+ },
134
+ });
135
+ useEventListener(containerElement, "mousemove", (event: MouseEvent) => {
136
+ if (is_moving.value) {
137
+ has_dragged = true;
138
+ if (imageStyle) {
139
+ imageStyle.opacity = "0";
140
+ }
141
+ }
142
+ void (async (): Promise<void> => {
143
+ try {
144
+ await hoverHighlight(event);
145
+ } catch {
146
+ // Ignore hover highlight failures
147
+ }
148
+ })();
149
+ });
150
+ let wheelEventEndTimeout: ReturnType<typeof setTimeout> | undefined = undefined;
151
+ useEventListener(containerElement, "wheel", () => {
152
+ is_moving.value = true;
153
+ if (imageStyle) {
154
+ imageStyle.opacity = "0";
155
+ }
156
+ clearTimeout(wheelEventEndTimeout);
157
+ wheelEventEndTimeout = setTimeout(() => {
158
+ is_moving.value = false;
159
+ if (!genericRenderWindow.value) {
160
+ return;
161
+ }
162
+ const renderer = genericRenderWindow.value.getRenderer();
163
+ renderer.resetCameraClippingRange();
164
+ syncRemoteCamera();
165
+ }, WHEEL_TIME_OUT_MS);
166
+ });
167
+ }
168
+ function useHybridViewerViewport(): HybridViewerViewport {
169
+ const { viewStream } = useHybridViewerCore();
170
+ return {
171
+ setContainer,
172
+ resize,
173
+ viewStream,
174
+ };
175
+ }
176
+ export { performClickPicking, useHybridViewerViewport };
177
+ export type { ViewStreamLike } from "./vtk_types";
@@ -0,0 +1,58 @@
1
+ import type { Vector3 } from "@kitware/vtk.js/types";
2
+ import type vtkActor from "@kitware/vtk.js/Rendering/Core/Actor";
3
+
4
+ // The camera state as exchanged with the viewer microservice (snake_case field names, plain arrays) - distinct from vtk.js's own vtkCamera object.
5
+ interface CameraOptions {
6
+ focal_point: Vector3;
7
+ view_up: Vector3;
8
+ position: Vector3;
9
+ view_angle: number;
10
+ clipping_range: [number, number];
11
+ distance: number;
12
+ }
13
+
14
+ interface HybridDbEntry {
15
+ actor: vtkActor;
16
+ polydata: unknown;
17
+ mapper: unknown;
18
+ }
19
+
20
+ type HybridDb = Record<string, HybridDbEntry>;
21
+
22
+ interface HoverComponentInfo {
23
+ name: string;
24
+ id: string;
25
+ type: string;
26
+ }
27
+
28
+ interface HoverData {
29
+ modelId: string;
30
+ modelName: string | undefined;
31
+ blockName: string | undefined;
32
+ pickedId: unknown;
33
+ fieldType: unknown;
34
+ component: HoverComponentInfo | undefined;
35
+ attributes: Record<string, unknown>;
36
+ }
37
+
38
+ // The image stream object returned by vtk.js's ImageStream.createViewStream(); vtk.js's own vtkViewStream type declares `onImageReady` with a zero-arg callback, which doesn't match how it's actually invoked at runtime (with the decoded image), so this describes the shape as it's actually used here.
39
+ interface ViewStreamLike {
40
+ setSize: (width: number, height: number) => void;
41
+ onImageReady: (callback: (event: { image: unknown }) => void) => void;
42
+ }
43
+
44
+ export type { Vector3 } from "@kitware/vtk.js/types";
45
+ export type { default as vtkActor } from "@kitware/vtk.js/Rendering/Core/Actor";
46
+ export type { vtkCamera } from "@kitware/vtk.js/Rendering/Core/Camera";
47
+ export type { vtkGenericRenderWindow } from "@kitware/vtk.js/Rendering/Misc/GenericRenderWindow";
48
+ export type { vtkOpenGLRenderWindow } from "@kitware/vtk.js/Rendering/OpenGL/RenderWindow";
49
+ export type { vtkRenderWindow } from "@kitware/vtk.js/Rendering/Core/RenderWindow";
50
+ export type { vtkRenderer } from "@kitware/vtk.js/Rendering/Core/Renderer";
51
+ export type {
52
+ CameraOptions,
53
+ HybridDbEntry,
54
+ HybridDb,
55
+ HoverComponentInfo,
56
+ HoverData,
57
+ ViewStreamLike,
58
+ };