@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,27 @@
1
- <script setup>
2
- const { separator, headerRow, firstRow, xColumn, yColumn, zColumn, headers } = defineProps({
3
- separator: { type: String, required: true },
4
- headerRow: { type: Number, required: true },
5
- firstRow: { type: Number, required: true },
6
- xColumn: { type: String, default: undefined },
7
- yColumn: { type: String, default: undefined },
8
- zColumn: { type: String, default: undefined },
9
- headers: { type: Array, default: () => [] },
10
- });
1
+ <script setup lang="ts">
2
+ interface HeaderOption {
3
+ title: string;
4
+ key: string;
5
+ }
6
+
7
+ interface Props {
8
+ separator: string;
9
+ headers?: HeaderOption[];
10
+ }
11
+
12
+ const { separator, headers = [] } = defineProps<Props>();
11
13
 
12
- const emit = defineEmits([
13
- "update:separator",
14
- "update:headerRow",
15
- "update:firstRow",
16
- "update:xColumn",
17
- "update:yColumn",
18
- "update:zColumn",
19
- ]);
14
+ const headerRow = defineModel<number>("headerRow", { required: true });
15
+ const firstRow = defineModel<number>("firstRow", { required: true });
16
+ const xColumn = defineModel<string>("xColumn");
17
+ const yColumn = defineModel<string>("yColumn");
18
+ const zColumn = defineModel<string>("zColumn");
19
+
20
+ interface Emits {
21
+ "update:separator": [value: string];
22
+ }
23
+
24
+ const emit = defineEmits<Emits>();
20
25
 
21
26
  const separators = [
22
27
  { title: "Comma (,)", value: "," },
@@ -27,8 +32,8 @@ const separators = [
27
32
  { title: "Custom", value: "custom" },
28
33
  ];
29
34
 
30
- const selectedType = ref(",");
31
- const customValue = ref("");
35
+ const selectedType = ref<string>(",");
36
+ const customValue = ref<string>("");
32
37
 
33
38
  watch(
34
39
  () => separator,
@@ -59,31 +64,6 @@ watch(customValue, (newVal) => {
59
64
  emit("update:separator", newVal);
60
65
  }
61
66
  });
62
-
63
- const internalHeaderRow = computed({
64
- get: () => headerRow,
65
- set: (value) => emit("update:headerRow", value),
66
- });
67
-
68
- const internalFirstRow = computed({
69
- get: () => firstRow,
70
- set: (value) => emit("update:firstRow", value),
71
- });
72
-
73
- const internalXColumn = computed({
74
- get: () => xColumn,
75
- set: (value) => emit("update:xColumn", value),
76
- });
77
-
78
- const internalYColumn = computed({
79
- get: () => yColumn,
80
- set: (value) => emit("update:yColumn", value),
81
- });
82
-
83
- const internalZColumn = computed({
84
- get: () => zColumn,
85
- set: (value) => emit("update:zColumn", value),
86
- });
87
67
  </script>
88
68
 
89
69
  <template>
@@ -118,7 +98,7 @@ const internalZColumn = computed({
118
98
  <div class="text-overline mb-4 text-primary font-weight-bold">Row Configuration</div>
119
99
 
120
100
  <v-text-field
121
- v-model.number="internalHeaderRow"
101
+ v-model.number="headerRow"
122
102
  type="number"
123
103
  label="Header Row"
124
104
  variant="outlined"
@@ -131,7 +111,7 @@ const internalZColumn = computed({
131
111
  />
132
112
 
133
113
  <v-text-field
134
- v-model.number="internalFirstRow"
114
+ v-model.number="firstRow"
135
115
  type="number"
136
116
  label="First Data Row"
137
117
  variant="outlined"
@@ -148,7 +128,7 @@ const internalZColumn = computed({
148
128
  <div class="text-overline mb-4 text-primary font-weight-bold">Spatial Mapping</div>
149
129
 
150
130
  <v-select
151
- v-model="internalXColumn"
131
+ v-model="xColumn"
152
132
  :items="headers"
153
133
  item-title="title"
154
134
  item-value="key"
@@ -163,7 +143,7 @@ const internalZColumn = computed({
163
143
  />
164
144
 
165
145
  <v-select
166
- v-model="internalYColumn"
146
+ v-model="yColumn"
167
147
  :items="headers"
168
148
  item-title="title"
169
149
  item-value="key"
@@ -178,7 +158,7 @@ const internalZColumn = computed({
178
158
  />
179
159
 
180
160
  <v-select
181
- v-model="internalZColumn"
161
+ v-model="zColumn"
182
162
  :items="headers"
183
163
  item-title="title"
184
164
  item-value="key"
@@ -1,18 +1,38 @@
1
- <script setup>
2
- const { headers, rows, loading, coordinates, separator, headerRow, firstRow } = defineProps({
3
- headers: { type: Array, required: true },
4
- rows: { type: Array, required: true },
5
- loading: { type: Boolean, default: false },
6
- coordinates: {
7
- type: Object,
8
- default: () => ({ x: undefined, y: undefined, z: undefined }),
9
- },
10
- separator: { type: String, default: "," },
11
- headerRow: { type: Number, default: 0 },
12
- firstRow: { type: Number, default: 1 },
13
- });
1
+ <script setup lang="ts">
2
+ interface CsvHeader {
3
+ title: string;
4
+ key: string;
5
+ align: "start" | "end" | "center";
6
+ sortable: boolean;
7
+ }
8
+ type CsvRow = Record<string, string>;
9
+ interface CsvCoordinates {
10
+ x?: string;
11
+ y?: string;
12
+ z?: string;
13
+ }
14
+
15
+ interface Props {
16
+ headers: CsvHeader[];
17
+ rows: CsvRow[];
18
+ loading?: boolean;
19
+ coordinates?: CsvCoordinates;
20
+ separator?: string;
21
+ headerRow?: number;
22
+ firstRow?: number;
23
+ }
24
+
25
+ const {
26
+ headers,
27
+ rows,
28
+ loading = false,
29
+ coordinates = { x: undefined, y: undefined, z: undefined },
30
+ separator = ",",
31
+ headerRow = 0,
32
+ firstRow = 1,
33
+ } = defineProps<Props>();
14
34
 
15
- function getColumnClass(key) {
35
+ function getColumnClass(key: string): string {
16
36
  if (key === coordinates.x) {
17
37
  return "x-col-highlight";
18
38
  }
@@ -1,11 +1,14 @@
1
1
  import { useDataStore } from "@ogw_front/stores/data";
2
2
  import { useTreeviewStore } from "@ogw_front/stores/treeview";
3
3
 
4
- export function useBatchStyle() {
4
+ export function useBatchStyle(): { applyBatchStyle: typeof applyBatchStyle } {
5
5
  const treeviewStore = useTreeviewStore();
6
6
  const dataStore = useDataStore();
7
7
 
8
- async function applyBatchStyle(id, action) {
8
+ async function applyBatchStyle(
9
+ id: string,
10
+ action: (id: string) => Promise<unknown>,
11
+ ): Promise<void> {
9
12
  const isActive = treeviewStore.activeItems.includes(id);
10
13
  if (!isActive || treeviewStore.activeItems.length <= 1) {
11
14
  await action(id);
@@ -19,17 +22,16 @@ export function useBatchStyle() {
19
22
  const promises = treeviewStore.activeItems.map(async (selectedId) => {
20
23
  try {
21
24
  const item = await dataStore.item(selectedId);
22
- if (item && item.geode_object_type === targetType) {
25
+ if (item.geode_object_type === targetType) {
23
26
  await action(selectedId);
24
27
  }
25
- } catch (error) {
26
- console.error("Failed to apply batch style to item", selectedId, error);
28
+ } catch {
29
+ // Ignore items that fail to load; batch style continues for the rest.
27
30
  }
28
31
  });
29
32
 
30
33
  await Promise.all(promises);
31
- } catch (error) {
32
- console.error("Failed to fetch current item for batch style", id, error);
34
+ } catch {
33
35
  await action(id);
34
36
  }
35
37
  }
@@ -0,0 +1,204 @@
1
+ import {
2
+ CHANGE_THRESHOLD,
3
+ type MainCameraOptions,
4
+ type SceneBoundsInfo,
5
+ alignCameraToMainCamera,
6
+ computeSceneBoundsInfo,
7
+ resolveActiveActors,
8
+ } from "@ogw_front/utils/clipping_planes";
9
+ import {
10
+ type ClippingPlane,
11
+ useWidgetEntryManager,
12
+ } from "@ogw_front/composables/clipping_planes_widget_entries";
13
+ import {
14
+ type vtkWidgetManager as WidgetManagerInstance,
15
+ newInstance as vtkWidgetManager,
16
+ } from "@kitware/vtk.js/Widgets/Core/WidgetManager";
17
+ import type { vtkGenericRenderWindow as GenericRenderWindowInstance } from "@ogw_internal/stores/hybrid_viewer/vtk_types";
18
+ import type { useHybridViewerStore } from "@ogw_front/stores/hybrid_viewer";
19
+ import type { vtkCamera } from "@kitware/vtk.js/Rendering/Core/Camera";
20
+ import { newInstance as vtkGenericRenderWindow } from "@kitware/vtk.js/Rendering/Misc/GenericRenderWindow";
21
+
22
+ interface DataItemLike {
23
+ id: string;
24
+ }
25
+
26
+ interface ClippingPlanesWidgetParams {
27
+ planes: Ref<ClippingPlane[]>;
28
+ targetAllVisible: Ref<boolean>;
29
+ selectedDatasetIds: Ref<string[]>;
30
+ allItems: Ref<DataItemLike[]>;
31
+ hybridViewerStore: ReturnType<typeof useHybridViewerStore>;
32
+ debouncedApply: (...args: readonly unknown[]) => void;
33
+ }
34
+
35
+ // oxlint-disable-next-line max-params max-lines-per-function typescript/prefer-readonly-parameter-types -- Ref-backed params are inherently mutable through .value.
36
+ function useClippingPlanesWidget({
37
+ planes,
38
+ targetAllVisible,
39
+ selectedDatasetIds,
40
+ allItems,
41
+ hybridViewerStore,
42
+ debouncedApply,
43
+ }: ClippingPlanesWidgetParams): {
44
+ getSceneCenter: typeof getSceneCenter;
45
+ syncWidgets: typeof syncWidgets;
46
+ syncLocalCamera: typeof syncLocalCamera;
47
+ cleanupLocalWidget: typeof cleanupLocalWidget;
48
+ initLocalWidget: typeof initLocalWidget;
49
+ updateWidgetPlacement: typeof updateWidgetPlacement;
50
+ isFromWidget: typeof isFromWidget;
51
+ setFromWidget: typeof setFromWidget;
52
+ } {
53
+ let localRenderWindow: GenericRenderWindowInstance | undefined = undefined;
54
+ let widgetManager: WidgetManagerInstance | undefined = undefined;
55
+ let maxDistance = 0;
56
+ let isLimitingCameraZoom = false;
57
+ const widgetEntryManager = useWidgetEntryManager({ planes, debouncedApply });
58
+
59
+ function getSceneBoundsInfo(): SceneBoundsInfo {
60
+ return computeSceneBoundsInfo(
61
+ resolveActiveActors(
62
+ targetAllVisible.value,
63
+ allItems.value,
64
+ selectedDatasetIds.value,
65
+ hybridViewerStore.hybridDb,
66
+ ),
67
+ );
68
+ }
69
+ function getSceneCenter(): readonly number[] {
70
+ return getSceneBoundsInfo().center;
71
+ }
72
+
73
+ function syncWidgets(): void {
74
+ if (!widgetManager || !localRenderWindow) {
75
+ return;
76
+ }
77
+ widgetEntryManager.removeExtraWidgets(widgetManager);
78
+ const { cubicBounds } = getSceneBoundsInfo();
79
+ for (const [idx, plane] of planes.value.entries()) {
80
+ widgetEntryManager.updateWidgetEntry(idx, plane, cubicBounds, widgetManager);
81
+ }
82
+ localRenderWindow.getRenderWindow().render();
83
+ }
84
+
85
+ function limitCameraZoomOut(camera: vtkCamera): void {
86
+ if (maxDistance <= 0 || isLimitingCameraZoom) {
87
+ return;
88
+ }
89
+ const currentDist = camera.getDistance();
90
+ if (currentDist <= maxDistance + CHANGE_THRESHOLD) {
91
+ return;
92
+ }
93
+ isLimitingCameraZoom = true;
94
+ const focal = camera.getFocalPoint();
95
+ const pos = camera.getPosition();
96
+ const ratio = maxDistance / currentDist;
97
+ camera.setPosition(
98
+ focal[0] + (pos[0] - focal[0]) * ratio,
99
+ focal[1] + (pos[1] - focal[1]) * ratio,
100
+ focal[2] + (pos[2] - focal[2]) * ratio,
101
+ );
102
+ localRenderWindow?.getRenderWindow().render();
103
+ isLimitingCameraZoom = false;
104
+ }
105
+
106
+ function syncLocalCamera(): void {
107
+ if (!localRenderWindow) {
108
+ return;
109
+ }
110
+ const renderer = localRenderWindow.getRenderer();
111
+ const camera = renderer.getActiveCamera();
112
+ const mainCam = hybridViewerStore.camera_options as MainCameraOptions;
113
+ const { center, cubicBounds } = getSceneBoundsInfo();
114
+ // oxlint-disable-next-line no-unsafe-type-assertion -- cubicBounds is always a 6-element bounds tuple.
115
+ renderer.resetCamera(cubicBounds as [number, number, number, number, number, number]);
116
+ alignCameraToMainCamera(camera, mainCam, center);
117
+ limitCameraZoomOut(camera);
118
+ localRenderWindow.getRenderWindow().render();
119
+ }
120
+
121
+ function cleanupLocalWidget(): void {
122
+ maxDistance = 0;
123
+ isLimitingCameraZoom = false;
124
+ widgetEntryManager.cleanupAll(widgetManager);
125
+ if (localRenderWindow) {
126
+ localRenderWindow.delete();
127
+ localRenderWindow = undefined;
128
+ widgetManager = undefined;
129
+ }
130
+ }
131
+ function updateWidgetPlacement({ isReset = false }: { isReset?: boolean } = {}): void {
132
+ if (!widgetManager || !localRenderWindow) {
133
+ return;
134
+ }
135
+ if (isReset) {
136
+ maxDistance = 0;
137
+ }
138
+ const center = getSceneCenter();
139
+ for (const plane of planes.value) {
140
+ if (!plane.origin || isReset) {
141
+ plane.origin = [...center];
142
+ }
143
+ }
144
+ syncWidgets();
145
+ syncLocalCamera();
146
+ if (maxDistance <= 0) {
147
+ maxDistance = localRenderWindow.getRenderer().getActiveCamera().getDistance();
148
+ }
149
+ }
150
+
151
+ function initLocalWidget(container: HTMLElement): void {
152
+ cleanupLocalWidget();
153
+ container.addEventListener(
154
+ "wheel",
155
+ (event: WheelEvent) => {
156
+ event.stopPropagation();
157
+ },
158
+ { passive: true },
159
+ );
160
+ localRenderWindow = vtkGenericRenderWindow({
161
+ background: [0, 0, 0, 0],
162
+ listenWindowResize: false,
163
+ });
164
+ localRenderWindow.setContainer(container);
165
+ const camera = localRenderWindow.getRenderer().getActiveCamera();
166
+ camera.onModified(() => {
167
+ limitCameraZoomOut(camera);
168
+ });
169
+ // oxlint-disable-next-line no-unsafe-type-assertion -- trusted vtk.js OpenGL render window API boundary.
170
+ const openGLRenderWindow = localRenderWindow.getApiSpecificRenderWindow() as unknown as {
171
+ getCanvas: () => HTMLCanvasElement;
172
+ };
173
+ const canvas = openGLRenderWindow.getCanvas();
174
+ Object.assign(canvas.style, {
175
+ width: "100%",
176
+ height: "100%",
177
+ background: "transparent",
178
+ });
179
+ localRenderWindow.resize();
180
+ widgetManager = vtkWidgetManager();
181
+ widgetManager.setRenderer(localRenderWindow.getRenderer());
182
+ updateWidgetPlacement();
183
+ }
184
+
185
+ function isFromWidget(): boolean {
186
+ return widgetEntryManager.isFromWidget();
187
+ }
188
+
189
+ function setFromWidget(value: boolean): void {
190
+ widgetEntryManager.setFromWidget(value);
191
+ }
192
+
193
+ return {
194
+ getSceneCenter,
195
+ syncWidgets,
196
+ syncLocalCamera,
197
+ cleanupLocalWidget,
198
+ initLocalWidget,
199
+ updateWidgetPlacement,
200
+ isFromWidget,
201
+ setFromWidget,
202
+ };
203
+ }
204
+ export { useClippingPlanesWidget };
@@ -0,0 +1,189 @@
1
+ import {
2
+ AXIS_SCALE,
3
+ PLANE_COLORS,
4
+ SIZE_RATIO,
5
+ getPlaneStyle,
6
+ hasPlaneChanged,
7
+ } from "@ogw_front/utils/clipping_planes";
8
+ import type { vtkWidgetManager as WidgetManagerInstance } from "@kitware/vtk.js/Widgets/Core/WidgetManager";
9
+ import type vtkAbstractWidget from "@kitware/vtk.js/Widgets/Core/AbstractWidget";
10
+ import type vtkAbstractWidgetFactory from "@kitware/vtk.js/Widgets/Core/AbstractWidgetFactory";
11
+ import { newInstance as vtkImplicitPlaneWidget } from "@kitware/vtk.js/Widgets/Widgets3D/ImplicitPlaneWidget";
12
+
13
+ interface ClippingPlane {
14
+ origin?: number[];
15
+ normal: number[];
16
+ }
17
+
18
+ interface ClippingWidgetState {
19
+ getOrigin: () => number[];
20
+ setOrigin: (origin: readonly number[]) => void;
21
+ getNormal: () => number[];
22
+ setNormal: (normal: readonly number[]) => void;
23
+ onModified: (callback: () => void) => { unsubscribe: () => void };
24
+ }
25
+
26
+ interface PlaneWidget {
27
+ getWidgetState: () => ClippingWidgetState;
28
+ delete: () => void;
29
+ }
30
+
31
+ interface WidgetHandle {
32
+ setAxisScale: (scale: number) => void;
33
+ setHandleSizeRatio: (ratio: number) => void;
34
+ setRepresentationStyle: (style: unknown) => void;
35
+ placeWidget: (bounds: readonly number[]) => void;
36
+ }
37
+
38
+ interface WidgetEntry {
39
+ planeWidget: PlaneWidget;
40
+ widgetHandle: WidgetHandle;
41
+ subscription: { unsubscribe: () => void };
42
+ }
43
+
44
+ function asWidgetFactory(widget: PlaneWidget): vtkAbstractWidgetFactory<vtkAbstractWidget> {
45
+ // oxlint-disable-next-line no-unsafe-type-assertion -- vtk.js's WidgetManager APIs (addWidget/removeWidget) are untyped for our custom PlaneWidget shape; narrowed once here.
46
+ return widget as unknown as vtkAbstractWidgetFactory<vtkAbstractWidget>;
47
+ }
48
+
49
+ interface WidgetEntryManagerParams {
50
+ planes: Ref<ClippingPlane[]>;
51
+ debouncedApply: (...args: readonly unknown[]) => void;
52
+ }
53
+
54
+ // oxlint-disable-next-line max-lines-per-function typescript/prefer-readonly-parameter-types -- Ref-backed params are inherently mutable through .value.
55
+ function useWidgetEntryManager({ planes, debouncedApply }: WidgetEntryManagerParams): {
56
+ removeExtraWidgets: (widgetManager: WidgetManagerInstance | undefined) => void;
57
+ updateWidgetEntry: (
58
+ idx: number,
59
+ plane: ClippingPlane,
60
+ cubicBounds: readonly number[],
61
+ widgetManager: WidgetManagerInstance,
62
+ ) => void;
63
+ cleanupAll: (widgetManager: WidgetManagerInstance | undefined) => void;
64
+ isFromWidget: () => boolean;
65
+ setFromWidget: (value: boolean) => void;
66
+ } {
67
+ let widgetEntries: WidgetEntry[] = [];
68
+ let fromWidget = false;
69
+
70
+ function createWidgetEntry(
71
+ planeWidget: PlaneWidget,
72
+ widgetHandle: WidgetHandle,
73
+ planeIndex: number,
74
+ ): WidgetEntry {
75
+ const widgetState = planeWidget.getWidgetState();
76
+ const plane = planes.value[planeIndex];
77
+ if (plane?.origin) {
78
+ widgetState.setOrigin(plane.origin);
79
+ }
80
+ if (plane) {
81
+ widgetState.setNormal(plane.normal);
82
+ }
83
+ const subscription = widgetState.onModified(() => {
84
+ if (fromWidget) {
85
+ return;
86
+ }
87
+ const origin: number[] = widgetState.getOrigin().map((val: number) => Number(val.toFixed(4)));
88
+ const normal: number[] = widgetState.getNormal().map((val: number) => Number(val.toFixed(4)));
89
+ const currentPlane = planes.value[planeIndex];
90
+ if (
91
+ !currentPlane ||
92
+ !hasPlaneChanged(origin, normal, currentPlane.origin, currentPlane.normal)
93
+ ) {
94
+ return;
95
+ }
96
+ fromWidget = true;
97
+ currentPlane.origin = origin;
98
+ currentPlane.normal = normal;
99
+ nextTick(() => {
100
+ fromWidget = false;
101
+ // oxlint-disable-next-line promise/prefer-await-to-then -- fire-and-forget inside a sync widget callback; see codebase convention in global_attribute_style.ts.
102
+ }).catch(() => undefined);
103
+ debouncedApply();
104
+ });
105
+ return {
106
+ planeWidget,
107
+ widgetHandle,
108
+ subscription,
109
+ };
110
+ }
111
+
112
+ function removeExtraWidgets(widgetManager: WidgetManagerInstance | undefined): void {
113
+ while (widgetEntries.length > planes.value.length) {
114
+ const entry = widgetEntries.pop();
115
+ if (!entry) {
116
+ continue;
117
+ }
118
+ entry.subscription.unsubscribe();
119
+ widgetManager?.removeWidget(asWidgetFactory(entry.planeWidget));
120
+ entry.planeWidget.delete();
121
+ }
122
+ }
123
+
124
+ function updateWidgetEntry(
125
+ idx: number,
126
+ plane: ClippingPlane,
127
+ cubicBounds: readonly number[],
128
+ widgetManager: WidgetManagerInstance,
129
+ ): void {
130
+ // Modulo guarantees this index is within bounds of the non-empty PLANE_COLORS array.
131
+ const rgb = PLANE_COLORS[idx % PLANE_COLORS.length];
132
+ if (rgb === undefined) {
133
+ return;
134
+ }
135
+ if (!widgetEntries[idx]) {
136
+ // oxlint-disable-next-line no-unsafe-call no-unsafe-type-assertion -- vtk.js has no types for ImplicitPlaneWidget's factory; narrowed here.
137
+ const planeWidget = vtkImplicitPlaneWidget() as PlaneWidget;
138
+ const widgetHandle = widgetManager.addWidget(
139
+ asWidgetFactory(planeWidget),
140
+ // oxlint-disable-next-line no-unsafe-type-assertion -- vtk.js WidgetManager.addWidget is untyped for our custom WidgetHandle shape; narrowed here.
141
+ ) as unknown as WidgetHandle;
142
+ widgetEntries.push(createWidgetEntry(planeWidget, widgetHandle, idx));
143
+ }
144
+ const entry = widgetEntries[idx];
145
+ if (!entry) {
146
+ return;
147
+ }
148
+ entry.widgetHandle.setRepresentationStyle(getPlaneStyle(rgb));
149
+ fromWidget = true;
150
+ entry.widgetHandle.placeWidget(cubicBounds);
151
+ fromWidget = false;
152
+ entry.widgetHandle.setAxisScale(AXIS_SCALE);
153
+ entry.widgetHandle.setHandleSizeRatio(SIZE_RATIO);
154
+ const widgetState = entry.planeWidget.getWidgetState();
155
+ if (plane.origin) {
156
+ widgetState.setOrigin(plane.origin);
157
+ }
158
+ widgetState.setNormal(plane.normal);
159
+ }
160
+
161
+ function cleanupAll(widgetManager: WidgetManagerInstance | undefined): void {
162
+ for (const entry of widgetEntries) {
163
+ entry.subscription.unsubscribe();
164
+ if (widgetManager) {
165
+ widgetManager.removeWidget(asWidgetFactory(entry.planeWidget));
166
+ }
167
+ entry.planeWidget.delete();
168
+ }
169
+ widgetEntries = [];
170
+ }
171
+
172
+ function isFromWidget(): boolean {
173
+ return fromWidget;
174
+ }
175
+
176
+ function setFromWidget(value: boolean): void {
177
+ fromWidget = value;
178
+ }
179
+
180
+ return {
181
+ removeExtraWidgets,
182
+ updateWidgetEntry,
183
+ cleanupAll,
184
+ isFromWidget,
185
+ setFromWidget,
186
+ };
187
+ }
188
+
189
+ export { useWidgetEntryManager, type ClippingPlane };
@@ -0,0 +1,7 @@
1
+ import { useClipboard } from "@vueuse/core";
2
+
3
+ const COPIED_FEEDBACK_TIMEOUT = 1500;
4
+
5
+ export function useCopyToClipboard(): ReturnType<typeof useClipboard> {
6
+ return useClipboard({ copiedDuring: COPIED_FEEDBACK_TIMEOUT });
7
+ }