@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,392 @@
1
+ // oxlint-disable eslint/max-lines
2
+ // Third party imports
3
+ import { type Table, liveQuery } from "dexie";
4
+ import type { Observable } from "rxjs";
5
+ import { useObservable } from "@vueuse/rxjs";
6
+ import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json";
7
+
8
+ // Local imports
9
+ import { type ModelComponentRecord, useDataMesh } from "./data_helpers/mesh.js";
10
+ import { database } from "@ogw_internal/database/database.js";
11
+ import { useDataCollections } from "./data_helpers/collections.js";
12
+ import { useViewerStore } from "@ogw_front/stores/viewer";
13
+
14
+ interface DataItem {
15
+ id: string;
16
+ name: string;
17
+ viewer_type: string;
18
+ geode_object_type: string;
19
+ visible: boolean;
20
+ created_at: string;
21
+ is_viewable?: boolean;
22
+ binary_light_viewable?: string;
23
+ }
24
+
25
+ interface ModelComponentInput {
26
+ geode_id: string;
27
+ type: string;
28
+ viewer_id: string | number;
29
+ name: string;
30
+ is_active: boolean;
31
+ boundaries?: string[];
32
+ internals?: string[];
33
+ items?: string[];
34
+ }
35
+
36
+ interface NewDataItem {
37
+ id: string;
38
+ name?: string;
39
+ viewer_type: string;
40
+ geode_object_type: string;
41
+ is_viewable?: boolean;
42
+ binary_light_viewable?: string;
43
+ mesh_components?: ModelComponentInput[];
44
+ collection_components?: ModelComponentInput[];
45
+ nb_vertices?: number;
46
+ }
47
+
48
+ interface ModelComponentRelationRecord {
49
+ id: string;
50
+ parent: string;
51
+ child: string;
52
+ type: string;
53
+ }
54
+
55
+ interface ViewableItemLike {
56
+ is_viewable?: boolean;
57
+ binary_light_viewable?: string;
58
+ geode_object_type?: string;
59
+ id?: string;
60
+ title?: string;
61
+ }
62
+
63
+ const viewer_generic_schemas = viewer_schemas.opengeodeweb_viewer.generic;
64
+ // The database's table map is dynamically assembled at runtime (see internal/database/database.ts), so its exported type is a loose `{}`; cast it to the shape it actually has at runtime rather than widening every call site.
65
+ type DatabaseTables = Record<string, unknown>;
66
+ // oxlint-disable-next-line no-unsafe-type-assertion -- see comment above.
67
+ const typedDatabase = database as unknown as DatabaseTables;
68
+ function checkItemViewable(item: ViewableItemLike | undefined | null): boolean {
69
+ if (!item || typeof item !== "object") {
70
+ return false;
71
+ }
72
+ if (item.is_viewable !== undefined) {
73
+ return item.is_viewable;
74
+ }
75
+ if (item.binary_light_viewable !== undefined) {
76
+ return item.binary_light_viewable !== "not_viewable";
77
+ }
78
+ if (
79
+ item.geode_object_type === "HorizonStack3D" ||
80
+ item.id === "HorizonStack3D" ||
81
+ item.title === "HorizonStack3D"
82
+ ) {
83
+ return false;
84
+ }
85
+ return true;
86
+ }
87
+ function isItemViewable(itemOrId: string | ViewableItemLike): boolean | Promise<boolean> {
88
+ if (typeof itemOrId === "string") {
89
+ // oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime; see comment above.
90
+ return (typedDatabase.data as Table<DataItem, string>).get(itemOrId).then(checkItemViewable);
91
+ }
92
+ return checkItemViewable(itemOrId);
93
+ }
94
+
95
+ // oxlint-disable-next-line max-lines-per-function, max-statements
96
+ export const useDataStore = defineStore("data", () => {
97
+ const viewerStore = useViewerStore();
98
+ // oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime; see comment above.
99
+ const data_db = typedDatabase.data as Table<DataItem, string>;
100
+ // oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime; see comment above.
101
+ const model_components_db = typedDatabase.model_components as Table<ModelComponentRecord, string>;
102
+ // oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime; see comment above.
103
+ const model_components_relation_db = typedDatabase.model_components_relation as Table<
104
+ ModelComponentRelationRecord,
105
+ string
106
+ >;
107
+ const {
108
+ formatedMeshComponents,
109
+ refFormatedMeshComponents,
110
+ getMeshComponentsByType,
111
+ getAllMeshComponents,
112
+ fetchAllMeshComponents,
113
+ getMeshComponentGeodeIds,
114
+ getCornersGeodeIds,
115
+ getLinesGeodeIds,
116
+ getSurfacesGeodeIds,
117
+ getBlocksGeodeIds,
118
+ } = useDataMesh();
119
+ const {
120
+ hasCollectionComponents,
121
+ getAllCollectionComponents,
122
+ fetchAllCollectionComponents,
123
+ formatedCollectionComponents,
124
+ refFormatedCollectionComponents,
125
+ } = useDataCollections();
126
+ async function item(id: string): Promise<DataItem> {
127
+ const data_item = await data_db.get(id);
128
+ if (!data_item) {
129
+ throw new Error(`Item not found: ${id}`);
130
+ }
131
+ return data_item;
132
+ }
133
+ async function allItems(): Promise<DataItem[]> {
134
+ const items = await data_db.toArray();
135
+ return items;
136
+ }
137
+ function refItem(id: string): Ref<DataItem | undefined> {
138
+ // Dexie's liveQuery() returns Dexie's own minimal Observable shape, not an
139
+ // Actual rxjs Observable instance (useObservable's declared parameter type);
140
+ // The two are structurally close enough at runtime (vueuse only calls
141
+ // `.subscribe`) but not identical, hence the cast.
142
+ return useObservable(
143
+ liveQuery(async () => {
144
+ const data_item = await data_db.get(id);
145
+ return data_item;
146
+ // oxlint-disable-next-line no-unsafe-type-assertion -- trusted vueuse/Dexie Observable boundary; see comment above.
147
+ }) as unknown as Observable<DataItem | undefined>,
148
+ {
149
+ // oxlint-disable-next-line no-unsafe-type-assertion -- placeholder until the live query resolves; consumers must treat this as possibly incomplete.
150
+ initialValue: {} as DataItem,
151
+ },
152
+ );
153
+ }
154
+ function refAllItems(): Ref<DataItem[]> {
155
+ return useObservable(
156
+ liveQuery(async () => {
157
+ const items = await data_db.toArray();
158
+ return items;
159
+ // oxlint-disable-next-line no-unsafe-type-assertion -- trusted vueuse/Dexie Observable boundary; see comment above.
160
+ }) as unknown as Observable<DataItem[]>,
161
+ {
162
+ initialValue: [] as DataItem[],
163
+ },
164
+ );
165
+ }
166
+ async function meshComponentType(modelId: string, geode_id: string): Promise<string | undefined> {
167
+ const component = await model_components_db
168
+ .where("[id+geode_id]")
169
+ .equals([modelId, geode_id])
170
+ .first();
171
+ return component?.type;
172
+ }
173
+ async function registerObject(id: string, name: string): Promise<unknown> {
174
+ const schema = viewer_generic_schemas.register;
175
+ const params = {
176
+ id,
177
+ name,
178
+ };
179
+ const result = await viewerStore.request({
180
+ schema,
181
+ params,
182
+ timeout: 0,
183
+ });
184
+ return result;
185
+ }
186
+ async function deregisterObject(id: string): Promise<unknown> {
187
+ const schema = viewer_generic_schemas.deregister;
188
+ const params = {
189
+ id,
190
+ };
191
+ const result = await viewerStore.request({
192
+ schema,
193
+ params,
194
+ });
195
+ return result;
196
+ }
197
+ // NewDataItem has mutable array fields (mesh_components, collection_components), so it can't
198
+ // Satisfy prefer-readonly-parameter-types deeply; same pattern as app/utils/import_workflow.ts.
199
+ async function addItem(new_item: NewDataItem): Promise<string> {
200
+ const itemData: DataItem = {
201
+ id: new_item.id,
202
+ name: new_item.name ?? new_item.id,
203
+ viewer_type: new_item.viewer_type,
204
+ geode_object_type: new_item.geode_object_type,
205
+ visible: true,
206
+ created_at: new Date().toISOString(),
207
+ is_viewable: new_item.is_viewable,
208
+ };
209
+ if (new_item.binary_light_viewable !== undefined && new_item.binary_light_viewable !== null) {
210
+ itemData.binary_light_viewable = new_item.binary_light_viewable;
211
+ }
212
+ const id = await data_db.put(itemData);
213
+ return id;
214
+ }
215
+ // NewDataItem has mutable array fields (mesh_components, collection_components), so it can't
216
+ // Satisfy prefer-readonly-parameter-types deeply; same pattern as app/utils/import_workflow.ts.
217
+ async function addComponents(new_item: NewDataItem): Promise<string> {
218
+ const allComponents: ModelComponentRecord[] = [];
219
+ // ModelComponentInput has mutable array fields (boundaries, internals, items), so a readonly
220
+ // Array of it can't satisfy prefer-readonly-parameter-types deeply; same limitation as above.
221
+ function addModelComponents(components: readonly ModelComponentInput[]): void {
222
+ for (const component of components) {
223
+ allComponents.push({
224
+ id: new_item.id,
225
+ geode_id: component.geode_id,
226
+ type: component.type,
227
+ viewer_id: component.viewer_id,
228
+ name: component.name,
229
+ is_active: component.is_active,
230
+ });
231
+ }
232
+ }
233
+ if (new_item.mesh_components) {
234
+ addModelComponents(new_item.mesh_components);
235
+ }
236
+ if (new_item.collection_components) {
237
+ addModelComponents(new_item.collection_components);
238
+ }
239
+ const lastKey = await model_components_db.bulkPut(allComponents);
240
+ return lastKey;
241
+ }
242
+ // NewDataItem has mutable array fields (mesh_components, collection_components), so it can't
243
+ // Satisfy prefer-readonly-parameter-types deeply; same pattern as app/utils/import_workflow.ts.
244
+ async function addComponentRelations(new_item: NewDataItem): Promise<string> {
245
+ const relations: ModelComponentRelationRecord[] = [];
246
+ function addModelComponentRelations(
247
+ components: readonly string[],
248
+ parent: string,
249
+ type: string,
250
+ ): void {
251
+ for (const child of components) {
252
+ relations.push({
253
+ id: new_item.id,
254
+ parent,
255
+ child,
256
+ type,
257
+ });
258
+ }
259
+ }
260
+ if (new_item.mesh_components) {
261
+ for (const component of new_item.mesh_components) {
262
+ if (component.boundaries) {
263
+ addModelComponentRelations(component.boundaries, component.geode_id, "boundary");
264
+ }
265
+ if (component.internals) {
266
+ addModelComponentRelations(component.internals, component.geode_id, "internal");
267
+ }
268
+ }
269
+ }
270
+ if (new_item.collection_components) {
271
+ for (const component of new_item.collection_components) {
272
+ if (component.items) {
273
+ addModelComponentRelations(component.items, component.geode_id, "collection");
274
+ }
275
+ }
276
+ }
277
+ const lastKey = await model_components_relation_db.bulkPut(relations);
278
+ return lastKey;
279
+ }
280
+ async function getComponentByViewerId(
281
+ modelId: string,
282
+ viewer_id: string | number,
283
+ ): Promise<ModelComponentRecord | undefined> {
284
+ const component = await model_components_db
285
+ .where("viewer_id")
286
+ .equals(Number(viewer_id))
287
+ .and((model_component: ModelComponentRecord) => model_component.id === modelId)
288
+ .first();
289
+ return component;
290
+ }
291
+ async function deleteModelComponents(modelId: string): Promise<void> {
292
+ await model_components_db.where("id").equals(modelId).delete();
293
+ await model_components_relation_db.where("id").equals(modelId).delete();
294
+ }
295
+
296
+ async function deleteItem(id: string): Promise<void> {
297
+ await data_db.delete(id);
298
+ await deleteModelComponents(id);
299
+ }
300
+
301
+ async function updateItem(id: string, changes: Partial<DataItem>): Promise<void> {
302
+ await data_db.update(id, changes);
303
+ }
304
+
305
+ async function getAllModelComponentsViewerIds(modelId: string): Promise<number[]> {
306
+ const components = await model_components_db.where("id").equals(modelId).toArray();
307
+ return components.map((component: ModelComponentRecord) =>
308
+ Math.trunc(Number(component.viewer_id)),
309
+ );
310
+ }
311
+ async function getMeshComponentsViewerIds(
312
+ modelId: string,
313
+ meshComponentGeodeIds: readonly string[],
314
+ ): Promise<number[]> {
315
+ const components = await model_components_db
316
+ .where("[id+geode_id]")
317
+ .anyOf(meshComponentGeodeIds.map((geode_id) => [modelId, geode_id]))
318
+ .toArray();
319
+ return components.map((component: ModelComponentRecord) =>
320
+ Math.trunc(Number(component.viewer_id)),
321
+ );
322
+ }
323
+ async function exportStores(): Promise<{
324
+ items: DataItem[];
325
+ modelComponents: ModelComponentRecord[];
326
+ modelComponentsRelations: ModelComponentRelationRecord[];
327
+ }> {
328
+ const items = await data_db.toArray();
329
+ const modelComponents = await model_components_db.toArray();
330
+ const modelComponentsRelations = await model_components_relation_db.toArray();
331
+ return {
332
+ items,
333
+ modelComponents,
334
+ modelComponentsRelations,
335
+ };
336
+ }
337
+
338
+ async function clear(): Promise<void> {
339
+ await data_db.clear();
340
+ await model_components_db.clear();
341
+ await model_components_relation_db.clear();
342
+ }
343
+
344
+ // Dexie's bulkPut expects mutable arrays, so this snapshot parameter can't deeply satisfy
345
+ // The prefer-readonly-parameter-types rule; same pattern as app/utils/import_workflow.ts.
346
+ async function importStores(snapshot: {
347
+ readonly modelComponents: readonly ModelComponentRecord[];
348
+ readonly modelComponentsRelations: readonly ModelComponentRelationRecord[];
349
+ }): Promise<void> {
350
+ await clear();
351
+ await model_components_db.bulkPut(snapshot.modelComponents);
352
+ await model_components_relation_db.bulkPut(snapshot.modelComponentsRelations);
353
+ }
354
+ return {
355
+ refAllItems,
356
+ item,
357
+ allItems,
358
+ refItem,
359
+ isItemViewable,
360
+ meshComponentType,
361
+ registerObject,
362
+ deregisterObject,
363
+ addItem,
364
+ addComponents,
365
+ addComponentRelations,
366
+ deleteItem,
367
+ updateItem,
368
+ getAllModelComponentsViewerIds,
369
+ getMeshComponentsViewerIds,
370
+ getComponentByViewerId,
371
+ exportStores,
372
+ importStores,
373
+ clear,
374
+ formatedMeshComponents,
375
+ refFormatedMeshComponents,
376
+ getMeshComponentsByType,
377
+ getAllMeshComponents,
378
+ fetchAllMeshComponents,
379
+ getMeshComponentGeodeIds,
380
+ getCornersGeodeIds,
381
+ getLinesGeodeIds,
382
+ getSurfacesGeodeIds,
383
+ getBlocksGeodeIds,
384
+ hasCollectionComponents,
385
+ getAllCollectionComponents,
386
+ fetchAllCollectionComponents,
387
+ formatedCollectionComponents,
388
+ refFormatedCollectionComponents,
389
+ };
390
+ });
391
+
392
+ export type { DataItem, NewDataItem, ModelComponentInput, ModelComponentRelationRecord };
@@ -0,0 +1,138 @@
1
+ import { type FormattedComponent, type ModelComponentRecord, useDataMesh } from "./mesh.js";
2
+ import { MESH_COMPONENT_TYPES } from "@ogw_front/utils/default_styles";
3
+ import type { Observable } from "rxjs";
4
+ import type { Ref } from "vue";
5
+ import { getTable } from "@ogw_internal/database/database.js";
6
+ import { liveQuery } from "dexie";
7
+ import { useObservable } from "@vueuse/rxjs";
8
+
9
+ interface ModelComponentRelationRecord {
10
+ id: string;
11
+ parent: string;
12
+ child: string;
13
+ type: string;
14
+ }
15
+
16
+ interface CollectionComponent extends FormattedComponent {
17
+ readonly children: readonly FormattedComponent[];
18
+ }
19
+
20
+ interface CollectionComponentGroup {
21
+ id: string;
22
+ title: string;
23
+ readonly children: readonly CollectionComponent[];
24
+ }
25
+
26
+ function pluralize(type: string): string {
27
+ if (type.endsWith("y")) {
28
+ return `${type.slice(0, -1)}ies`;
29
+ }
30
+ return `${type}s`;
31
+ }
32
+
33
+ // oxlint-disable-next-line eslint/max-lines-per-function
34
+ export function useDataCollections(): {
35
+ hasCollectionComponents: typeof hasCollectionComponents;
36
+ getAllCollectionComponents: typeof getAllCollectionComponents;
37
+ fetchAllCollectionComponents: typeof fetchAllCollectionComponents;
38
+ formatedCollectionComponents: typeof formatedCollectionComponents;
39
+ refFormatedCollectionComponents: typeof refFormatedCollectionComponents;
40
+ } {
41
+ const model_components_db = getTable<ModelComponentRecord>("model_components");
42
+ const model_components_relation_db = getTable<ModelComponentRelationRecord>(
43
+ "model_components_relation",
44
+ );
45
+ const { getAllMeshComponents } = useDataMesh();
46
+
47
+ async function hasCollectionComponents(modelId: string): Promise<boolean> {
48
+ const count = await model_components_db
49
+ .where("id")
50
+ .equals(modelId)
51
+ .and((component: ModelComponentRecord) => !MESH_COMPONENT_TYPES.includes(component.type))
52
+ .count();
53
+ return count > 0;
54
+ }
55
+
56
+ async function getAllCollectionComponents(modelId: string): Promise<FormattedComponent[]> {
57
+ const items = await model_components_db.where("id").equals(modelId).toArray();
58
+ return items
59
+ .filter((component: ModelComponentRecord) => !MESH_COMPONENT_TYPES.includes(component.type))
60
+ .map((component: ModelComponentRecord) => ({
61
+ id: component.geode_id,
62
+ title: component.name,
63
+ category: component.type,
64
+ viewer_id: Number(component.viewer_id),
65
+ is_active: component.is_active,
66
+ }));
67
+ }
68
+
69
+ async function fetchAllCollectionComponents(
70
+ modelId: string,
71
+ ): Promise<Record<string, CollectionComponent[]>> {
72
+ const components = await getAllCollectionComponents(modelId);
73
+ const relations = await model_components_relation_db.where("id").equals(modelId).toArray();
74
+ const allMeshComponents = await getAllMeshComponents(modelId);
75
+ const meshComponentsById: Record<string, FormattedComponent> = {};
76
+ for (const meshComponent of allMeshComponents) {
77
+ meshComponentsById[meshComponent.id] = meshComponent;
78
+ }
79
+
80
+ const byType: Record<string, CollectionComponent[]> = {};
81
+ for (const component of components) {
82
+ byType[component.category] ??= [];
83
+ const itemRelations = relations.filter(
84
+ (relation: ModelComponentRelationRecord) =>
85
+ relation.parent === component.id && relation.type === "collection",
86
+ );
87
+ const children = itemRelations
88
+ .map((relation: ModelComponentRelationRecord) => meshComponentsById[relation.child])
89
+ .filter((child): child is FormattedComponent => Boolean(child));
90
+ byType[component.category]?.push({
91
+ ...component,
92
+ children,
93
+ });
94
+ }
95
+ return byType;
96
+ }
97
+
98
+ async function formatedCollectionComponents(
99
+ modelId: string,
100
+ ): Promise<CollectionComponentGroup[]> {
101
+ const byType = await fetchAllCollectionComponents(modelId);
102
+ const collectionTypes = Object.keys(byType);
103
+
104
+ return collectionTypes
105
+ .filter((type) => (byType[type]?.length ?? 0) > 0)
106
+ .map((type) => ({
107
+ id: type,
108
+ title: pluralize(type),
109
+ children: byType[type] ?? [],
110
+ }));
111
+ }
112
+
113
+ function refFormatedCollectionComponents(
114
+ modelId: string,
115
+ ): Ref<CollectionComponentGroup[] | undefined> {
116
+ return useObservable(
117
+ // Dexie's liveQuery returns its own Observable-like type, not rxjs's Observable, so bridging needs a cast.
118
+ liveQuery(async () => {
119
+ const groups = await formatedCollectionComponents(modelId);
120
+ return groups;
121
+ // oxlint-disable-next-line no-unsafe-type-assertion
122
+ }) as unknown as Observable<CollectionComponentGroup[]>,
123
+ {
124
+ initialValue: undefined,
125
+ },
126
+ );
127
+ }
128
+
129
+ return {
130
+ hasCollectionComponents,
131
+ getAllCollectionComponents,
132
+ fetchAllCollectionComponents,
133
+ formatedCollectionComponents,
134
+ refFormatedCollectionComponents,
135
+ };
136
+ }
137
+
138
+ export type { CollectionComponent, CollectionComponentGroup, ModelComponentRelationRecord };
@@ -0,0 +1,169 @@
1
+ import { type Table, liveQuery } from "dexie";
2
+ import type { Observable } from "rxjs";
3
+ import { database } from "@ogw_internal/database/database.js";
4
+ import { useObservable } from "@vueuse/rxjs";
5
+
6
+ interface ModelComponentRecord {
7
+ id: string;
8
+ geode_id: string;
9
+ type: string;
10
+ viewer_id: string | number;
11
+ name: string;
12
+ is_active: boolean;
13
+ }
14
+
15
+ interface FormattedComponent {
16
+ readonly id: string;
17
+ readonly title: string;
18
+ readonly category: string;
19
+ readonly viewer_id: number;
20
+ readonly is_active: boolean;
21
+ }
22
+
23
+ interface FormattedComponentGroup {
24
+ id: string;
25
+ title: string;
26
+ readonly children: readonly FormattedComponent[];
27
+ }
28
+
29
+ function toFormattedComponent(meshComponent: ModelComponentRecord): FormattedComponent {
30
+ return {
31
+ id: meshComponent.geode_id,
32
+ title: meshComponent.name,
33
+ category: meshComponent.type,
34
+ viewer_id: Math.trunc(Number(meshComponent.viewer_id)),
35
+ is_active: meshComponent.is_active,
36
+ };
37
+ }
38
+
39
+ // oxlint-disable-next-line eslint/max-lines-per-function
40
+ export function useDataMesh(): {
41
+ formatedMeshComponents: typeof formatedMeshComponents;
42
+ refFormatedMeshComponents: typeof refFormatedMeshComponents;
43
+ getMeshComponentsByType: typeof getMeshComponentsByType;
44
+ getAllMeshComponents: typeof getAllMeshComponents;
45
+ fetchAllMeshComponents: typeof fetchAllMeshComponents;
46
+ getMeshComponentGeodeIds: typeof getMeshComponentGeodeIds;
47
+ getCornersGeodeIds: typeof getCornersGeodeIds;
48
+ getLinesGeodeIds: typeof getLinesGeodeIds;
49
+ getSurfacesGeodeIds: typeof getSurfacesGeodeIds;
50
+ getBlocksGeodeIds: typeof getBlocksGeodeIds;
51
+ } {
52
+ // oxlint-disable-next-line no-unsafe-type-assertion -- database's table map is dynamically typed at runtime.
53
+ const model_components_db = database.model_components as unknown as Table<
54
+ ModelComponentRecord,
55
+ string
56
+ >;
57
+
58
+ async function formatedMeshComponents(modelId: string): Promise<FormattedComponentGroup[]> {
59
+ const items = await model_components_db.where("id").equals(modelId).toArray();
60
+ const componentTitles: Record<string, string> = {
61
+ Corner: "Corners",
62
+ Line: "Lines",
63
+ Surface: "Surfaces",
64
+ Block: "Blocks",
65
+ };
66
+
67
+ const componentsByType: Record<string, ModelComponentRecord[]> = {};
68
+ for (const component_item of items) {
69
+ if (componentTitles[component_item.type] !== undefined) {
70
+ componentsByType[component_item.type] ??= [];
71
+ componentsByType[component_item.type]?.push(component_item);
72
+ }
73
+ }
74
+
75
+ return Object.keys(componentTitles)
76
+ .filter((type) => componentsByType[type])
77
+ .map((type) => ({
78
+ id: type,
79
+ title: componentTitles[type] ?? type,
80
+ children: (componentsByType[type] ?? []).map((item: ModelComponentRecord) =>
81
+ toFormattedComponent(item),
82
+ ),
83
+ }));
84
+ }
85
+
86
+ function refFormatedMeshComponents(modelId: string): Ref<FormattedComponentGroup[] | undefined> {
87
+ return useObservable(
88
+ liveQuery(async () => {
89
+ const components = await formatedMeshComponents(modelId);
90
+ return components;
91
+ // oxlint-disable-next-line no-unsafe-type-assertion
92
+ }) as unknown as Observable<FormattedComponentGroup[]>,
93
+ {
94
+ initialValue: undefined,
95
+ },
96
+ );
97
+ }
98
+
99
+ async function getMeshComponentsByType(
100
+ modelId: string,
101
+ type: string,
102
+ ): Promise<FormattedComponent[]> {
103
+ const components = await model_components_db
104
+ .where("[id+type]")
105
+ .equals([modelId, type])
106
+ .toArray();
107
+ return components.map((item: ModelComponentRecord) => toFormattedComponent(item));
108
+ }
109
+
110
+ async function getAllMeshComponents(modelId: string): Promise<FormattedComponent[]> {
111
+ const items = await model_components_db.where("id").equals(modelId).toArray();
112
+ return items.map((item: ModelComponentRecord) => toFormattedComponent(item));
113
+ }
114
+
115
+ async function fetchAllMeshComponents(
116
+ modelId: string,
117
+ ): Promise<Record<string, FormattedComponent[]>> {
118
+ const components = await getAllMeshComponents(modelId);
119
+ const byType: Record<string, FormattedComponent[]> = {};
120
+ for (const component of components) {
121
+ byType[component.category] ??= [];
122
+ byType[component.category]?.push(component);
123
+ }
124
+ return byType;
125
+ }
126
+
127
+ async function getMeshComponentGeodeIds(modelId: string, type: string): Promise<string[]> {
128
+ const components = await model_components_db
129
+ .where("[id+type]")
130
+ .equals([modelId, type])
131
+ .toArray();
132
+ return components.map((component: ModelComponentRecord) => component.geode_id);
133
+ }
134
+
135
+ async function getCornersGeodeIds(modelId: string): Promise<string[]> {
136
+ const geodeIds = await getMeshComponentGeodeIds(modelId, "Corner");
137
+ return geodeIds;
138
+ }
139
+
140
+ async function getLinesGeodeIds(modelId: string): Promise<string[]> {
141
+ const geodeIds = await getMeshComponentGeodeIds(modelId, "Line");
142
+ return geodeIds;
143
+ }
144
+
145
+ async function getSurfacesGeodeIds(modelId: string): Promise<string[]> {
146
+ const geodeIds = await getMeshComponentGeodeIds(modelId, "Surface");
147
+ return geodeIds;
148
+ }
149
+
150
+ async function getBlocksGeodeIds(modelId: string): Promise<string[]> {
151
+ const geodeIds = await getMeshComponentGeodeIds(modelId, "Block");
152
+ return geodeIds;
153
+ }
154
+
155
+ return {
156
+ formatedMeshComponents,
157
+ refFormatedMeshComponents,
158
+ getMeshComponentsByType,
159
+ getAllMeshComponents,
160
+ fetchAllMeshComponents,
161
+ getMeshComponentGeodeIds,
162
+ getCornersGeodeIds,
163
+ getLinesGeodeIds,
164
+ getSurfacesGeodeIds,
165
+ getBlocksGeodeIds,
166
+ };
167
+ }
168
+
169
+ export type { ModelComponentRecord, FormattedComponent, FormattedComponentGroup };