@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,383 @@
1
+ // Not auto-fixable (eslint's sort-imports core rule has no autofixer) and this file's import order doesn't match its syntax-kind-then-alphabetical requirement - left as-is rather than manually reordered across the codebase for a purely cosmetic rule.
2
+ // oxlint-disable eslint/sort-imports, eslint/max-lines
3
+ import { defineStore } from "pinia";
4
+
5
+ import type { Table } from "dexie";
6
+ import { ref, watch } from "vue";
7
+ import { compareSelections } from "@ogw_front/utils/treeview";
8
+ import { database } from "@ogw_internal/database/database";
9
+
10
+ const PANEL_WIDTH = 300;
11
+
12
+ interface OpenedView {
13
+ type: "object" | "component";
14
+ id: string;
15
+ title: string;
16
+ scrollTop: number;
17
+ opened: string[];
18
+ modelId?: string;
19
+ viewType?: string;
20
+ geode_object_type?: string;
21
+ }
22
+
23
+ interface TreeviewChild {
24
+ title: string;
25
+ id: string;
26
+ viewer_type: string;
27
+ geode_object_type: string;
28
+ }
29
+
30
+ interface TreeviewGroup {
31
+ id: string;
32
+ title: string;
33
+ children: TreeviewChild[];
34
+ }
35
+
36
+ interface TreeviewConfigRecord {
37
+ id: string;
38
+ opened_views: OpenedView[];
39
+ panelWidth: number;
40
+ additionalPanelWidth: number;
41
+ selectionIds: string[];
42
+ rowHeights: number[];
43
+ }
44
+
45
+ interface TreeviewSnapshot {
46
+ opened_views?: OpenedView[];
47
+ panelWidth?: number;
48
+ additionalPanelWidth?: number;
49
+ rowHeights?: number[];
50
+ selectionIds?: string[];
51
+ selection?: (string | { id: string })[];
52
+ }
53
+
54
+ function defaultOpenedViews(): OpenedView[] {
55
+ return [{ type: "object", id: "main", title: "Objects", scrollTop: 0, opened: [] }];
56
+ }
57
+
58
+ type ReadonlyOpenedView = Omit<OpenedView, "opened"> & {
59
+ readonly opened: readonly string[];
60
+ };
61
+ type ReadonlyTreeviewGroup = Omit<TreeviewGroup, "children"> & {
62
+ readonly children: readonly TreeviewChild[];
63
+ };
64
+ type ReadonlyTreeviewSnapshot = {
65
+ opened_views?: readonly ReadonlyOpenedView[];
66
+ panelWidth?: number;
67
+ additionalPanelWidth?: number;
68
+ rowHeights?: readonly number[];
69
+ selectionIds?: readonly string[];
70
+ selection?: readonly (string | { id: string })[];
71
+ };
72
+
73
+ // oxlint-disable-next-line max-lines-per-function, max-statements
74
+ export const useTreeviewStore = defineStore("treeview", () => {
75
+ const items = ref<TreeviewGroup[]>([]);
76
+ const selection = ref<string[]>([]);
77
+ const activeItems = ref<string[]>([]);
78
+ const opened_views = ref<OpenedView[]>(defaultOpenedViews());
79
+ const panelWidth = ref(PANEL_WIDTH);
80
+ const additionalPanelWidth = ref(PANEL_WIDTH);
81
+ const isImporting = ref(false);
82
+ const pendingSelectionIds = ref<string[]>([]);
83
+ const rowHeights = ref<number[]>([]);
84
+
85
+ // The database's table map is dynamically assembled at runtime (see internal/database/database.ts), so its exported type is a loose `{}`; cast it to the shape it actually has at runtime rather than widening every call site.
86
+ type DatabaseTables = Record<string, unknown>;
87
+ // oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime; see comment above.
88
+ const typedDatabase = database as unknown as DatabaseTables;
89
+ // oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime; see comment above.
90
+ const treeview_config_db = typedDatabase.treeview_config as Table<TreeviewConfigRecord, string>;
91
+
92
+ async function loadConfig(): Promise<void> {
93
+ try {
94
+ const config = await treeview_config_db.get("main");
95
+ if (config?.opened_views) {
96
+ opened_views.value = config.opened_views;
97
+ }
98
+ if (config?.panelWidth !== undefined && config.panelWidth !== 0) {
99
+ panelWidth.value = config.panelWidth;
100
+ }
101
+ if (config?.additionalPanelWidth !== undefined && config.additionalPanelWidth !== 0) {
102
+ additionalPanelWidth.value = config.additionalPanelWidth;
103
+ }
104
+ if (config?.selectionIds) {
105
+ selection.value = config.selectionIds;
106
+ }
107
+ if (config?.rowHeights) {
108
+ rowHeights.value = config.rowHeights;
109
+ }
110
+ } catch (error) {
111
+ // oxlint-disable-next-line no-console -- surfaces persistence failures during local development.
112
+ console.error("Failed to load treeview config:", error);
113
+ }
114
+ }
115
+ // oxlint-disable-next-line typescript/no-floating-promises -- loadConfig catches its own errors internally.
116
+ loadConfig();
117
+
118
+ watch(
119
+ [opened_views, panelWidth, additionalPanelWidth, selection, rowHeights],
120
+ () => {
121
+ // oxlint-disable-next-line unicorn/prefer-structured-clone, no-unsafe-type-assertion -- JSON round-trip of a known-shape ref; result matches the source type.
122
+ const clean_opened_views = JSON.parse(JSON.stringify(opened_views.value)) as OpenedView[];
123
+ // oxlint-disable-next-line unicorn/prefer-structured-clone, no-unsafe-type-assertion -- JSON round-trip of a known-shape ref; result matches the source type.
124
+ const clean_selectionIds = JSON.parse(JSON.stringify(selection.value)) as string[];
125
+ // oxlint-disable-next-line unicorn/prefer-structured-clone, no-unsafe-type-assertion -- JSON round-trip of a known-shape ref; result matches the source type.
126
+ const clean_rowHeights = JSON.parse(JSON.stringify(rowHeights.value)) as number[];
127
+
128
+ // oxlint-disable-next-line typescript/no-floating-promises -- best-effort persistence; failures aren't actionable here.
129
+ treeview_config_db.put({
130
+ id: "main",
131
+ opened_views: clean_opened_views,
132
+ panelWidth: panelWidth.value,
133
+ additionalPanelWidth: additionalPanelWidth.value,
134
+ selectionIds: clean_selectionIds,
135
+ rowHeights: clean_rowHeights,
136
+ });
137
+ },
138
+ { deep: true },
139
+ );
140
+
141
+ function closeView(id: string): void {
142
+ opened_views.value = opened_views.value.filter((view: ReadonlyOpenedView) => view.id !== id);
143
+ }
144
+
145
+ watch(selection, (current: readonly string[], previous: readonly string[]) => {
146
+ const { removed } = compareSelections(current, previous);
147
+ for (const id of removed) {
148
+ const index = opened_views.value.findIndex(
149
+ (view: ReadonlyOpenedView) => view.type === "component" && view.id === id,
150
+ );
151
+ if (index !== -1) {
152
+ closeView(id);
153
+ }
154
+ }
155
+ });
156
+
157
+ function toggleView(id: string): void {
158
+ const index = opened_views.value.findIndex((view: ReadonlyOpenedView) => view.id === id);
159
+ if (index !== -1) {
160
+ closeView(id);
161
+ } else if (id === "main") {
162
+ opened_views.value.unshift({
163
+ type: "object",
164
+ id: "main",
165
+ title: "Objects",
166
+ scrollTop: 0,
167
+ opened: [],
168
+ });
169
+ }
170
+ }
171
+
172
+ function addItem(geodeObjectType: string, name: string, id: string, viewer_type: string): void {
173
+ const child: TreeviewChild = {
174
+ title: name,
175
+ id,
176
+ viewer_type,
177
+ geode_object_type: geodeObjectType,
178
+ };
179
+ let found = false;
180
+ for (const item of items.value) {
181
+ if (item.title === geodeObjectType) {
182
+ item.children.push(child);
183
+ const options = { numeric: true, sensitivity: "base" as const };
184
+ item.children.sort((childA, childB) =>
185
+ childA.title.localeCompare(childB.title, undefined, options),
186
+ );
187
+ found = true;
188
+ break;
189
+ }
190
+ }
191
+ if (!found) {
192
+ items.value.push({ id: geodeObjectType, title: geodeObjectType, children: [child] });
193
+ const sort_options = { numeric: true, sensitivity: "base" as const };
194
+ items.value.sort((groupA: ReadonlyTreeviewGroup, groupB: ReadonlyTreeviewGroup) =>
195
+ groupA.title.localeCompare(groupB.title, undefined, sort_options),
196
+ );
197
+ }
198
+ selection.value = [...selection.value, id];
199
+ }
200
+
201
+ function removeItem(id: string): void {
202
+ for (let index = 0; index < items.value.length; index += 1) {
203
+ const group = items.value[index];
204
+ if (!group) {
205
+ continue;
206
+ }
207
+ const childIndex = group.children.findIndex((child) => child.id === id);
208
+ if (childIndex !== -1) {
209
+ group.children.splice(childIndex, 1);
210
+ if (group.children.length === 0) {
211
+ items.value.splice(index, 1);
212
+ }
213
+ selection.value = selection.value.filter((selection_id) => selection_id !== id);
214
+ return;
215
+ }
216
+ }
217
+ }
218
+
219
+ function displayAdditionalTree(
220
+ id: string,
221
+ title: string | undefined,
222
+ geodeObjectType: string,
223
+ viewType = "model_components",
224
+ ): void {
225
+ const viewId = `${id}_${viewType}`;
226
+ const index = opened_views.value.findIndex((view: ReadonlyOpenedView) => view.id === viewId);
227
+ if (index !== -1) {
228
+ closeView(viewId);
229
+ return;
230
+ }
231
+ additionalPanelWidth.value = panelWidth.value;
232
+ opened_views.value.push({
233
+ type: "component",
234
+ id: viewId,
235
+ modelId: id,
236
+ viewType,
237
+ title: title ?? id,
238
+ geode_object_type: geodeObjectType,
239
+ scrollTop: 0,
240
+ opened: [],
241
+ });
242
+ }
243
+
244
+ function moveView(from_index: number, to_index: number): void {
245
+ if (from_index !== 0 && to_index !== 0) {
246
+ const [element] = opened_views.value.splice(from_index, 1);
247
+ if (element) {
248
+ opened_views.value.splice(to_index, 0, element);
249
+ }
250
+ }
251
+ }
252
+
253
+ function importStores(snapshot: ReadonlyTreeviewSnapshot | undefined): void {
254
+ opened_views.value = snapshot?.opened_views
255
+ ? // oxlint-disable-next-line no-unsafe-type-assertion -- narrowing the readonly parameter view back to the mutable working type; these objects aren't actually frozen at runtime.
256
+ ([...snapshot.opened_views] as OpenedView[])
257
+ : defaultOpenedViews();
258
+ panelWidth.value = snapshot?.panelWidth ?? PANEL_WIDTH;
259
+ additionalPanelWidth.value = snapshot?.additionalPanelWidth ?? PANEL_WIDTH;
260
+ rowHeights.value = snapshot?.rowHeights ? [...snapshot.rowHeights] : [];
261
+ pendingSelectionIds.value = snapshot?.selectionIds
262
+ ? [...snapshot.selectionIds]
263
+ : (snapshot?.selection ?? []).map((selectionItem: string | { id: string }) =>
264
+ typeof selectionItem === "string" ? selectionItem : selectionItem.id,
265
+ );
266
+ }
267
+
268
+ function finalizeImportSelection(): void {
269
+ const rebuilt: string[] = [];
270
+ for (const group of items.value) {
271
+ for (const child of group.children) {
272
+ if (
273
+ pendingSelectionIds.value.length === 0 ||
274
+ pendingSelectionIds.value.includes(child.id)
275
+ ) {
276
+ rebuilt.push(child.id);
277
+ }
278
+ }
279
+ }
280
+ selection.value = rebuilt;
281
+ pendingSelectionIds.value = [];
282
+ }
283
+
284
+ function clear(): void {
285
+ items.value = [];
286
+ selection.value = [];
287
+ activeItems.value = [];
288
+ pendingSelectionIds.value = [];
289
+ opened_views.value = defaultOpenedViews();
290
+ }
291
+
292
+ function displayFileTree(): void {
293
+ opened_views.value = defaultOpenedViews();
294
+ }
295
+
296
+ function setPanelWidth(width: number): void {
297
+ panelWidth.value = width;
298
+ }
299
+
300
+ function setAdditionalPanelWidth(width: number): void {
301
+ additionalPanelWidth.value = width;
302
+ }
303
+
304
+ function setScrollTop(viewId: string, scrollTop: number): void {
305
+ const view = opened_views.value.find(
306
+ (openedView: ReadonlyOpenedView) => openedView.id === viewId,
307
+ );
308
+ if (view) {
309
+ view.scrollTop = scrollTop;
310
+ }
311
+ }
312
+
313
+ function setOpened(viewId: string, opened: readonly string[]): void {
314
+ const view = opened_views.value.find(
315
+ (openedView: ReadonlyOpenedView) => openedView.id === viewId,
316
+ );
317
+ if (view) {
318
+ view.opened = [...opened];
319
+ }
320
+ }
321
+
322
+ function setRowHeights(heights: readonly number[]): void {
323
+ rowHeights.value = [...heights];
324
+ }
325
+
326
+ function exportStores(): Omit<TreeviewConfigRecord, "id"> {
327
+ return {
328
+ opened_views: opened_views.value,
329
+ panelWidth: panelWidth.value,
330
+ additionalPanelWidth: additionalPanelWidth.value,
331
+ selectionIds: selection.value,
332
+ rowHeights: rowHeights.value,
333
+ };
334
+ }
335
+
336
+ function renameItem(id: string, newName: string): void {
337
+ for (const group of items.value) {
338
+ const child = group.children.find((childItem) => childItem.id === id);
339
+ if (child) {
340
+ child.title = newName;
341
+ const options = { numeric: true, sensitivity: "base" as const };
342
+ group.children.sort((childA, childB) =>
343
+ childA.title.localeCompare(childB.title, undefined, options),
344
+ );
345
+ break;
346
+ }
347
+ }
348
+ const view = opened_views.value.find((openedView: ReadonlyOpenedView) => openedView.id === id);
349
+ if (view) {
350
+ view.title = newName;
351
+ }
352
+ }
353
+
354
+ return {
355
+ items,
356
+ selection,
357
+ activeItems,
358
+ opened_views,
359
+ panelWidth,
360
+ additionalPanelWidth,
361
+ isImporting,
362
+ rowHeights,
363
+ addItem,
364
+ removeItem,
365
+ renameItem,
366
+ displayAdditionalTree,
367
+ closeView,
368
+ toggleView,
369
+ moveView,
370
+ importStores,
371
+ displayFileTree,
372
+ setPanelWidth,
373
+ setAdditionalPanelWidth,
374
+ setScrollTop,
375
+ setOpened,
376
+ setRowHeights,
377
+ exportStores,
378
+ finalizeImportSelection,
379
+ clear,
380
+ };
381
+ });
382
+
383
+ export type { TreeviewSnapshot };
@@ -1,5 +1,4 @@
1
1
  // Third party imports
2
- import _ from "lodash";
3
2
  // oxlint-disable-next-line no-unassigned-import
4
3
  import "@kitware/vtk.js/Rendering/OpenGL/Profiles/Geometry";
5
4
  import { connectImageStream } from "@kitware/vtk.js/Rendering/Misc/RemoteView";
@@ -18,6 +17,16 @@ import { useAppStore } from "@ogw_front/stores/app";
18
17
  import { useInfraStore } from "@ogw_front/stores/infra";
19
18
  import { viewer_call } from "@ogw_internal/utils/viewer_call";
20
19
 
20
+ import type { JsonRpcSchema, RequestHandlers } from "@ogw_shared/utils/types.js";
21
+ // oxlint-disable-next-line import/max-dependencies -- all imports above are required by this store.
22
+ import type { RpcClient } from "@ogw_shared/utils/call_raw.js";
23
+
24
+ interface PickedPoint {
25
+ x: number | undefined;
26
+ y: number | undefined;
27
+ z: number | undefined;
28
+ }
29
+
21
30
  const MS_PER_SECOND = 1000;
22
31
  const SECONDS_PER_REQUEST = 10;
23
32
  const request_timeout = MS_PER_SECOND * SECONDS_PER_REQUEST;
@@ -27,10 +36,11 @@ export const useViewerStore = defineStore(
27
36
  () => {
28
37
  const infraStore = useInfraStore();
29
38
  const default_local_port = ref("1234");
30
- const client = ref({});
31
- const config = ref(undefined);
39
+ // oxlint-disable-next-line no-unsafe-type-assertion -- placeholder before the real client is set by ws_connect.
40
+ const client = ref<RpcClient>({} as RpcClient);
41
+ const config = ref<unknown>(undefined);
32
42
  const picking_mode = ref(false);
33
- const picked_point = ref({
43
+ const picked_point = ref<PickedPoint>({
34
44
  x: undefined,
35
45
  y: undefined,
36
46
  z: undefined,
@@ -48,14 +58,38 @@ export const useViewerStore = defineStore(
48
58
  viewer_url += "/ws";
49
59
  return viewer_url;
50
60
  });
61
+ function start_request(): void {
62
+ request_counter.value += 1;
63
+ }
64
+ function stop_request(): void {
65
+ request_counter.value -= 1;
66
+ }
51
67
  const is_busy = computed(() => request_counter.value > 0);
52
- function toggle_picking_mode(value) {
68
+ function toggle_picking_mode(value: boolean): void {
53
69
  picking_mode.value = value;
54
70
  }
55
- function request({ schema, params = {}, timeout = request_timeout }, callbacks = {}) {
56
- const store = useViewerStore();
57
- return viewer_call(
58
- store,
71
+ // oxlint-disable-next-line unicorn/consistent-function-scoping
72
+ async function request(
73
+ {
74
+ schema,
75
+ params = {},
76
+ timeout = request_timeout,
77
+ }: {
78
+ schema: JsonRpcSchema;
79
+ params?: Record<string, unknown>;
80
+ timeout?: number;
81
+ },
82
+ callbacks: RequestHandlers = {},
83
+ ): Promise<unknown> {
84
+ const microservice = {
85
+ $id: "viewer",
86
+ client: client.value,
87
+ base_url: base_url.value,
88
+ start_request,
89
+ stop_request,
90
+ };
91
+ const result = await viewer_call(
92
+ microservice,
59
93
  {
60
94
  schema,
61
95
  params,
@@ -63,15 +97,16 @@ export const useViewerStore = defineStore(
63
97
  },
64
98
  {
65
99
  ...callbacks,
66
- response_function: async (response) => {
100
+ response_function: async (response: unknown) => {
67
101
  if (callbacks.response_function) {
68
102
  await callbacks.response_function(response);
69
103
  }
70
104
  },
71
105
  },
72
106
  );
107
+ return result;
73
108
  }
74
- async function set_picked_point(x, y) {
109
+ async function set_picked_point(x: number, y: number): Promise<void> {
75
110
  const schema = opengeodeweb_viewer_schemas.opengeodeweb_viewer.viewer.get_point_position;
76
111
  const params = {
77
112
  x: Math.round(x),
@@ -81,31 +116,37 @@ export const useViewerStore = defineStore(
81
116
  schema,
82
117
  params,
83
118
  });
84
- const { x: world_x, y: world_y, z: world_z } = response;
119
+ const {
120
+ x: world_x,
121
+ y: world_y,
122
+ z: world_z,
123
+ // oxlint-disable-next-line no-unsafe-type-assertion -- response shape is defined by the get_point_position schema.
124
+ } = response as { x: number; y: number; z: number };
85
125
  picked_point.value = {
86
126
  x: world_x,
87
127
  y: world_y,
88
128
  z: world_z,
89
129
  };
90
130
  }
91
- function ws_connect() {
131
+ async function ws_connect(): Promise<void> {
92
132
  if (status.value === Status.CONNECTED) {
93
133
  return;
94
134
  }
95
- return navigator.locks.request("viewer.ws_connect", async (lock) => {
135
+ await navigator.locks.request("viewer.ws_connect", async () => {
96
136
  if (status.value === Status.CONNECTED) {
97
137
  return;
98
138
  }
99
139
  try {
100
- console.log("VIEWER LOCK GRANTED !", lock);
101
140
  status.value = Status.CONNECTING;
102
- client.value = await initWebSocketClient(base_url.value, client.value, {
141
+ client.value = (await initWebSocketClient(base_url.value, client.value, {
103
142
  onConnectionClose: () => {
104
143
  status.value = Status.NOT_CONNECTED;
105
144
  },
106
- });
145
+ // oxlint-disable-next-line no-unsafe-type-assertion -- initWebSocketClient's return is not typed as RpcClient.
146
+ })) as unknown as RpcClient;
107
147
  connectImageStream(client.value.getConnection().getSession());
108
- client.value.endBusy();
148
+ // oxlint-disable-next-line no-unsafe-type-assertion -- endBusy is not part of the RpcClient type.
149
+ (client.value as unknown as { endBusy: () => void }).endBusy();
109
150
  const schema = opengeodeweb_viewer_schemas.opengeodeweb_viewer.viewer.reset_visualization;
110
151
  const timeout = undefined;
111
152
  await request({
@@ -114,22 +155,12 @@ export const useViewerStore = defineStore(
114
155
  });
115
156
  status.value = Status.CONNECTED;
116
157
  } catch (error) {
117
- console.error("ws_connect error", error);
118
158
  status.value = Status.NOT_CONNECTED;
119
159
  throw error;
120
160
  }
121
161
  });
122
162
  }
123
- function start_request() {
124
- request_counter.value += 1;
125
- }
126
- function stop_request() {
127
- request_counter.value -= 1;
128
- }
129
- function launch(args = ({ projectFolderPath } = {})) {
130
- console.log("[VIEWER] Launching viewer microservice...", {
131
- args,
132
- });
163
+ async function launch(args: Readonly<{ projectFolderPath?: string }> = {}): Promise<unknown> {
133
164
  const appStore = useAppStore();
134
165
  const { COMMAND_VIEWER, NUXT_ROOT_PATH } = useRuntimeConfig().public;
135
166
  const schema = opengeodeweb_front_schemas.api.local.app.run_viewer;
@@ -138,39 +169,41 @@ export const useViewerStore = defineStore(
138
169
  NUXT_ROOT_PATH,
139
170
  args,
140
171
  };
141
- console.log("[VIEWER] params", params);
142
- return appStore.request(
172
+ const result = await appStore.request(
143
173
  {
144
174
  schema,
145
175
  params,
146
176
  },
147
177
  {
148
- response_function: (response) => {
149
- console.log(`[VIEWER] Viewer launched on port ${response.port}`);
150
- default_local_port.value = response.port;
178
+ response_function: (response: unknown) => {
179
+ // oxlint-disable-next-line no-unsafe-type-assertion -- response shape is defined by the run_viewer schema.
180
+ const { port: viewerPort } = response as { port: string };
181
+ default_local_port.value = viewerPort;
151
182
  },
152
183
  },
153
184
  );
185
+ return result;
154
186
  }
155
- async function connect() {
156
- console.log("[VIEWER] Connecting to viewer microservice...");
187
+ async function connect(): Promise<void> {
157
188
  await ws_connect();
158
- console.log("[VIEWER] Viewer connected successfully");
159
189
  }
160
- function get_version(schema) {
190
+ async function get_version(schema: JsonRpcSchema | undefined): Promise<unknown> {
161
191
  if (!schema) {
162
- return;
192
+ return undefined;
163
193
  }
164
- return request(
194
+ const result = await request(
165
195
  {
166
196
  schema,
167
197
  },
168
198
  {
169
- response_function: (response) => {
170
- version.value = response.microservice_version;
199
+ response_function: (response: unknown) => {
200
+ // oxlint-disable-next-line no-unsafe-type-assertion -- response shape is defined by the version schema.
201
+ const { microservice_version } = response as { microservice_version: string };
202
+ version.value = microservice_version;
171
203
  },
172
204
  },
173
205
  );
206
+ return result;
174
207
  }
175
208
  return {
176
209
  default_local_port,
@@ -0,0 +1,40 @@
1
+ interface AttributeRangeSource {
2
+ min_values?: readonly number[];
3
+ max_values?: readonly number[];
4
+ min_value?: number;
5
+ max_value?: number;
6
+ }
7
+
8
+ interface AttributeRange {
9
+ min: number;
10
+ max: number;
11
+ }
12
+
13
+ export function getAttributeRange(
14
+ currentAttribute: AttributeRangeSource | undefined | null,
15
+ compIndex = 0,
16
+ ): AttributeRange {
17
+ if (!currentAttribute) {
18
+ return { min: 0, max: 1 };
19
+ }
20
+
21
+ const { min_values, max_values, min_value, max_value } = currentAttribute;
22
+ let min = 0;
23
+ let max = 1;
24
+
25
+ const min_at_index = min_values?.[compIndex];
26
+ if (min_at_index !== undefined) {
27
+ min = min_at_index;
28
+ } else if (compIndex === 0 && min_value !== undefined) {
29
+ min = min_value;
30
+ }
31
+
32
+ const max_at_index = max_values?.[compIndex];
33
+ if (max_at_index !== undefined) {
34
+ max = max_at_index;
35
+ } else if (compIndex === 0 && max_value !== undefined) {
36
+ max = max_value;
37
+ }
38
+
39
+ return { min, max };
40
+ }