forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
| <script lang="ts">
 | |
|   import type { RasterLayerPolygon } from "../../Models/RasterLayers"
 | |
|   import OverlayMap from "./OverlayMap.svelte"
 | |
|   import type { MapProperties } from "../../Models/MapProperties"
 | |
|   import { Store, UIEventSource } from "../../Logic/UIEventSource"
 | |
|   import { Map as MlMap } from "maplibre-gl"
 | |
|   import { createEventDispatcher, onDestroy } from "svelte"
 | |
| 
 | |
|   /***
 | |
|    * Chooses a background-layer out of available options
 | |
|    */
 | |
|   export let availableLayers: Store<RasterLayerPolygon[]>
 | |
|   export let mapproperties: MapProperties
 | |
|   export let map: Store<MlMap>
 | |
| 
 | |
|   export let visible: Store<boolean> = undefined
 | |
| 
 | |
|   let dispatch = createEventDispatcher<{ appliedLayer }>()
 | |
| 
 | |
|   export let favourite: UIEventSource<string> | undefined = undefined
 | |
| 
 | |
|   let rasterLayer = new UIEventSource<RasterLayerPolygon>(availableLayers.data?.[0])
 | |
|   let hasLayers = true
 | |
|   onDestroy(
 | |
|     availableLayers.addCallbackAndRun((layers) => {
 | |
|       if (layers === undefined || layers.length === 0) {
 | |
|         hasLayers = false
 | |
|         return
 | |
|       }
 | |
|       hasLayers = true
 | |
|       rasterLayer.setData(layers[0])
 | |
|     })
 | |
|   )
 | |
| 
 | |
|   if (favourite) {
 | |
|     onDestroy(
 | |
|       favourite.addCallbackAndRunD((favourite) => {
 | |
|         const fav = availableLayers.data?.find((l) => l.properties.id === favourite)
 | |
|         if (!fav) {
 | |
|           return
 | |
|         }
 | |
|         rasterLayer.setData(fav)
 | |
|       })
 | |
|     )
 | |
| 
 | |
|     onDestroy(
 | |
|       rasterLayer.addCallbackAndRunD((selected) => {
 | |
|         favourite?.setData(selected.properties.id)
 | |
|       })
 | |
|     )
 | |
|   }
 | |
| 
 | |
|   let rasterLayerOnMap = UIEventSource.feedFrom(rasterLayer)
 | |
| 
 | |
|   if (visible) {
 | |
|     onDestroy(
 | |
|       visible?.addCallbackAndRunD((visible) => {
 | |
|         if (visible) {
 | |
|           rasterLayerOnMap.setData(rasterLayer.data ?? availableLayers.data[0])
 | |
|         } else {
 | |
|           rasterLayerOnMap.setData(undefined)
 | |
|         }
 | |
|       })
 | |
|     )
 | |
|   }
 | |
| </script>
 | |
| 
 | |
| {#if hasLayers}
 | |
|   <div class="flex h-full w-full flex-col">
 | |
|     <button
 | |
|       on:click={() => {
 | |
|         mapproperties.rasterLayer.setData(rasterLayer.data)
 | |
|         dispatch("appliedLayer")
 | |
|       }}
 | |
|       class="m-0 h-full w-full p-0"
 | |
|     >
 | |
|       <OverlayMap
 | |
|         rasterLayer={rasterLayerOnMap}
 | |
|         placedOverMap={map}
 | |
|         placedOverMapProperties={mapproperties}
 | |
|         {visible}
 | |
|       />
 | |
|     </button>
 | |
|     <select bind:value={$rasterLayer} class="w-full">
 | |
|       {#each $availableLayers as availableLayer}
 | |
|         <option value={availableLayer}>
 | |
|           {availableLayer.properties.name}
 | |
|         </option>
 | |
|       {/each}
 | |
|     </select>
 | |
|   </div>
 | |
| {/if}
 |