@mapcomponents/react-maplibre 0.1.56 → 0.1.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/.eslintignore +11 -0
  2. package/.eslintrc.js +20 -0
  3. package/.github/workflows/check-formatting.yml +46 -0
  4. package/.prettierignore +11 -0
  5. package/.prettierrc.json +6 -0
  6. package/CHANGELOG.md +20 -0
  7. package/coverage/clover.xml +232 -80
  8. package/coverage/coverage-final.json +43 -37
  9. package/coverage/lcov-report/index.html +71 -26
  10. package/coverage/lcov-report/src/components/MapLibreMap/MapLibreMap.tsx.html +83 -83
  11. package/coverage/lcov-report/src/components/MapLibreMap/index.html +1 -1
  12. package/coverage/lcov-report/src/components/MlCenterPosition/MlCenterPosition.tsx.html +66 -66
  13. package/coverage/lcov-report/src/components/MlCenterPosition/index.html +1 -1
  14. package/coverage/lcov-report/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx.html +30 -30
  15. package/coverage/lcov-report/src/components/MlCreatePdfButton/index.html +1 -1
  16. package/coverage/lcov-report/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx.html +202 -0
  17. package/coverage/lcov-report/src/components/MlCreatePdfForm/index.html +116 -0
  18. package/coverage/lcov-report/src/components/MlFeatureEditor/MlFeatureEditor.tsx.html +99 -99
  19. package/coverage/lcov-report/src/components/MlFeatureEditor/index.html +1 -1
  20. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.tsx.html +66 -66
  21. package/coverage/lcov-report/src/components/MlFillExtrusionLayer/index.html +1 -1
  22. package/coverage/lcov-report/src/components/MlFollowGps/MlFollowGps.tsx.html +221 -221
  23. package/coverage/lcov-report/src/components/MlFollowGps/index.html +1 -1
  24. package/coverage/lcov-report/src/components/MlGPXViewer/MlGPXViewer.tsx.html +308 -308
  25. package/coverage/lcov-report/src/components/MlGPXViewer/gpxConverter.js.html +497 -497
  26. package/coverage/lcov-report/src/components/MlGPXViewer/index.html +1 -1
  27. package/coverage/lcov-report/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx.html +85 -85
  28. package/coverage/lcov-report/src/components/MlGeoJsonLayer/index.html +1 -1
  29. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.tsx.html +469 -0
  30. package/coverage/lcov-report/src/components/MlGeojsonLayerWithSource/index.html +116 -0
  31. package/coverage/lcov-report/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx.html +140 -140
  32. package/coverage/lcov-report/src/components/MlImageMarkerLayer/index.html +1 -1
  33. package/coverage/lcov-report/src/components/MlLayer/MlLayer.tsx.html +37 -37
  34. package/coverage/lcov-report/src/components/MlLayer/index.html +1 -1
  35. package/coverage/lcov-report/src/components/MlLayerMagnify/MlLayerMagnify.tsx.html +179 -179
  36. package/coverage/lcov-report/src/components/MlLayerMagnify/index.html +1 -1
  37. package/coverage/lcov-report/src/components/MlLayerSwipe/MlLayerSwipe.tsx.html +113 -113
  38. package/coverage/lcov-report/src/components/MlLayerSwipe/index.html +1 -1
  39. package/coverage/lcov-report/src/components/MlLayerSwitcher/MlLayerSwitcher.js.html +181 -181
  40. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/LayerBox.js.html +58 -58
  41. package/coverage/lcov-report/src/components/MlLayerSwitcher/components/index.html +1 -1
  42. package/coverage/lcov-report/src/components/MlLayerSwitcher/index.html +1 -1
  43. package/coverage/lcov-report/src/components/MlMarker/MlMarker.tsx.html +108 -108
  44. package/coverage/lcov-report/src/components/MlMarker/index.html +1 -1
  45. package/coverage/lcov-report/src/components/MlMeasureTool/MlMeasureTool.tsx.html +39 -39
  46. package/coverage/lcov-report/src/components/MlMeasureTool/index.html +1 -1
  47. package/coverage/lcov-report/src/components/MlNavigationCompass/MlNavigationCompass.tsx.html +183 -183
  48. package/coverage/lcov-report/src/components/MlNavigationCompass/index.html +1 -1
  49. package/coverage/lcov-report/src/components/MlNavigationTools/MlNavigationTools.tsx.html +163 -163
  50. package/coverage/lcov-report/src/components/MlNavigationTools/index.html +1 -1
  51. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.js.html +50 -50
  52. package/coverage/lcov-report/src/components/MlOsmLayer/MlOsmLayer.stories_.js.html +30 -30
  53. package/coverage/lcov-report/src/components/MlOsmLayer/index.html +1 -1
  54. package/coverage/lcov-report/src/components/MlScaleReference/MlScaleReference.js.html +89 -89
  55. package/coverage/lcov-report/src/components/MlScaleReference/index.html +11 -11
  56. package/coverage/lcov-report/src/components/MlShareMapState/MlShareMapState.js.html +204 -204
  57. package/coverage/lcov-report/src/components/MlShareMapState/index.html +1 -1
  58. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js.html +180 -180
  59. package/coverage/lcov-report/src/components/MlSpatialElevationProfile/index.html +1 -1
  60. package/coverage/lcov-report/src/components/MlThreeJsLayer/MlThreeJsLayer.js.html +163 -163
  61. package/coverage/lcov-report/src/components/MlThreeJsLayer/index.html +1 -1
  62. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx.html +136 -136
  63. package/coverage/lcov-report/src/components/MlTransitionGeoJsonLayer/index.html +1 -1
  64. package/coverage/lcov-report/src/components/MlUseMapDebugger/MlUseMapDebugger.js.html +53 -53
  65. package/coverage/lcov-report/src/components/MlUseMapDebugger/index.html +1 -1
  66. package/coverage/lcov-report/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx.html +123 -123
  67. package/coverage/lcov-report/src/components/MlVectorTileLayer/index.html +1 -1
  68. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js.html +35 -35
  69. package/coverage/lcov-report/src/components/MlWmsFeatureInfoPopup/index.html +1 -1
  70. package/coverage/lcov-report/src/components/MlWmsLayer/MlWmsLayer.tsx.html +155 -155
  71. package/coverage/lcov-report/src/components/MlWmsLayer/index.html +1 -1
  72. package/coverage/lcov-report/src/components/MlWmsLoader/MlWmsLoader.tsx.html +255 -255
  73. package/coverage/lcov-report/src/components/MlWmsLoader/index.html +1 -1
  74. package/coverage/lcov-report/src/contexts/MapContext.tsx.html +66 -66
  75. package/coverage/lcov-report/src/contexts/SimpleDataContext.js.html +1 -1
  76. package/coverage/lcov-report/src/contexts/SimpleDataProvider.js.html +48 -48
  77. package/coverage/lcov-report/src/contexts/index.html +1 -1
  78. package/coverage/lcov-report/src/hooks/exportMap/index.html +131 -0
  79. package/coverage/lcov-report/src/hooks/exportMap/index.ts.html +175 -0
  80. package/coverage/lcov-report/src/hooks/exportMap/lib.ts.html +646 -0
  81. package/coverage/lcov-report/src/hooks/index.html +48 -18
  82. package/coverage/lcov-report/src/hooks/useLayer.ts.html +230 -188
  83. package/coverage/lcov-report/src/hooks/useLayerEvent.js.html +232 -0
  84. package/coverage/lcov-report/src/hooks/useMap.ts.html +72 -69
  85. package/coverage/lcov-report/src/hooks/useMapState.ts.html +145 -145
  86. package/coverage/lcov-report/src/hooks/useSource.ts.html +337 -0
  87. package/coverage/lcov-report/src/hooks/useWms.js.html +72 -72
  88. package/coverage/lcov-report/src/index.html +1 -1
  89. package/coverage/lcov-report/src/index.ts.html +14 -2
  90. package/coverage/lcov.info +450 -153
  91. package/dist/components/MlCreatePdfForm/MlCreatePdfForm.d.ts +24 -0
  92. package/dist/components/MlCreatePdfForm/MlCreatePdfForm.stories.d.ts +13 -0
  93. package/dist/components/MlCreatePdfForm/lib/PdfContext.d.ts +21 -0
  94. package/dist/components/MlCreatePdfForm/lib/PdfForm.d.ts +10 -0
  95. package/dist/components/MlCreatePdfForm/lib/PdfPreview.d.ts +13 -0
  96. package/dist/components/MlCreatePdfForm/lib/pdf.templates.d.ts +11 -0
  97. package/dist/components/MlFeatureEditor/lib/create_vertex.d.ts +1 -1
  98. package/dist/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.d.ts +22 -0
  99. package/dist/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.stories.d.ts +10 -0
  100. package/dist/components/MlLayerSwipe/MlLayerSwipe.d.ts +1 -1
  101. package/dist/components/MlWmsLayer/MlWmsLayer.d.ts +2 -2
  102. package/dist/decorators/MapContextDecoratorHooks.d.ts +2 -0
  103. package/dist/decorators/ThemeWrapper.d.ts +1 -0
  104. package/dist/hooks/exportMap/index.d.ts +11 -0
  105. package/dist/hooks/exportMap/lib.d.ts +36 -0
  106. package/dist/hooks/useLayer.d.ts +6 -5
  107. package/dist/hooks/useLayerEvent.d.ts +2 -0
  108. package/dist/hooks/useMap.d.ts +1 -1
  109. package/dist/hooks/useMapState.stories.d.ts +2 -2
  110. package/dist/hooks/useSource.d.ts +17 -0
  111. package/dist/hooks/useSources.stories.d.ts +13 -0
  112. package/dist/index.d.ts +4 -0
  113. package/dist/index.esm.js +479 -190
  114. package/dist/index.esm.js.map +1 -1
  115. package/eslintErrorTest.js +10 -0
  116. package/package.json +7 -1
  117. package/public/thumbnails/MlCreatePdfForm.png +0 -0
  118. package/src/components/MapLibreMap/MapLibreMap.stories.js +72 -72
  119. package/src/components/MapLibreMap/MapLibreMap.test.js +60 -60
  120. package/src/components/MapLibreMap/MapLibreMap.tsx +82 -82
  121. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.test.js +343 -343
  122. package/src/components/MapLibreMap/lib/MapLibreGlWrapper.ts +619 -619
  123. package/src/components/MlBasicComponent.js +25 -25
  124. package/src/components/MlCenterPosition/MlCenterPosition.stories.js +6 -6
  125. package/src/components/MlCenterPosition/MlCenterPosition.tsx +65 -65
  126. package/src/components/MlComponentTemplate/MlComponentTemplate.stories.js +5 -5
  127. package/src/components/MlComponentTemplate/MlComponentTemplate.tsx +23 -23
  128. package/src/components/MlCreatePdfButton/{MlCreatePdfButton.meta.json → MlCreatePdfButton.meta_.json} +0 -0
  129. package/src/components/MlCreatePdfButton/MlCreatePdfButton.stories.js +16 -16
  130. package/src/components/MlCreatePdfButton/MlCreatePdfButton.tsx +29 -29
  131. package/src/components/MlCreatePdfButton/lib/createPdf.ts +175 -175
  132. package/src/components/MlCreatePdfButton/lib/nominatimMap.ts +51 -51
  133. package/src/components/MlCreatePdfForm/MlCreatePdfForm.doc.de.md +3 -0
  134. package/src/components/MlCreatePdfForm/MlCreatePdfForm.meta.json +15 -0
  135. package/src/components/MlCreatePdfForm/MlCreatePdfForm.stories.tsx +152 -0
  136. package/src/components/MlCreatePdfForm/MlCreatePdfForm.tsx +39 -0
  137. package/src/components/MlCreatePdfForm/lib/PdfContext.tsx +53 -0
  138. package/src/components/MlCreatePdfForm/lib/PdfForm.tsx +161 -0
  139. package/src/components/MlCreatePdfForm/lib/PdfPreview.tsx +399 -0
  140. package/src/components/MlCreatePdfForm/lib/pdf.templates.ts +82 -0
  141. package/src/components/MlFeatureEditor/MlFeatureEditor.stories.js +55 -55
  142. package/src/components/MlFeatureEditor/MlFeatureEditor.test.js +105 -105
  143. package/src/components/MlFeatureEditor/MlFeatureEditor.tsx +119 -119
  144. package/src/components/MlFeatureEditor/custom-direct-select-mode.js +208 -208
  145. package/src/components/MlFeatureEditor/custom-polygon-mode.js +148 -148
  146. package/src/components/MlFeatureEditor/custom-select-mode.js +314 -314
  147. package/src/components/MlFeatureEditor/lib/common_selectors.js +34 -34
  148. package/src/components/MlFeatureEditor/lib/constants.js +61 -61
  149. package/src/components/MlFeatureEditor/lib/constrain_feature_movement.js +51 -51
  150. package/src/components/MlFeatureEditor/lib/create_midpoint.js +30 -30
  151. package/src/components/MlFeatureEditor/lib/create_supplementary_points.js +82 -82
  152. package/src/components/MlFeatureEditor/lib/create_vertex.js +16 -16
  153. package/src/components/MlFeatureEditor/lib/double_click_zoom.js +23 -23
  154. package/src/components/MlFeatureEditor/lib/euclidean_distance.js +3 -3
  155. package/src/components/MlFeatureEditor/lib/features_at.js +23 -23
  156. package/src/components/MlFeatureEditor/lib/get_features_and_set_cursor.js +15 -15
  157. package/src/components/MlFeatureEditor/lib/is_click.js +8 -8
  158. package/src/components/MlFeatureEditor/lib/is_event_at_coordinates.js +2 -2
  159. package/src/components/MlFeatureEditor/lib/is_tap.js +6 -6
  160. package/src/components/MlFeatureEditor/lib/map_event_to_bounding_box.js +4 -4
  161. package/src/components/MlFeatureEditor/lib/mode_handler.js +105 -105
  162. package/src/components/MlFeatureEditor/lib/mouse_event_point.js +5 -5
  163. package/src/components/MlFeatureEditor/lib/move_features.js +33 -33
  164. package/src/components/MlFeatureEditor/lib/sort_features.js +25 -25
  165. package/src/components/MlFeatureEditor/lib/string_set.js +36 -36
  166. package/src/components/MlFeatureEditor/lib/string_sets_are_equal.js +2 -2
  167. package/src/components/MlFeatureEditor/lib/theme.js +230 -230
  168. package/src/components/MlFeatureEditor/lib/to_dense_array.js +1 -1
  169. package/src/components/MlFeatureEditor/lib/utils.js +40 -40
  170. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.stories.js +9 -9
  171. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.test.js +4 -4
  172. package/src/components/MlFillExtrusionLayer/MlFillExtrusionLayer.tsx +65 -65
  173. package/src/components/MlFollowGps/MlFollowGps.stories.js +6 -6
  174. package/src/components/MlFollowGps/MlFollowGps.test.js +44 -44
  175. package/src/components/MlFollowGps/MlFollowGps.tsx +220 -220
  176. package/src/components/MlGPXViewer/MlGPXViewer.stories.js +15 -15
  177. package/src/components/MlGPXViewer/MlGPXViewer.test.js +12 -12
  178. package/src/components/MlGPXViewer/MlGPXViewer.tsx +345 -345
  179. package/src/components/MlGPXViewer/gpxConverter.js +496 -496
  180. package/src/components/MlGPXViewer/util/GeoJsonContext.ts +4 -4
  181. package/src/components/MlGPXViewer/util/GeoJsonProvider.tsx +16 -16
  182. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.stories.js +34 -34
  183. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.test.js +8 -8
  184. package/src/components/MlGeoJsonLayer/MlGeoJsonLayer.tsx +84 -84
  185. package/src/components/MlGeoJsonLayer/util/getDefaultLayerTypeByGeometry.ts +21 -21
  186. package/src/components/MlGeoJsonLayer/util/getDefaultPaintPropsByType.ts +27 -27
  187. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.doc.de.md +3 -0
  188. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.meta_.json +15 -0
  189. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.stories.js +19 -0
  190. package/src/components/MlGeojsonLayerWithSource/MlGeojsonLayerWithSource.tsx +128 -0
  191. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.stories.js +28 -28
  192. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.test.js +8 -8
  193. package/src/components/MlImageMarkerLayer/MlImageMarkerLayer.tsx +162 -162
  194. package/src/components/MlLayer/MlLayer.stories.js +5 -5
  195. package/src/components/MlLayer/MlLayer.test.js +86 -86
  196. package/src/components/MlLayer/MlLayer.tsx +36 -36
  197. package/src/components/MlLayerMagnify/MlLayerMagnify.stories.js +21 -21
  198. package/src/components/MlLayerMagnify/MlLayerMagnify.test.js +54 -54
  199. package/src/components/MlLayerMagnify/MlLayerMagnify.tsx +201 -201
  200. package/src/components/MlLayerSwipe/MlLayerSwipe.stories.js +20 -20
  201. package/src/components/MlLayerSwipe/MlLayerSwipe.test.js +54 -54
  202. package/src/components/MlLayerSwipe/MlLayerSwipe.tsx +130 -130
  203. package/src/components/MlLayerSwitcher/MlLayerSwitcher.js +194 -194
  204. package/src/components/MlLayerSwitcher/MlLayerSwitcher.stories.js +85 -85
  205. package/src/components/MlLayerSwitcher/components/LayerBox.js +57 -57
  206. package/src/components/MlMarker/MlMarker.stories.js +7 -7
  207. package/src/components/MlMarker/MlMarker.tsx +119 -119
  208. package/src/components/MlMeasureTool/MlMeasureTool.stories.js +64 -64
  209. package/src/components/MlMeasureTool/MlMeasureTool.tsx +38 -38
  210. package/src/components/MlNavigationCompass/MlNavigationCompass.stories.js +45 -45
  211. package/src/components/MlNavigationCompass/MlNavigationCompass.test.js +40 -40
  212. package/src/components/MlNavigationCompass/MlNavigationCompass.tsx +192 -192
  213. package/src/components/MlNavigationTools/MlNavigationTools.stories.js +18 -18
  214. package/src/components/MlNavigationTools/MlNavigationTools.tsx +173 -173
  215. package/src/components/MlOsmLayer/MlOsmLayer.js +49 -49
  216. package/src/components/MlOsmLayer/MlOsmLayer.stories_.js +29 -29
  217. package/src/components/MlOsmLayer/MlOsmLayer.test.js +8 -8
  218. package/src/components/MlScaleReference/MlScaleReference.js +82 -82
  219. package/src/components/MlScaleReference/MlScaleReference.stories.js +33 -35
  220. package/src/components/MlShareMapState/MlShareMapState.js +203 -203
  221. package/src/components/MlShareMapState/MlShareMapState.stories.js +68 -68
  222. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.js +201 -201
  223. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.stories.js +35 -35
  224. package/src/components/MlSpatialElevationProfile/MlSpatialElevationProfile.test.js +8 -8
  225. package/src/components/MlThreeJsLayer/MlThreeJsLayer.js +186 -186
  226. package/src/components/MlThreeJsLayer/MlThreeJsLayer.stories.js +21 -21
  227. package/src/components/MlThreeJsLayer/MlThreeJsLayer.test.js +24 -24
  228. package/src/components/MlThreeJsLayer/lib/GLTFLoader.js +3327 -3327
  229. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.stories.js +31 -30
  230. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.test.js +8 -8
  231. package/src/components/MlTransitionGeoJsonLayer/MlTransitionGeoJsonLayer.tsx +146 -146
  232. package/src/components/MlTransitionGeoJsonLayer/util/transitionFunctions.js +207 -207
  233. package/src/components/MlUseMapDebugger/MlUseMapDebugger.js +52 -52
  234. package/src/components/MlUseMapDebugger/MlUseMapDebugger.stories.js +13 -13
  235. package/src/components/MlVectorTileLayer/MlVectorTileLayer.stories.js +27 -27
  236. package/src/components/MlVectorTileLayer/MlVectorTileLayer.test.js +27 -27
  237. package/src/components/MlVectorTileLayer/MlVectorTileLayer.tsx +137 -137
  238. package/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.js +34 -34
  239. package/src/components/MlWmsFeatureInfoPopup/MlWmsFeatureInfoPopup.stories.js +7 -7
  240. package/src/components/MlWmsLayer/MlWmsLayer.stories.js +26 -26
  241. package/src/components/MlWmsLayer/MlWmsLayer.test.js +8 -8
  242. package/src/components/MlWmsLayer/MlWmsLayer.tsx +167 -167
  243. package/src/components/MlWmsLoader/MlWmsLoader.stories.js +27 -27
  244. package/src/components/MlWmsLoader/MlWmsLoader.tsx +254 -254
  245. package/src/contexts/MapComponentsProvider.test.js +229 -229
  246. package/src/contexts/MapContext.tsx +65 -65
  247. package/src/contexts/SimpleDataProvider.js +47 -47
  248. package/src/contexts/SimpleDataProvider.test.js +29 -29
  249. package/src/custom.d.tsx +14 -14
  250. package/src/decorators/MapContextDecorator.js +23 -25
  251. package/src/decorators/MapContextDecoratorHooks.js +34 -0
  252. package/src/decorators/MultiMapContextDecorator.js +63 -63
  253. package/src/decorators/NoNavToolsDecorator.js +17 -17
  254. package/src/decorators/ThemeWrapper.jsx +9 -0
  255. package/src/hooks/assets/pointWG.json +13 -0
  256. package/src/hooks/exportMap/index.ts +30 -0
  257. package/src/hooks/exportMap/lib.ts +187 -0
  258. package/src/hooks/useLayer.test.js +188 -188
  259. package/src/hooks/useLayer.ts +194 -180
  260. package/src/hooks/useLayerEvent.js +49 -0
  261. package/src/hooks/useMap.ts +67 -66
  262. package/src/hooks/useMapState.stories.js +78 -78
  263. package/src/hooks/useMapState.ts +161 -161
  264. package/src/hooks/useSource.ts +84 -0
  265. package/src/hooks/useSources.stories.js +232 -0
  266. package/src/hooks/useWms.js +71 -71
  267. package/src/index.ts +4 -0
  268. package/src/setupTests.js +86 -86
  269. package/src/ui_components/ImageLoader.js +62 -62
  270. package/src/ui_components/Legend.js +34 -34
  271. package/src/ui_components/LoadingOverlay.js +29 -29
  272. package/src/ui_components/LoadingOverlayContext.js +68 -68
  273. package/src/ui_components/Sidebar.js +80 -80
  274. package/src/ui_components/Tooltip.js +9 -9
  275. package/src/ui_components/TopToolbar.js +23 -23
  276. package/src/util/layerRemovalTest.js +111 -111
  277. package/src/util/sourceRemovalTest.js +103 -103
@@ -12,395 +12,395 @@ import moveFeatures from "./lib/move_features.js";
12
12
 
13
13
  const CustomSelectMode = {};
14
14
  CustomSelectMode.onSetup = function (opts) {
15
- console.log("Change mode: custom select");
16
-
17
- // turn the opts into state.
18
- const state = {
19
- dragMoveLocation: null,
20
- boxSelectStartLocation: null,
21
- boxSelectElement: undefined,
22
- boxSelecting: false,
23
- canBoxSelect: false,
24
- dragMoving: false,
25
- canDragMove: false,
26
- initiallySelectedFeatureIds: opts.featureIds || [],
27
- };
28
-
29
- this.setSelected(
30
- state.initiallySelectedFeatureIds.filter(
31
- (id) => this.getFeature(id) !== undefined
32
- )
33
- );
34
- this.fireActionable();
35
-
36
- this.setActionableState({
37
- combineFeatures: true,
38
- uncombineFeatures: true,
39
- trash: true,
40
- });
41
-
42
- return state;
15
+ console.log("Change mode: custom select");
16
+
17
+ // turn the opts into state.
18
+ const state = {
19
+ dragMoveLocation: null,
20
+ boxSelectStartLocation: null,
21
+ boxSelectElement: undefined,
22
+ boxSelecting: false,
23
+ canBoxSelect: false,
24
+ dragMoving: false,
25
+ canDragMove: false,
26
+ initiallySelectedFeatureIds: opts.featureIds || [],
27
+ };
28
+
29
+ this.setSelected(
30
+ state.initiallySelectedFeatureIds.filter(
31
+ (id) => this.getFeature(id) !== undefined
32
+ )
33
+ );
34
+ this.fireActionable();
35
+
36
+ this.setActionableState({
37
+ combineFeatures: true,
38
+ uncombineFeatures: true,
39
+ trash: true,
40
+ });
41
+
42
+ return state;
43
43
  };
44
44
 
45
45
  CustomSelectMode.fireUpdate = function () {
46
- this.map.fire(Constants.events.UPDATE, {
47
- action: Constants.updateActions.MOVE,
48
- features: this.getSelected().map((f) => f.toGeoJSON()),
49
- });
46
+ this.map.fire(Constants.events.UPDATE, {
47
+ action: Constants.updateActions.MOVE,
48
+ features: this.getSelected().map((f) => f.toGeoJSON()),
49
+ });
50
50
  };
51
51
 
52
52
  CustomSelectMode.fireActionable = function () {
53
- const selectedFeatures = this.getSelected();
54
-
55
- const multiFeatures = selectedFeatures.filter((feature) =>
56
- this.isInstanceOf("MultiFeature", feature)
57
- );
58
-
59
- let combineFeatures = false;
60
-
61
- if (selectedFeatures.length > 1) {
62
- combineFeatures = true;
63
- const featureType = selectedFeatures[0].type.replace("Multi", "");
64
- selectedFeatures.forEach((feature) => {
65
- if (feature.type.replace("Multi", "") !== featureType) {
66
- combineFeatures = false;
67
- }
68
- });
69
- }
70
-
71
- const uncombineFeatures = multiFeatures.length > 0;
72
- const trash = selectedFeatures.length > 0;
73
-
74
- this.setActionableState({
75
- combineFeatures,
76
- uncombineFeatures,
77
- trash,
78
- });
53
+ const selectedFeatures = this.getSelected();
54
+
55
+ const multiFeatures = selectedFeatures.filter((feature) =>
56
+ this.isInstanceOf("MultiFeature", feature)
57
+ );
58
+
59
+ let combineFeatures = false;
60
+
61
+ if (selectedFeatures.length > 1) {
62
+ combineFeatures = true;
63
+ const featureType = selectedFeatures[0].type.replace("Multi", "");
64
+ selectedFeatures.forEach((feature) => {
65
+ if (feature.type.replace("Multi", "") !== featureType) {
66
+ combineFeatures = false;
67
+ }
68
+ });
69
+ }
70
+
71
+ const uncombineFeatures = multiFeatures.length > 0;
72
+ const trash = selectedFeatures.length > 0;
73
+
74
+ this.setActionableState({
75
+ combineFeatures,
76
+ uncombineFeatures,
77
+ trash,
78
+ });
79
79
  };
80
80
 
81
81
  CustomSelectMode.getUniqueIds = function (allFeatures) {
82
- if (!allFeatures.length) return [];
83
- const ids = allFeatures
84
- .map((s) => s.properties.id)
85
- .filter((id) => id !== undefined)
86
- .reduce((memo, id) => {
87
- memo.add(id);
88
- return memo;
89
- }, new StringSet());
90
-
91
- return ids.values();
82
+ if (!allFeatures.length) return [];
83
+ const ids = allFeatures
84
+ .map((s) => s.properties.id)
85
+ .filter((id) => id !== undefined)
86
+ .reduce((memo, id) => {
87
+ memo.add(id);
88
+ return memo;
89
+ }, new StringSet());
90
+
91
+ return ids.values();
92
92
  };
93
93
 
94
94
  CustomSelectMode.stopExtendedInteractions = function (state) {
95
- if (state.boxSelectElement) {
96
- if (state.boxSelectElement.parentNode)
97
- state.boxSelectElement.parentNode.removeChild(state.boxSelectElement);
98
- state.boxSelectElement = null;
99
- }
100
-
101
- this.map.dragPan.enable();
102
-
103
- state.boxSelecting = false;
104
- state.canBoxSelect = false;
105
- state.dragMoving = false;
106
- state.canDragMove = false;
95
+ if (state.boxSelectElement) {
96
+ if (state.boxSelectElement.parentNode)
97
+ state.boxSelectElement.parentNode.removeChild(state.boxSelectElement);
98
+ state.boxSelectElement = null;
99
+ }
100
+
101
+ this.map.dragPan.enable();
102
+
103
+ state.boxSelecting = false;
104
+ state.canBoxSelect = false;
105
+ state.dragMoving = false;
106
+ state.canDragMove = false;
107
107
  };
108
108
 
109
109
  CustomSelectMode.onStop = function () {
110
- doubleClickZoom.enable(this);
110
+ doubleClickZoom.enable(this);
111
111
  };
112
112
 
113
113
  CustomSelectMode.onMouseMove = function (state) {
114
- // On mousemove that is not a drag, stop extended interactions.
115
- // This is useful if you drag off the canvas, release the button,
116
- // then move the mouse back over the canvas --- we don't allow the
117
- // interaction to continue then, but we do let it continue if you held
118
- // the mouse button that whole time
119
- return this.stopExtendedInteractions(state);
114
+ // On mousemove that is not a drag, stop extended interactions.
115
+ // This is useful if you drag off the canvas, release the button,
116
+ // then move the mouse back over the canvas --- we don't allow the
117
+ // interaction to continue then, but we do let it continue if you held
118
+ // the mouse button that whole time
119
+ return this.stopExtendedInteractions(state);
120
120
  };
121
121
 
122
122
  CustomSelectMode.onMouseOut = function (state) {
123
- // As soon as you mouse leaves the canvas, update the feature
124
- if (state.dragMoving) return this.fireUpdate();
123
+ // As soon as you mouse leaves the canvas, update the feature
124
+ if (state.dragMoving) return this.fireUpdate();
125
125
  };
126
126
 
127
127
  CustomSelectMode.onTap = CustomSelectMode.onClick = function (state, e) {
128
- // Click (with or without shift) on no feature
129
- if (CommonSelectors.noTarget(e)) return this.clickAnywhere(state, e); // also tap
130
- if (CommonSelectors.isOfMetaType(Constants.meta.VERTEX)(e))
131
- return this.clickOnVertex(state, e); //tap
132
- if (CommonSelectors.isFeature(e)) return this.clickOnFeature(state, e);
128
+ // Click (with or without shift) on no feature
129
+ if (CommonSelectors.noTarget(e)) return this.clickAnywhere(state, e); // also tap
130
+ if (CommonSelectors.isOfMetaType(Constants.meta.VERTEX)(e))
131
+ return this.clickOnVertex(state, e); //tap
132
+ if (CommonSelectors.isFeature(e)) return this.clickOnFeature(state, e);
133
133
  };
134
134
 
135
135
  CustomSelectMode.clickAnywhere = function (state) {
136
- // Clear the re-render selection
137
- const wasSelected = this.getSelectedIds();
138
- if (wasSelected.length) {
139
- this.clearSelectedFeatures();
140
- wasSelected.forEach((id) => this.doRender(id));
141
- }
142
- doubleClickZoom.enable(this);
143
- this.stopExtendedInteractions(state);
136
+ // Clear the re-render selection
137
+ const wasSelected = this.getSelectedIds();
138
+ if (wasSelected.length) {
139
+ this.clearSelectedFeatures();
140
+ wasSelected.forEach((id) => this.doRender(id));
141
+ }
142
+ doubleClickZoom.enable(this);
143
+ this.stopExtendedInteractions(state);
144
144
  };
145
145
 
146
146
  CustomSelectMode.clickOnVertex = function (state, e) {
147
- // Enter direct select mode
148
- this.changeMode("custom_direct_select", {
149
- featureId: e.featureTarget.properties.parent,
150
- coordPath: e.featureTarget.properties.coord_path,
151
- startPos: e.lngLat,
152
- // groupMove_vertices: matchingVertices,
153
- });
154
- this.updateUIClasses({ mouse: Constants.cursors.MOVE });
147
+ // Enter direct select mode
148
+ this.changeMode("custom_direct_select", {
149
+ featureId: e.featureTarget.properties.parent,
150
+ coordPath: e.featureTarget.properties.coord_path,
151
+ startPos: e.lngLat,
152
+ // groupMove_vertices: matchingVertices,
153
+ });
154
+ this.updateUIClasses({ mouse: Constants.cursors.MOVE });
155
155
  };
156
156
 
157
157
  CustomSelectMode.startOnActiveFeature = function (state, e) {
158
- // Stop any already-underway extended interactions
159
- this.stopExtendedInteractions(state);
158
+ // Stop any already-underway extended interactions
159
+ this.stopExtendedInteractions(state);
160
160
 
161
- // Disable map.dragPan immediately so it can't start
162
- this.map.dragPan.disable();
161
+ // Disable map.dragPan immediately so it can't start
162
+ this.map.dragPan.disable();
163
163
 
164
- // Re-render it and enable drag move
165
- this.doRender(e.featureTarget.properties.id);
164
+ // Re-render it and enable drag move
165
+ this.doRender(e.featureTarget.properties.id);
166
166
 
167
- // Set up the state for drag moving
168
- state.canDragMove = true;
169
- state.dragMoveLocation = e.lngLat;
167
+ // Set up the state for drag moving
168
+ state.canDragMove = true;
169
+ state.dragMoveLocation = e.lngLat;
170
170
  };
171
171
 
172
172
  CustomSelectMode.clickOnFeature = function (state, e) {
173
- // Stop everything
174
- doubleClickZoom.disable(this);
175
- this.stopExtendedInteractions(state);
176
-
177
- const isShiftClick = CommonSelectors.isShiftDown(e);
178
- const selectedFeatureIds = this.getSelectedIds();
179
- const featureId = e.featureTarget.properties.id;
180
- const isFeatureSelected = this.isSelected(featureId);
181
-
182
- // Click (without shift) on any selected feature but a point
183
- if (
184
- !isShiftClick &&
185
- isFeatureSelected &&
186
- this.getFeature(featureId).type !== Constants.geojsonTypes.POINT
187
- ) {
188
- // Enter direct select mode
189
- return this.changeMode("custom_direct_select", {
190
- featureId,
191
- });
192
- }
193
-
194
- // Shift-click on a selected feature
195
- if (isFeatureSelected && isShiftClick) {
196
- // Deselect it
197
- this.deselect(featureId);
198
- this.updateUIClasses({ mouse: Constants.cursors.POINTER });
199
- if (selectedFeatureIds.length === 1) {
200
- doubleClickZoom.enable(this);
201
- }
202
- // Shift-click on an unselected feature
203
- } else if (!isFeatureSelected && isShiftClick) {
204
- // Add it to the selection
205
- this.select(featureId);
206
- this.updateUIClasses({ mouse: Constants.cursors.MOVE });
207
- // Click (without shift) on an unselected feature
208
- } else if (!isFeatureSelected && !isShiftClick) {
209
- // Make it the only selected feature
210
- selectedFeatureIds.forEach((id) => this.doRender(id));
211
- this.setSelected(featureId);
212
- this.updateUIClasses({ mouse: Constants.cursors.MOVE });
213
- }
214
-
215
- // No matter what, re-render the clicked feature
216
- this.doRender(featureId);
173
+ // Stop everything
174
+ doubleClickZoom.disable(this);
175
+ this.stopExtendedInteractions(state);
176
+
177
+ const isShiftClick = CommonSelectors.isShiftDown(e);
178
+ const selectedFeatureIds = this.getSelectedIds();
179
+ const featureId = e.featureTarget.properties.id;
180
+ const isFeatureSelected = this.isSelected(featureId);
181
+
182
+ // Click (without shift) on any selected feature but a point
183
+ if (
184
+ !isShiftClick &&
185
+ isFeatureSelected &&
186
+ this.getFeature(featureId).type !== Constants.geojsonTypes.POINT
187
+ ) {
188
+ // Enter direct select mode
189
+ return this.changeMode("custom_direct_select", {
190
+ featureId,
191
+ });
192
+ }
193
+
194
+ // Shift-click on a selected feature
195
+ if (isFeatureSelected && isShiftClick) {
196
+ // Deselect it
197
+ this.deselect(featureId);
198
+ this.updateUIClasses({ mouse: Constants.cursors.POINTER });
199
+ if (selectedFeatureIds.length === 1) {
200
+ doubleClickZoom.enable(this);
201
+ }
202
+ // Shift-click on an unselected feature
203
+ } else if (!isFeatureSelected && isShiftClick) {
204
+ // Add it to the selection
205
+ this.select(featureId);
206
+ this.updateUIClasses({ mouse: Constants.cursors.MOVE });
207
+ // Click (without shift) on an unselected feature
208
+ } else if (!isFeatureSelected && !isShiftClick) {
209
+ // Make it the only selected feature
210
+ selectedFeatureIds.forEach((id) => this.doRender(id));
211
+ this.setSelected(featureId);
212
+ this.updateUIClasses({ mouse: Constants.cursors.MOVE });
213
+ }
214
+
215
+ // No matter what, re-render the clicked feature
216
+ this.doRender(featureId);
217
217
  };
218
218
 
219
219
  CustomSelectMode.onMouseDown = function (state, e) {
220
- if (CommonSelectors.isActiveFeature(e)) return this.startOnActiveFeature(state, e);
221
- if (this.drawConfig.boxSelect && CommonSelectors.isShiftMousedown(e))
222
- return this.startBoxSelect(state, e);
220
+ if (CommonSelectors.isActiveFeature(e)) return this.startOnActiveFeature(state, e);
221
+ if (this.drawConfig.boxSelect && CommonSelectors.isShiftMousedown(e))
222
+ return this.startBoxSelect(state, e);
223
223
  };
224
224
 
225
225
  CustomSelectMode.startBoxSelect = function (state, e) {
226
- this.stopExtendedInteractions(state);
227
- this.map.dragPan.disable();
228
- // Enable box select
229
- state.boxSelectStartLocation = mouseEventPoint(
230
- e.originalEvent,
231
- this.map.getContainer()
232
- );
233
- state.canBoxSelect = true;
226
+ this.stopExtendedInteractions(state);
227
+ this.map.dragPan.disable();
228
+ // Enable box select
229
+ state.boxSelectStartLocation = mouseEventPoint(
230
+ e.originalEvent,
231
+ this.map.getContainer()
232
+ );
233
+ state.canBoxSelect = true;
234
234
  };
235
235
 
236
236
  CustomSelectMode.onTouchStart = function (state, e) {
237
- if (CommonSelectors.isActiveFeature(e)) return this.startOnActiveFeature(state, e);
237
+ if (CommonSelectors.isActiveFeature(e)) return this.startOnActiveFeature(state, e);
238
238
  };
239
239
 
240
240
  CustomSelectMode.onDrag = function (state, e) {
241
- if (state.canDragMove) return this.dragMove(state, e);
242
- if (this.drawConfig.boxSelect && state.canBoxSelect)
243
- return this.whileBoxSelect(state, e);
241
+ if (state.canDragMove) return this.dragMove(state, e);
242
+ if (this.drawConfig.boxSelect && state.canBoxSelect)
243
+ return this.whileBoxSelect(state, e);
244
244
  };
245
245
 
246
246
  CustomSelectMode.whileBoxSelect = function (state, e) {
247
- state.boxSelecting = true;
248
- this.updateUIClasses({ mouse: Constants.cursors.ADD });
249
-
250
- // Create the box node if it doesn't exist
251
- if (!state.boxSelectElement) {
252
- state.boxSelectElement = document.createElement("div");
253
- state.boxSelectElement.classList.add(Constants.classes.BOX_SELECT);
254
- this.map.getContainer().appendChild(state.boxSelectElement);
255
- }
256
-
257
- // Adjust the box node's width and xy position
258
- const current = mouseEventPoint(e.originalEvent, this.map.getContainer());
259
- const minX = Math.min(state.boxSelectStartLocation.x, current.x);
260
- const maxX = Math.max(state.boxSelectStartLocation.x, current.x);
261
- const minY = Math.min(state.boxSelectStartLocation.y, current.y);
262
- const maxY = Math.max(state.boxSelectStartLocation.y, current.y);
263
- const translateValue = `translate(${minX}px, ${minY}px)`;
264
- state.boxSelectElement.style.transform = translateValue;
265
- state.boxSelectElement.style.WebkitTransform = translateValue;
266
- state.boxSelectElement.style.width = `${maxX - minX}px`;
267
- state.boxSelectElement.style.height = `${maxY - minY}px`;
247
+ state.boxSelecting = true;
248
+ this.updateUIClasses({ mouse: Constants.cursors.ADD });
249
+
250
+ // Create the box node if it doesn't exist
251
+ if (!state.boxSelectElement) {
252
+ state.boxSelectElement = document.createElement("div");
253
+ state.boxSelectElement.classList.add(Constants.classes.BOX_SELECT);
254
+ this.map.getContainer().appendChild(state.boxSelectElement);
255
+ }
256
+
257
+ // Adjust the box node's width and xy position
258
+ const current = mouseEventPoint(e.originalEvent, this.map.getContainer());
259
+ const minX = Math.min(state.boxSelectStartLocation.x, current.x);
260
+ const maxX = Math.max(state.boxSelectStartLocation.x, current.x);
261
+ const minY = Math.min(state.boxSelectStartLocation.y, current.y);
262
+ const maxY = Math.max(state.boxSelectStartLocation.y, current.y);
263
+ const translateValue = `translate(${minX}px, ${minY}px)`;
264
+ state.boxSelectElement.style.transform = translateValue;
265
+ state.boxSelectElement.style.WebkitTransform = translateValue;
266
+ state.boxSelectElement.style.width = `${maxX - minX}px`;
267
+ state.boxSelectElement.style.height = `${maxY - minY}px`;
268
268
  };
269
269
 
270
270
  CustomSelectMode.dragMove = function (state, e) {
271
- // Dragging when drag move is enabled
272
- state.dragMoving = true;
273
- e.originalEvent.stopPropagation();
271
+ // Dragging when drag move is enabled
272
+ state.dragMoving = true;
273
+ e.originalEvent.stopPropagation();
274
274
 
275
- const delta = {
276
- lng: e.lngLat.lng - state.dragMoveLocation.lng,
277
- lat: e.lngLat.lat - state.dragMoveLocation.lat,
278
- };
275
+ const delta = {
276
+ lng: e.lngLat.lng - state.dragMoveLocation.lng,
277
+ lat: e.lngLat.lat - state.dragMoveLocation.lat,
278
+ };
279
279
 
280
- moveFeatures(this.getSelected(), delta);
280
+ moveFeatures(this.getSelected(), delta);
281
281
 
282
- state.dragMoveLocation = e.lngLat;
282
+ state.dragMoveLocation = e.lngLat;
283
283
  };
284
284
 
285
285
  CustomSelectMode.onMouseUp = function (state, e) {
286
- // End any extended interactions
287
- if (state.dragMoving) {
288
- this.fireUpdate();
289
- } else if (state.boxSelecting) {
290
- const bbox = [
291
- state.boxSelectStartLocation,
292
- mouseEventPoint(e.originalEvent, this.map.getContainer()),
293
- ];
294
- const featuresInBox = this.featuresAt(null, bbox, "click");
295
- const idsToSelect = this.getUniqueIds(featuresInBox).filter(
296
- (id) => !this.isSelected(id)
297
- );
298
-
299
- if (idsToSelect.length) {
300
- this.select(idsToSelect);
301
- idsToSelect.forEach((id) => this.doRender(id));
302
- this.updateUIClasses({ mouse: Constants.cursors.MOVE });
303
- }
304
- }
305
- this.stopExtendedInteractions(state);
286
+ // End any extended interactions
287
+ if (state.dragMoving) {
288
+ this.fireUpdate();
289
+ } else if (state.boxSelecting) {
290
+ const bbox = [
291
+ state.boxSelectStartLocation,
292
+ mouseEventPoint(e.originalEvent, this.map.getContainer()),
293
+ ];
294
+ const featuresInBox = this.featuresAt(null, bbox, "click");
295
+ const idsToSelect = this.getUniqueIds(featuresInBox).filter(
296
+ (id) => !this.isSelected(id)
297
+ );
298
+
299
+ if (idsToSelect.length) {
300
+ this.select(idsToSelect);
301
+ idsToSelect.forEach((id) => this.doRender(id));
302
+ this.updateUIClasses({ mouse: Constants.cursors.MOVE });
303
+ }
304
+ }
305
+ this.stopExtendedInteractions(state);
306
306
  };
307
307
 
308
308
  CustomSelectMode.toDisplayFeatures = function (state, geojson, display) {
309
- geojson.properties.active = this.isSelected(geojson.properties.id)
310
- ? Constants.activeStates.ACTIVE
311
- : Constants.activeStates.INACTIVE;
312
- display(geojson);
313
- this.fireActionable();
314
- if (
315
- geojson.properties.active !== Constants.activeStates.ACTIVE ||
316
- geojson.geometry.type === Constants.geojsonTypes.POINT
317
- )
318
- return;
319
- createSupplementaryPoints(geojson).forEach(display);
309
+ geojson.properties.active = this.isSelected(geojson.properties.id)
310
+ ? Constants.activeStates.ACTIVE
311
+ : Constants.activeStates.INACTIVE;
312
+ display(geojson);
313
+ this.fireActionable();
314
+ if (
315
+ geojson.properties.active !== Constants.activeStates.ACTIVE ||
316
+ geojson.geometry.type === Constants.geojsonTypes.POINT
317
+ )
318
+ return;
319
+ createSupplementaryPoints(geojson).forEach(display);
320
320
  };
321
321
 
322
322
  CustomSelectMode.onTrash = function () {
323
- this.deleteFeature(this.getSelectedIds());
324
- this.fireActionable();
323
+ this.deleteFeature(this.getSelectedIds());
324
+ this.fireActionable();
325
325
  };
326
326
 
327
327
  CustomSelectMode.onCombineFeatures = function () {
328
- const selectedFeatures = this.getSelected();
329
-
330
- if (selectedFeatures.length === 0 || selectedFeatures.length < 2) return;
331
-
332
- const coordinates = [],
333
- featuresCombined = [];
334
- const featureType = selectedFeatures[0].type.replace("Multi", "");
335
-
336
- for (let i = 0; i < selectedFeatures.length; i++) {
337
- const feature = selectedFeatures[i];
338
-
339
- if (feature.type.replace("Multi", "") !== featureType) {
340
- return;
341
- }
342
- if (feature.type.includes("Multi")) {
343
- feature.getCoordinates().forEach((subcoords) => {
344
- coordinates.push(subcoords);
345
- });
346
- } else {
347
- coordinates.push(feature.getCoordinates());
348
- }
349
-
350
- featuresCombined.push(feature.toGeoJSON());
351
- }
352
-
353
- if (featuresCombined.length > 1) {
354
- const multiFeature = this.newFeature({
355
- type: Constants.geojsonTypes.FEATURE,
356
- properties: featuresCombined[0].properties,
357
- geometry: {
358
- type: `Multi${featureType}`,
359
- coordinates,
360
- },
361
- });
362
-
363
- this.addFeature(multiFeature);
364
- this.deleteFeature(this.getSelectedIds(), { silent: true });
365
- this.setSelected([multiFeature.id]);
366
-
367
- this.map.fire(Constants.events.COMBINE_FEATURES, {
368
- createdFeatures: [multiFeature.toGeoJSON()],
369
- deletedFeatures: featuresCombined,
370
- });
371
- }
372
- this.fireActionable();
328
+ const selectedFeatures = this.getSelected();
329
+
330
+ if (selectedFeatures.length === 0 || selectedFeatures.length < 2) return;
331
+
332
+ const coordinates = [],
333
+ featuresCombined = [];
334
+ const featureType = selectedFeatures[0].type.replace("Multi", "");
335
+
336
+ for (let i = 0; i < selectedFeatures.length; i++) {
337
+ const feature = selectedFeatures[i];
338
+
339
+ if (feature.type.replace("Multi", "") !== featureType) {
340
+ return;
341
+ }
342
+ if (feature.type.includes("Multi")) {
343
+ feature.getCoordinates().forEach((subcoords) => {
344
+ coordinates.push(subcoords);
345
+ });
346
+ } else {
347
+ coordinates.push(feature.getCoordinates());
348
+ }
349
+
350
+ featuresCombined.push(feature.toGeoJSON());
351
+ }
352
+
353
+ if (featuresCombined.length > 1) {
354
+ const multiFeature = this.newFeature({
355
+ type: Constants.geojsonTypes.FEATURE,
356
+ properties: featuresCombined[0].properties,
357
+ geometry: {
358
+ type: `Multi${featureType}`,
359
+ coordinates,
360
+ },
361
+ });
362
+
363
+ this.addFeature(multiFeature);
364
+ this.deleteFeature(this.getSelectedIds(), { silent: true });
365
+ this.setSelected([multiFeature.id]);
366
+
367
+ this.map.fire(Constants.events.COMBINE_FEATURES, {
368
+ createdFeatures: [multiFeature.toGeoJSON()],
369
+ deletedFeatures: featuresCombined,
370
+ });
371
+ }
372
+ this.fireActionable();
373
373
  };
374
374
 
375
375
  CustomSelectMode.onUncombineFeatures = function () {
376
- const selectedFeatures = this.getSelected();
377
- if (selectedFeatures.length === 0) return;
378
-
379
- const createdFeatures = [];
380
- const featuresUncombined = [];
381
-
382
- for (let i = 0; i < selectedFeatures.length; i++) {
383
- const feature = selectedFeatures[i];
384
-
385
- if (this.isInstanceOf("MultiFeature", feature)) {
386
- feature.getFeatures().forEach((subFeature) => {
387
- this.addFeature(subFeature);
388
- subFeature.properties = feature.properties;
389
- createdFeatures.push(subFeature.toGeoJSON());
390
- this.select([subFeature.id]);
391
- });
392
- this.deleteFeature(feature.id, { silent: true });
393
- featuresUncombined.push(feature.toGeoJSON());
394
- }
395
- }
396
-
397
- if (createdFeatures.length > 1) {
398
- this.map.fire(Constants.events.UNCOMBINE_FEATURES, {
399
- createdFeatures,
400
- deletedFeatures: featuresUncombined,
401
- });
402
- }
403
- this.fireActionable();
376
+ const selectedFeatures = this.getSelected();
377
+ if (selectedFeatures.length === 0) return;
378
+
379
+ const createdFeatures = [];
380
+ const featuresUncombined = [];
381
+
382
+ for (let i = 0; i < selectedFeatures.length; i++) {
383
+ const feature = selectedFeatures[i];
384
+
385
+ if (this.isInstanceOf("MultiFeature", feature)) {
386
+ feature.getFeatures().forEach((subFeature) => {
387
+ this.addFeature(subFeature);
388
+ subFeature.properties = feature.properties;
389
+ createdFeatures.push(subFeature.toGeoJSON());
390
+ this.select([subFeature.id]);
391
+ });
392
+ this.deleteFeature(feature.id, { silent: true });
393
+ featuresUncombined.push(feature.toGeoJSON());
394
+ }
395
+ }
396
+
397
+ if (createdFeatures.length > 1) {
398
+ this.map.fire(Constants.events.UNCOMBINE_FEATURES, {
399
+ createdFeatures,
400
+ deletedFeatures: featuresUncombined,
401
+ });
402
+ }
403
+ this.fireActionable();
404
404
  };
405
405
 
406
406
  export default CustomSelectMode;