@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
@@ -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
  });