forked from MapComplete/MapComplete
		
	Fix popups and core functionality
This commit is contained in:
		
							parent
							
								
									9cc721abad
								
							
						
					
					
						commit
						8ad9b816ac
					
				
					 13 changed files with 116 additions and 144 deletions
				
			
		|  | @ -14,8 +14,7 @@ export default class ShowDataLayer { | |||
| 
 | ||||
|     private _layerDict; | ||||
|     private readonly _leafletMap: UIEventSource<L.Map>; | ||||
| 
 | ||||
|     private readonly _popups = new Map<any, L.Layer>(); | ||||
|     private _cleanCount = 0; | ||||
| 
 | ||||
|     constructor(features: UIEventSource<{ feature: any, freshness: Date }[]>, | ||||
|                 leafletMap: UIEventSource<L.Map>, | ||||
|  | @ -44,6 +43,7 @@ export default class ShowDataLayer { | |||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             self._cleanCount++ | ||||
|             // clean all the old stuff away, if any
 | ||||
|             if (geoLayer !== undefined) { | ||||
|                 mp.removeLayer(geoLayer); | ||||
|  | @ -74,34 +74,6 @@ export default class ShowDataLayer { | |||
|         features.addCallback(() => update()); | ||||
|         leafletMap.addCallback(() => update()); | ||||
|         update(); | ||||
| 
 | ||||
| 
 | ||||
|         State.state.selectedElement.addCallbackAndRun(selected => { | ||||
|             if (selected === undefined) { | ||||
|                 mp.closePopup(); | ||||
|                 return; | ||||
|             } | ||||
|             const marker = self._popups.get(selected); | ||||
|             if (marker === undefined) { | ||||
|                 return; | ||||
|             } | ||||
|             marker.openPopup(); | ||||
| 
 | ||||
|              | ||||
|             const tags = State.state.allElements.getEventSourceById(selected.properties.id); | ||||
|             const layer: LayerConfig = this._layerDict[selected._matching_layer_id]; | ||||
|             const infoBox = new FeatureInfoBox(tags, layer); | ||||
| 
 | ||||
|             infoBox.isShown.addCallback(isShown => { | ||||
|                 if (!isShown) { | ||||
|                     State.state.selectedElement.setData(undefined); | ||||
|                 } | ||||
|             }); | ||||
| 
 | ||||
|             infoBox.AttachTo(`popup-${selected.properties.id}`) | ||||
|             infoBox.Activate(); | ||||
|         }) | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|  | @ -154,17 +126,43 @@ export default class ShowDataLayer { | |||
|             closeButton: false | ||||
|         }, leafletLayer); | ||||
| 
 | ||||
|         // By setting 50vh, leaflet will attempt to fit the entire screen and move the feature down
 | ||||
|         popup.setContent(`<div style='height: 50vh' id='popup-${feature.properties.id}'>Rendering</div>`); | ||||
| 
 | ||||
|         leafletLayer.bindPopup(popup); | ||||
|          leafletLayer.bindPopup(popup); | ||||
|          | ||||
|         let infobox : FeatureInfoBox = undefined; | ||||
|          | ||||
|         const id = `popup-${feature.properties.id}-${this._cleanCount}` | ||||
|         popup.setContent(`<div style='height: 50vh' id='${id}'>Rendering</div>`) | ||||
| 
 | ||||
|         leafletLayer.on("popupopen", () => { | ||||
|             State.state.selectedElement.setData(feature) | ||||
|             // The feature info box is bound via the selected element callback, as there are multiple ways to open the popup (e.g. a trigger via the URL°
 | ||||
|                 if (infobox === undefined) { | ||||
|                 const tags = State.state.allElements.getEventSourceById(feature.properties.id); | ||||
|                 infobox = new FeatureInfoBox(tags, layer); | ||||
| 
 | ||||
|                 infobox.isShown.addCallback(isShown => { | ||||
|                     if (!isShown) { | ||||
|                         State.state.selectedElement.setData(undefined); | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|             infobox.AttachTo(id) | ||||
|             infobox.Activate(); | ||||
|         }); | ||||
|         const self = this; | ||||
|         State.state.selectedElement.addCallbackAndRun(selected => { | ||||
|             if (selected === undefined || self._leafletMap.data === undefined) { | ||||
|                 return; | ||||
|             } | ||||
|             if (popup.isOpen()) { | ||||
|                 return; | ||||
|             } | ||||
|             if (selected.properties.id === feature.properties.id) { | ||||
|                 leafletLayer.openPopup() | ||||
|             } | ||||
|         }) | ||||
|          | ||||
|         this._popups.set(feature, leafletLayer); | ||||
|     } | ||||
| 
 | ||||
|     private CreateGeojsonLayer(): L.Layer { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue