forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			88 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
		
		
			
		
	
	
			88 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
|  | <script lang="ts"> | ||
|  |     import Translations from "../i18n/Translations"; | ||
|  |     import Svg from "../../Svg"; | ||
|  |     import Tr from "../Base/Tr.svelte"; | ||
|  |     import NextButton from "../Base/NextButton.svelte"; | ||
|  |     import Geosearch from "./Geosearch.svelte"; | ||
|  |     import IfNot from "../Base/IfNot.svelte"; | ||
|  |     import ToSvelte from "../Base/ToSvelte.svelte"; | ||
|  |     import ThemeViewState from "../../Models/ThemeViewState"; | ||
|  |     import If from "../Base/If.svelte"; | ||
|  |     import {UIEventSource} from "../../Logic/UIEventSource"; | ||
|  |     import {SearchIcon} from "@rgossiaux/svelte-heroicons/solid"; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * The theme introduction panel | ||
|  |      */ | ||
|  |     export let state: ThemeViewState | ||
|  |     let layout = state.layout | ||
|  |     let selectedElement = state.selectedElement | ||
|  |     let selectedLayer = state.selectedLayer | ||
|  | 
 | ||
|  | 
 | ||
|  |     let triggerSearch: UIEventSource<any> = new UIEventSource<any>(undefined) | ||
|  |     let searchEnabled = false | ||
|  | 
 | ||
|  |     function jumpToCurrentLocation() { | ||
|  |         const glstate = state.geolocation.geolocationState | ||
|  |         if (glstate.currentGPSLocation.data !== undefined) { | ||
|  |             const c: GeolocationCoordinates = glstate.currentGPSLocation.data | ||
|  |             state.guistate.themeIsOpened.setData(false) | ||
|  |             const coor = {lon: c.longitude, lat: c.latitude} | ||
|  |             state.mapProperties.location.setData(coor) | ||
|  |         } | ||
|  |         if (glstate.permission.data !== "granted") { | ||
|  |             glstate.requestPermission() | ||
|  |             return | ||
|  |         } | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  | </script> | ||
|  | 
 | ||
|  | <Tr t={layout.description}></Tr> | ||
|  | <Tr t={Translations.t.general.welcomeExplanation.general}/> | ||
|  | {#if layout.layers.some((l) => l.presets?.length > 0)} | ||
|  |     <If condition={state.featureSwitches.featureSwitchAddNew}> | ||
|  |         <Tr t={Translations.t.general.welcomeExplanation.addNew}/> | ||
|  |     </If> | ||
|  | {/if} | ||
|  | 
 | ||
|  | <!--toTheMap,
 | ||
|  | loginStatus.SetClass("block mt-6 pt-2 md:border-t-2 border-dotted border-gray-400"), | ||
|  | --> | ||
|  | <Tr t={layout.descriptionTail}></Tr> | ||
|  | <NextButton clss="primary w-full" on:click={() => state.guistate.themeIsOpened.setData(false)}> | ||
|  |     <div class="flex justify-center w-full text-2xl"> | ||
|  |         <Tr t={Translations.t.general.openTheMap}/> | ||
|  |     </div> | ||
|  | </NextButton> | ||
|  | 
 | ||
|  | <div class="flex w-full flex-wrap sm:flex-nowrap"> | ||
|  |     <IfNot condition={state.geolocation.geolocationState.permission.map(p => p === "denied")}> | ||
|  |         <button class="flex w-full gap-x-2 items-center" on:click={jumpToCurrentLocation}> | ||
|  |             <ToSvelte construct={Svg.crosshair_svg().SetClass("w-8 h-8")}/> | ||
|  |             <Tr t={Translations.t.general.openTheMapAtGeolocation}/> | ||
|  |         </button> | ||
|  |     </IfNot> | ||
|  | 
 | ||
|  |     <div class="flex gap-x-2 items-center w-full border rounded .button p-2 m-1 low-interaction"> | ||
|  |         <div class="w-full"> | ||
|  |             <Geosearch bounds={state.mapProperties.bounds} | ||
|  |                        on:searchCompleted={() => state.guistate.themeIsOpened.setData(false)} | ||
|  |                        on:searchIsValid={isValid => {searchEnabled=  isValid}} | ||
|  |                        perLayer={state.perLayer} | ||
|  |                        {selectedElement} | ||
|  |                        {selectedLayer} | ||
|  |                        {triggerSearch}> | ||
|  |             </Geosearch> | ||
|  |         </div> | ||
|  |         <button class={"flex gap-x-2 justify-between items-center "+(searchEnabled ? "" : "disabled")} | ||
|  |                 on:click={() => triggerSearch.ping()}> | ||
|  |             <Tr t={Translations.t.general.search.searchShort}/> | ||
|  |             <SearchIcon class="w-6 h-6"></SearchIcon> | ||
|  |         </button> | ||
|  | 
 | ||
|  |     </div> | ||
|  | </div> |