From 589909ba44b0ffbafca3c8a786885424bca8a5e2 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Thu, 13 Mar 2025 23:42:52 +0100 Subject: [PATCH] Feature: improve inspectorGui: add search, placeholder, see #2353 --- src/UI/Base/DrawerRight.svelte | 2 +- src/UI/InspectorGUI.svelte | 61 ++++++++++++++++++++++++----- src/UI/Search/GeocodeResult.svelte | 18 ++++++--- src/UI/Search/GeocodeResults.svelte | 52 ++++++++---------------- src/UI/Search/SearchResults.svelte | 41 ++++++++++++++++++- 5 files changed, 123 insertions(+), 51 deletions(-) diff --git a/src/UI/Base/DrawerRight.svelte b/src/UI/Base/DrawerRight.svelte index f6aaaf440..cb835275f 100644 --- a/src/UI/Base/DrawerRight.svelte +++ b/src/UI/Base/DrawerRight.svelte @@ -19,7 +19,7 @@ let height = 0 onMount(() => { let topbar = document.getElementById("top-bar") - height = topbar.clientHeight + height = topbar?.clientHeight ?? 0 }) diff --git a/src/UI/InspectorGUI.svelte b/src/UI/InspectorGUI.svelte index 182c1f3cf..ca6c4c94a 100644 --- a/src/UI/InspectorGUI.svelte +++ b/src/UI/InspectorGUI.svelte @@ -8,7 +8,6 @@ import { MapLibreAdaptor } from "./Map/MapLibreAdaptor" import { Map as MlMap } from "maplibre-gl" import ShowDataLayer from "./Map/ShowDataLayer" - import StaticFeatureSource from "../Logic/FeatureSource/Sources/StaticFeatureSource" import type { Feature } from "geojson" import Loading from "./Base/Loading.svelte" @@ -24,9 +23,16 @@ import Page from "./Base/Page.svelte" import PreviouslySpiedUsers from "./History/PreviouslySpiedUsers.svelte" import { OsmConnection } from "../Logic/Osm/OsmConnection" - import MagnifyingGlassCircle from "@babeard/svelte-heroicons/outline/MagnifyingGlassCircle" import Translations from "./i18n/Translations" import Tr from "./Base/Tr.svelte" + import Searchbar from "../UI/Base/Searchbar.svelte" + import CombinedSearcher from "../Logic/Search/CombinedSearcher" + import CoordinateSearch from "../Logic/Search/CoordinateSearch" + import OpenLocationCodeSearch from "../Logic/Search/OpenLocationCodeSearch" + import PhotonSearch from "../Logic/Search/PhotonSearch" + import GeocodeResults from "./Search/GeocodeResults.svelte" + import MagnifyingGlassCircle from "@babeard/svelte-heroicons/mini/MagnifyingGlassCircle" + import type { GeocodeResult } from "../Logic/Search/GeocodingProvider" console.log("Loading inspector GUI") let username = QueryParameters.GetQueryParameter("user", undefined, "Inspect this user") @@ -37,16 +43,45 @@ let lon = UIEventSource.asFloat(QueryParameters.GetQueryParameter("lon", "0")) let loadingData = false let selectedElement = new UIEventSource(undefined) + let searchvalue = new UIEventSource("") + let geocoder = new CombinedSearcher( + new CoordinateSearch(), + new OpenLocationCodeSearch(), + new PhotonSearch(true, 2), + new PhotonSearch() + ) + let showSearchDrawer = new UIEventSource(true) + let searchIsFocussed = new UIEventSource(false) + let searchIsRunning = new UIEventSource(false) let maplibremap: MapLibreAdaptor = new MapLibreAdaptor(map, { zoom, - location: new UIEventSource<{ lon: number; lat: number }>({ lat: lat.data, lon: lon.data }), + location: new UIEventSource<{ lon: number; lat: number }>({ lat: lat.data, lon: lon.data }) }) maplibremap.location.stabilized(500).addCallbackAndRunD((l) => { lat.set(l.lat) lon.set(l.lon) }) - + let searchSuggestions = searchvalue.bindD(search => { + searchIsRunning.set(true) + try { + return UIEventSource.FromPromise(geocoder.search(search)) + } finally { + searchIsRunning.set(false) + } + }) + let state = { + mapProperties: maplibremap, + searchState: { + searchTerm: searchvalue, + suggestions: searchSuggestions, + suggestionsSearchRunning: searchIsRunning, + showSearchDrawer, + applyGeocodeResult(geocodeResult: GeocodeResult) { + maplibremap.location.set({ lon: geocodeResult.lon, lat: geocodeResult.lat }) + } + } + } let allLayers = HistoryUtils.personalTheme.layers let layersNoFixme = allLayers.filter((l) => l.id !== "fixme") let fixme = allLayers.find((l) => l.id === "fixme") @@ -59,7 +94,7 @@ Utils.waitFor(200).then(() => { selectedElement.set(f) }) - }, + } }) let osmConnection = new OsmConnection() @@ -91,7 +126,7 @@ inspectedData.push({ label: undefined, visitedTime: new Date().toISOString(), - name: user, + name: user }) } inspectedContributors.ping() @@ -101,7 +136,7 @@ featuresStore.set([]) const overpass = new Overpass( undefined, - user.split(";").map((user) => 'nw(user_touched:"' + user + '");'), + user.split(";").map((user) => "nw(user_touched:\"" + user + "\");"), Constants.defaultOverpassUrls[0] ) if (!maplibremap.bounds.data) { @@ -137,7 +172,7 @@

- load()} /> + load()} /> {#if loadingData} {:else} @@ -207,8 +242,16 @@ {/if} -
+ +
+
+ state.searchState.showSearchDrawer.set(true)} /> + {#if $searchSuggestions?.length > 0 || $searchIsFocussed} + + {/if} +
{:else if mode === "table"}
diff --git a/src/UI/Search/GeocodeResult.svelte b/src/UI/Search/GeocodeResult.svelte index b5172501a..6c98b78be 100644 --- a/src/UI/Search/GeocodeResult.svelte +++ b/src/UI/Search/GeocodeResult.svelte @@ -1,25 +1,33 @@ {#if $searchTerm.length > 0} -

+

+ +

{#if $results?.length > 0} {#each $results as entry (entry)} @@ -41,35 +46,12 @@
{/if} - {#if !$isSearching && $results.length === 0} + {#if !$isSearching && $results?.length === 0} " + $searchTerm + "" })} /> {/if} -{:else if $recentlySeen?.length > 0} - -
-

- -

- - - - -
- {#each $recentlySeen as entry (entry)} - - {/each} -
+{:else} + {/if} diff --git a/src/UI/Search/SearchResults.svelte b/src/UI/Search/SearchResults.svelte index aabce6362..2c818dff5 100644 --- a/src/UI/Search/SearchResults.svelte +++ b/src/UI/Search/SearchResults.svelte @@ -10,6 +10,12 @@ import Translations from "../i18n/Translations" import type { FilterSearchResult } from "../../Logic/Search/FilterSearch" import { WithSearchState } from "../../Models/ThemeViewState/WithSearchState" + import { TrashIcon } from "@babeard/svelte-heroicons/mini" + import { CogIcon } from "@rgossiaux/svelte-heroicons/solid" + import SidebarUnit from "../Base/SidebarUnit.svelte" + import DotMenu from "../Base/DotMenu.svelte" + import type { GeocodeResult } from "../../Logic/Search/GeocodingProvider" + import { default as GeocodeResultSvelte } from "./GeocodeResult.svelte" export let state: WithSearchState let activeFilters: Store<(ActiveFilter & FilterSearchResult)[]> = @@ -26,7 +32,9 @@ return r }) ) + let searchTerm = state.searchState.searchTerm + let recentlySeen: Store = state.userRelatedState.recentlyVisitedSearch.value let allowOtherThemes = state.featureSwitches.featureSwitchBackToThemeOverview let allowFilters = state.featureSwitches.featureSwitchFilter @@ -47,7 +55,38 @@ {#if $allowFilters} {/if} - + + + + {#if $recentlySeen?.length > 0} + +
+

+ +

+ + + + +
+ {#each $recentlySeen as entry (entry)} + + {/each} +
+ {/if} +
+ +
{#if $allowOtherThemes}