2 import { results_store } from '../lib/stores.js';
3 import { formatLabel } from '../lib/helpers.js';
4 import { SvelteURLSearchParams } from 'svelte/reactivity';
6 import DetailsLink from './DetailsLink.svelte';
7 import Welcome from './Welcome.svelte';
8 import MapIcon from './MapIcon.svelte';
10 export let reverse_search = false;
11 export let current_result = null;
17 results_store.subscribe(data => {
18 if (!data) { return; }
19 aSearchResults = data;
21 current_result = aSearchResults[0];
24 let search_params = new SvelteURLSearchParams(window.location.search);
27 // lonvia wrote: https://github.com/osm-search/nominatim-ui/issues/24
28 // I would suggest to remove the guessing and always show the link. Nominatim only returns
29 // one or two results when it believes the result to be a good enough match.
30 // if (aResults.length >= 10) {
31 var aExcludePlaceIds = [];
32 if (search_params.has('exclude_place_ids')) {
33 aExcludePlaceIds = search_params.get('exclude_place_ids').split(',');
35 for (var i = 0; i < aResults.length; i += 1) {
36 aExcludePlaceIds.push(aResults[i].place_id);
38 var parsed_url = new SvelteURLSearchParams(window.location.search);
39 parsed_url.set('exclude_place_ids', aExcludePlaceIds.join(','));
40 sMoreURL = '?' + parsed_url.toString();
43 function handleClick(e) {
44 let result_el = e.target;
45 if (!result_el.className.match('result')) {
46 result_el = result_el.parentElement;
48 let pos = Number(result_el.dataset.position);
50 current_result = aSearchResults[pos];
56 {#if aSearchResults && aSearchResults.length > 0}
57 <div id="searchresults" role="list">
59 {#each aSearchResults as aResult, iResNum}
60 <!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
62 class:highlight={iResNum === iHighlightNum}
64 data-position="{iResNum}"
65 on:click|stopPropagation={handleClick}
66 on:keypress|stopPropagation={handleClick}>
67 <div style="float:right">
68 <MapIcon aPlace={aResult} />
70 <span class="name">{aResult.display_name}</span>
71 <span class="type">{formatLabel(aResult)}</span>
72 <p class="coords">{aResult.lat},{aResult.lon}</p>
74 <DetailsLink extra_classes="btn btn-outline-secondary btn-sm" feature={aResult}>
80 {#if sMoreURL && !reverse_search}
82 <a class="btn btn-primary" href="{sMoreURL}">
83 Search for more results
88 {:else if aSearchResults}
90 <div id="intro" class="sidebar">Search for coordinates or click anywhere on the map.</div>
92 <div class="noresults">No search results found</div>
105 background: var(--bs-secondary-bg);
106 border: 1px solid var(--bs-secondary-color);
112 background-color: var(--bs-primary-bg-subtle);
113 border-color: var(--bs-primary-color-subtle);
115 .result.highlight :global(a) {
120 color: var(--bs-secondary-color);
121 background-color: var(--bs-secondary-bg);
124 color: var(--bs-secondary-color);
145 .result.highlight :global(a):hover {
146 background-color: var(--bs-primary-bg-subtle);