]> git.openstreetmap.org Git - nominatim-ui.git/commitdiff
add moreURL/pagination feature
authormarc tobias <mtmail@gmx.net>
Wed, 4 Mar 2020 02:39:21 +0000 (03:39 +0100)
committermarc tobias <mtmail@gmx.net>
Wed, 4 Mar 2020 02:39:21 +0000 (03:39 +0100)
TODO.md
dist/assets/js/nominatim-ui.js
src/assets/js/base.js
src/assets/js/searchpage.js

diff --git a/TODO.md b/TODO.md
index 605fde9a7e85fc207dbba6a097bd88edbf717b8c..40142ded800137acbaa4a9d29addd21096d030b9 100644 (file)
--- a/TODO.md
+++ b/TODO.md
@@ -3,7 +3,6 @@
 
 ## Might never work
 
-* pagination. API returns an array without indication if more results exist
 * API returns category, type, but without admin_level we can't derive e.g. state,country
 * setting accept-language without a server component https://github.com/dansingerman/jQuery-Browser-Language
 
index 4101705517a1b6b6359d4f6deb9c19ba307c7e2a..d2136267495d3dcaa4d2f7fe2c38c4239a82eb5b 100644 (file)
@@ -61,15 +61,13 @@ function map_viewbox_as_string() {
 // *********************************************************
 
 function fetch_from_api(endpoint_name, params, callback) {
-  // `&a=&b=&c=1` => '&c='
-  // fetch_from_api
+  // `&a=&b=&c=1` => '&c=1'
 
-  // var c = ;
-  var keys = Object.keys(params);
-  for (var i = 0; i < keys.length; i += 1) {
-    var val = params[keys[i]];
+  var param_names = Object.keys(params);
+  for (var i = 0; i < param_names.length; i += 1) {
+    var val = param_names[i];
     if (typeof (val) === 'undefined' || val === '' || val === null) {
-      delete params[keys[i]];
+      delete param_names[i];
     }
   }
 
@@ -623,6 +621,7 @@ jQuery(document).ready(function () {
       q: search_params.get('q'),
       polygon_geojson: search_params.get('polygon_geojson') ? 1 : 0,
       viewbox: search_params.get('viewbox'),
+      exclude_place_ids: search_params.get('exclude_place_ids'),
       format: 'jsonv2'
     };
 
@@ -630,8 +629,8 @@ jQuery(document).ready(function () {
       // aSearchResults: aResults,
       sQuery: api_request_params.q,
       sViewBox: search_params.get('viewbox'),
-      env: Nominatim_Config,
-      sMoreURL: ''
+      env: Nominatim_Config
+      // sMoreURL: 'x'
     };
 
     if (api_request_params.q) {
@@ -640,6 +639,20 @@ jQuery(document).ready(function () {
 
         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);
 
index 98f7ee8c5f4244b5771a6023a34985cc1b2ae1bb..a8f6d0a11b53d26c02bf7d93386a3e53b8e93659 100644 (file)
@@ -65,9 +65,9 @@ function fetch_from_api(endpoint_name, params, callback) {
 
   var param_names = Object.keys(params);
   for (var i = 0; i < param_names.length; i += 1) {
-    var val = param_names[keys[i]];
+    var val = param_names[i];
     if (typeof (val) === 'undefined' || val === '' || val === null) {
-      delete param_names[keys[i]];
+      delete param_names[i];
     }
   }
 
index be7f0c1aba77717b057fad8c97e8fb382c420312..d76dffac9ec538590cbd969f459f2566ac4cdf7a 100755 (executable)
@@ -383,6 +383,7 @@ jQuery(document).ready(function () {
       q: search_params.get('q'),
       polygon_geojson: search_params.get('polygon_geojson') ? 1 : 0,
       viewbox: search_params.get('viewbox'),
+      exclude_place_ids: search_params.get('exclude_place_ids'),
       format: 'jsonv2'
     };
 
@@ -390,8 +391,8 @@ jQuery(document).ready(function () {
       // aSearchResults: aResults,
       sQuery: api_request_params.q,
       sViewBox: search_params.get('viewbox'),
-      env: Nominatim_Config,
-      sMoreURL: ''
+      env: Nominatim_Config
+      // sMoreURL: 'x'
     };
 
     if (api_request_params.q) {
@@ -400,6 +401,20 @@ jQuery(document).ready(function () {
 
         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);