@mapcomponents/react-maplibre 0.1.62 → 0.1.64

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 (340) hide show
  1. package/.babelrc +21 -2
  2. package/.editorconfig +1 -1
  3. package/.eslintrc.js +11 -1
  4. package/.github/workflows/check-catalogue-metadata-schema.yml +19 -0
  5. package/.storybook/main.js +0 -1
  6. package/.storybook/preview.js +0 -2
  7. package/CHANGELOG.md +43 -0
  8. package/coverage/clover.xml +864 -1037
  9. package/coverage/coverage-final.json +32 -21
  10. package/coverage/lcov-report/favicon.png +0 -0
  11. package/coverage/lcov-report/index.html +170 -95
  12. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  13. package/coverage/lcov-report/src/components/MapLibreMap/MapLibreMap.tsx.html +24 -24
  14. package/coverage/lcov-report/src/components/MapLibreMap/index.html +1 -1
  15. package/coverage/lcov-report/src/components/MlCenterPosition/MlCenterPosition.tsx.html +5 -5
  16. package/coverage/lcov-report/src/components/MlCenterPosition/index.html +1 -1
  17. package/coverage/lcov-report/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx.html +2 -2
  18. package/coverage/lcov-report/src/components/MlCreatePdfButton/index.html +1 -1
  19. package/coverage/lcov-report/src/components/MlCreatePdfForm/MlCreatePdfForm.cy.tsx.html +148 -0
  20. package/coverage/lcov-report/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx.html +1 -1
  21. package/coverage/lcov-report/src/components/MlCreatePdfForm/index.html +22 -7
  22. package/coverage/lcov-report/src/components/MlFeatureEditor/MlFeatureEditor.tsx.html +72 -42
  23. package/coverage/lcov-report/src/components/MlFeatureEditor/index.html +15 -15
  24. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.tsx.html +1 -1
  25. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/index.html +1 -1
  26. package/coverage/lcov-report/src/components/MlFollowGps/MlFollowGps.tsx.html +1 -1
  27. package/coverage/lcov-report/src/components/MlFollowGps/index.html +1 -1
  28. package/coverage/lcov-report/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx.html +86 -35
  29. package/coverage/lcov-report/src/components/MlGeoJsonLayer/index.html +1 -1
  30. package/coverage/lcov-report/src/components/{MlSpatialElevationProfile/MlSpatialElevationProfile.js.html → MlGeoJsonLayer/story_utils/MlGeoJsonLayer.lineStyler.js.html} +215 -320
  31. package/coverage/lcov-report/src/components/MlGeoJsonLayer/story_utils/MlGeoJsonLayer.polygonStyler.js.html +649 -0
  32. package/coverage/lcov-report/src/components/MlGeoJsonLayer/story_utils/MlGeojsonLayerCircleStyler.tsx.html +112 -0
  33. package/coverage/lcov-report/src/components/MlGeoJsonLayer/story_utils/MlGeojsonLayerHeatMapStyler.tsx.html +115 -0
  34. package/coverage/lcov-report/src/components/MlGeoJsonLayer/story_utils/index.html +161 -0
  35. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.tsx.html +1 -1
  36. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/index.html +1 -1
  37. package/coverage/lcov-report/src/components/MlGpxViewer/MlGpxViewer.tsx.html +394 -0
  38. package/coverage/lcov-report/src/components/MlGpxViewer/index.html +116 -0
  39. package/coverage/lcov-report/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx.html +63 -285
  40. package/coverage/lcov-report/src/components/MlImageMarkerLayer/index.html +21 -21
  41. package/coverage/lcov-report/src/components/MlLayer/MlLayer.tsx.html +1 -1
  42. package/coverage/lcov-report/src/components/MlLayer/index.html +1 -1
  43. package/coverage/lcov-report/src/components/MlLayerMagnify/MlLayerMagnify.tsx.html +58 -76
  44. package/coverage/lcov-report/src/components/MlLayerMagnify/index.html +1 -1
  45. package/coverage/lcov-report/src/components/MlLayerSwipe/MlLayerSwipe.tsx.html +58 -61
  46. package/coverage/lcov-report/src/components/MlLayerSwipe/index.html +11 -11
  47. package/coverage/lcov-report/src/components/MlLayerSwitcher/MlLayerSwitcher.js.html +1 -1
  48. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/LayerBox.js.html +30 -21
  49. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/index.html +1 -1
  50. package/coverage/lcov-report/src/components/MlLayerSwitcher/index.html +1 -1
  51. package/coverage/lcov-report/src/components/MlMarker/MlMarker.tsx.html +1 -1
  52. package/coverage/lcov-report/src/components/MlMarker/index.html +1 -1
  53. package/coverage/lcov-report/src/components/MlMeasureTool/MlMeasureTool.tsx.html +1 -1
  54. package/coverage/lcov-report/src/components/MlMeasureTool/index.html +1 -1
  55. package/coverage/lcov-report/src/components/MlNavigationCompass/MlNavigationCompass.tsx.html +1 -1
  56. package/coverage/lcov-report/src/components/MlNavigationCompass/index.html +1 -1
  57. package/coverage/lcov-report/src/components/MlNavigationTools/MlNavigationTools.tsx.html +1 -1
  58. package/coverage/lcov-report/src/components/MlNavigationTools/index.html +1 -1
  59. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.js.html +1 -1
  60. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.stories_.js.html +1 -1
  61. package/coverage/lcov-report/src/components/MlOsmLayer/index.html +1 -1
  62. package/coverage/lcov-report/src/components/MlScaleReference/MlScaleReference.js.html +1 -1
  63. package/coverage/lcov-report/src/components/MlScaleReference/index.html +1 -1
  64. package/coverage/lcov-report/src/components/MlShareMapState/MlShareMapState.js.html +1 -1
  65. package/coverage/lcov-report/src/components/MlShareMapState/index.html +1 -1
  66. package/coverage/lcov-report/src/components/MlSketchTool/LayerList/ColorPicker.tsx.html +214 -0
  67. package/coverage/lcov-report/src/components/MlSketchTool/LayerList/LayerList.tsx.html +121 -0
  68. package/coverage/lcov-report/src/components/MlSketchTool/LayerList/LayerListItem.tsx.html +412 -0
  69. package/coverage/lcov-report/src/components/MlSketchTool/LayerList/LayerPropertyForm.tsx.html +463 -0
  70. package/coverage/lcov-report/src/components/MlSketchTool/LayerList/index.html +161 -0
  71. package/coverage/lcov-report/src/components/{MlGPXViewer/MlGPXViewer.tsx.html → MlSketchTool/MlSketchTool.tsx.html} +271 -589
  72. package/coverage/lcov-report/src/components/{MlGPXViewer → MlSketchTool}/index.html +22 -37
  73. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.tsx.html +514 -0
  74. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/index.html +21 -21
  75. package/coverage/lcov-report/src/components/MlThreeJsLayer/MlThreeJsLayer.js.html +1 -1
  76. package/coverage/lcov-report/src/components/MlThreeJsLayer/index.html +1 -1
  77. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx.html +20 -206
  78. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/index.html +1 -1
  79. package/coverage/lcov-report/src/components/MlUseMapDebugger/MlUseMapDebugger.js.html +1 -1
  80. package/coverage/lcov-report/src/components/MlUseMapDebugger/index.html +1 -1
  81. package/coverage/lcov-report/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx.html +10 -7
  82. package/coverage/lcov-report/src/components/MlVectorTileLayer/index.html +5 -5
  83. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js.html +1 -1
  84. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/index.html +1 -1
  85. package/coverage/lcov-report/src/components/MlWmsLayer/MlWmsLayer.tsx.html +111 -57
  86. package/coverage/lcov-report/src/components/MlWmsLayer/index.html +19 -19
  87. package/coverage/lcov-report/src/components/MlWmsLoader/MlWmsLoader.tsx.html +201 -144
  88. package/coverage/lcov-report/src/components/MlWmsLoader/index.html +9 -9
  89. package/coverage/lcov-report/src/contexts/MapContext.tsx.html +23 -23
  90. package/coverage/lcov-report/src/contexts/SimpleDataContext.js.html +1 -1
  91. package/coverage/lcov-report/src/contexts/SimpleDataProvider.js.html +1 -1
  92. package/coverage/lcov-report/src/contexts/index.html +1 -1
  93. package/coverage/lcov-report/src/hooks/index.html +50 -50
  94. package/coverage/lcov-report/src/hooks/useCameraFollowPath/index.html +1 -1
  95. package/coverage/lcov-report/src/hooks/useCameraFollowPath/useCameraFollowPath.tsx.html +1 -1
  96. package/coverage/lcov-report/src/hooks/useExportMap/index.html +1 -1
  97. package/coverage/lcov-report/src/hooks/useExportMap/index.ts.html +1 -1
  98. package/coverage/lcov-report/src/hooks/useExportMap/lib.ts.html +1 -1
  99. package/coverage/lcov-report/src/hooks/useGpx/index.html +116 -0
  100. package/coverage/lcov-report/src/hooks/useGpx/useGpx.tsx.html +295 -0
  101. package/coverage/lcov-report/src/hooks/useLayer.ts.html +132 -66
  102. package/coverage/lcov-report/src/hooks/useLayerEvent.js.html +1 -1
  103. package/coverage/lcov-report/src/hooks/useLayerHoverPopup/index.html +116 -0
  104. package/coverage/lcov-report/src/hooks/useLayerHoverPopup/useLayerHoverPopup.tsx.html +331 -0
  105. package/coverage/lcov-report/src/hooks/useMap.ts.html +47 -47
  106. package/coverage/lcov-report/src/hooks/useMapState.ts.html +54 -54
  107. package/coverage/lcov-report/src/hooks/useSource.ts.html +57 -57
  108. package/coverage/lcov-report/src/hooks/{useWms.js.html → useWms.ts.html} +54 -15
  109. package/coverage/lcov-report/src/index.html +1 -1
  110. package/coverage/lcov-report/src/index.ts.html +6 -6
  111. package/coverage/lcov.info +1724 -1974
  112. package/cypress/support/commands.ts +37 -0
  113. package/cypress/support/component-index.html +12 -0
  114. package/cypress/support/component.ts +46 -0
  115. package/cypress.config.ts +101 -0
  116. package/dist/components/MapLibreMap/MapLibreMap.d.ts +1 -1
  117. package/dist/components/MapLibreMap/lib/MapLibreGlWrapper.d.ts +53 -27
  118. package/dist/components/MlCenterPosition/MlCenterPosition.d.ts +3 -2
  119. package/dist/components/MlCenterPosition/MlCenterPosition.stories.d.ts +35 -16
  120. package/dist/components/MlComponentTemplate/MlComponentTemplate.d.ts +1 -1
  121. package/dist/components/MlComponentTemplate/MlComponentTemplate.stories.d.ts +12 -9
  122. package/dist/components/MlCreatePdfButton/MlCreatePdfButton.d.ts +1 -1
  123. package/dist/components/MlCreatePdfButton/MlCreatePdfButton.stories.d.ts +12 -9
  124. package/dist/components/MlCreatePdfForm/MlCreatePdfForm.cy.d.ts +1 -0
  125. package/dist/components/MlCreatePdfForm/lib/PdfPreview.d.ts +1 -1
  126. package/dist/components/MlFeatureEditor/MlFeatureEditor.d.ts +10 -4
  127. package/dist/components/MlFeatureEditor/lib/double_click_zoom.d.ts +0 -2
  128. package/dist/components/MlFeatureEditor/lib/theme.d.ts +1 -1
  129. package/dist/components/MlGeoJsonLayer/MlGeoJsonLayer.d.ts +23 -12
  130. package/dist/components/MlGeoJsonLayer/MlGeoJsonLayer.stories.d.ts +12 -11
  131. package/dist/components/MlGeoJsonLayer/story_utils/MlGeoJsonLayer.lineStyler.d.ts +2 -0
  132. package/dist/components/MlGeoJsonLayer/story_utils/MlGeoJsonLayer.polygonStyler.d.ts +2 -0
  133. package/dist/components/MlGeoJsonLayer/story_utils/MlGeojsonLayerCircleStyler.d.ts +3 -0
  134. package/dist/components/MlGeoJsonLayer/story_utils/MlGeojsonLayerHeatMapStyler.d.ts +3 -0
  135. package/dist/components/MlGpxViewer/MlGpxViewer.d.ts +30 -0
  136. package/dist/components/MlGpxViewer/MlGpxViewer.stories.d.ts +17 -0
  137. package/dist/components/MlGpxViewer/MlGpxViewer.test.d.ts +1 -0
  138. package/dist/components/MlGpxViewer/util/GeoJsonContext.d.ts +10 -0
  139. package/dist/components/MlGpxViewer/util/GeoJsonProvider.d.ts +4 -0
  140. package/dist/components/MlGpxViewer/util/MetadataDrawer.d.ts +7 -0
  141. package/dist/components/MlGpxViewer/util/MlGpxDemoLoader.d.ts +10 -0
  142. package/dist/components/MlGpxViewer/util/MlGpxViewerInstructions.d.ts +3 -0
  143. package/dist/components/MlImageMarkerLayer/MlImageMarkerLayer.d.ts +11 -2
  144. package/dist/components/MlImageMarkerLayer/MlImageMarkerLayer.stories.d.ts +7 -9
  145. package/dist/components/MlLayerMagnify/MlLayerMagnify.d.ts +8 -2
  146. package/dist/components/MlLayerMagnify/MlLayerMagnify.stories.d.ts +13 -9
  147. package/dist/components/MlLayerSwipe/MlLayerSwipe.d.ts +13 -3
  148. package/dist/components/MlLayerSwipe/MlLayerSwipe.stories.d.ts +12 -10
  149. package/dist/components/MlSketchTool/LayerList/ColorPicker.d.ts +9 -0
  150. package/dist/components/MlSketchTool/LayerList/LayerList.d.ts +5 -0
  151. package/dist/components/MlSketchTool/LayerList/LayerListItem.d.ts +11 -0
  152. package/dist/components/MlSketchTool/LayerList/LayerPropertyForm.d.ts +9 -0
  153. package/dist/components/MlSketchTool/MlSketchTool.d.ts +29 -0
  154. package/dist/components/MlSketchTool/MlSketchTool.stories.d.ts +10 -0
  155. package/dist/components/MlSpatialElevationProfile/MlSpatialElevationProfile.d.ts +33 -14
  156. package/dist/components/MlSpatialElevationProfile/MlSpatialElevationProfile.stories.d.ts +18 -15
  157. package/dist/components/MlSpatialElevationProfile/util/getElevationData.d.ts +14 -0
  158. package/dist/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.d.ts +3 -67
  159. package/dist/components/MlWmsLayer/MlWmsLayer.d.ts +7 -4
  160. package/dist/components/MlWmsLoader/MlWmsLoader.d.ts +17 -10
  161. package/dist/components/MlWmsLoader/MlWmsLoader.stories.d.ts +23 -12
  162. package/dist/components/MlWmsLoader/utils/MlWmsLoaderInstructions.d.ts +3 -0
  163. package/dist/components/MlWmsLoader/utils/WMSLinks.d.ts +6 -0
  164. package/dist/contexts/SimpleDataProvider.d.ts +1 -1
  165. package/dist/custom.d.d.ts +1 -1
  166. package/dist/decorators/ThemeWrapper.d.ts +3 -1
  167. package/dist/hooks/useGpx/lib/gpxConverter.d.ts +11 -0
  168. package/dist/hooks/useGpx/useGpx.d.ts +26 -0
  169. package/dist/hooks/useGpx/useGpx.stories.d.ts +10 -0
  170. package/dist/hooks/useLayer.d.ts +14 -8
  171. package/dist/hooks/useLayerHoverPopup/useLayerHoverPopup.d.ts +23 -0
  172. package/dist/hooks/useLayerHoverPopup/useLayerHoverPopup.stories.d.ts +10 -0
  173. package/dist/hooks/useMap.d.ts +2 -2
  174. package/dist/hooks/useMap.test.d.ts +1 -0
  175. package/dist/hooks/useMapState.d.ts +3 -3
  176. package/dist/hooks/useSource.d.ts +3 -3
  177. package/dist/hooks/useWms.d.ts +24 -16
  178. package/dist/index.d.ts +5 -5
  179. package/dist/index.esm.css +1 -1
  180. package/dist/index.esm.js +9327 -14844
  181. package/dist/index.esm.js.map +1 -1
  182. package/dist/setupTests.d.ts +6 -5
  183. package/dist/ui_components/Dropzone.d.ts +5 -0
  184. package/dist/ui_components/ImageLoader.d.ts +8 -1
  185. package/dist/ui_components/LoadingOverlayContext.d.ts +11 -11
  186. package/dist/ui_components/Sidebar.d.ts +10 -1
  187. package/dist/ui_components/Tooltip.d.ts +1 -1
  188. package/dist/ui_components/TopToolbar.d.ts +7 -1
  189. package/dist/ui_components/UploadButton.d.ts +6 -0
  190. package/dist/util/BubbleForInstructions.d.ts +2 -0
  191. package/dist/util/Instructions.d.ts +13 -0
  192. package/package.json +195 -185
  193. package/public/assets/sample1.gpx +3003 -0
  194. package/public/assets/sample2.gpx +1264 -0
  195. package/public/assets/sample3.gpx +912 -0
  196. package/{src/components/MlImageMarkerLayer → public}/assets/wg-marker.png +0 -0
  197. package/public/index.html +0 -4
  198. package/public/thumbnails/MlSketchTool.png +0 -0
  199. package/public/thumbnails/useCameraFollowPath.png +0 -0
  200. package/scripts/build-catalogue-meta.js +35 -11
  201. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.ts +230 -188
  202. package/src/components/MlCenterPosition/MlCenterPosition.meta_.json +1 -2
  203. package/src/components/MlCenterPosition/MlCenterPosition.stories.tsx +20 -0
  204. package/src/components/MlCenterPosition/MlCenterPosition.tsx +4 -4
  205. package/src/components/MlComponentTemplate/MlComponentTemplate.meta_.json +1 -2
  206. package/src/components/MlComponentTemplate/{MlComponentTemplate.stories.js → MlComponentTemplate.stories.tsx} +2 -2
  207. package/src/components/MlComponentTemplate/MlComponentTemplate.tsx +1 -1
  208. package/src/components/MlCreatePdfButton/MlCreatePdfButton.meta_.json +1 -2
  209. package/src/components/MlCreatePdfButton/{MlCreatePdfButton.stories.js → MlCreatePdfButton.stories.tsx} +1 -1
  210. package/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx +1 -1
  211. package/src/components/MlCreatePdfForm/MlCreatePdfForm.cy.tsx +21 -0
  212. package/src/components/MlCreatePdfForm/MlCreatePdfForm.meta.json +1 -2
  213. package/src/components/MlCreatePdfForm/MlCreatePdfForm.stories.tsx +1 -3
  214. package/src/components/MlCreatePdfForm/lib/PdfForm.tsx +25 -2
  215. package/src/components/MlFeatureEditor/MlFeatureEditor.meta.json +2 -3
  216. package/src/components/MlFeatureEditor/MlFeatureEditor.tsx +39 -29
  217. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.meta.json +1 -2
  218. package/src/components/MlFollowGps/MlFollowGps.meta.json +1 -2
  219. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.meta.json +1 -2
  220. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.stories.tsx +191 -0
  221. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx +47 -30
  222. package/src/components/MlGeoJsonLayer/assets/earthquake.json +109937 -0
  223. package/src/components/MlGeoJsonLayer/assets/sample_1.json +138 -24
  224. package/src/components/MlGeoJsonLayer/assets/sample_2.json +140 -20
  225. package/src/components/MlGeoJsonLayer/assets/wg_locations.json +65 -0
  226. package/src/components/MlGeoJsonLayer/story_utils/MlGeoJsonLayer.lineStyler.js +189 -0
  227. package/src/components/MlGeoJsonLayer/story_utils/MlGeoJsonLayer.polygonStyler.js +188 -0
  228. package/src/components/MlGeoJsonLayer/story_utils/MlGeojsonLayerCircleStyler.tsx +9 -0
  229. package/src/components/MlGeoJsonLayer/story_utils/MlGeojsonLayerHeatMapStyler.tsx +10 -0
  230. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.meta_.json +1 -2
  231. package/src/components/{MlGPXViewer/MlGPXViewer.doc.de.md → MlGpxViewer/MlGpxViewer.doc.de.md} +0 -0
  232. package/src/components/{MlGPXViewer/MlGPXViewer.doc.en.md → MlGpxViewer/MlGpxViewer.doc.en.md} +0 -0
  233. package/src/components/{MlGPXViewer/MlGPXViewer.meta.json → MlGpxViewer/MlGpxViewer.meta.json} +2 -3
  234. package/src/components/MlGpxViewer/MlGpxViewer.stories.tsx +109 -0
  235. package/src/components/MlGpxViewer/MlGpxViewer.test.js +53 -0
  236. package/src/components/MlGpxViewer/MlGpxViewer.tsx +103 -0
  237. package/src/components/{MlGPXViewer → MlGpxViewer}/util/GeoJsonContext.ts +0 -0
  238. package/src/components/{MlGPXViewer → MlGpxViewer}/util/GeoJsonProvider.tsx +0 -0
  239. package/src/components/MlGpxViewer/util/MetadataDrawer.tsx +38 -0
  240. package/src/components/MlGpxViewer/util/MlGpxDemoLoader.tsx +128 -0
  241. package/src/components/MlGpxViewer/util/MlGpxViewerInstructions.tsx +68 -0
  242. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.meta_.json +1 -2
  243. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.stories.tsx +41 -0
  244. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.test.js +27 -8
  245. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx +41 -115
  246. package/src/components/MlLayer/MlLayer.meta_.json +1 -2
  247. package/src/components/MlLayerMagnify/MlLayerMagnify.meta.json +1 -2
  248. package/src/components/MlLayerMagnify/MlLayerMagnify.stories.tsx +44 -0
  249. package/src/components/MlLayerMagnify/{MlLayerMagnify.test.js → MlLayerMagnify.test.tsx} +15 -18
  250. package/src/components/MlLayerMagnify/MlLayerMagnify.tsx +55 -61
  251. package/src/components/MlLayerSwipe/MlLayerSwipe.meta.json +1 -2
  252. package/src/components/MlLayerSwipe/{MlLayerSwipe.stories.js → MlLayerSwipe.stories.tsx} +9 -11
  253. package/src/components/MlLayerSwipe/MlLayerSwipe.tsx +47 -48
  254. package/src/components/MlLayerSwitcher/MlLayerSwitcher.meta_.json +1 -2
  255. package/src/components/MlLayerSwitcher/components/LayerBox.js +22 -19
  256. package/src/components/MlMarker/MlMarker.meta_.json +1 -2
  257. package/src/components/MlMeasureTool/MlMeasureTool.meta.json +1 -2
  258. package/src/components/MlNavigationCompass/MlNavigationCompass.meta.json +1 -2
  259. package/src/components/MlNavigationTools/MlNavigationTools.meta.json +1 -2
  260. package/src/components/MlScaleReference/MlScaleReference.meta.json +1 -2
  261. package/src/components/MlShareMapState/MlShareMapState.meta_.json +1 -2
  262. package/src/components/MlSketchTool/LayerList/ColorPicker.tsx +43 -0
  263. package/src/components/MlSketchTool/LayerList/LayerList.tsx +12 -0
  264. package/src/components/MlSketchTool/LayerList/LayerListItem.tsx +109 -0
  265. package/src/components/MlSketchTool/LayerList/LayerPropertyForm.tsx +126 -0
  266. package/src/components/MlSketchTool/MlSketchTool.doc.de.md +3 -0
  267. package/src/components/MlSketchTool/MlSketchTool.meta.json +14 -0
  268. package/src/components/MlSketchTool/MlSketchTool.stories.js +26 -0
  269. package/src/components/MlSketchTool/MlSketchTool.tsx +271 -0
  270. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.meta.json +1 -2
  271. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.stories.tsx +121 -0
  272. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.test.js +30 -1
  273. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.tsx +143 -0
  274. package/src/components/MlSpatialElevationProfile/util/getElevationData.tsx +103 -0
  275. package/src/components/MlThreeJsLayer/MlThreeJsLayer.meta.json +1 -2
  276. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.meta.json +3 -4
  277. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.stories.js +2 -3
  278. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx +17 -79
  279. package/src/components/MlUseMapDebugger/MlUseMapDebugger.meta_.json +1 -2
  280. package/src/components/MlVectorTileLayer/MlVectorTileLayer.meta.json +1 -2
  281. package/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx +3 -2
  282. package/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.meta_.json +1 -2
  283. package/src/components/MlWmsLayer/MlWmsLayer.tsx +59 -41
  284. package/src/components/MlWmsLoader/MlWmsLoader.meta.json +1 -2
  285. package/src/components/MlWmsLoader/MlWmsLoader.stories.tsx +89 -0
  286. package/src/components/MlWmsLoader/MlWmsLoader.tsx +141 -122
  287. package/src/components/MlWmsLoader/utils/MlWmsLoaderInstructions.tsx +50 -0
  288. package/src/components/MlWmsLoader/utils/WMSLinks.tsx +128 -0
  289. package/src/decorators/MapContextDecorator.js +1 -1
  290. package/src/decorators/MapContextDecoratorHooks.js +1 -1
  291. package/src/decorators/ThemeWrapper.tsx +9 -0
  292. package/src/hooks/useCameraFollowPath/useCameraFollowPath.meta.json +1 -2
  293. package/src/{components/MlGPXViewer → hooks/useGpx/lib}/gpxConverter.js +1 -0
  294. package/src/hooks/useGpx/useGpx.doc.de.md +3 -0
  295. package/src/hooks/useGpx/useGpx.meta_.json +15 -0
  296. package/src/{components/MlCenterPosition/MlCenterPosition.stories.js → hooks/useGpx/useGpx.stories.js} +4 -5
  297. package/src/hooks/useGpx/useGpx.tsx +70 -0
  298. package/src/hooks/useLayer.ts +32 -10
  299. package/src/hooks/useLayerHoverPopup/useLayerHoverPopup.doc.de.md +3 -0
  300. package/src/hooks/useLayerHoverPopup/useLayerHoverPopup.meta_.json +15 -0
  301. package/src/hooks/useLayerHoverPopup/useLayerHoverPopup.stories.js +20 -0
  302. package/src/hooks/useLayerHoverPopup/useLayerHoverPopup.tsx +82 -0
  303. package/src/hooks/useMap.test.tsx +48 -0
  304. package/src/hooks/useMap.ts +8 -8
  305. package/src/hooks/useSource.ts +4 -4
  306. package/src/hooks/{useWms.js → useWms.ts} +24 -11
  307. package/src/index.ts +5 -5
  308. package/src/setupTests.js +18 -15
  309. package/src/ui_components/Dropzone.tsx +104 -0
  310. package/src/ui_components/{ImageLoader.js → ImageLoader.tsx} +30 -25
  311. package/src/ui_components/{LoadingOverlayContext.js → LoadingOverlayContext.tsx} +12 -15
  312. package/src/ui_components/Sidebar.tsx +82 -0
  313. package/src/ui_components/Tooltip.tsx +17 -0
  314. package/src/ui_components/TopToolbar.tsx +26 -0
  315. package/src/ui_components/UploadButton.tsx +57 -0
  316. package/src/util/BubbleForInstructions.js +46 -0
  317. package/src/util/Instructions.tsx +60 -0
  318. package/tsconfig.json +39 -58
  319. package/config/getHttpsConfig.js +0 -66
  320. package/config/modules.js +0 -134
  321. package/config/pnpTs.js +0 -35
  322. package/config/webpack.config.js +0 -757
  323. package/config/webpackDevServer.config.js +0 -130
  324. package/coverage/lcov-report/src/components/MlGPXViewer/gpxConverter.js.html +0 -1645
  325. package/scripts/start.js +0 -166
  326. package/src/components/MlGPXViewer/MlGPXViewer.stories.js +0 -31
  327. package/src/components/MlGPXViewer/MlGPXViewer.test.js +0 -28
  328. package/src/components/MlGPXViewer/MlGPXViewer.tsx +0 -377
  329. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.stories.js +0 -66
  330. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.stories.js +0 -45
  331. package/src/components/MlLayerMagnify/MlLayerMagnify.stories.js +0 -41
  332. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js +0 -224
  333. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.stories.js +0 -57
  334. package/src/components/MlWmsLoader/MlWmsLoader.stories.js +0 -47
  335. package/src/decorators/ThemeWrapper.jsx +0 -9
  336. package/src/ui_components/Legend.js +0 -44
  337. package/src/ui_components/LoadingOverlay.js +0 -41
  338. package/src/ui_components/Sidebar.js +0 -100
  339. package/src/ui_components/Tooltip.js +0 -21
  340. package/src/ui_components/TopToolbar.js +0 -29
@@ -0,0 +1,109 @@
1
+ import { Checkbox, IconButton, ListItem, ListItemIcon, ListItemText } from '@mui/material';
2
+ import TuneIcon from '@mui/icons-material/Tune';
3
+ import React, { useMemo, useState } from 'react';
4
+ import getDefaulLayerTypeByGeometry from '../../../components/MlGeoJsonLayer/util/getDefaultLayerTypeByGeometry';
5
+ import getDefaultPaintPropsByType from '../../../components/MlGeoJsonLayer/util/getDefaultPaintPropsByType';
6
+ import LayerPropertyForm from './LayerPropertyForm';
7
+
8
+ type Props = {
9
+ layerComponent: JSX.Element;
10
+ visible: boolean;
11
+ configurable: boolean;
12
+ type?: 'background' | 'background-labels' | 'layer' | 'wms-layer' | 'vector-tile-layer';
13
+ name: string;
14
+ description?: string;
15
+ additionalButtons?: JSX.Element;
16
+ };
17
+
18
+ function LayerListItem({
19
+ layerComponent,
20
+ visible = true,
21
+ type = 'layer',
22
+ name,
23
+ description,
24
+ configurable,
25
+ }: Props) {
26
+ const [localVisible, setLocalVisible] = useState(true);
27
+ const [paintPropsFormVisible, setPaintPropsFormVisible] = useState(false);
28
+ const [paintProps, setPaintProps] = useState(
29
+ layerComponent?.props?.paint ||
30
+ getDefaultPaintPropsByType(
31
+ layerComponent?.props?.type || getDefaulLayerTypeByGeometry(layerComponent.props.geojson)
32
+ )
33
+ );
34
+
35
+ const _visible = useMemo(() => {
36
+ if (!visible) {
37
+ return false;
38
+ }
39
+ return localVisible;
40
+ }, [visible, localVisible]);
41
+
42
+ const _layerComponent = useMemo(() => {
43
+ if (type === 'layer') {
44
+ return React.cloneElement(layerComponent, {
45
+ layout: {
46
+ visibility: _visible ? 'visible' : 'none',
47
+ },
48
+ paint: paintProps,
49
+ });
50
+ }
51
+ return <></>;
52
+ }, [type, layerComponent, paintProps, _visible]);
53
+
54
+ const layerType = useMemo(() => {
55
+ if (type === 'layer') {
56
+ if (layerComponent.props.type) {
57
+ return layerComponent.props.type;
58
+ }
59
+ if (layerComponent.props.geojson) {
60
+ return getDefaulLayerTypeByGeometry(layerComponent.props.geojson);
61
+ }
62
+ }
63
+
64
+ return undefined;
65
+ }, [layerComponent]);
66
+
67
+ return (
68
+ <>
69
+ <ListItem
70
+ secondaryAction={
71
+ configurable ? (
72
+ <IconButton
73
+ edge="end"
74
+ aria-label="comments"
75
+ onClick={() => {
76
+ setPaintPropsFormVisible((current) => {
77
+ return !current;
78
+ });
79
+ }}
80
+ >
81
+ <TuneIcon />
82
+ </IconButton>
83
+ ) : undefined
84
+ }
85
+ >
86
+ <ListItemIcon>
87
+ <Checkbox
88
+ disabled={!visible}
89
+ checked={localVisible}
90
+ onClick={() => {
91
+ setLocalVisible((val) => !val);
92
+ }}
93
+ />
94
+ </ListItemIcon>
95
+ <ListItemText primary={name} secondary={description} />
96
+ {_layerComponent}
97
+ </ListItem>
98
+ {configurable && paintPropsFormVisible && (
99
+ <LayerPropertyForm
100
+ paintProps={paintProps}
101
+ setPaintProps={setPaintProps}
102
+ layerType={layerType}
103
+ />
104
+ )}
105
+ </>
106
+ );
107
+ }
108
+
109
+ export default LayerListItem;
@@ -0,0 +1,126 @@
1
+ import {
2
+ CircleLayerSpecification,
3
+ FillLayerSpecification,
4
+ LineLayerSpecification,
5
+ } from 'maplibre-gl';
6
+ import React, { useRef } from 'react';
7
+ import ColorPicker from './ColorPicker';
8
+ import { ListItem, Slider, TextField, Typography } from '@mui/material';
9
+ import { Box } from '@mui/system';
10
+
11
+ export type paintPropsType =
12
+ | CircleLayerSpecification['paint']
13
+ | FillLayerSpecification['paint']
14
+ | LineLayerSpecification['paint'];
15
+
16
+ type Props = {
17
+ paintProps: paintPropsType;
18
+ setPaintProps: (
19
+ paintProps: paintPropsType | ((current: paintPropsType) => paintPropsType)
20
+ ) => void;
21
+ layerType: string;
22
+ };
23
+
24
+ const mapLayerTypeToPaintProps = {
25
+ circle: ['circle-color'],
26
+ line: ['line-color', 'line-width', 'line-blur'],
27
+ fill: ['fill-color'],
28
+ };
29
+ const mapPropKeyToFormInputType = {
30
+ 'line-color': 'colorpicker',
31
+ 'line-width': 'slider',
32
+ 'line-blur': 'slider',
33
+ 'fill-color': 'colorpicker',
34
+ 'circle-color': 'colorpicker',
35
+ };
36
+ const mapPropKeyToFormInputTypeKeys = Object.keys(mapPropKeyToFormInputType);
37
+
38
+ const inputPropsByPropKey = {
39
+ 'line-blur': {
40
+ step: 1,
41
+ min: 1,
42
+ max: 100,
43
+ },
44
+ 'line-width': {
45
+ step: 1,
46
+ min: 1,
47
+ max: 100,
48
+ },
49
+ };
50
+
51
+ export default function LayerPropertyForm({ paintProps = {}, setPaintProps }: Props) {
52
+ const key = useRef(Math.round(Math.random() * 10000000000));
53
+ //const onChange = (event) => {};
54
+
55
+ const getFormInputByType = (key: string, value: any) => {
56
+ if (mapPropKeyToFormInputTypeKeys.indexOf(key) !== -1) {
57
+ const label = (
58
+ <Typography id={key + '_label'} gutterBottom>
59
+ {key}
60
+ </Typography>
61
+ );
62
+ switch (mapPropKeyToFormInputType[key]) {
63
+ case 'slider':
64
+ return (
65
+ <>
66
+ {label}
67
+ <Slider
68
+ {...inputPropsByPropKey[key]}
69
+ inputProps={{ inputMode: 'decimal', pattern: '[0-9]*' }}
70
+ value={paintProps[key]}
71
+ onChange={(ev: Event, value: number, activeThumb) => {
72
+ if (value) {
73
+ setPaintProps((current) => ({ ...current, [key]: value }));
74
+ }
75
+ }}
76
+ />
77
+ </>
78
+ );
79
+ break;
80
+ case 'numberfield':
81
+ return (
82
+ <>
83
+ {label}
84
+ <TextField
85
+ inputProps={{ inputMode: 'decimal', pattern: '[0-9]*' }}
86
+ value={paintProps[key]}
87
+ onChange={(ev: React.ChangeEvent) => {
88
+ if (ev?.target?.value) {
89
+ setPaintProps((current) => ({ ...current, [key]: parseInt(ev.target.value) }));
90
+ }
91
+ }}
92
+ />
93
+ </>
94
+ );
95
+ break;
96
+ case 'colorpicker':
97
+ return (
98
+ <>
99
+ {label}
100
+ <ColorPicker
101
+ key={key}
102
+ value={paintProps[key]}
103
+ propKey={key}
104
+ setPaintProps={setPaintProps}
105
+ />
106
+ </>
107
+ );
108
+ break;
109
+ }
110
+ }
111
+ return null;
112
+ };
113
+
114
+ return (
115
+ <>
116
+ <ListItem
117
+ sx={{ boxShadow: 'inset 0px 0px 10px rgb(50 50 50 / 10%)', borderRadius: '5px' }}
118
+ key={key + '_paintPropForm'}
119
+ >
120
+ <Box>
121
+ {Object.keys(paintProps).map((el: string) => getFormInputByType(el, paintProps[el]))}
122
+ </Box>
123
+ </ListItem>
124
+ </>
125
+ );
126
+ }
@@ -0,0 +1,3 @@
1
+ # Component Beschreibung
2
+
3
+ Beschreibungstext
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "MlSketchTool",
3
+ "title": "Sketch Tool",
4
+ "description": "Enables creation and editing of Points LineStrings and Polygons.",
5
+ "i18n": {
6
+ "de": {
7
+ "title": "Zeichenwerkzeug",
8
+ "description": "Erzeugen und bearbeiten von Geometrien."
9
+ }
10
+ },
11
+ "tags": [],
12
+ "category": "",
13
+ "type": "component"
14
+ }
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+
3
+ import MlSketchTool from './MlSketchTool';
4
+
5
+ import mapContextDecorator from '../../decorators/MapContextDecorator';
6
+ import Sidebar from '../../ui_components/Sidebar';
7
+
8
+ const storyoptions = {
9
+ title: 'MapComponents/MlSketchTool',
10
+ component: MlSketchTool,
11
+ argTypes: {},
12
+ decorators: mapContextDecorator,
13
+ };
14
+ export default storyoptions;
15
+
16
+ const Template = (args) => (
17
+ <>
18
+ <Sidebar sx={{ maxWidth: '25vw' }}>
19
+ <MlSketchTool />
20
+ </Sidebar>
21
+ </>
22
+ );
23
+
24
+ export const ExampleConfig = Template.bind({});
25
+ ExampleConfig.parameters = {};
26
+ ExampleConfig.args = {};
@@ -0,0 +1,271 @@
1
+ import React, { useState, useCallback } from 'react';
2
+ import PanoramaFishEyeIcon from '@mui/icons-material/PanoramaFishEye';
3
+ import ShowChartIcon from '@mui/icons-material/ShowChart';
4
+ import PentagonIcon from '@mui/icons-material/Pentagon';
5
+ import { Box } from '@mui/system';
6
+ //import useMediaQuery from '@mui/material/useMediaQuery';
7
+ import MlFeatureEditor from '../MlFeatureEditor/MlFeatureEditor';
8
+ import List from '@mui/material/List';
9
+ import EditIcon from '@mui/icons-material/Edit';
10
+ import SettingsIcon from '@mui/icons-material/Settings';
11
+ import MlGeoJsonLayer from '../MlGeoJsonLayer/MlGeoJsonLayer';
12
+ import useMap from '../../hooks/useMap';
13
+ import DeleteIcon from '@mui/icons-material/Delete';
14
+ import * as turf from '@turf/turf';
15
+ import ButtonGroup from '@mui/material/ButtonGroup';
16
+ import IconButton from '@mui/material/IconButton';
17
+ import Tooltip from '@mui/material/Tooltip';
18
+ import LayerListItem from './LayerList/LayerListItem';
19
+ import GpsFixedIcon from '@mui/icons-material/GpsFixed';
20
+ import { Feature } from '@turf/turf';
21
+ import { LngLatLike } from '!maplibre-gl';
22
+ import { SxProps } from '@mui/system/styleFunctionSx/styleFunctionSx';
23
+
24
+ interface MlSketchToolProps {
25
+ /**
26
+ * Id of the target MapLibre instance in mapContext
27
+ */
28
+ mapId?: string;
29
+ /**
30
+ * Id of an existing layer in the mapLibre instance to help specify the layer order
31
+ * This layer will be visually beneath the layer with the "insertBeforeLayer" id.
32
+ */
33
+ insertBeforeLayer?: string;
34
+ /**
35
+ * Style attribute for the button-style
36
+ * https://mui.com/system/getting-started/the-sx-prop/
37
+ */
38
+ buttonStyleOverride?: SxProps;
39
+ }
40
+
41
+ /**
42
+ * Component template
43
+ *
44
+ */
45
+
46
+ const MlSketchTool = (props: MlSketchToolProps) => {
47
+ type SketchStateType = {
48
+ selectedGeoJson: Feature | undefined;
49
+ activeGeometryIndex: number;
50
+ geometries: Feature[];
51
+ drawMode: string;
52
+ };
53
+ const mapHook = useMap({
54
+ mapId: props.mapId,
55
+ waitForLayer: props.insertBeforeLayer,
56
+ });
57
+ //const mediaIsMobile = useMediaQuery('(max-width:900px)');
58
+ const [hoveredGeometry, setHoveredGeometry] = useState<Feature>();
59
+ const [sketchState, setSketchState] = useState<SketchStateType>({
60
+ activeGeometryIndex: 0,
61
+ selectedGeoJson: undefined,
62
+ geometries: [],
63
+ drawMode: '',
64
+ });
65
+
66
+ const buttonStyle = {
67
+ ...props.buttonStyleOverride,
68
+ };
69
+
70
+ const buttonClickHandler = useCallback(
71
+ (buttonDrawMode: string) => {
72
+ console.log(buttonDrawMode);
73
+ sketchState.drawMode !== buttonDrawMode
74
+ ? setSketchState((_sketchTool) => ({
75
+ drawMode: buttonDrawMode,
76
+ geometries: _sketchTool.geometries,
77
+ activeGeometryIndex: 0,
78
+ selectedGeoJson: undefined,
79
+ }))
80
+ : setSketchState((_sketchTool) => ({
81
+ drawMode: '',
82
+ geometries: _sketchTool.geometries,
83
+ activeGeometryIndex: 0,
84
+ selectedGeoJson: undefined,
85
+ }));
86
+ },
87
+ [sketchState]
88
+ );
89
+
90
+ const removeGeoJson = (geoJson: Feature): void => {
91
+ setSketchState((_sketchState) => {
92
+ const tempGeometries = [..._sketchState.geometries];
93
+ tempGeometries.splice(tempGeometries.indexOf(geoJson), 1);
94
+
95
+ return {
96
+ ..._sketchState,
97
+ geometries: tempGeometries,
98
+ activeGeometryIndex: _sketchState.activeGeometryIndex - 1,
99
+ };
100
+ });
101
+ };
102
+
103
+ return (
104
+ <>
105
+ <Box
106
+ sx={{
107
+ zIndex: 104,
108
+ }}
109
+ >
110
+ <ButtonGroup>
111
+ <Tooltip title={'point'}>
112
+ <IconButton sx={buttonStyle} onClick={() => buttonClickHandler('draw_point')}>
113
+ <PanoramaFishEyeIcon />
114
+ </IconButton>
115
+ </Tooltip>
116
+ <Tooltip title={'Line'}>
117
+ <IconButton sx={buttonStyle} onClick={() => buttonClickHandler('draw_line_string')}>
118
+ <ShowChartIcon />
119
+ </IconButton>
120
+ </Tooltip>
121
+ <Tooltip title={'Polygon'}>
122
+ <IconButton sx={buttonStyle} onClick={() => buttonClickHandler('custom_polygon')}>
123
+ <PentagonIcon />
124
+ </IconButton>
125
+ </Tooltip>
126
+ </ButtonGroup>
127
+ </Box>
128
+
129
+ {sketchState.drawMode && (
130
+ <MlFeatureEditor
131
+ mode={
132
+ sketchState.drawMode === 'edit'
133
+ ? sketchState.selectedGeoJson?.geometry?.type === 'LineString'
134
+ ? 'simple_select'
135
+ : 'custom_select'
136
+ : sketchState.drawMode
137
+ }
138
+ geojson={sketchState.drawMode === 'edit' ? sketchState.selectedGeoJson : undefined}
139
+ onChange={(feature: object) => {
140
+ setSketchState((_sketchState) => {
141
+ const _geometries = [...sketchState.geometries];
142
+ if (sketchState.drawMode === 'edit' && sketchState.selectedGeoJson) {
143
+ _geometries[_geometries.indexOf(sketchState.selectedGeoJson)] = feature[0];
144
+ } else {
145
+ if (!sketchState.activeGeometryIndex) {
146
+ const tempFeature = feature[0];
147
+ tempFeature.properties.id = tempFeature.id;
148
+
149
+ _geometries.push(tempFeature);
150
+ } else {
151
+ _geometries[sketchState.activeGeometryIndex] = feature[0];
152
+ }
153
+ }
154
+ return {
155
+ ..._sketchState,
156
+ activeGeometryIndex:
157
+ _sketchState.drawMode !== 'edit' && feature[0].geometry.type !== 'Point'
158
+ ? _geometries.length - 1
159
+ : _sketchState.activeGeometryIndex,
160
+ geometries: _geometries,
161
+ };
162
+ });
163
+ }}
164
+ onFinish={() => {
165
+ setSketchState((_sketchState) => ({
166
+ ..._sketchState,
167
+ drawMode: '',
168
+ activeGeometryIndex:
169
+ _sketchState.drawMode !== 'draw_point' ? 0 : _sketchState.activeGeometryIndex,
170
+ selectedGeoJson:
171
+ _sketchState.drawMode !== 'draw_point' ? undefined : _sketchState.selectedGeoJson,
172
+ }));
173
+ }}
174
+ />
175
+ )}
176
+
177
+ <List sx={{ zIndex: 105 }}>
178
+ {sketchState.geometries.map((el) => (
179
+ <>
180
+ <Box key={el.id} sx={{ display: 'flex', flexDirection: 'column' }}>
181
+ <br />
182
+ <Box
183
+ flexDirection={'row'}
184
+ sx={{
185
+ '&:hover': {
186
+ backgroundColor: 'rgb(177, 177, 177, 0.2)',
187
+ },
188
+ }}
189
+ onMouseOver={() => {
190
+ setHoveredGeometry(el);
191
+ }}
192
+ onMouseLeave={() => {
193
+ setHoveredGeometry(undefined);
194
+ }}
195
+ >
196
+ {/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */}
197
+ {/* @ts-ignore-next-line */}
198
+ <LayerListItem
199
+ sx={buttonStyle}
200
+ visible={true}
201
+ configurable={true}
202
+ layerComponent={
203
+ <MlGeoJsonLayer mapId={props.mapId} geojson={el} layerId={String(el.id)} />
204
+ }
205
+ type={'layer'}
206
+ name={String(el.id)}
207
+ description={el.geometry.type}
208
+ >
209
+ <SettingsIcon />
210
+ </LayerListItem>
211
+ <IconButton
212
+ onClick={() => {
213
+ mapHook?.map?.map.setCenter(
214
+ el.geometry.type === 'Point'
215
+ ? (el.geometry.coordinates as LngLatLike)
216
+ : (turf.centerOfMass(el).geometry.coordinates as LngLatLike)
217
+ );
218
+ }}
219
+ >
220
+ <GpsFixedIcon />
221
+ </IconButton>
222
+ <IconButton
223
+ sx={buttonStyle}
224
+ onClick={() => {
225
+ setSketchState((_sketchState) => ({
226
+ ..._sketchState,
227
+ selectedGeoJson: el,
228
+ drawMode: 'edit',
229
+ }));
230
+ }}
231
+ >
232
+ <EditIcon />
233
+ </IconButton>
234
+ <IconButton
235
+ sx={buttonStyle}
236
+ onClick={() => {
237
+ removeGeoJson(el);
238
+ }}
239
+ >
240
+ <DeleteIcon />
241
+ </IconButton>
242
+ </Box>
243
+ </Box>
244
+ </>
245
+ ))}
246
+ {hoveredGeometry && (
247
+ <MlGeoJsonLayer
248
+ mapId={props.mapId}
249
+ geojson={{ type: 'FeatureCollection', features: [hoveredGeometry] }}
250
+ type={'line'}
251
+ layerId={'highlightBorder'}
252
+ paint={{
253
+ 'line-color': '#dd9900',
254
+ 'line-opacity': 0.4,
255
+ 'line-width': 10,
256
+ }}
257
+ />
258
+ )}
259
+ </List>
260
+ {sketchState.drawMode === 'edit' && (
261
+ <Box>Edit {sketchState.selectedGeoJson?.geometry?.type}</Box>
262
+ )}
263
+ </>
264
+ );
265
+ };
266
+
267
+ MlSketchTool.defaultProps = {
268
+ mapId: undefined,
269
+ buttonStyleOverride: {},
270
+ };
271
+ export default MlSketchTool;
@@ -10,6 +10,5 @@
10
10
  },
11
11
  "tags": ["Map add-on"],
12
12
  "category": "add-ons",
13
- "type": "component",
14
- "price": 5000
13
+ "type": "component"
15
14
  }
@@ -0,0 +1,121 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import MlSpatialElevationProfile from './MlSpatialElevationProfile';
3
+ import MlGpxViewer from '../MlGpxViewer/MlGpxViewer';
4
+ import InfoIcon from '@mui/icons-material/Info';
5
+ import useGpx, { MetadataType } from '../../hooks/useGpx/useGpx';
6
+ import FileCopy from '@mui/icons-material/FileCopy';
7
+ import Dropzone from '../../ui_components/Dropzone';
8
+ import UploadButton from '../../ui_components/UploadButton';
9
+ import MetadataDrawer from '../MlGpxViewer/util/MetadataDrawer';
10
+ import mapContextDecorator from '../../decorators/MapContextDecorator';
11
+ import IconButton from '@mui/material/IconButton';
12
+ import useMediaQuery from '@mui/material/useMediaQuery';
13
+ import TopToolbar from '../../ui_components/TopToolbar';
14
+ import useMap from '../../hooks/useMap';
15
+ import MlGpxViewerInstructions from '../MlGpxViewer/util/MlGpxViewerInstructions';
16
+ import { Button } from '@mui/material';
17
+ import MlGpxDemoLoader from '../MlGpxViewer/util/MlGpxDemoLoader';
18
+
19
+ const storyoptions = {
20
+ title: 'MapComponents/MlSpatialElevationProfile',
21
+ component: MlSpatialElevationProfile,
22
+ argTypes: {
23
+ options: {
24
+ control: {
25
+ type: 'object',
26
+ },
27
+ },
28
+ },
29
+ decorators: mapContextDecorator,
30
+ };
31
+ export default storyoptions;
32
+
33
+ const Template = () => {
34
+ const [gpxData, setGpxData] = useState<string | undefined>();
35
+ const parsedGpx = useGpx({ data: gpxData });
36
+ const mediaIsMobile = useMediaQuery('(max-width:900px)');
37
+ const [demoLoaderOpen, setDemoLoaderOpen] = useState(false);
38
+ const [guide, setGuide] = useState(false);
39
+ const [metadataDrawerOpen, setMetadataDrawerOpen] = useState(false);
40
+ const [metadata, setMetadata] = useState<MetadataType[]>([]);
41
+ const mapHook = useMap({ mapId: 'map_1' });
42
+
43
+ const handleClick1 = () => {
44
+ setDemoLoaderOpen(!demoLoaderOpen);
45
+ };
46
+
47
+ const handleClick2 = () => {
48
+ setGuide(true);
49
+ setTimeout(() => {
50
+ setGuide(false);
51
+ }, 9000);
52
+ };
53
+ useEffect(() => {
54
+ if (!mapHook.map) return;
55
+ if (mapHook.map.map.getPitch() != 60) {
56
+ mapHook.map.map.setPitch(60);
57
+ }
58
+ }, [mapHook.map]);
59
+
60
+ return (
61
+ <>
62
+ <TopToolbar>
63
+ <MlGpxViewerInstructions open={guide} />
64
+ <Button variant="contained" onClick={handleClick2} sx={{ marginRight: '10px' }}>
65
+ Guide me through
66
+ </Button>
67
+ <Button variant="contained" onClick={handleClick1}>
68
+ Demo Mode
69
+ </Button>
70
+ </TopToolbar>
71
+ <MlGpxDemoLoader open={demoLoaderOpen} setOpen={setDemoLoaderOpen} setGpx={setGpxData} />
72
+
73
+ <div
74
+ style={{
75
+ position: 'fixed',
76
+ right: '5px',
77
+ bottom: mediaIsMobile ? '40px' : '25px',
78
+ display: 'flex',
79
+ flexDirection: 'column',
80
+ gap: '5px',
81
+ zIndex: 1000,
82
+ }}
83
+ >
84
+ <UploadButton
85
+ setData={setGpxData}
86
+ buttonComponent={
87
+ <IconButton
88
+ style={{
89
+ backgroundColor: 'rgba(255,255,255,1)',
90
+ }}
91
+ size="large"
92
+ >
93
+ <FileCopy />
94
+ </IconButton>
95
+ }
96
+ />
97
+ <IconButton
98
+ onClick={() => {
99
+ setMetadataDrawerOpen((prevState) => !prevState);
100
+ }}
101
+ style={{
102
+ backgroundColor: 'rgba(255,255,255,1)',
103
+ }}
104
+ size="large"
105
+ >
106
+ <InfoIcon />
107
+ </IconButton>
108
+ </div>
109
+ <MetadataDrawer metadata={metadata} open={metadataDrawerOpen} />
110
+ <Dropzone setData={(data) => setGpxData(data)} />
111
+ <MlGpxViewer
112
+ gpxData={gpxData}
113
+ onParseGpxData={(parsedGpx) => setMetadata(parsedGpx.metadata ? parsedGpx.metadata : [])}
114
+ />
115
+ <MlSpatialElevationProfile geojson={parsedGpx.geojson} />
116
+ </>
117
+ );
118
+ };
119
+
120
+ export const ExampleConfig = Template.bind({});
121
+ ExampleConfig.parameters = {};