2 import UrlSubmitForm from '../components/UrlSubmitForm.svelte';
3 import { SvelteURLSearchParams } from 'svelte/reactivity';
5 import { zoomLevels } from '../lib/helpers.js';
6 import { mapState } from '../state/MapState.svelte.js';
7 import { appState } from '../state/AppState.svelte.js';
9 let { lat = '', lon = '', zoom = '', api_request_params = {} } = $props();
12 const newCenter = mapState.lastClick;
13 const latChanged = Number(lat) !== newCenter?.lat;
14 const lonChanged = Number(lon) !== newCenter?.lng;
16 if (newCenter && (latChanged || lonChanged)) {
17 const params = new SvelteURLSearchParams(appState.page?.params || {});
19 params.set('lat', newCenter.lat);
20 params.set('lon', newCenter.lng);
23 params.set('zoom', zoom);
25 params.delete('zoom');
28 appState.refreshPage('reverse', params);
32 // common mistake is to copy&paste latitude and longitude into the 'lat' search box
33 function maybeSplitLatitude(e) {
34 var coords_split = e.target.value.split(/,|%2C/);
35 if (coords_split.length === 2) {
36 document.querySelector('input[name=lat]').value = L.Util.trim(coords_split[0]);
37 document.querySelector('input[name=lon]').value = L.Util.trim(coords_split[1]);
41 function set_api_param(e) {
42 document.querySelector('input[name=' + e.target.dataset.apiParam + ']').value = e.target.value;
45 function onSwitchCoords(e) {
48 appState.refreshPage('reverse', new URLSearchParams({
57 <div class="col-auto">
58 <label for="reverse-lat">lat</label>
60 <div class="col-auto">
61 <input id="reverse-lat"
64 class="form-control form-control-sm d-inline"
65 placeholder="latitude"
66 pattern="^-?\d+(\.\d+)?$"
68 onchange={maybeSplitLatitude} />
70 <div class="col-auto">
71 <button id="switch-coords"
72 onclick={onSwitchCoords}
73 class="btn btn-outline-secondary btn-sm"
74 title="switch lat and lon"><></button>
76 <div class="col-auto">
77 <label for="reverse-lon">lon</label>
79 <div class="col-auto">
80 <input id="reverse-lon"
83 class="form-control form-control-sm"
84 placeholder="longitude"
85 pattern="^-?\d+(\.\d+)?$"
88 <div class="col-auto">
89 <label for="reverse-zoom">max zoom</label>
91 <div class="col-auto">
92 <select id="reverse-zoom" name="zoom" class="form-select form-select-sm" bind:value={zoom}>
93 <option value="">---</option>
94 {#each zoomLevels() as zoomTitle, i}
95 <option value="{i}">{i} - {zoomTitle}</option>
100 name="layer" value="{api_request_params.layer || ''}" />
101 <div class="col-auto">
102 <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
105 <UrlSubmitForm page="reverse" {content} />
107 <!-- Additional options -->
108 <details id="searchAdvancedOptions" class="mt-2">
109 <summary><small>Advanced options</small></summary>
112 <label for="option_layer">Layer</label>
113 <input id="option_layer" name="layer" placeholder="e.g. address,poi,railway,natural,manmade"
114 value="{api_request_params.layer || ''}"
115 data-api-param="layer" onchange={set_api_param}
116 class="form-control form-control-sm d-inline w-auto api-param-setting">
135 #searchAdvancedOptions ul {
136 list-style-type: none;
141 #searchAdvancedOptions li {
142 display: inline-block;
145 border: 1px dotted #ccc;
149 #searchAdvancedOptions label {
153 @media (max-width: 850px) {
154 #reverse-lon, #reverse-lat, #reverse-zoom {