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