| 
									
										
										
										
											2020-10-02 19:00:24 +02:00
										 |  |  | import * as L from "leaflet"; | 
					
						
							| 
									
										
										
										
											2021-01-02 21:03:40 +01:00
										 |  |  | import {UIEventSource} from "../UIEventSource"; | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  | import ScrollableFullScreen from "../../UI/Base/ScrollableFullScreen"; | 
					
						
							| 
									
										
										
										
											2021-08-22 18:48:38 +02:00
										 |  |  | import FilteredLayer from "../../Models/FilteredLayer"; | 
					
						
							| 
									
										
										
										
											2021-08-22 20:23:13 +02:00
										 |  |  | import Constants from "../../Models/Constants"; | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  | import BaseUIElement from "../../UI/BaseUIElement"; | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * The stray-click-hanlders adds a marker to the map if no feature was clicked. | 
					
						
							|  |  |  |  * Shows the given uiToShow-element in the messagebox | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2021-01-04 04:06:21 +01:00
										 |  |  | export default class StrayClickHandler { | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |     private _lastMarker; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     constructor( | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |         state: { | 
					
						
							|  |  |  |             LastClickLocation: UIEventSource<{ lat: number, lon: number }>, | 
					
						
							|  |  |  |             selectedElement: UIEventSource<string>, | 
					
						
							|  |  |  |             filteredLayers: UIEventSource<FilteredLayer[]>, | 
					
						
							|  |  |  |             leafletMap: UIEventSource<L.Map> | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         uiToShow: ScrollableFullScreen, | 
					
						
							|  |  |  |         iconToShow: BaseUIElement) { | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         const self = this; | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |         const leafletMap = state.leafletMap | 
					
						
							|  |  |  |         state.filteredLayers.data.forEach((filteredLayer) => { | 
					
						
							| 
									
										
										
										
											2020-09-17 23:53:57 +02:00
										 |  |  |             filteredLayer.isDisplayed.addCallback(isEnabled => { | 
					
						
							| 
									
										
										
										
											2021-01-04 04:06:21 +01:00
										 |  |  |                 if (isEnabled && self._lastMarker && leafletMap.data !== undefined) { | 
					
						
							| 
									
										
										
										
											2020-09-17 23:53:57 +02:00
										 |  |  |                     // When a layer is activated, we remove the 'last click location' in order to force the user to reclick
 | 
					
						
							|  |  |  |                     // This reclick might be at a location where a feature now appeared...
 | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |                     state.leafletMap.data.removeLayer(self._lastMarker); | 
					
						
							| 
									
										
										
										
											2020-09-17 23:53:57 +02:00
										 |  |  |                 } | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2021-01-04 04:06:21 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |         state.LastClickLocation.addCallback(function (lastClick) { | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |             if (self._lastMarker !== undefined) { | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |                 state.leafletMap.data?.removeLayer(self._lastMarker); | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (lastClick === undefined) { | 
					
						
							| 
									
										
										
										
											2021-01-22 00:40:15 +01:00
										 |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |             state.selectedElement.setData(undefined); | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |             const clickCoor: [number, number] = [lastClick.lat, lastClick.lon] | 
					
						
							| 
									
										
										
										
											2021-08-22 20:23:13 +02:00
										 |  |  |             self._lastMarker = L.marker(clickCoor, { | 
					
						
							| 
									
										
										
										
											2021-08-22 18:48:38 +02:00
										 |  |  |                 icon: L.divIcon({ | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |                     html: iconToShow.ConstructElement(), | 
					
						
							| 
									
										
										
										
											2020-07-31 01:45:54 +02:00
										 |  |  |                     iconSize: [50, 50], | 
					
						
							|  |  |  |                     iconAnchor: [25, 50], | 
					
						
							|  |  |  |                     popupAnchor: [0, -45] | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |                 }) | 
					
						
							| 
									
										
										
										
											2020-07-25 18:00:08 +02:00
										 |  |  |             }); | 
					
						
							| 
									
										
										
										
											2021-07-18 21:48:11 +02:00
										 |  |  |             const popup = L.popup({ | 
					
						
							|  |  |  |                 autoPan: true, | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |                 autoPanPaddingTopLeft: [15, 15], | 
					
						
							| 
									
										
										
										
											2021-07-18 21:48:11 +02:00
										 |  |  |                 closeOnEscapeKey: true, | 
					
						
							|  |  |  |                 autoClose: true | 
					
						
							|  |  |  |             }).setContent("<div id='strayclick' style='height: 65vh'></div>"); | 
					
						
							| 
									
										
										
										
											2021-01-02 21:03:40 +01:00
										 |  |  |             self._lastMarker.addTo(leafletMap.data); | 
					
						
							| 
									
										
										
										
											2020-09-05 15:27:35 +02:00
										 |  |  |             self._lastMarker.bindPopup(popup); | 
					
						
							| 
									
										
										
										
											2020-06-29 16:21:36 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-01 02:12:33 +02:00
										 |  |  |             self._lastMarker.on("click", () => { | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  |                 if (leafletMap.data.getZoom() < Constants.userJourney.minZoomLevelToAddNewPoints) { | 
					
						
							| 
									
										
										
										
											2021-08-22 20:23:13 +02:00
										 |  |  |                     self._lastMarker.closePopup() | 
					
						
							|  |  |  |                     leafletMap.data.flyTo(clickCoor, Constants.userJourney.minZoomLevelToAddNewPoints) | 
					
						
							|  |  |  |                     return; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2021-09-09 00:05:51 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-14 02:39:23 +02:00
										 |  |  |                 uiToShow.AttachTo("strayclick") | 
					
						
							| 
									
										
										
										
											2021-02-25 02:23:26 +01:00
										 |  |  |                 uiToShow.Activate(); | 
					
						
							| 
									
										
										
										
											2020-07-01 02:12:33 +02:00
										 |  |  |             }); | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-14 01:41:19 +01:00
										 |  |  |         state.selectedElement.addCallback(() => { | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |             if (self._lastMarker !== undefined) { | 
					
						
							| 
									
										
										
										
											2021-01-02 21:03:40 +01:00
										 |  |  |                 leafletMap.data.removeLayer(self._lastMarker); | 
					
						
							| 
									
										
										
										
											2020-06-29 03:12:44 +02:00
										 |  |  |                 this._lastMarker = undefined; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |