]> git.openstreetmap.org Git - nominatim-ui.git/commitdiff
Add interface for setting advanced search options (#38)
authorSarah Hoffmann <lonvia@denofr.de>
Fri, 30 Oct 2020 16:15:22 +0000 (17:15 +0100)
committerGitHub <noreply@github.com>
Fri, 30 Oct 2020 16:15:22 +0000 (17:15 +0100)
* add interface for setting advanced search options

dist/assets/css/search.css
dist/assets/js/nominatim-ui.js
dist/deletable.html
dist/details.html
dist/polygons.html
dist/reverse.html
dist/search.html
src/assets/css/search.css
src/assets/js/searchpage.js
src/templates/searchpage.hbs

index 7026a388a77afea12473949064a06d78d8cb61bf..49c200797882e08bfdd42f50f5dbd2602b36fb59 100755 (executable)
@@ -10,6 +10,8 @@
 .tab-content {
   border: 1px solid #ddd;
   border-top: none;
+  display: flex;
+  align-items: baseline
 }
 
 form #q {
@@ -156,3 +158,17 @@ form #q {
 label {
   font-weight: normal;
 }
+
+#searchAdvancedOptionsContent {
+  display: flex;
+  flex-direction: column;
+  padding: 0 10px
+}
+
+#searchAdvancedOptionsContent label {
+  padding: 0 3px;
+}
+
+#searchAdvancedOptionsContent span {
+  padding: 4px 10px;
+}
index ea301b5ac2dc435e51be1d9d4b43882254145f9d..54eaa75116be30c9c5d6896ede7159e3b468c618 100644 (file)
@@ -331,7 +331,7 @@ function display_map_position(mouse_lat_lng) {
   };
   $('#switch-to-reverse').attr('href', 'reverse.html?' + $.param(reverse_params));
 
-  $('input#use_viewbox').trigger('change');
+  $('input.api-param-setting').trigger('change');
 }
 
 function init_map_on_search_page(is_reverse_search, nominatim_results, request_lat,
@@ -456,6 +456,23 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l
     update_viewbox_field();
   });
 
+  $('input#option_bounded').on('change', function () {
+    $('input[name=bounded]')
+      .val($('input#option_bounded')
+        .prop('checked') ? '1' : '');
+  });
+
+  $('input#option_dedupe').on('change', function () {
+    $('input[name=dedupe]')
+      .val($('input#option_dedupe')
+        .prop('checked') ? '' : '0');
+  });
+
+  $('input[data-api-param]').on('change', function (e) {
+    $('input[name=' + $(e.target).data('api-param') + ']').val(e.target.value);
+  });
+
+
   function get_result_element(position) {
     return $('.result').eq(position);
   }
@@ -667,6 +684,12 @@ function search_page_load() {
       postalcode: search_params.get('postalcode'),
       polygon_geojson: get_config_value('Search_AreaPolygons', false) ? 1 : 0,
       viewbox: search_params.get('viewbox'),
+      bounded: search_params.get('bounded'),
+      dedupe: search_params.get('dedupe'),
+      'accept-language': search_params.get('accept-language'),
+      countrycodes: search_params.get('countrycodes'),
+      limit: search_params.get('limit'),
+      polygon_threshold: search_params.get('polygon_threshold'),
       exclude_place_ids: search_params.get('exclude_place_ids'),
       format: 'jsonv2'
     };
@@ -674,6 +697,12 @@ function search_page_load() {
     context = {
       sQuery: api_request_params.q,
       sViewBox: search_params.get('viewbox'),
+      sBounded: search_params.get('bounded'),
+      sDedupe: search_params.get('dedupe'),
+      sLang: search_params.get('accept-language'),
+      sCCode: search_params.get('countrycodes'),
+      sLimit: search_params.get('limit'),
+      sPolyThreshold: search_params.get('polygon_threshold'),
       env: {}
     };
 
index 9064234cc49e9a3f59e3a6c38da38a57eeaa8845..a33aa38cbf21241827f5aafab30732bb2beecd24 100644 (file)
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
-          <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
-                   id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
-          </div>
+          <input type="hidden" name="dedupe" value="{{sDedupe}}" />
+          <input type="hidden" name="bounded" value="{{sBounded}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
         </div>
       </form>
     </div>
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
+          <input type="hidden" name="dedupe" value="{{#unless sDedupe}}0{{/unless}}" />
+          <input type="hidden" name="bounded" value="{{#if sBounded}}1{{/if}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
+        </div>
+      </form>
+    </div>
+    <!-- Additional options -->
+    <a class="btn btn-outline-secondary btn-sm" data-toggle="collapse" data-target="#searchAdvancedOptions" role="button" aria-expanded="false" aria-controls="collapseAdvancedOptions">
+      Advanced options
+    </a>
+    <div class="collapse" id="searchAdvancedOptions">
+      <div id="searchAdvancedOptionsContent">
           <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
+            <span><input type="checkbox" class="form-check-input api-param-setting"
                    id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
+            <label class="form-check-label" for="use_viewbox">apply viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_bounded" {{#if sBounded}}checked="checked"{{/if}}>
+            <label class="form-check-label" for="option_bounded">bounded to viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_dedupe" {{#unless sDedupe}}checked="checked"{{/unless}}>
+            <label class="form-check-label" for="option_dedupe">deduplicate results</label></span>
           </div>
-        </div>
-      </form>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="option_limit">Maximum number of results: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="limit" id="option_limit" size="5" min="1" max="50" value="{{sLimit}}"></span>
+            <span><label class="form-check-label" for="option_polygon_threashold">Polygon simplification: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="polygon_threshold" id="option_polygon_threshold" size="5" min="0.0" step="0.01" value="{{sPolyThreshold}}"></span>
+          </div>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="accept_lang">Languages: </label>
+            <input type="text" placeholder="e.g. en,zh-Hant" class="form-check-input api-param-setting" data-api-param="accept-language" id="accept_lang" size="15" value="{{sLang}}"></span>
+            <span><label class="form-check-label" for="option_ccode">Countries: </label>
+            <input type="text" placeholder="e.g. de,gb" class="form-check-input api-param-setting" data-api-param="countrycodes" id="option_ccode" size="15" value="{{sCCode}}"></span>
+          </div>
+       </div>
     </div>
   </div> <!-- /tab-content -->
 </div> <!-- /top-bar -->
index 9064234cc49e9a3f59e3a6c38da38a57eeaa8845..a33aa38cbf21241827f5aafab30732bb2beecd24 100644 (file)
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
-          <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
-                   id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
-          </div>
+          <input type="hidden" name="dedupe" value="{{sDedupe}}" />
+          <input type="hidden" name="bounded" value="{{sBounded}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
         </div>
       </form>
     </div>
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
+          <input type="hidden" name="dedupe" value="{{#unless sDedupe}}0{{/unless}}" />
+          <input type="hidden" name="bounded" value="{{#if sBounded}}1{{/if}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
+        </div>
+      </form>
+    </div>
+    <!-- Additional options -->
+    <a class="btn btn-outline-secondary btn-sm" data-toggle="collapse" data-target="#searchAdvancedOptions" role="button" aria-expanded="false" aria-controls="collapseAdvancedOptions">
+      Advanced options
+    </a>
+    <div class="collapse" id="searchAdvancedOptions">
+      <div id="searchAdvancedOptionsContent">
           <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
+            <span><input type="checkbox" class="form-check-input api-param-setting"
                    id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
+            <label class="form-check-label" for="use_viewbox">apply viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_bounded" {{#if sBounded}}checked="checked"{{/if}}>
+            <label class="form-check-label" for="option_bounded">bounded to viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_dedupe" {{#unless sDedupe}}checked="checked"{{/unless}}>
+            <label class="form-check-label" for="option_dedupe">deduplicate results</label></span>
           </div>
-        </div>
-      </form>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="option_limit">Maximum number of results: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="limit" id="option_limit" size="5" min="1" max="50" value="{{sLimit}}"></span>
+            <span><label class="form-check-label" for="option_polygon_threashold">Polygon simplification: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="polygon_threshold" id="option_polygon_threshold" size="5" min="0.0" step="0.01" value="{{sPolyThreshold}}"></span>
+          </div>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="accept_lang">Languages: </label>
+            <input type="text" placeholder="e.g. en,zh-Hant" class="form-check-input api-param-setting" data-api-param="accept-language" id="accept_lang" size="15" value="{{sLang}}"></span>
+            <span><label class="form-check-label" for="option_ccode">Countries: </label>
+            <input type="text" placeholder="e.g. de,gb" class="form-check-input api-param-setting" data-api-param="countrycodes" id="option_ccode" size="15" value="{{sCCode}}"></span>
+          </div>
+       </div>
     </div>
   </div> <!-- /tab-content -->
 </div> <!-- /top-bar -->
index 9064234cc49e9a3f59e3a6c38da38a57eeaa8845..a33aa38cbf21241827f5aafab30732bb2beecd24 100644 (file)
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
-          <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
-                   id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
-          </div>
+          <input type="hidden" name="dedupe" value="{{sDedupe}}" />
+          <input type="hidden" name="bounded" value="{{sBounded}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
         </div>
       </form>
     </div>
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
+          <input type="hidden" name="dedupe" value="{{#unless sDedupe}}0{{/unless}}" />
+          <input type="hidden" name="bounded" value="{{#if sBounded}}1{{/if}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
+        </div>
+      </form>
+    </div>
+    <!-- Additional options -->
+    <a class="btn btn-outline-secondary btn-sm" data-toggle="collapse" data-target="#searchAdvancedOptions" role="button" aria-expanded="false" aria-controls="collapseAdvancedOptions">
+      Advanced options
+    </a>
+    <div class="collapse" id="searchAdvancedOptions">
+      <div id="searchAdvancedOptionsContent">
           <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
+            <span><input type="checkbox" class="form-check-input api-param-setting"
                    id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
+            <label class="form-check-label" for="use_viewbox">apply viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_bounded" {{#if sBounded}}checked="checked"{{/if}}>
+            <label class="form-check-label" for="option_bounded">bounded to viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_dedupe" {{#unless sDedupe}}checked="checked"{{/unless}}>
+            <label class="form-check-label" for="option_dedupe">deduplicate results</label></span>
           </div>
-        </div>
-      </form>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="option_limit">Maximum number of results: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="limit" id="option_limit" size="5" min="1" max="50" value="{{sLimit}}"></span>
+            <span><label class="form-check-label" for="option_polygon_threashold">Polygon simplification: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="polygon_threshold" id="option_polygon_threshold" size="5" min="0.0" step="0.01" value="{{sPolyThreshold}}"></span>
+          </div>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="accept_lang">Languages: </label>
+            <input type="text" placeholder="e.g. en,zh-Hant" class="form-check-input api-param-setting" data-api-param="accept-language" id="accept_lang" size="15" value="{{sLang}}"></span>
+            <span><label class="form-check-label" for="option_ccode">Countries: </label>
+            <input type="text" placeholder="e.g. de,gb" class="form-check-input api-param-setting" data-api-param="countrycodes" id="option_ccode" size="15" value="{{sCCode}}"></span>
+          </div>
+       </div>
     </div>
   </div> <!-- /tab-content -->
 </div> <!-- /top-bar -->
index 9064234cc49e9a3f59e3a6c38da38a57eeaa8845..a33aa38cbf21241827f5aafab30732bb2beecd24 100644 (file)
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
-          <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
-                   id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
-          </div>
+          <input type="hidden" name="dedupe" value="{{sDedupe}}" />
+          <input type="hidden" name="bounded" value="{{sBounded}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
         </div>
       </form>
     </div>
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
+          <input type="hidden" name="dedupe" value="{{#unless sDedupe}}0{{/unless}}" />
+          <input type="hidden" name="bounded" value="{{#if sBounded}}1{{/if}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
+        </div>
+      </form>
+    </div>
+    <!-- Additional options -->
+    <a class="btn btn-outline-secondary btn-sm" data-toggle="collapse" data-target="#searchAdvancedOptions" role="button" aria-expanded="false" aria-controls="collapseAdvancedOptions">
+      Advanced options
+    </a>
+    <div class="collapse" id="searchAdvancedOptions">
+      <div id="searchAdvancedOptionsContent">
           <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
+            <span><input type="checkbox" class="form-check-input api-param-setting"
                    id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
+            <label class="form-check-label" for="use_viewbox">apply viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_bounded" {{#if sBounded}}checked="checked"{{/if}}>
+            <label class="form-check-label" for="option_bounded">bounded to viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_dedupe" {{#unless sDedupe}}checked="checked"{{/unless}}>
+            <label class="form-check-label" for="option_dedupe">deduplicate results</label></span>
           </div>
-        </div>
-      </form>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="option_limit">Maximum number of results: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="limit" id="option_limit" size="5" min="1" max="50" value="{{sLimit}}"></span>
+            <span><label class="form-check-label" for="option_polygon_threashold">Polygon simplification: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="polygon_threshold" id="option_polygon_threshold" size="5" min="0.0" step="0.01" value="{{sPolyThreshold}}"></span>
+          </div>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="accept_lang">Languages: </label>
+            <input type="text" placeholder="e.g. en,zh-Hant" class="form-check-input api-param-setting" data-api-param="accept-language" id="accept_lang" size="15" value="{{sLang}}"></span>
+            <span><label class="form-check-label" for="option_ccode">Countries: </label>
+            <input type="text" placeholder="e.g. de,gb" class="form-check-input api-param-setting" data-api-param="countrycodes" id="option_ccode" size="15" value="{{sCCode}}"></span>
+          </div>
+       </div>
     </div>
   </div> <!-- /tab-content -->
 </div> <!-- /top-bar -->
index 9064234cc49e9a3f59e3a6c38da38a57eeaa8845..a33aa38cbf21241827f5aafab30732bb2beecd24 100644 (file)
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
-          <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
-                   id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
-          </div>
+          <input type="hidden" name="dedupe" value="{{sDedupe}}" />
+          <input type="hidden" name="bounded" value="{{sBounded}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
         </div>
       </form>
     </div>
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
+          <input type="hidden" name="dedupe" value="{{#unless sDedupe}}0{{/unless}}" />
+          <input type="hidden" name="bounded" value="{{#if sBounded}}1{{/if}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
+        </div>
+      </form>
+    </div>
+    <!-- Additional options -->
+    <a class="btn btn-outline-secondary btn-sm" data-toggle="collapse" data-target="#searchAdvancedOptions" role="button" aria-expanded="false" aria-controls="collapseAdvancedOptions">
+      Advanced options
+    </a>
+    <div class="collapse" id="searchAdvancedOptions">
+      <div id="searchAdvancedOptionsContent">
           <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
+            <span><input type="checkbox" class="form-check-input api-param-setting"
                    id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
+            <label class="form-check-label" for="use_viewbox">apply viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_bounded" {{#if sBounded}}checked="checked"{{/if}}>
+            <label class="form-check-label" for="option_bounded">bounded to viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_dedupe" {{#unless sDedupe}}checked="checked"{{/unless}}>
+            <label class="form-check-label" for="option_dedupe">deduplicate results</label></span>
           </div>
-        </div>
-      </form>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="option_limit">Maximum number of results: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="limit" id="option_limit" size="5" min="1" max="50" value="{{sLimit}}"></span>
+            <span><label class="form-check-label" for="option_polygon_threashold">Polygon simplification: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="polygon_threshold" id="option_polygon_threshold" size="5" min="0.0" step="0.01" value="{{sPolyThreshold}}"></span>
+          </div>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="accept_lang">Languages: </label>
+            <input type="text" placeholder="e.g. en,zh-Hant" class="form-check-input api-param-setting" data-api-param="accept-language" id="accept_lang" size="15" value="{{sLang}}"></span>
+            <span><label class="form-check-label" for="option_ccode">Countries: </label>
+            <input type="text" placeholder="e.g. de,gb" class="form-check-input api-param-setting" data-api-param="countrycodes" id="option_ccode" size="15" value="{{sCCode}}"></span>
+          </div>
+       </div>
     </div>
   </div> <!-- /tab-content -->
 </div> <!-- /top-bar -->
index 7026a388a77afea12473949064a06d78d8cb61bf..49c200797882e08bfdd42f50f5dbd2602b36fb59 100755 (executable)
@@ -10,6 +10,8 @@
 .tab-content {
   border: 1px solid #ddd;
   border-top: none;
+  display: flex;
+  align-items: baseline
 }
 
 form #q {
@@ -156,3 +158,17 @@ form #q {
 label {
   font-weight: normal;
 }
+
+#searchAdvancedOptionsContent {
+  display: flex;
+  flex-direction: column;
+  padding: 0 10px
+}
+
+#searchAdvancedOptionsContent label {
+  padding: 0 3px;
+}
+
+#searchAdvancedOptionsContent span {
+  padding: 4px 10px;
+}
index 95d842d5d176f3fd3a29c84e7a25559ca38b39b2..38a9cf882fc8735c0ff3f0542e832b0da33003b8 100755 (executable)
@@ -45,7 +45,7 @@ function display_map_position(mouse_lat_lng) {
   };
   $('#switch-to-reverse').attr('href', 'reverse.html?' + $.param(reverse_params));
 
-  $('input#use_viewbox').trigger('change');
+  $('input.api-param-setting').trigger('change');
 }
 
 function init_map_on_search_page(is_reverse_search, nominatim_results, request_lat,
@@ -170,6 +170,23 @@ function init_map_on_search_page(is_reverse_search, nominatim_results, request_l
     update_viewbox_field();
   });
 
+  $('input#option_bounded').on('change', function () {
+    $('input[name=bounded]')
+      .val($('input#option_bounded')
+        .prop('checked') ? '1' : '');
+  });
+
+  $('input#option_dedupe').on('change', function () {
+    $('input[name=dedupe]')
+      .val($('input#option_dedupe')
+        .prop('checked') ? '' : '0');
+  });
+
+  $('input[data-api-param]').on('change', function (e) {
+    $('input[name=' + $(e.target).data('api-param') + ']').val(e.target.value);
+  });
+
+
   function get_result_element(position) {
     return $('.result').eq(position);
   }
@@ -381,6 +398,12 @@ function search_page_load() {
       postalcode: search_params.get('postalcode'),
       polygon_geojson: get_config_value('Search_AreaPolygons', false) ? 1 : 0,
       viewbox: search_params.get('viewbox'),
+      bounded: search_params.get('bounded'),
+      dedupe: search_params.get('dedupe'),
+      'accept-language': search_params.get('accept-language'),
+      countrycodes: search_params.get('countrycodes'),
+      limit: search_params.get('limit'),
+      polygon_threshold: search_params.get('polygon_threshold'),
       exclude_place_ids: search_params.get('exclude_place_ids'),
       format: 'jsonv2'
     };
@@ -388,6 +411,12 @@ function search_page_load() {
     context = {
       sQuery: api_request_params.q,
       sViewBox: search_params.get('viewbox'),
+      sBounded: search_params.get('bounded'),
+      sDedupe: search_params.get('dedupe'),
+      sLang: search_params.get('accept-language'),
+      sCCode: search_params.get('countrycodes'),
+      sLimit: search_params.get('limit'),
+      sPolyThreshold: search_params.get('polygon_threshold'),
       env: {}
     };
 
index 6ed8203d8c0b674664496ef3d12b12faf661477b..c8f52810f5df1e66ad1d0bf77ed8388620f8e082 100644 (file)
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
-          <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
-                   id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
-          </div>
+          <input type="hidden" name="dedupe" value="{{sDedupe}}" />
+          <input type="hidden" name="bounded" value="{{sBounded}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
         </div>
       </form>
     </div>
         <div class="form-group search-button-group">
           <button type="submit" class="btn btn-primary btn-sm mx-1">Search</button>
           <input type="hidden" name="viewbox" value="{{sViewBox}}" />
+          <input type="hidden" name="dedupe" value="{{#unless sDedupe}}0{{/unless}}" />
+          <input type="hidden" name="bounded" value="{{#if sBounded}}1{{/if}}" />
+          <input type="hidden" name="accept-language" value="{{sLang}}" />
+          <input type="hidden" name="countrycodes" value="{{sCCode}}" />
+          <input type="hidden" name="limit" value="{{sLimit}}" />
+          <input type="hidden" name="polygon_threshold" value="{{sPolyThreshold}}" />
+        </div>
+      </form>
+    </div>
+    <!-- Additional options -->
+    <a class="btn btn-outline-secondary btn-sm" data-toggle="collapse" data-target="#searchAdvancedOptions" role="button" aria-expanded="false" aria-controls="collapseAdvancedOptions">
+      Advanced options
+    </a>
+    <div class="collapse" id="searchAdvancedOptions">
+      <div id="searchAdvancedOptionsContent">
           <div class="form-check form-check-inline">
-            <input type="checkbox" class="form-check-input"
+            <span><input type="checkbox" class="form-check-input api-param-setting"
                    id="use_viewbox" {{#if sViewBox}}checked="checked"{{/if}}>
-            <label class="form-check-label" for="use_viewbox">apply viewbox</label>
+            <label class="form-check-label" for="use_viewbox">apply viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_bounded" {{#if sBounded}}checked="checked"{{/if}}>
+            <label class="form-check-label" for="option_bounded">bounded to viewbox</label></span>
+            <span><input type="checkbox" class="form-check-input api-param-setting"
+                   id="option_dedupe" {{#unless sDedupe}}checked="checked"{{/unless}}>
+            <label class="form-check-label" for="option_dedupe">deduplicate results</label></span>
           </div>
-        </div>
-      </form>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="option_limit">Maximum number of results: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="limit" id="option_limit" size="5" min="1" max="50" value="{{sLimit}}"></span>
+            <span><label class="form-check-label" for="option_polygon_threashold">Polygon simplification: </label>
+            <input type="number" class="form-check-input api-param-setting" data-api-param="polygon_threshold" id="option_polygon_threshold" size="5" min="0.0" step="0.01" value="{{sPolyThreshold}}"></span>
+          </div>
+          <div class="form-check form-check-inline">
+            <span><label class="form-check-label" for="accept_lang">Languages: </label>
+            <input type="text" placeholder="e.g. en,zh-Hant" class="form-check-input api-param-setting" data-api-param="accept-language" id="accept_lang" size="15" value="{{sLang}}"></span>
+            <span><label class="form-check-label" for="option_ccode">Countries: </label>
+            <input type="text" placeholder="e.g. de,gb" class="form-check-input api-param-setting" data-api-param="countrycodes" id="option_ccode" size="15" value="{{sCCode}}"></span>
+          </div>
+       </div>
     </div>
   </div> <!-- /tab-content -->
 </div> <!-- /top-bar -->