@collabdt/core 0.0.42 → 0.0.43

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 (264) hide show
  1. package/dist/core/components/Toolbar.d.ts.map +1 -1
  2. package/dist/core/components/Toolbar.js.map +1 -1
  3. package/dist/core/components/ToolbarBody.js.map +1 -1
  4. package/dist/core/components/TopNavigationBar.js.map +1 -1
  5. package/dist/core/components/authentication/ForgotPassword.js.map +1 -1
  6. package/dist/core/components/authentication/Signin.js.map +1 -1
  7. package/dist/core/components/authentication/Signup.js.map +1 -1
  8. package/dist/core/components/settings/src/OrganizationSkeleton.js.map +1 -1
  9. package/dist/core/components/settings/src/SettingsSkeleton.js.map +1 -1
  10. package/dist/core/components/ui/Comments/CollapsibleCommentItem.d.ts.map +1 -1
  11. package/dist/core/components/ui/Comments/CollapsibleCommentItem.js.map +1 -1
  12. package/dist/core/components/ui/Comments/CommentsSection.d.ts.map +1 -1
  13. package/dist/core/components/ui/Comments/CommentsSection.js.map +1 -1
  14. package/dist/core/components/ui/DataTable.d.ts.map +1 -1
  15. package/dist/core/components/ui/DataTable.js +7 -0
  16. package/dist/core/components/ui/DataTable.js.map +1 -1
  17. package/dist/core/components/ui/FilesManager/src/FileItemComponent.d.ts.map +1 -1
  18. package/dist/core/components/ui/FilesManager/src/FileItemComponent.js.map +1 -1
  19. package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts +5 -2
  20. package/dist/core/components/ui/FilesManager/src/FileMarker.d.ts.map +1 -1
  21. package/dist/core/components/ui/FilesManager/src/FileMarker.js +84 -21
  22. package/dist/core/components/ui/FilesManager/src/FileMarker.js.map +1 -1
  23. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.d.ts.map +1 -1
  24. package/dist/core/components/ui/FilesManager/src/convertIfcToFragmentsFile.js.map +1 -1
  25. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.d.ts.map +1 -1
  26. package/dist/core/components/ui/FilesManager/src/useFileUploadHandler.js.map +1 -1
  27. package/dist/core/components/ui/Icons/IfcIcon.d.ts.map +1 -1
  28. package/dist/core/components/ui/Icons/IfcIcon.js.map +1 -1
  29. package/dist/core/components/ui/InfoSidebar/index.d.ts.map +1 -1
  30. package/dist/core/components/ui/InfoSidebar/index.js.map +1 -1
  31. package/dist/core/components/ui/Navbar.d.ts.map +1 -1
  32. package/dist/core/components/ui/Navbar.js.map +1 -1
  33. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.d.ts.map +1 -1
  34. package/dist/core/components/ui/Sensors/CollapsibleSensorItem.js.map +1 -1
  35. package/dist/core/components/ui/Sensors/SensorTagsSection.d.ts.map +1 -1
  36. package/dist/core/components/ui/Sensors/SensorTagsSection.js.map +1 -1
  37. package/dist/core/components/ui/Sensors/SensorsSection.d.ts.map +1 -1
  38. package/dist/core/components/ui/Sensors/SensorsSection.js.map +1 -1
  39. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.d.ts.map +1 -1
  40. package/dist/core/components/ui/ShareFeature/ShareToolSubmenu.js.map +1 -1
  41. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js +2 -2
  42. package/dist/core/components/viewers/Data/buildingDetails/GeocoderInput.js.map +1 -1
  43. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js +2 -2
  44. package/dist/core/components/viewers/Data/siteDetails/AssociatedBuildings.js.map +1 -1
  45. package/dist/core/components/viewers/Viewer.d.ts.map +1 -1
  46. package/dist/core/components/viewers/Viewer.js +5 -1
  47. package/dist/core/components/viewers/Viewer.js.map +1 -1
  48. package/dist/core/components/viewers/bim/BimToolbar.d.ts.map +1 -1
  49. package/dist/core/components/viewers/bim/BimToolbar.js.map +1 -1
  50. package/dist/core/components/viewers/bim/BimViewer.d.ts.map +1 -1
  51. package/dist/core/components/viewers/bim/BimViewer.js +14 -5
  52. package/dist/core/components/viewers/bim/BimViewer.js.map +1 -1
  53. package/dist/core/components/viewers/bim/src/BimLoadingState/index.d.ts.map +1 -1
  54. package/dist/core/components/viewers/bim/src/BimLoadingState/index.js +6 -0
  55. package/dist/core/components/viewers/bim/src/BimLoadingState/index.js.map +1 -1
  56. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  57. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js +168 -39
  58. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  59. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  60. package/dist/core/components/viewers/bim/src/BimSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  61. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.d.ts.map +1 -1
  62. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js +1 -1
  63. package/dist/core/components/viewers/bim/src/BimSidebar/src/LayersTab/src/FloorplanSection.js.map +1 -1
  64. package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts +14 -37
  65. package/dist/core/components/viewers/bim/src/DXFLoader/index.d.ts.map +1 -1
  66. package/dist/core/components/viewers/bim/src/DXFLoader/index.js +31 -318
  67. package/dist/core/components/viewers/bim/src/DXFLoader/index.js.map +1 -1
  68. package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts +66 -7
  69. package/dist/core/components/viewers/bim/src/FloorplanTool/index.d.ts.map +1 -1
  70. package/dist/core/components/viewers/bim/src/FloorplanTool/index.js +253 -21
  71. package/dist/core/components/viewers/bim/src/FloorplanTool/index.js.map +1 -1
  72. package/dist/core/components/viewers/bim/src/ModelManager/index.d.ts.map +1 -1
  73. package/dist/core/components/viewers/bim/src/ModelManager/index.js +9 -0
  74. package/dist/core/components/viewers/bim/src/ModelManager/index.js.map +1 -1
  75. package/dist/core/components/viewers/bim/src/SimpleBimViewer.d.ts.map +1 -1
  76. package/dist/core/components/viewers/bim/src/SimpleBimViewer.js.map +1 -1
  77. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts +3 -2
  78. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.d.ts.map +1 -1
  79. package/dist/core/components/viewers/bim/src/lib/TrueNorthPopover.js.map +1 -1
  80. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.d.ts.map +1 -1
  81. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js +3 -4
  82. package/dist/core/components/viewers/bim/src/lib/useFriendlyIfcClassName.js.map +1 -1
  83. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.d.ts.map +1 -1
  84. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js +40 -18
  85. package/dist/core/components/viewers/bim/src/tools/AddToBim/index.js.map +1 -1
  86. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts +2 -5
  87. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.d.ts.map +1 -1
  88. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js +45 -59
  89. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/AddDxf.js.map +1 -1
  90. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js +1 -0
  91. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/BimSensor.js.map +1 -1
  92. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts +10 -1
  93. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.d.ts.map +1 -1
  94. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js +25 -73
  95. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileHandler.js.map +1 -1
  96. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts +7 -3
  97. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.d.ts.map +1 -1
  98. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js +42 -78
  99. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/FileMarkerUtils.js.map +1 -1
  100. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.d.ts.map +1 -1
  101. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js +52 -75
  102. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/Position3DCard.js.map +1 -1
  103. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts +15 -3
  104. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.d.ts.map +1 -1
  105. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js +165 -105
  106. package/dist/core/components/viewers/bim/src/tools/AddToBim/src/useFilePlacement.js.map +1 -1
  107. package/dist/core/components/viewers/index.d.ts.map +1 -1
  108. package/dist/core/components/viewers/index.js.map +1 -1
  109. package/dist/core/components/viewers/map/MapViewer.d.ts.map +1 -1
  110. package/dist/core/components/viewers/map/MapViewer.js +1 -0
  111. package/dist/core/components/viewers/map/MapViewer.js.map +1 -1
  112. package/dist/core/components/viewers/map/datasets/DatasetManager/index.d.ts.map +1 -1
  113. package/dist/core/components/viewers/map/datasets/DatasetManager/index.js +4 -3
  114. package/dist/core/components/viewers/map/datasets/DatasetManager/index.js.map +1 -1
  115. package/dist/core/components/viewers/map/datasets/RowActions.d.ts.map +1 -1
  116. package/dist/core/components/viewers/map/datasets/RowActions.js +148 -0
  117. package/dist/core/components/viewers/map/datasets/RowActions.js.map +1 -1
  118. package/dist/core/components/viewers/map/datasets/index.d.ts.map +1 -1
  119. package/dist/core/components/viewers/map/datasets/index.js +32 -15
  120. package/dist/core/components/viewers/map/datasets/index.js.map +1 -1
  121. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts +4 -0
  122. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.d.ts.map +1 -0
  123. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js +43 -0
  124. package/dist/core/components/viewers/map/datasets/src/builtinLiveDatasets.js.map +1 -0
  125. package/dist/core/components/viewers/map/datasets/src/localDatasets.d.ts.map +1 -1
  126. package/dist/core/components/viewers/map/datasets/src/localDatasets.js +39 -3
  127. package/dist/core/components/viewers/map/datasets/src/localDatasets.js.map +1 -1
  128. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts +1 -1
  129. package/dist/core/components/viewers/map/datasets/src/minioDatasets.d.ts.map +1 -1
  130. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js +2 -1
  131. package/dist/core/components/viewers/map/datasets/src/minioDatasets.js.map +1 -1
  132. package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts +47 -0
  133. package/dist/core/components/viewers/map/datasets/src/publishedTiles.d.ts.map +1 -0
  134. package/dist/core/components/viewers/map/datasets/src/publishedTiles.js +114 -0
  135. package/dist/core/components/viewers/map/datasets/src/publishedTiles.js.map +1 -0
  136. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts +49 -0
  137. package/dist/core/components/viewers/map/datasets/src/wmsTime.d.ts.map +1 -0
  138. package/dist/core/components/viewers/map/datasets/src/wmsTime.js +100 -0
  139. package/dist/core/components/viewers/map/datasets/src/wmsTime.js.map +1 -0
  140. package/dist/core/components/viewers/map/src/Geocoder.d.ts.map +1 -1
  141. package/dist/core/components/viewers/map/src/Geocoder.js +9 -9
  142. package/dist/core/components/viewers/map/src/Geocoder.js.map +1 -1
  143. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.d.ts.map +1 -1
  144. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js +25 -43
  145. package/dist/core/components/viewers/map/src/MapFeaturePopoverMenu/src/NonDatabaseBuildingPopover.js.map +1 -1
  146. package/dist/core/components/viewers/map/src/MapLayers/index.d.ts.map +1 -1
  147. package/dist/core/components/viewers/map/src/MapLayers/index.js.map +1 -1
  148. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.d.ts.map +1 -1
  149. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js +19 -2
  150. package/dist/core/components/viewers/map/src/MapLayers/src/BimLayer/index.js.map +1 -1
  151. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts +9 -0
  152. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.d.ts.map +1 -0
  153. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js +28 -0
  154. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/countryLayerUtils.js.map +1 -0
  155. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.d.ts.map +1 -1
  156. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js +1 -16
  157. package/dist/core/components/viewers/map/src/MapLayers/src/CountryLayer/index.js.map +1 -1
  158. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.d.ts.map +1 -1
  159. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/FileModelLayer/FileModelLayer.js.map +1 -1
  160. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.d.ts.map +1 -1
  161. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js +31 -2
  162. package/dist/core/components/viewers/map/src/MapLayers/src/FileLayer/utils/CustomModelLayer.js.map +1 -1
  163. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts +21 -0
  164. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.d.ts.map +1 -0
  165. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js +111 -0
  166. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/WmsTimeControl.js.map +1 -0
  167. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.d.ts.map +1 -1
  168. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js +77 -2
  169. package/dist/core/components/viewers/map/src/MapLayers/src/OpenDataLayer/src/index.js.map +1 -1
  170. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  171. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  172. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.d.ts.map +1 -1
  173. package/dist/core/components/viewers/map/src/MapSidebar/src/FileTab/src/ModelsSection.js.map +1 -1
  174. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.d.ts.map +1 -1
  175. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js +10 -3
  176. package/dist/core/components/viewers/map/src/MapSidebar/src/SettingsTab/src/TerrainLevel.js.map +1 -1
  177. package/dist/core/components/viewers/map/utils/geocoder.d.ts +6 -2
  178. package/dist/core/components/viewers/map/utils/geocoder.d.ts.map +1 -1
  179. package/dist/core/components/viewers/map/utils/geocoder.js +10 -62
  180. package/dist/core/components/viewers/map/utils/geocoder.js.map +1 -1
  181. package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts +5 -0
  182. package/dist/core/components/viewers/map/utils/geocoding/adapters.d.ts.map +1 -0
  183. package/dist/core/components/viewers/map/utils/geocoding/adapters.js +192 -0
  184. package/dist/core/components/viewers/map/utils/geocoding/adapters.js.map +1 -0
  185. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts +6 -0
  186. package/dist/core/components/viewers/map/utils/geocoding/config.d.ts.map +1 -0
  187. package/dist/core/components/viewers/map/utils/geocoding/config.js +14 -0
  188. package/dist/core/components/viewers/map/utils/geocoding/config.js.map +1 -0
  189. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts +8 -0
  190. package/dist/core/components/viewers/map/utils/geocoding/index.d.ts.map +1 -0
  191. package/dist/core/components/viewers/map/utils/geocoding/index.js +44 -0
  192. package/dist/core/components/viewers/map/utils/geocoding/index.js.map +1 -0
  193. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts +6 -0
  194. package/dist/core/components/viewers/map/utils/geocoding/osm.d.ts.map +1 -0
  195. package/dist/core/components/viewers/map/utils/geocoding/osm.js +39 -0
  196. package/dist/core/components/viewers/map/utils/geocoding/osm.js.map +1 -0
  197. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts +8 -0
  198. package/dist/core/components/viewers/map/utils/geocoding/pelias.d.ts.map +1 -0
  199. package/dist/core/components/viewers/map/utils/geocoding/pelias.js +35 -0
  200. package/dist/core/components/viewers/map/utils/geocoding/pelias.js.map +1 -0
  201. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.d.ts.map +1 -1
  202. package/dist/core/components/viewers/pointcloud/PointCloudToolbar.js.map +1 -1
  203. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js +1 -3
  204. package/dist/core/components/viewers/pointcloud/PointCloudViewer.js.map +1 -1
  205. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.d.ts.map +1 -1
  206. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js +2 -3
  207. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.js.map +1 -1
  208. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.d.ts.map +1 -1
  209. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js +8 -2
  210. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.js.map +1 -1
  211. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.d.ts.map +1 -1
  212. package/dist/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.js.map +1 -1
  213. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js +9 -9
  214. package/dist/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.js.map +1 -1
  215. package/dist/core/hooks/provider.js.map +1 -1
  216. package/dist/core/plugins/host/provider.d.ts.map +1 -1
  217. package/dist/core/plugins/host/provider.js.map +1 -1
  218. package/dist/core/store/AppConfig/context.d.ts.map +1 -1
  219. package/dist/core/store/AppConfig/context.js.map +1 -1
  220. package/dist/core/store/BIM/context.d.ts.map +1 -1
  221. package/dist/core/store/BIM/context.js.map +1 -1
  222. package/dist/core/store/BIM/reducer.d.ts +0 -1
  223. package/dist/core/store/BIM/reducer.d.ts.map +1 -1
  224. package/dist/core/store/BIM/reducer.js +0 -4
  225. package/dist/core/store/BIM/reducer.js.map +1 -1
  226. package/dist/core/store/Buildings/context.d.ts.map +1 -1
  227. package/dist/core/store/Buildings/context.js.map +1 -1
  228. package/dist/core/store/Content/context.d.ts.map +1 -1
  229. package/dist/core/store/Content/context.js.map +1 -1
  230. package/dist/core/store/Datasets/context.d.ts.map +1 -1
  231. package/dist/core/store/Datasets/context.js +2 -1
  232. package/dist/core/store/Datasets/context.js.map +1 -1
  233. package/dist/core/store/Datasets/reducer.d.ts +2 -0
  234. package/dist/core/store/Datasets/reducer.d.ts.map +1 -1
  235. package/dist/core/store/Datasets/reducer.js +9 -4
  236. package/dist/core/store/Datasets/reducer.js.map +1 -1
  237. package/dist/core/store/Files/context.d.ts.map +1 -1
  238. package/dist/core/store/Files/context.js.map +1 -1
  239. package/dist/core/store/Map/context.d.ts.map +1 -1
  240. package/dist/core/store/Map/context.js.map +1 -1
  241. package/dist/core/store/Menus/context.d.ts.map +1 -1
  242. package/dist/core/store/Menus/context.js.map +1 -1
  243. package/dist/core/store/Permissions/context.d.ts.map +1 -1
  244. package/dist/core/store/Permissions/context.js.map +1 -1
  245. package/dist/core/store/PointCloud/context.d.ts.map +1 -1
  246. package/dist/core/store/PointCloud/context.js.map +1 -1
  247. package/dist/core/store/Tools/context.d.ts.map +1 -1
  248. package/dist/core/store/Tools/context.js.map +1 -1
  249. package/dist/core/types/datasetTypes.d.ts +8 -1
  250. package/dist/core/types/datasetTypes.d.ts.map +1 -1
  251. package/dist/core/types/dbTypes.d.ts +13 -13
  252. package/dist/core/types/dbTypes.d.ts.map +1 -1
  253. package/dist/core/types/dbTypes.js +13 -13
  254. package/dist/core/types/dbTypes.js.map +1 -1
  255. package/dist/core/types/index.d.ts +1 -1
  256. package/dist/core/types/index.d.ts.map +1 -1
  257. package/dist/core/types/index.js.map +1 -1
  258. package/dist/core/utils/imageUtils.js +1 -1
  259. package/dist/core/utils/imageUtils.js.map +1 -1
  260. package/package.json +4 -3
  261. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.d.ts +0 -3
  262. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.d.ts.map +0 -1
  263. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.js +0 -173
  264. package/dist/core/components/viewers/pointcloud/src/PointCloudManagement/PointCloudViewer-old.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudViewer.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\";\r\nimport * as THREE from \"three\";\r\nimport { useSearchParams } from \"next/navigation\";\r\nimport { loadAllAssets } from \"./utils/potreeLoader\";\r\nimport { BuildingsContext, PointCloudContext } from '../../../store'\r\nimport { restoreCameraFromUrl } from \"./utils/restoreCameraFromUrl\";\r\nimport { PointCloudLoadingState } from \"./src/PointCloudLoadingState\";\r\nimport { useFilesByBuildingId } from '../../../hooks/files/files'\r\nimport { ViewportGizmo } from './src/ViewportGizmo';\r\nimport { usePointCloudCoordinateSystem } from '../useCoordinateSystem';\r\n\r\n\r\nconst API_BASE =\r\n process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? \"http://localhost:5101\";\r\n\r\nexport function PointCloudViewer() {\r\n // Enforce Z-up coordinate system for Potree. Resets to Y-up on unmount\r\n // so the BIM viewer doesn't inherit Z-up when switching viewers.\r\n usePointCloudCoordinateSystem();\r\n\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const viewerRef = React.useRef<any | null>(null);\r\n const gizmoRef = React.useRef<ViewportGizmo | null>(null);\r\n // Tracks Potree point cloud objects keyed by point cloud ID\r\n const loadedCloudsRef = React.useRef<Map<string, any>>(new Map());\r\n // IDs currently being fetched/loaded — prevents duplicate loads while async is in-flight\r\n const pendingIdsRef = React.useRef<Set<string>>(new Set());\r\n const cameraRestoredRef = React.useRef(false);\r\n\r\n const { state: pointCloudState, dispatch: pointCloudDispatch } = React.useContext(PointCloudContext)\r\n const PointCloudGlobalState = pointCloudState.pointcloud\r\n\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n const { building } = buildingState.buildings\r\n\r\n const searchParams = useSearchParams()\r\n\r\n // Get files for the building to check if there are LAZ/LAS files\r\n const { files, isError: filesError } = useFilesByBuildingId(building?.id)\r\n const hasPointCloudFiles = React.useMemo(() =>\r\n !filesError && files.some(file => {\r\n const ext = file.extension?.toLowerCase()\r\n if (!ext) return false\r\n return ext === \"laz\" || ext === \"las\"\r\n }),\r\n [files, filesError])\r\n\r\n // --- Load CSS/JS assets once\r\n React.useEffect(() => {\r\n (async () => {\r\n try {\r\n await loadAllAssets()\r\n pointCloudDispatch({ type: \"SET_READY\", payload: { ready: true } })\r\n }\r\n catch (err) {\r\n console.error(\"PointCloudViewer - Failed to load assets\", err)\r\n }\r\n })();\r\n }, []);\r\n\r\n // --- Init viewer once when ready. Separate from cloud loading so the viewer\r\n // persists across toggle on/off of individual point clouds.\r\n React.useEffect(() => {\r\n if (!PointCloudGlobalState.ready || !containerRef.current || !(window as any)?.Potree) return;\r\n\r\n const Potree = (window as any).Potree;\r\n const el = containerRef.current;\r\n\r\n // Clear tracking state since we're creating a fresh viewer\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n cameraRestoredRef.current = false;\r\n\r\n const viewer = new Potree.Viewer(el);\r\n viewerRef.current = viewer;\r\n\r\n viewer.setEDLEnabled(true);\r\n viewer.setFOV(60);\r\n viewer.setPointBudget(10_000_000);\r\n viewer.loadSettingsFromURL();\r\n viewer.setBackground(\"white\");\r\n\r\n const gizmo = new ViewportGizmo(viewer);\r\n gizmoRef.current = gizmo;\r\n gizmo.enabled = true;\r\n\r\n pointCloudDispatch({\r\n type: \"INIT\",\r\n payload: {\r\n initialState: {\r\n ready: true,\r\n viewer: viewerRef.current,\r\n }\r\n }\r\n })\r\n\r\n return () => {\r\n try {\r\n if (gizmoRef.current) {\r\n gizmoRef.current.dispose();\r\n gizmoRef.current = null;\r\n }\r\n const v = viewerRef.current;\r\n if (v?.scene?.pointclouds) {\r\n v.scene.pointclouds.forEach((pc: any) => {\r\n v.scene.removePointCloud?.(pc) ?? v.scene.scene?.remove?.(pc);\r\n });\r\n }\r\n v?.renderer?.dispose?.();\r\n } catch { }\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n viewerRef.current = null;\r\n el.innerHTML = \"\";\r\n };\r\n }, [PointCloudGlobalState.ready]);\r\n\r\n // --- Add/remove point clouds whenever loadedPointCloudIds changes or the\r\n // viewer is (re)initialized (PointCloudGlobalState.viewer updates on INIT).\r\n React.useEffect(() => {\r\n const viewer = viewerRef.current;\r\n if (!PointCloudGlobalState.ready || !viewer) return;\r\n\r\n const Potree = (window as any).Potree;\r\n if (!Potree) return;\r\n\r\n const currentIds = new Set(PointCloudGlobalState.loadedPointCloudIds);\r\n const alreadyLoadedIds = new Set(loadedCloudsRef.current.keys());\r\n\r\n // Remove point clouds no longer in the list.\r\n // Potree classic has no removePointCloud() — splice from the internal\r\n // pointclouds array and remove from the Three.js scene separately.\r\n for (const id of alreadyLoadedIds) {\r\n if (!currentIds.has(id)) {\r\n const pc = loadedCloudsRef.current.get(id);\r\n if (pc) {\r\n try {\r\n const pcs: any[] = viewer.scene.pointclouds ?? [];\r\n const idx = pcs.indexOf(pc);\r\n if (idx !== -1) pcs.splice(idx, 1);\r\n viewer.scene.scene?.remove(pc);\r\n } catch { }\r\n loadedCloudsRef.current.delete(id);\r\n pendingIdsRef.current.delete(id);\r\n try { viewer.fitToScreen(); } catch { }\r\n }\r\n }\r\n }\r\n\r\n // Add newly requested point clouds.\r\n // Skip if already tracked in loadedCloudsRef OR still in-flight in pendingIdsRef\r\n // — prevents duplicate loads when Effect 2 fires again before the callback runs.\r\n for (const id of currentIds) {\r\n if (alreadyLoadedIds.has(id) || pendingIdsRef.current.has(id)) continue;\r\n\r\n pendingIdsRef.current.add(id);\r\n ;(async () => {\r\n try {\r\n const res = await fetch(`${API_BASE}/point-cloud/${encodeURIComponent(id)}`);\r\n const data = await res.json();\r\n const url = `${API_BASE}/private/${data.bucket}/${data.potreeMetadataFileKey}`;\r\n\r\n Potree.loadPointCloud(url, id, (e: any) => {\r\n pendingIdsRef.current.delete(id);\r\n try {\r\n viewer.scene.addPointCloud(e.pointcloud);\r\n loadedCloudsRef.current.set(id, e.pointcloud);\r\n\r\n const mat = e.pointcloud.material;\r\n mat.size = 1;\r\n mat.pointSizeType = Potree.PointSizeType.ADAPTIVE;\r\n e.pointcloud.position.x += 3;\r\n e.pointcloud.position.y -= 3;\r\n e.pointcloud.position.z += 4;\r\n\r\n const restored = !cameraRestoredRef.current && restoreCameraFromUrl(viewer, searchParams)\r\n cameraRestoredRef.current = true;\r\n if (!restored) viewer.fitToScreen();\r\n\r\n if (gizmoRef.current) {\r\n gizmoRef.current.add();\r\n }\r\n } catch (err) {\r\n console.error(\"[PointCloudViewer] Error adding point cloud\", err);\r\n }\r\n });\r\n } catch (err) {\r\n pendingIdsRef.current.delete(id);\r\n console.error(\"[PointCloudViewer] Error fetching point cloud metadata\", err);\r\n }\r\n })();\r\n }\r\n }, [PointCloudGlobalState.loadedPointCloudIds, PointCloudGlobalState.viewer, PointCloudGlobalState.ready]);\r\n\r\n const { loadedPointCloudIds } = PointCloudGlobalState;\r\n const hasLoadedClouds = loadedPointCloudIds.length > 0;\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n }}\r\n >\r\n {/* Potree container — always rendered so the viewer can measure its dimensions on init.\r\n PointCloudLoadingState sits above it via z-index when no clouds are loaded. */}\r\n <div>\r\n <div\r\n className={`pointer-events-none absolute inset-0 `}\r\n style={{\r\n zIndex: 9,\r\n background: 'radial-gradient(circle at center, rgba(220,220,220,0) 0%, rgba(220,220,220,0) 50%, rgba(220,220,220,0.9) 100%)',\r\n mixBlendMode: 'multiply'\r\n }}\r\n />\r\n <div\r\n ref={containerRef}\r\n className=\"potree_container\"\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n backgroundSize: \"cover\",\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Show PointCloudLoadingState only when there are no point cloud files uploaded at all.\r\n Rendered after the container so it layers on top (higher DOM order = higher paint order). */}\r\n {!hasPointCloudFiles && !hasLoadedClouds && (\r\n <div className=\"absolute inset-0\" style={{ zIndex: 10 }}>\r\n <PointCloudLoadingState />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c"]}
1
+ {"version":3,"sources":["../../../../../src/core/components/viewers/pointcloud/PointCloudViewer.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\";\r\nimport * as THREE from \"three\";\r\nimport { useSearchParams } from \"next/navigation\";\r\nimport { loadAllAssets } from \"./utils/potreeLoader\";\r\nimport { BuildingsContext, PointCloudContext } from '../../../store'\r\nimport { restoreCameraFromUrl } from \"./utils/restoreCameraFromUrl\";\r\nimport { PointCloudLoadingState } from \"./src/PointCloudLoadingState\";\r\nimport { useFilesByBuildingId } from '../../../hooks/files/files'\r\nimport { ViewportGizmo } from './src/ViewportGizmo';\r\nimport { usePointCloudCoordinateSystem } from '../useCoordinateSystem';\r\n\r\n\r\nconst API_BASE =\r\n process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? \"http://localhost:5101\";\r\n\r\nexport function PointCloudViewer() {\r\n // Enforce Z-up coordinate system for Potree. Resets to Y-up on unmount\r\n // so the BIM viewer doesn't inherit Z-up when switching viewers.\r\n usePointCloudCoordinateSystem();\r\n\r\n const containerRef = React.useRef<HTMLDivElement>(null);\r\n const viewerRef = React.useRef<any | null>(null);\r\n const gizmoRef = React.useRef<ViewportGizmo | null>(null);\r\n // Tracks Potree point cloud objects keyed by point cloud ID\r\n const loadedCloudsRef = React.useRef<Map<string, any>>(new Map());\r\n // IDs currently being fetched/loaded — prevents duplicate loads while async is in-flight\r\n const pendingIdsRef = React.useRef<Set<string>>(new Set());\r\n const cameraRestoredRef = React.useRef(false);\r\n\r\n const { state: pointCloudState, dispatch: pointCloudDispatch } = React.useContext(PointCloudContext)\r\n const PointCloudGlobalState = pointCloudState.pointcloud\r\n\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n const { building } = buildingState.buildings\r\n\r\n const searchParams = useSearchParams()\r\n\r\n // Get files for the building to check if there are LAZ/LAS files\r\n const { files, isError: filesError } = useFilesByBuildingId(building?.id)\r\n const hasPointCloudFiles = React.useMemo(() =>\r\n !filesError && files.some(file => {\r\n const ext = file.extension?.toLowerCase()\r\n if (!ext) return false\r\n return ext === \"laz\" || ext === \"las\"\r\n }),\r\n [files, filesError])\r\n\r\n // --- Load CSS/JS assets once\r\n React.useEffect(() => {\r\n (async () => {\r\n try {\r\n await loadAllAssets()\r\n pointCloudDispatch({ type: \"SET_READY\", payload: { ready: true } })\r\n }\r\n catch (err) {\r\n console.error(\"PointCloudViewer - Failed to load assets\", err)\r\n }\r\n })();\r\n }, []);\r\n\r\n // --- Init viewer once when ready. Separate from cloud loading so the viewer\r\n // persists across toggle on/off of individual point clouds.\r\n React.useEffect(() => {\r\n if (!PointCloudGlobalState.ready || !containerRef.current || !(window as any)?.Potree) return;\r\n\r\n const Potree = (window as any).Potree;\r\n const el = containerRef.current;\r\n\r\n // Clear tracking state since we're creating a fresh viewer\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n cameraRestoredRef.current = false;\r\n\r\n const viewer = new Potree.Viewer(el);\r\n viewerRef.current = viewer;\r\n\r\n viewer.setEDLEnabled(true);\r\n viewer.setFOV(60);\r\n viewer.setPointBudget(10_000_000);\r\n viewer.loadSettingsFromURL();\r\n viewer.setBackground(\"white\");\r\n\r\n const gizmo = new ViewportGizmo(viewer);\r\n gizmoRef.current = gizmo;\r\n gizmo.enabled = true;\r\n\r\n pointCloudDispatch({\r\n type: \"INIT\",\r\n payload: {\r\n initialState: {\r\n ready: true,\r\n viewer: viewerRef.current,\r\n }\r\n }\r\n })\r\n\r\n return () => {\r\n try {\r\n if (gizmoRef.current) {\r\n gizmoRef.current.dispose();\r\n gizmoRef.current = null;\r\n }\r\n const v = viewerRef.current;\r\n if (v?.scene?.pointclouds) {\r\n v.scene.pointclouds.forEach((pc: any) => {\r\n v.scene.removePointCloud?.(pc) ?? v.scene.scene?.remove?.(pc);\r\n });\r\n }\r\n v?.renderer?.dispose?.();\r\n } catch { }\r\n loadedCloudsRef.current.clear();\r\n pendingIdsRef.current.clear();\r\n viewerRef.current = null;\r\n el.innerHTML = \"\";\r\n };\r\n }, [PointCloudGlobalState.ready]);\r\n\r\n // --- Add/remove point clouds whenever loadedPointCloudIds changes or the\r\n // viewer is (re)initialized (PointCloudGlobalState.viewer updates on INIT).\r\n React.useEffect(() => {\r\n const viewer = viewerRef.current;\r\n if (!PointCloudGlobalState.ready || !viewer) return;\r\n\r\n const Potree = (window as any).Potree;\r\n if (!Potree) return;\r\n\r\n const currentIds = new Set(PointCloudGlobalState.loadedPointCloudIds);\r\n const alreadyLoadedIds = new Set(loadedCloudsRef.current.keys());\r\n\r\n // Remove point clouds no longer in the list.\r\n // Potree classic has no removePointCloud() — splice from the internal\r\n // pointclouds array and remove from the Three.js scene separately.\r\n for (const id of alreadyLoadedIds) {\r\n if (!currentIds.has(id)) {\r\n const pc = loadedCloudsRef.current.get(id);\r\n if (pc) {\r\n try {\r\n const pcs: any[] = viewer.scene.pointclouds ?? [];\r\n const idx = pcs.indexOf(pc);\r\n if (idx !== -1) pcs.splice(idx, 1);\r\n viewer.scene.scene?.remove(pc);\r\n } catch { }\r\n loadedCloudsRef.current.delete(id);\r\n pendingIdsRef.current.delete(id);\r\n try { viewer.fitToScreen(); } catch { }\r\n }\r\n }\r\n }\r\n\r\n // Add newly requested point clouds.\r\n // Skip if already tracked in loadedCloudsRef OR still in-flight in pendingIdsRef\r\n // — prevents duplicate loads when Effect 2 fires again before the callback runs.\r\n for (const id of currentIds) {\r\n if (alreadyLoadedIds.has(id) || pendingIdsRef.current.has(id)) continue;\r\n\r\n pendingIdsRef.current.add(id);\r\n ;(async () => {\r\n try {\r\n const res = await fetch(`${API_BASE}/point-cloud/${encodeURIComponent(id)}`);\r\n const data = await res.json();\r\n const url = `${API_BASE}/private/${data.bucket}/${data.potreeMetadataFileKey}`;\r\n\r\n Potree.loadPointCloud(url, id, (e: any) => {\r\n pendingIdsRef.current.delete(id);\r\n // Bail if the viewer was torn down (or re-init'd) while this load was in flight —\r\n // the init-effect cleanup nulls viewerRef, so this guard avoids attaching to a dead viewer.\r\n if (viewerRef.current !== viewer) return;\r\n try {\r\n viewer.scene.addPointCloud(e.pointcloud);\r\n loadedCloudsRef.current.set(id, e.pointcloud);\r\n\r\n const mat = e.pointcloud.material;\r\n mat.size = 1;\r\n mat.pointSizeType = Potree.PointSizeType.ADAPTIVE;\r\n\r\n const restored = !cameraRestoredRef.current && restoreCameraFromUrl(viewer, searchParams)\r\n cameraRestoredRef.current = true;\r\n if (!restored) viewer.fitToScreen();\r\n\r\n if (gizmoRef.current) {\r\n gizmoRef.current.add();\r\n }\r\n } catch (err) {\r\n console.error(\"[PointCloudViewer] Error adding point cloud\", err);\r\n }\r\n });\r\n } catch (err) {\r\n pendingIdsRef.current.delete(id);\r\n console.error(\"[PointCloudViewer] Error fetching point cloud metadata\", err);\r\n }\r\n })();\r\n }\r\n }, [PointCloudGlobalState.loadedPointCloudIds, PointCloudGlobalState.viewer, PointCloudGlobalState.ready]);\r\n\r\n const { loadedPointCloudIds } = PointCloudGlobalState;\r\n const hasLoadedClouds = loadedPointCloudIds.length > 0;\r\n\r\n return (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: 0,\r\n top: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n }}\r\n >\r\n {/* Potree container — always rendered so the viewer can measure its dimensions on init.\r\n PointCloudLoadingState sits above it via z-index when no clouds are loaded. */}\r\n <div>\r\n <div\r\n className={`pointer-events-none absolute inset-0 `}\r\n style={{\r\n zIndex: 9,\r\n background: 'radial-gradient(circle at center, rgba(220,220,220,0) 0%, rgba(220,220,220,0) 50%, rgba(220,220,220,0.9) 100%)',\r\n mixBlendMode: 'multiply'\r\n }}\r\n />\r\n <div\r\n ref={containerRef}\r\n className=\"potree_container\"\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n backgroundSize: \"cover\",\r\n }}\r\n />\r\n </div>\r\n\r\n {/* Show PointCloudLoadingState only when there are no point cloud files uploaded at all.\r\n Rendered after the container so it layers on top (higher DOM order = higher paint order). */}\r\n {!hasPointCloudFiles && !hasLoadedClouds && (\r\n <div className=\"absolute inset-0\" style={{ zIndex: 10 }}>\r\n <PointCloudLoadingState />\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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","names":["_a","_b","_c"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,wBAAgB,OAAO,sBAkCtB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,wBAAgB,OAAO,sBAiCtB"}
@@ -7,12 +7,11 @@ import { BuildingsContext } from "../../../../../../../store";
7
7
  import { useSearchParams } from "next/navigation";
8
8
  import { useFilesByBuildingId } from "../../../../../../../hooks/files/files";
9
9
  function FileTab() {
10
+ var _a;
10
11
  const { state: buildingState } = React.useContext(BuildingsContext);
11
12
  const { building } = buildingState.buildings;
12
- let buildingId;
13
13
  const urlBuildingId = useSearchParams().get("buildingId");
14
- if (building) buildingId = building.id;
15
- else if (urlBuildingId) buildingId = Number(urlBuildingId);
14
+ const buildingId = (_a = building == null ? void 0 : building.id) != null ? _a : urlBuildingId ? Number(urlBuildingId) : void 0;
16
15
  const filesData = useFilesByBuildingId(buildingId).files || [];
17
16
  const pointCloudFiles = [];
18
17
  const nonPointCloudFiles = [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { FilesSection } from './src/FilesSection'\r\nimport { PointCloudsSection } from './src/PointCloudSection'\r\nimport { BuildingsContext } from '../../../../../../../store'\r\nimport { useSearchParams } from 'next/navigation'\r\nimport { useFilesByBuildingId } from '../../../../../../../hooks/files/files'\r\nimport { DbFile } from '../../../../../../../types/dbTypes'\r\n\r\nexport function FileTab() {\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n const { building } = buildingState.buildings\r\n let buildingId:number;\r\n\r\n const urlBuildingId = useSearchParams().get('buildingId')\r\n\r\n if (building) buildingId = building.id\r\n else if (urlBuildingId) buildingId = Number(urlBuildingId)\r\n\r\n const filesData: DbFile[] = useFilesByBuildingId(buildingId).files || []\r\n\r\n const pointCloudFiles: DbFile[] = []\r\n const nonPointCloudFiles: DbFile[] = []\r\n\r\n // single .map pass to populate both arrays\r\n filesData.map((file) => {\r\n const {extension, type} = file\r\n // const isPointCloud = extension.toLowerCase() === 'laz' || extension.toLowerCase() === 'las'\r\n const isPointCloud = type?.toLowerCase() === 'point-cloud-file'\r\n\r\n if (isPointCloud) {\r\n pointCloudFiles.push(file)\r\n } else {\r\n nonPointCloudFiles.push(file)\r\n }\r\n })\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-6 h-full py-4 overflow-hidden\">\r\n <PointCloudsSection files={pointCloudFiles} />\r\n <FilesSection files={nonPointCloudFiles} />\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAuCI,SACE,KADF;AArCJ,YAAY,WAAW;AACvB,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC,SAAS,4BAA4B;AAG9B,SAAS,UAAU;AACxB,QAAM,EAAE,OAAO,cAAc,IAAI,MAAM,WAAW,gBAAgB;AAClE,QAAM,EAAE,SAAS,IAAI,cAAc;AACnC,MAAI;AAEJ,QAAM,gBAAgB,gBAAgB,EAAE,IAAI,YAAY;AAExD,MAAI,SAAU,cAAa,SAAS;AAAA,WAC3B,cAAe,cAAa,OAAO,aAAa;AAEzD,QAAM,YAAsB,qBAAqB,UAAU,EAAE,SAAS,CAAC;AAEvE,QAAM,kBAA4B,CAAC;AACnC,QAAM,qBAA+B,CAAC;AAGtC,YAAU,IAAI,CAAC,SAAS;AACtB,UAAM,EAAC,WAAW,KAAI,IAAI;AAE1B,UAAM,gBAAe,6BAAM,mBAAkB;AAE7C,QAAI,cAAc;AAChB,sBAAgB,KAAK,IAAI;AAAA,IAC3B,OAAO;AACL,yBAAmB,KAAK,IAAI;AAAA,IAC9B;AAAA,EACF,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,8DACb;AAAA,wBAAC,sBAAmB,OAAO,iBAAiB;AAAA,IAC5C,oBAAC,gBAAa,OAAO,oBAAoB;AAAA,KAC3C;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/index.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { FilesSection } from './src/FilesSection'\r\nimport { PointCloudsSection } from './src/PointCloudSection'\r\nimport { BuildingsContext } from '../../../../../../../store'\r\nimport { useSearchParams } from 'next/navigation'\r\nimport { useFilesByBuildingId } from '../../../../../../../hooks/files/files'\r\nimport { DbFile } from '../../../../../../../types/dbTypes'\r\n\r\nexport function FileTab() {\r\n const { state: buildingState } = React.useContext(BuildingsContext)\r\n const { building } = buildingState.buildings\r\n\r\n const urlBuildingId = useSearchParams().get('buildingId')\r\n // Resolve from the store building, else the URL param; undefined if neither is\r\n // ready yet (e.g. mid viewer-switch) the hook handles undefined → no files.\r\n const buildingId = building?.id ?? (urlBuildingId ? Number(urlBuildingId) : undefined)\r\n\r\n const filesData: DbFile[] = useFilesByBuildingId(buildingId).files || []\r\n\r\n const pointCloudFiles: DbFile[] = []\r\n const nonPointCloudFiles: DbFile[] = []\r\n\r\n // single .map pass to populate both arrays\r\n filesData.map((file) => {\r\n const {extension, type} = file\r\n // const isPointCloud = extension.toLowerCase() === 'laz' || extension.toLowerCase() === 'las'\r\n const isPointCloud = type?.toLowerCase() === 'point-cloud-file'\r\n\r\n if (isPointCloud) {\r\n pointCloudFiles.push(file)\r\n } else {\r\n nonPointCloudFiles.push(file)\r\n }\r\n })\r\n\r\n return (\r\n <div className=\"flex-1 flex flex-col space-y-6 h-full py-4 overflow-hidden\">\r\n <PointCloudsSection files={pointCloudFiles} />\r\n <FilesSection files={nonPointCloudFiles} />\r\n </div>\r\n )\r\n}\r\n"],"mappings":";AAsCI,SACE,KADF;AApCJ,YAAY,WAAW;AACvB,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC,SAAS,4BAA4B;AAG9B,SAAS,UAAU;AAV1B;AAWE,QAAM,EAAE,OAAO,cAAc,IAAI,MAAM,WAAW,gBAAgB;AAClE,QAAM,EAAE,SAAS,IAAI,cAAc;AAEnC,QAAM,gBAAgB,gBAAgB,EAAE,IAAI,YAAY;AAGxD,QAAM,cAAa,0CAAU,OAAV,YAAiB,gBAAgB,OAAO,aAAa,IAAI;AAE5E,QAAM,YAAsB,qBAAqB,UAAU,EAAE,SAAS,CAAC;AAEvE,QAAM,kBAA4B,CAAC;AACnC,QAAM,qBAA+B,CAAC;AAGtC,YAAU,IAAI,CAAC,SAAS;AACtB,UAAM,EAAC,WAAW,KAAI,IAAI;AAE1B,UAAM,gBAAe,6BAAM,mBAAkB;AAE7C,QAAI,cAAc;AAChB,sBAAgB,KAAK,IAAI;AAAA,IAC3B,OAAO;AACL,yBAAmB,KAAK,IAAI;AAAA,IAC9B;AAAA,EACF,CAAC;AAED,SACE,qBAAC,SAAI,WAAU,8DACb;AAAA,wBAAC,sBAAmB,OAAO,iBAAiB;AAAA,IAC5C,oBAAC,gBAAa,OAAO,oBAAoB;AAAA,KAC3C;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"FilesSection.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,uCAAuC,CAAA;AAMvE,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,EAAE,CAAA;CACf;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,iBAAiB,qBAmGxD"}
1
+ {"version":3,"file":"FilesSection.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,OAAO,EAAE,MAAM,IAAI,KAAK,EAAE,MAAM,uCAAuC,CAAA;AAIvE,UAAU,iBAAiB;IACzB,KAAK,EAAE,KAAK,EAAE,CAAA;CACf;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,iBAAiB,qBAgGxD"}
@@ -50,13 +50,19 @@ function FilesSection({ files }) {
50
50
  files.map((file) => {
51
51
  var _a;
52
52
  return __spreadProps(__spreadValues({}, file), { isVisible: (_a = file.isVisible) != null ? _a : false });
53
- }).sort((a, b) => a.name.localeCompare(b.name))
53
+ }).sort((a, b) => {
54
+ var _a, _b;
55
+ return ((_a = a.name) != null ? _a : "").localeCompare((_b = b.name) != null ? _b : "");
56
+ })
54
57
  );
55
58
  React.useEffect(() => {
56
59
  setLocalFiles(files.map((file) => {
57
60
  var _a;
58
61
  return __spreadProps(__spreadValues({}, file), { isVisible: (_a = file.isVisible) != null ? _a : false });
59
- }).sort((a, b) => a.name.localeCompare(b.name)));
62
+ }).sort((a, b) => {
63
+ var _a, _b;
64
+ return ((_a = a.name) != null ? _a : "").localeCompare((_b = b.name) != null ? _b : "");
65
+ }));
60
66
  }, [files]);
61
67
  const handleViewFile = React.useCallback((file, newVisibility) => {
62
68
  console.log(`Point cloud file ${file.name} visibility toggled to ${newVisibility}`);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as LR from 'lucide-react'\r\nimport { BuildingsContext, MenusContext } from '../../../../../../../../store'\r\nimport { CollapsibleSection } from '../../../../../../../ui/CollapsibleSection'\r\nimport ConfirmDialog from '../../../../../../../ConfirmDialog'\r\nimport { useTranslations } from 'next-intl'\r\nimport { useUploadFileToBuilding, useDeleteFile } from '../../../../../../../../hooks/files/files'\r\nimport { useFileUploadHandler, useFileDeleteHandler, FileItemComponent, useFileActions, useCommonFileUpload } from '../../../../../../../ui/FilesManager'\r\nimport { DbFile as IFile } from '../../../../../../../../types/dbTypes'\r\n\r\n// Audit Phase 1.C (F-19): hoist so React.memo on FileItemComponent isn't\r\n// defeated by per-render array identity.\r\nconst PC_FILE_OPTIONS: import('../../../../../../../../types/global').FileAction[] = ['download', 'view', 'move', 'info', 'delete']\r\n\r\ninterface FilesSectionProps {\r\n files: IFile[]\r\n}\r\n\r\nexport function FilesSection({ files }: FilesSectionProps) {\r\n // Translation\r\n const t = useTranslations('FileSelection')\r\n\r\n // Get Building context\r\n const { state: buildingsState } = React.useContext(BuildingsContext)\r\n const { building } = buildingsState.buildings\r\n const buildingId = building?.id || -1\r\n\r\n const { uploadFile } = useUploadFileToBuilding(buildingId)\r\n const { deleteFile } = useDeleteFile(buildingId)\r\n \r\n const { handleFileUpload } = useFileUploadHandler({\r\n buildingId,\r\n tag: 'point-cloud-file',\r\n uploadFile,\r\n })\r\n\r\n const { handleDeleteFile } = useFileDeleteHandler({\r\n deleteFile,\r\n onDeleteSuccess: () => {\r\n console.log('File deleted successfully')\r\n }\r\n })\r\n\r\n // Local state for file management with isVisible property\r\n const [localFiles, setLocalFiles] = React.useState<(IFile & { isVisible?: boolean })[]>(\r\n files.map(file => ({ ...file, isVisible: (file as any).isVisible ?? false })).sort((a, b) => a.name.localeCompare(b.name))\r\n )\r\n\r\n // Keep local list in sync with incoming props\r\n React.useEffect(() => {\r\n setLocalFiles(files.map(file => ({ ...file, isVisible: (file as any).isVisible ?? false })).sort((a, b) => a.name.localeCompare(b.name)))\r\n }, [files])\r\n\r\n // Audit Phase 1.C (F-19b): useCallback so onView prop identity stays stable\r\n // and useFileActions returns a stable handleAction. Without this, the\r\n // F-19 React.memo on FileItemComponent is defeated by per-render prop churn.\r\n const handleViewFile = React.useCallback((file: IFile, newVisibility: boolean) => {\r\n console.log(`Point cloud file ${file.name} visibility toggled to ${newVisibility}`)\r\n }, [])\r\n\r\n // Use the common file actions hook\r\n const { handleAction, deleteDialog } = useFileActions({\r\n files: localFiles,\r\n setFiles: setLocalFiles,\r\n buildingId,\r\n handleDeleteFile,\r\n onView: handleViewFile,\r\n })\r\n\r\n // Use the common file upload hook\r\n const { handleAddFile } = useCommonFileUpload({\r\n buildingId,\r\n acceptedFileTypes: '*',\r\n handleFileUpload: async (domFile: globalThis.File) => {\r\n await handleFileUpload(domFile)\r\n },\r\n onUploadSuccess: () => {\r\n console.log('File uploaded successfully')\r\n },\r\n onUploadError: (error) => {\r\n console.error('Error uploading file:', error)\r\n }\r\n })\r\n\r\n return (\r\n <>\r\n <CollapsibleSection\r\n title={t('filesTitle')}\r\n icon={LR.FileText}\r\n className=\"h-1/2 overflow-y-auto\"\r\n itemCount={localFiles.length}\r\n onAddItem={handleAddFile}\r\n addItemTitle={t('addFileTitle')}\r\n >\r\n <div className=\"space-y-1\">\r\n {localFiles.map((item) => (\r\n <FileItemComponent\r\n key={item.id}\r\n file={item}\r\n onAction={handleAction}\r\n options={PC_FILE_OPTIONS}\r\n translationKey=\"FileSelection\"\r\n confirmDelete={false}\r\n />\r\n ))}\r\n </div>\r\n </CollapsibleSection>\r\n\r\n <ConfirmDialog\r\n isOpen={deleteDialog.isOpen}\r\n isDeleting={deleteDialog.isDeleting}\r\n onOpenChange={deleteDialog.onOpenChange}\r\n handleConfirm={deleteDialog.onConfirm}\r\n itemName={deleteDialog.itemName}\r\n />\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/FilesSection.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as LR from 'lucide-react'\r\nimport { BuildingsContext, MenusContext } from '../../../../../../../../store'\r\nimport { CollapsibleSection } from '../../../../../../../ui/CollapsibleSection'\r\nimport ConfirmDialog from '../../../../../../../ConfirmDialog'\r\nimport { useTranslations } from 'next-intl'\r\nimport { useUploadFileToBuilding, useDeleteFile } from '../../../../../../../../hooks/files/files'\r\nimport { useFileUploadHandler, useFileDeleteHandler, FileItemComponent, useFileActions, useCommonFileUpload } from '../../../../../../../ui/FilesManager'\r\nimport { DbFile as IFile } from '../../../../../../../../types/dbTypes'\r\n\r\nconst PC_FILE_OPTIONS: import('../../../../../../../../types/global').FileAction[] = ['download', 'view', 'move', 'info', 'delete']\r\n\r\ninterface FilesSectionProps {\r\n files: IFile[]\r\n}\r\n\r\nexport function FilesSection({ files }: FilesSectionProps) {\r\n // Translation\r\n const t = useTranslations('FileSelection')\r\n\r\n // Get Building context\r\n const { state: buildingsState } = React.useContext(BuildingsContext)\r\n const { building } = buildingsState.buildings\r\n const buildingId = building?.id || -1\r\n\r\n const { uploadFile } = useUploadFileToBuilding(buildingId)\r\n const { deleteFile } = useDeleteFile(buildingId)\r\n \r\n const { handleFileUpload } = useFileUploadHandler({\r\n buildingId,\r\n tag: 'point-cloud-file',\r\n uploadFile,\r\n })\r\n\r\n const { handleDeleteFile } = useFileDeleteHandler({\r\n deleteFile,\r\n onDeleteSuccess: () => {\r\n console.log('File deleted successfully')\r\n }\r\n })\r\n\r\n // Local state for file management with isVisible property\r\n const [localFiles, setLocalFiles] = React.useState<(IFile & { isVisible?: boolean })[]>(\r\n files.map(file => ({ ...file, isVisible: (file as any).isVisible ?? false })).sort((a, b) => (a.name ?? '').localeCompare(b.name ?? ''))\r\n )\r\n\r\n // Keep local list in sync with incoming props\r\n React.useEffect(() => {\r\n setLocalFiles(files.map(file => ({ ...file, isVisible: (file as any).isVisible ?? false })).sort((a, b) => (a.name ?? '').localeCompare(b.name ?? '')))\r\n }, [files])\r\n\r\n const handleViewFile = React.useCallback((file: IFile, newVisibility: boolean) => {\r\n console.log(`Point cloud file ${file.name} visibility toggled to ${newVisibility}`)\r\n }, [])\r\n\r\n // Use the common file actions hook\r\n const { handleAction, deleteDialog } = useFileActions({\r\n files: localFiles,\r\n setFiles: setLocalFiles,\r\n buildingId,\r\n handleDeleteFile,\r\n onView: handleViewFile,\r\n })\r\n\r\n // Use the common file upload hook\r\n const { handleAddFile } = useCommonFileUpload({\r\n buildingId,\r\n acceptedFileTypes: '*',\r\n handleFileUpload: async (domFile: globalThis.File) => {\r\n await handleFileUpload(domFile)\r\n },\r\n onUploadSuccess: () => {\r\n console.log('File uploaded successfully')\r\n },\r\n onUploadError: (error) => {\r\n console.error('Error uploading file:', error)\r\n }\r\n })\r\n\r\n return (\r\n <>\r\n <CollapsibleSection\r\n title={t('filesTitle')}\r\n icon={LR.FileText}\r\n className=\"h-1/2 overflow-y-auto\"\r\n itemCount={localFiles.length}\r\n onAddItem={handleAddFile}\r\n addItemTitle={t('addFileTitle')}\r\n >\r\n <div className=\"space-y-1\">\r\n {localFiles.map((item) => (\r\n <FileItemComponent\r\n key={item.id}\r\n file={item}\r\n onAction={handleAction}\r\n options={PC_FILE_OPTIONS}\r\n translationKey=\"FileSelection\"\r\n confirmDelete={false}\r\n />\r\n ))}\r\n </div>\r\n </CollapsibleSection>\r\n\r\n <ConfirmDialog\r\n isOpen={deleteDialog.isOpen}\r\n isDeleting={deleteDialog.isDeleting}\r\n onOpenChange={deleteDialog.onOpenChange}\r\n handleConfirm={deleteDialog.onConfirm}\r\n itemName={deleteDialog.itemName}\r\n />\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"PointCloudSection.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAA;AAuB9D,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,uBAAuB,qBA+YpE"}
1
+ {"version":3,"file":"PointCloudSection.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAU9B,OAAO,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAA;AAqB9D,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE,uBAAuB,qBA0YpE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as LR from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { useSession } from 'next-auth/react'\r\nimport { CollapsibleSection } from '../../../../../../../ui/CollapsibleSection'\r\nimport { FileItemComponent } from '../../../../../../../ui/FilesManager/src/FileItemComponent'\r\nimport { useFileActions } from '../../../../../../../ui/FilesManager/src/useFileActions'\r\nimport ConfirmDialog from '../../../../../../../ConfirmDialog'\r\nimport { Button } from '../../../../../../../ui/Button'\r\nimport { useOrganization } from '../../../../../../../../hooks/organizations/organizations'\r\nimport { DbFile } from '../../../../../../../../types/dbTypes'\r\nimport { PointCloudContext } from '../../../../../../../../store'\r\n\r\nconst API_BASE = process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? 'http://localhost:5101'\r\n\r\ntype CreatePointCloudResponse = {\r\n pointCloud: {\r\n id: string\r\n name: string\r\n }\r\n upload: {\r\n uploadUrl: string\r\n }\r\n}\r\n\r\ntype StartConversionResponse = {\r\n jobId: string\r\n}\r\n\r\n// Audit Phase 1.C (F-19): hoist so React.memo on FileItemComponent isn't\r\n// defeated by per-render array identity.\r\nconst POINT_CLOUD_OPTIONS: import('../../../../../../../../types/global').FileAction[] = ['view', 'delete', 'info']\r\n\r\ninterface PointCloudsSectionProps {\r\n files: DbFile[]\r\n}\r\n\r\nexport function PointCloudsSection({ files }: PointCloudsSectionProps) {\r\n // Translation\r\n const t = useTranslations('PointCloudManagement')\r\n\r\n // Get current user session\r\n const { data: session } = useSession()\r\n const organizationId = session?.user?.organizationId ?? null;\r\n const { organization } = useOrganization(organizationId ? organizationId.toString() : null);\r\n\r\n // Point cloud context for loading/unloading clouds in the viewer\r\n const { dispatch: pointCloudDispatch } = React.useContext(PointCloudContext)\r\n\r\n // State for point clouds — includes isVisible to track which are loaded in viewer\r\n const [pointcloudsFiles, setPointcloudsFiles] = React.useState<(DbFile & { isVisible?: boolean })[]>(\r\n () => files.map(f => ({ ...f, isVisible: false }))\r\n )\r\n const esRef = React.useRef<EventSource | null>(null)\r\n const autoLoadedRef = React.useRef(false)\r\n\r\n const fileSyncKey = files\r\n .map(\r\n (file) =>\r\n `${file.id}:${file.name}:${Boolean(file.pointCloudUploaded)}:${Boolean(file.pointCloudPotreeConverted)}:${file.uploadedAt}:${file.potreeMetadataFileKey ?? ''}`\r\n )\r\n .join('|')\r\n\r\n // Sync incoming files from props while preserving isVisible state for known files\r\n React.useEffect(() => {\r\n setPointcloudsFiles(prev => {\r\n const prevMap = new Map(prev.map(f => [String(f.id), f]))\r\n return files.map(f => ({\r\n ...f,\r\n isVisible: prevMap.get(String(f.id))?.isVisible ?? false,\r\n }))\r\n })\r\n }, [fileSyncKey])\r\n\r\n // Auto-load the most recently uploaded converted file on first access\r\n React.useEffect(() => {\r\n if (autoLoadedRef.current || files.length === 0) return\r\n\r\n const readyFiles = files.filter(f => Boolean(f.pointCloudPotreeConverted))\r\n if (readyFiles.length === 0) return\r\n\r\n const lastFile = readyFiles.reduce((latest, f) =>\r\n new Date(f.uploadedAt) > new Date(latest.uploadedAt) ? f : latest\r\n )\r\n\r\n autoLoadedRef.current = true\r\n pointCloudDispatch({ type: 'LOAD_POINT_CLOUD', payload: { id: String(lastFile.id) } })\r\n setPointcloudsFiles(prev =>\r\n prev.map(f => ({ ...f, isVisible: String(f.id) === String(lastFile.id) }))\r\n )\r\n }, [fileSyncKey, files, pointCloudDispatch])\r\n\r\n React.useEffect(() => {\r\n // Cleanup SSE on unmount\r\n return () => {\r\n if (esRef.current) {\r\n esRef.current.close()\r\n }\r\n }\r\n }, [])\r\n\r\n // Toggle a point cloud on/off in the viewer via context\r\n const handleView = React.useCallback((file: DbFile, newVisibility: boolean) => {\r\n const id = String(file.id)\r\n if (newVisibility) {\r\n pointCloudDispatch({ type: 'LOAD_POINT_CLOUD', payload: { id } })\r\n } else {\r\n pointCloudDispatch({ type: 'UNLOAD_POINT_CLOUD', payload: { id } })\r\n }\r\n }, [pointCloudDispatch])\r\n\r\n const handleDeleteFile = React.useCallback(async (file: DbFile) => {\r\n const res = await fetch(`${API_BASE}/point-cloud/${encodeURIComponent(String(file.id))}`, {\r\n method: 'DELETE',\r\n })\r\n\r\n if (!res.ok) {\r\n const msg = await res.text()\r\n throw new Error(msg || `Delete failed (${res.status})`)\r\n }\r\n }, [])\r\n\r\n const handleConvert = React.useCallback(async (file: DbFile) => {\r\n const res = await fetch(\r\n `${API_BASE}/point-cloud/${encodeURIComponent(String(file.id))}/convert-to-potree`,\r\n {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ options: { sampling_method: 'poisson' } }),\r\n }\r\n )\r\n\r\n if (!res.ok) {\r\n const msg = await res.text()\r\n throw new Error(msg || `Conversion failed (${res.status})`)\r\n }\r\n\r\n const { jobId } = await res.json() as StartConversionResponse\r\n subscribeToProgress(jobId, file.id)\r\n }, [])\r\n\r\n // Audit Phase 1.C (F-19b): pass useCallback'd handlers so the\r\n // onView/onDelete prop identities stay stable. Previously these were\r\n // inline arrows, defeating React.memo on FileItemComponent transitively\r\n // via useFileActions' internal memo dep list.\r\n // handleView is already useCallback'd above — pass it directly.\r\n const handleDeletePointCloud = React.useCallback((file: DbFile) => {\r\n pointCloudDispatch({ type: 'UNLOAD_POINT_CLOUD', payload: { id: String(file.id) } })\r\n }, [pointCloudDispatch])\r\n\r\n // Use the generic file actions hook\r\n const { handleAction, deleteDialog } = useFileActions({\r\n files: pointcloudsFiles,\r\n setFiles: setPointcloudsFiles as React.Dispatch<React.SetStateAction<(DbFile & { isVisible?: boolean })[]>>,\r\n buildingId: 0,\r\n handleDeleteFile,\r\n onView: handleView,\r\n onDelete: handleDeletePointCloud,\r\n })\r\n\r\n // Sort: visible (loaded) files at the top, preserving relative order within each group\r\n const sortedFiles = React.useMemo(() => {\r\n return [...pointcloudsFiles].sort((a, b) => {\r\n const aLoaded = a.isVisible !== false ? 1 : 0\r\n const bLoaded = b.isVisible !== false ? 1 : 0\r\n return bLoaded - aLoaded\r\n })\r\n }, [pointcloudsFiles])\r\n\r\n // Create point cloud entry\r\n async function createPointCloud(name: string, uploadedBy: string | null): Promise<CreatePointCloudResponse> {\r\n const res = await fetch(`${API_BASE}/point-cloud`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ \r\n name, \r\n uploadedBy,\r\n organizationName: organization?.name,\r\n organizationId: organizationId\r\n }),\r\n })\r\n\r\n if (!res.ok) {\r\n const msg = await res.text()\r\n throw new Error(`Create point-cloud failed: ${msg || res.status}`)\r\n }\r\n\r\n return res.json()\r\n }\r\n\r\n // Upload to presigned URL\r\n function uploadToPresignedUrl(\r\n url: string,\r\n file: File,\r\n onProgress?: (pct: number) => void\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const xhr = new XMLHttpRequest()\r\n xhr.open('PUT', url, true)\r\n\r\n if (onProgress) {\r\n xhr.upload.onprogress = (evt) => {\r\n if (evt.lengthComputable) {\r\n const pct = Math.round((evt.loaded / evt.total) * 100)\r\n onProgress(pct)\r\n }\r\n }\r\n }\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) resolve()\r\n else reject(new Error(`Upload failed with status ${xhr.status}`))\r\n }\r\n\r\n xhr.onerror = () => reject(new Error('Network error during upload'))\r\n xhr.send(file)\r\n } catch (err) {\r\n reject(err)\r\n }\r\n })\r\n }\r\n\r\n // Start conversion\r\n async function startConversion(pointCloudId: string): Promise<StartConversionResponse> {\r\n const res = await fetch(\r\n `${API_BASE}/point-cloud/${encodeURIComponent(pointCloudId)}/convert-to-potree`,\r\n {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ options: { sampling_method: 'poisson' } }),\r\n }\r\n )\r\n\r\n if (!res.ok) {\r\n const msg = await res.text()\r\n throw new Error(`convert-to-potree failed: ${msg || res.status}`)\r\n }\r\n\r\n return res.json()\r\n }\r\n\r\n // Subscribe to conversion progress\r\n function subscribeToProgress(jobId: string, pointCloudId: number) {\r\n if (!jobId) return\r\n\r\n if (esRef.current) {\r\n esRef.current.close()\r\n }\r\n\r\n const es = new EventSource(\r\n `${API_BASE}/events/convert-progress/${encodeURIComponent(jobId)}`\r\n )\r\n esRef.current = es\r\n\r\n es.onopen = () => console.log('SSE connection opened')\r\n\r\n es.onerror = (event) => {\r\n console.error('SSE error:', event)\r\n // Update to failed state\r\n setPointcloudsFiles((prev) =>\r\n prev.map((pc) =>\r\n Number(pc.id) === pointCloudId\r\n ? { ...pc, status: 'idle', conversionProgress: 0 }\r\n : pc\r\n )\r\n )\r\n }\r\n\r\n es.addEventListener('progress', (event) => {\r\n try {\r\n const msgEvent = event as MessageEvent\r\n const data = JSON.parse(msgEvent.data)\r\n\r\n console.log('[progress]', data.status, data.message, data.progress)\r\n\r\n if (typeof data.progress === 'number') {\r\n setPointcloudsFiles((prev) =>\r\n prev.map((pc) =>\r\n Number(pc.id) === pointCloudId\r\n ? { ...pc, conversionProgress: data.progress }\r\n : pc\r\n )\r\n )\r\n }\r\n } catch (err) {\r\n console.error('Failed to parse progress event', err)\r\n }\r\n })\r\n\r\n es.addEventListener('finished', () => {\r\n console.log('[finished] Conversion completed')\r\n setPointcloudsFiles((prev) =>\r\n prev.map((pc) =>\r\n Number(pc.id) === pointCloudId\r\n ? { ...pc, status: 'idle', conversionProgress: 100 }\r\n : pc\r\n )\r\n )\r\n es.close()\r\n esRef.current = null\r\n })\r\n\r\n es.addEventListener('failed', () => {\r\n console.log('[failed] Conversion failed')\r\n setPointcloudsFiles((prev) =>\r\n prev.map((pc) =>\r\n Number(pc.id) === pointCloudId\r\n ? { ...pc, status: 'idle', conversionProgress: 0 }\r\n : pc\r\n )\r\n )\r\n es.close()\r\n esRef.current = null\r\n })\r\n }\r\n\r\n // Handle file upload\r\n const handleFileUpload = async (file: File) => {\r\n if (!file) return\r\n\r\n const originalFileName = file.name\r\n const fileExt = originalFileName.toLowerCase()\r\n const baseFileName = originalFileName.replace(/\\.(laz|las)$/i, '')\r\n\r\n // Validate file extension\r\n if (!fileExt.endsWith('.laz') && !fileExt.endsWith('.las')) {\r\n alert('Please select a LAZ or LAS file.')\r\n return\r\n }\r\n\r\n // Check for duplicate names and append (1), (2), etc.\r\n let fileName = baseFileName\r\n let counter = 1\r\n const existingNames = pointcloudsFiles.map((pc) => pc.name)\r\n \r\n while (existingNames.includes(fileName)) {\r\n fileName = `${baseFileName} (${counter})`\r\n counter++\r\n }\r\n\r\n try {\r\n console.log('Creating point cloud entry...')\r\n const userEmail = session?.user?.email || null\r\n const { pointCloud, upload } = await createPointCloud(fileName, userEmail)\r\n console.log('Point cloud created:', pointCloud.id)\r\n\r\n console.log('Uploading file...')\r\n await uploadToPresignedUrl(upload.uploadUrl, file, (pct) => {\r\n console.log(`Upload progress: ${pct}%`)\r\n })\r\n console.log('Upload complete!')\r\n\r\n console.log('Starting conversion...')\r\n const conversion = await startConversion(pointCloud.id)\r\n console.log('Conversion started:', conversion.jobId)\r\n\r\n // Subscribe to progress\r\n subscribeToProgress(conversion.jobId, Number(pointCloud.id))\r\n } catch (error) {\r\n console.error('Error uploading point cloud:', error)\r\n \r\n alert(\r\n error instanceof Error\r\n ? `Failed to upload: ${error.message}`\r\n : 'Failed to upload point cloud'\r\n )\r\n }\r\n }\r\n\r\n // Handle upload button click\r\n const handleUpload = () => {\r\n const input = document.createElement('input')\r\n input.type = 'file'\r\n input.accept = '.laz,.las'\r\n input.onchange = (e) => {\r\n const file = (e.target as HTMLInputElement).files?.[0]\r\n if (file) {\r\n handleFileUpload(file)\r\n }\r\n }\r\n input.click()\r\n }\r\n\r\n return (\r\n <>\r\n <CollapsibleSection\r\n title={t('title')}\r\n icon={LR.Grip}\r\n className=\"h-1/2 overflow-y-auto\"\r\n itemCount={pointcloudsFiles.length}\r\n onAddItem={handleUpload}\r\n addItemTitle={t('uploadTitle')}\r\n >\r\n <div className=\"space-y-1\">\r\n {sortedFiles.length === 0 ? (\r\n <div className=\"px-2 py-3 text-sm text-muted-foreground text-center\">\r\n {t('noPointClouds')}\r\n </div>\r\n ) : (\r\n sortedFiles.map((file) => (\r\n <div key={file.id} className=\"flex items-center gap-1\">\r\n <div className=\"flex-1 min-w-0\">\r\n <FileItemComponent\r\n file={file}\r\n onAction={handleAction}\r\n options={POINT_CLOUD_OPTIONS}\r\n />\r\n </div>\r\n {Boolean(file.pointCloudUploaded) && !Boolean(file.pointCloudPotreeConverted) && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-6 w-6 p-0\"\r\n onClick={() => void handleConvert(file)}\r\n title={t('convertTitle')}\r\n >\r\n <LR.RefreshCw className=\"h-3 w-3\" />\r\n </Button>\r\n )}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n </CollapsibleSection>\r\n\r\n <ConfirmDialog\r\n isOpen={deleteDialog.isOpen}\r\n isDeleting={deleteDialog.isDeleting}\r\n onOpenChange={deleteDialog.onOpenChange}\r\n handleConfirm={deleteDialog.onConfirm}\r\n itemName={deleteDialog.itemName}\r\n dataType=\"file\"\r\n />\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","_b"]}
1
+ {"version":3,"sources":["../../../../../../../../../../src/core/components/viewers/pointcloud/src/PointCloudSidebar/src/FileTab/src/PointCloudSection.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport * as LR from 'lucide-react'\r\nimport { useTranslations } from 'next-intl'\r\nimport { useSession } from 'next-auth/react'\r\nimport { CollapsibleSection } from '../../../../../../../ui/CollapsibleSection'\r\nimport { FileItemComponent } from '../../../../../../../ui/FilesManager/src/FileItemComponent'\r\nimport { useFileActions } from '../../../../../../../ui/FilesManager/src/useFileActions'\r\nimport ConfirmDialog from '../../../../../../../ConfirmDialog'\r\nimport { Button } from '../../../../../../../ui/Button'\r\nimport { useOrganization } from '../../../../../../../../hooks/organizations/organizations'\r\nimport { DbFile } from '../../../../../../../../types/dbTypes'\r\nimport { PointCloudContext } from '../../../../../../../../store'\r\n\r\nconst API_BASE = process.env.NEXT_PUBLIC_POINTCLOUD_API_URL ?? 'http://localhost:5101'\r\n\r\ntype CreatePointCloudResponse = {\r\n pointCloud: {\r\n id: string\r\n name: string\r\n }\r\n upload: {\r\n uploadUrl: string\r\n }\r\n}\r\n\r\ntype StartConversionResponse = {\r\n jobId: string\r\n}\r\n\r\nconst POINT_CLOUD_OPTIONS: import('../../../../../../../../types/global').FileAction[] = ['view', 'delete', 'info']\r\n\r\ninterface PointCloudsSectionProps {\r\n files: DbFile[]\r\n}\r\n\r\nexport function PointCloudsSection({ files }: PointCloudsSectionProps) {\r\n // Translation\r\n const t = useTranslations('PointCloudManagement')\r\n\r\n // Get current user session\r\n const { data: session } = useSession()\r\n const organizationId = session?.user?.organizationId ?? null;\r\n const { organization } = useOrganization(organizationId ? organizationId.toString() : null);\r\n\r\n // Point cloud context for loading/unloading clouds in the viewer\r\n const { dispatch: pointCloudDispatch } = React.useContext(PointCloudContext)\r\n\r\n // State for point clouds — includes isVisible to track which are loaded in viewer\r\n const [pointcloudsFiles, setPointcloudsFiles] = React.useState<(DbFile & { isVisible?: boolean })[]>(\r\n () => files.map(f => ({ ...f, isVisible: false }))\r\n )\r\n const esRef = React.useRef<EventSource | null>(null)\r\n const autoLoadedRef = React.useRef(false)\r\n\r\n const fileSyncKey = files\r\n .map(\r\n (file) =>\r\n `${file.id}:${file.name}:${Boolean(file.pointCloudUploaded)}:${Boolean(file.pointCloudPotreeConverted)}:${file.uploadedAt}:${file.potreeMetadataFileKey ?? ''}`\r\n )\r\n .join('|')\r\n\r\n // Sync incoming files from props while preserving isVisible state for known files\r\n React.useEffect(() => {\r\n setPointcloudsFiles(prev => {\r\n const prevMap = new Map(prev.map(f => [String(f.id), f]))\r\n return files.map(f => ({\r\n ...f,\r\n isVisible: prevMap.get(String(f.id))?.isVisible ?? false,\r\n }))\r\n })\r\n }, [fileSyncKey])\r\n\r\n // Auto-load the most recently uploaded converted file on first access\r\n React.useEffect(() => {\r\n if (autoLoadedRef.current || files.length === 0) return\r\n\r\n const readyFiles = files.filter(f => Boolean(f.pointCloudPotreeConverted))\r\n if (readyFiles.length === 0) return\r\n\r\n const lastFile = readyFiles.reduce((latest, f) =>\r\n new Date(f.uploadedAt) > new Date(latest.uploadedAt) ? f : latest\r\n )\r\n\r\n autoLoadedRef.current = true\r\n pointCloudDispatch({ type: 'LOAD_POINT_CLOUD', payload: { id: String(lastFile.id) } })\r\n setPointcloudsFiles(prev =>\r\n prev.map(f => ({ ...f, isVisible: String(f.id) === String(lastFile.id) }))\r\n )\r\n }, [fileSyncKey, files, pointCloudDispatch])\r\n\r\n React.useEffect(() => {\r\n // Cleanup SSE on unmount\r\n return () => {\r\n if (esRef.current) {\r\n esRef.current.close()\r\n }\r\n }\r\n }, [])\r\n\r\n // Toggle a point cloud on/off in the viewer via context\r\n const handleView = React.useCallback((file: DbFile, newVisibility: boolean) => {\r\n const id = String(file.id)\r\n if (newVisibility) {\r\n pointCloudDispatch({ type: 'LOAD_POINT_CLOUD', payload: { id } })\r\n } else {\r\n pointCloudDispatch({ type: 'UNLOAD_POINT_CLOUD', payload: { id } })\r\n }\r\n }, [pointCloudDispatch])\r\n\r\n const handleDeleteFile = React.useCallback(async (file: DbFile) => {\r\n const res = await fetch(`${API_BASE}/point-cloud/${encodeURIComponent(String(file.id))}`, {\r\n method: 'DELETE',\r\n })\r\n\r\n if (!res.ok) {\r\n const msg = await res.text()\r\n throw new Error(msg || `Delete failed (${res.status})`)\r\n }\r\n }, [])\r\n\r\n const handleConvert = React.useCallback(async (file: DbFile) => {\r\n const res = await fetch(\r\n `${API_BASE}/point-cloud/${encodeURIComponent(String(file.id))}/convert-to-potree`,\r\n {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ options: { sampling_method: 'poisson' } }),\r\n }\r\n )\r\n\r\n if (!res.ok) {\r\n const msg = await res.text()\r\n throw new Error(msg || `Conversion failed (${res.status})`)\r\n }\r\n\r\n const { jobId } = await res.json() as StartConversionResponse\r\n subscribeToProgress(jobId, file.id)\r\n }, [])\r\n\r\n const handleDeletePointCloud = React.useCallback((file: DbFile) => {\r\n pointCloudDispatch({ type: 'UNLOAD_POINT_CLOUD', payload: { id: String(file.id) } })\r\n }, [pointCloudDispatch])\r\n\r\n // Use the generic file actions hook\r\n const { handleAction, deleteDialog } = useFileActions({\r\n files: pointcloudsFiles,\r\n setFiles: setPointcloudsFiles as React.Dispatch<React.SetStateAction<(DbFile & { isVisible?: boolean })[]>>,\r\n buildingId: 0,\r\n handleDeleteFile,\r\n onView: handleView,\r\n onDelete: handleDeletePointCloud,\r\n })\r\n\r\n // Sort: visible (loaded) files at the top, preserving relative order within each group\r\n const sortedFiles = React.useMemo(() => {\r\n return [...pointcloudsFiles].sort((a, b) => {\r\n const aLoaded = a.isVisible !== false ? 1 : 0\r\n const bLoaded = b.isVisible !== false ? 1 : 0\r\n return bLoaded - aLoaded\r\n })\r\n }, [pointcloudsFiles])\r\n\r\n // Create point cloud entry\r\n async function createPointCloud(name: string, uploadedBy: string | null): Promise<CreatePointCloudResponse> {\r\n const res = await fetch(`${API_BASE}/point-cloud`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ \r\n name, \r\n uploadedBy,\r\n organizationName: organization?.name,\r\n organizationId: organizationId\r\n }),\r\n })\r\n\r\n if (!res.ok) {\r\n const msg = await res.text()\r\n throw new Error(`Create point-cloud failed: ${msg || res.status}`)\r\n }\r\n\r\n return res.json()\r\n }\r\n\r\n // Upload to presigned URL\r\n function uploadToPresignedUrl(\r\n url: string,\r\n file: File,\r\n onProgress?: (pct: number) => void\r\n ): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const xhr = new XMLHttpRequest()\r\n xhr.open('PUT', url, true)\r\n\r\n if (onProgress) {\r\n xhr.upload.onprogress = (evt) => {\r\n if (evt.lengthComputable) {\r\n const pct = Math.round((evt.loaded / evt.total) * 100)\r\n onProgress(pct)\r\n }\r\n }\r\n }\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) resolve()\r\n else reject(new Error(`Upload failed with status ${xhr.status}`))\r\n }\r\n\r\n xhr.onerror = () => reject(new Error('Network error during upload'))\r\n xhr.send(file)\r\n } catch (err) {\r\n reject(err)\r\n }\r\n })\r\n }\r\n\r\n // Start conversion\r\n async function startConversion(pointCloudId: string): Promise<StartConversionResponse> {\r\n const res = await fetch(\r\n `${API_BASE}/point-cloud/${encodeURIComponent(pointCloudId)}/convert-to-potree`,\r\n {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ options: { sampling_method: 'poisson' } }),\r\n }\r\n )\r\n\r\n if (!res.ok) {\r\n const msg = await res.text()\r\n throw new Error(`convert-to-potree failed: ${msg || res.status}`)\r\n }\r\n\r\n return res.json()\r\n }\r\n\r\n // Subscribe to conversion progress\r\n function subscribeToProgress(jobId: string, pointCloudId: number) {\r\n if (!jobId) return\r\n\r\n if (esRef.current) {\r\n esRef.current.close()\r\n }\r\n\r\n const es = new EventSource(\r\n `${API_BASE}/events/convert-progress/${encodeURIComponent(jobId)}`\r\n )\r\n esRef.current = es\r\n\r\n es.onopen = () => console.log('SSE connection opened')\r\n\r\n es.onerror = (event) => {\r\n console.error('SSE error:', event)\r\n // Update to failed state\r\n setPointcloudsFiles((prev) =>\r\n prev.map((pc) =>\r\n Number(pc.id) === pointCloudId\r\n ? { ...pc, status: 'idle', conversionProgress: 0 }\r\n : pc\r\n )\r\n )\r\n }\r\n\r\n es.addEventListener('progress', (event) => {\r\n try {\r\n const msgEvent = event as MessageEvent\r\n const data = JSON.parse(msgEvent.data)\r\n\r\n console.log('[progress]', data.status, data.message, data.progress)\r\n\r\n if (typeof data.progress === 'number') {\r\n setPointcloudsFiles((prev) =>\r\n prev.map((pc) =>\r\n Number(pc.id) === pointCloudId\r\n ? { ...pc, conversionProgress: data.progress }\r\n : pc\r\n )\r\n )\r\n }\r\n } catch (err) {\r\n console.error('Failed to parse progress event', err)\r\n }\r\n })\r\n\r\n es.addEventListener('finished', () => {\r\n console.log('[finished] Conversion completed')\r\n setPointcloudsFiles((prev) =>\r\n prev.map((pc) =>\r\n Number(pc.id) === pointCloudId\r\n ? { ...pc, status: 'idle', conversionProgress: 100 }\r\n : pc\r\n )\r\n )\r\n es.close()\r\n esRef.current = null\r\n })\r\n\r\n es.addEventListener('failed', () => {\r\n console.log('[failed] Conversion failed')\r\n setPointcloudsFiles((prev) =>\r\n prev.map((pc) =>\r\n Number(pc.id) === pointCloudId\r\n ? { ...pc, status: 'idle', conversionProgress: 0 }\r\n : pc\r\n )\r\n )\r\n es.close()\r\n esRef.current = null\r\n })\r\n }\r\n\r\n // Handle file upload\r\n const handleFileUpload = async (file: File) => {\r\n if (!file) return\r\n\r\n const originalFileName = file.name\r\n const fileExt = originalFileName.toLowerCase()\r\n const baseFileName = originalFileName.replace(/\\.(laz|las)$/i, '')\r\n\r\n // Validate file extension\r\n if (!fileExt.endsWith('.laz') && !fileExt.endsWith('.las')) {\r\n alert('Please select a LAZ or LAS file.')\r\n return\r\n }\r\n\r\n // Check for duplicate names and append (1), (2), etc.\r\n let fileName = baseFileName\r\n let counter = 1\r\n const existingNames = pointcloudsFiles.map((pc) => pc.name)\r\n \r\n while (existingNames.includes(fileName)) {\r\n fileName = `${baseFileName} (${counter})`\r\n counter++\r\n }\r\n\r\n try {\r\n console.log('Creating point cloud entry...')\r\n const userEmail = session?.user?.email || null\r\n const { pointCloud, upload } = await createPointCloud(fileName, userEmail)\r\n console.log('Point cloud created:', pointCloud.id)\r\n\r\n console.log('Uploading file...')\r\n await uploadToPresignedUrl(upload.uploadUrl, file, (pct) => {\r\n console.log(`Upload progress: ${pct}%`)\r\n })\r\n console.log('Upload complete!')\r\n\r\n console.log('Starting conversion...')\r\n const conversion = await startConversion(pointCloud.id)\r\n console.log('Conversion started:', conversion.jobId)\r\n\r\n // Subscribe to progress\r\n subscribeToProgress(conversion.jobId, Number(pointCloud.id))\r\n } catch (error) {\r\n console.error('Error uploading point cloud:', error)\r\n \r\n alert(\r\n error instanceof Error\r\n ? `Failed to upload: ${error.message}`\r\n : 'Failed to upload point cloud'\r\n )\r\n }\r\n }\r\n\r\n // Handle upload button click\r\n const handleUpload = () => {\r\n const input = document.createElement('input')\r\n input.type = 'file'\r\n input.accept = '.laz,.las'\r\n input.onchange = (e) => {\r\n const file = (e.target as HTMLInputElement).files?.[0]\r\n if (file) {\r\n handleFileUpload(file)\r\n }\r\n }\r\n input.click()\r\n }\r\n\r\n return (\r\n <>\r\n <CollapsibleSection\r\n title={t('title')}\r\n icon={LR.Grip}\r\n className=\"h-1/2 overflow-y-auto\"\r\n itemCount={pointcloudsFiles.length}\r\n onAddItem={handleUpload}\r\n addItemTitle={t('uploadTitle')}\r\n >\r\n <div className=\"space-y-1\">\r\n {sortedFiles.length === 0 ? (\r\n <div className=\"px-2 py-3 text-sm text-muted-foreground text-center\">\r\n {t('noPointClouds')}\r\n </div>\r\n ) : (\r\n sortedFiles.map((file) => (\r\n <div key={file.id} className=\"flex items-center gap-1\">\r\n <div className=\"flex-1 min-w-0\">\r\n <FileItemComponent\r\n file={file}\r\n onAction={handleAction}\r\n options={POINT_CLOUD_OPTIONS}\r\n />\r\n </div>\r\n {Boolean(file.pointCloudUploaded) && !Boolean(file.pointCloudPotreeConverted) && (\r\n <Button\r\n variant=\"ghost\"\r\n size=\"icon\"\r\n className=\"h-6 w-6 p-0\"\r\n onClick={() => void handleConvert(file)}\r\n title={t('convertTitle')}\r\n >\r\n <LR.RefreshCw className=\"h-3 w-3\" />\r\n </Button>\r\n )}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n </CollapsibleSection>\r\n\r\n <ConfirmDialog\r\n isOpen={deleteDialog.isOpen}\r\n isDeleting={deleteDialog.isDeleting}\r\n onOpenChange={deleteDialog.onOpenChange}\r\n handleConfirm={deleteDialog.onConfirm}\r\n itemName={deleteDialog.itemName}\r\n dataType=\"file\"\r\n />\r\n </>\r\n )\r\n}\r\n"],"mappings":"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","names":["_a","_b"]}
@@ -40,21 +40,21 @@ const NodeSizeSelectionTool = ({
40
40
  const { viewer } = pointCloudState.pointcloud;
41
41
  React.useEffect(() => {
42
42
  if (!viewer) return;
43
- let pointcloud = viewer.scene.pointclouds[0];
44
- let material = pointcloud.material;
45
- material.minSize = minNodeSize[0];
43
+ const pointcloud = viewer.scene.pointclouds[0];
44
+ if (!pointcloud) return;
45
+ pointcloud.material.minSize = minNodeSize[0];
46
46
  }, [viewer, minNodeSize]);
47
47
  React.useEffect(() => {
48
48
  if (!viewer) return;
49
- let pointcloud = viewer.scene.pointclouds[0];
50
- let material = pointcloud.material;
51
- material.maxSize = maxNodeSize[0];
49
+ const pointcloud = viewer.scene.pointclouds[0];
50
+ if (!pointcloud) return;
51
+ pointcloud.material.maxSize = maxNodeSize[0];
52
52
  }, [viewer, maxNodeSize]);
53
53
  React.useEffect(() => {
54
54
  if (!viewer) return;
55
- let pointcloud = viewer.scene.pointclouds[0];
56
- let material = pointcloud.material;
57
- material.pointSizeType = pointSizeType;
55
+ const pointcloud = viewer.scene.pointclouds[0];
56
+ if (!pointcloud) return;
57
+ pointcloud.material.pointSizeType = pointSizeType;
58
58
  }, [viewer, pointSizeType]);
59
59
  const handleMinNodeSizeChange = (value) => {
60
60
  if (value[0] <= maxNodeSize[0]) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../src/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from \"react\";\r\nimport { PointCloudContext } from '../../../../../../store'\r\nimport { useTranslations } from 'next-intl'\r\nimport { Pin, TrendingDown, Zap } from 'lucide-react'\r\n\r\nimport { SliderWithInput, Slider } from '../../../../../ui/Slider'\r\nimport { Label } from '../../../../../ui/Label'\r\nimport { PointSizeType } from '../../../define'\r\n\r\nexport interface CustomButtonProps {\r\n active: boolean;\r\n onClick: () => void;\r\n disabled?: boolean;\r\n icon: React.ReactNode;\r\n label: string;\r\n}\r\n\r\nexport const CustomButton: React.FC<CustomButtonProps> = ({\r\n active,\r\n onClick,\r\n disabled = false,\r\n icon,\r\n label\r\n}) => {\r\n return (\r\n <button\r\n onClick={onClick}\r\n disabled={disabled}\r\n className={`flex-1 px-3 py-2 text-xs rounded-md border transition-colors ${\r\n active\r\n ? 'bg-primary text-primary-foreground border-primary'\r\n : 'bg-background hover:bg-accent border-input'\r\n } ${disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\r\n >\r\n <div className=\"flex items-center justify-center gap-1\">\r\n {icon}\r\n {label}\r\n </div>\r\n </button>\r\n );\r\n};\r\n\r\ninterface NodeSizeSelectionToolProps {\r\n minNodeSize: number[];\r\n setMinNodeSize: (value: number[]) => void;\r\n maxNodeSize: number[];\r\n setMaxNodeSize: (value: number[]) => void;\r\n pointSizeType: PointSizeType;\r\n setPointSizeType: (type: PointSizeType) => void;\r\n minLimit: number;\r\n maxLimit: number;\r\n\r\n}\r\n\r\nexport const NodeSizeSelectionTool: React.FC<NodeSizeSelectionToolProps> = ({\r\n minNodeSize,\r\n setMinNodeSize,\r\n maxNodeSize,\r\n setMaxNodeSize, \r\n pointSizeType, \r\n setPointSizeType,\r\n minLimit, \r\n maxLimit\r\n}) => {\r\n const { state: pointCloudState } = React.useContext(PointCloudContext)\r\n const { viewer } = pointCloudState.pointcloud\r\n\r\n\r\n React.useEffect(() => {\r\n if (!viewer) return\r\n\r\n let pointcloud = viewer.scene.pointclouds[0];\r\n let material = pointcloud.material;\r\n\r\n material.minSize = minNodeSize[0];\r\n\r\n }, [viewer, minNodeSize])\r\n\r\n React.useEffect(() => {\r\n if (!viewer) return\r\n\r\n let pointcloud = viewer.scene.pointclouds[0];\r\n let material = pointcloud.material;\r\n\r\n material.maxSize = maxNodeSize[0];\r\n\r\n }, [viewer, maxNodeSize])\r\n\r\n React.useEffect(() => {\r\n if (!viewer) return\r\n\r\n let pointcloud = viewer.scene.pointclouds[0];\r\n let material = pointcloud.material;\r\n\r\n material.pointSizeType = pointSizeType;\r\n\r\n }, [viewer, pointSizeType])\r\n\r\n const handleMinNodeSizeChange = (value: number[]) => {\r\n // Ensure min doesn't exceed max\r\n if (value[0] <= maxNodeSize[0]) {\r\n setMinNodeSize(value)\r\n }\r\n }\r\n\r\n const handleMaxNodeSizeChange = (value: number[]) => {\r\n // Ensure max doesn't go below min\r\n if (value[0] >= minNodeSize[0]) {\r\n setMaxNodeSize(value)\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n <Label className=\"text-sm font-medium\">Node Size</Label>\r\n\r\n {/* Point Size Type Selection */}\r\n <div className=\"space-y-2\">\r\n <span className=\"text-xs text-gray-600\">Point Size Type</span>\r\n <div className=\"flex gap-2\">\r\n <CustomButton\r\n active={pointSizeType === PointSizeType.FIXED}\r\n onClick={() => setPointSizeType(PointSizeType.FIXED)}\r\n disabled={!viewer}\r\n icon={<Pin size={14} />}\r\n label=\"Fixed\"\r\n />\r\n <CustomButton\r\n active={pointSizeType === PointSizeType.ATTENUATED}\r\n onClick={() => setPointSizeType(PointSizeType.ATTENUATED)}\r\n disabled={!viewer}\r\n icon={<TrendingDown size={14} />}\r\n label=\"Attenuated\"\r\n />\r\n <CustomButton\r\n active={pointSizeType === PointSizeType.ADAPTIVE}\r\n onClick={() => setPointSizeType(PointSizeType.ADAPTIVE)}\r\n disabled={!viewer}\r\n icon={<Zap size={14} />}\r\n label=\"Adaptive\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Min Node Size */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-xs text-gray-600\">Minimum</span>\r\n <span className=\"text-xs text-gray-500\">{minNodeSize[0]}px</span>\r\n </div>\r\n <Slider\r\n value={minNodeSize}\r\n onValueChange={handleMinNodeSizeChange}\r\n min={minLimit}\r\n max={maxLimit}\r\n step={0.1}\r\n disabled={!viewer}\r\n className=\"w-full\"\r\n />\r\n </div>\r\n\r\n {/* Max Node Size */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-xs text-gray-600\">Maximum</span>\r\n <span className=\"text-xs text-gray-500\">{maxNodeSize[0]}px</span>\r\n </div>\r\n <Slider\r\n value={maxNodeSize}\r\n onValueChange={handleMaxNodeSizeChange}\r\n min={minLimit}\r\n max={maxLimit}\r\n step={0.1}\r\n disabled={!viewer}\r\n className=\"w-full\"\r\n />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default NodeSizeSelectionTool"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../../../../src/core/components/viewers/pointcloud/src/tools/PerformanceSettingsTools/NodeSizeSelectionTool.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from \"react\";\r\nimport { PointCloudContext } from '../../../../../../store'\r\nimport { useTranslations } from 'next-intl'\r\nimport { Pin, TrendingDown, Zap } from 'lucide-react'\r\n\r\nimport { SliderWithInput, Slider } from '../../../../../ui/Slider'\r\nimport { Label } from '../../../../../ui/Label'\r\nimport { PointSizeType } from '../../../define'\r\n\r\nexport interface CustomButtonProps {\r\n active: boolean;\r\n onClick: () => void;\r\n disabled?: boolean;\r\n icon: React.ReactNode;\r\n label: string;\r\n}\r\n\r\nexport const CustomButton: React.FC<CustomButtonProps> = ({\r\n active,\r\n onClick,\r\n disabled = false,\r\n icon,\r\n label\r\n}) => {\r\n return (\r\n <button\r\n onClick={onClick}\r\n disabled={disabled}\r\n className={`flex-1 px-3 py-2 text-xs rounded-md border transition-colors ${\r\n active\r\n ? 'bg-primary text-primary-foreground border-primary'\r\n : 'bg-background hover:bg-accent border-input'\r\n } ${disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\r\n >\r\n <div className=\"flex items-center justify-center gap-1\">\r\n {icon}\r\n {label}\r\n </div>\r\n </button>\r\n );\r\n};\r\n\r\ninterface NodeSizeSelectionToolProps {\r\n minNodeSize: number[];\r\n setMinNodeSize: (value: number[]) => void;\r\n maxNodeSize: number[];\r\n setMaxNodeSize: (value: number[]) => void;\r\n pointSizeType: PointSizeType;\r\n setPointSizeType: (type: PointSizeType) => void;\r\n minLimit: number;\r\n maxLimit: number;\r\n\r\n}\r\n\r\nexport const NodeSizeSelectionTool: React.FC<NodeSizeSelectionToolProps> = ({\r\n minNodeSize,\r\n setMinNodeSize,\r\n maxNodeSize,\r\n setMaxNodeSize, \r\n pointSizeType, \r\n setPointSizeType,\r\n minLimit, \r\n maxLimit\r\n}) => {\r\n const { state: pointCloudState } = React.useContext(PointCloudContext)\r\n const { viewer } = pointCloudState.pointcloud\r\n\r\n\r\n React.useEffect(() => {\r\n if (!viewer) return\r\n\r\n const pointcloud = viewer.scene.pointclouds[0];\r\n if (!pointcloud) return // viewer can exist before any cloud is loaded\r\n\r\n pointcloud.material.minSize = minNodeSize[0];\r\n\r\n }, [viewer, minNodeSize])\r\n\r\n React.useEffect(() => {\r\n if (!viewer) return\r\n\r\n const pointcloud = viewer.scene.pointclouds[0];\r\n if (!pointcloud) return\r\n\r\n pointcloud.material.maxSize = maxNodeSize[0];\r\n\r\n }, [viewer, maxNodeSize])\r\n\r\n React.useEffect(() => {\r\n if (!viewer) return\r\n\r\n const pointcloud = viewer.scene.pointclouds[0];\r\n if (!pointcloud) return\r\n\r\n pointcloud.material.pointSizeType = pointSizeType;\r\n\r\n }, [viewer, pointSizeType])\r\n\r\n const handleMinNodeSizeChange = (value: number[]) => {\r\n // Ensure min doesn't exceed max\r\n if (value[0] <= maxNodeSize[0]) {\r\n setMinNodeSize(value)\r\n }\r\n }\r\n\r\n const handleMaxNodeSizeChange = (value: number[]) => {\r\n // Ensure max doesn't go below min\r\n if (value[0] >= minNodeSize[0]) {\r\n setMaxNodeSize(value)\r\n }\r\n }\r\n\r\n return (\r\n <div className=\"space-y-3\">\r\n <Label className=\"text-sm font-medium\">Node Size</Label>\r\n\r\n {/* Point Size Type Selection */}\r\n <div className=\"space-y-2\">\r\n <span className=\"text-xs text-gray-600\">Point Size Type</span>\r\n <div className=\"flex gap-2\">\r\n <CustomButton\r\n active={pointSizeType === PointSizeType.FIXED}\r\n onClick={() => setPointSizeType(PointSizeType.FIXED)}\r\n disabled={!viewer}\r\n icon={<Pin size={14} />}\r\n label=\"Fixed\"\r\n />\r\n <CustomButton\r\n active={pointSizeType === PointSizeType.ATTENUATED}\r\n onClick={() => setPointSizeType(PointSizeType.ATTENUATED)}\r\n disabled={!viewer}\r\n icon={<TrendingDown size={14} />}\r\n label=\"Attenuated\"\r\n />\r\n <CustomButton\r\n active={pointSizeType === PointSizeType.ADAPTIVE}\r\n onClick={() => setPointSizeType(PointSizeType.ADAPTIVE)}\r\n disabled={!viewer}\r\n icon={<Zap size={14} />}\r\n label=\"Adaptive\"\r\n />\r\n </div>\r\n </div>\r\n\r\n {/* Min Node Size */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-xs text-gray-600\">Minimum</span>\r\n <span className=\"text-xs text-gray-500\">{minNodeSize[0]}px</span>\r\n </div>\r\n <Slider\r\n value={minNodeSize}\r\n onValueChange={handleMinNodeSizeChange}\r\n min={minLimit}\r\n max={maxLimit}\r\n step={0.1}\r\n disabled={!viewer}\r\n className=\"w-full\"\r\n />\r\n </div>\r\n\r\n {/* Max Node Size */}\r\n <div className=\"space-y-2\">\r\n <div className=\"flex items-center justify-between\">\r\n <span className=\"text-xs text-gray-600\">Maximum</span>\r\n <span className=\"text-xs text-gray-500\">{maxNodeSize[0]}px</span>\r\n </div>\r\n <Slider\r\n value={maxNodeSize}\r\n onValueChange={handleMaxNodeSizeChange}\r\n min={minLimit}\r\n max={maxLimit}\r\n step={0.1}\r\n disabled={!viewer}\r\n className=\"w-full\"\r\n />\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport default NodeSizeSelectionTool"],"mappings":"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","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/hooks/provider.tsx"],"sourcesContent":["\"use client\";\r\nimport React, { createContext, useContext, useMemo } from \"react\";\r\nimport type { ApiAdapter } from \"./ports/apiAdapter\";\r\nimport { createBuildingHooks } from \"./buildings/createBuildingHooks\";\r\nimport { createFileHooks } from \"./files/createFileHooks\";\r\nimport { createOpenDataPortalHooks } from \"./openDataPortals/createOpenDataPortalHooks\";\r\nimport { createSiteHooks } from \"./sites/createSiteHooks\";\r\nimport { createUserHooks } from \"./users/createUserHooks\";\r\nimport { createOrganizationHooks } from \"./organizations/createOrganizationHooks\";\r\nimport { createCommentHooks } from \"./comments/createCommentHooks\";\r\nimport { createSensorHooks } from \"./sensors/createSensorHooks\";\r\nimport { createInfrastructureHooks } from './infrastructures/createInfrastructureHooks';\r\nimport { createSensorTypeHooks } from \"./sensorTypes/createSensorTypeHooks\";\r\n\r\n// CoreHooksProvider takes an ApiAdapter (the object that knows how to fetch data) and\r\n// creates all the app's data-fetching hooks from it. Mount it once at the root so every\r\n// page has access. Inside any component, call useCoreHooks() to get the hooks, or import\r\n// from the per-domain convenience wrappers (e.g. useGetBuildings from hooks/buildings/buildings.ts).\r\n\r\nexport type HooksBag = {\r\n building: ReturnType<typeof createBuildingHooks>;\r\n file: ReturnType<typeof createFileHooks>;\r\n openData: ReturnType<typeof createOpenDataPortalHooks>;\r\n site: ReturnType<typeof createSiteHooks>;\r\n infrastructure: ReturnType<typeof createInfrastructureHooks>;\r\n user: ReturnType<typeof createUserHooks>;\r\n organization: ReturnType<typeof createOrganizationHooks>;\r\n comment: ReturnType<typeof createCommentHooks>;\r\n sensor: ReturnType<typeof createSensorHooks>;\r\n sensorType: ReturnType<typeof createSensorTypeHooks>;\r\n};\r\nexport const HooksCtx = createContext<HooksBag | null>(null);\r\n\r\nexport function CoreHooksProvider({ adapter, children }:{ adapter: ApiAdapter; children: React.ReactNode }) {\r\n // Build the bound hook set exactly once per adapter instance\r\n const hooks = useMemo<HooksBag>(() => ({\r\n building: createBuildingHooks(adapter),\r\n file: createFileHooks(adapter),\r\n openData: createOpenDataPortalHooks(adapter),\r\n site: createSiteHooks(adapter),\r\n infrastructure: createInfrastructureHooks(adapter),\r\n user: createUserHooks(adapter),\r\n organization: createOrganizationHooks(adapter),\r\n comment: createCommentHooks(adapter),\r\n sensor: createSensorHooks(adapter),\r\n sensorType: createSensorTypeHooks(adapter),\r\n }), [adapter]);\r\n return <HooksCtx.Provider value={hooks}>{children}</HooksCtx.Provider>;\r\n}\r\n\r\nexport function useCoreHooks() {\r\n const ctx = useContext(HooksCtx);\r\n if (!ctx) throw new Error(\"useCoreHooks must be used inside <CoreHooksProvider>\");\r\n return ctx;\r\n}"],"mappings":";AA+CS;AA9CT,SAAgB,eAAe,YAAY,eAAe;AAE1D,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,iCAAiC;AAC1C,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AACxC,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,iCAAiC;AAC1C,SAAS,6BAA6B;AAmB/B,MAAM,WAAW,cAA+B,IAAI;AAEpD,SAAS,kBAAkB,EAAE,SAAS,SAAS,GAAsD;AAE1G,QAAM,QAAQ,QAAkB,OAAO;AAAA,IACrC,UAAU,oBAAoB,OAAO;AAAA,IACrC,MAAM,gBAAgB,OAAO;AAAA,IAC7B,UAAU,0BAA0B,OAAO;AAAA,IAC3C,MAAM,gBAAgB,OAAO;AAAA,IAC7B,gBAAgB,0BAA0B,OAAO;AAAA,IACjD,MAAM,gBAAgB,OAAO;AAAA,IAC7B,cAAc,wBAAwB,OAAO;AAAA,IAC7C,SAAS,mBAAmB,OAAO;AAAA,IACnC,QAAQ,kBAAkB,OAAO;AAAA,IACjC,YAAY,sBAAsB,OAAO;AAAA,EAC3C,IAAI,CAAC,OAAO,CAAC;AACb,SAAO,oBAAC,SAAS,UAAT,EAAkB,OAAO,OAAQ,UAAS;AACpD;AAEO,SAAS,eAAe;AAC7B,QAAM,MAAM,WAAW,QAAQ;AAC/B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,sDAAsD;AAChF,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/core/hooks/provider.tsx"],"sourcesContent":["\"use client\";\nimport React, { createContext, useContext, useMemo } from \"react\";\nimport type { ApiAdapter } from \"./ports/apiAdapter\";\nimport { createBuildingHooks } from \"./buildings/createBuildingHooks\";\nimport { createFileHooks } from \"./files/createFileHooks\";\nimport { createOpenDataPortalHooks } from \"./openDataPortals/createOpenDataPortalHooks\";\nimport { createSiteHooks } from \"./sites/createSiteHooks\";\nimport { createUserHooks } from \"./users/createUserHooks\";\nimport { createOrganizationHooks } from \"./organizations/createOrganizationHooks\";\nimport { createCommentHooks } from \"./comments/createCommentHooks\";\nimport { createSensorHooks } from \"./sensors/createSensorHooks\";\nimport { createInfrastructureHooks } from './infrastructures/createInfrastructureHooks';\nimport { createSensorTypeHooks } from \"./sensorTypes/createSensorTypeHooks\";\n\n// CoreHooksProvider takes an ApiAdapter (the object that knows how to fetch data) and\n// creates all the app's data-fetching hooks from it. Mount it once at the root so every\n// page has access. Inside any component, call useCoreHooks() to get the hooks, or import\n// from the per-domain convenience wrappers (e.g. useGetBuildings from hooks/buildings/buildings.ts).\n\nexport type HooksBag = {\n building: ReturnType<typeof createBuildingHooks>;\n file: ReturnType<typeof createFileHooks>;\n openData: ReturnType<typeof createOpenDataPortalHooks>;\n site: ReturnType<typeof createSiteHooks>;\n infrastructure: ReturnType<typeof createInfrastructureHooks>;\n user: ReturnType<typeof createUserHooks>;\n organization: ReturnType<typeof createOrganizationHooks>;\n comment: ReturnType<typeof createCommentHooks>;\n sensor: ReturnType<typeof createSensorHooks>;\n sensorType: ReturnType<typeof createSensorTypeHooks>;\n};\nexport const HooksCtx = createContext<HooksBag | null>(null);\n\nexport function CoreHooksProvider({ adapter, children }:{ adapter: ApiAdapter; children: React.ReactNode }) {\n // Build the bound hook set exactly once per adapter instance\n const hooks = useMemo<HooksBag>(() => ({\n building: createBuildingHooks(adapter),\n file: createFileHooks(adapter),\n openData: createOpenDataPortalHooks(adapter),\n site: createSiteHooks(adapter),\n infrastructure: createInfrastructureHooks(adapter),\n user: createUserHooks(adapter),\n organization: createOrganizationHooks(adapter),\n comment: createCommentHooks(adapter),\n sensor: createSensorHooks(adapter),\n sensorType: createSensorTypeHooks(adapter),\n }), [adapter]);\n return <HooksCtx.Provider value={hooks}>{children}</HooksCtx.Provider>;\n}\n\nexport function useCoreHooks() {\n const ctx = useContext(HooksCtx);\n if (!ctx) throw new Error(\"useCoreHooks must be used inside <CoreHooksProvider>\");\n return ctx;\n}"],"mappings":";AA+CS;AA9CT,SAAgB,eAAe,YAAY,eAAe;AAE1D,SAAS,2BAA2B;AACpC,SAAS,uBAAuB;AAChC,SAAS,iCAAiC;AAC1C,SAAS,uBAAuB;AAChC,SAAS,uBAAuB;AAChC,SAAS,+BAA+B;AACxC,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,iCAAiC;AAC1C,SAAS,6BAA6B;AAmB/B,MAAM,WAAW,cAA+B,IAAI;AAEpD,SAAS,kBAAkB,EAAE,SAAS,SAAS,GAAsD;AAE1G,QAAM,QAAQ,QAAkB,OAAO;AAAA,IACrC,UAAU,oBAAoB,OAAO;AAAA,IACrC,MAAM,gBAAgB,OAAO;AAAA,IAC7B,UAAU,0BAA0B,OAAO;AAAA,IAC3C,MAAM,gBAAgB,OAAO;AAAA,IAC7B,gBAAgB,0BAA0B,OAAO;AAAA,IACjD,MAAM,gBAAgB,OAAO;AAAA,IAC7B,cAAc,wBAAwB,OAAO;AAAA,IAC7C,SAAS,mBAAmB,OAAO;AAAA,IACnC,QAAQ,kBAAkB,OAAO;AAAA,IACjC,YAAY,sBAAsB,OAAO;AAAA,EAC3C,IAAI,CAAC,OAAO,CAAC;AACb,SAAO,oBAAC,SAAS,UAAT,EAAkB,OAAO,OAAQ,UAAS;AACpD;AAEO,SAAS,eAAe;AAC7B,QAAM,MAAM,WAAW,QAAQ;AAC/B,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,sDAAsD;AAChF,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../src/core/plugins/host/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAW3C,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBA2B7E;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAMlD;AAED,wBAAgB,eAAe,IAAI,OAAO,CAGzC"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../src/core/plugins/host/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAW3C,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,qBAwB7E;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAMlD;AAED,wBAAgB,eAAe,IAAI,OAAO,CAGzC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/plugins/host/provider.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { PluginRegistry } from './registry'\r\nimport { PluginHost } from './host'\r\nimport { INSTALLED_PLUGINS } from '../installed'\r\n\r\ninterface PluginHostContextValue {\r\n registry: PluginRegistry\r\n ready: boolean\r\n}\r\n\r\nconst PluginHostContext = React.createContext<PluginHostContextValue | null>(null)\r\n\r\nexport function PluginHostProvider({ children }: { children: React.ReactNode }) {\r\n const registry = React.useMemo(() => new PluginRegistry(), [])\r\n const [ready, setReady] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const host = new PluginHost(registry)\r\n\r\n async function loadPlugins() {\r\n for (const { manifest, entry } of INSTALLED_PLUGINS) {\r\n await host.loadPlugin(manifest, entry, {})\r\n }\r\n setReady(true)\r\n }\r\n\r\n loadPlugins()\r\n }, [registry])\r\n\r\n // Audit Phase 1.A (F-3): memoize the value object. `registry` was\r\n // already memoized above but the surrounding value object was being\r\n // recreated every render.\r\n const value = React.useMemo(() => ({ registry, ready }), [registry, ready])\r\n\r\n return (\r\n <PluginHostContext.Provider value={value}>\r\n {children}\r\n </PluginHostContext.Provider>\r\n )\r\n}\r\n\r\nexport function usePluginRegistry(): PluginRegistry {\r\n const context = React.useContext(PluginHostContext)\r\n if (!context) {\r\n throw new Error('usePluginRegistry must be used within PluginHostProvider')\r\n }\r\n return context.registry\r\n}\r\n\r\nexport function usePluginsReady(): boolean {\r\n const context = React.useContext(PluginHostContext)\r\n return context?.ready ?? false\r\n}\r\n"],"mappings":";AAqCI;AAnCJ,YAAY,WAAW;AACvB,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,yBAAyB;AAOlC,MAAM,oBAAoB,MAAM,cAA6C,IAAI;AAE1E,SAAS,mBAAmB,EAAE,SAAS,GAAkC;AAC9E,QAAM,WAAW,MAAM,QAAQ,MAAM,IAAI,eAAe,GAAG,CAAC,CAAC;AAC7D,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,KAAK;AAE9C,QAAM,UAAU,MAAM;AACpB,UAAM,OAAO,IAAI,WAAW,QAAQ;AAEpC,mBAAe,cAAc;AAC3B,iBAAW,EAAE,UAAU,MAAM,KAAK,mBAAmB;AACnD,cAAM,KAAK,WAAW,UAAU,OAAO,CAAC,CAAC;AAAA,MAC3C;AACA,eAAS,IAAI;AAAA,IACf;AAEA,gBAAY;AAAA,EACd,GAAG,CAAC,QAAQ,CAAC;AAKb,QAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,UAAU,MAAM,IAAI,CAAC,UAAU,KAAK,CAAC;AAE1E,SACE,oBAAC,kBAAkB,UAAlB,EAA2B,OACzB,UACH;AAEJ;AAEO,SAAS,oBAAoC;AAClD,QAAM,UAAU,MAAM,WAAW,iBAAiB;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO,QAAQ;AACjB;AAEO,SAAS,kBAA2B;AAnD3C;AAoDE,QAAM,UAAU,MAAM,WAAW,iBAAiB;AAClD,UAAO,wCAAS,UAAT,YAAkB;AAC3B;","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/plugins/host/provider.tsx"],"sourcesContent":["'use client'\r\n\r\nimport * as React from 'react'\r\nimport { PluginRegistry } from './registry'\r\nimport { PluginHost } from './host'\r\nimport { INSTALLED_PLUGINS } from '../installed'\r\n\r\ninterface PluginHostContextValue {\r\n registry: PluginRegistry\r\n ready: boolean\r\n}\r\n\r\nconst PluginHostContext = React.createContext<PluginHostContextValue | null>(null)\r\n\r\nexport function PluginHostProvider({ children }: { children: React.ReactNode }) {\r\n const registry = React.useMemo(() => new PluginRegistry(), [])\r\n const [ready, setReady] = React.useState(false)\r\n\r\n React.useEffect(() => {\r\n const host = new PluginHost(registry)\r\n\r\n async function loadPlugins() {\r\n for (const { manifest, entry } of INSTALLED_PLUGINS) {\r\n await host.loadPlugin(manifest, entry, {})\r\n }\r\n setReady(true)\r\n }\r\n\r\n loadPlugins()\r\n }, [registry])\r\n\r\n const value = React.useMemo(() => ({ registry, ready }), [registry, ready])\r\n\r\n return (\r\n <PluginHostContext.Provider value={value}>\r\n {children}\r\n </PluginHostContext.Provider>\r\n )\r\n}\r\n\r\nexport function usePluginRegistry(): PluginRegistry {\r\n const context = React.useContext(PluginHostContext)\r\n if (!context) {\r\n throw new Error('usePluginRegistry must be used within PluginHostProvider')\r\n }\r\n return context.registry\r\n}\r\n\r\nexport function usePluginsReady(): boolean {\r\n const context = React.useContext(PluginHostContext)\r\n return context?.ready ?? false\r\n}\r\n"],"mappings":";AAkCI;AAhCJ,YAAY,WAAW;AACvB,SAAS,sBAAsB;AAC/B,SAAS,kBAAkB;AAC3B,SAAS,yBAAyB;AAOlC,MAAM,oBAAoB,MAAM,cAA6C,IAAI;AAE1E,SAAS,mBAAmB,EAAE,SAAS,GAAkC;AAC9E,QAAM,WAAW,MAAM,QAAQ,MAAM,IAAI,eAAe,GAAG,CAAC,CAAC;AAC7D,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,KAAK;AAE9C,QAAM,UAAU,MAAM;AACpB,UAAM,OAAO,IAAI,WAAW,QAAQ;AAEpC,mBAAe,cAAc;AAC3B,iBAAW,EAAE,UAAU,MAAM,KAAK,mBAAmB;AACnD,cAAM,KAAK,WAAW,UAAU,OAAO,CAAC,CAAC;AAAA,MAC3C;AACA,eAAS,IAAI;AAAA,IACf;AAEA,gBAAY;AAAA,EACd,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,UAAU,MAAM,IAAI,CAAC,UAAU,KAAK,CAAC;AAE1E,SACE,oBAAC,kBAAkB,UAAlB,EAA2B,OACzB,UACH;AAEJ;AAEO,SAAS,oBAAoC;AAClD,QAAM,UAAU,MAAM,WAAW,iBAAiB;AAClD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0DAA0D;AAAA,EAC5E;AACA,SAAO,QAAQ;AACjB;AAEO,SAAS,kBAA2B;AAhD3C;AAiDE,QAAM,UAAU,MAAM,WAAW,iBAAiB;AAClD,UAAO,wCAAS,UAAT,YAAkB;AAC3B;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/core/store/AppConfig/context.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAoB,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE9E,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,cAAc,CAAA;CAC1B,CAAA;AAaD,eAAO,MAAM,gBAAgB;WACpB,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;EAI1C,CAAA;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAU/D,CAAA;AAED,eAAO,MAAM,mBAAmB;WAnBvB,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;CAkB+B,CAAA"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/core/store/AppConfig/context.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAoB,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE9E,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,cAAc,CAAA;CAC1B,CAAA;AAaD,eAAO,MAAM,gBAAgB;WACpB,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;EAI1C,CAAA;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAQ/D,CAAA;AAED,eAAO,MAAM,mBAAmB;WAjBvB,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;CAgB+B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/store/AppConfig/context.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\";\r\nimport { AppConfigReducer, AppConfigActions, AppConfigState } from './reducer'\r\n\r\ntype InitialStateType = {\r\n appConfig: AppConfigState\r\n}\r\n\r\nconst initialState: InitialStateType = {\r\n appConfig: {\r\n organization: null,\r\n user: null,\r\n },\r\n}\r\n\r\nconst reducer = ({ appConfig }: InitialStateType, action: AppConfigActions) => ({\r\n appConfig: AppConfigReducer(appConfig, action),\r\n})\r\n\r\nexport const AppConfigContext = React.createContext<{\r\n state: InitialStateType\r\n dispatch: React.Dispatch<AppConfigActions>\r\n}>({\r\n state: initialState,\r\n dispatch: () => null,\r\n})\r\n\r\nexport const AppConfigProvider: React.FC<React.PropsWithChildren> = ({ children }) => {\r\n const [state, dispatch] = React.useReducer(reducer, initialState)\r\n // Audit Phase 1.A (F-3): memoize value so consumers don't re-render\r\n // every time this provider's parent renders. dispatch is reference-stable.\r\n const value = React.useMemo(() => ({ state, dispatch }), [state])\r\n return (\r\n <AppConfigContext.Provider value={value}>\r\n {children}\r\n </AppConfigContext.Provider>\r\n )\r\n}\r\n\r\nexport const useAppConfigContext = () => React.useContext(AppConfigContext)"],"mappings":";AAkCI;AAhCJ,YAAY,WAAW;AACvB,SAAS,wBAA0D;AAMnE,MAAM,eAAiC;AAAA,EACrC,WAAW;AAAA,IACT,cAAc;AAAA,IACd,MAAM;AAAA,EACR;AACF;AAEA,MAAM,UAAU,CAAC,EAAE,UAAU,GAAqB,YAA8B;AAAA,EAC9E,WAAW,iBAAiB,WAAW,MAAM;AAC/C;AAEO,MAAM,mBAAmB,MAAM,cAGnC;AAAA,EACD,OAAO;AAAA,EACP,UAAU,MAAM;AAClB,CAAC;AAEM,MAAM,oBAAuD,CAAC,EAAE,SAAS,MAAM;AACpF,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,WAAW,SAAS,YAAY;AAGhE,QAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,OAAO,SAAS,IAAI,CAAC,KAAK,CAAC;AAChE,SACE,oBAAC,iBAAiB,UAAjB,EAA0B,OACxB,UACH;AAEJ;AAEO,MAAM,sBAAsB,MAAM,MAAM,WAAW,gBAAgB;","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/store/AppConfig/context.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\";\r\nimport { AppConfigReducer, AppConfigActions, AppConfigState } from './reducer'\r\n\r\ntype InitialStateType = {\r\n appConfig: AppConfigState\r\n}\r\n\r\nconst initialState: InitialStateType = {\r\n appConfig: {\r\n organization: null,\r\n user: null,\r\n },\r\n}\r\n\r\nconst reducer = ({ appConfig }: InitialStateType, action: AppConfigActions) => ({\r\n appConfig: AppConfigReducer(appConfig, action),\r\n})\r\n\r\nexport const AppConfigContext = React.createContext<{\r\n state: InitialStateType\r\n dispatch: React.Dispatch<AppConfigActions>\r\n}>({\r\n state: initialState,\r\n dispatch: () => null,\r\n})\r\n\r\nexport const AppConfigProvider: React.FC<React.PropsWithChildren> = ({ children }) => {\r\n const [state, dispatch] = React.useReducer(reducer, initialState)\r\n const value = React.useMemo(() => ({ state, dispatch }), [state])\r\n return (\r\n <AppConfigContext.Provider value={value}>\r\n {children}\r\n </AppConfigContext.Provider>\r\n )\r\n}\r\n\r\nexport const useAppConfigContext = () => React.useContext(AppConfigContext)"],"mappings":";AAgCI;AA9BJ,YAAY,WAAW;AACvB,SAAS,wBAA0D;AAMnE,MAAM,eAAiC;AAAA,EACrC,WAAW;AAAA,IACT,cAAc;AAAA,IACd,MAAM;AAAA,EACR;AACF;AAEA,MAAM,UAAU,CAAC,EAAE,UAAU,GAAqB,YAA8B;AAAA,EAC9E,WAAW,iBAAiB,WAAW,MAAM;AAC/C;AAEO,MAAM,mBAAmB,MAAM,cAGnC;AAAA,EACD,OAAO;AAAA,EACP,UAAU,MAAM;AAClB,CAAC;AAEM,MAAM,oBAAuD,CAAC,EAAE,SAAS,MAAM;AACpF,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,WAAW,SAAS,YAAY;AAChE,QAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,OAAO,SAAS,IAAI,CAAC,KAAK,CAAC;AAChE,SACE,oBAAC,iBAAiB,UAAjB,EAA0B,OACxB,UACH;AAEJ;AAEO,MAAM,sBAAsB,MAAM,MAAM,WAAW,gBAAgB;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/core/store/BIM/context.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAc,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAE5D,KAAK,gBAAgB,GAAG;IACtB,GAAG,EAAE,QAAQ,CAAA;CACd,CAAA;AA6BD,eAAO,MAAM,UAAU;WACd,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;EAIpC,CAAA;AAEF,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CASzD,CAAA;AAED,eAAO,MAAM,aAAa;WAlBjB,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;CAiByB,CAAA"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/core/store/BIM/context.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAc,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAE5D,KAAK,gBAAgB,GAAG;IACtB,GAAG,EAAE,QAAQ,CAAA;CACd,CAAA;AA6BD,eAAO,MAAM,UAAU;WACd,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;EAIpC,CAAA;AAEF,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAQzD,CAAA;AAED,eAAO,MAAM,aAAa;WAjBjB,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;CAgByB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/store/BIM/context.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\";\r\nimport { BimReducer, BimActions, BimState } from './reducer'\r\n\r\ntype InitialStateType = {\r\n bim: BimState\r\n}\r\n\r\nconst initialState = {\r\n bim: {\r\n bimComponents: null,\r\n world: null,\r\n fragments: null,\r\n modelId: null,\r\n modelIds: [],\r\n floorplans: [],\r\n grid: null ,\r\n buildingModel: {\r\n bimFile: null,\r\n building: null,\r\n },\r\n bimModelsAddedToMap: [],\r\n bimModelName: null,\r\n editingBimModel: null,\r\n bcfTopic: null,\r\n bcfTopics: [],\r\n bcfTopicId: null,\r\n modelUIState: {},\r\n },\r\n}\r\n\r\nconst reducer = ({ bim }: InitialStateType, action: BimActions) => ({\r\n bim: BimReducer(bim, action),\r\n})\r\n\r\nexport const BimContext = React.createContext<{\r\n state: InitialStateType\r\n dispatch: React.Dispatch<BimActions>\r\n}>({\r\n state: initialState,\r\n dispatch: () => null,\r\n})\r\n\r\nexport const BimProvider: React.FC<React.PropsWithChildren> = ({ children }) => {\r\n const [state, dispatch] = React.useReducer(reducer, initialState)\r\n // Audit Phase 1.A (F-3): memoize value — see AppConfig/context.tsx note.\r\n const value = React.useMemo(() => ({ state, dispatch }), [state])\r\n return (\r\n <BimContext.Provider value={value}>\r\n {children}\r\n </BimContext.Provider>\r\n )\r\n}\r\n\r\nexport const useBimContext = () => React.useContext(BimContext)"],"mappings":";AAiDI;AA/CJ,YAAY,WAAW;AACvB,SAAS,kBAAwC;AAMjD,MAAM,eAAe;AAAA,EACnB,KAAK;AAAA,IACH,eAAe;AAAA,IACf,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU,CAAC;AAAA,IACX,YAAY,CAAC;AAAA,IACb,MAAM;AAAA,IACN,eAAe;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,qBAAqB,CAAC;AAAA,IACtB,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,WAAW,CAAC;AAAA,IACZ,YAAY;AAAA,IACZ,cAAc,CAAC;AAAA,EACjB;AACF;AAEA,MAAM,UAAU,CAAC,EAAE,IAAI,GAAqB,YAAwB;AAAA,EAClE,KAAK,WAAW,KAAK,MAAM;AAC7B;AAEO,MAAM,aAAa,MAAM,cAG7B;AAAA,EACD,OAAO;AAAA,EACP,UAAU,MAAM;AAClB,CAAC;AAEM,MAAM,cAAiD,CAAC,EAAE,SAAS,MAAM;AAC9E,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,WAAW,SAAS,YAAY;AAEhE,QAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,OAAO,SAAS,IAAI,CAAC,KAAK,CAAC;AAChE,SACE,oBAAC,WAAW,UAAX,EAAoB,OAClB,UACH;AAEJ;AAEO,MAAM,gBAAgB,MAAM,MAAM,WAAW,UAAU;","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/store/BIM/context.tsx"],"sourcesContent":["\"use client\"\r\n\r\nimport * as React from \"react\";\r\nimport { BimReducer, BimActions, BimState } from './reducer'\r\n\r\ntype InitialStateType = {\r\n bim: BimState\r\n}\r\n\r\nconst initialState = {\r\n bim: {\r\n bimComponents: null,\r\n world: null,\r\n fragments: null,\r\n modelId: null,\r\n modelIds: [],\r\n floorplans: [],\r\n grid: null ,\r\n buildingModel: {\r\n bimFile: null,\r\n building: null,\r\n },\r\n bimModelsAddedToMap: [],\r\n bimModelName: null,\r\n editingBimModel: null,\r\n bcfTopic: null,\r\n bcfTopics: [],\r\n bcfTopicId: null,\r\n modelUIState: {},\r\n },\r\n}\r\n\r\nconst reducer = ({ bim }: InitialStateType, action: BimActions) => ({\r\n bim: BimReducer(bim, action),\r\n})\r\n\r\nexport const BimContext = React.createContext<{\r\n state: InitialStateType\r\n dispatch: React.Dispatch<BimActions>\r\n}>({\r\n state: initialState,\r\n dispatch: () => null,\r\n})\r\n\r\nexport const BimProvider: React.FC<React.PropsWithChildren> = ({ children }) => {\r\n const [state, dispatch] = React.useReducer(reducer, initialState)\r\n const value = React.useMemo(() => ({ state, dispatch }), [state])\r\n return (\r\n <BimContext.Provider value={value}>\r\n {children}\r\n </BimContext.Provider>\r\n )\r\n}\r\n\r\nexport const useBimContext = () => React.useContext(BimContext)"],"mappings":";AAgDI;AA9CJ,YAAY,WAAW;AACvB,SAAS,kBAAwC;AAMjD,MAAM,eAAe;AAAA,EACnB,KAAK;AAAA,IACH,eAAe;AAAA,IACf,OAAO;AAAA,IACP,WAAW;AAAA,IACX,SAAS;AAAA,IACT,UAAU,CAAC;AAAA,IACX,YAAY,CAAC;AAAA,IACb,MAAM;AAAA,IACN,eAAe;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,IACA,qBAAqB,CAAC;AAAA,IACtB,cAAc;AAAA,IACd,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV,WAAW,CAAC;AAAA,IACZ,YAAY;AAAA,IACZ,cAAc,CAAC;AAAA,EACjB;AACF;AAEA,MAAM,UAAU,CAAC,EAAE,IAAI,GAAqB,YAAwB;AAAA,EAClE,KAAK,WAAW,KAAK,MAAM;AAC7B;AAEO,MAAM,aAAa,MAAM,cAG7B;AAAA,EACD,OAAO;AAAA,EACP,UAAU,MAAM;AAClB,CAAC;AAEM,MAAM,cAAiD,CAAC,EAAE,SAAS,MAAM;AAC9E,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,WAAW,SAAS,YAAY;AAChE,QAAM,QAAQ,MAAM,QAAQ,OAAO,EAAE,OAAO,SAAS,IAAI,CAAC,KAAK,CAAC;AAChE,SACE,oBAAC,WAAW,UAAX,EAAoB,OAClB,UACH;AAEJ;AAEO,MAAM,gBAAgB,MAAM,MAAM,WAAW,UAAU;","names":[]}
@@ -36,7 +36,6 @@ export type BimPayload = {
36
36
  ["SET_FLOORPLANS"]: Pick<BimTypes, "floorplans">;
37
37
  ["SET_GRID"]: Pick<BimTypes, "grid">;
38
38
  ["DISPOSE-BIM"]: void;
39
- ["DISPOSE-BIM-VIEWER"]: void;
40
39
  ["TOGGLE_BIM_TO_MAP"]: Pick<BimTypes, "buildingModel">;
41
40
  ["REMOVE_BIM_FROM_MAP"]: Pick<BimTypes, "bimModelName">;
42
41
  ["REMOVE_ALL_BIM_FROM_MAP"]: void;
@@ -1 +1 @@
1
- {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../../src/core/store/BIM/reducer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reducer.d.ts","sourceRoot":"","sources":["../../../../src/core/store/BIM/reducer.ts"],"names":[],"mappings":"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"}
@@ -75,10 +75,6 @@ const BimReducer = (state, action) => {
75
75
  "building": action.payload.buildingModel.building
76
76
  }
77
77
  ];
78
- console.log(
79
- "BimReducer - ADD_BIM_TO_MAP",
80
- { bimModelsAddedToMap }
81
- );
82
78
  return __spreadProps(__spreadValues({}, state), {
83
79
  bimModelsAddedToMap
84
80
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/store/BIM/reducer.ts"],"sourcesContent":["// Audit Phase 1.A (F-1c): types-only import. Every reference to OBC in this\r\n// file is in a type position (OBC.Components | null, OBC.World, etc.) so the\r\n// import never reaches the runtime. With `import type` TypeScript erases it\r\n// at compile time and webpack stops bundling @thatopen on behalf of the\r\n// global BimProvider. Critical: this reducer is loaded on every route via\r\n// CombineProviders, so without this fix @thatopen leaks into the initial\r\n// bundle even after F-1 and F-1b.\r\nimport type * as OBC from \"@thatopen/components\";\r\nimport { ActionMap } from \"../ActionMap\";\r\nimport type { Plan } from \"../../types/bim\";\r\nimport { Building, DbFile } from '../../types/dbTypes';\r\n\r\ninterface BimTypes {\r\n bimComponents: OBC.Components | null;\r\n world: OBC.World | null;\r\n fragments: OBC.FragmentsManager | null;\r\n modelId: string | null;\r\n modelIds: string[];\r\n floorplans: Plan[];\r\n grid: OBC.SimpleGrid | null;\r\n // For now, store the file with the building\r\n buildingModel: {\r\n bimFile: DbFile | null;\r\n building: Building | null;\r\n };\r\n bimModelsAddedToMap: {\r\n \"bimFile\": DbFile;\r\n building?: Building | null;\r\n }[];\r\n editingBimModel: string | null;\r\n bimModelName: string | null;\r\n bcfTopic: OBC.Topic | Partial<OBC.Topic> | null;\r\n bcfTopics: OBC.Topic[] | Partial<OBC.Topic>[];\r\n bcfTopicId: string | null;\r\n modelUIState: Record<number, { isVisible?: boolean; isGhost?: boolean }>;\r\n}\r\n\r\nexport type BimState = BimTypes;\r\n\r\nexport type BimPayload = {\r\n [\"SET_COMPONENTS\"]: Pick<BimTypes, \"bimComponents\" | \"world\" | \"fragments\">;\r\n [\"SET_WORLD\"]: Pick<BimTypes, \"world\">;\r\n [\"SET_MODEL\"]: Pick<BimTypes, \"modelId\">;\r\n [\"SET_FLOORPLANS\"]: Pick<BimTypes, \"floorplans\">;\r\n [\"SET_GRID\"]: Pick<BimTypes, \"grid\">;\r\n [\"DISPOSE-BIM\"]: void;\r\n [\"DISPOSE-BIM-VIEWER\"]: void;\r\n [\"TOGGLE_BIM_TO_MAP\"]: Pick<BimTypes, \"buildingModel\">;\r\n [\"REMOVE_BIM_FROM_MAP\"]: Pick<BimTypes, \"bimModelName\">;\r\n [\"REMOVE_ALL_BIM_FROM_MAP\"]: void;\r\n [\"EDIT_BIM_MODEL_BY_NAME\"]: Pick<BimTypes, \"editingBimModel\">;\r\n [\"ADD_BCF_TOPIC\"]: Pick<BimTypes, \"bcfTopic\">;\r\n [\"REMOVE_BCF_TOPIC\"]: Pick<BimTypes, \"bcfTopicId\">;\r\n ['EDIT_BCF_TOPIC']: Pick<BimTypes, \"bcfTopic\">;\r\n [\"SET_MODEL_UI_STATE\"]: { fileId: number; isVisible?: boolean; isGhost?: boolean };\r\n};\r\n\r\nexport type BimActions = ActionMap<BimPayload>[keyof ActionMap<BimPayload>];\r\n\r\nexport const BimReducer = (state: BimState, action: BimActions) => {\r\n\r\n switch (action.type) {\r\n\r\n case \"SET_COMPONENTS\":\r\n return {\r\n ...state,\r\n \"bimComponents\": action.payload.bimComponents,\r\n \"world\": action.payload.world,\r\n \"fragments\": action.payload.fragments,\r\n };\r\n case \"SET_WORLD\":\r\n return {\r\n ...state,\r\n \"world\": action.payload.world,\r\n };\r\n case \"SET_MODEL\":\r\n return {\r\n ...state,\r\n \"modelId\": action.payload.modelId,\r\n };\r\n case \"SET_FLOORPLANS\":\r\n return {\r\n ...state,\r\n \"floorplans\": action.payload.floorplans,\r\n }\r\n case \"SET_GRID\":\r\n return {\r\n ...state,\r\n \"grid\": action.payload.grid,\r\n };\r\n case \"DISPOSE-BIM\":\r\n return {\r\n ...state,\r\n \"bimComponents\": null,\r\n \"world\": null,\r\n \"fragments\": null,\r\n \"modelId\": null,\r\n };\r\n case \"TOGGLE_BIM_TO_MAP\": {\r\n\r\n const { bimFile } = action.payload.buildingModel;\r\n const exists = state.bimModelsAddedToMap.some((model) => model.bimFile.id === bimFile.id\r\n );\r\n let bimModelsAddedToMap;\r\n bimModelsAddedToMap = exists\r\n ? state.bimModelsAddedToMap.filter((model) => model.bimFile.id !== bimFile.id,\r\n ) : [\r\n ...state.bimModelsAddedToMap,\r\n {\r\n bimFile,\r\n \"building\": action.payload.buildingModel.building\r\n },\r\n ];\r\n console.log(\r\n \"BimReducer - ADD_BIM_TO_MAP\",\r\n { bimModelsAddedToMap }\r\n );\r\n return {\r\n ...state,\r\n bimModelsAddedToMap\r\n };\r\n\r\n }\r\n case \"REMOVE_BIM_FROM_MAP\": {\r\n\r\n const removeName = action.payload.bimModelName;\r\n return {\r\n ...state,\r\n bimModelsAddedToMap: state.bimModelsAddedToMap.filter((model) => model.bimFile.name !== removeName\r\n ),\r\n };\r\n\r\n }\r\n case \"REMOVE_ALL_BIM_FROM_MAP\":\r\n return {\r\n ...state,\r\n \"bimModelsAddedToMap\": [],\r\n };\r\n case \"EDIT_BIM_MODEL_BY_NAME\": {\r\n return {\r\n ...state,\r\n \"editingBimModel\": action.payload.editingBimModel,\r\n }\r\n }\r\n case \"ADD_BCF_TOPIC\":\r\n return {\r\n ...state,\r\n \"bcfTopics\": [...state.bcfTopics, action.payload.bcfTopic],\r\n };\r\n case \"REMOVE_BCF_TOPIC\":\r\n return {\r\n ...state,\r\n \"bcfTopics\": state.bcfTopics.filter((topic) => topic.guid !== action.payload.bcfTopicId),\r\n };\r\n case \"EDIT_BCF_TOPIC\":\r\n return {\r\n ...state,\r\n \"bcfTopics\": state.bcfTopics.map((topic) =>\r\n topic.guid === action.payload.bcfTopic.guid\r\n ? action.payload.bcfTopic\r\n : topic\r\n ),\r\n };\r\n case \"SET_MODEL_UI_STATE\": {\r\n const { fileId, ...uiProps } = action.payload\r\n return {\r\n ...state,\r\n modelUIState: {\r\n ...state.modelUIState,\r\n [fileId]: {\r\n ...state.modelUIState[fileId],\r\n ...uiProps,\r\n },\r\n },\r\n }\r\n }\r\n default:\r\n return state;\r\n\r\n }\r\n\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DO,MAAM,aAAa,CAAC,OAAiB,WAAuB;AAE/D,UAAQ,OAAO,MAAM;AAAA,IAEjB,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,iBAAiB,OAAO,QAAQ;AAAA,QAChC,SAAS,OAAO,QAAQ;AAAA,QACxB,aAAa,OAAO,QAAQ;AAAA,MAChC;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,SAAS,OAAO,QAAQ;AAAA,MAC5B;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,WAAW,OAAO,QAAQ;AAAA,MAC9B;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,cAAc,OAAO,QAAQ;AAAA,MACjC;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,QAAQ,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,aAAa;AAAA,QACb,WAAW;AAAA,MACf;AAAA,IACJ,KAAK,qBAAqB;AAEtB,YAAM,EAAE,QAAQ,IAAI,OAAO,QAAQ;AACnC,YAAM,SAAS,MAAM,oBAAoB;AAAA,QAAK,CAAC,UAAU,MAAM,QAAQ,OAAO,QAAQ;AAAA,MACtF;AACA,UAAI;AACJ,4BAAsB,SAChB,MAAM,oBAAoB;AAAA,QAAO,CAAC,UAAU,MAAM,QAAQ,OAAO,QAAQ;AAAA,MAC3E,IAAI;AAAA,QACA,GAAG,MAAM;AAAA,QACT;AAAA,UACI;AAAA,UACA,YAAY,OAAO,QAAQ,cAAc;AAAA,QAC7C;AAAA,MACJ;AACJ,cAAQ;AAAA,QACJ;AAAA,QACA,EAAE,oBAAoB;AAAA,MAC1B;AACA,aAAO,iCACA,QADA;AAAA,QAEH;AAAA,MACJ;AAAA,IAEJ;AAAA,IACA,KAAK,uBAAuB;AAExB,YAAM,aAAa,OAAO,QAAQ;AAClC,aAAO,iCACA,QADA;AAAA,QAEH,qBAAqB,MAAM,oBAAoB;AAAA,UAAO,CAAC,UAAU,MAAM,QAAQ,SAAS;AAAA,QACxF;AAAA,MACJ;AAAA,IAEJ;AAAA,IACA,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,uBAAuB,CAAC;AAAA,MAC5B;AAAA,IACJ,KAAK,0BAA0B;AAC3B,aAAO,iCACA,QADA;AAAA,QAEH,mBAAmB,OAAO,QAAQ;AAAA,MACtC;AAAA,IACJ;AAAA,IACA,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,aAAa,CAAC,GAAG,MAAM,WAAW,OAAO,QAAQ,QAAQ;AAAA,MAC7D;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,aAAa,MAAM,UAAU,OAAO,CAAC,UAAU,MAAM,SAAS,OAAO,QAAQ,UAAU;AAAA,MAC3F;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,aAAa,MAAM,UAAU;AAAA,UAAI,CAAC,UAC9B,MAAM,SAAS,OAAO,QAAQ,SAAS,OACjC,OAAO,QAAQ,WACf;AAAA,QACV;AAAA,MACJ;AAAA,IACJ,KAAK,sBAAsB;AACvB,YAA+B,YAAO,SAA9B,SApKpB,IAoK2C,IAAZ,oBAAY,IAAZ,CAAX;AACR,aAAO,iCACA,QADA;AAAA,QAEH,cAAc,iCACP,MAAM,eADC;AAAA,UAEV,CAAC,MAAM,GAAG,kCACH,MAAM,aAAa,MAAM,IACzB;AAAA,QAEX;AAAA,MACJ;AAAA,IACJ;AAAA,IACA;AACI,aAAO;AAAA,EAEf;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../../src/core/store/BIM/reducer.ts"],"sourcesContent":["// Types-only import. Every reference to OBC in this file is in a type\r\n// position (OBC.Components | null, OBC.World, etc.) so the import never\r\n// reaches the runtime. With `import type` TypeScript erases it at compile\r\n// time and webpack stops bundling @thatopen on behalf of the global\r\n// BimProvider. Critical: this reducer is loaded on every route via\r\n// CombineProviders, so without this @thatopen leaks into the initial bundle.\r\nimport type * as OBC from \"@thatopen/components\";\r\nimport { ActionMap } from \"../ActionMap\";\r\nimport type { Plan } from \"../../types/bim\";\r\nimport { Building, DbFile } from '../../types/dbTypes';\r\n\r\ninterface BimTypes {\r\n bimComponents: OBC.Components | null;\r\n world: OBC.World | null;\r\n fragments: OBC.FragmentsManager | null;\r\n modelId: string | null;\r\n modelIds: string[];\r\n floorplans: Plan[];\r\n grid: OBC.SimpleGrid | null;\r\n // For now, store the file with the building\r\n buildingModel: {\r\n bimFile: DbFile | null;\r\n building: Building | null;\r\n };\r\n bimModelsAddedToMap: {\r\n \"bimFile\": DbFile;\r\n building?: Building | null;\r\n }[];\r\n editingBimModel: string | null;\r\n bimModelName: string | null;\r\n bcfTopic: OBC.Topic | Partial<OBC.Topic> | null;\r\n bcfTopics: OBC.Topic[] | Partial<OBC.Topic>[];\r\n bcfTopicId: string | null;\r\n modelUIState: Record<number, { isVisible?: boolean; isGhost?: boolean }>;\r\n}\r\n\r\nexport type BimState = BimTypes;\r\n\r\nexport type BimPayload = {\r\n [\"SET_COMPONENTS\"]: Pick<BimTypes, \"bimComponents\" | \"world\" | \"fragments\">;\r\n [\"SET_WORLD\"]: Pick<BimTypes, \"world\">;\r\n [\"SET_MODEL\"]: Pick<BimTypes, \"modelId\">;\r\n [\"SET_FLOORPLANS\"]: Pick<BimTypes, \"floorplans\">;\r\n [\"SET_GRID\"]: Pick<BimTypes, \"grid\">;\r\n [\"DISPOSE-BIM\"]: void;\r\n [\"TOGGLE_BIM_TO_MAP\"]: Pick<BimTypes, \"buildingModel\">;\r\n [\"REMOVE_BIM_FROM_MAP\"]: Pick<BimTypes, \"bimModelName\">;\r\n [\"REMOVE_ALL_BIM_FROM_MAP\"]: void;\r\n [\"EDIT_BIM_MODEL_BY_NAME\"]: Pick<BimTypes, \"editingBimModel\">;\r\n [\"ADD_BCF_TOPIC\"]: Pick<BimTypes, \"bcfTopic\">;\r\n [\"REMOVE_BCF_TOPIC\"]: Pick<BimTypes, \"bcfTopicId\">;\r\n ['EDIT_BCF_TOPIC']: Pick<BimTypes, \"bcfTopic\">;\r\n [\"SET_MODEL_UI_STATE\"]: { fileId: number; isVisible?: boolean; isGhost?: boolean };\r\n};\r\n\r\nexport type BimActions = ActionMap<BimPayload>[keyof ActionMap<BimPayload>];\r\n\r\nexport const BimReducer = (state: BimState, action: BimActions) => {\r\n\r\n switch (action.type) {\r\n\r\n case \"SET_COMPONENTS\":\r\n return {\r\n ...state,\r\n \"bimComponents\": action.payload.bimComponents,\r\n \"world\": action.payload.world,\r\n \"fragments\": action.payload.fragments,\r\n };\r\n case \"SET_WORLD\":\r\n return {\r\n ...state,\r\n \"world\": action.payload.world,\r\n };\r\n case \"SET_MODEL\":\r\n return {\r\n ...state,\r\n \"modelId\": action.payload.modelId,\r\n };\r\n case \"SET_FLOORPLANS\":\r\n return {\r\n ...state,\r\n \"floorplans\": action.payload.floorplans,\r\n }\r\n case \"SET_GRID\":\r\n return {\r\n ...state,\r\n \"grid\": action.payload.grid,\r\n };\r\n case \"DISPOSE-BIM\":\r\n return {\r\n ...state,\r\n \"bimComponents\": null,\r\n \"world\": null,\r\n \"fragments\": null,\r\n \"modelId\": null,\r\n };\r\n case \"TOGGLE_BIM_TO_MAP\": {\r\n\r\n const { bimFile } = action.payload.buildingModel;\r\n const exists = state.bimModelsAddedToMap.some((model) => model.bimFile.id === bimFile.id\r\n );\r\n let bimModelsAddedToMap;\r\n bimModelsAddedToMap = exists\r\n ? state.bimModelsAddedToMap.filter((model) => model.bimFile.id !== bimFile.id,\r\n ) : [\r\n ...state.bimModelsAddedToMap,\r\n {\r\n bimFile,\r\n \"building\": action.payload.buildingModel.building\r\n },\r\n ];\r\n return {\r\n ...state,\r\n bimModelsAddedToMap\r\n };\r\n\r\n }\r\n case \"REMOVE_BIM_FROM_MAP\": {\r\n\r\n const removeName = action.payload.bimModelName;\r\n return {\r\n ...state,\r\n bimModelsAddedToMap: state.bimModelsAddedToMap.filter((model) => model.bimFile.name !== removeName\r\n ),\r\n };\r\n\r\n }\r\n case \"REMOVE_ALL_BIM_FROM_MAP\":\r\n return {\r\n ...state,\r\n \"bimModelsAddedToMap\": [],\r\n };\r\n case \"EDIT_BIM_MODEL_BY_NAME\": {\r\n return {\r\n ...state,\r\n \"editingBimModel\": action.payload.editingBimModel,\r\n }\r\n }\r\n case \"ADD_BCF_TOPIC\":\r\n return {\r\n ...state,\r\n \"bcfTopics\": [...state.bcfTopics, action.payload.bcfTopic],\r\n };\r\n case \"REMOVE_BCF_TOPIC\":\r\n return {\r\n ...state,\r\n \"bcfTopics\": state.bcfTopics.filter((topic) => topic.guid !== action.payload.bcfTopicId),\r\n };\r\n case \"EDIT_BCF_TOPIC\":\r\n return {\r\n ...state,\r\n \"bcfTopics\": state.bcfTopics.map((topic) =>\r\n topic.guid === action.payload.bcfTopic.guid\r\n ? action.payload.bcfTopic\r\n : topic\r\n ),\r\n };\r\n case \"SET_MODEL_UI_STATE\": {\r\n const { fileId, ...uiProps } = action.payload\r\n return {\r\n ...state,\r\n modelUIState: {\r\n ...state.modelUIState,\r\n [fileId]: {\r\n ...state.modelUIState[fileId],\r\n ...uiProps,\r\n },\r\n },\r\n }\r\n }\r\n default:\r\n return state;\r\n\r\n }\r\n\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDO,MAAM,aAAa,CAAC,OAAiB,WAAuB;AAE/D,UAAQ,OAAO,MAAM;AAAA,IAEjB,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,iBAAiB,OAAO,QAAQ;AAAA,QAChC,SAAS,OAAO,QAAQ;AAAA,QACxB,aAAa,OAAO,QAAQ;AAAA,MAChC;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,SAAS,OAAO,QAAQ;AAAA,MAC5B;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,WAAW,OAAO,QAAQ;AAAA,MAC9B;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,cAAc,OAAO,QAAQ;AAAA,MACjC;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,QAAQ,OAAO,QAAQ;AAAA,MAC3B;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,iBAAiB;AAAA,QACjB,SAAS;AAAA,QACT,aAAa;AAAA,QACb,WAAW;AAAA,MACf;AAAA,IACJ,KAAK,qBAAqB;AAEtB,YAAM,EAAE,QAAQ,IAAI,OAAO,QAAQ;AACnC,YAAM,SAAS,MAAM,oBAAoB;AAAA,QAAK,CAAC,UAAU,MAAM,QAAQ,OAAO,QAAQ;AAAA,MACtF;AACA,UAAI;AACJ,4BAAsB,SAChB,MAAM,oBAAoB;AAAA,QAAO,CAAC,UAAU,MAAM,QAAQ,OAAO,QAAQ;AAAA,MAC3E,IAAI;AAAA,QACA,GAAG,MAAM;AAAA,QACT;AAAA,UACI;AAAA,UACA,YAAY,OAAO,QAAQ,cAAc;AAAA,QAC7C;AAAA,MACJ;AACJ,aAAO,iCACA,QADA;AAAA,QAEH;AAAA,MACJ;AAAA,IAEJ;AAAA,IACA,KAAK,uBAAuB;AAExB,YAAM,aAAa,OAAO,QAAQ;AAClC,aAAO,iCACA,QADA;AAAA,QAEH,qBAAqB,MAAM,oBAAoB;AAAA,UAAO,CAAC,UAAU,MAAM,QAAQ,SAAS;AAAA,QACxF;AAAA,MACJ;AAAA,IAEJ;AAAA,IACA,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,uBAAuB,CAAC;AAAA,MAC5B;AAAA,IACJ,KAAK,0BAA0B;AAC3B,aAAO,iCACA,QADA;AAAA,QAEH,mBAAmB,OAAO,QAAQ;AAAA,MACtC;AAAA,IACJ;AAAA,IACA,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,aAAa,CAAC,GAAG,MAAM,WAAW,OAAO,QAAQ,QAAQ;AAAA,MAC7D;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,aAAa,MAAM,UAAU,OAAO,CAAC,UAAU,MAAM,SAAS,OAAO,QAAQ,UAAU;AAAA,MAC3F;AAAA,IACJ,KAAK;AACD,aAAO,iCACA,QADA;AAAA,QAEH,aAAa,MAAM,UAAU;AAAA,UAAI,CAAC,UAC9B,MAAM,SAAS,OAAO,QAAQ,SAAS,OACjC,OAAO,QAAQ,WACf;AAAA,QACV;AAAA,MACJ;AAAA,IACJ,KAAK,sBAAsB;AACvB,YAA+B,YAAO,SAA9B,SA9JpB,IA8J2C,IAAZ,oBAAY,IAAZ,CAAX;AACR,aAAO,iCACA,QADA;AAAA,QAEH,cAAc,iCACP,MAAM,eADC;AAAA,UAEV,CAAC,MAAM,GAAG,kCACH,MAAM,aAAa,MAAM,IACzB;AAAA,QAEX;AAAA,MACJ;AAAA,IACJ;AAAA,IACA;AACI,aAAO;AAAA,EAEf;AAEJ;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/core/store/Buildings/context.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAIjE,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAA;CACX,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;AAE7D,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,cAAc,CAAA;CAC1B,CAAA;AAeD,eAAO,MAAM,gBAAgB;WACpB,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;kBAC5B,WAAW,EAAE;sBACT,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;uBAClD,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI;4BACtB,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;eACrC,OAAO;mBACH,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;EAUxD,CAAA;AAEN,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CA0C/D,CAAA;AAED,eAAO,MAAM,mBAAmB;WA/DvB,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;kBAC5B,WAAW,EAAE;sBACT,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;uBAClD,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI;4BACtB,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;eACrC,OAAO;mBACH,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;CAwDa,CAAA"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../../src/core/store/Buildings/context.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAIjE,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAA;CACX,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;AAE7D,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,cAAc,CAAA;CAC1B,CAAA;AAeD,eAAO,MAAM,gBAAgB;WACpB,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;kBAC5B,WAAW,EAAE;sBACT,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;uBAClD,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI;4BACtB,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;eACrC,OAAO;mBACH,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;EAUxD,CAAA;AAEN,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAuC/D,CAAA;AAED,eAAO,MAAM,mBAAmB;WA5DvB,gBAAgB;cACb,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC;kBAC5B,WAAW,EAAE;sBACT,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;uBAClD,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI;4BACtB,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;eACrC,OAAO;mBACH,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;CAqDa,CAAA"}