@mapcomponents/react-maplibre 0.1.57 → 0.1.59

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 (276) 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 +18 -0
  7. package/coverage/clover.xml +229 -77
  8. package/coverage/coverage-final.json +43 -37
  9. package/coverage/lcov-report/index.html +65 -20
  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 +83 -83
  55. package/coverage/lcov-report/src/components/MlScaleReference/index.html +1 -1
  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 +11 -2
  90. package/coverage/lcov.info +448 -151
  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/hooks/exportMap/index.d.ts +11 -0
  104. package/dist/hooks/exportMap/lib.d.ts +36 -0
  105. package/dist/hooks/useLayer.d.ts +6 -5
  106. package/dist/hooks/useLayerEvent.d.ts +2 -0
  107. package/dist/hooks/useMap.d.ts +1 -1
  108. package/dist/hooks/useMapState.stories.d.ts +2 -2
  109. package/dist/hooks/useSource.d.ts +17 -0
  110. package/dist/hooks/useSources.stories.d.ts +13 -0
  111. package/dist/index.d.ts +3 -0
  112. package/dist/index.esm.js +1055 -315
  113. package/dist/index.esm.js.map +1 -1
  114. package/eslintErrorTest.js +10 -0
  115. package/package.json +7 -1
  116. package/public/thumbnails/MlCreatePdfForm.png +0 -0
  117. package/src/components/MapLibreMap/MapLibreMap.stories.js +72 -72
  118. package/src/components/MapLibreMap/MapLibreMap.test.js +60 -60
  119. package/src/components/MapLibreMap/MapLibreMap.tsx +82 -82
  120. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.test.js +343 -343
  121. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.ts +619 -619
  122. package/src/components/MlBasicComponent.js +25 -25
  123. package/src/components/MlCenterPosition/MlCenterPosition.stories.js +6 -6
  124. package/src/components/MlCenterPosition/MlCenterPosition.tsx +65 -65
  125. package/src/components/MlComponentTemplate/MlComponentTemplate.stories.js +5 -5
  126. package/src/components/MlComponentTemplate/MlComponentTemplate.tsx +23 -23
  127. package/src/components/MlCreatePdfButton/{MlCreatePdfButton.meta.json → MlCreatePdfButton.meta_.json} +0 -0
  128. package/src/components/MlCreatePdfButton/MlCreatePdfButton.stories.js +16 -16
  129. package/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx +29 -29
  130. package/src/components/MlCreatePdfButton/lib/createPdf.ts +175 -175
  131. package/src/components/MlCreatePdfButton/lib/nominatimMap.ts +51 -51
  132. package/src/components/MlCreatePdfForm/MlCreatePdfForm.doc.de.md +3 -0
  133. package/src/components/MlCreatePdfForm/MlCreatePdfForm.meta.json +15 -0
  134. package/src/components/MlCreatePdfForm/MlCreatePdfForm.stories.tsx +152 -0
  135. package/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx +39 -0
  136. package/src/components/MlCreatePdfForm/lib/PdfContext.tsx +53 -0
  137. package/src/components/MlCreatePdfForm/lib/PdfForm.tsx +161 -0
  138. package/src/components/MlCreatePdfForm/lib/PdfPreview.tsx +399 -0
  139. package/src/components/MlCreatePdfForm/lib/pdf.templates.ts +82 -0
  140. package/src/components/MlFeatureEditor/MlFeatureEditor.stories.js +55 -55
  141. package/src/components/MlFeatureEditor/MlFeatureEditor.test.js +105 -105
  142. package/src/components/MlFeatureEditor/MlFeatureEditor.tsx +119 -119
  143. package/src/components/MlFeatureEditor/custom-direct-select-mode.js +208 -208
  144. package/src/components/MlFeatureEditor/custom-polygon-mode.js +148 -148
  145. package/src/components/MlFeatureEditor/custom-select-mode.js +314 -314
  146. package/src/components/MlFeatureEditor/lib/common_selectors.js +34 -34
  147. package/src/components/MlFeatureEditor/lib/constants.js +61 -61
  148. package/src/components/MlFeatureEditor/lib/constrain_feature_movement.js +51 -51
  149. package/src/components/MlFeatureEditor/lib/create_midpoint.js +30 -30
  150. package/src/components/MlFeatureEditor/lib/create_supplementary_points.js +82 -82
  151. package/src/components/MlFeatureEditor/lib/create_vertex.js +16 -16
  152. package/src/components/MlFeatureEditor/lib/double_click_zoom.js +23 -23
  153. package/src/components/MlFeatureEditor/lib/euclidean_distance.js +3 -3
  154. package/src/components/MlFeatureEditor/lib/features_at.js +23 -23
  155. package/src/components/MlFeatureEditor/lib/get_features_and_set_cursor.js +15 -15
  156. package/src/components/MlFeatureEditor/lib/is_click.js +8 -8
  157. package/src/components/MlFeatureEditor/lib/is_event_at_coordinates.js +2 -2
  158. package/src/components/MlFeatureEditor/lib/is_tap.js +6 -6
  159. package/src/components/MlFeatureEditor/lib/map_event_to_bounding_box.js +4 -4
  160. package/src/components/MlFeatureEditor/lib/mode_handler.js +105 -105
  161. package/src/components/MlFeatureEditor/lib/mouse_event_point.js +5 -5
  162. package/src/components/MlFeatureEditor/lib/move_features.js +33 -33
  163. package/src/components/MlFeatureEditor/lib/sort_features.js +25 -25
  164. package/src/components/MlFeatureEditor/lib/string_set.js +36 -36
  165. package/src/components/MlFeatureEditor/lib/string_sets_are_equal.js +2 -2
  166. package/src/components/MlFeatureEditor/lib/theme.js +230 -230
  167. package/src/components/MlFeatureEditor/lib/to_dense_array.js +1 -1
  168. package/src/components/MlFeatureEditor/lib/utils.js +40 -40
  169. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.stories.js +9 -9
  170. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.test.js +4 -4
  171. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.tsx +65 -65
  172. package/src/components/MlFollowGps/MlFollowGps.stories.js +6 -6
  173. package/src/components/MlFollowGps/MlFollowGps.test.js +44 -44
  174. package/src/components/MlFollowGps/MlFollowGps.tsx +220 -220
  175. package/src/components/MlGPXViewer/MlGPXViewer.stories.js +15 -15
  176. package/src/components/MlGPXViewer/MlGPXViewer.test.js +12 -12
  177. package/src/components/MlGPXViewer/MlGPXViewer.tsx +345 -345
  178. package/src/components/MlGPXViewer/gpxConverter.js +496 -496
  179. package/src/components/MlGPXViewer/util/GeoJsonContext.ts +4 -4
  180. package/src/components/MlGPXViewer/util/GeoJsonProvider.tsx +16 -16
  181. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.stories.js +34 -34
  182. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.test.js +8 -8
  183. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx +84 -84
  184. package/src/components/MlGeoJsonLayer/util/getDefaultLayerTypeByGeometry.ts +21 -21
  185. package/src/components/MlGeoJsonLayer/util/getDefaultPaintPropsByType.ts +27 -27
  186. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.doc.de.md +3 -0
  187. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.meta_.json +15 -0
  188. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.stories.js +19 -0
  189. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.tsx +128 -0
  190. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.stories.js +28 -28
  191. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.test.js +8 -8
  192. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx +162 -162
  193. package/src/components/MlLayer/MlLayer.stories.js +5 -5
  194. package/src/components/MlLayer/MlLayer.test.js +86 -86
  195. package/src/components/MlLayer/MlLayer.tsx +36 -36
  196. package/src/components/MlLayerMagnify/MlLayerMagnify.stories.js +21 -21
  197. package/src/components/MlLayerMagnify/MlLayerMagnify.test.js +54 -54
  198. package/src/components/MlLayerMagnify/MlLayerMagnify.tsx +201 -201
  199. package/src/components/MlLayerSwipe/MlLayerSwipe.stories.js +20 -20
  200. package/src/components/MlLayerSwipe/MlLayerSwipe.test.js +54 -54
  201. package/src/components/MlLayerSwipe/MlLayerSwipe.tsx +130 -130
  202. package/src/components/MlLayerSwitcher/MlLayerSwitcher.js +194 -194
  203. package/src/components/MlLayerSwitcher/MlLayerSwitcher.stories.js +85 -85
  204. package/src/components/MlLayerSwitcher/components/LayerBox.js +57 -57
  205. package/src/components/MlMarker/MlMarker.stories.js +7 -7
  206. package/src/components/MlMarker/MlMarker.tsx +119 -119
  207. package/src/components/MlMeasureTool/MlMeasureTool.stories.js +64 -64
  208. package/src/components/MlMeasureTool/MlMeasureTool.tsx +38 -38
  209. package/src/components/MlNavigationCompass/MlNavigationCompass.stories.js +45 -45
  210. package/src/components/MlNavigationCompass/MlNavigationCompass.test.js +40 -40
  211. package/src/components/MlNavigationCompass/MlNavigationCompass.tsx +192 -192
  212. package/src/components/MlNavigationTools/MlNavigationTools.stories.js +18 -18
  213. package/src/components/MlNavigationTools/MlNavigationTools.tsx +173 -173
  214. package/src/components/MlOsmLayer/MlOsmLayer.js +49 -49
  215. package/src/components/MlOsmLayer/MlOsmLayer.stories_.js +29 -29
  216. package/src/components/MlOsmLayer/MlOsmLayer.test.js +8 -8
  217. package/src/components/MlScaleReference/MlScaleReference.js +82 -82
  218. package/src/components/MlScaleReference/MlScaleReference.stories.js +27 -27
  219. package/src/components/MlShareMapState/MlShareMapState.js +203 -203
  220. package/src/components/MlShareMapState/MlShareMapState.stories.js +68 -68
  221. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js +201 -201
  222. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.stories.js +35 -35
  223. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.test.js +8 -8
  224. package/src/components/MlThreeJsLayer/MlThreeJsLayer.js +186 -186
  225. package/src/components/MlThreeJsLayer/MlThreeJsLayer.stories.js +21 -21
  226. package/src/components/MlThreeJsLayer/MlThreeJsLayer.test.js +24 -24
  227. package/src/components/MlThreeJsLayer/lib/GLTFLoader.js +3327 -3327
  228. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.stories.js +31 -30
  229. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.test.js +8 -8
  230. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx +146 -146
  231. package/src/components/MlTransitionGeoJsonLayer/util/transitionFunctions.js +207 -207
  232. package/src/components/MlUseMapDebugger/MlUseMapDebugger.js +52 -52
  233. package/src/components/MlUseMapDebugger/MlUseMapDebugger.stories.js +13 -13
  234. package/src/components/MlVectorTileLayer/MlVectorTileLayer.stories.js +27 -27
  235. package/src/components/MlVectorTileLayer/MlVectorTileLayer.test.js +27 -27
  236. package/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx +137 -137
  237. package/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js +34 -34
  238. package/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.stories.js +7 -7
  239. package/src/components/MlWmsLayer/MlWmsLayer.stories.js +26 -26
  240. package/src/components/MlWmsLayer/MlWmsLayer.test.js +8 -8
  241. package/src/components/MlWmsLayer/MlWmsLayer.tsx +167 -167
  242. package/src/components/MlWmsLoader/MlWmsLoader.stories.js +27 -27
  243. package/src/components/MlWmsLoader/MlWmsLoader.tsx +254 -254
  244. package/src/contexts/MapComponentsProvider.test.js +229 -229
  245. package/src/contexts/MapContext.tsx +65 -65
  246. package/src/contexts/SimpleDataProvider.js +47 -47
  247. package/src/contexts/SimpleDataProvider.test.js +29 -29
  248. package/src/custom.d.tsx +14 -14
  249. package/src/decorators/MapContextDecorator.js +22 -22
  250. package/src/decorators/MapContextDecoratorHooks.js +34 -0
  251. package/src/decorators/MultiMapContextDecorator.js +63 -63
  252. package/src/decorators/NoNavToolsDecorator.js +17 -17
  253. package/src/decorators/ThemeWrapper.jsx +1 -1
  254. package/src/hooks/assets/pointWG.json +13 -0
  255. package/src/hooks/exportMap/index.ts +30 -0
  256. package/src/hooks/exportMap/lib.ts +187 -0
  257. package/src/hooks/useLayer.test.js +188 -188
  258. package/src/hooks/useLayer.ts +194 -180
  259. package/src/hooks/useLayerEvent.js +49 -0
  260. package/src/hooks/useMap.ts +67 -66
  261. package/src/hooks/useMapState.stories.js +78 -78
  262. package/src/hooks/useMapState.ts +161 -161
  263. package/src/hooks/useSource.ts +84 -0
  264. package/src/hooks/useSources.stories.js +232 -0
  265. package/src/hooks/useWms.js +71 -71
  266. package/src/index.ts +3 -0
  267. package/src/setupTests.js +86 -86
  268. package/src/ui_components/ImageLoader.js +62 -62
  269. package/src/ui_components/Legend.js +34 -34
  270. package/src/ui_components/LoadingOverlay.js +29 -29
  271. package/src/ui_components/LoadingOverlayContext.js +68 -68
  272. package/src/ui_components/Sidebar.js +80 -80
  273. package/src/ui_components/Tooltip.js +9 -9
  274. package/src/ui_components/TopToolbar.js +23 -23
  275. package/src/util/layerRemovalTest.js +111 -111
  276. package/src/util/sourceRemovalTest.js +103 -103
@@ -0,0 +1,187 @@
1
+ import { LngLatLike, Map } from 'maplibre-gl';
2
+ import jsPDF from 'jspdf';
3
+ import MapLibreGlWrapper from '../../components/MapLibreMap/lib/MapLibreGlWrapper';
4
+
5
+ import * as turf from '@turf/turf';
6
+ import { BBox } from '@turf/turf';
7
+
8
+ interface createExportOptions {
9
+ map: MapLibreGlWrapper;
10
+ width: number;
11
+ height: number;
12
+ bbox: BBox;
13
+ bboxUnrotated: BBox;
14
+ bearing: number;
15
+ format: string;
16
+ orientation: string;
17
+ }
18
+ export type { createExportOptions };
19
+
20
+ const createExport = (options: createExportOptions) => {
21
+ const width = options.width;
22
+ const height = options.height;
23
+
24
+ // Create map container
25
+ const hiddenContainer = document.createElement('div');
26
+ hiddenContainer.className = 'hidden-map';
27
+ document.body.appendChild(hiddenContainer);
28
+ const container = document.createElement('div');
29
+ container.style.width = width + 'px';
30
+ container.style.height = height + 'px';
31
+ hiddenContainer.appendChild(container);
32
+
33
+ const style = options.map.map.getStyle();
34
+
35
+ // delete undefined source properties
36
+ for (const name in style.sources) {
37
+ const src = style.sources[name];
38
+
39
+ Object.keys(src).forEach((key) => {
40
+ // delete property if value is undefined.
41
+ // for instance, raster-dem might have undefined value in "url" and "bounds"
42
+ if (!src[key]) {
43
+ delete src[key];
44
+ }
45
+ });
46
+ }
47
+
48
+ // Create a new MapLibre-gl instance
49
+ const renderMap = new Map({
50
+ container: container,
51
+ center: options.map.map.getCenter(),
52
+ zoom: options.map.map.getZoom(),
53
+ bearing: 0,
54
+ pitch: 0,
55
+ interactive: false,
56
+ preserveDrawingBuffer: true,
57
+ fadeDuration: 0,
58
+ attributionControl: false,
59
+ style: style,
60
+ });
61
+
62
+ let _previewGeojson = turf.bboxPolygon([
63
+ options.bbox[0],
64
+ options.bbox[1],
65
+ options.bbox[2],
66
+ options.bbox[3],
67
+ ]);
68
+ _previewGeojson = turf.transformRotate(_previewGeojson, options.bearing);
69
+
70
+ // use original unrotated bbox and bearing 0 to calculate the correct zoom value as the function always adds a padding if used on the rotated feature coordinates
71
+ const bboxCamera = renderMap._cameraForBoxAndBearing(
72
+ [options.bboxUnrotated[0], options.bboxUnrotated[1]],
73
+ [options.bboxUnrotated[2], options.bboxUnrotated[3]],
74
+ 0
75
+ );
76
+ const geometryCamera = renderMap._cameraForBoxAndBearing(
77
+ _previewGeojson.geometry.coordinates[0][0] as LngLatLike,
78
+ _previewGeojson.geometry.coordinates[0][2] as LngLatLike,
79
+ options.bearing
80
+ );
81
+ geometryCamera.zoom = bboxCamera.zoom;
82
+
83
+ renderMap._fitInternal(geometryCamera);
84
+ return new Promise<createExportResolverParams>((resolve) => {
85
+ renderMap.once('idle', function () {
86
+ if (renderMap.getLayer('pdfPreviewGeojsonOutline')) {
87
+ renderMap.setLayoutProperty('pdfPreviewGeojsonOutline', 'visibility', 'none');
88
+ }
89
+ if (renderMap.getLayer('pdfPreviewGeojson')) {
90
+ renderMap.setLayoutProperty('pdfPreviewGeojson', 'visibility', 'none');
91
+ }
92
+ if (renderMap.getLayer('pdfPreviewGeojsonResizeHandle')) {
93
+ renderMap.setLayoutProperty('pdfPreviewGeojsonResizeHandle', 'visibility', 'none');
94
+ }
95
+ if (renderMap.getLayer('pdfPreviewGeojsonRotationHandle')) {
96
+ renderMap.setLayoutProperty('pdfPreviewGeojsonRotationHandle', 'visibility', 'none');
97
+ }
98
+
99
+ renderMap.once('idle', function () {
100
+ const params: createExportResolverParams = {
101
+ ...options,
102
+ renderMap,
103
+ hiddenContainer,
104
+ createPdf: (_options?: createJsPdfOptions) =>
105
+ createJsPdf({ ...options, renderMap, hiddenContainer, ..._options }),
106
+ };
107
+
108
+ resolve(params);
109
+ });
110
+ });
111
+ });
112
+ };
113
+
114
+ interface createExportResolverParams extends createExportOptions {
115
+ createPdf: (_options?: createJsPdfOptions) => Promise<createPdfResolverParams>;
116
+ renderMap: Map;
117
+ hiddenContainer: HTMLDivElement;
118
+ }
119
+ export type { createExportResolverParams };
120
+
121
+ interface createJsPdfOptions extends createExportOptions {
122
+ renderMap: Map;
123
+ hiddenContainer: HTMLDivElement;
124
+ }
125
+
126
+ export type { createJsPdfOptions };
127
+
128
+ function createJsPdf(options: createJsPdfOptions) {
129
+ const pdf = new jsPDF({
130
+ orientation: options?.orientation === 'portrait' ? 'p' : 'l',
131
+ unit: 'mm',
132
+ compress: true,
133
+ format: options.format,
134
+ });
135
+ Object.defineProperty(window, 'devicePixelRatio', {
136
+ get: function () {
137
+ return 300 / 96;
138
+ },
139
+ });
140
+
141
+ return new Promise<createPdfResolverParams>((resolve) => {
142
+ //Render map image
143
+ pdf.addImage(
144
+ options.renderMap.getCanvas().toDataURL('image/png'),
145
+ 'png',
146
+ 0,
147
+ 0,
148
+ pdf.internal.pageSize.getWidth(),
149
+ pdf.internal.pageSize.getHeight(),
150
+ undefined,
151
+ 'FAST'
152
+ );
153
+
154
+ // remove DOM Elements
155
+ options.renderMap.remove();
156
+ options.hiddenContainer.parentNode?.removeChild(options.hiddenContainer);
157
+
158
+ const params: createPdfResolverParams = {
159
+ ...options,
160
+ pdf,
161
+ downloadPdf: (_options?: downloadPdfOptions) => downloadPdf({ ...params, ..._options }),
162
+ };
163
+
164
+ resolve(params);
165
+ });
166
+ }
167
+
168
+ interface createPdfResolverParams extends createJsPdfOptions {
169
+ pdf: jsPDF;
170
+ downloadPdf: (_options?: downloadPdfOptions) => Promise<downloadPdfOptions>;
171
+ }
172
+
173
+ export type { createPdfResolverParams };
174
+
175
+ interface downloadPdfOptions extends createJsPdfOptions {
176
+ pdf: jsPDF;
177
+ }
178
+
179
+ function downloadPdf(options: downloadPdfOptions) {
180
+ options.pdf.save('Map.pdf');
181
+
182
+ return new Promise<downloadPdfOptions>(function (resolve) {
183
+ resolve({ ...options });
184
+ });
185
+ }
186
+
187
+ export { createExport };
@@ -8,198 +8,198 @@ import { mockMapLibreMethods } from "../setupTests";
8
8
  import useLayer from "./useLayer";
9
9
 
10
10
  const UseLayerTestComponent = (props) => {
11
- // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
12
- useLayer({
13
- mapId: props.mapId,
14
- layerId: props.layerId || "TestComponent",
15
- geojson: props.geojson,
16
- options: {
17
- paint: props.paint,
18
- layout: props.layout || {},
19
- type: props.type,
20
- ...props.options,
21
- },
22
- insertBeforeLayer: props.insertBeforeLayer,
23
- onHover: props.onHover,
24
- onClick: props.onClick,
25
- onLeave: props.onLeave,
26
- });
27
-
28
- return <></>;
11
+ // Use a useRef hook to reference the layer object to be able to access it later inside useEffect hooks
12
+ useLayer({
13
+ mapId: props.mapId,
14
+ layerId: props.layerId || "TestComponent",
15
+ geojson: props.geojson,
16
+ options: {
17
+ paint: props.paint,
18
+ layout: props.layout || {},
19
+ type: props.type,
20
+ ...props.options,
21
+ },
22
+ insertBeforeLayer: props.insertBeforeLayer,
23
+ onHover: props.onHover,
24
+ onClick: props.onClick,
25
+ onLeave: props.onLeave,
26
+ });
27
+
28
+ return <></>;
29
29
  };
30
30
 
31
31
  const TestComponent = (props) => {
32
- const [includeComponent, setIncludeComponent] = useState(true);
33
- const [testType, setTestType] = useState('line');
34
-
35
- return (
36
- <>
37
- <button
38
- className="change_testType"
39
- onClick={() => {
40
- setTestType('circle');
41
- }}
42
- >
43
- change type
44
- </button>
45
- <button
46
- className="toggle_includeComponent"
47
- onClick={() => {
48
- setIncludeComponent(!includeComponent);
49
- }}
50
- >
51
- toggle
52
- </button>
53
- {includeComponent && <UseLayerTestComponent {...props} type={testType} />}
54
- <MapLibreMap />
55
- </>
56
- );
32
+ const [includeComponent, setIncludeComponent] = useState(true);
33
+ const [testType, setTestType] = useState('line');
34
+
35
+ return (
36
+ <>
37
+ <button
38
+ className="change_testType"
39
+ onClick={() => {
40
+ setTestType('circle');
41
+ }}
42
+ >
43
+ change type
44
+ </button>
45
+ <button
46
+ className="toggle_includeComponent"
47
+ onClick={() => {
48
+ setIncludeComponent(!includeComponent);
49
+ }}
50
+ >
51
+ toggle
52
+ </button>
53
+ {includeComponent && <UseLayerTestComponent {...props} type={testType} />}
54
+ <MapLibreMap />
55
+ </>
56
+ );
57
57
  };
58
58
 
59
59
  describe("useLayer hook", () => {
60
- it("should register 1 event listener 'hover' to the maplibre instance", async () => {
61
- var testAttributes = {
62
- onHover: () => {},
63
- };
64
-
65
- const wrapper = mount(
66
- <MapComponentsProvider>
67
- <TestComponent {...testAttributes} />
68
- </MapComponentsProvider>
69
- );
70
-
71
- // MapLibreGlWrapper now subscribes to 4 events events on its own
72
- // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
73
- await waitFor(() => expect(mockMapLibreMethods.on).toHaveBeenCalledTimes(6));
74
- });
75
- it("should deregister 1 event listener 'hover' to the maplibre instance", async () => {
76
- var testAttributes = {
77
- onHover: () => {},
78
- };
79
-
80
- const wrapper = mount(
81
- <MapComponentsProvider>
82
- <TestComponent {...testAttributes} />
83
- </MapComponentsProvider>
84
- );
85
-
86
- wrapper.find(".toggle_includeComponent").simulate("click");
87
-
88
- // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
89
- await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
90
- });
91
- it("should register 1 event listener 'leave' to the maplibre instance", async () => {
92
- var testAttributes = {
93
- onLeave: () => {},
94
- };
95
-
96
- const wrapper = mount(
97
- <MapComponentsProvider>
98
- <TestComponent {...testAttributes} />
99
- </MapComponentsProvider>
100
- );
101
-
102
- // MapLibreGlWrapper now subscribes to 4 events events on its own
103
- // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
104
- await waitFor(() => expect(mockMapLibreMethods.on).toHaveBeenCalledTimes(6));
105
- });
106
- it("should deregister 1 event listener 'leave' to the maplibre instance", async () => {
107
- var testAttributes = {
108
- onLeave: () => {},
109
- };
110
-
111
- const wrapper = mount(
112
- <MapComponentsProvider>
113
- <TestComponent {...testAttributes} />
114
- </MapComponentsProvider>
115
- );
116
-
117
- wrapper.find(".toggle_includeComponent").simulate("click");
118
-
119
- // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
120
- await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
121
- });
122
-
123
-
124
- it("should register 1 event listener 'click' to the maplibre instance", async () => {
125
- var testAttributes = {
126
- onClick: () => {},
127
- };
128
-
129
- const wrapper = mount(
130
- <MapComponentsProvider>
131
- <TestComponent {...testAttributes} />
132
- </MapComponentsProvider>
133
- );
134
-
135
- // MapLibreGlWrapper now subscribes to 4 events events on its own
136
- // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
137
- await waitFor(() => expect(mockMapLibreMethods.on).toHaveBeenCalledTimes(6));
138
- });
139
- it("should deregister 1 event listener 'click' to the maplibre instance", async () => {
140
- var testAttributes = {
141
- onClick: () => {},
142
- };
143
-
144
- const wrapper = mount(
145
- <MapComponentsProvider>
146
- <TestComponent {...testAttributes} />
147
- </MapComponentsProvider>
148
- );
149
-
150
- wrapper.find(".toggle_includeComponent").simulate("click");
151
-
152
- // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
153
- await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
154
- });
155
-
156
- // if props.type is changed during runtime the hook needs to remove existing additions to the maplibre instance and reinitialize its representation in the maplibre instance
157
- it("should deregister 1 event listener 'hover' to the maplibre instance if type is changed during component runtime", async () => {
158
- var testAttributes = {
159
- onHover: () => {},
160
- };
161
-
162
- const wrapper = mount(
163
- <MapComponentsProvider>
164
- <TestComponent {...testAttributes} />
165
- </MapComponentsProvider>
166
- );
167
-
168
- wrapper.find(".change_testType").simulate("click");
169
-
170
- // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
171
- await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
172
- });
173
- it("should deregister 1 event listener 'hover' to the maplibre instance if type is changed during component runtime", async () => {
174
- var testAttributes = {
175
- onHover: () => {},
176
- };
177
-
178
- const wrapper = mount(
179
- <MapComponentsProvider>
180
- <TestComponent {...testAttributes} />
181
- </MapComponentsProvider>
182
- );
183
-
184
- wrapper.find(".change_testType").simulate("click");
185
-
186
- // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
187
- await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
188
- });
189
- it("should deregister 1 event listener 'click' to the maplibre instance if type is changed during component runtime", async () => {
190
- var testAttributes = {
191
- onClick: () => {},
192
- };
193
-
194
- const wrapper = mount(
195
- <MapComponentsProvider>
196
- <TestComponent {...testAttributes} />
197
- </MapComponentsProvider>
198
- );
199
-
200
- wrapper.find(".change_testType").simulate("click");
201
-
202
- // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
203
- await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
204
- });
60
+ it("should register 1 event listener 'hover' to the maplibre instance", async () => {
61
+ var testAttributes = {
62
+ onHover: () => {},
63
+ };
64
+
65
+ const wrapper = mount(
66
+ <MapComponentsProvider>
67
+ <TestComponent {...testAttributes} />
68
+ </MapComponentsProvider>
69
+ );
70
+
71
+ // MapLibreGlWrapper now subscribes to 4 events events on its own
72
+ // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
73
+ await waitFor(() => expect(mockMapLibreMethods.on).toHaveBeenCalledTimes(6));
74
+ });
75
+ it("should deregister 1 event listener 'hover' to the maplibre instance", async () => {
76
+ var testAttributes = {
77
+ onHover: () => {},
78
+ };
79
+
80
+ const wrapper = mount(
81
+ <MapComponentsProvider>
82
+ <TestComponent {...testAttributes} />
83
+ </MapComponentsProvider>
84
+ );
85
+
86
+ wrapper.find(".toggle_includeComponent").simulate("click");
87
+
88
+ // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
89
+ await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
90
+ });
91
+ it("should register 1 event listener 'leave' to the maplibre instance", async () => {
92
+ var testAttributes = {
93
+ onLeave: () => {},
94
+ };
95
+
96
+ const wrapper = mount(
97
+ <MapComponentsProvider>
98
+ <TestComponent {...testAttributes} />
99
+ </MapComponentsProvider>
100
+ );
101
+
102
+ // MapLibreGlWrapper now subscribes to 4 events events on its own
103
+ // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
104
+ await waitFor(() => expect(mockMapLibreMethods.on).toHaveBeenCalledTimes(6));
105
+ });
106
+ it("should deregister 1 event listener 'leave' to the maplibre instance", async () => {
107
+ var testAttributes = {
108
+ onLeave: () => {},
109
+ };
110
+
111
+ const wrapper = mount(
112
+ <MapComponentsProvider>
113
+ <TestComponent {...testAttributes} />
114
+ </MapComponentsProvider>
115
+ );
116
+
117
+ wrapper.find(".toggle_includeComponent").simulate("click");
118
+
119
+ // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
120
+ await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
121
+ });
122
+
123
+
124
+ it("should register 1 event listener 'click' to the maplibre instance", async () => {
125
+ var testAttributes = {
126
+ onClick: () => {},
127
+ };
128
+
129
+ const wrapper = mount(
130
+ <MapComponentsProvider>
131
+ <TestComponent {...testAttributes} />
132
+ </MapComponentsProvider>
133
+ );
134
+
135
+ // MapLibreGlWrapper now subscribes to 4 events events on its own
136
+ // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
137
+ await waitFor(() => expect(mockMapLibreMethods.on).toHaveBeenCalledTimes(6));
138
+ });
139
+ it("should deregister 1 event listener 'click' to the maplibre instance", async () => {
140
+ var testAttributes = {
141
+ onClick: () => {},
142
+ };
143
+
144
+ const wrapper = mount(
145
+ <MapComponentsProvider>
146
+ <TestComponent {...testAttributes} />
147
+ </MapComponentsProvider>
148
+ );
149
+
150
+ wrapper.find(".toggle_includeComponent").simulate("click");
151
+
152
+ // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
153
+ await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
154
+ });
155
+
156
+ // if props.type is changed during runtime the hook needs to remove existing additions to the maplibre instance and reinitialize its representation in the maplibre instance
157
+ it("should deregister 1 event listener 'hover' to the maplibre instance if type is changed during component runtime", async () => {
158
+ var testAttributes = {
159
+ onHover: () => {},
160
+ };
161
+
162
+ const wrapper = mount(
163
+ <MapComponentsProvider>
164
+ <TestComponent {...testAttributes} />
165
+ </MapComponentsProvider>
166
+ );
167
+
168
+ wrapper.find(".change_testType").simulate("click");
169
+
170
+ // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
171
+ await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
172
+ });
173
+ it("should deregister 1 event listener 'hover' to the maplibre instance if type is changed during component runtime", async () => {
174
+ var testAttributes = {
175
+ onHover: () => {},
176
+ };
177
+
178
+ const wrapper = mount(
179
+ <MapComponentsProvider>
180
+ <TestComponent {...testAttributes} />
181
+ </MapComponentsProvider>
182
+ );
183
+
184
+ wrapper.find(".change_testType").simulate("click");
185
+
186
+ // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
187
+ await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
188
+ });
189
+ it("should deregister 1 event listener 'click' to the maplibre instance if type is changed during component runtime", async () => {
190
+ var testAttributes = {
191
+ onClick: () => {},
192
+ };
193
+
194
+ const wrapper = mount(
195
+ <MapComponentsProvider>
196
+ <TestComponent {...testAttributes} />
197
+ </MapComponentsProvider>
198
+ );
199
+
200
+ wrapper.find(".change_testType").simulate("click");
201
+
202
+ // useLayer always subscribes to 'styledata' to watch whether its representation within the maplibre instance has been removed
203
+ await waitFor(() => expect(mockMapLibreMethods.off).toHaveBeenCalledTimes(2));
204
+ });
205
205
  });