@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,271 @@
1
+ import type { Ref } from "vue";
2
+
3
+ // Same shape as Vue's MaybeRefOrGetter<T>, kept as a local alias for readability at call sites.
4
+ type ReadonlyMaybeRefOrGetter<Value> = Value | Ref<Value> | (() => Value);
5
+
6
+ type TreeItem = Record<string, unknown>;
7
+
8
+ interface ItemPropsConfig {
9
+ value: string;
10
+ title: string;
11
+ children: string;
12
+ height: number;
13
+ [key: string]: unknown;
14
+ }
15
+
16
+ interface SelectionConfig {
17
+ selectable: boolean;
18
+ strategy: string;
19
+ [key: string]: unknown;
20
+ }
21
+
22
+ interface VirtualTreeProps {
23
+ readonly items?: readonly TreeItem[];
24
+ readonly opened?: readonly unknown[];
25
+ readonly selected?: readonly unknown[];
26
+ readonly active?: readonly unknown[];
27
+ readonly itemProps?: Partial<ItemPropsConfig>;
28
+ readonly selection?: Partial<SelectionConfig>;
29
+ readonly search?: string;
30
+ readonly customFilter?: (id: unknown, search: string, context: { raw: TreeItem }) => boolean;
31
+ }
32
+
33
+ interface DisplayItem {
34
+ raw: TreeItem;
35
+ id: unknown;
36
+ depth: number;
37
+ isOpen: boolean;
38
+ isActive: boolean;
39
+ isLeaf: boolean;
40
+ }
41
+
42
+ type EmitFn = (event: string, ...args: readonly unknown[]) => void;
43
+
44
+ interface UseVirtualTreeReturn {
45
+ actualItemProps: ComputedRef<ItemPropsConfig>;
46
+ actualSelection: ComputedRef<SelectionConfig>;
47
+ displayItems: ComputedRef<DisplayItem[]>;
48
+ toggleOpen: (item: TreeItem) => void;
49
+ toggleSelect: (item: TreeItem) => void;
50
+ isSelected: (item: TreeItem) => boolean;
51
+ getIndeterminate: (item: TreeItem) => boolean;
52
+ }
53
+
54
+ // Real runtime check (rather than an `as TreeItem[]` cast) for the duck-typed "children" field:
55
+ // Item shapes vary across callers (treeview groups, model component/collection groups, ...), so
56
+ // This only verifies it is actually an array, same as the assumption the old cast silently made.
57
+ function isTreeItemArray(value: unknown): value is TreeItem[] {
58
+ return Array.isArray(value);
59
+ }
60
+
61
+ // Extracted so we never call String() directly on a value typed as `unknown` (ids and titles can
62
+ // Be anything at runtime): only stringify primitives that have a sane toString, and fall back to
63
+ // "" for anything else instead of risking "[object Object]".
64
+ function toDisplayString(value: unknown): string {
65
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
66
+ return String(value);
67
+ }
68
+ return "";
69
+ }
70
+
71
+ function useVirtualTree(
72
+ propsIn: ReadonlyMaybeRefOrGetter<VirtualTreeProps>,
73
+ emit: EmitFn,
74
+ ): UseVirtualTreeReturn {
75
+ const props = toRef(propsIn);
76
+
77
+ const actualItemProps = computed<ItemPropsConfig>(() => ({
78
+ value: "id",
79
+ title: "title",
80
+ children: "children",
81
+ height: 28,
82
+ ...props.value.itemProps,
83
+ }));
84
+
85
+ const actualSelection = computed<SelectionConfig>(() => ({
86
+ selectable: false,
87
+ strategy: "classic",
88
+ ...props.value.selection,
89
+ }));
90
+
91
+ const openedSet = computed(() => new Set(props.value.opened));
92
+ const selectedSet = computed(() => new Set(props.value.selected));
93
+ const activeSet = computed(() => new Set(props.value.active));
94
+
95
+ function toggleOpen(item: TreeItem): void {
96
+ const id = item[actualItemProps.value.value];
97
+ const { opened: openedArray = [] } = props.value;
98
+ const newOpened = new Set(openedArray);
99
+ if (newOpened.has(id)) {
100
+ newOpened.delete(id);
101
+ } else {
102
+ newOpened.add(id);
103
+ }
104
+ emit("update:opened", [...newOpened]);
105
+ }
106
+
107
+ function getChildrenOf(item: TreeItem): TreeItem[] | undefined {
108
+ const rawChildren = item[actualItemProps.value.children];
109
+ return isTreeItemArray(rawChildren) ? rawChildren : undefined;
110
+ }
111
+
112
+ function getLeafChildrenIds(item: TreeItem): unknown[] {
113
+ const children = getChildrenOf(item);
114
+ if (children) {
115
+ return children.flatMap((child) => getLeafChildrenIds(child));
116
+ }
117
+ return [item[actualItemProps.value.value]];
118
+ }
119
+
120
+ function isSelected(item: TreeItem): boolean {
121
+ const id = item[actualItemProps.value.value];
122
+ if (selectedSet.value.has(id)) {
123
+ return true;
124
+ }
125
+ if (actualSelection.value.strategy === "classic") {
126
+ const childrenIds = getLeafChildrenIds(item);
127
+ return (
128
+ childrenIds.length > 0 && childrenIds.every((childId) => selectedSet.value.has(childId))
129
+ );
130
+ }
131
+ return false;
132
+ }
133
+
134
+ function getIndeterminate(item: TreeItem): boolean {
135
+ if (actualSelection.value.strategy !== "classic") {
136
+ return false;
137
+ }
138
+ const childrenIds = getLeafChildrenIds(item);
139
+ if (childrenIds.length === 0) {
140
+ return false;
141
+ }
142
+
143
+ const selectedChildren = childrenIds.filter((childId) => selectedSet.value.has(childId));
144
+ return selectedChildren.length > 0 && selectedChildren.length < childrenIds.length;
145
+ }
146
+
147
+ function toggleSelect(item: TreeItem): void {
148
+ const id = item[actualItemProps.value.value];
149
+ const { selected: selectedArray = [] } = props.value;
150
+ const newSelected = new Set(selectedArray);
151
+ const isCurrentlySelected = newSelected.has(id) || isSelected(item);
152
+
153
+ if (actualSelection.value.strategy === "classic") {
154
+ const childrenIds = getLeafChildrenIds(item);
155
+ if (isCurrentlySelected) {
156
+ newSelected.delete(id);
157
+ for (const childId of childrenIds) {
158
+ newSelected.delete(childId);
159
+ }
160
+ } else {
161
+ newSelected.add(id);
162
+ for (const childId of childrenIds) {
163
+ newSelected.add(childId);
164
+ }
165
+ }
166
+ } else if (isCurrentlySelected) {
167
+ newSelected.delete(id);
168
+ } else {
169
+ newSelected.add(id);
170
+ }
171
+ emit("update:selected", [...newSelected]);
172
+ }
173
+
174
+ function flattenTree(itemsList: readonly TreeItem[], depth = 0): DisplayItem[] {
175
+ const { search, customFilter } = props.value;
176
+ const result: DisplayItem[] = [];
177
+
178
+ for (const item of itemsList) {
179
+ const id = item[actualItemProps.value.value];
180
+ const children = getChildrenOf(item);
181
+ const hasChildren = Boolean(children && children.length > 0);
182
+
183
+ const isOpen = openedSet.value.has(id);
184
+ const isActive = activeSet.value.has(id);
185
+
186
+ if (search !== undefined && search !== "") {
187
+ const lowerSearch = search.toLowerCase();
188
+ const matches = customFilter
189
+ ? customFilter(id, search, { raw: item })
190
+ : toDisplayString(item[actualItemProps.value.title])
191
+ .toLowerCase()
192
+ .includes(lowerSearch) || toDisplayString(id).toLowerCase().includes(lowerSearch);
193
+
194
+ if (hasChildren) {
195
+ const subtree = flattenTree(children ?? [], depth + 1);
196
+ if (subtree.length === 0 && !matches) {
197
+ continue;
198
+ }
199
+
200
+ result.push({
201
+ raw: item,
202
+ id,
203
+ depth,
204
+ isOpen,
205
+ isActive,
206
+ isLeaf: false,
207
+ });
208
+ if (isOpen) {
209
+ result.push(...subtree);
210
+ }
211
+ continue;
212
+ }
213
+ if (!matches) {
214
+ continue;
215
+ }
216
+ }
217
+
218
+ result.push({
219
+ raw: item,
220
+ id,
221
+ depth,
222
+ isOpen,
223
+ isActive,
224
+ isLeaf: !hasChildren,
225
+ });
226
+
227
+ if (isOpen && hasChildren) {
228
+ result.push(...flattenTree(children ?? [], depth + 1));
229
+ }
230
+ }
231
+ return result;
232
+ }
233
+
234
+ function collectNonLeafIds(itemsList: readonly TreeItem[]): unknown[] {
235
+ const allIds: unknown[] = [];
236
+ for (const item of itemsList) {
237
+ const children = getChildrenOf(item);
238
+ if (children && children.length > 0) {
239
+ allIds.push(item[actualItemProps.value.value], ...collectNonLeafIds(children));
240
+ }
241
+ }
242
+ return allIds;
243
+ }
244
+
245
+ const displayItems = computed(() => flattenTree(props.value.items ?? []));
246
+
247
+ watch(
248
+ () => props.value.search,
249
+ (newSearch, oldSearch) => {
250
+ const hasNewSearch = newSearch !== undefined && newSearch !== "";
251
+ const hadOldSearch = oldSearch !== undefined && oldSearch !== "";
252
+ if (hasNewSearch && !hadOldSearch) {
253
+ const allIds = collectNonLeafIds(props.value.items ?? []);
254
+ emit("update:opened", [...new Set([...(props.value.opened ?? []), ...allIds])]);
255
+ }
256
+ },
257
+ );
258
+
259
+ return {
260
+ actualItemProps,
261
+ actualSelection,
262
+ displayItems,
263
+ toggleOpen,
264
+ toggleSelect,
265
+ isSelected,
266
+ getIndeterminate,
267
+ };
268
+ }
269
+
270
+ export { useVirtualTree };
271
+ export type { TreeItem, ItemPropsConfig, SelectionConfig, DisplayItem, EmitFn };
@@ -0,0 +1,2 @@
1
+ // Vtk.js does not ship type declarations for this widget module.
2
+ declare module "@kitware/vtk.js/Widgets/Widgets3D/ImplicitPlaneWidget";
@@ -1,13 +1,13 @@
1
+ import type { PiniaPluginContext } from "pinia";
1
2
  import { useAppStore } from "@ogw_front/stores/app";
2
3
 
3
- function autoStoreRegister({ store }) {
4
+ function autoStoreRegister({ store }: PiniaPluginContext): void {
4
5
  if (store.$id === "app") {
5
6
  return;
6
7
  }
7
8
 
8
9
  const appStore = useAppStore();
9
10
  appStore.registerStore(store);
10
- console.log(`[AutoRegister] Store "${store.$id}" processed`);
11
11
  }
12
12
 
13
13
  export default defineNuxtPlugin({
@@ -15,12 +15,10 @@ export default defineNuxtPlugin({
15
15
  dependsOn: ["pinia"],
16
16
  setup(nuxtApp) {
17
17
  const { $pinia } = nuxtApp;
18
- if (!$pinia) {
19
- console.warn("Pinia instance not available.");
18
+ if ($pinia === undefined) {
20
19
  return;
21
20
  }
22
21
 
23
22
  $pinia.use(autoStoreRegister);
24
- console.log("[AUTOREGISTER PLUGIN] Loaded automatically from OpenGeodeWeb-Front");
25
23
  },
26
24
  });
@@ -0,0 +1,36 @@
1
+ import { ClickOutside } from "vuetify/directives/click-outside";
2
+ import type { DirectiveBinding } from "vue";
3
+
4
+ type ClickOutsideValue =
5
+ | ((event: MouseEvent) => void)
6
+ | {
7
+ handler: (event: MouseEvent) => void;
8
+ closeConditional?: (event: Event) => boolean;
9
+ include?: () => HTMLElement[];
10
+ };
11
+
12
+ function snackbarElements(): HTMLElement[] {
13
+ return [...document.querySelectorAll<HTMLElement>(".v-snackbar")];
14
+ }
15
+
16
+ export default defineNuxtPlugin({
17
+ name: "click-outside-ignore-snackbars",
18
+ setup() {
19
+ const originalMounted = ClickOutside.mounted;
20
+
21
+ ClickOutside.mounted = (element: HTMLElement, binding: DirectiveBinding<ClickOutsideValue>) => {
22
+ const { value } = binding;
23
+ const handler = typeof value === "function" ? value : value.handler;
24
+ const closeConditional = typeof value === "function" ? undefined : value.closeConditional;
25
+ const include = typeof value === "function" ? undefined : value.include;
26
+
27
+ binding.value = {
28
+ handler,
29
+ closeConditional,
30
+ include: () => [...(include?.() ?? []), ...snackbarElements()],
31
+ };
32
+
33
+ originalMounted(element, binding);
34
+ };
35
+ },
36
+ });
@@ -0,0 +1,252 @@
1
+ // Local imports
2
+ import { getRestApiPort, getRestApiProtocol, isCloudMode } from "@ogw_front/utils/stores.js";
3
+ import { Status } from "@ogw_front/utils/status";
4
+ import { api_fetch } from "@ogw_internal/utils/api_fetch.js";
5
+ import { upload_file } from "@ogw_internal/utils/upload_file.js";
6
+ import { useAppExtensions } from "./app_helpers/extension.js";
7
+ import { useInfraStore } from "@ogw_front/stores/infra";
8
+
9
+ import type { JsonRpcSchema, RequestHandlers } from "@ogw_shared/utils/types.js";
10
+ import type { StateTree } from "pinia";
11
+
12
+ import opengeodeweb_front_schemas from "@geode/opengeodeweb-front/opengeodeweb_front_schemas.json" with { type: "json" };
13
+
14
+ // The `share` defineStore option (used by every store in this codebase) is implemented by a runtime pinia plugin outside this package's type surface; this augmentation only teaches the type checker about the option shape already used at each defineStore call site.
15
+ declare module "pinia" {
16
+ // TypeScript requires a merged interface declaration's type parameter names to match pinia's own (`S`, `Store`) exactly, not just their count.
17
+ // oxlint-disable-next-line eslint/id-length
18
+ interface DefineStoreOptionsBase<S extends StateTree, Store> {
19
+ share?: { omit?: string[] };
20
+ }
21
+ }
22
+
23
+ interface RegisterableStore {
24
+ $id: string;
25
+ $patch?: (partial: Record<string, unknown>) => void;
26
+ exportStores?: (params?: Record<string, unknown>) => Promise<unknown>;
27
+ importStores?: (snapshot: unknown) => Promise<void> | void;
28
+ connect?: () => Promise<void>;
29
+ kill?: () => Promise<void>;
30
+ [key: string]: unknown;
31
+ }
32
+
33
+ // oxlint-disable-next-line max-lines-per-function, max-statements
34
+ export const useAppStore = defineStore("app", () => {
35
+ const stores: RegisterableStore[] = [];
36
+ const globalComponents = ref<Map<string, Map<string, unknown>>>(new Map());
37
+ const default_local_port = ref(globalThis.location.port);
38
+ const status = ref(Status.NOT_CONNECTED);
39
+ const protocol = computed(() => getRestApiProtocol());
40
+ const port = computed(() => getRestApiPort(default_local_port.value));
41
+
42
+ const base_url = computed(() => {
43
+ const infraStore = useInfraStore();
44
+ let app_url = `${protocol.value}://${infraStore.domain_name}:${port.value}`;
45
+ if (isCloudMode()) {
46
+ app_url += `/server`;
47
+ }
48
+ return app_url;
49
+ });
50
+
51
+ function registerGlobalComponent(
52
+ extensionId: string,
53
+ componentId: string,
54
+ component: unknown,
55
+ ): void {
56
+ if (!globalComponents.value.has(extensionId)) {
57
+ globalComponents.value.set(extensionId, new Map());
58
+ }
59
+ globalComponents.value.get(extensionId)?.set(componentId, component);
60
+ }
61
+
62
+ function unregisterGlobalComponent(extensionId: string, componentId: string): void {
63
+ if (globalComponents.value.has(extensionId)) {
64
+ globalComponents.value.get(extensionId)?.delete(componentId);
65
+ }
66
+ }
67
+
68
+ function registerStore(store: RegisterableStore): void {
69
+ const isAlreadyRegistered = stores.some(
70
+ (registeredStore: RegisterableStore) => registeredStore.$id === store.$id,
71
+ );
72
+ if (isAlreadyRegistered) {
73
+ return;
74
+ }
75
+ stores.push(store);
76
+ }
77
+
78
+ async function exportStores(
79
+ params: Record<string, unknown> = {},
80
+ ): Promise<Record<string, unknown>> {
81
+ const snapshot: Record<string, unknown> = {};
82
+
83
+ await Promise.all(
84
+ stores.map(async (store: RegisterableStore) => {
85
+ if (!store.exportStores) {
86
+ return;
87
+ }
88
+ const storeId = store.$id;
89
+ try {
90
+ snapshot[storeId] = await store.exportStores(params);
91
+ } catch {
92
+ // Ignore stores that fail to export; other stores still complete independently.
93
+ }
94
+ }),
95
+ );
96
+ return snapshot;
97
+ }
98
+
99
+ async function importStores(snapshot: Record<string, unknown> | undefined): Promise<void> {
100
+ if (!snapshot) {
101
+ return;
102
+ }
103
+
104
+ const missingStoreIds: string[] = [];
105
+
106
+ await Promise.all(
107
+ stores.map(async (store: RegisterableStore) => {
108
+ if (!store.importStores) {
109
+ return;
110
+ }
111
+ const storeId = store.$id;
112
+ if (snapshot[storeId] === undefined) {
113
+ missingStoreIds.push(storeId);
114
+ return;
115
+ }
116
+ try {
117
+ await store.importStores(snapshot[storeId]);
118
+ } catch {
119
+ // Ignore stores that fail to import; other stores still complete independently.
120
+ }
121
+ }),
122
+ );
123
+
124
+ if (missingStoreIds.length > 0) {
125
+ console.warn(`Stores not found in snapshot: ${missingStoreIds.join(", ")}`);
126
+ }
127
+ }
128
+
129
+ const {
130
+ loadedExtensions,
131
+ extensionAPI,
132
+ setExtensionAPI,
133
+ setCodeTransformer,
134
+ getExtension,
135
+ loadExtension,
136
+ getLoadedExtensions,
137
+ unloadExtension,
138
+ toggleExtension,
139
+ setExtensionEnabled,
140
+ getExtensionEnabled,
141
+ } = useAppExtensions();
142
+
143
+ const request_counter = ref(0);
144
+ function start_request(): void {
145
+ request_counter.value += 1;
146
+ }
147
+ function stop_request(): void {
148
+ request_counter.value -= 1;
149
+ }
150
+ const is_busy = computed(() => request_counter.value > 0);
151
+
152
+ async function upload(file: Readonly<File>, callbacks: RequestHandlers = {}): Promise<unknown> {
153
+ const schema = opengeodeweb_front_schemas.api.local.extensions.upload;
154
+ const { PROJECT: projectName } = useRuntimeConfig().public;
155
+ const params = { projectName };
156
+ const result = await upload_file(
157
+ { $id: "app", base_url: base_url.value, start_request, stop_request },
158
+ { schema, file, params },
159
+ {
160
+ ...callbacks,
161
+ response_function: async (response: unknown) => {
162
+ if (callbacks.response_function) {
163
+ await callbacks.response_function(response);
164
+ }
165
+ },
166
+ },
167
+ );
168
+ return result;
169
+ }
170
+
171
+ // `TResult` is asserted, not verified, at the single `return result as TResult` boundary below: the backend response is only checked against `schema` at runtime, so callers' `TResult` is a contract with the schema, not something this function can prove.
172
+ // oxlint-disable-next-line unicorn/consistent-function-scoping
173
+ // oxlint-disable-next-line unicorn/consistent-function-scoping
174
+ async function request<TResult = unknown>(
175
+ { schema, params }: { schema: JsonRpcSchema; params?: Record<string, unknown> },
176
+ callbacks: RequestHandlers = {},
177
+ ): Promise<TResult> {
178
+ const result = await api_fetch(
179
+ { $id: "app", base_url: base_url.value, start_request, stop_request },
180
+ // The app store is only ever used with HTTP ("front") schemas, which always carry `methods`; the wider JsonRpcSchema param above is kept as-is to match this action's public signature (e.g. relayed from get_version-style callers that only know about the shared, looser schema shape).
181
+ // oxlint-disable-next-line no-unsafe-type-assertion -- narrowing optional `methods` to required is safe here; see comment above.
182
+ { schema: schema as JsonRpcSchema & { methods: string[] }, params },
183
+ {
184
+ ...callbacks,
185
+ response_function: async (response: unknown) => {
186
+ if (callbacks.response_function) {
187
+ await callbacks.response_function(response);
188
+ }
189
+ },
190
+ },
191
+ );
192
+ // oxlint-disable-next-line no-unsafe-type-assertion -- this is the trusted API boundary; see comment above.
193
+ return result as TResult;
194
+ }
195
+
196
+ const projectFolderPath = ref("");
197
+
198
+ async function createProjectFolder(): Promise<unknown> {
199
+ const { PROJECT } = useRuntimeConfig().public;
200
+ const schema = opengeodeweb_front_schemas.api.local.app.project_folder_path;
201
+ const params = { PROJECT };
202
+ const result = await request(
203
+ { schema, params },
204
+ {
205
+ response_function: (response: unknown) => {
206
+ // oxlint-disable-next-line no-unsafe-type-assertion
207
+ const { projectFolderPath: newProjectFolderPath } = response as {
208
+ projectFolderPath: string;
209
+ };
210
+ projectFolderPath.value = newProjectFolderPath;
211
+ },
212
+ },
213
+ );
214
+ return result;
215
+ }
216
+
217
+ return {
218
+ stores,
219
+ default_local_port,
220
+ request_counter,
221
+ status,
222
+ protocol,
223
+ port,
224
+ base_url,
225
+ is_busy,
226
+ registerStore,
227
+ exportStores,
228
+ importStores,
229
+ loadedExtensions,
230
+ extensionAPI,
231
+ setExtensionAPI,
232
+ setCodeTransformer,
233
+ loadExtension,
234
+ getLoadedExtensions,
235
+ getExtension,
236
+ unloadExtension,
237
+ toggleExtension,
238
+ setExtensionEnabled,
239
+ getExtensionEnabled,
240
+ request,
241
+ upload,
242
+ projectFolderPath,
243
+ createProjectFolder,
244
+ start_request,
245
+ stop_request,
246
+ globalComponents,
247
+ registerGlobalComponent,
248
+ unregisterGlobalComponent,
249
+ };
250
+ });
251
+
252
+ export type { RegisterableStore };