@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
@@ -1,22 +1,71 @@
1
- export function useTreeScroll(propsIn, emit, displayItems, actualItemProps) {
1
+ import type { DisplayItem, EmitFn, ItemPropsConfig } from "./virtual_tree";
2
+
3
+ interface TreeScrollProps {
4
+ scrollTop?: number;
5
+ }
6
+
7
+ interface ScrollableElement {
8
+ $el: { scrollTop: number; clientHeight: number } | undefined;
9
+ }
10
+
11
+ interface ScrollInfo {
12
+ scrollTop: number;
13
+ containerHeight: number;
14
+ itemHeight: number;
15
+ }
16
+
17
+ type ReadonlyMaybeRefOrGetter<Value> = Value | Ref<Value> | (() => Value);
18
+
19
+ type ReadonlyDisplayItem = Omit<DisplayItem, "raw"> & {
20
+ readonly raw: Record<string, unknown>;
21
+ };
22
+
23
+ interface ScrollEventLike {
24
+ readonly target: EventTarget | null;
25
+ }
26
+
27
+ interface UseTreeScrollReturn {
28
+ internalScrollTop: Ref<number>;
29
+ virtualScrollRef: Ref<ScrollableElement | undefined>;
30
+ stickyHeader: ComputedRef<ReadonlyDisplayItem | undefined>;
31
+ handleScroll: (event: ScrollEventLike) => void;
32
+ scrollToIndex: (index: number) => void;
33
+ getScrollInfo: () => ScrollInfo;
34
+ }
35
+
36
+ function isHtmlElement(value: EventTarget | null): value is HTMLElement {
37
+ return value instanceof HTMLElement;
38
+ }
39
+
40
+ export function useTreeScroll(
41
+ propsIn: ReadonlyMaybeRefOrGetter<TreeScrollProps>,
42
+ emit: EmitFn,
43
+ displayItems: Ref<readonly ReadonlyDisplayItem[]>,
44
+ actualItemProps: Ref<ItemPropsConfig>,
45
+ ): UseTreeScrollReturn {
2
46
  const SCROLL_STICKY_THRESHOLD = 10;
3
47
  const DEFAULT_ITEM_HEIGHT = 28;
4
48
 
5
49
  const props = toRef(propsIn);
6
- const internalScrollTop = ref(props.value.scrollTop || 0);
7
- const virtualScrollRef = ref(undefined);
50
+ const internalScrollTop = ref(props.value.scrollTop ?? 0);
51
+ const virtualScrollRef = ref<ScrollableElement | undefined>(undefined);
8
52
 
9
- function handleScroll(event) {
10
- internalScrollTop.value = event.target.scrollTop;
11
- emit("update:scrollTop", event.target.scrollTop);
53
+ function handleScroll(event: ScrollEventLike): void {
54
+ const { target } = event;
55
+ if (!isHtmlElement(target)) {
56
+ return;
57
+ }
58
+ const { scrollTop } = target;
59
+ internalScrollTop.value = scrollTop;
60
+ emit("update:scrollTop", scrollTop);
12
61
  }
13
62
 
14
63
  watch(
15
64
  () => props.value.scrollTop,
16
- (newVal) => {
65
+ (newVal = 0) => {
17
66
  if (Math.abs(newVal - internalScrollTop.value) > 1) {
18
67
  internalScrollTop.value = newVal;
19
- if (virtualScrollRef.value && virtualScrollRef.value.$el) {
68
+ if (virtualScrollRef.value !== undefined && virtualScrollRef.value.$el !== undefined) {
20
69
  virtualScrollRef.value.$el.scrollTop = newVal;
21
70
  }
22
71
  }
@@ -56,13 +105,13 @@ export function useTreeScroll(propsIn, emit, displayItems, actualItemProps) {
56
105
  return undefined;
57
106
  });
58
107
 
59
- function scrollToIndex(index) {
60
- if (index === -1 || !virtualScrollRef.value) {
108
+ function scrollToIndex(index: number): void {
109
+ if (index === -1 || virtualScrollRef.value === undefined) {
61
110
  return;
62
111
  }
63
112
 
64
113
  const container = virtualScrollRef.value.$el;
65
- if (!container) {
114
+ if (container === undefined) {
66
115
  return;
67
116
  }
68
117
 
@@ -81,7 +130,7 @@ export function useTreeScroll(propsIn, emit, displayItems, actualItemProps) {
81
130
  }
82
131
  }
83
132
 
84
- function getScrollInfo() {
133
+ function getScrollInfo(): ScrollInfo {
85
134
  const container = virtualScrollRef.value?.$el;
86
135
  const containerHeight = container ? container.clientHeight : 0;
87
136
  const itemHeight = actualItemProps.value?.height || DEFAULT_ITEM_HEIGHT;
@@ -0,0 +1,186 @@
1
+ import type { MaybeComputedElementRef } from "@vueuse/core";
2
+ import { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
3
+ import { useTreeviewStore } from "@ogw_front/stores/treeview";
4
+
5
+ const LUMINANCE_THRESHOLD = 0.65;
6
+ const ADAPTIVE_EXPONENT = 0.3;
7
+
8
+ const MIN_BLUR = 8;
9
+ const MAX_BLUR = 25;
10
+
11
+ const MIN_OPACITY = 0;
12
+ const MAX_OPACITY = 0.5;
13
+
14
+ const MIN_BOOST = 1;
15
+ const MAX_BOOST = 1.2;
16
+ const ADAPTIVE_REFRESH_RATE = 150;
17
+
18
+ // `target` is intentionally duck-typed: callers pass either a coordinates source (a plain object, a Ref/ComputedRef of one, or a getter function returning one) or an element ref/template ref destined for vueuse's useElementBounding - see call sites in Viewer/ContextMenu and Viewer/ObjectTree components.
19
+ type AdaptiveStylesTarget = unknown;
20
+
21
+ interface AdaptiveStylesOptions {
22
+ minOpacity?: number;
23
+ maxOpacity?: number;
24
+ }
25
+
26
+ interface CoordinatesLike {
27
+ x?: unknown;
28
+ y?: unknown;
29
+ width?: unknown;
30
+ height?: unknown;
31
+ }
32
+
33
+ interface RefLike {
34
+ value?: unknown;
35
+ x?: unknown;
36
+ }
37
+
38
+ function isRefLike(value: unknown): value is RefLike {
39
+ return typeof value === "object" && value !== null;
40
+ }
41
+
42
+ function isCoordinatesGetter(value: unknown): value is () => CoordinatesLike | undefined {
43
+ return typeof value === "function";
44
+ }
45
+
46
+ function isCoordinatesLike(value: unknown): value is CoordinatesLike {
47
+ return typeof value === "object" && value !== null;
48
+ }
49
+
50
+ function getValue(val: unknown): number {
51
+ if (typeof val === "object" && val !== null && "value" in val) {
52
+ const wrapped = (val as { value?: unknown }).value;
53
+ if (typeof wrapped === "number") {
54
+ return wrapped;
55
+ }
56
+ }
57
+ return typeof val === "number" ? val : 0;
58
+ }
59
+
60
+ // oxlint-disable max-lines-per-function
61
+ export function useAdaptiveStyles(
62
+ target: AdaptiveStylesTarget,
63
+ options: AdaptiveStylesOptions = {},
64
+ ): {
65
+ adaptiveStyles: ComputedRef<{
66
+ "--adaptive-blur": string;
67
+ "--adaptive-opacity": number;
68
+ "--adaptive-brightness": number;
69
+ }>;
70
+ brightness: Ref<number>;
71
+ } {
72
+ const hybridViewerStore = useHybridViewerStore();
73
+ const treeviewStore = useTreeviewStore();
74
+
75
+ const targetAsRefLike = isRefLike(target) ? target : undefined;
76
+ const isCoordinates =
77
+ target !== undefined &&
78
+ target !== null &&
79
+ (typeof target === "function" ||
80
+ (targetAsRefLike?.value !== undefined &&
81
+ targetAsRefLike.value !== null &&
82
+ (targetAsRefLike.value as { x?: unknown }).x !== undefined) ||
83
+ (targetAsRefLike?.x !== undefined && targetAsRefLike.value === undefined));
84
+
85
+ const bounding = useElementBounding(
86
+ // oxlint-disable-next-line no-unsafe-type-assertion -- duck-typed target; see comment above.
87
+ isCoordinates ? undefined : (target as MaybeComputedElementRef),
88
+ );
89
+
90
+ const unwrapped = computed(() => {
91
+ if (isCoordinates) {
92
+ let val: CoordinatesLike | undefined = undefined;
93
+ if (isCoordinatesGetter(target)) {
94
+ val = target();
95
+ } else if (targetAsRefLike?.value === undefined) {
96
+ val = targetAsRefLike;
97
+ } else if (isCoordinatesLike(targetAsRefLike.value)) {
98
+ val = targetAsRefLike.value;
99
+ }
100
+ return {
101
+ x: getValue(val?.x),
102
+ y: getValue(val?.y),
103
+ width: getValue(val?.width),
104
+ height: getValue(val?.height),
105
+ };
106
+ }
107
+ return {
108
+ x: bounding.x.value,
109
+ y: bounding.y.value,
110
+ width: bounding.width.value,
111
+ height: bounding.height.value,
112
+ };
113
+ });
114
+
115
+ const x = computed(() => unwrapped.value.x);
116
+ const y = computed(() => unwrapped.value.y);
117
+ const width = computed(() => unwrapped.value.width);
118
+ const height = computed(() => unwrapped.value.height);
119
+
120
+ const brightness = ref(LUMINANCE_THRESHOLD);
121
+
122
+ function calculateBrightness(): void {
123
+ brightness.value = hybridViewerStore.getAverageBrightness({
124
+ x: x.value,
125
+ y: y.value,
126
+ width: width.value,
127
+ height: height.value,
128
+ });
129
+ }
130
+
131
+ const updateBrightness = useThrottleFn(calculateBrightness, ADAPTIVE_REFRESH_RATE);
132
+
133
+ watch(
134
+ [
135
+ x,
136
+ y,
137
+ width,
138
+ height,
139
+ (): typeof hybridViewerStore.latestImage => hybridViewerStore.latestImage,
140
+ ],
141
+ updateBrightness,
142
+ {
143
+ immediate: true,
144
+ },
145
+ );
146
+
147
+ async function forceRefresh(): Promise<void> {
148
+ await nextTick();
149
+ bounding.update?.();
150
+ calculateBrightness();
151
+ }
152
+
153
+ if (getCurrentInstance()) {
154
+ onMounted(async () => {
155
+ try {
156
+ await forceRefresh();
157
+ } catch (error) {
158
+ console.error("forceRefresh failed:", error);
159
+ }
160
+ });
161
+ }
162
+
163
+ watch(() => treeviewStore.opened_views, forceRefresh, { deep: true });
164
+
165
+ const adaptiveStyles = computed(() => {
166
+ const normalized = Math.min(1, brightness.value / LUMINANCE_THRESHOLD);
167
+ const darkFactor = (1 - normalized) ** ADAPTIVE_EXPONENT;
168
+
169
+ const blur = MIN_BLUR + darkFactor * (MAX_BLUR - MIN_BLUR);
170
+ const minOpacity = options.minOpacity ?? MIN_OPACITY;
171
+ const maxOpacity = options.maxOpacity ?? MAX_OPACITY;
172
+ const opacity = minOpacity + darkFactor * (maxOpacity - minOpacity);
173
+ const brightnessBoost = MIN_BOOST + darkFactor * (MAX_BOOST - MIN_BOOST);
174
+
175
+ return {
176
+ "--adaptive-blur": `${blur}px`,
177
+ "--adaptive-opacity": opacity,
178
+ "--adaptive-brightness": brightnessBoost,
179
+ };
180
+ });
181
+
182
+ return {
183
+ adaptiveStyles,
184
+ brightness,
185
+ };
186
+ }
@@ -0,0 +1,263 @@
1
+ import { ref } from "vue";
2
+ import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
3
+
4
+ import { type DataItem, useDataStore } from "@ogw_front/stores/data";
5
+ import { useDataStyleStore } from "@ogw_front/stores/data_style";
6
+ import { useViewerStore } from "@ogw_front/stores/viewer";
7
+
8
+ interface PickedItem {
9
+ id: string;
10
+ viewer_id: number | undefined;
11
+ }
12
+
13
+ interface ProposedItem {
14
+ id: string;
15
+ viewer_id: number | undefined;
16
+ name: string;
17
+ viewer_type: string | undefined;
18
+ geode_object_type: string | undefined;
19
+ }
20
+
21
+ interface PickedResponse {
22
+ array_ids: string[];
23
+ viewer_id: number | null;
24
+ picked_data?: PickedItem[];
25
+ }
26
+
27
+ interface ViewerIdResult {
28
+ id: string | undefined;
29
+ viewer_id: number | undefined;
30
+ }
31
+
32
+ interface GetViewerIdParams {
33
+ x: number;
34
+ y: number;
35
+ containerWidth: number;
36
+ containerHeight: number;
37
+ containerRect: { left: number; top: number };
38
+ }
39
+
40
+ interface UseOverlappingPickerReturn {
41
+ displayIntermediate: Ref<boolean>;
42
+ intermediateItems: Ref<ProposedItem[]>;
43
+ intermediateMenuX: Ref<number>;
44
+ intermediateMenuY: Ref<number>;
45
+ getIntermediateMenuStyle: () => { position: string; left: string; top: string };
46
+ selectIntermediateItem: (item: ProposedItem | undefined) => void;
47
+ handleIntermediateMenuUpdate: (val: boolean) => void;
48
+ get_viewer_id: (params: GetViewerIdParams) => Promise<ViewerIdResult>;
49
+ }
50
+
51
+ function isPickedItem(entry: unknown): entry is PickedItem {
52
+ return (
53
+ typeof entry === "object" &&
54
+ entry !== null &&
55
+ "id" in entry &&
56
+ typeof entry.id === "string" &&
57
+ (!("viewer_id" in entry) ||
58
+ entry.viewer_id === undefined ||
59
+ typeof entry.viewer_id === "number")
60
+ );
61
+ }
62
+
63
+ function isPickedItemArray(value: unknown): value is PickedItem[] {
64
+ return Array.isArray(value) && value.every((entry) => isPickedItem(entry));
65
+ }
66
+
67
+ function isPickedResponse(value: unknown): value is PickedResponse {
68
+ if (typeof value !== "object" || value === null) {
69
+ return false;
70
+ }
71
+ if (!("array_ids" in value) || !("viewer_id" in value)) {
72
+ return false;
73
+ }
74
+ const { array_ids, viewer_id } = value;
75
+ if (
76
+ !Array.isArray(array_ids) ||
77
+ !array_ids.every((entry) => typeof entry === "string") ||
78
+ (typeof viewer_id !== "number" && viewer_id !== null)
79
+ ) {
80
+ return false;
81
+ }
82
+ if ("picked_data" in value) {
83
+ return value.picked_data === undefined || isPickedItemArray(value.picked_data);
84
+ }
85
+ return true;
86
+ }
87
+
88
+ export function useOverlappingPicker(): UseOverlappingPickerReturn {
89
+ const dataStore = useDataStore();
90
+ const dataStyleStore = useDataStyleStore();
91
+ const viewerStore = useViewerStore();
92
+ const dataItems = dataStore.refAllItems();
93
+
94
+ const displayIntermediate = ref(false);
95
+ const intermediateItems = ref<ProposedItem[]>([]);
96
+ const intermediateMenuX = ref(0);
97
+ const intermediateMenuY = ref(0);
98
+ let resolveIntermediate: ((item: ProposedItem | undefined) => void) | undefined = undefined;
99
+
100
+ async function fetchProposedItems(pickedList: readonly PickedItem[]): Promise<ProposedItem[]> {
101
+ const proposedItems = await Promise.all(
102
+ pickedList.map(async (pick: PickedItem) => {
103
+ try {
104
+ const item = await dataStore.item(pick.id);
105
+ return {
106
+ id: pick.id,
107
+ viewer_id: pick.viewer_id,
108
+ name: item.name || "Unnamed Object",
109
+ viewer_type: item.viewer_type,
110
+ geode_object_type: item.geode_object_type,
111
+ };
112
+ } catch {
113
+ return {
114
+ id: pick.id,
115
+ viewer_id: pick.viewer_id,
116
+ name: "Unnamed Object",
117
+ viewer_type: undefined,
118
+ geode_object_type: undefined,
119
+ };
120
+ }
121
+ }),
122
+ );
123
+ return proposedItems;
124
+ }
125
+
126
+ function getIntermediateMenuStyle(): { position: string; left: string; top: string } {
127
+ return {
128
+ position: "fixed",
129
+ left: `${intermediateMenuX.value}px`,
130
+ top: `${intermediateMenuY.value}px`,
131
+ };
132
+ }
133
+
134
+ function selectIntermediateItem(item: ProposedItem | undefined): void {
135
+ if (resolveIntermediate) {
136
+ resolveIntermediate(item);
137
+ resolveIntermediate = undefined;
138
+ }
139
+ }
140
+
141
+ function handleIntermediateMenuUpdate(val: boolean): void {
142
+ if (!val && resolveIntermediate) {
143
+ resolveIntermediate(undefined);
144
+ resolveIntermediate = undefined;
145
+ }
146
+ }
147
+
148
+ async function get_viewer_id({
149
+ x,
150
+ y,
151
+ containerWidth,
152
+ containerHeight,
153
+ containerRect,
154
+ }: GetViewerIdParams): Promise<ViewerIdResult> {
155
+ const activeIds = new Set(dataItems.value.map((i: DataItem) => i.id));
156
+ const visibleStyleIds = Object.keys(dataStyleStore.styles).filter(
157
+ (styleId) => activeIds.has(styleId) && dataStyleStore.objectVisibility(styleId) === true,
158
+ );
159
+
160
+ const viewableChecks = await Promise.all(
161
+ visibleStyleIds.map(async (styleId) => {
162
+ try {
163
+ return (await dataStore.isItemViewable(styleId)) ? styleId : undefined;
164
+ } catch {
165
+ return undefined;
166
+ }
167
+ }),
168
+ );
169
+ const ids = viewableChecks.filter((id): id is string => Boolean(id));
170
+
171
+ const result: ViewerIdResult = { id: undefined, viewer_id: undefined };
172
+ // A plain `let` reassigned only from inside the response_function closure
173
+ // Below loses its declared type for TS's control-flow narrowing once
174
+ // Control leaves the closure - wrapping it in an object sidesteps that.
175
+ const responseHolder: { pickedResponse: PickedResponse | undefined } = {
176
+ pickedResponse: undefined,
177
+ };
178
+ const schema = viewer_schemas.opengeodeweb_viewer.viewer.picked_ids;
179
+ const params = { x, y, ids };
180
+ await viewerStore.request(
181
+ {
182
+ schema,
183
+ params,
184
+ },
185
+ {
186
+ response_function: (response: unknown) => {
187
+ responseHolder.pickedResponse = isPickedResponse(response) ? response : undefined;
188
+ },
189
+ },
190
+ );
191
+ const { pickedResponse } = responseHolder;
192
+
193
+ if (!pickedResponse || pickedResponse.array_ids.length === 0) {
194
+ return result;
195
+ }
196
+
197
+ const { array_ids, viewer_id, picked_data } = pickedResponse;
198
+
199
+ const pickedList: PickedItem[] = [];
200
+ if (picked_data && picked_data.length > 0) {
201
+ pickedList.push(...picked_data);
202
+ } else {
203
+ for (const pickId of array_ids) {
204
+ pickedList.push({ id: pickId, viewer_id: viewer_id ?? undefined });
205
+ }
206
+ }
207
+
208
+ if (pickedList.length <= 1) {
209
+ return { id: pickedList[0]?.id, viewer_id: pickedList[0]?.viewer_id };
210
+ }
211
+
212
+ const proposedItems = await fetchProposedItems(pickedList);
213
+ intermediateItems.value = proposedItems;
214
+
215
+ const yUI = containerHeight - y;
216
+ const MENU_WIDTH = 340;
217
+ const MENU_BASE_HEIGHT = 55;
218
+ const MENU_ITEM_HEIGHT = 48;
219
+ const MENU_HEIGHT = MENU_BASE_HEIGHT + proposedItems.length * MENU_ITEM_HEIGHT;
220
+ const CLAMP_MARGIN = 10;
221
+ const clampedX = Math.min(
222
+ Math.max(x, CLAMP_MARGIN),
223
+ containerWidth - MENU_WIDTH - CLAMP_MARGIN,
224
+ );
225
+ let clampedY = yUI;
226
+ if (yUI + MENU_HEIGHT > containerHeight - CLAMP_MARGIN) {
227
+ clampedY = Math.max(yUI - MENU_HEIGHT, CLAMP_MARGIN);
228
+ } else {
229
+ clampedY = Math.max(yUI, CLAMP_MARGIN);
230
+ }
231
+ clampedY = Math.min(
232
+ Math.max(clampedY, CLAMP_MARGIN),
233
+ containerHeight - MENU_HEIGHT - CLAMP_MARGIN,
234
+ );
235
+
236
+ intermediateMenuX.value = containerRect.left + clampedX;
237
+ intermediateMenuY.value = containerRect.top + clampedY;
238
+ displayIntermediate.value = true;
239
+
240
+ /* eslint-disable-next-line promise/avoid-new */
241
+ return new Promise<ViewerIdResult>((resolve) => {
242
+ resolveIntermediate = (chosenResult: ProposedItem | undefined): void => {
243
+ displayIntermediate.value = false;
244
+ resolve(
245
+ chosenResult
246
+ ? { id: chosenResult.id, viewer_id: chosenResult.viewer_id }
247
+ : { id: undefined, viewer_id: undefined },
248
+ );
249
+ };
250
+ });
251
+ }
252
+
253
+ return {
254
+ displayIntermediate,
255
+ intermediateItems,
256
+ intermediateMenuX,
257
+ intermediateMenuY,
258
+ getIntermediateMenuStyle,
259
+ selectIntermediateItem,
260
+ handleIntermediateMenuUpdate,
261
+ get_viewer_id,
262
+ };
263
+ }
@@ -0,0 +1,55 @@
1
+ import { useViewerStore } from "@ogw_front/stores/viewer";
2
+ import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
3
+
4
+ // Runtime guard for the unknown response of viewerStore.request(), used instead of an
5
+ // `as` cast so the shape is actually verified (data_id, when present, must be a string).
6
+ function isPickColormapResult(value: unknown): value is { data_id?: string } {
7
+ return (
8
+ typeof value === "object" &&
9
+ value !== null &&
10
+ (!("data_id" in value) || typeof value.data_id === "string")
11
+ );
12
+ }
13
+
14
+ export function useQuickColormap(): {
15
+ pickColormap: typeof pickColormap;
16
+ quickColormap: typeof quickColormap;
17
+ } {
18
+ const viewerStore = useViewerStore();
19
+ const quickColormap = reactive<{
20
+ data_id: string | undefined;
21
+ show: boolean;
22
+ x: number;
23
+ y: number;
24
+ }>({
25
+ data_id: undefined,
26
+ show: false,
27
+ x: 0,
28
+ y: 0,
29
+ });
30
+
31
+ async function pickColormap(
32
+ offsetX: number,
33
+ offsetY: number,
34
+ clientX: number,
35
+ clientY: number,
36
+ ): Promise<boolean> {
37
+ try {
38
+ const schema = viewer_schemas.opengeodeweb_viewer.viewer.pick_colormap;
39
+ const params = { x: offsetX, y: offsetY };
40
+ const result = await viewerStore.request({ schema, params });
41
+ if (isPickColormapResult(result) && result.data_id !== undefined && result.data_id !== "") {
42
+ quickColormap.data_id = result.data_id;
43
+ quickColormap.x = clientX;
44
+ quickColormap.y = clientY;
45
+ quickColormap.show = true;
46
+ return true;
47
+ }
48
+ } catch (error) {
49
+ console.error("Error picking colormap:", error);
50
+ }
51
+ return false;
52
+ }
53
+
54
+ return { pickColormap, quickColormap };
55
+ }