Usertest: add 'back to theme overview'-button on theme intro page, fix #1457

This commit is contained in:
Pieter Vander Vennet 2023-06-15 16:11:36 +02:00
parent 6d337e8775
commit 1b99be524f
3 changed files with 107 additions and 82 deletions

View file

@ -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;

View file

@ -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>

View file

@ -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>