@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
@@ -3,7 +3,7 @@
3
3
  <html lang="en">
4
4
 
5
5
  <head>
6
- <title>Code coverage report for src/components/MlGPXViewer/MlGPXViewer.tsx</title>
6
+ <title>Code coverage report for src/components/MlSketchTool/MlSketchTool.tsx</title>
7
7
  <meta charset="utf-8" />
8
8
  <link rel="stylesheet" href="../../../prettify.css" />
9
9
  <link rel="stylesheet" href="../../../base.css" />
@@ -19,34 +19,34 @@
19
19
  <body>
20
20
  <div class='wrapper'>
21
21
  <div class='pad1'>
22
- <h1><a href="../../../index.html">All files</a> / <a href="index.html">src/components/MlGPXViewer</a> MlGPXViewer.tsx</h1>
22
+ <h1><a href="../../../index.html">All files</a> / <a href="index.html">src/components/MlSketchTool</a> MlSketchTool.tsx</h1>
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">40.31% </span>
26
+ <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>52/129</span>
28
+ <span class='fraction'>0/39</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">15.9% </span>
33
+ <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>7/44</span>
35
+ <span class='fraction'>0/30</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">25% </span>
40
+ <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>6/24</span>
42
+ <span class='fraction'>0/20</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">43.47% </span>
47
+ <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>50/115</span>
49
+ <span class='fraction'>0/37</span>
50
50
  </div>
51
51
 
52
52
 
@@ -334,113 +334,7 @@
334
334
  <a name='L269'></a><a href='#L269'>269</a>
335
335
  <a name='L270'></a><a href='#L270'>270</a>
336
336
  <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
337
+ <a name='L272'></a><a href='#L272'>272</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
444
338
  <span class="cline-any cline-neutral">&nbsp;</span>
445
339
  <span class="cline-any cline-neutral">&nbsp;</span>
446
340
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -481,192 +375,104 @@
481
375
  <span class="cline-any cline-neutral">&nbsp;</span>
482
376
  <span class="cline-any cline-neutral">&nbsp;</span>
483
377
  <span class="cline-any cline-neutral">&nbsp;</span>
484
- <span class="cline-any cline-yes">10x</span>
485
- <span class="cline-any cline-yes">18x</span>
486
- <span class="cline-any cline-yes">18x</span>
487
- <span class="cline-any cline-yes">18x</span>
488
- <span class="cline-any cline-yes">18x</span>
489
- <span class="cline-any cline-yes">18x</span>
490
- <span class="cline-any cline-yes">18x</span>
491
- <span class="cline-any cline-neutral">&nbsp;</span>
492
- <span class="cline-any cline-yes">18x</span>
493
- <span class="cline-any cline-yes">18x</span>
494
- <span class="cline-any cline-yes">18x</span>
495
- <span class="cline-any cline-yes">18x</span>
496
- <span class="cline-any cline-yes">18x</span>
497
- <span class="cline-any cline-yes">18x</span>
498
- <span class="cline-any cline-neutral">&nbsp;</span>
499
- <span class="cline-any cline-yes">18x</span>
500
- <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-neutral">&nbsp;</span>
502
- <span class="cline-any cline-neutral">&nbsp;</span>
503
- <span class="cline-any cline-neutral">&nbsp;</span>
504
- <span class="cline-any cline-neutral">&nbsp;</span>
505
- <span class="cline-any cline-neutral">&nbsp;</span>
506
- <span class="cline-any cline-yes">18x</span>
507
- <span class="cline-any cline-yes">12x</span>
508
- <span class="cline-any cline-neutral">&nbsp;</span>
509
- <span class="cline-any cline-yes">6x</span>
510
- <span class="cline-any cline-neutral">&nbsp;</span>
511
- <span class="cline-any cline-yes">6x</span>
512
- <span class="cline-any cline-neutral">&nbsp;</span>
513
- <span class="cline-any cline-neutral">&nbsp;</span>
514
378
  <span class="cline-any cline-neutral">&nbsp;</span>
515
379
  <span class="cline-any cline-neutral">&nbsp;</span>
516
380
  <span class="cline-any cline-neutral">&nbsp;</span>
517
381
  <span class="cline-any cline-neutral">&nbsp;</span>
382
+ <span class="cline-any cline-no">&nbsp;</span>
518
383
  <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-yes">6x</span>
520
384
  <span class="cline-any cline-neutral">&nbsp;</span>
521
385
  <span class="cline-any cline-neutral">&nbsp;</span>
522
386
  <span class="cline-any cline-neutral">&nbsp;</span>
523
387
  <span class="cline-any cline-neutral">&nbsp;</span>
524
388
  <span class="cline-any cline-neutral">&nbsp;</span>
389
+ <span class="cline-any cline-no">&nbsp;</span>
525
390
  <span class="cline-any cline-neutral">&nbsp;</span>
526
391
  <span class="cline-any cline-neutral">&nbsp;</span>
527
392
  <span class="cline-any cline-neutral">&nbsp;</span>
528
393
  <span class="cline-any cline-neutral">&nbsp;</span>
394
+ <span class="cline-any cline-no">&nbsp;</span>
395
+ <span class="cline-any cline-no">&nbsp;</span>
529
396
  <span class="cline-any cline-neutral">&nbsp;</span>
530
397
  <span class="cline-any cline-neutral">&nbsp;</span>
531
398
  <span class="cline-any cline-neutral">&nbsp;</span>
532
- <span class="cline-any cline-yes">6x</span>
533
399
  <span class="cline-any cline-neutral">&nbsp;</span>
534
400
  <span class="cline-any cline-neutral">&nbsp;</span>
535
401
  <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-no">&nbsp;</span>
536
403
  <span class="cline-any cline-neutral">&nbsp;</span>
537
404
  <span class="cline-any cline-neutral">&nbsp;</span>
538
405
  <span class="cline-any cline-neutral">&nbsp;</span>
406
+ <span class="cline-any cline-no">&nbsp;</span>
539
407
  <span class="cline-any cline-neutral">&nbsp;</span>
408
+ <span class="cline-any cline-no">&nbsp;</span>
409
+ <span class="cline-any cline-no">&nbsp;</span>
410
+ <span class="cline-any cline-no">&nbsp;</span>
540
411
  <span class="cline-any cline-neutral">&nbsp;</span>
541
412
  <span class="cline-any cline-neutral">&nbsp;</span>
542
413
  <span class="cline-any cline-neutral">&nbsp;</span>
543
414
  <span class="cline-any cline-neutral">&nbsp;</span>
544
415
  <span class="cline-any cline-neutral">&nbsp;</span>
416
+ <span class="cline-any cline-no">&nbsp;</span>
545
417
  <span class="cline-any cline-neutral">&nbsp;</span>
546
418
  <span class="cline-any cline-neutral">&nbsp;</span>
547
- <span class="cline-any cline-yes">6x</span>
548
- <span class="cline-any cline-yes">12x</span>
549
419
  <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-yes">12x</span>
551
420
  <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-yes">6x</span>
553
421
  <span class="cline-any cline-neutral">&nbsp;</span>
554
422
  <span class="cline-any cline-neutral">&nbsp;</span>
555
423
  <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-no">&nbsp;</span>
557
424
  <span class="cline-any cline-neutral">&nbsp;</span>
558
425
  <span class="cline-any cline-neutral">&nbsp;</span>
559
426
  <span class="cline-any cline-no">&nbsp;</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
427
  <span class="cline-any cline-no">&nbsp;</span>
562
- <span class="cline-any cline-neutral">&nbsp;</span>
563
- <span class="cline-any cline-neutral">&nbsp;</span>
564
- <span class="cline-any cline-neutral">&nbsp;</span>
565
- <span class="cline-any cline-neutral">&nbsp;</span>
566
428
  <span class="cline-any cline-no">&nbsp;</span>
567
429
  <span class="cline-any cline-no">&nbsp;</span>
568
430
  <span class="cline-any cline-neutral">&nbsp;</span>
569
- <span class="cline-any cline-neutral">&nbsp;</span>
570
- <span class="cline-any cline-neutral">&nbsp;</span>
571
- <span class="cline-any cline-neutral">&nbsp;</span>
572
- <span class="cline-any cline-neutral">&nbsp;</span>
573
431
  <span class="cline-any cline-no">&nbsp;</span>
574
432
  <span class="cline-any cline-neutral">&nbsp;</span>
575
433
  <span class="cline-any cline-neutral">&nbsp;</span>
576
434
  <span class="cline-any cline-neutral">&nbsp;</span>
577
435
  <span class="cline-any cline-neutral">&nbsp;</span>
578
- <span class="cline-any cline-yes">6x</span>
579
436
  <span class="cline-any cline-neutral">&nbsp;</span>
580
437
  <span class="cline-any cline-neutral">&nbsp;</span>
581
438
  <span class="cline-any cline-neutral">&nbsp;</span>
582
439
  <span class="cline-any cline-no">&nbsp;</span>
583
440
  <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-no">&nbsp;</span>
585
- <span class="cline-any cline-no">&nbsp;</span>
586
441
  <span class="cline-any cline-neutral">&nbsp;</span>
587
442
  <span class="cline-any cline-neutral">&nbsp;</span>
588
443
  <span class="cline-any cline-neutral">&nbsp;</span>
589
444
  <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-yes">6x</span>
591
445
  <span class="cline-any cline-neutral">&nbsp;</span>
592
446
  <span class="cline-any cline-neutral">&nbsp;</span>
593
- <span class="cline-any cline-yes">18x</span>
594
- <span class="cline-any cline-yes">18x</span>
595
- <span class="cline-any cline-yes">18x</span>
596
- <span class="cline-any cline-no">&nbsp;</span>
597
- <span class="cline-any cline-no">&nbsp;</span>
598
- <span class="cline-any cline-neutral">&nbsp;</span>
599
- <span class="cline-any cline-yes">18x</span>
600
- <span class="cline-any cline-no">&nbsp;</span>
601
447
  <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-yes">18x</span>
603
- <span class="cline-any cline-no">&nbsp;</span>
604
448
  <span class="cline-any cline-no">&nbsp;</span>
605
449
  <span class="cline-any cline-neutral">&nbsp;</span>
606
450
  <span class="cline-any cline-neutral">&nbsp;</span>
607
- <span class="cline-any cline-yes">18x</span>
608
- <span class="cline-any cline-yes">18x</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-yes">18x</span>
611
- <span class="cline-any cline-neutral">&nbsp;</span>
612
- <span class="cline-any cline-yes">18x</span>
613
451
  <span class="cline-any cline-neutral">&nbsp;</span>
614
- <span class="cline-any cline-yes">18x</span>
615
- <span class="cline-any cline-yes">15x</span>
616
- <span class="cline-any cline-yes">15x</span>
617
- <span class="cline-any cline-yes">15x</span>
618
- <span class="cline-any cline-yes">15x</span>
619
452
  <span class="cline-any cline-neutral">&nbsp;</span>
620
- <span class="cline-any cline-neutral">&nbsp;</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-yes">18x</span>
623
- <span class="cline-any cline-no">&nbsp;</span>
624
453
  <span class="cline-any cline-no">&nbsp;</span>
625
454
  <span class="cline-any cline-neutral">&nbsp;</span>
626
455
  <span class="cline-any cline-neutral">&nbsp;</span>
627
- <span class="cline-any cline-yes">18x</span>
628
- <span class="cline-any cline-yes">6x</span>
629
456
  <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
631
457
  <span class="cline-any cline-neutral">&nbsp;</span>
632
458
  <span class="cline-any cline-no">&nbsp;</span>
633
- <span class="cline-any cline-no">&nbsp;</span>
634
459
  <span class="cline-any cline-neutral">&nbsp;</span>
635
- <span class="cline-any cline-no">&nbsp;</span>
636
460
  <span class="cline-any cline-neutral">&nbsp;</span>
637
461
  <span class="cline-any cline-neutral">&nbsp;</span>
638
462
  <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-yes">18x</span>
640
- <span class="cline-any cline-no">&nbsp;</span>
641
463
  <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-no">&nbsp;</span>
644
- <span class="cline-any cline-no">&nbsp;</span>
645
464
  <span class="cline-any cline-neutral">&nbsp;</span>
646
465
  <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-no">&nbsp;</span>
648
- <span class="cline-any cline-no">&nbsp;</span>
649
- <span class="cline-any cline-no">&nbsp;</span>
650
- <span class="cline-any cline-no">&nbsp;</span>
651
466
  <span class="cline-any cline-neutral">&nbsp;</span>
652
- <span class="cline-any cline-no">&nbsp;</span>
653
467
  <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-no">&nbsp;</span>
655
- <span class="cline-any cline-no">&nbsp;</span>
656
468
  <span class="cline-any cline-neutral">&nbsp;</span>
657
469
  <span class="cline-any cline-neutral">&nbsp;</span>
658
470
  <span class="cline-any cline-neutral">&nbsp;</span>
659
471
  <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
661
472
  <span class="cline-any cline-neutral">&nbsp;</span>
662
473
  <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-yes">18x</span>
664
- <span class="cline-any cline-no">&nbsp;</span>
665
474
  <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-no">&nbsp;</span>
667
- <span class="cline-any cline-no">&nbsp;</span>
668
- <span class="cline-any cline-no">&nbsp;</span>
669
- <span class="cline-any cline-no">&nbsp;</span>
475
+ <span class="cline-any cline-neutral">&nbsp;</span>
670
476
  <span class="cline-any cline-no">&nbsp;</span>
671
477
  <span class="cline-any cline-no">&nbsp;</span>
672
478
  <span class="cline-any cline-no">&nbsp;</span>
@@ -674,53 +480,30 @@
674
480
  <span class="cline-any cline-neutral">&nbsp;</span>
675
481
  <span class="cline-any cline-no">&nbsp;</span>
676
482
  <span class="cline-any cline-no">&nbsp;</span>
677
- <span class="cline-any cline-neutral">&nbsp;</span>
678
483
  <span class="cline-any cline-no">&nbsp;</span>
679
- <span class="cline-any cline-no">&nbsp;</span>
680
- <span class="cline-any cline-neutral">&nbsp;</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
484
  <span class="cline-any cline-neutral">&nbsp;</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
683
486
  <span class="cline-any cline-neutral">&nbsp;</span>
684
487
  <span class="cline-any cline-no">&nbsp;</span>
685
488
  <span class="cline-any cline-neutral">&nbsp;</span>
686
489
  <span class="cline-any cline-neutral">&nbsp;</span>
687
490
  <span class="cline-any cline-no">&nbsp;</span>
688
- <span class="cline-any cline-no">&nbsp;</span>
689
- <span class="cline-any cline-no">&nbsp;</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-no">&nbsp;</span>
692
491
  <span class="cline-any cline-neutral">&nbsp;</span>
693
- <span class="cline-any cline-no">&nbsp;</span>
694
492
  <span class="cline-any cline-neutral">&nbsp;</span>
695
493
  <span class="cline-any cline-neutral">&nbsp;</span>
696
494
  <span class="cline-any cline-neutral">&nbsp;</span>
697
- <span class="cline-any cline-yes">18x</span>
698
- <span class="cline-any cline-no">&nbsp;</span>
699
495
  <span class="cline-any cline-neutral">&nbsp;</span>
700
496
  <span class="cline-any cline-neutral">&nbsp;</span>
701
- <span class="cline-any cline-yes">18x</span>
702
- <span class="cline-any cline-no">&nbsp;</span>
703
497
  <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-no">&nbsp;</span>
705
- <span class="cline-any cline-no">&nbsp;</span>
706
- <span class="cline-any cline-no">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
708
- <span class="cline-any cline-no">&nbsp;</span>
709
498
  <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-no">&nbsp;</span>
711
499
  <span class="cline-any cline-neutral">&nbsp;</span>
712
500
  <span class="cline-any cline-neutral">&nbsp;</span>
713
501
  <span class="cline-any cline-no">&nbsp;</span>
714
502
  <span class="cline-any cline-neutral">&nbsp;</span>
715
- <span class="cline-any cline-no">&nbsp;</span>
716
503
  <span class="cline-any cline-neutral">&nbsp;</span>
717
504
  <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-yes">18x</span>
719
- <span class="cline-any cline-no">&nbsp;</span>
720
505
  <span class="cline-any cline-neutral">&nbsp;</span>
721
- <span class="cline-any cline-no">&nbsp;</span>
722
506
  <span class="cline-any cline-neutral">&nbsp;</span>
723
- <span class="cline-any cline-yes">18x</span>
724
507
  <span class="cline-any cline-neutral">&nbsp;</span>
725
508
  <span class="cline-any cline-neutral">&nbsp;</span>
726
509
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -729,6 +512,7 @@
729
512
  <span class="cline-any cline-neutral">&nbsp;</span>
730
513
  <span class="cline-any cline-neutral">&nbsp;</span>
731
514
  <span class="cline-any cline-neutral">&nbsp;</span>
515
+ <span class="cline-any cline-no">&nbsp;</span>
732
516
  <span class="cline-any cline-neutral">&nbsp;</span>
733
517
  <span class="cline-any cline-neutral">&nbsp;</span>
734
518
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -739,8 +523,10 @@
739
523
  <span class="cline-any cline-neutral">&nbsp;</span>
740
524
  <span class="cline-any cline-neutral">&nbsp;</span>
741
525
  <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-no">&nbsp;</span>
742
527
  <span class="cline-any cline-neutral">&nbsp;</span>
743
528
  <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-no">&nbsp;</span>
744
530
  <span class="cline-any cline-neutral">&nbsp;</span>
745
531
  <span class="cline-any cline-neutral">&nbsp;</span>
746
532
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -760,6 +546,7 @@
760
546
  <span class="cline-any cline-neutral">&nbsp;</span>
761
547
  <span class="cline-any cline-neutral">&nbsp;</span>
762
548
  <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-no">&nbsp;</span>
763
550
  <span class="cline-any cline-neutral">&nbsp;</span>
764
551
  <span class="cline-any cline-neutral">&nbsp;</span>
765
552
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -771,10 +558,10 @@
771
558
  <span class="cline-any cline-neutral">&nbsp;</span>
772
559
  <span class="cline-any cline-neutral">&nbsp;</span>
773
560
  <span class="cline-any cline-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-no">&nbsp;</span>
774
562
  <span class="cline-any cline-neutral">&nbsp;</span>
775
563
  <span class="cline-any cline-neutral">&nbsp;</span>
776
564
  <span class="cline-any cline-neutral">&nbsp;</span>
777
- <span class="cline-any cline-no">&nbsp;</span>
778
565
  <span class="cline-any cline-neutral">&nbsp;</span>
779
566
  <span class="cline-any cline-neutral">&nbsp;</span>
780
567
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -783,6 +570,7 @@
783
570
  <span class="cline-any cline-neutral">&nbsp;</span>
784
571
  <span class="cline-any cline-neutral">&nbsp;</span>
785
572
  <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-no">&nbsp;</span>
786
574
  <span class="cline-any cline-neutral">&nbsp;</span>
787
575
  <span class="cline-any cline-neutral">&nbsp;</span>
788
576
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -811,389 +599,283 @@
811
599
  <span class="cline-any cline-neutral">&nbsp;</span>
812
600
  <span class="cline-any cline-neutral">&nbsp;</span>
813
601
  <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-yes">10x</span>
815
602
  <span class="cline-any cline-neutral">&nbsp;</span>
603
+ <span class="cline-any cline-no">&nbsp;</span>
816
604
  <span class="cline-any cline-neutral">&nbsp;</span>
817
605
  <span class="cline-any cline-neutral">&nbsp;</span>
818
606
  <span class="cline-any cline-neutral">&nbsp;</span>
819
607
  <span class="cline-any cline-neutral">&nbsp;</span>
820
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import React, { useContext, useRef, useEffect, useState } from "react";
821
- import { bbox } from '@turf/turf';
822
- import Divider from "@mui/material/Divider";
823
- import Typography from "@mui/material/Typography";
824
- import Drawer from "@mui/material/Drawer";
825
- import IconButton from "@mui/material/IconButton";
826
- import InfoIcon from "@mui/icons-material/Info";
827
- import FileCopy from "@mui/icons-material/FileCopy";
828
- import { Popup, LngLatBoundsLike, GeoJSONSource } from "maplibre-gl";
829
- import List from "@mui/material/List";
830
- import ListItem from "@mui/material/ListItem";
831
- import ListItemText from "@mui/material/ListItemText";
832
- import GeoJsonContext from "./util/GeoJsonContext";
833
- import toGeoJSON from "./gpxConverter";
834
- import useMediaQuery from "@mui/material/useMediaQuery";
835
- import useMap from "../../hooks/useMap";
836
- &nbsp;
837
- interface MlGPXViewerProps {
608
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import React, { useState, useCallback } from 'react';
609
+ import PanoramaFishEyeIcon from '@mui/icons-material/PanoramaFishEye';
610
+ import ShowChartIcon from '@mui/icons-material/ShowChart';
611
+ import PentagonIcon from '@mui/icons-material/Pentagon';
612
+ import { Box } from '@mui/system';
613
+ //import useMediaQuery from '@mui/material/useMediaQuery';
614
+ import MlFeatureEditor from '../MlFeatureEditor/MlFeatureEditor';
615
+ import List from '@mui/material/List';
616
+ import EditIcon from '@mui/icons-material/Edit';
617
+ import SettingsIcon from '@mui/icons-material/Settings';
618
+ import MlGeoJsonLayer from '../MlGeoJsonLayer/MlGeoJsonLayer';
619
+ import useMap from '../../hooks/useMap';
620
+ import DeleteIcon from '@mui/icons-material/Delete';
621
+ import * as turf from '@turf/turf';
622
+ import ButtonGroup from '@mui/material/ButtonGroup';
623
+ import IconButton from '@mui/material/IconButton';
624
+ import Tooltip from '@mui/material/Tooltip';
625
+ import LayerListItem from './LayerList/LayerListItem';
626
+ import GpsFixedIcon from '@mui/icons-material/GpsFixed';
627
+ import { Feature } from '@turf/turf';
628
+ import { LngLatLike } from '!maplibre-gl';
629
+ import { SxProps } from '@mui/system/styleFunctionSx/styleFunctionSx';
838
630
  &nbsp;
631
+ interface MlSketchToolProps {
839
632
  /**
840
- * Id of the target MapLibre instance in mapHook
633
+ * Id of the target MapLibre instance in mapContext
841
634
  */
842
- mapId?: string,
635
+ mapId?: string;
843
636
  /**
844
- * The layerId of an existing layer this layer should be rendered visually beneath
845
- * https://maplibre.org/maplibre-gl-js-docs/api/map/#map#addlayer - see "beforeId" property
637
+ * Id of an existing layer in the mapLibre instance to help specify the layer order
638
+ * This layer will be visually beneath the layer with the "insertBeforeLayer" id.
846
639
  */
847
- insertBeforeLayer?: string,
640
+ insertBeforeLayer?: string;
848
641
  /**
849
- * Prefix of the component id this component uses when adding elements to the MapLibreGl-instance
642
+ * Style attribute for the button-style
643
+ * https://mui.com/system/getting-started/the-sx-prop/
850
644
  */
851
- idPrefix?: string,
852
- /**
853
- * Sets the layers layout-property "visibility" to "none" if false or "visible" if true
854
- */
855
- visible?: boolean,
645
+ buttonStyleOverride?: SxProps;
856
646
  }
857
647
  &nbsp;
858
648
  /**
859
- * MlGPXViewer returns a dropzone and a button to load a GPX Track into the map.
649
+ * Component template
650
+ *
860
651
  */
861
- const MlGPXViewer = (props:MlGPXViewerProps) =&gt; {
862
- const dataSource = useContext(GeoJsonContext);
863
- const initializedRef = useRef(false);
864
- const mapHook = useMap({ mapId: props.mapId, waitForLayer: props.insertBeforeLayer });
865
- const sourceName = "import-source";
866
- const layerNameLines = "importer-layer-lines";
867
- const layerNamePoints = "importer-layer-points";
868
- &nbsp;
869
- const [open, setIsOpen] = useState(false);
870
- const dropZone = useRef&lt;HTMLDivElement&gt;(null);
871
- const [zIndex, setZIndex] = useState(0);
872
- const [metaData, setMetaData] = useState&lt;{ title: string; value: string; id: number; }[]&gt;([]);
873
- const fileupload = useRef&lt;HTMLInputElement&gt;(null);
874
- const mediaIsMobile = useMediaQuery("(max-width:900px)");
875
- &nbsp;
876
- const popup = useRef(
877
- new Popup({
878
- closeButton: false,
879
- closeOnClick: true,
880
- })
881
- );
882
- &nbsp;
883
- useEffect(() =&gt; {
884
- if (!mapHook.map || initializedRef.current) return;
885
- &nbsp;
886
- initializedRef.current = true;
887
- &nbsp;
888
- mapHook.map.addSource(
889
- sourceName,
890
- {
891
- type: "geojson",
892
- data: dataSource.data,
893
- },
894
- mapHook.componentId
895
- );
896
- mapHook.map.addLayer(
897
- {
898
- id: layerNameLines,
899
- source: sourceName,
900
- type: "line",
901
- paint: {
902
- "line-width": 4,
903
- "line-color": "rgba(212, 55, 23,0.5)",
904
- },
905
- },
906
- props.insertBeforeLayer,
907
- mapHook.componentId
908
- );
909
- mapHook.map.addLayer(
910
- {
911
- id: layerNamePoints,
912
- source: sourceName,
913
- type: "circle",
914
- paint: {
915
- "circle-color": "rgba(72, 77, 99,0.5)",
916
- "circle-radius": 7,
917
- },
918
- filter: ["==", "$type", "Point"],
919
- },
920
- props.insertBeforeLayer,
921
- mapHook.componentId
922
- );
923
- &nbsp;
924
- [layerNameLines, layerNamePoints].forEach((layerName) =&gt; {
925
- <span class="missing-if-branch" title="if path not taken" >I</span>if(!mapHook.map)<span class="cstat-no" title="statement not covered" >return;</span>
926
- &nbsp;
927
- mapHook.map.map.setLayoutProperty(layerName, "visibility", "visible");
928
- });
929
- mapHook.map.on(
930
- "mouseenter",
931
- layerNamePoints,
932
- <span class="fstat-no" title="function not covered" > (e</span>:any) =&gt; {
933
- <span class="cstat-no" title="statement not covered" > if(!mapHook.map)<span class="cstat-no" title="statement not covered" >return;</span></span>
934
- // Change the cursor style as a UI indicator.
935
- &nbsp;
936
- const coordinates = <span class="cstat-no" title="statement not covered" >e.features[0].geometry.coordinates.slice();</span>
937
- //const description = e.features[0].properties.desc;
938
- const name = <span class="cstat-no" title="statement not covered" >e.features[0].properties.name;</span>
939
- &nbsp;
940
- // Ensure that if the map is zoomed out such that multiple
941
- // copies of the feature are visible, the popup appears
942
- // over the copy being pointed to.
943
- <span class="cstat-no" title="statement not covered" > while (Math.abs(e.lngLat.lng - coordinates[0]) &gt; 180) {</span>
944
- <span class="cstat-no" title="statement not covered" > coordinates[0] += e.lngLat.lng &gt; coordinates[0] ? 360 : -360;</span>
945
- }
946
652
  &nbsp;
947
- // Populate the popup and set its coordinates
948
- &nbsp;
949
- // based on the feature found.
950
- <span class="cstat-no" title="statement not covered" > popup.current.setLngLat(coordinates).setHTML(name).addTo(mapHook.map.map);</span>
951
- },
952
- mapHook.componentId
953
- );
954
- &nbsp;
955
- mapHook.map.on(
956
- "mouseleave",
957
- "places",
958
- <span class="fstat-no" title="function not covered" > fu</span>nction () {
959
- <span class="cstat-no" title="statement not covered" > if(!mapHook.map)<span class="cstat-no" title="statement not covered" >return;</span></span>
960
- &nbsp;
961
- <span class="cstat-no" title="statement not covered" > mapHook.map.map.getCanvas().style.cursor = "";</span>
962
- <span class="cstat-no" title="statement not covered" > popup.current.remove();</span>
963
- },
964
- mapHook.componentId
965
- );
966
- &nbsp;
967
- mapHook.map.map.setZoom(10);
968
- }, [mapHook.map]);
969
- &nbsp;
970
- useEffect(() =&gt; {
971
- const _dropZone = dropZone.current;
972
- const raiseDropZoneAndStopDefault = <span class="fstat-no" title="function not covered" >(e</span>vent:any) =&gt; {
973
- <span class="cstat-no" title="statement not covered" > setZIndex(1000);</span>
974
- <span class="cstat-no" title="statement not covered" > stopDefault(event);</span>
975
- };
976
- const lowerDropZone = <span class="fstat-no" title="function not covered" >()</span> =&gt; {
977
- <span class="cstat-no" title="statement not covered" > setZIndex(0);</span>
978
- };
979
- const lowerDropZoneAndStopDefault = <span class="fstat-no" title="function not covered" >(e</span>vent:any) =&gt; {
980
- <span class="cstat-no" title="statement not covered" > setZIndex(0);</span>
981
- <span class="cstat-no" title="statement not covered" > stopDefault(event);</span>
982
- };
983
- &nbsp;
984
- window.addEventListener("dragenter", raiseDropZoneAndStopDefault);
985
- window.addEventListener("dragover", stopDefault);
986
- &nbsp;
987
- _dropZone?.addEventListener("dragleave", lowerDropZone);
988
- &nbsp;
989
- window.addEventListener("drop", lowerDropZoneAndStopDefault);
990
- &nbsp;
991
- return () =&gt; {
992
- window.removeEventListener("dragenter", raiseDropZoneAndStopDefault);
993
- window.removeEventListener("dragover", stopDefault);
994
- _dropZone?.removeEventListener("dragleave", lowerDropZone);
995
- window.removeEventListener("drop", lowerDropZoneAndStopDefault);
996
- };
653
+ const MlSketchTool = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(p</span>rops: MlSketchToolProps) =&gt; {</span>
654
+ type SketchStateType = {
655
+ selectedGeoJson: Feature | undefined;
656
+ activeGeometryIndex: number;
657
+ geometries: Feature[];
658
+ drawMode: string;
659
+ };
660
+ const mapHook = <span class="cstat-no" title="statement not covered" >useMap({</span>
661
+ mapId: props.mapId,
662
+ waitForLayer: props.insertBeforeLayer,
663
+ });
664
+ //const mediaIsMobile = useMediaQuery('(max-width:900px)');
665
+ const [hoveredGeometry, setHoveredGeometry] = <span class="cstat-no" title="statement not covered" >useState&lt;Feature&gt;();</span>
666
+ const [sketchState, setSketchState] = <span class="cstat-no" title="statement not covered" >useState&lt;SketchStateType&gt;({</span>
667
+ activeGeometryIndex: 0,
668
+ selectedGeoJson: undefined,
669
+ geometries: [],
670
+ drawMode: '',
997
671
  });
998
672
  &nbsp;
999
- const stopDefault = <span class="fstat-no" title="function not covered" >(e</span>vent:any) =&gt; {
1000
- <span class="cstat-no" title="statement not covered" > event.preventDefault();</span>
1001
- <span class="cstat-no" title="statement not covered" > event.stopPropagation();</span>
673
+ const buttonStyle = <span class="cstat-no" title="statement not covered" >{</span>
674
+ ...props.buttonStyleOverride,
1002
675
  };
1003
676
  &nbsp;
1004
- useEffect(() =&gt; {
1005
- <span class="missing-if-branch" title="else path not taken" >E</span>if (!mapHook.map) return;
1006
- &nbsp;
1007
- const visibility = <span class="cstat-no" title="statement not covered" >props.visible ? "visible" : "none";</span>
677
+ const buttonClickHandler = <span class="cstat-no" title="statement not covered" >useCallback(</span>
678
+ <span class="fstat-no" title="function not covered" > (b</span>uttonDrawMode: string) =&gt; {
679
+ <span class="cstat-no" title="statement not covered" > console.log(buttonDrawMode);</span>
680
+ <span class="cstat-no" title="statement not covered" > sketchState.drawMode !== buttonDrawMode</span>
681
+ ? setSketchState(<span class="fstat-no" title="function not covered" >(_</span>sketchTool) =&gt; (<span class="cstat-no" title="statement not covered" >{</span>
682
+ drawMode: buttonDrawMode,
683
+ geometries: _sketchTool.geometries,
684
+ activeGeometryIndex: 0,
685
+ selectedGeoJson: undefined,
686
+ }))
687
+ : setSketchState(<span class="fstat-no" title="function not covered" >(_</span>sketchTool) =&gt; (<span class="cstat-no" title="statement not covered" >{</span>
688
+ drawMode: '',
689
+ geometries: _sketchTool.geometries,
690
+ activeGeometryIndex: 0,
691
+ selectedGeoJson: undefined,
692
+ }));
693
+ },
694
+ [sketchState]
695
+ );
1008
696
  &nbsp;
1009
- <span class="cstat-no" title="statement not covered" > [layerNameLines, layerNamePoints].forEach(<span class="fstat-no" title="function not covered" >(l</span>ayerName) =&gt; {</span>
1010
- <span class="cstat-no" title="statement not covered" > if(!mapHook.map)<span class="cstat-no" title="statement not covered" >return;</span></span>
697
+ const removeGeoJson = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(g</span>eoJson: Feature): void =&gt; {</span>
698
+ <span class="cstat-no" title="statement not covered" > setSketchState(<span class="fstat-no" title="function not covered" >(_</span>sketchState) =&gt; {</span>
699
+ const tempGeometries = <span class="cstat-no" title="statement not covered" >[..._sketchState.geometries];</span>
700
+ <span class="cstat-no" title="statement not covered" > tempGeometries.splice(tempGeometries.indexOf(geoJson), 1);</span>
1011
701
  &nbsp;
1012
- <span class="cstat-no" title="statement not covered" > mapHook.map.map.setLayoutProperty(layerName, "visibility", visibility);</span>
702
+ <span class="cstat-no" title="statement not covered" > return {</span>
703
+ ..._sketchState,
704
+ geometries: tempGeometries,
705
+ activeGeometryIndex: _sketchState.activeGeometryIndex - 1,
706
+ };
1013
707
  });
1014
- }, [props.visible]);
1015
- &nbsp;
1016
- const dropHandler = <span class="fstat-no" title="function not covered" >(e</span>vent:any) =&gt; {
1017
- <span class="cstat-no" title="statement not covered" > event.preventDefault();</span>
1018
- &nbsp;
1019
- <span class="cstat-no" title="statement not covered" > if (event.dataTransfer.items) {</span>
1020
- <span class="cstat-no" title="statement not covered" > if (event.dataTransfer.items.length &gt; 1) {</span>
1021
- <span class="cstat-no" title="statement not covered" > return false;</span>
1022
- }
1023
- // If dropped items aren't files, reject them
1024
- <span class="cstat-no" title="statement not covered" > if (event.dataTransfer.items[0].kind === "file") {</span>
1025
- const reader = <span class="cstat-no" title="statement not covered" >new FileReader();</span>
1026
- <span class="cstat-no" title="statement not covered" > reader.onload = <span class="fstat-no" title="function not covered" >(p</span>ayload:any) =&gt; {</span>
1027
- <span class="cstat-no" title="statement not covered" > if(!payload?.currentTarget?.result)<span class="cstat-no" title="statement not covered" >return;</span></span>
1028
- &nbsp;
1029
- <span class="cstat-no" title="statement not covered" > addGPXToMap(payload.currentTarget.result);</span>
1030
- };
1031
- const file = <span class="cstat-no" title="statement not covered" >event.dataTransfer.items[0].getAsFile();</span>
1032
- <span class="cstat-no" title="statement not covered" > reader.readAsText(file);</span>
1033
- }
1034
- } else {
1035
- // Use DataTransfer interface to access the file(s)
1036
- }
1037
- <span class="cstat-no" title="statement not covered" > return;</span>
1038
- };
1039
- &nbsp;
1040
- const addGPXToMap = <span class="fstat-no" title="function not covered" >(g</span>pxAsString:string) =&gt; {
1041
- <span class="cstat-no" title="statement not covered" > if (!mapHook.map || !dataSource.setData) <span class="cstat-no" title="statement not covered" >return;</span></span>
1042
- &nbsp;
1043
- <span class="cstat-no" title="statement not covered" > try {</span>
1044
- <span class="cstat-no" title="statement not covered" > setMetaData([]);</span>
1045
- const domParser = <span class="cstat-no" title="statement not covered" >new DOMParser();</span>
1046
- const gpxDoc = <span class="cstat-no" title="statement not covered" >domParser.parseFromString(gpxAsString, "application/xml");</span>
1047
- const metadata = <span class="cstat-no" title="statement not covered" >gpxDoc.querySelector("metadata");</span>
1048
- <span class="cstat-no" title="statement not covered" > metadata?.childNodes.forEach(<span class="fstat-no" title="function not covered" >(n</span>ode:Element) =&gt; {</span>
1049
- let value = <span class="cstat-no" title="statement not covered" >node.textContent;</span>
1050
- const title = <span class="cstat-no" title="statement not covered" >node.nodeName;</span>
1051
- &nbsp;
1052
- <span class="cstat-no" title="statement not covered" > if (node.nodeName === "link") {</span>
1053
- <span class="cstat-no" title="statement not covered" > value = node.getAttribute("href");</span>
1054
- }
1055
- <span class="cstat-no" title="statement not covered" > if (!!value?.trim().length) {</span>
1056
- const metaDatEntry = <span class="cstat-no" title="statement not covered" >{</span>
1057
- title: title,
1058
- value: value,
1059
- id: new Date().getTime(),
1060
- };
1061
- <span class="cstat-no" title="statement not covered" > setMetaData(<span class="fstat-no" title="function not covered" >(p</span>revState) =&gt; <span class="cstat-no" title="statement not covered" >[...prevState, metaDatEntry])</span>;</span>
1062
- }
1063
- });
1064
- const data = <span class="cstat-no" title="statement not covered" >toGeoJSON.gpx(gpxDoc);</span>
1065
- <span class="cstat-no" title="statement not covered" > dataSource.setData(data);</span>
1066
- <span class="cstat-no" title="statement not covered" > (mapHook.map.map.getSource(sourceName) as GeoJSONSource).setData(data as GeoJSON);</span>
1067
- const bounds = <span class="cstat-no" title="statement not covered" >bbox(data);</span>
1068
- <span class="cstat-no" title="statement not covered" > mapHook.map.map.fitBounds(bounds as LngLatBoundsLike);</span>
1069
- } catch (e) {
1070
- <span class="cstat-no" title="statement not covered" > console.log(e);</span>
1071
- }
1072
- };
1073
- &nbsp;
1074
- const toogleDrawer = <span class="fstat-no" title="function not covered" >()</span> =&gt; {
1075
- <span class="cstat-no" title="statement not covered" > setIsOpen(<span class="fstat-no" title="function not covered" >(p</span>revState) =&gt; <span class="cstat-no" title="statement not covered" >!prevState)</span>;</span>
1076
- };
1077
- &nbsp;
1078
- const fileUploadOnChange = <span class="fstat-no" title="function not covered" >()</span> =&gt; {
1079
- <span class="cstat-no" title="statement not covered" > if(!fileupload.current)<span class="cstat-no" title="statement not covered" >return false;</span></span>
1080
- &nbsp;
1081
- const file = <span class="cstat-no" title="statement not covered" >fileupload.current?.files?.[0];</span>
1082
- <span class="cstat-no" title="statement not covered" > if (!file) <span class="cstat-no" title="statement not covered" >return false;</span></span>
1083
- const reader = <span class="cstat-no" title="statement not covered" >new FileReader();</span>
1084
- <span class="cstat-no" title="statement not covered" > reader.onload = <span class="fstat-no" title="function not covered" >(p</span>ayload:any) =&gt; {</span>
1085
- <span class="cstat-no" title="statement not covered" > if(!payload)<span class="cstat-no" title="statement not covered" >return;</span></span>
1086
- &nbsp;
1087
- <span class="cstat-no" title="statement not covered" > addGPXToMap(payload.currentTarget.result);</span>
1088
- };
1089
- &nbsp;
1090
- <span class="cstat-no" title="statement not covered" > reader.readAsText(file);</span>
1091
- &nbsp;
1092
- <span class="cstat-no" title="statement not covered" > return;</span>
1093
708
  };
1094
709
  &nbsp;
1095
- const manualUpload = <span class="fstat-no" title="function not covered" >()</span> =&gt; {
1096
- <span class="cstat-no" title="statement not covered" > if(!fileupload.current)<span class="cstat-no" title="statement not covered" >return;</span></span>
1097
- &nbsp;
1098
- <span class="cstat-no" title="statement not covered" > fileupload.current.click();</span>
1099
- };
1100
- return (
710
+ <span class="cstat-no" title="statement not covered" > return (</span>
1101
711
  &lt;&gt;
1102
- &lt;div
1103
- style={{
1104
- position: "fixed",
1105
- right: "5px",
1106
- bottom: mediaIsMobile ? <span class="branch-0 cbranch-no" title="branch not covered" >"40px" </span>: "25px",
1107
- display: "flex",
1108
- flexDirection: "column",
1109
- gap: "5px",
1110
- zIndex: 1000,
712
+ &lt;Box
713
+ sx={{
714
+ zIndex: 104,
1111
715
  }}
1112
716
  &gt;
1113
- &lt;IconButton
1114
- onClick={manualUpload}
1115
- style={{
1116
- backgroundColor: "rgba(255,255,255,1)",
717
+ &lt;ButtonGroup&gt;
718
+ &lt;Tooltip title={'point'}&gt;
719
+ &lt;IconButton sx={buttonStyle} onClick={<span class="fstat-no" title="function not covered" >()</span> =&gt; <span class="cstat-no" title="statement not covered" >buttonClickHandler('draw_point')}</span>&gt;
720
+ &lt;PanoramaFishEyeIcon /&gt;
721
+ &lt;/IconButton&gt;
722
+ &lt;/Tooltip&gt;
723
+ &lt;Tooltip title={'Line'}&gt;
724
+ &lt;IconButton sx={buttonStyle} onClick={<span class="fstat-no" title="function not covered" >()</span> =&gt; <span class="cstat-no" title="statement not covered" >buttonClickHandler('draw_line_string')}</span>&gt;
725
+ &lt;ShowChartIcon /&gt;
726
+ &lt;/IconButton&gt;
727
+ &lt;/Tooltip&gt;
728
+ &lt;Tooltip title={'Polygon'}&gt;
729
+ &lt;IconButton sx={buttonStyle} onClick={<span class="fstat-no" title="function not covered" >()</span> =&gt; <span class="cstat-no" title="statement not covered" >buttonClickHandler('custom_polygon')}</span>&gt;
730
+ &lt;PentagonIcon /&gt;
731
+ &lt;/IconButton&gt;
732
+ &lt;/Tooltip&gt;
733
+ &lt;/ButtonGroup&gt;
734
+ &lt;/Box&gt;
735
+ &nbsp;
736
+ {sketchState.drawMode &amp;&amp; (
737
+ &lt;MlFeatureEditor
738
+ mode={
739
+ sketchState.drawMode === 'edit'
740
+ ? sketchState.selectedGeoJson?.geometry?.type === 'LineString'
741
+ ? 'simple_select'
742
+ : 'custom_select'
743
+ : sketchState.drawMode
744
+ }
745
+ geojson={sketchState.drawMode === 'edit' ? sketchState.selectedGeoJson : undefined}
746
+ onChange={<span class="fstat-no" title="function not covered" >(f</span>eature: object) =&gt; {
747
+ <span class="cstat-no" title="statement not covered" > setSketchState(<span class="fstat-no" title="function not covered" >(_</span>sketchState) =&gt; {</span>
748
+ const _geometries = <span class="cstat-no" title="statement not covered" >[...sketchState.geometries];</span>
749
+ <span class="cstat-no" title="statement not covered" > if (sketchState.drawMode === 'edit' &amp;&amp; sketchState.selectedGeoJson) {</span>
750
+ <span class="cstat-no" title="statement not covered" > _geometries[_geometries.indexOf(sketchState.selectedGeoJson)] = feature[0];</span>
751
+ } else {
752
+ <span class="cstat-no" title="statement not covered" > if (!sketchState.activeGeometryIndex) {</span>
753
+ const tempFeature = <span class="cstat-no" title="statement not covered" >feature[0];</span>
754
+ <span class="cstat-no" title="statement not covered" > tempFeature.properties.id = tempFeature.id;</span>
755
+ &nbsp;
756
+ <span class="cstat-no" title="statement not covered" > _geometries.push(tempFeature);</span>
757
+ } else {
758
+ <span class="cstat-no" title="statement not covered" > _geometries[sketchState.activeGeometryIndex] = feature[0];</span>
759
+ }
760
+ }
761
+ <span class="cstat-no" title="statement not covered" > return {</span>
762
+ ..._sketchState,
763
+ activeGeometryIndex:
764
+ _sketchState.drawMode !== 'edit' &amp;&amp; feature[0].geometry.type !== 'Point'
765
+ ? _geometries.length - 1
766
+ : _sketchState.activeGeometryIndex,
767
+ geometries: _geometries,
768
+ };
769
+ });
1117
770
  }}
1118
- size="large"
1119
- &gt;
1120
- &lt;input
1121
- ref={fileupload}
1122
- onChange={fileUploadOnChange}
1123
- type="file"
1124
- id="input"
1125
- multiple
1126
- style={{ display: "none" }}
1127
- &gt;&lt;/input&gt;
1128
- &lt;FileCopy /&gt;
1129
- &lt;/IconButton&gt;
1130
- &lt;IconButton
1131
- onClick={toogleDrawer}
1132
- style={{
1133
- backgroundColor: "rgba(255,255,255,1)",
771
+ onFinish={<span class="fstat-no" title="function not covered" >()</span> =&gt; {
772
+ <span class="cstat-no" title="statement not covered" > setSketchState(<span class="fstat-no" title="function not covered" >(_</span>sketchState) =&gt; (<span class="cstat-no" title="statement not covered" >{</span></span>
773
+ ..._sketchState,
774
+ drawMode: '',
775
+ activeGeometryIndex:
776
+ _sketchState.drawMode !== 'draw_point' ? 0 : _sketchState.activeGeometryIndex,
777
+ selectedGeoJson:
778
+ _sketchState.drawMode !== 'draw_point' ? undefined : _sketchState.selectedGeoJson,
779
+ }));
1134
780
  }}
1135
- size="large"
1136
- &gt;
1137
- &lt;InfoIcon /&gt;
1138
- &lt;/IconButton&gt;
1139
- &lt;/div&gt;
1140
- &lt;Drawer variant="persistent" anchor="left" open={open}&gt;
1141
- &lt;Typography
1142
- variant="h6"
1143
- style={{
1144
- textAlign: "center",
1145
- padding: "1em",
1146
- }}
1147
- noWrap
1148
- &gt;
1149
- Informationen zur Route
1150
- &lt;/Typography&gt;
1151
- &lt;Divider /&gt;
1152
- &lt;List&gt;
1153
- {metaData.map(<span class="fstat-no" title="function not covered" >(i</span>tem) =&gt; (
1154
- <span class="cstat-no" title="statement not covered" > &lt;ListItem key={`item--${item.id}`}&gt;</span>
1155
- &lt;ListItemText primary={item.value} /&gt;
1156
- &lt;/ListItem&gt;
1157
- ))}
1158
- &lt;/List&gt;
1159
- &lt;/Drawer&gt;
1160
- &lt;div
1161
- onDrop={dropHandler}
1162
- ref={dropZone}
1163
- style={{
1164
- position: "absolute",
1165
- left: "0",
1166
- top: "0",
1167
- backgroundColor: "rgba(255,255,255,0.5)",
1168
- width: "100%",
1169
- height: "100%",
1170
- zIndex: zIndex,
1171
- }}
1172
- &gt;
1173
- &lt;Typography
1174
- variant="h6"
1175
- style={{
1176
- top: "50%",
1177
- position: "absolute",
1178
- left: "50%",
1179
- msTransform: "translate(-50%, -50%)",
1180
- transform: " translate(-50%, -50%)",
1181
- }}
1182
- noWrap
1183
- &gt;
1184
- Gpx-Datei ablegen
1185
- &lt;/Typography&gt;
1186
- &lt;/div&gt;
781
+ /&gt;
782
+ )}
783
+ &nbsp;
784
+ &lt;List sx={{ zIndex: 105 }}&gt;
785
+ {sketchState.geometries.map(<span class="fstat-no" title="function not covered" >(e</span>l) =&gt; (
786
+ <span class="cstat-no" title="statement not covered" > &lt;&gt;</span>
787
+ &lt;Box key={el.id} sx={{ display: 'flex', flexDirection: 'column' }}&gt;
788
+ &lt;br /&gt;
789
+ &lt;Box
790
+ flexDirection={'row'}
791
+ sx={{
792
+ '&amp;:hover': {
793
+ backgroundColor: 'rgb(177, 177, 177, 0.2)',
794
+ },
795
+ }}
796
+ onMouseOver={<span class="fstat-no" title="function not covered" >()</span> =&gt; {
797
+ <span class="cstat-no" title="statement not covered" > setHoveredGeometry(el);</span>
798
+ }}
799
+ onMouseLeave={<span class="fstat-no" title="function not covered" >()</span> =&gt; {
800
+ <span class="cstat-no" title="statement not covered" > setHoveredGeometry(undefined);</span>
801
+ }}
802
+ &gt;
803
+ {/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */}
804
+ {/* @ts-ignore-next-line */}
805
+ &lt;LayerListItem
806
+ sx={buttonStyle}
807
+ visible={true}
808
+ configurable={true}
809
+ layerComponent={
810
+ &lt;MlGeoJsonLayer mapId={props.mapId} geojson={el} layerId={String(el.id)} /&gt;
811
+ }
812
+ type={'layer'}
813
+ name={String(el.id)}
814
+ description={el.geometry.type}
815
+ &gt;
816
+ &lt;SettingsIcon /&gt;
817
+ &lt;/LayerListItem&gt;
818
+ &lt;IconButton
819
+ onClick={<span class="fstat-no" title="function not covered" >()</span> =&gt; {
820
+ <span class="cstat-no" title="statement not covered" > mapHook?.map?.map.setCenter(</span>
821
+ el.geometry.type === 'Point'
822
+ ? (el.geometry.coordinates as LngLatLike)
823
+ : (turf.centerOfMass(el).geometry.coordinates as LngLatLike)
824
+ );
825
+ }}
826
+ &gt;
827
+ &lt;GpsFixedIcon /&gt;
828
+ &lt;/IconButton&gt;
829
+ &lt;IconButton
830
+ sx={buttonStyle}
831
+ onClick={<span class="fstat-no" title="function not covered" >()</span> =&gt; {
832
+ <span class="cstat-no" title="statement not covered" > setSketchState(<span class="fstat-no" title="function not covered" >(_</span>sketchState) =&gt; (<span class="cstat-no" title="statement not covered" >{</span></span>
833
+ ..._sketchState,
834
+ selectedGeoJson: el,
835
+ drawMode: 'edit',
836
+ }));
837
+ }}
838
+ &gt;
839
+ &lt;EditIcon /&gt;
840
+ &lt;/IconButton&gt;
841
+ &lt;IconButton
842
+ sx={buttonStyle}
843
+ onClick={<span class="fstat-no" title="function not covered" >()</span> =&gt; {
844
+ <span class="cstat-no" title="statement not covered" > removeGeoJson(el);</span>
845
+ }}
846
+ &gt;
847
+ &lt;DeleteIcon /&gt;
848
+ &lt;/IconButton&gt;
849
+ &lt;/Box&gt;
850
+ &lt;/Box&gt;
851
+ &lt;/&gt;
852
+ ))}
853
+ {hoveredGeometry &amp;&amp; (
854
+ &lt;MlGeoJsonLayer
855
+ mapId={props.mapId}
856
+ geojson={{ type: 'FeatureCollection', features: [hoveredGeometry] }}
857
+ type={'line'}
858
+ layerId={'highlightBorder'}
859
+ paint={{
860
+ 'line-color': '#dd9900',
861
+ 'line-opacity': 0.4,
862
+ 'line-width': 10,
863
+ }}
864
+ /&gt;
865
+ )}
866
+ &lt;/List&gt;
867
+ {sketchState.drawMode === 'edit' &amp;&amp; (
868
+ &lt;Box&gt;Edit {sketchState.selectedGeoJson?.geometry?.type}&lt;/Box&gt;
869
+ )}
1187
870
  &lt;/&gt;
1188
871
  );
1189
872
  };
1190
873
  &nbsp;
1191
- MlGPXViewer.defaultProps = {
1192
- visible: true,
874
+ <span class="cstat-no" title="statement not covered" >MlSketchTool.defaultProps = {</span>
875
+ mapId: undefined,
876
+ buttonStyleOverride: {},
1193
877
  };
1194
- &nbsp;
1195
- &nbsp;
1196
- export default MlGPXViewer;
878
+ export default MlSketchTool;
1197
879
  &nbsp;</pre></td></tr></table></pre>
1198
880
 
1199
881
  <div class='push'></div><!-- for sticky footer -->
@@ -1201,7 +883,7 @@ export default MlGPXViewer;
1201
883
  <div class='footer quiet pad2 space-top1 center small'>
1202
884
  Code coverage generated by
1203
885
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1204
- at Sat Nov 26 2022 10:32:12 GMT+0000 (Coordinated Universal Time)
886
+ at 2023-01-15T17:55:43.336Z
1205
887
  </div>
1206
888
  <script src="../../../prettify.js"></script>
1207
889
  <script>