forked from MapComplete/MapComplete
		
	Usertest: add 'back to theme overview'-button on theme intro page, fix #1457
This commit is contained in:
		
							parent
							
								
									6d337e8775
								
							
						
					
					
						commit
						1b99be524f
					
				
					 3 changed files with 107 additions and 82 deletions
				
			
		|  | @ -17,7 +17,7 @@ | ||||||
|   } |   } | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <div class="tabbedgroup h-full w-full"> | <div class="tabbedgroup h-full flex w-full"> | ||||||
|   <TabGroup |   <TabGroup | ||||||
|     class="flex h-full w-full flex-col" |     class="flex h-full w-full flex-col" | ||||||
|     defaultIndex={1} |     defaultIndex={1} | ||||||
|  | @ -67,23 +67,23 @@ | ||||||
|       </TabList> |       </TabList> | ||||||
|       <slot name="post-tablist" /> |       <slot name="post-tablist" /> | ||||||
|     </div> |     </div> | ||||||
|     <div class="normal-background overflow-y-auto"> |     <div class="normal-background overflow-y-auto h-full"> | ||||||
|       <TabPanels defaultIndex={$tab}> |       <TabPanels class="tabpanels" defaultIndex={$tab}> | ||||||
|         <TabPanel> |         <TabPanel class="tabpanel"> | ||||||
|           <slot name="content0"> |           <slot name="content0"> | ||||||
|             <div>Empty</div> |             <div>Empty</div> | ||||||
|           </slot> |           </slot> | ||||||
|         </TabPanel> |         </TabPanel> | ||||||
|         <TabPanel> |         <TabPanel class="tabpanel"> | ||||||
|           <slot name="content1" /> |           <slot name="content1" /> | ||||||
|         </TabPanel> |         </TabPanel> | ||||||
|         <TabPanel> |         <TabPanel class="tabpanel"> | ||||||
|           <slot name="content2" /> |           <slot name="content2" /> | ||||||
|         </TabPanel> |         </TabPanel> | ||||||
|         <TabPanel> |         <TabPanel class="tabpanel"> | ||||||
|           <slot name="content3" /> |           <slot name="content3" /> | ||||||
|         </TabPanel> |         </TabPanel> | ||||||
|         <TabPanel> |         <TabPanel class="tabpanel"> | ||||||
|           <slot name="content4" /> |           <slot name="content4" /> | ||||||
|         </TabPanel> |         </TabPanel> | ||||||
|       </TabPanels> |       </TabPanels> | ||||||
|  | @ -96,6 +96,15 @@ | ||||||
|     max-height: 100vh; |     max-height: 100vh; | ||||||
|     height: 100%; |     height: 100%; | ||||||
|   } |   } | ||||||
|  |    | ||||||
|  |   :global(.tabpanel) { | ||||||
|  |     height:100%; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   :global(.tabpanels) { | ||||||
|  |     height: calc( 100% - 2rem ); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|   :global(.tab) { |   :global(.tab) { | ||||||
|     margin: 0.25rem; |     margin: 0.25rem; | ||||||
|  |  | ||||||
|  | @ -1,88 +1,104 @@ | ||||||
| <script lang="ts"> | <script lang="ts"> | ||||||
|   import Translations from "../i18n/Translations" |     import Translations from "../i18n/Translations" | ||||||
|   import Svg from "../../Svg" |     import Svg from "../../Svg" | ||||||
|   import Tr from "../Base/Tr.svelte" |     import Tr from "../Base/Tr.svelte" | ||||||
|   import NextButton from "../Base/NextButton.svelte" |     import NextButton from "../Base/NextButton.svelte" | ||||||
|   import Geosearch from "./Geosearch.svelte" |     import Geosearch from "./Geosearch.svelte" | ||||||
|   import IfNot from "../Base/IfNot.svelte" |     import IfNot from "../Base/IfNot.svelte" | ||||||
|   import ToSvelte from "../Base/ToSvelte.svelte" |     import ToSvelte from "../Base/ToSvelte.svelte" | ||||||
|   import ThemeViewState from "../../Models/ThemeViewState" |     import ThemeViewState from "../../Models/ThemeViewState" | ||||||
|   import If from "../Base/If.svelte" |     import If from "../Base/If.svelte" | ||||||
|   import { UIEventSource } from "../../Logic/UIEventSource" |     import {UIEventSource} from "../../Logic/UIEventSource" | ||||||
|   import { SearchIcon } from "@rgossiaux/svelte-heroicons/solid" |     import {SearchIcon} from "@rgossiaux/svelte-heroicons/solid" | ||||||
|   import { twJoin } from "tailwind-merge" |     import {twJoin} from "tailwind-merge" | ||||||
|  |     import {Utils} from "../../Utils"; | ||||||
| 
 | 
 | ||||||
|   /** |     /** | ||||||
|    * The theme introduction panel |      * The theme introduction panel | ||||||
|    */ |      */ | ||||||
|   export let state: ThemeViewState |     export let state: ThemeViewState | ||||||
|   let layout = state.layout |     let layout = state.layout | ||||||
|   let selectedElement = state.selectedElement |     let selectedElement = state.selectedElement | ||||||
|   let selectedLayer = state.selectedLayer |     let selectedLayer = state.selectedLayer | ||||||
| 
 | 
 | ||||||
|   let triggerSearch: UIEventSource<any> = new UIEventSource<any>(undefined) |     let triggerSearch: UIEventSource<any> = new UIEventSource<any>(undefined) | ||||||
|   let searchEnabled = false |     let searchEnabled = false | ||||||
| 
 | 
 | ||||||
|   function jumpToCurrentLocation() { |     function jumpToCurrentLocation() { | ||||||
|     const glstate = state.geolocation.geolocationState |         const glstate = state.geolocation.geolocationState | ||||||
|     if (glstate.currentGPSLocation.data !== undefined) { |         if (glstate.currentGPSLocation.data !== undefined) { | ||||||
|       const c: GeolocationCoordinates = glstate.currentGPSLocation.data |             const c: GeolocationCoordinates = glstate.currentGPSLocation.data | ||||||
|       state.guistate.themeIsOpened.setData(false) |             state.guistate.themeIsOpened.setData(false) | ||||||
|       const coor = { lon: c.longitude, lat: c.latitude } |             const coor = {lon: c.longitude, lat: c.latitude} | ||||||
|       state.mapProperties.location.setData(coor) |             state.mapProperties.location.setData(coor) | ||||||
|  |         } | ||||||
|  |         if (glstate.permission.data !== "granted") { | ||||||
|  |             glstate.requestPermission() | ||||||
|  |             return | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     if (glstate.permission.data !== "granted") { |  | ||||||
|       glstate.requestPermission() |  | ||||||
|       return |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <Tr t={layout.description} /> | <div class="flex flex-col justify-between h-full"> | ||||||
| <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, |     <div> | ||||||
| loginStatus.SetClass("block mt-6 pt-2 md:border-t-2 border-dotted border-gray-400"), |  | ||||||
| --> |  | ||||||
| <Tr t={layout.descriptionTail} /> |  | ||||||
| <NextButton clss="primary w-full" on:click={() => state.guistate.themeIsOpened.setData(false)}> |  | ||||||
|   <div class="flex w-full justify-center text-2xl"> |  | ||||||
|     <Tr t={Translations.t.general.openTheMap} /> |  | ||||||
|   </div> |  | ||||||
| </NextButton> |  | ||||||
| 
 | 
 | ||||||
| <div class="flex w-full flex-wrap sm:flex-nowrap"> |         <!-- Intro, description, ... --> | ||||||
|   <IfNot condition={state.geolocation.geolocationState.permission.map((p) => p === "denied")}> |         <Tr t={layout.description}/> | ||||||
|     <button class="flex w-full items-center gap-x-2" on:click={jumpToCurrentLocation}> |         <Tr t={Translations.t.general.welcomeExplanation.general}/> | ||||||
|       <ToSvelte construct={Svg.crosshair_svg().SetClass("w-8 h-8")} /> |         {#if layout.layers.some((l) => l.presets?.length > 0)} | ||||||
|       <Tr t={Translations.t.general.openTheMapAtGeolocation} /> |             <If condition={state.featureSwitches.featureSwitchAddNew}> | ||||||
|     </button> |                 <Tr t={Translations.t.general.welcomeExplanation.addNew}/> | ||||||
|   </IfNot> |             </If> | ||||||
|  |         {/if} | ||||||
| 
 | 
 | ||||||
|   <div class=".button low-interaction m-1 flex w-full items-center gap-x-2 rounded border p-2"> |         <Tr t={layout.descriptionTail}/> | ||||||
|     <div class="w-full"> |        | ||||||
|       <Geosearch |        | ||||||
|         bounds={state.mapProperties.bounds} |         <!-- Buttons: open map, go to location, search --> | ||||||
|         on:searchCompleted={() => state.guistate.themeIsOpened.setData(false)} |         <NextButton clss="primary w-full" on:click={() => state.guistate.themeIsOpened.setData(false)}> | ||||||
|         on:searchIsValid={(isValid) => { |             <div class="flex w-full justify-center 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 items-center gap-x-2" on:click={jumpToCurrentLocation}> | ||||||
|  |                     <ToSvelte construct={Svg.crosshair_svg().SetClass("w-8 h-8")}/> | ||||||
|  |                     <Tr t={Translations.t.general.openTheMapAtGeolocation}/> | ||||||
|  |                 </button> | ||||||
|  |             </IfNot> | ||||||
|  | 
 | ||||||
|  |             <div class=".button low-interaction m-1 flex w-full items-center gap-x-2 rounded border p-2"> | ||||||
|  |                 <div class="w-full"> | ||||||
|  |                     <Geosearch | ||||||
|  |                             bounds={state.mapProperties.bounds} | ||||||
|  |                             on:searchCompleted={() => state.guistate.themeIsOpened.setData(false)} | ||||||
|  |                             on:searchIsValid={(isValid) => { | ||||||
|           searchEnabled = isValid |           searchEnabled = isValid | ||||||
|         }} |         }} | ||||||
|         perLayer={state.perLayer} |                             perLayer={state.perLayer} | ||||||
|         {selectedElement} |                             {selectedElement} | ||||||
|         {selectedLayer} |                             {selectedLayer} | ||||||
|         {triggerSearch} |                             {triggerSearch} | ||||||
|       /> |                     /> | ||||||
|  |                 </div> | ||||||
|  |                 <button | ||||||
|  |                         class={twJoin("flex items-center justify-between gap-x-2", !searchEnabled && "disabled")} | ||||||
|  |                         on:click={() => triggerSearch.ping()}> | ||||||
|  |                     <Tr t={Translations.t.general.search.searchShort}/> | ||||||
|  |                     <SearchIcon class="h-6 w-6"/> | ||||||
|  |                 </button> | ||||||
|  |             </div> | ||||||
|  |         </div> | ||||||
|     </div> |     </div> | ||||||
|     <button |    | ||||||
|       class={twJoin("flex items-center justify-between gap-x-2", !searchEnabled && "disabled")} |     <div class="links-as-button links-w-full m-2 flex flex-col gap-y-1"> | ||||||
|       on:click={() => triggerSearch.ping()}> |     <!-- bottom buttons, a bit hidden away: switch layout --> | ||||||
|       <Tr t={Translations.t.general.search.searchShort} /> |     <a class="flex" href={Utils.HomepageLink()}> | ||||||
|       <SearchIcon class="h-6 w-6" /> |       <img class="h-6 w-6" src="./assets/svg/add.svg"/> | ||||||
|     </button> |       <Tr t={Translations.t.general.backToIndex}/> | ||||||
|  |     </a> | ||||||
|   </div> |   </div> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
|  | @ -269,7 +269,7 @@ | ||||||
|                 <Tr t={layout.title}/> |                 <Tr t={layout.title}/> | ||||||
|             </div> |             </div> | ||||||
| 
 | 
 | ||||||
|             <div class="m-4" slot="content0"> |             <div class="m-4 h-full" slot="content0"> | ||||||
|                 <ThemeIntroPanel {state}/> |                 <ThemeIntroPanel {state}/> | ||||||
|             </div> |             </div> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue