X-Git-Url: https://git.openstreetmap.org./nominatim-ui.git/blobdiff_plain/8e602e40f04bb048adba103dd1dde79ba2cfdffc..ee9ae6193aefe2a28522a71406cbb92614844f1e:/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 c6761fd..87776c4 100644 --- a/dist/assets/js/nominatim-ui.js +++ b/dist/assets/js/nominatim-ui.js @@ -3,13 +3,33 @@ var map; var last_click_latlng; +// ********************************************************* +// DEFAULTS +// ********************************************************* + +var Nominatim_Config_Defaults = { + Nominatim_API_Endpoint: 'http://localhost/nominatim/', + Images_Base_Url: '/mapicons/', + Search_AreaPolygons: 1, + Reverse_Default_Search_Zoom: 18, + Map_Default_Lat: 20.0, + Map_Default_Lon: 0.0, + Map_Default_Zoom: 2, + Map_Tile_URL: 'https://{s}.tile.osm.org/{z}/{x}/{y}.png', + Map_Tile_Attribution: 'OpenStreetMap contributors' +}; // ********************************************************* // HELPERS // ********************************************************* + function get_config_value(str, default_val) { - return (typeof Nominatim_Config[str] !== 'undefined' ? Nominatim_Config[str] : default_val); + var value = ((typeof Nominatim_Config !== 'undefined') + && (typeof Nominatim_Config[str] !== 'undefined')) + ? Nominatim_Config[str] + : Nominatim_Config_Defaults[str]; + return (typeof value !== 'undefined' ? value : default_val); } function parse_and_normalize_geojson_string(part) { @@ -29,7 +49,10 @@ function parse_and_normalize_geojson_string(part) { } function map_link_to_osm() { - return 'https://openstreetmap.org/#map=' + map.getZoom() + '/' + map.getCenter().lat + '/' + map.getCenter().lng; + var zoom = map.getZoom(); + var lat = map.getCenter().lat; + var lng = map.getCenter().lng; + return 'https://openstreetmap.org/#map=' + zoom + '/' + lat + '/' + lng; } function map_viewbox_as_string() { @@ -58,12 +81,18 @@ function map_viewbox_as_string() { // ********************************************************* function fetch_from_api(endpoint_name, params, callback) { - // `&a=&b=&c=1` => '&c=' - for (var k in params) { - if (typeof (params[k]) === 'undefined' || params[k] === '' || params[k] === null) delete params[k]; + // + // `&a=&b=&c=1` => '&c=1' + var param_names = Object.keys(params); + for (var i = 0; i < param_names.length; i += 1) { + var val = params[param_names[i]]; + if (typeof (val) === 'undefined' || val === '' || val === null) { + delete params[param_names[i]]; + } } - var api_url = get_config_value('Nominatim_API_Endpoint') + endpoint_name + '.php?' + $.param(params); + 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); } @@ -102,15 +131,19 @@ function hide_error() { } -$(document).ajaxError(function (event, jqXHR, ajaxSettings/* , thrownError */) { - // console.log(thrownError); - // console.log(ajaxSettings); - show_error('Error fetching results from ' + ajaxSettings.url + ''); -}); - - jQuery(document).ready(function () { hide_error(); + + $(document).ajaxStart(function () { + $('#loading').fadeIn('fast'); + }).ajaxComplete(function () { + $('#loading').fadeOut('fast'); + }).ajaxError(function (event, jqXHR, ajaxSettings/* , thrownError */) { + // console.log(thrownError); + // console.log(ajaxSettings); + var url = ajaxSettings.url; + show_error('Error fetching results from ' + url + ''); + }); }); // ********************************************************* // DETAILS PAGE @@ -118,17 +151,19 @@ jQuery(document).ready(function () { function init_map_on_detail_page(lat, lon, geojson) { + var attribution = get_config_value('Map_Tile_Attribution') || null; map = new L.map('map', { // center: [nominatim_map_init.lat, nominatim_map_init.lon], // zoom: nominatim_map_init.zoom, - attributionControl: (get_config_value('Map_Tile_Attribution') && get_config_value('Map_Tile_Attribution').length), + attributionControl: (attribution && attribution.length), scrollWheelZoom: true, // !L.Browser.touch, touchZoom: false }); L.tileLayer(get_config_value('Map_Tile_URL'), { // moved to footer - attribution: (get_config_value('Map_Tile_Attribution') || null) // '© OpenStreetMap contributors' + // '© OpenStreetMap contributors' + attribution: attribution }).addTo(map); // var layerGroup = new L.layerGroup().addTo(map); @@ -166,8 +201,7 @@ function init_map_on_detail_page(lat, lon, geojson) { } -jQuery(document).ready(function () { - if (!$('#details-page').length) { return; } +function details_page_load() { var search_params = new URLSearchParams(window.location.search); // var place_id = search_params.get('place_id'); @@ -223,7 +257,7 @@ jQuery(document).ready(function () { alert('invalid input'); } }); -}); +} // ********************************************************* // FORWARD/REVERSE SEARCH PAGE @@ -238,11 +272,13 @@ function display_map_position(mouse_lat_lng) { var html_mouse = 'mouse position: -'; if (mouse_lat_lng) { - html_mouse = 'mouse position: ' + [mouse_lat_lng.lat.toFixed(5), mouse_lat_lng.lng.toFixed(5)].join(','); + html_mouse = 'mouse position: ' + + [mouse_lat_lng.lat.toFixed(5), mouse_lat_lng.lng.toFixed(5)].join(','); } var html_click = 'last click: -'; if (last_click_latlng) { - html_click = 'last click: ' + [last_click_latlng.lat.toFixed(5), last_click_latlng.lng.toFixed(5)].join(','); + html_click = 'last click: ' + + [last_click_latlng.lat.toFixed(5), last_click_latlng.lng.toFixed(5)].join(','); } var html_center = 'map center: ' @@ -252,7 +288,13 @@ function display_map_position(mouse_lat_lng) { var html_zoom = 'map zoom: ' + map.getZoom(); var html_viewbox = 'viewbox: ' + map_viewbox_as_string(); - $('#map-position-inner').html([html_center, html_zoom, html_viewbox, html_click, html_mouse].join('
')); + $('#map-position-inner').html([ + html_center, + html_zoom, + html_viewbox, + html_click, + html_mouse + ].join('
')); var center_lat_lng = map.wrapLatLng(map.getCenter()); var reverse_params = { @@ -266,12 +308,14 @@ function display_map_position(mouse_lat_lng) { $('input#use_viewbox').trigger('change'); } -function init_map_on_search_page(is_reverse_search, nominatim_results, request_lat, request_lon, init_zoom) { - // +function init_map_on_search_page(is_reverse_search, nominatim_results, request_lat, + request_lon, init_zoom) { + + var attribution = get_config_value('Map_Tile_Attribution') || null; map = new L.map('map', { // center: [nominatim_map_init.lat, nominatim_map_init.lon], // zoom: nominatim_map_init.zoom, - attributionControl: (get_config_value('Map_Tile_Attribution') && get_config_value('Map_Tile_Attribution').length), + attributionControl: (attribution && attribution.length), scrollWheelZoom: true, // !L.Browser.touch, touchZoom: false }); @@ -279,7 +323,8 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l L.tileLayer(get_config_value('Map_Tile_URL'), { // moved to footer - attribution: (get_config_value('Map_Tile_Attribution') || null) // '© OpenStreetMap contributors' + // '© OpenStreetMap contributors' + attribution: attribution }).addTo(map); // console.log(Nominatim_Config); @@ -289,7 +334,7 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l var osm2 = new L.TileLayer(get_config_value('Map_Tile_URL'), { minZoom: 0, maxZoom: 13, - attribution: (get_config_value('Map_Tile_Attribution') || null) + attribution: attribution }); new L.Control.MiniMap(osm2, { toggleDisplay: true }).addTo(map); @@ -331,12 +376,14 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l onAdd: function (/* map */) { var container = L.DomUtil.create('div', 'my-custom-control'); - $(container).text('show map bounds').addClass('leaflet-bar btn btn-sm btn-default').on('click', function (e) { - e.preventDefault(); - e.stopPropagation(); - $('#map-position').show(); - $(container).hide(); - }); + $(container).text('show map bounds') + .addClass('leaflet-bar btn btn-sm btn-outline-secondary') + .on('click', function (e) { + e.preventDefault(); + e.stopPropagation(); + $('#map-position').show(); + $(container).hide(); + }); $('#map-position-close a').on('click', function (e) { e.preventDefault(); e.stopPropagation(); @@ -356,7 +403,9 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l function update_viewbox_field() { // hidden HTML field - $('input[name=viewbox]').val($('input#use_viewbox').prop('checked') ? map_viewbox_as_string() : ''); + $('input[name=viewbox]') + .val($('input#use_viewbox') + .prop('checked') ? map_viewbox_as_string() : ''); } map.on('move', function () { @@ -381,9 +430,6 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l update_viewbox_field(); }); - - - function get_result_element(position) { return $('.result').eq(position); } @@ -506,15 +552,9 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l +function search_page_load() { - - - -jQuery(document).ready(function () { - // - if (!$('#search-page,#reverse-page').length) { return; } - - var is_reverse_search = !!($('#reverse-page').length); + var is_reverse_search = window.location.pathname.match(/reverse/); var search_params = new URLSearchParams(window.location.search); @@ -535,7 +575,9 @@ jQuery(document).ready(function () { api_request_params = { lat: search_params.get('lat'), lon: search_params.get('lon'), - zoom: (search_params.get('zoom') > 1 ? search_params.get('zoom') : get_config_value('Reverse_Default_Search_Zoom')), + zoom: (search_params.get('zoom') > 1 + ? search_params.get('zoom') + : get_config_value('Reverse_Default_Search_Zoom')), format: 'jsonv2' }; @@ -543,7 +585,9 @@ jQuery(document).ready(function () { // aPlace: aPlace, fLat: api_request_params.lat, fLon: api_request_params.lon, - iZoom: (search_params.get('zoom') > 1 ? api_request_params.zoom : get_config_value('Reverse_Default_Search_Zoom')) + iZoom: (search_params.get('zoom') > 1 + ? api_request_params.zoom + : get_config_value('Reverse_Default_Search_Zoom')) }; update_html_title(); @@ -558,7 +602,10 @@ jQuery(document).ready(function () { context.aPlace = aPlace; render_template($('main'), 'reversepage-template', context); - update_html_title('Reverse result for ' + api_request_params.lat + ',' + api_request_params.lon); + update_html_title('Reverse result for ' + + api_request_params.lat + + ',' + + api_request_params.lon); init_map_on_search_page( is_reverse_search, @@ -585,25 +632,56 @@ jQuery(document).ready(function () { } else { api_request_params = { q: search_params.get('q'), - polygon_geojson: search_params.get('polygon_geojson') ? 1 : 0, + street: search_params.get('street'), + city: search_params.get('city'), + county: search_params.get('county'), + state: search_params.get('state'), + country: search_params.get('country'), + postalcode: search_params.get('postalcode'), + polygon_geojson: get_config_value('Search_AreaPolygons', false) ? 1 : 0, viewbox: search_params.get('viewbox'), + exclude_place_ids: search_params.get('exclude_place_ids'), format: 'jsonv2' }; context = { - // aSearchResults: aResults, sQuery: api_request_params.q, sViewBox: search_params.get('viewbox'), - env: Nominatim_Config, - sMoreURL: '' + env: {} }; - if (api_request_params.q) { + if (api_request_params.street || api_request_params.city || api_request_params.county + || api_request_params.state || api_request_params.country || api_request_params.postalcode) { + context.hStructured = { + street: api_request_params.street, + city: api_request_params.city, + county: api_request_params.county, + state: api_request_params.state, + country: api_request_params.country, + postalcode: api_request_params.postalcode + }; + } + + if (api_request_params.q || context.hStructured) { fetch_from_api('search', api_request_params, function (aResults) { 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(); + } + render_template($('main'), 'searchpage-template', context); update_html_title('Result for ' + api_request_params.q); @@ -631,4 +709,122 @@ jQuery(document).ready(function () { ); } } +} + + +// ********************************************************* +// DELETABLE PAGE +// ********************************************************* + +function deletable_page_load() { + + var api_request_params = { + format: 'json' + }; + + fetch_from_api('deletable', api_request_params, function (aPolygons) { + var context = { aPolygons: aPolygons }; + + render_template($('main'), 'deletable-template', context); + update_html_title('Deletable objects'); + + update_data_date(); + }); +} +// ********************************************************* +// BROKEN POLYGON PAGE +// ********************************************************* + +function polygons_page_load() { + // + var api_request_params = { + format: 'json' + }; + + fetch_from_api('polygons', api_request_params, function (aPolygons) { + var context = { aPolygons: aPolygons }; + + render_template($('main'), 'polygons-template', context); + update_html_title('Broken polygons'); + + update_data_date(); + }); +} +jQuery(document).ready(function () { + var myhistory = []; + + function parse_url_and_load_page() { + // 'search', 'reverse', 'details' + var pagename = window.location.pathname.replace('.html', '').replace(/^\//, ''); + + $('body').attr('id', pagename + '-page'); + + if (pagename === 'search' || pagename === 'reverse') { + search_page_load(); + } else if (pagename === 'details') { + details_page_load(); + } else if (pagename === 'deletable') { + deletable_page_load(); + } else if (pagename === 'polygons') { + polygons_page_load(); + } + } + + 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