X-Git-Url: https://git.openstreetmap.org./nominatim-ui.git/blobdiff_plain/f98046cd5d4fb89cfc6a18c843cd7bec926cc84b..58dca50a7100ce278059f27e589c1d4d09f2f033:/dist/assets/js/nominatim-ui.js?ds=sidebyside diff --git a/dist/assets/js/nominatim-ui.js b/dist/assets/js/nominatim-ui.js index faf6902..ea301b5 100644 --- a/dist/assets/js/nominatim-ui.js +++ b/dist/assets/js/nominatim-ui.js @@ -80,7 +80,7 @@ function map_viewbox_as_string() { // PAGE HELPERS // ********************************************************* -function fetch_from_api(endpoint_name, params, callback) { +function generate_full_api_url(endpoint_name, params) { // // `&a=&b=&c=1` => '&c=1' var param_names = Object.keys(params); @@ -93,16 +93,39 @@ function fetch_from_api(endpoint_name, params, callback) { var api_url = get_config_value('Nominatim_API_Endpoint') + endpoint_name + '.php?' + $.param(params); - if (endpoint_name !== 'status') { - $('#api-request-link').attr('href', api_url); + return api_url; +} + +function update_last_updated(endpoint_name, params) { + if (endpoint_name === 'status') return; + + var api_url = generate_full_api_url(endpoint_name, params); + $('#last-updated').show(); + + $('#api-request a').attr('href', api_url); + $('#api-request').show(); + + if (endpoint_name === 'search' || endpoint_name === 'reverse') { + $('#api-request-debug a').attr('href', api_url + '&debug=1'); + $('#api-request-debug').show(); + } else { + $('#api-request-debug').hide(); } +} + +function fetch_from_api(endpoint_name, params, callback) { + var api_url = generate_full_api_url(endpoint_name, params); $.get(api_url, function (data) { + if (endpoint_name !== 'status') { + update_last_updated(endpoint_name, params); + } callback(data); }); } function update_data_date() { fetch_from_api('status', { format: 'json' }, function (data) { + $('#last-updated').show(); $('#data-date').text(data.data_updated); }); } @@ -134,6 +157,8 @@ function hide_error() { jQuery(document).ready(function () { hide_error(); + $('#last-updated').hide(); + $(document).ajaxStart(function () { $('#loading').fadeIn('fast'); }).ajaxComplete(function () { @@ -210,6 +235,7 @@ function details_page_load() { place_id: search_params.get('place_id'), osmtype: search_params.get('osmtype'), osmid: search_params.get('osmid'), + class: search_params.get('class'), keywords: search_params.get('keywords'), addressdetails: 1, hierarchy: (search_params.get('hierarchy') === '1' ? 1 : 0), @@ -599,6 +625,7 @@ function search_page_load() { aPlace = null; } + context.bSearchRan = true; context.aPlace = aPlace; render_template($('main'), 'reversepage-template', context); @@ -666,21 +693,23 @@ function search_page_load() { fetch_from_api('search', api_request_params, function (aResults) { + context.bSearchRan = true; context.aSearchResults = aResults; - if (aResults.length >= 10) { - var aExcludePlaceIds = []; - if (search_params.has('exclude_place_ids')) { - aExcludePlaceIds.search_params.get('exclude_place_ids').split(','); - } - for (var i = 0; i < aResults.length; i += 1) { - aExcludePlaceIds.push(aResults[i].place_id); - } - - var parsed_url = new URLSearchParams(window.location.search); - parsed_url.set('exclude_place_ids', aExcludePlaceIds.join(',')); - context.sMoreURL = '?' + parsed_url.toString(); + // lonvia wrote: https://github.com/osm-search/nominatim-ui/issues/24 + // I would suggest to remove the guessing and always show the link. Nominatim only returns + // one or two results when it believes the result to be a good enough match. + // if (aResults.length >= 10) { + var aExcludePlaceIds = []; + if (search_params.has('exclude_place_ids')) { + aExcludePlaceIds = search_params.get('exclude_place_ids').split(','); + } + for (var i = 0; i < aResults.length; i += 1) { + aExcludePlaceIds.push(aResults[i].place_id); } + var parsed_url = new URLSearchParams(window.location.search); + parsed_url.set('exclude_place_ids', aExcludePlaceIds.join(',')); + context.sMoreURL = '?' + parsed_url.toString(); render_template($('main'), 'searchpage-template', context); update_html_title('Result for ' + api_request_params.q); @@ -755,7 +784,9 @@ jQuery(document).ready(function () { function parse_url_and_load_page() { // 'search', 'reverse', 'details' - var pagename = window.location.pathname.replace('.html', '').replace(/^\//, ''); + var pagename = window.location.pathname.replace('.html', '').replace(/^.*\//, ''); + + if (pagename === '') pagename = 'search'; $('body').attr('id', pagename + '-page'); @@ -770,13 +801,41 @@ jQuery(document).ready(function () { } } + function is_relative_url(url) { + if (!url) return false; + if (url.indexOf('?') === 0) return true; + if (url.indexOf('/') === 0) return true; + if (url.indexOf('#') === 0) return false; + if (url.match(/^http/)) return false; + if (!url.match(/\.html/)) return true; + + return false; + } + + // remove any URL paramters with empty values + // '&empty=&filled=value' => 'filled=value' + function clean_up_url_parameters(url) { + var url_params = new URLSearchParams(url); + var to_delete = []; // deleting inside loop would skip iterations + url_params.forEach(function (value, key) { + if (value === '') to_delete.push(key); + }); + for (var i = 0; i < to_delete.length; i += 1) { + url_params.delete(to_delete[i]); + } + return url_params.toString(); + } + parse_url_and_load_page(); // load page after form submit $(document).on('submit', 'form', function (e) { e.preventDefault(); - window.history.pushState(myhistory, '', '?' + $(this).serialize()); + var target_url = $(this).serialize(); + target_url = clean_up_url_parameters(target_url); + + window.history.pushState(myhistory, '', '?' + target_url); parse_url_and_load_page(); }); @@ -784,10 +843,11 @@ jQuery(document).ready(function () { // load page after click on relative URL $(document).on('click', 'a', function (e) { var target_url = $(this).attr('href'); - if (target_url && target_url.match(/^http/)) return; - if (target_url && !target_url.match(/\.html/)) return; + if (!is_relative_url(target_url)) return; + if ($(this).parents('#last-updated').length !== 0) return; e.preventDefault(); + e.stopPropagation(); window.history.pushState(myhistory, '', target_url);