@mapcomponents/react-maplibre 0.1.56 → 0.1.58

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 (277) hide show
  1. package/.eslintignore +11 -0
  2. package/.eslintrc.js +20 -0
  3. package/.github/workflows/check-formatting.yml +46 -0
  4. package/.prettierignore +11 -0
  5. package/.prettierrc.json +6 -0
  6. package/CHANGELOG.md +20 -0
  7. package/coverage/clover.xml +232 -80
  8. package/coverage/coverage-final.json +43 -37
  9. package/coverage/lcov-report/index.html +71 -26
  10. package/coverage/lcov-report/src/components/MapLibreMap/MapLibreMap.tsx.html +83 -83
  11. package/coverage/lcov-report/src/components/MapLibreMap/index.html +1 -1
  12. package/coverage/lcov-report/src/components/MlCenterPosition/MlCenterPosition.tsx.html +66 -66
  13. package/coverage/lcov-report/src/components/MlCenterPosition/index.html +1 -1
  14. package/coverage/lcov-report/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx.html +30 -30
  15. package/coverage/lcov-report/src/components/MlCreatePdfButton/index.html +1 -1
  16. package/coverage/lcov-report/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx.html +202 -0
  17. package/coverage/lcov-report/src/components/MlCreatePdfForm/index.html +116 -0
  18. package/coverage/lcov-report/src/components/MlFeatureEditor/MlFeatureEditor.tsx.html +99 -99
  19. package/coverage/lcov-report/src/components/MlFeatureEditor/index.html +1 -1
  20. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.tsx.html +66 -66
  21. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/index.html +1 -1
  22. package/coverage/lcov-report/src/components/MlFollowGps/MlFollowGps.tsx.html +221 -221
  23. package/coverage/lcov-report/src/components/MlFollowGps/index.html +1 -1
  24. package/coverage/lcov-report/src/components/MlGPXViewer/MlGPXViewer.tsx.html +308 -308
  25. package/coverage/lcov-report/src/components/MlGPXViewer/gpxConverter.js.html +497 -497
  26. package/coverage/lcov-report/src/components/MlGPXViewer/index.html +1 -1
  27. package/coverage/lcov-report/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx.html +85 -85
  28. package/coverage/lcov-report/src/components/MlGeoJsonLayer/index.html +1 -1
  29. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.tsx.html +469 -0
  30. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/index.html +116 -0
  31. package/coverage/lcov-report/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx.html +140 -140
  32. package/coverage/lcov-report/src/components/MlImageMarkerLayer/index.html +1 -1
  33. package/coverage/lcov-report/src/components/MlLayer/MlLayer.tsx.html +37 -37
  34. package/coverage/lcov-report/src/components/MlLayer/index.html +1 -1
  35. package/coverage/lcov-report/src/components/MlLayerMagnify/MlLayerMagnify.tsx.html +179 -179
  36. package/coverage/lcov-report/src/components/MlLayerMagnify/index.html +1 -1
  37. package/coverage/lcov-report/src/components/MlLayerSwipe/MlLayerSwipe.tsx.html +113 -113
  38. package/coverage/lcov-report/src/components/MlLayerSwipe/index.html +1 -1
  39. package/coverage/lcov-report/src/components/MlLayerSwitcher/MlLayerSwitcher.js.html +181 -181
  40. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/LayerBox.js.html +58 -58
  41. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/index.html +1 -1
  42. package/coverage/lcov-report/src/components/MlLayerSwitcher/index.html +1 -1
  43. package/coverage/lcov-report/src/components/MlMarker/MlMarker.tsx.html +108 -108
  44. package/coverage/lcov-report/src/components/MlMarker/index.html +1 -1
  45. package/coverage/lcov-report/src/components/MlMeasureTool/MlMeasureTool.tsx.html +39 -39
  46. package/coverage/lcov-report/src/components/MlMeasureTool/index.html +1 -1
  47. package/coverage/lcov-report/src/components/MlNavigationCompass/MlNavigationCompass.tsx.html +183 -183
  48. package/coverage/lcov-report/src/components/MlNavigationCompass/index.html +1 -1
  49. package/coverage/lcov-report/src/components/MlNavigationTools/MlNavigationTools.tsx.html +163 -163
  50. package/coverage/lcov-report/src/components/MlNavigationTools/index.html +1 -1
  51. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.js.html +50 -50
  52. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.stories_.js.html +30 -30
  53. package/coverage/lcov-report/src/components/MlOsmLayer/index.html +1 -1
  54. package/coverage/lcov-report/src/components/MlScaleReference/MlScaleReference.js.html +89 -89
  55. package/coverage/lcov-report/src/components/MlScaleReference/index.html +11 -11
  56. package/coverage/lcov-report/src/components/MlShareMapState/MlShareMapState.js.html +204 -204
  57. package/coverage/lcov-report/src/components/MlShareMapState/index.html +1 -1
  58. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js.html +180 -180
  59. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/index.html +1 -1
  60. package/coverage/lcov-report/src/components/MlThreeJsLayer/MlThreeJsLayer.js.html +163 -163
  61. package/coverage/lcov-report/src/components/MlThreeJsLayer/index.html +1 -1
  62. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx.html +136 -136
  63. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/index.html +1 -1
  64. package/coverage/lcov-report/src/components/MlUseMapDebugger/MlUseMapDebugger.js.html +53 -53
  65. package/coverage/lcov-report/src/components/MlUseMapDebugger/index.html +1 -1
  66. package/coverage/lcov-report/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx.html +123 -123
  67. package/coverage/lcov-report/src/components/MlVectorTileLayer/index.html +1 -1
  68. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js.html +35 -35
  69. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/index.html +1 -1
  70. package/coverage/lcov-report/src/components/MlWmsLayer/MlWmsLayer.tsx.html +155 -155
  71. package/coverage/lcov-report/src/components/MlWmsLayer/index.html +1 -1
  72. package/coverage/lcov-report/src/components/MlWmsLoader/MlWmsLoader.tsx.html +255 -255
  73. package/coverage/lcov-report/src/components/MlWmsLoader/index.html +1 -1
  74. package/coverage/lcov-report/src/contexts/MapContext.tsx.html +66 -66
  75. package/coverage/lcov-report/src/contexts/SimpleDataContext.js.html +1 -1
  76. package/coverage/lcov-report/src/contexts/SimpleDataProvider.js.html +48 -48
  77. package/coverage/lcov-report/src/contexts/index.html +1 -1
  78. package/coverage/lcov-report/src/hooks/exportMap/index.html +131 -0
  79. package/coverage/lcov-report/src/hooks/exportMap/index.ts.html +175 -0
  80. package/coverage/lcov-report/src/hooks/exportMap/lib.ts.html +646 -0
  81. package/coverage/lcov-report/src/hooks/index.html +48 -18
  82. package/coverage/lcov-report/src/hooks/useLayer.ts.html +230 -188
  83. package/coverage/lcov-report/src/hooks/useLayerEvent.js.html +232 -0
  84. package/coverage/lcov-report/src/hooks/useMap.ts.html +72 -69
  85. package/coverage/lcov-report/src/hooks/useMapState.ts.html +145 -145
  86. package/coverage/lcov-report/src/hooks/useSource.ts.html +337 -0
  87. package/coverage/lcov-report/src/hooks/useWms.js.html +72 -72
  88. package/coverage/lcov-report/src/index.html +1 -1
  89. package/coverage/lcov-report/src/index.ts.html +14 -2
  90. package/coverage/lcov.info +450 -153
  91. package/dist/components/MlCreatePdfForm/MlCreatePdfForm.d.ts +24 -0
  92. package/dist/components/MlCreatePdfForm/MlCreatePdfForm.stories.d.ts +13 -0
  93. package/dist/components/MlCreatePdfForm/lib/PdfContext.d.ts +21 -0
  94. package/dist/components/MlCreatePdfForm/lib/PdfForm.d.ts +10 -0
  95. package/dist/components/MlCreatePdfForm/lib/PdfPreview.d.ts +13 -0
  96. package/dist/components/MlCreatePdfForm/lib/pdf.templates.d.ts +11 -0
  97. package/dist/components/MlFeatureEditor/lib/create_vertex.d.ts +1 -1
  98. package/dist/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.d.ts +22 -0
  99. package/dist/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.stories.d.ts +10 -0
  100. package/dist/components/MlLayerSwipe/MlLayerSwipe.d.ts +1 -1
  101. package/dist/components/MlWmsLayer/MlWmsLayer.d.ts +2 -2
  102. package/dist/decorators/MapContextDecoratorHooks.d.ts +2 -0
  103. package/dist/decorators/ThemeWrapper.d.ts +1 -0
  104. package/dist/hooks/exportMap/index.d.ts +11 -0
  105. package/dist/hooks/exportMap/lib.d.ts +36 -0
  106. package/dist/hooks/useLayer.d.ts +6 -5
  107. package/dist/hooks/useLayerEvent.d.ts +2 -0
  108. package/dist/hooks/useMap.d.ts +1 -1
  109. package/dist/hooks/useMapState.stories.d.ts +2 -2
  110. package/dist/hooks/useSource.d.ts +17 -0
  111. package/dist/hooks/useSources.stories.d.ts +13 -0
  112. package/dist/index.d.ts +4 -0
  113. package/dist/index.esm.js +479 -190
  114. package/dist/index.esm.js.map +1 -1
  115. package/eslintErrorTest.js +10 -0
  116. package/package.json +7 -1
  117. package/public/thumbnails/MlCreatePdfForm.png +0 -0
  118. package/src/components/MapLibreMap/MapLibreMap.stories.js +72 -72
  119. package/src/components/MapLibreMap/MapLibreMap.test.js +60 -60
  120. package/src/components/MapLibreMap/MapLibreMap.tsx +82 -82
  121. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.test.js +343 -343
  122. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.ts +619 -619
  123. package/src/components/MlBasicComponent.js +25 -25
  124. package/src/components/MlCenterPosition/MlCenterPosition.stories.js +6 -6
  125. package/src/components/MlCenterPosition/MlCenterPosition.tsx +65 -65
  126. package/src/components/MlComponentTemplate/MlComponentTemplate.stories.js +5 -5
  127. package/src/components/MlComponentTemplate/MlComponentTemplate.tsx +23 -23
  128. package/src/components/MlCreatePdfButton/{MlCreatePdfButton.meta.json → MlCreatePdfButton.meta_.json} +0 -0
  129. package/src/components/MlCreatePdfButton/MlCreatePdfButton.stories.js +16 -16
  130. package/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx +29 -29
  131. package/src/components/MlCreatePdfButton/lib/createPdf.ts +175 -175
  132. package/src/components/MlCreatePdfButton/lib/nominatimMap.ts +51 -51
  133. package/src/components/MlCreatePdfForm/MlCreatePdfForm.doc.de.md +3 -0
  134. package/src/components/MlCreatePdfForm/MlCreatePdfForm.meta.json +15 -0
  135. package/src/components/MlCreatePdfForm/MlCreatePdfForm.stories.tsx +152 -0
  136. package/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx +39 -0
  137. package/src/components/MlCreatePdfForm/lib/PdfContext.tsx +53 -0
  138. package/src/components/MlCreatePdfForm/lib/PdfForm.tsx +161 -0
  139. package/src/components/MlCreatePdfForm/lib/PdfPreview.tsx +399 -0
  140. package/src/components/MlCreatePdfForm/lib/pdf.templates.ts +82 -0
  141. package/src/components/MlFeatureEditor/MlFeatureEditor.stories.js +55 -55
  142. package/src/components/MlFeatureEditor/MlFeatureEditor.test.js +105 -105
  143. package/src/components/MlFeatureEditor/MlFeatureEditor.tsx +119 -119
  144. package/src/components/MlFeatureEditor/custom-direct-select-mode.js +208 -208
  145. package/src/components/MlFeatureEditor/custom-polygon-mode.js +148 -148
  146. package/src/components/MlFeatureEditor/custom-select-mode.js +314 -314
  147. package/src/components/MlFeatureEditor/lib/common_selectors.js +34 -34
  148. package/src/components/MlFeatureEditor/lib/constants.js +61 -61
  149. package/src/components/MlFeatureEditor/lib/constrain_feature_movement.js +51 -51
  150. package/src/components/MlFeatureEditor/lib/create_midpoint.js +30 -30
  151. package/src/components/MlFeatureEditor/lib/create_supplementary_points.js +82 -82
  152. package/src/components/MlFeatureEditor/lib/create_vertex.js +16 -16
  153. package/src/components/MlFeatureEditor/lib/double_click_zoom.js +23 -23
  154. package/src/components/MlFeatureEditor/lib/euclidean_distance.js +3 -3
  155. package/src/components/MlFeatureEditor/lib/features_at.js +23 -23
  156. package/src/components/MlFeatureEditor/lib/get_features_and_set_cursor.js +15 -15
  157. package/src/components/MlFeatureEditor/lib/is_click.js +8 -8
  158. package/src/components/MlFeatureEditor/lib/is_event_at_coordinates.js +2 -2
  159. package/src/components/MlFeatureEditor/lib/is_tap.js +6 -6
  160. package/src/components/MlFeatureEditor/lib/map_event_to_bounding_box.js +4 -4
  161. package/src/components/MlFeatureEditor/lib/mode_handler.js +105 -105
  162. package/src/components/MlFeatureEditor/lib/mouse_event_point.js +5 -5
  163. package/src/components/MlFeatureEditor/lib/move_features.js +33 -33
  164. package/src/components/MlFeatureEditor/lib/sort_features.js +25 -25
  165. package/src/components/MlFeatureEditor/lib/string_set.js +36 -36
  166. package/src/components/MlFeatureEditor/lib/string_sets_are_equal.js +2 -2
  167. package/src/components/MlFeatureEditor/lib/theme.js +230 -230
  168. package/src/components/MlFeatureEditor/lib/to_dense_array.js +1 -1
  169. package/src/components/MlFeatureEditor/lib/utils.js +40 -40
  170. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.stories.js +9 -9
  171. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.test.js +4 -4
  172. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.tsx +65 -65
  173. package/src/components/MlFollowGps/MlFollowGps.stories.js +6 -6
  174. package/src/components/MlFollowGps/MlFollowGps.test.js +44 -44
  175. package/src/components/MlFollowGps/MlFollowGps.tsx +220 -220
  176. package/src/components/MlGPXViewer/MlGPXViewer.stories.js +15 -15
  177. package/src/components/MlGPXViewer/MlGPXViewer.test.js +12 -12
  178. package/src/components/MlGPXViewer/MlGPXViewer.tsx +345 -345
  179. package/src/components/MlGPXViewer/gpxConverter.js +496 -496
  180. package/src/components/MlGPXViewer/util/GeoJsonContext.ts +4 -4
  181. package/src/components/MlGPXViewer/util/GeoJsonProvider.tsx +16 -16
  182. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.stories.js +34 -34
  183. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.test.js +8 -8
  184. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx +84 -84
  185. package/src/components/MlGeoJsonLayer/util/getDefaultLayerTypeByGeometry.ts +21 -21
  186. package/src/components/MlGeoJsonLayer/util/getDefaultPaintPropsByType.ts +27 -27
  187. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.doc.de.md +3 -0
  188. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.meta_.json +15 -0
  189. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.stories.js +19 -0
  190. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.tsx +128 -0
  191. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.stories.js +28 -28
  192. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.test.js +8 -8
  193. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx +162 -162
  194. package/src/components/MlLayer/MlLayer.stories.js +5 -5
  195. package/src/components/MlLayer/MlLayer.test.js +86 -86
  196. package/src/components/MlLayer/MlLayer.tsx +36 -36
  197. package/src/components/MlLayerMagnify/MlLayerMagnify.stories.js +21 -21
  198. package/src/components/MlLayerMagnify/MlLayerMagnify.test.js +54 -54
  199. package/src/components/MlLayerMagnify/MlLayerMagnify.tsx +201 -201
  200. package/src/components/MlLayerSwipe/MlLayerSwipe.stories.js +20 -20
  201. package/src/components/MlLayerSwipe/MlLayerSwipe.test.js +54 -54
  202. package/src/components/MlLayerSwipe/MlLayerSwipe.tsx +130 -130
  203. package/src/components/MlLayerSwitcher/MlLayerSwitcher.js +194 -194
  204. package/src/components/MlLayerSwitcher/MlLayerSwitcher.stories.js +85 -85
  205. package/src/components/MlLayerSwitcher/components/LayerBox.js +57 -57
  206. package/src/components/MlMarker/MlMarker.stories.js +7 -7
  207. package/src/components/MlMarker/MlMarker.tsx +119 -119
  208. package/src/components/MlMeasureTool/MlMeasureTool.stories.js +64 -64
  209. package/src/components/MlMeasureTool/MlMeasureTool.tsx +38 -38
  210. package/src/components/MlNavigationCompass/MlNavigationCompass.stories.js +45 -45
  211. package/src/components/MlNavigationCompass/MlNavigationCompass.test.js +40 -40
  212. package/src/components/MlNavigationCompass/MlNavigationCompass.tsx +192 -192
  213. package/src/components/MlNavigationTools/MlNavigationTools.stories.js +18 -18
  214. package/src/components/MlNavigationTools/MlNavigationTools.tsx +173 -173
  215. package/src/components/MlOsmLayer/MlOsmLayer.js +49 -49
  216. package/src/components/MlOsmLayer/MlOsmLayer.stories_.js +29 -29
  217. package/src/components/MlOsmLayer/MlOsmLayer.test.js +8 -8
  218. package/src/components/MlScaleReference/MlScaleReference.js +82 -82
  219. package/src/components/MlScaleReference/MlScaleReference.stories.js +33 -35
  220. package/src/components/MlShareMapState/MlShareMapState.js +203 -203
  221. package/src/components/MlShareMapState/MlShareMapState.stories.js +68 -68
  222. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js +201 -201
  223. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.stories.js +35 -35
  224. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.test.js +8 -8
  225. package/src/components/MlThreeJsLayer/MlThreeJsLayer.js +186 -186
  226. package/src/components/MlThreeJsLayer/MlThreeJsLayer.stories.js +21 -21
  227. package/src/components/MlThreeJsLayer/MlThreeJsLayer.test.js +24 -24
  228. package/src/components/MlThreeJsLayer/lib/GLTFLoader.js +3327 -3327
  229. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.stories.js +31 -30
  230. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.test.js +8 -8
  231. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx +146 -146
  232. package/src/components/MlTransitionGeoJsonLayer/util/transitionFunctions.js +207 -207
  233. package/src/components/MlUseMapDebugger/MlUseMapDebugger.js +52 -52
  234. package/src/components/MlUseMapDebugger/MlUseMapDebugger.stories.js +13 -13
  235. package/src/components/MlVectorTileLayer/MlVectorTileLayer.stories.js +27 -27
  236. package/src/components/MlVectorTileLayer/MlVectorTileLayer.test.js +27 -27
  237. package/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx +137 -137
  238. package/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js +34 -34
  239. package/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.stories.js +7 -7
  240. package/src/components/MlWmsLayer/MlWmsLayer.stories.js +26 -26
  241. package/src/components/MlWmsLayer/MlWmsLayer.test.js +8 -8
  242. package/src/components/MlWmsLayer/MlWmsLayer.tsx +167 -167
  243. package/src/components/MlWmsLoader/MlWmsLoader.stories.js +27 -27
  244. package/src/components/MlWmsLoader/MlWmsLoader.tsx +254 -254
  245. package/src/contexts/MapComponentsProvider.test.js +229 -229
  246. package/src/contexts/MapContext.tsx +65 -65
  247. package/src/contexts/SimpleDataProvider.js +47 -47
  248. package/src/contexts/SimpleDataProvider.test.js +29 -29
  249. package/src/custom.d.tsx +14 -14
  250. package/src/decorators/MapContextDecorator.js +23 -25
  251. package/src/decorators/MapContextDecoratorHooks.js +34 -0
  252. package/src/decorators/MultiMapContextDecorator.js +63 -63
  253. package/src/decorators/NoNavToolsDecorator.js +17 -17
  254. package/src/decorators/ThemeWrapper.jsx +9 -0
  255. package/src/hooks/assets/pointWG.json +13 -0
  256. package/src/hooks/exportMap/index.ts +30 -0
  257. package/src/hooks/exportMap/lib.ts +187 -0
  258. package/src/hooks/useLayer.test.js +188 -188
  259. package/src/hooks/useLayer.ts +194 -180
  260. package/src/hooks/useLayerEvent.js +49 -0
  261. package/src/hooks/useMap.ts +67 -66
  262. package/src/hooks/useMapState.stories.js +78 -78
  263. package/src/hooks/useMapState.ts +161 -161
  264. package/src/hooks/useSource.ts +84 -0
  265. package/src/hooks/useSources.stories.js +232 -0
  266. package/src/hooks/useWms.js +71 -71
  267. package/src/index.ts +4 -0
  268. package/src/setupTests.js +86 -86
  269. package/src/ui_components/ImageLoader.js +62 -62
  270. package/src/ui_components/Legend.js +34 -34
  271. package/src/ui_components/LoadingOverlay.js +29 -29
  272. package/src/ui_components/LoadingOverlayContext.js +68 -68
  273. package/src/ui_components/Sidebar.js +80 -80
  274. package/src/ui_components/Tooltip.js +9 -9
  275. package/src/ui_components/TopToolbar.js +23 -23
  276. package/src/util/layerRemovalTest.js +111 -111
  277. package/src/util/sourceRemovalTest.js +103 -103
@@ -6,10 +6,10 @@ import { v4 as uuidv4 } from "uuid";
6
6
  import useMapState from "../../hooks/useMapState";
7
7
 
8
8
  const getCurrentUrlParameters = () => {
9
- let currentParams = Object.fromEntries(new URLSearchParams(window.location.search));
10
- currentParams.layers = JSON.parse(currentParams?.layers ? currentParams.layers : "[]");
9
+ let currentParams = Object.fromEntries(new URLSearchParams(window.location.search));
10
+ currentParams.layers = JSON.parse(currentParams?.layers ? currentParams.layers : "[]");
11
11
 
12
- return currentParams;
12
+ return currentParams;
13
13
  };
14
14
 
15
15
  const initialUrlParams = getCurrentUrlParameters();
@@ -23,211 +23,211 @@ const initialUrlParams = getCurrentUrlParameters();
23
23
  * @component
24
24
  */
25
25
  const MlShareMapState = (props) => {
26
- // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
27
- const mapContext = useContext(MapContext);
28
- const initializedRef = useRef(false);
29
- const mapRef = useRef(undefined);
30
- const [map, setMap] = useState(undefined);
31
- const layersFromUrlParamsRef = useRef({});
32
- const componentId = useRef((props.idPrefix ? props.idPrefix : "MlShareMapState-") + uuidv4());
33
- const mapState = useMapState({
34
- watch: {
35
- viewport: false,
36
- layers: true,
37
- sources: false,
38
- },
39
- filter: {
40
- includeBaseLayers: false,
41
- },
42
- });
43
-
44
- const allStatesRestoredRef = useRef(false);
45
- const layerStatesRestored = useRef(undefined);
46
- const restoredStatesRef = useRef({
47
- viewport: {
48
- center: false,
49
- bearing: false,
50
- pitch: false,
51
- zoom: false,
52
- },
53
- layers: {
54
- ...layersFromUrlParamsRef,
55
- },
56
- });
57
-
58
- // initial URL-Params
59
- const mapStateRef = useRef({});
60
-
61
- const refreshUrlParameters = useCallback(() => {
62
- if (!props.active) return;
63
-
64
- let mapLayers = [];
65
- for (let x in mapState.layers) {
66
- mapLayers.push({
67
- id: mapState.layers[x].id,
68
- type: mapState.layers[x].type,
69
- visible: mapState.layers[x].visible,
70
- });
71
- }
72
- refreshMapState();
73
- let urlParams = new URLSearchParams({
74
- ...getCurrentUrlParameters(),
75
- ...mapStateRef.current,
76
- layers: JSON.stringify(mapLayers),
77
- });
78
- JSON.parse(Object.fromEntries(urlParams).layers).forEach((el) => {
79
- layersFromUrlParamsRef.current[el.id] = false;
80
- });
81
-
82
- let currentParams = new URLSearchParams(window.location.search);
83
- checkRestorationStates(mapState.layers);
84
- if (urlParams.toString() !== currentParams.toString()) {
85
- window.history.pushState(
86
- { ...mapStateRef.current },
87
- document.title,
88
- "?" + urlParams.toString()
89
- );
90
- }
91
- }, [mapState.layers, props.active]);
92
-
93
- useEffect(() => {
94
- let _componentId = componentId.current;
95
-
96
- mapStateRef.current = getCurrentUrlParameters();
97
-
98
- return () => {
99
- // This is the cleanup function, it is called when this react component is removed from react-dom
100
- // try to remove anything this component has added to the MapLibre-gl instance
101
- // e.g.: remove the layer
102
- // mapContext.getMap(props.mapId).removeLayer(layerRef.current);
103
- // check for the existence of map.style before calling getLayer or getSource
104
-
105
- if (mapRef.current) {
106
- mapRef.current.cleanup(_componentId);
107
- mapRef.current = undefined;
108
- }
109
- initializedRef.current = false;
110
- };
111
- }, []);
112
-
113
- useEffect(() => {
114
- if (!mapRef.current) return;
115
-
116
- refreshUrlParameters();
117
- }, [refreshUrlParameters]);
118
-
119
- useEffect(() => {
120
- if (!mapRef.current) return;
121
-
122
- let _refreshUrlParameters = refreshUrlParameters;
123
-
124
- mapRef.current.on("moveend", _refreshUrlParameters, componentId.current);
125
-
126
- return () => {
127
- mapRef.current?.off("moveend", _refreshUrlParameters);
128
- };
129
- }, [refreshUrlParameters, map]);
130
-
131
- useEffect(() => {
132
- if (!mapContext.mapExists(props.mapId) || initializedRef.current) return;
133
- // the MapLibre-gl instance (mapContext.getMap(props.mapId)) is accessible here
134
- // initialize the layer and add it to the MapLibre-gl instance or do something else with it
135
- initializedRef.current = true;
136
- mapRef.current = mapContext.getMap(props.mapId);
137
- setMap(mapRef.current);
138
- if (mapStateRef.current.lat && mapStateRef.current.lng) {
139
- restoreViewportState();
140
- }
141
- }, [mapContext.mapIds, mapContext, props.mapId, props.active]);
142
-
143
- useEffect(() => {
144
- if (!mapState?.layers?.length) return;
145
-
146
- if (typeof layerStatesRestored.current === "undefined") {
147
- layerStatesRestored.current = {};
148
- initialUrlParams?.layers.forEach((layer) => {
149
- layerStatesRestored.current[layer.id] = false;
150
- });
151
- }
152
-
153
- for (let key in layerStatesRestored.current) {
154
- let _allDone = true;
155
- if (layerStatesRestored.current[key] === false) {
156
- _allDone = false;
157
- }
158
- if (_allDone) {
159
- return;
160
- }
161
- }
162
-
163
- if (initialUrlParams.layers) {
164
- initialUrlParams.layers.forEach((layer) => {
165
- if (mapRef.current?.getLayer(layer.id) && layerStatesRestored.current[layer.id] === false) {
166
- layerStatesRestored.current[layer.id] = true;
167
- mapRef.current
168
- ?.getLayer(layer.id)
169
- ?.setLayoutProperty("visibility", layer.visible ? "visible" : "none");
170
- }
171
- });
172
- }
173
- }, [mapState.layers, props.mapId, props.active]);
174
-
175
- useEffect(() => {
176
- if (!map) return;
177
- if (!mapState.layers) return;
178
-
179
- if (!props.active) {
180
- map.cleanup(componentId.current);
181
- }
182
- }, [props.active, map, mapState.layers]);
183
-
184
- const refreshMapState = () => {
185
- mapStateRef.current.lat = mapRef.current.getCenter().lat;
186
- mapStateRef.current.lng = mapRef.current.getCenter().lng;
187
- mapStateRef.current.zoom = mapRef.current.getZoom();
188
- mapStateRef.current.bearing = mapRef.current.getBearing();
189
- mapStateRef.current.pitch = mapRef.current.getPitch();
190
- };
191
-
192
- const checkRestorationStates = (stateArray) => {
193
- let tempArray = {};
194
- stateArray.forEach((el, i, arr) => {
195
- if (!arr[el.key]) tempArray[el.key] = true;
196
- });
197
- };
198
-
199
- const restoreViewportState = () => {
200
- if (!restoredStatesRef.current.viewport.center) {
201
- restoredStatesRef.current.viewport.center = true;
202
- mapRef.current.setCenter([mapStateRef.current.lng, mapStateRef.current.lat]);
203
- mapRef.current.setZoom(mapStateRef.current.zoom);
204
- mapRef.current.setBearing(mapStateRef.current.bearing);
205
- mapRef.current.setPitch(mapStateRef.current.pitch);
206
- }
207
-
208
- allStatesRestoredRef.current = true;
209
- };
210
-
211
- window.onpopstate = (event) => {
212
- if (event.state && event.state.lng && event.state.lat && event.state.zoom) {
213
- mapRef.current.easeTo({
214
- zoom: event.state.zoom,
215
- center: [event.state.lng, event.state.lat],
216
- });
217
- }
218
- };
219
-
220
- return <></>;
26
+ // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
27
+ const mapContext = useContext(MapContext);
28
+ const initializedRef = useRef(false);
29
+ const mapRef = useRef(undefined);
30
+ const [map, setMap] = useState(undefined);
31
+ const layersFromUrlParamsRef = useRef({});
32
+ const componentId = useRef((props.idPrefix ? props.idPrefix : "MlShareMapState-") + uuidv4());
33
+ const mapState = useMapState({
34
+ watch: {
35
+ viewport: false,
36
+ layers: true,
37
+ sources: false,
38
+ },
39
+ filter: {
40
+ includeBaseLayers: false,
41
+ },
42
+ });
43
+
44
+ const allStatesRestoredRef = useRef(false);
45
+ const layerStatesRestored = useRef(undefined);
46
+ const restoredStatesRef = useRef({
47
+ viewport: {
48
+ center: false,
49
+ bearing: false,
50
+ pitch: false,
51
+ zoom: false,
52
+ },
53
+ layers: {
54
+ ...layersFromUrlParamsRef,
55
+ },
56
+ });
57
+
58
+ // initial URL-Params
59
+ const mapStateRef = useRef({});
60
+
61
+ const refreshUrlParameters = useCallback(() => {
62
+ if (!props.active) return;
63
+
64
+ let mapLayers = [];
65
+ for (let x in mapState.layers) {
66
+ mapLayers.push({
67
+ id: mapState.layers[x].id,
68
+ type: mapState.layers[x].type,
69
+ visible: mapState.layers[x].visible,
70
+ });
71
+ }
72
+ refreshMapState();
73
+ let urlParams = new URLSearchParams({
74
+ ...getCurrentUrlParameters(),
75
+ ...mapStateRef.current,
76
+ layers: JSON.stringify(mapLayers),
77
+ });
78
+ JSON.parse(Object.fromEntries(urlParams).layers).forEach((el) => {
79
+ layersFromUrlParamsRef.current[el.id] = false;
80
+ });
81
+
82
+ let currentParams = new URLSearchParams(window.location.search);
83
+ checkRestorationStates(mapState.layers);
84
+ if (urlParams.toString() !== currentParams.toString()) {
85
+ window.history.pushState(
86
+ { ...mapStateRef.current },
87
+ document.title,
88
+ "?" + urlParams.toString()
89
+ );
90
+ }
91
+ }, [mapState.layers, props.active]);
92
+
93
+ useEffect(() => {
94
+ let _componentId = componentId.current;
95
+
96
+ mapStateRef.current = getCurrentUrlParameters();
97
+
98
+ return () => {
99
+ // This is the cleanup function, it is called when this react component is removed from react-dom
100
+ // try to remove anything this component has added to the MapLibre-gl instance
101
+ // e.g.: remove the layer
102
+ // mapContext.getMap(props.mapId).removeLayer(layerRef.current);
103
+ // check for the existence of map.style before calling getLayer or getSource
104
+
105
+ if (mapRef.current) {
106
+ mapRef.current.cleanup(_componentId);
107
+ mapRef.current = undefined;
108
+ }
109
+ initializedRef.current = false;
110
+ };
111
+ }, []);
112
+
113
+ useEffect(() => {
114
+ if (!mapRef.current) return;
115
+
116
+ refreshUrlParameters();
117
+ }, [refreshUrlParameters]);
118
+
119
+ useEffect(() => {
120
+ if (!mapRef.current) return;
121
+
122
+ let _refreshUrlParameters = refreshUrlParameters;
123
+
124
+ mapRef.current.on("moveend", _refreshUrlParameters, componentId.current);
125
+
126
+ return () => {
127
+ mapRef.current?.off("moveend", _refreshUrlParameters);
128
+ };
129
+ }, [refreshUrlParameters, map]);
130
+
131
+ useEffect(() => {
132
+ if (!mapContext?.mapExists?.(props.mapId) || initializedRef.current) return;
133
+ // the MapLibre-gl instance (mapContext.getMap(props.mapId)) is accessible here
134
+ // initialize the layer and add it to the MapLibre-gl instance or do something else with it
135
+ initializedRef.current = true;
136
+ mapRef.current = mapContext.getMap(props.mapId);
137
+ setMap(mapRef.current);
138
+ if (mapStateRef.current.lat && mapStateRef.current.lng) {
139
+ restoreViewportState();
140
+ }
141
+ }, [mapContext.mapIds, mapContext, props.mapId, props.active]);
142
+
143
+ useEffect(() => {
144
+ if (!mapState?.layers?.length) return;
145
+
146
+ if (typeof layerStatesRestored.current === "undefined") {
147
+ layerStatesRestored.current = {};
148
+ initialUrlParams?.layers.forEach((layer) => {
149
+ layerStatesRestored.current[layer.id] = false;
150
+ });
151
+ }
152
+
153
+ for (let key in layerStatesRestored.current) {
154
+ let _allDone = true;
155
+ if (layerStatesRestored.current[key] === false) {
156
+ _allDone = false;
157
+ }
158
+ if (_allDone) {
159
+ return;
160
+ }
161
+ }
162
+
163
+ if (initialUrlParams.layers) {
164
+ initialUrlParams.layers.forEach((layer) => {
165
+ if (mapRef.current?.getLayer(layer.id) && layerStatesRestored.current[layer.id] === false) {
166
+ layerStatesRestored.current[layer.id] = true;
167
+ mapRef.current
168
+ ?.getLayer(layer.id)
169
+ ?.setLayoutProperty("visibility", layer.visible ? "visible" : "none");
170
+ }
171
+ });
172
+ }
173
+ }, [mapState.layers, props.mapId, props.active]);
174
+
175
+ useEffect(() => {
176
+ if (!map) return;
177
+ if (!mapState.layers) return;
178
+
179
+ if (!props.active) {
180
+ map.cleanup(componentId.current);
181
+ }
182
+ }, [props.active, map, mapState.layers]);
183
+
184
+ const refreshMapState = () => {
185
+ mapStateRef.current.lat = mapRef.current.getCenter().lat;
186
+ mapStateRef.current.lng = mapRef.current.getCenter().lng;
187
+ mapStateRef.current.zoom = mapRef.current.getZoom();
188
+ mapStateRef.current.bearing = mapRef.current.getBearing();
189
+ mapStateRef.current.pitch = mapRef.current.getPitch();
190
+ };
191
+
192
+ const checkRestorationStates = (stateArray) => {
193
+ let tempArray = {};
194
+ stateArray.forEach((el, i, arr) => {
195
+ if (!arr[el.key]) tempArray[el.key] = true;
196
+ });
197
+ };
198
+
199
+ const restoreViewportState = () => {
200
+ if (!restoredStatesRef.current.viewport.center) {
201
+ restoredStatesRef.current.viewport.center = true;
202
+ mapRef.current.setCenter([mapStateRef.current.lng, mapStateRef.current.lat]);
203
+ mapRef.current.setZoom(mapStateRef.current.zoom);
204
+ mapRef.current.setBearing(mapStateRef.current.bearing);
205
+ mapRef.current.setPitch(mapStateRef.current.pitch);
206
+ }
207
+
208
+ allStatesRestoredRef.current = true;
209
+ };
210
+
211
+ window.onpopstate = (event) => {
212
+ if (event.state && event.state.lng && event.state.lat && event.state.zoom) {
213
+ mapRef.current.easeTo({
214
+ zoom: event.state.zoom,
215
+ center: [event.state.lng, event.state.lat],
216
+ });
217
+ }
218
+ };
219
+
220
+ return <></>;
221
221
  };
222
222
 
223
223
  MlShareMapState.defaultProps = {
224
- mapId: undefined,
224
+ mapId: undefined,
225
225
  };
226
226
 
227
227
  MlShareMapState.propTypes = {
228
- /**
229
- * Id of the target MapLibre instance in mapContext
230
- */
231
- mapId: PropTypes.string,
228
+ /**
229
+ * Id of the target MapLibre instance in mapContext
230
+ */
231
+ mapId: PropTypes.string,
232
232
  };
233
233
  export default MlShareMapState;
@@ -19,80 +19,80 @@ import CheckCircleOutlineIcon from "@mui/icons-material/CheckCircleOutline";
19
19
  import ErrorOutlineIcon from "@mui/icons-material/ErrorOutline";
20
20
 
21
21
  const storyoptions = {
22
- title: "MapComponents/MlShareMapState",
23
- component: MlShareMapState,
24
- argTypes: {},
25
- decorators: mapContextDecorator,
22
+ title: "MapComponents/MlShareMapState",
23
+ component: MlShareMapState,
24
+ argTypes: {},
25
+ decorators: mapContextDecorator,
26
26
  };
27
27
  export default storyoptions;
28
28
 
29
29
  const Template = () => {
30
- const geoJsonArray = [sample_geojson_1, sample_geojson_2];
31
- const [watchState, setWatchState] = useState(true);
32
- const mapHook = useMap({ mapId: "map_1" });
33
- const mapState = useMapState({
34
- mapId: "map_1",
35
- watch: {
36
- viewport: false,
37
- layers: true,
38
- sources: false,
39
- },
40
- filter: {
41
- includeBaseLayers: false,
42
- },
43
- });
30
+ const geoJsonArray = [sample_geojson_1, sample_geojson_2];
31
+ const [watchState, setWatchState] = useState(true);
32
+ const mapHook = useMap({ mapId: "map_1" });
33
+ const mapState = useMapState({
34
+ mapId: "map_1",
35
+ watch: {
36
+ viewport: false,
37
+ layers: true,
38
+ sources: false,
39
+ },
40
+ filter: {
41
+ includeBaseLayers: false,
42
+ },
43
+ });
44
44
 
45
- return (
46
- <>
47
- <MlShareMapState active={watchState} />
48
- {geoJsonArray.map((el, i) => (
49
- <MlGeoJsonLayer layerId={"GeoJson_" + i} type="line" geojson={el} key={"GeoJson_" + i} />
50
- ))}
51
- <Sidebar sx={{ wordBreak: "break-word" }}>
52
- <ToggleButton
53
- size="small"
54
- selected={watchState}
55
- value={watchState}
56
- onChange={() => {
57
- setWatchState(!watchState);
58
- }}
59
- >
60
- {watchState ? <CheckCircleOutlineIcon /> : <ErrorOutlineIcon />}
45
+ return (
46
+ <>
47
+ <MlShareMapState active={watchState} />
48
+ {geoJsonArray.map((el, i) => (
49
+ <MlGeoJsonLayer layerId={"GeoJson_" + i} type="line" geojson={el} key={"GeoJson_" + i} />
50
+ ))}
51
+ <Sidebar sx={{ wordBreak: "break-word" }}>
52
+ <ToggleButton
53
+ size="small"
54
+ selected={watchState}
55
+ value={watchState}
56
+ onChange={() => {
57
+ setWatchState(!watchState);
58
+ }}
59
+ >
60
+ {watchState ? <CheckCircleOutlineIcon /> : <ErrorOutlineIcon />}
61
61
 
62
- {watchState ? "active" : "inactive"}
63
- </ToggleButton>
64
- <List dense key="layers">
65
- {mapState.layers?.map((el) => (
66
- <ListItem
67
- key={el.id}
68
- secondaryAction={
69
- <IconButton
70
- edge="end"
71
- aria-label="toggle visibility"
72
- onClick={() => {
73
- let currentVisibility = mapHook.map
74
- ?.getLayer?.(el.id)
75
- ?.getLayoutProperty("visibility");
76
- mapHook.map
77
- ?.getLayer?.(el.id)
78
- ?.setLayoutProperty(
79
- "visibility",
80
- currentVisibility === "none" ? "visible" : "none"
81
- );
82
- mapHook.map.map.fire("zoom");
83
- }}
84
- >
85
- {el.visible ? <VisibilityIcon /> : <VisibilityOffIcon />}
86
- </IconButton>
87
- }
88
- >
89
- <ListItemText primary={el.id} secondary={""} />
90
- </ListItem>
91
- ))}
92
- </List>
93
- </Sidebar>
94
- </>
95
- );
62
+ {watchState ? "active" : "inactive"}
63
+ </ToggleButton>
64
+ <List dense key="layers">
65
+ {mapState.layers?.map((el) => (
66
+ <ListItem
67
+ key={el.id}
68
+ secondaryAction={
69
+ <IconButton
70
+ edge="end"
71
+ aria-label="toggle visibility"
72
+ onClick={() => {
73
+ let currentVisibility = mapHook.map
74
+ ?.getLayer?.(el.id)
75
+ ?.getLayoutProperty("visibility");
76
+ mapHook.map
77
+ ?.getLayer?.(el.id)
78
+ ?.setLayoutProperty(
79
+ "visibility",
80
+ currentVisibility === "none" ? "visible" : "none"
81
+ );
82
+ mapHook.map.map.fire("zoom");
83
+ }}
84
+ >
85
+ {el.visible ? <VisibilityIcon /> : <VisibilityOffIcon />}
86
+ </IconButton>
87
+ }
88
+ >
89
+ <ListItemText primary={el.id} secondary={""} />
90
+ </ListItem>
91
+ ))}
92
+ </List>
93
+ </Sidebar>
94
+ </>
95
+ );
96
96
  };
97
97
 
98
98
  export const ExampleConfig = Template.bind({});