]> git.openstreetmap.org Git - nominatim-ui.git/commitdiff
all templates in one document, deal with window.history change
authormarc tobias <mtmail@gmx.net>
Tue, 7 Jul 2020 00:24:14 +0000 (02:24 +0200)
committermarc tobias <mtmail@gmx.net>
Tue, 7 Jul 2020 00:24:14 +0000 (02:24 +0200)
22 files changed:
build.sh
dist/assets/css/common.css
dist/assets/js/nominatim-ui.js
dist/deletable.hbs [deleted file]
dist/deletable.html
dist/details.html
dist/detailspage-index.hbs [deleted file]
dist/detailspage.hbs [deleted file]
dist/polygons.hbs [deleted file]
dist/polygons.html
dist/reverse.html
dist/reversepage.hbs [deleted file]
dist/search.html
dist/searchpage.hbs [deleted file]
src/assets/css/common.css
src/assets/js/base.js
src/assets/js/controller.js [new file with mode: 0644]
src/assets/js/deletable.js
src/assets/js/detailpage.js
src/assets/js/polygons.js
src/assets/js/searchpage.js
src/layout.html

index 9ecf435cdcf5bca5d43c9505a64d954b7c18d0c1..973ccbd0576975c31656578bc36113718bdde763 100755 (executable)
--- a/build.sh
+++ b/build.sh
@@ -1,78 +1,69 @@
 #!/bin/bash
 
 mkdir -p dist/assets/
-rsync --quiet --recursive src/assets/css/ dist/assets/css/
+rsync --quiet --recursive src/assets/css/    dist/assets/css/
 rsync --quiet --recursive src/assets/images/ dist/assets/images/
 
 mkdir -p dist/assets/js/
-cat src/assets/js/base.js src/assets/js/detailpage.js src/assets/js/searchpage.js src/assets/js/deletable.js src/assets/js/polygons.js > dist/assets/js/nominatim-ui.js
+cat src/assets/js/base.js       \
+    src/assets/js/detailpage.js \
+    src/assets/js/searchpage.js \
+    src/assets/js/deletable.js  \
+    src/assets/js/polygons.js   \
+    src/assets/js/controller.js > dist/assets/js/nominatim-ui.js
 
-rsync --quiet node_modules/jquery/dist/jquery.min.js dist/assets/js/
-rsync --quiet node_modules/leaflet/dist/leaflet.js dist/assets/js/
+rsync --quiet node_modules/jquery/dist/jquery.min.js   dist/assets/js/
+rsync --quiet node_modules/leaflet/dist/leaflet.js     dist/assets/js/
 rsync --quiet node_modules/leaflet/dist/leaflet.js.map dist/assets/js/
-rsync --quiet node_modules/leaflet/dist/leaflet.css dist/assets/css/
-rsync --quiet node_modules/leaflet/dist/images/* dist/assets/css/images/
+rsync --quiet node_modules/leaflet/dist/leaflet.css    dist/assets/css/
+rsync --quiet node_modules/leaflet/dist/images/*       dist/assets/css/images/
 
-rsync --quiet node_modules/leaflet-minimap/dist/Control.MiniMap.min.js dist/assets/js/
+rsync --quiet node_modules/leaflet-minimap/dist/Control.MiniMap.min.js  dist/assets/js/
 rsync --quiet node_modules/leaflet-minimap/dist/Control.MiniMap.min.css dist/assets/css/
-rsync --quiet node_modules/leaflet-minimap/dist/images/* dist/assets/css/images/
+rsync --quiet node_modules/leaflet-minimap/dist/images/*                dist/assets/css/images/
 
 rsync --quiet node_modules/bootstrap/dist/js/bootstrap.bundle.min.js* dist/assets/js/
-rsync --quiet node_modules/bootstrap/dist/css/bootstrap.min.css dist/assets/css/
+rsync --quiet node_modules/bootstrap/dist/css/bootstrap.min.css       dist/assets/css/
 
 rsync --quiet node_modules/handlebars/dist/handlebars.min.js dist/assets/js/
-rsync --quiet node_modules/@ungap/url-search-params/min.js dist/assets/js/url-search-params.js
-rsync --quiet src/templates/*.hbs dist/
+rsync --quiet node_modules/@ungap/url-search-params/min.js   dist/assets/js/url-search-params.js
 
 rsync --quiet src/*.js dist/
 
 
 {
-  sed -e 's/BODYID/search-page/' src/layout.html | grep -v '</body>' | grep -v '</html>'
+  cat src/layout.html | grep -v '</body>' | grep -v '</html>'
   echo '<script id="searchpage-template" type="text/x-handlebars-template">'
   cat src/templates/searchpage.hbs
   echo '</script>'
-  echo '</body>'
-  echo '</html>'
-} > dist/search.html
 
-{
-  sed -e 's/BODYID/reverse-page/' src/layout.html | grep -v '</body>' | grep -v '</html>'
   echo '<script id="reversepage-template" type="text/x-handlebars-template">'
   cat src/templates/reversepage.hbs
   echo '</script>'
-  echo '</body>'
-  echo '</html>'
-} > dist/reverse.html
 
-{
-  sed -e 's/BODYID/details-page/' src/layout.html | grep -v '</body>' | grep -v '</html>'
   echo '<script id="detailspage-template" type="text/x-handlebars-template">'
   cat src/templates/detailspage.hbs
   echo '</script>'
+
   echo '<script id="detailspage-index-template" type="text/x-handlebars-template">'
   cat src/templates/detailspage-index.hbs
   echo '</script>'
-  echo '</body>'
-  echo '</html>'
-} > dist/details.html
 
-{
-  sed -e 's/BODYID/deletable-page/' src/layout.html | grep -v '</body>' | grep -v '</html>'
   echo '<script id="deletable-template" type="text/x-handlebars-template">'
   cat src/templates/deletable.hbs
   echo '</script>'
-  echo '</body>'
-  echo '</html>'
-} > dist/deletable.html
 
-{
-  sed -e 's/BODYID/polygons-page/' src/layout.html | grep -v '</body>' | grep -v '</html>'
   echo '<script id="polygons-template" type="text/x-handlebars-template">'
   cat src/templates/polygons.hbs
   echo '</script>'
+
   echo '</body>'
   echo '</html>'
-} > dist/polygons.html
+} > dist/search.html
+
+cp dist/search.html dist/reverse.html
+cp dist/search.html dist/details.html
+cp dist/search.html dist/deletable.html
+cp dist/search.html dist/polygons.html
 
 cp src/index.html dist/
index 5eabed97a78255b58dc03463e8508efb1b30fe81..ab814d77ed45f6b908718319bc327b807bebf63f 100755 (executable)
@@ -50,6 +50,17 @@ footer p {
   margin: 1em;
 }
 
+#loading {
+  display: none;
+  position: absolute;
+  top: 0;
+  width: 100%;
+  background-color: #eee;
+  z-index: 100;
+  padding: 10px;
+  text-align: center;
+}
+
 #error-overlay {
   text-align: center;
   font-style: italic;
index 9fff0c70342ea8431bf01def36f56e78de95ac65..faf69020270b48925a0486b16a86e55ac00239da 100644 (file)
@@ -131,16 +131,19 @@ function hide_error() {
 }
 
 
-$(document).ajaxError(function (event, jqXHR, ajaxSettings/* , thrownError */) {
-  // console.log(thrownError);
-  // console.log(ajaxSettings);
-  var url = ajaxSettings.url;
-  show_error('Error fetching results from <a href="' + url + '">' + url + '</a>');
-});
-
-
 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 <a href="' + url + '">' + url + '</a>');
+  });
 });
 // *********************************************************
 // DETAILS PAGE
@@ -198,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');
@@ -255,7 +257,7 @@ jQuery(document).ready(function () {
       alert('invalid input');
     }
   });
-});
+}
 
 // *********************************************************
 // FORWARD/REVERSE SEARCH PAGE
@@ -550,12 +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);
 
@@ -710,13 +709,14 @@ jQuery(document).ready(function () {
       );
     }
   }
-});
+}
+
+
 // *********************************************************
 // DELETABLE PAGE
 // *********************************************************
 
-jQuery(document).ready(function () {
-  if (!$('#deletable-page').length) { return; }
+function deletable_page_load() {
 
   var api_request_params = {
     format: 'json'
@@ -730,14 +730,13 @@ jQuery(document).ready(function () {
 
     update_data_date();
   });
-});
+}
 // *********************************************************
 // BROKEN POLYGON PAGE
 // *********************************************************
 
-jQuery(document).ready(function () {
-  if (!$('#polygons-page').length) { return; }
-
+function polygons_page_load() {
+  //
   var api_request_params = {
     format: 'json'
   };
@@ -750,4 +749,54 @@ jQuery(document).ready(function () {
 
     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();
+    }
+  }
+
+  parse_url_and_load_page();
+
+  // load page after form submit
+  $(document).on('submit', 'form', function (e) {
+    e.preventDefault();
+
+    window.history.pushState(myhistory, '', '?' + $(this).serialize());
+
+    parse_url_and_load_page();
+  });
+
+  // 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;
+
+    e.preventDefault();
+
+    window.history.pushState(myhistory, '', target_url);
+
+    parse_url_and_load_page();
+  });
+
+  // deal with back-button and other user action
+  window.onpopstate = function () {
+    parse_url_and_load_page();
+  };
 });
+
diff --git a/dist/deletable.hbs b/dist/deletable.hbs
deleted file mode 100644 (file)
index 35ab9e0..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-<div class="container">
-  <div class="row">
-    <div class="col-sm-12">
-      <h1>Deletable</h1>
-
-      <p>
-          {{aPolygons.length}} objects have been deleted in OSM but are still in the Nominatim database.
-      </p>
-
-      <table class="table table-striped table-hover">
-        <thead>
-          <th>Place id</th>
-          <th>Country Code</th>
-          <th>Name</th>
-          <th>OSM id</th>
-          <th>OSM type</th>
-          <th>Class</th>
-          <th>Type</th>
-        </thead>
-        <tbody>
-          {{#each aPolygons}}
-          <tr>
-            <td>{{detailsLink this place_id}}</td>
-            <td>{{country_code}}</td>
-            <td>{{name}}</td>
-            <td>{{osmLink this}}</td>
-            <td>{{osm_type}}</td>
-            <td>{{class}}</td>
-            <td>{{type}}</td>
-          </tr>
-          {{/each}}
-        </tbody>
-      </table>
-
-
-    </div>
-  </div>
-</div
-
index 21fa0494e0d87573d8278281218bcf8672254fee..aba9dbb15ecaabfbd03885192d59b2a64e444976 100644 (file)
   <link href="assets/css/search.css" rel="stylesheet" type="text/css" />
   <link href="assets/css/details.css" rel="stylesheet" type="text/css" />
 </head>
-<body id="deletable-page">
+<body id="BODYID">
 
-  <div id="error-overlay">
-    You need Javascript enabled to view this page.
-  </div>
+  <div id="error-overlay"></div>
 
   <header class="container-fluid">
     <div class="row">
@@ -32,6 +30,7 @@
         </div>
       </div>
       <div id="last-updated" class="col-4 text-center">
+        <div id="loading">loading...</div>
         Data from <a id="api-request-link" href="">API request</a>
         <br>
         Data last updated:
   <script src="handlebar_helpers.js"></script>
 
   <script src="assets/js/nominatim-ui.js"></script>
+<script id="searchpage-template" type="text/x-handlebars-template">
+{{#*inline "partial_one_result"}}
+  <div class="result" data-position="{{iResNum}}">
+    {{formatMapIcon aResult}}
+
+    <span class="name">{{aResult.display_name}}</span>
+    <span class="type">({{formatLabel aResult}})</span>
+    <p class="coords">{{aResult.lat}},{{aResult.lon}}</p>  
+
+    <a class="details btn btn-outline-secondary btn-sm"
+       href="details.html?osmtype={{shortOSMType aResult.osm_type}}&osmid={{aResult.osm_id}}">details</a>
+  </div>
+{{/inline}}
+
+<div class="top-bar">
+  <ul class="nav nav-tabs">
+    <li class="nav-item">
+      <a class="nav-link {{#unless hStructured}}active{{/unless}}" data-toggle="tab" href="#simple">simple</a>
+    </li>
+    <li class="nav-item">
+      <a class="nav-link {{#if hStructured}}active{{/if}}" data-toggle="tab" href="#structured">structured</a>
+    </li>
+    <div class="search-type-link">
+      <a id="switch-to-reverse" href="/reverse.html">reverse search</a>
+    </div>
+  </ul>
+  <div class="tab-content p-2">
+    <div class="tab-pane {{#unless hStructured}}active{{/unless}}" id="simple" role="tabpanel">
+      <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+        <input id="q"
+               name="q"
+               type="text"
+               class="form-control form-control-sm"
+               placeholder="Search"
+               value="{{sQuery}}" />
+
+        <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>
+        </div>
+      </form>
+    </div>
+    <div class="tab-pane {{#if hStructured}}active{{/if}}" id="structured" role="tabpanel">
+      <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+        <input name="street" type="text" class="form-control form-control-sm mr-1"
+               placeholder="House number/Street"
+               value="{{hStructured.street}}" />
+        <input name="city" type="text" class="form-control form-control-sm mr-1"
+               placeholder="City"
+               value="{{hStructured.city}}" />
+        <input id="county" name="county" type="text" class="form-control form-control-sm mr-1"
+               placeholder="County"
+               value="{{hStructured.county}}" />
+        <input name="state" type="text" class="form-control form-control-sm mr-1"
+               placeholder="State"
+               value="{{hStructured.state}}" />
+        <input name="country" type="text" class="form-control form-control-sm mr-1"
+               placeholder="Country"
+               value="{{hStructured.country}}" />
+        <input name="postalcode" type="text" class="form-control form-control-sm mr-1"
+               placeholder="Postal Code"
+               value="{{hStructured.postalcode}}" />
+
+        <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>
+        </div>
+      </form>
+    </div>
+  </div> <!-- /tab-content -->
+</div> <!-- /top-bar -->
+
+<div id="content">
+
+  {{#if sQuery}}
+    <div id="searchresults" class="sidebar">
+      {{#each aSearchResults as |aResult|}}
+        {{>partial_one_result iResNum=@index aResult=aResult env=env}}
+      {{/each}}
+
+      {{#if aSearchResults}}
+        {{#if sMoreURL}}
+          <div class="more">
+            <a class="btn btn-primary" href="{{sMoreURL}}">
+              Search for more results
+            </a>
+          </div>
+        {{/if}}
+      {{else}}
+        <div class="noresults">No search results found</div>
+      {{/if}}
+    </div>
+
+  {{else}}
+
+    <div id="intro" class="sidebar">
+      <h2>Welcome to Nominatim</h2>
+
+      <p>
+        Nominatim is a search engine for
+        <a href="https://www.openstreetmap.org">OpenStreetMap</a> data. This
+        is the debugging interface. You may search for a name or address
+        (forward search) or look up data by its geographic coordinate (reverse
+        search). Each result comes with a link to a details page where you
+        can inspect what data about the object is saved in the database and
+        investigate how the address of the object has been computed.
+      </p>
+
+      For more information visit the
+      <a href="https://nominatim.org">Nominatim home page</a>.
+    </div>
+
+  {{/if}}
+
+  <div id="map-wrapper">
+    <div id="map-position">
+      <div id="map-position-inner"></div>
+      <div id="map-position-close"><a href="#">hide</a></div>
+    </div>
+    <div id="map"></div>
+  </div>
+</div>
+</script>
+<script id="reversepage-template" type="text/x-handlebars-template">
+
+{{#*inline "partial_one_result"}}
+  <div class="result" data-position="{{iResNum}}">
+    {{formatMapIcon aResult}}
+
+    <span class="name">{{aResult.display_name}}</span>
+    <span class="type">{{formatLabel aResult}}</span>
+    <p class="coords">{{aResult.lat}},{{aResult.lon}}</p>  
+
+    <a class="details btn btn-outline-secondary btn-sm"
+       href="details.html?osmtype={{shortOSMType aResult.osm_type}}&osmid={{aResult.osm_id}}">details</a>
+  </div>
+{{/inline}}
+
+<div class="top-bar">
+  <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+    <div class="form-group">
+      <input name="format" type="hidden" value="html">
+      <label>lat</label>
+      <input name="lat"
+             type="text"
+             class="form-control form-control-sm"
+             placeholder="latitude"
+             value="{{fLat}}" />
+      <a id="switch-coords" class="btn btn-outline-secondary btn-sm" title="switch lat and lon">&lt;&gt;</a>
+      <label>lon</label>
+      <input name="lon"
+             type="text"
+             class="form-control form-control-sm"
+             placeholder="longitude"
+             value="{{fLon}}" />
+      <label>max zoom</label>
+      <select name="zoom" class="form-control form-control-sm" value="{{iZoom}}">
+        {{zoomLevels iZoom}}
+      </select>
+      <button type="submit" class="btn btn-primary btn-sm mx-1">
+        Search
+      </button>
+    </div>
+    <div class="search-type-link">
+      <a href="/search.html">forward search</a>
+    </div>
+  </form>
+</div>
+
+<div id="content">
+  {{#if aPlace}}
+    <div id="searchresults" class="sidebar">
+      {{>partial_one_result iResNum=0 aResult=aPlace env=env}}
+    </div>
+  {{else}}
+    <div id="intro" class="sidebar">
+      Search for coordinates or click anywhere on the map.
+    </div>
+  {{/if}}
+
+  <div id="map-wrapper">
+    <div id="map-position">
+      <div id="map-position-inner"></div>
+      <div id="map-position-close"><a href="#">hide</a></div>
+    </div>
+    <div id="map"></div>
+  </div>
+</div>
+</script>
+<script id="detailspage-template" type="text/x-handlebars-template">
+
+{{#*inline "partial_details_one_row"}}
+  <tr class="{{#unless this.isaddress}}notused{{/unless}}">
+    <td class="name">
+      {{#if this.localname}}
+        {{this.localname}}
+      {{else}}
+        <span class="noname">No Name</span>
+      {{/if}}
+    </td>
+    <td>{{formatPlaceType this}}</td>
+    <td>{{osmLink this}}</td>
+    <td>{{this.rank_address}}</td>
+    <td>{{formatAdminLevel this.admin_level}}</td>
+    <td>{{formatDistance this.distance}}</td>
+    <td>{{detailsPermaLink this 'details >'}}</td>
+  </tr>
+{{/inline}}
+
+{{#*inline "partial_details_keyword_one_row"}}
+  <tr>
+    <td>{{formatKeywordToken this.token}}</td>
+    {{#if this.id}}
+      <td>word id: {{this.id}}</td>
+    {{/if}}
+  </tr>
+{{/inline}}
+
+
+{{#*inline "partial_h2"}}
+  <tr class="all-columns"><td colspan="6"><h2>{{this}}</h2></td></tr>
+{{/inline}}
+
+{{#*inline "partial_h3"}}
+  <tr class="all-columns"><td colspan="6"><h3>{{this}}</h3></td></tr>
+{{/inline}}
+
+<div class="container">
+  <div class="row">
+    <div class="col-sm-10">
+      <h1>
+        {{aPlace.localname}}
+        <small>{{detailsPermaLink aPlace 'link to this page'}}</small>
+      </h1>
+    </div>
+    <div class="col-sm-2 text-right">
+      {{formatMapIcon aPlace}}
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-6">
+      <table id="locationdetails" class="table table-striped">
+        <tr>
+          <td>Name</td>
+          <td>
+            {{#each aPlace.names}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+        <tr>
+          <td>Type</td>
+          <td>{{aPlace.category}}:{{aPlace.type}}</td>
+        </tr>
+        <tr>
+          <td>Last Updated</td>
+          <td>{{aPlace.indexed_date}}</td>
+        </tr>
+        <tr>
+          <td>Admin Level</td>
+          <td>{{aPlace.admin_level}}</td>
+        </tr>
+        <tr>
+          <td>Rank</td>
+          <td>{{formatSearchRank aPlace.rank_search}}</td>
+        </tr>
+        {{#if aPlace.calculated_importance}}
+          <tr>
+            <td>Importance</td>
+            <td>
+              {{aPlace.calculated_importance}}
+              {{#unless aPlace.importance}} (estimated){{/unless}}
+            </td>
+          </tr>
+        {{/if}}
+        <tr>
+          <td>Coverage</td>
+          <td>{{coverageType aPlace}}</td>
+        </tr>
+        <tr>
+          <td>Centre Point (lat,lon)</td>
+          <td>
+            {{aPlace.centroid.coordinates.[1]}},{{aPlace.centroid.coordinates.[0]}}
+          </td>
+        </tr>
+        <tr>
+          <td>OSM</td>
+          <td>{{osmLink aPlace}}
+        </tr>
+        <tr>
+          <td>
+            Place Id
+            (<a href="https://nominatim.org/release-docs/develop/api/Output/#place_id-is-not-a-persistent-id">on this server</a>)
+          </td>
+          <td>{{aPlace.place_id}}</td>
+        </tr>
+        {{#if aPlace.calculated_wikipedia}}
+          <tr>
+            <td>Wikipedia Calculated</td>
+            <td>{{wikipediaLink aPlace}}</td>
+          </tr>
+        {{/if}}
+        <tr>
+          <td>Computed Postcode</td>
+          <td>{{aPlace.calculated_postcode}}</td>
+        </tr>
+        <tr>
+          <td>Address Tags</td>
+          <td>
+            {{#each aPlace.addresstags}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+        <tr>
+          <td>Extra Tags</td>
+          <td>
+            {{#each aPlace.extratags}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+      </table>
+    </div>
+    <div class="col-md-6">
+      <div id="map"></div>
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-12">
+      <h2>Address</h2>
+       <table id="address" class="table table-striped table-small">
+        <thead>
+          <tr>
+            <th>Local name</th>
+            <th>Type</th>
+            <th>OSM</th>
+            <th>Address rank</th>
+            <th>Admin level</th>
+            <th>Distance</th>
+            <th></th>
+          </tr>
+        </thead>
+        <tbody>
+          {{#if aPlace.address}}
+            {{#each aPlace.address}}
+              {{> partial_details_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{#if aPlace.linked_places}}
+            {{> partial_h2 'Linked Places'}}
+            {{#each aPlace.linked_places}}
+              {{> partial_details_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{#if aPlace.keywords}}
+            {{> partial_h2 'Name Keywords'}}
+            {{#each aPlace.keywords.name}}
+              {{> partial_details_keyword_one_row}}
+            {{/each}}
+
+            {{> partial_h2 'Address Keywords'}}
+            {{#each aPlace.keywords.address}}
+              {{> partial_details_keyword_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{> partial_h2 'Parent Of'}}
+          {{#if aPlace.hierarchy}}
+
+            {{#each aPlace.hierarchy as |lines type|}}
+              {{> partial_h3 type}}
+              {{#each lines}}
+                {{> partial_details_one_row}}
+              {{/each}}
+            {{/each}}
+          {{else}}
+            <tr>
+              <td>
+                <a class="btn btn-outline-secondary btn-sm"
+                  href="{{base_url}}&hierarchy=1">display child places</a>
+              </td>
+            </tr>
+          {{/if}}
+          {{tooManyHierarchyLinesWarning aPlace}}
+        </tbody>
+      </table>
+    </div>
+  </div>
+</div>
+
+</script>
+<script id="detailspage-index-template" type="text/x-handlebars-template">
+<div class="container" id="details-index-page">
+  <div class="row">
+    <div class="col-md-12">
+
+      <h1>Show details for place</h1>
+
+      <div class="search-form">
+        <h4>Search by place id</h4>
+
+        <form class="form-inline" action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern="^[0-9]+$"
+                 name="place_id"
+                 placeholder="12345" />
+          <input type="submit"
+                 class="btn btn-primary btn-sm"
+                 value="Show" />
+        </form>
+      </div>
+
+      <div class="search-form">
+        <h4>Search by OSM type and OSM id</h4>
+
+        <form id="form-by-type-and-id"
+              class="form-inline"
+              action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern="^[NWR][0-9]+$"
+                 placeholder="N123 or W123 or R123" />
+          <input type="hidden" name="osmtype" />
+          <input type="hidden" name="osmid" />
+          <input type="submit" class="btn btn-primary btn-sm" value="Show" />
+        </form>
+      </div>
+
+      <div class="search-form">
+        <h4>Search by openstreetmap.org URL</h4>
+
+        <form id="form-by-osm-url"
+              class="form-inline"
+              action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern=".*openstreetmap.*"
+                 placeholder="https://www.openstreetmap.org/relation/123" />
+          <input type="hidden" name="osmtype" />
+          <input type="hidden" name="osmid" />
+          <input type="submit" class="btn btn-primary btn-sm" value="Show" />
+        </form>
+      </div>
+
+    </div>
+  </div>
+</div></script>
 <script id="deletable-template" type="text/x-handlebars-template">
 <div class="container">
   <div class="row">
   </div>
 </div
 
+</script>
+<script id="polygons-template" type="text/x-handlebars-template">
+<div class="container">
+  <div class="row">
+    <div class="col-sm-12">
+      <h1>Broken polygons</h1>
+
+      <p>
+          Total number of broken polygons: {{aPolygons.length}}.
+      </p>
+
+      <table class="table table-striped table-hover">
+        <thead>
+          <th>OSM type</th>
+          <th>OSM id</th>
+          <th>Class</th>
+          <th>Type</th>
+          <th>Name</th>
+          <th>Country Code</th>
+          <th>Error message</th>
+          <th>Updated</th>
+          <th>&nbsp;</th>
+        </thead>
+        <tbody>
+          {{#each aPolygons}}
+          <tr>
+            <td>{{osm_type}}</td>
+            <td>{{osmLink this}}</td>
+            <td>{{class}}</td>
+            <td>{{type}}</td>
+            <td>{{name}}</td>
+            <td>{{country_code}}</td>
+            <td>{{errormessage}}</td>
+            <td>{{updated}}</td>
+            <td>
+              <a href="http://localhost:8111/import?url=https://www.openstreetmap.org/api/0.6/{{formatOSMType osm_type}}/{{osm_id}}/full" target="josm">josm</a>
+            </td>
+          </tr>
+          {{/each}}
+        </tbody>
+      </table>
+
+
+    </div>
+  </div>
+</div
+
 </script>
 </body>
 </html>
index 3d0c57e043776ecaf1fd4fc74d34c3832c914f60..aba9dbb15ecaabfbd03885192d59b2a64e444976 100644 (file)
   <link href="assets/css/search.css" rel="stylesheet" type="text/css" />
   <link href="assets/css/details.css" rel="stylesheet" type="text/css" />
 </head>
-<body id="details-page">
+<body id="BODYID">
 
-  <div id="error-overlay">
-    You need Javascript enabled to view this page.
-  </div>
+  <div id="error-overlay"></div>
 
   <header class="container-fluid">
     <div class="row">
@@ -32,6 +30,7 @@
         </div>
       </div>
       <div id="last-updated" class="col-4 text-center">
+        <div id="loading">loading...</div>
         Data from <a id="api-request-link" href="">API request</a>
         <br>
         Data last updated:
   <script src="handlebar_helpers.js"></script>
 
   <script src="assets/js/nominatim-ui.js"></script>
+<script id="searchpage-template" type="text/x-handlebars-template">
+{{#*inline "partial_one_result"}}
+  <div class="result" data-position="{{iResNum}}">
+    {{formatMapIcon aResult}}
+
+    <span class="name">{{aResult.display_name}}</span>
+    <span class="type">({{formatLabel aResult}})</span>
+    <p class="coords">{{aResult.lat}},{{aResult.lon}}</p>  
+
+    <a class="details btn btn-outline-secondary btn-sm"
+       href="details.html?osmtype={{shortOSMType aResult.osm_type}}&osmid={{aResult.osm_id}}">details</a>
+  </div>
+{{/inline}}
+
+<div class="top-bar">
+  <ul class="nav nav-tabs">
+    <li class="nav-item">
+      <a class="nav-link {{#unless hStructured}}active{{/unless}}" data-toggle="tab" href="#simple">simple</a>
+    </li>
+    <li class="nav-item">
+      <a class="nav-link {{#if hStructured}}active{{/if}}" data-toggle="tab" href="#structured">structured</a>
+    </li>
+    <div class="search-type-link">
+      <a id="switch-to-reverse" href="/reverse.html">reverse search</a>
+    </div>
+  </ul>
+  <div class="tab-content p-2">
+    <div class="tab-pane {{#unless hStructured}}active{{/unless}}" id="simple" role="tabpanel">
+      <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+        <input id="q"
+               name="q"
+               type="text"
+               class="form-control form-control-sm"
+               placeholder="Search"
+               value="{{sQuery}}" />
+
+        <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>
+        </div>
+      </form>
+    </div>
+    <div class="tab-pane {{#if hStructured}}active{{/if}}" id="structured" role="tabpanel">
+      <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+        <input name="street" type="text" class="form-control form-control-sm mr-1"
+               placeholder="House number/Street"
+               value="{{hStructured.street}}" />
+        <input name="city" type="text" class="form-control form-control-sm mr-1"
+               placeholder="City"
+               value="{{hStructured.city}}" />
+        <input id="county" name="county" type="text" class="form-control form-control-sm mr-1"
+               placeholder="County"
+               value="{{hStructured.county}}" />
+        <input name="state" type="text" class="form-control form-control-sm mr-1"
+               placeholder="State"
+               value="{{hStructured.state}}" />
+        <input name="country" type="text" class="form-control form-control-sm mr-1"
+               placeholder="Country"
+               value="{{hStructured.country}}" />
+        <input name="postalcode" type="text" class="form-control form-control-sm mr-1"
+               placeholder="Postal Code"
+               value="{{hStructured.postalcode}}" />
+
+        <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>
+        </div>
+      </form>
+    </div>
+  </div> <!-- /tab-content -->
+</div> <!-- /top-bar -->
+
+<div id="content">
+
+  {{#if sQuery}}
+    <div id="searchresults" class="sidebar">
+      {{#each aSearchResults as |aResult|}}
+        {{>partial_one_result iResNum=@index aResult=aResult env=env}}
+      {{/each}}
+
+      {{#if aSearchResults}}
+        {{#if sMoreURL}}
+          <div class="more">
+            <a class="btn btn-primary" href="{{sMoreURL}}">
+              Search for more results
+            </a>
+          </div>
+        {{/if}}
+      {{else}}
+        <div class="noresults">No search results found</div>
+      {{/if}}
+    </div>
+
+  {{else}}
+
+    <div id="intro" class="sidebar">
+      <h2>Welcome to Nominatim</h2>
+
+      <p>
+        Nominatim is a search engine for
+        <a href="https://www.openstreetmap.org">OpenStreetMap</a> data. This
+        is the debugging interface. You may search for a name or address
+        (forward search) or look up data by its geographic coordinate (reverse
+        search). Each result comes with a link to a details page where you
+        can inspect what data about the object is saved in the database and
+        investigate how the address of the object has been computed.
+      </p>
+
+      For more information visit the
+      <a href="https://nominatim.org">Nominatim home page</a>.
+    </div>
+
+  {{/if}}
+
+  <div id="map-wrapper">
+    <div id="map-position">
+      <div id="map-position-inner"></div>
+      <div id="map-position-close"><a href="#">hide</a></div>
+    </div>
+    <div id="map"></div>
+  </div>
+</div>
+</script>
+<script id="reversepage-template" type="text/x-handlebars-template">
+
+{{#*inline "partial_one_result"}}
+  <div class="result" data-position="{{iResNum}}">
+    {{formatMapIcon aResult}}
+
+    <span class="name">{{aResult.display_name}}</span>
+    <span class="type">{{formatLabel aResult}}</span>
+    <p class="coords">{{aResult.lat}},{{aResult.lon}}</p>  
+
+    <a class="details btn btn-outline-secondary btn-sm"
+       href="details.html?osmtype={{shortOSMType aResult.osm_type}}&osmid={{aResult.osm_id}}">details</a>
+  </div>
+{{/inline}}
+
+<div class="top-bar">
+  <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+    <div class="form-group">
+      <input name="format" type="hidden" value="html">
+      <label>lat</label>
+      <input name="lat"
+             type="text"
+             class="form-control form-control-sm"
+             placeholder="latitude"
+             value="{{fLat}}" />
+      <a id="switch-coords" class="btn btn-outline-secondary btn-sm" title="switch lat and lon">&lt;&gt;</a>
+      <label>lon</label>
+      <input name="lon"
+             type="text"
+             class="form-control form-control-sm"
+             placeholder="longitude"
+             value="{{fLon}}" />
+      <label>max zoom</label>
+      <select name="zoom" class="form-control form-control-sm" value="{{iZoom}}">
+        {{zoomLevels iZoom}}
+      </select>
+      <button type="submit" class="btn btn-primary btn-sm mx-1">
+        Search
+      </button>
+    </div>
+    <div class="search-type-link">
+      <a href="/search.html">forward search</a>
+    </div>
+  </form>
+</div>
+
+<div id="content">
+  {{#if aPlace}}
+    <div id="searchresults" class="sidebar">
+      {{>partial_one_result iResNum=0 aResult=aPlace env=env}}
+    </div>
+  {{else}}
+    <div id="intro" class="sidebar">
+      Search for coordinates or click anywhere on the map.
+    </div>
+  {{/if}}
+
+  <div id="map-wrapper">
+    <div id="map-position">
+      <div id="map-position-inner"></div>
+      <div id="map-position-close"><a href="#">hide</a></div>
+    </div>
+    <div id="map"></div>
+  </div>
+</div>
+</script>
 <script id="detailspage-template" type="text/x-handlebars-template">
 
 {{#*inline "partial_details_one_row"}}
     </div>
   </div>
 </div></script>
+<script id="deletable-template" type="text/x-handlebars-template">
+<div class="container">
+  <div class="row">
+    <div class="col-sm-12">
+      <h1>Deletable</h1>
+
+      <p>
+          {{aPolygons.length}} objects have been deleted in OSM but are still in the Nominatim database.
+      </p>
+
+      <table class="table table-striped table-hover">
+        <thead>
+          <th>Place id</th>
+          <th>Country Code</th>
+          <th>Name</th>
+          <th>OSM id</th>
+          <th>OSM type</th>
+          <th>Class</th>
+          <th>Type</th>
+        </thead>
+        <tbody>
+          {{#each aPolygons}}
+          <tr>
+            <td>{{detailsLink this place_id}}</td>
+            <td>{{country_code}}</td>
+            <td>{{name}}</td>
+            <td>{{osmLink this}}</td>
+            <td>{{osm_type}}</td>
+            <td>{{class}}</td>
+            <td>{{type}}</td>
+          </tr>
+          {{/each}}
+        </tbody>
+      </table>
+
+
+    </div>
+  </div>
+</div
+
+</script>
+<script id="polygons-template" type="text/x-handlebars-template">
+<div class="container">
+  <div class="row">
+    <div class="col-sm-12">
+      <h1>Broken polygons</h1>
+
+      <p>
+          Total number of broken polygons: {{aPolygons.length}}.
+      </p>
+
+      <table class="table table-striped table-hover">
+        <thead>
+          <th>OSM type</th>
+          <th>OSM id</th>
+          <th>Class</th>
+          <th>Type</th>
+          <th>Name</th>
+          <th>Country Code</th>
+          <th>Error message</th>
+          <th>Updated</th>
+          <th>&nbsp;</th>
+        </thead>
+        <tbody>
+          {{#each aPolygons}}
+          <tr>
+            <td>{{osm_type}}</td>
+            <td>{{osmLink this}}</td>
+            <td>{{class}}</td>
+            <td>{{type}}</td>
+            <td>{{name}}</td>
+            <td>{{country_code}}</td>
+            <td>{{errormessage}}</td>
+            <td>{{updated}}</td>
+            <td>
+              <a href="http://localhost:8111/import?url=https://www.openstreetmap.org/api/0.6/{{formatOSMType osm_type}}/{{osm_id}}/full" target="josm">josm</a>
+            </td>
+          </tr>
+          {{/each}}
+        </tbody>
+      </table>
+
+
+    </div>
+  </div>
+</div
+
+</script>
 </body>
 </html>
diff --git a/dist/detailspage-index.hbs b/dist/detailspage-index.hbs
deleted file mode 100644 (file)
index c81d525..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-<div class="container" id="details-index-page">
-  <div class="row">
-    <div class="col-md-12">
-
-      <h1>Show details for place</h1>
-
-      <div class="search-form">
-        <h4>Search by place id</h4>
-
-        <form class="form-inline" action="details.html">
-          <input type="edit"
-                 class="form-control input-sm"
-                 pattern="^[0-9]+$"
-                 name="place_id"
-                 placeholder="12345" />
-          <input type="submit"
-                 class="btn btn-primary btn-sm"
-                 value="Show" />
-        </form>
-      </div>
-
-      <div class="search-form">
-        <h4>Search by OSM type and OSM id</h4>
-
-        <form id="form-by-type-and-id"
-              class="form-inline"
-              action="details.html">
-          <input type="edit"
-                 class="form-control input-sm"
-                 pattern="^[NWR][0-9]+$"
-                 placeholder="N123 or W123 or R123" />
-          <input type="hidden" name="osmtype" />
-          <input type="hidden" name="osmid" />
-          <input type="submit" class="btn btn-primary btn-sm" value="Show" />
-        </form>
-      </div>
-
-      <div class="search-form">
-        <h4>Search by openstreetmap.org URL</h4>
-
-        <form id="form-by-osm-url"
-              class="form-inline"
-              action="details.html">
-          <input type="edit"
-                 class="form-control input-sm"
-                 pattern=".*openstreetmap.*"
-                 placeholder="https://www.openstreetmap.org/relation/123" />
-          <input type="hidden" name="osmtype" />
-          <input type="hidden" name="osmid" />
-          <input type="submit" class="btn btn-primary btn-sm" value="Show" />
-        </form>
-      </div>
-
-    </div>
-  </div>
-</div>
\ No newline at end of file
diff --git a/dist/detailspage.hbs b/dist/detailspage.hbs
deleted file mode 100644 (file)
index 48ecde9..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-
-{{#*inline "partial_details_one_row"}}
-  <tr class="{{#unless this.isaddress}}notused{{/unless}}">
-    <td class="name">
-      {{#if this.localname}}
-        {{this.localname}}
-      {{else}}
-        <span class="noname">No Name</span>
-      {{/if}}
-    </td>
-    <td>{{formatPlaceType this}}</td>
-    <td>{{osmLink this}}</td>
-    <td>{{this.rank_address}}</td>
-    <td>{{formatAdminLevel this.admin_level}}</td>
-    <td>{{formatDistance this.distance}}</td>
-    <td>{{detailsPermaLink this 'details >'}}</td>
-  </tr>
-{{/inline}}
-
-{{#*inline "partial_details_keyword_one_row"}}
-  <tr>
-    <td>{{formatKeywordToken this.token}}</td>
-    {{#if this.id}}
-      <td>word id: {{this.id}}</td>
-    {{/if}}
-  </tr>
-{{/inline}}
-
-
-{{#*inline "partial_h2"}}
-  <tr class="all-columns"><td colspan="6"><h2>{{this}}</h2></td></tr>
-{{/inline}}
-
-{{#*inline "partial_h3"}}
-  <tr class="all-columns"><td colspan="6"><h3>{{this}}</h3></td></tr>
-{{/inline}}
-
-<div class="container">
-  <div class="row">
-    <div class="col-sm-10">
-      <h1>
-        {{aPlace.localname}}
-        <small>{{detailsPermaLink aPlace 'link to this page'}}</small>
-      </h1>
-    </div>
-    <div class="col-sm-2 text-right">
-      {{formatMapIcon aPlace}}
-    </div>
-  </div>
-  <div class="row">
-    <div class="col-md-6">
-      <table id="locationdetails" class="table table-striped">
-        <tr>
-          <td>Name</td>
-          <td>
-            {{#each aPlace.names}}
-              <div class="line">
-                <span class="name">{{this}}</span> ({{@key}})
-              </div>
-            {{/each}}
-          </td>
-        </tr>
-        <tr>
-          <td>Type</td>
-          <td>{{aPlace.category}}:{{aPlace.type}}</td>
-        </tr>
-        <tr>
-          <td>Last Updated</td>
-          <td>{{aPlace.indexed_date}}</td>
-        </tr>
-        <tr>
-          <td>Admin Level</td>
-          <td>{{aPlace.admin_level}}</td>
-        </tr>
-        <tr>
-          <td>Rank</td>
-          <td>{{formatSearchRank aPlace.rank_search}}</td>
-        </tr>
-        {{#if aPlace.calculated_importance}}
-          <tr>
-            <td>Importance</td>
-            <td>
-              {{aPlace.calculated_importance}}
-              {{#unless aPlace.importance}} (estimated){{/unless}}
-            </td>
-          </tr>
-        {{/if}}
-        <tr>
-          <td>Coverage</td>
-          <td>{{coverageType aPlace}}</td>
-        </tr>
-        <tr>
-          <td>Centre Point (lat,lon)</td>
-          <td>
-            {{aPlace.centroid.coordinates.[1]}},{{aPlace.centroid.coordinates.[0]}}
-          </td>
-        </tr>
-        <tr>
-          <td>OSM</td>
-          <td>{{osmLink aPlace}}
-        </tr>
-        <tr>
-          <td>
-            Place Id
-            (<a href="https://nominatim.org/release-docs/develop/api/Output/#place_id-is-not-a-persistent-id">on this server</a>)
-          </td>
-          <td>{{aPlace.place_id}}</td>
-        </tr>
-        {{#if aPlace.calculated_wikipedia}}
-          <tr>
-            <td>Wikipedia Calculated</td>
-            <td>{{wikipediaLink aPlace}}</td>
-          </tr>
-        {{/if}}
-        <tr>
-          <td>Computed Postcode</td>
-          <td>{{aPlace.calculated_postcode}}</td>
-        </tr>
-        <tr>
-          <td>Address Tags</td>
-          <td>
-            {{#each aPlace.addresstags}}
-              <div class="line">
-                <span class="name">{{this}}</span> ({{@key}})
-              </div>
-            {{/each}}
-          </td>
-        </tr>
-        <tr>
-          <td>Extra Tags</td>
-          <td>
-            {{#each aPlace.extratags}}
-              <div class="line">
-                <span class="name">{{this}}</span> ({{@key}})
-              </div>
-            {{/each}}
-          </td>
-        </tr>
-      </table>
-    </div>
-    <div class="col-md-6">
-      <div id="map"></div>
-    </div>
-  </div>
-  <div class="row">
-    <div class="col-md-12">
-      <h2>Address</h2>
-       <table id="address" class="table table-striped table-small">
-        <thead>
-          <tr>
-            <th>Local name</th>
-            <th>Type</th>
-            <th>OSM</th>
-            <th>Address rank</th>
-            <th>Admin level</th>
-            <th>Distance</th>
-            <th></th>
-          </tr>
-        </thead>
-        <tbody>
-          {{#if aPlace.address}}
-            {{#each aPlace.address}}
-              {{> partial_details_one_row}}
-            {{/each}}
-          {{/if}}
-
-          {{#if aPlace.linked_places}}
-            {{> partial_h2 'Linked Places'}}
-            {{#each aPlace.linked_places}}
-              {{> partial_details_one_row}}
-            {{/each}}
-          {{/if}}
-
-          {{#if aPlace.keywords}}
-            {{> partial_h2 'Name Keywords'}}
-            {{#each aPlace.keywords.name}}
-              {{> partial_details_keyword_one_row}}
-            {{/each}}
-
-            {{> partial_h2 'Address Keywords'}}
-            {{#each aPlace.keywords.address}}
-              {{> partial_details_keyword_one_row}}
-            {{/each}}
-          {{/if}}
-
-          {{> partial_h2 'Parent Of'}}
-          {{#if aPlace.hierarchy}}
-
-            {{#each aPlace.hierarchy as |lines type|}}
-              {{> partial_h3 type}}
-              {{#each lines}}
-                {{> partial_details_one_row}}
-              {{/each}}
-            {{/each}}
-          {{else}}
-            <tr>
-              <td>
-                <a class="btn btn-outline-secondary btn-sm"
-                  href="{{base_url}}&hierarchy=1">display child places</a>
-              </td>
-            </tr>
-          {{/if}}
-          {{tooManyHierarchyLinesWarning aPlace}}
-        </tbody>
-      </table>
-    </div>
-  </div>
-</div>
-
diff --git a/dist/polygons.hbs b/dist/polygons.hbs
deleted file mode 100644 (file)
index 9e74ef6..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<div class="container">
-  <div class="row">
-    <div class="col-sm-12">
-      <h1>Broken polygons</h1>
-
-      <p>
-          Total number of broken polygons: {{aPolygons.length}}.
-      </p>
-
-      <table class="table table-striped table-hover">
-        <thead>
-          <th>OSM type</th>
-          <th>OSM id</th>
-          <th>Class</th>
-          <th>Type</th>
-          <th>Name</th>
-          <th>Country Code</th>
-          <th>Error message</th>
-          <th>Updated</th>
-          <th>&nbsp;</th>
-        </thead>
-        <tbody>
-          {{#each aPolygons}}
-          <tr>
-            <td>{{osm_type}}</td>
-            <td>{{osmLink this}}</td>
-            <td>{{class}}</td>
-            <td>{{type}}</td>
-            <td>{{name}}</td>
-            <td>{{country_code}}</td>
-            <td>{{errormessage}}</td>
-            <td>{{updated}}</td>
-            <td>
-              <a href="http://localhost:8111/import?url=https://www.openstreetmap.org/api/0.6/{{formatOSMType osm_type}}/{{osm_id}}/full" target="josm">josm</a>
-            </td>
-          </tr>
-          {{/each}}
-        </tbody>
-      </table>
-
-
-    </div>
-  </div>
-</div
-
index 0a34f6f797fdef72aad57d2e24b5efd596bb729f..aba9dbb15ecaabfbd03885192d59b2a64e444976 100644 (file)
   <link href="assets/css/search.css" rel="stylesheet" type="text/css" />
   <link href="assets/css/details.css" rel="stylesheet" type="text/css" />
 </head>
-<body id="polygons-page">
+<body id="BODYID">
 
-  <div id="error-overlay">
-    You need Javascript enabled to view this page.
-  </div>
+  <div id="error-overlay"></div>
 
   <header class="container-fluid">
     <div class="row">
@@ -32,6 +30,7 @@
         </div>
       </div>
       <div id="last-updated" class="col-4 text-center">
+        <div id="loading">loading...</div>
         Data from <a id="api-request-link" href="">API request</a>
         <br>
         Data last updated:
   <script src="handlebar_helpers.js"></script>
 
   <script src="assets/js/nominatim-ui.js"></script>
+<script id="searchpage-template" type="text/x-handlebars-template">
+{{#*inline "partial_one_result"}}
+  <div class="result" data-position="{{iResNum}}">
+    {{formatMapIcon aResult}}
+
+    <span class="name">{{aResult.display_name}}</span>
+    <span class="type">({{formatLabel aResult}})</span>
+    <p class="coords">{{aResult.lat}},{{aResult.lon}}</p>  
+
+    <a class="details btn btn-outline-secondary btn-sm"
+       href="details.html?osmtype={{shortOSMType aResult.osm_type}}&osmid={{aResult.osm_id}}">details</a>
+  </div>
+{{/inline}}
+
+<div class="top-bar">
+  <ul class="nav nav-tabs">
+    <li class="nav-item">
+      <a class="nav-link {{#unless hStructured}}active{{/unless}}" data-toggle="tab" href="#simple">simple</a>
+    </li>
+    <li class="nav-item">
+      <a class="nav-link {{#if hStructured}}active{{/if}}" data-toggle="tab" href="#structured">structured</a>
+    </li>
+    <div class="search-type-link">
+      <a id="switch-to-reverse" href="/reverse.html">reverse search</a>
+    </div>
+  </ul>
+  <div class="tab-content p-2">
+    <div class="tab-pane {{#unless hStructured}}active{{/unless}}" id="simple" role="tabpanel">
+      <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+        <input id="q"
+               name="q"
+               type="text"
+               class="form-control form-control-sm"
+               placeholder="Search"
+               value="{{sQuery}}" />
+
+        <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>
+        </div>
+      </form>
+    </div>
+    <div class="tab-pane {{#if hStructured}}active{{/if}}" id="structured" role="tabpanel">
+      <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+        <input name="street" type="text" class="form-control form-control-sm mr-1"
+               placeholder="House number/Street"
+               value="{{hStructured.street}}" />
+        <input name="city" type="text" class="form-control form-control-sm mr-1"
+               placeholder="City"
+               value="{{hStructured.city}}" />
+        <input id="county" name="county" type="text" class="form-control form-control-sm mr-1"
+               placeholder="County"
+               value="{{hStructured.county}}" />
+        <input name="state" type="text" class="form-control form-control-sm mr-1"
+               placeholder="State"
+               value="{{hStructured.state}}" />
+        <input name="country" type="text" class="form-control form-control-sm mr-1"
+               placeholder="Country"
+               value="{{hStructured.country}}" />
+        <input name="postalcode" type="text" class="form-control form-control-sm mr-1"
+               placeholder="Postal Code"
+               value="{{hStructured.postalcode}}" />
+
+        <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>
+        </div>
+      </form>
+    </div>
+  </div> <!-- /tab-content -->
+</div> <!-- /top-bar -->
+
+<div id="content">
+
+  {{#if sQuery}}
+    <div id="searchresults" class="sidebar">
+      {{#each aSearchResults as |aResult|}}
+        {{>partial_one_result iResNum=@index aResult=aResult env=env}}
+      {{/each}}
+
+      {{#if aSearchResults}}
+        {{#if sMoreURL}}
+          <div class="more">
+            <a class="btn btn-primary" href="{{sMoreURL}}">
+              Search for more results
+            </a>
+          </div>
+        {{/if}}
+      {{else}}
+        <div class="noresults">No search results found</div>
+      {{/if}}
+    </div>
+
+  {{else}}
+
+    <div id="intro" class="sidebar">
+      <h2>Welcome to Nominatim</h2>
+
+      <p>
+        Nominatim is a search engine for
+        <a href="https://www.openstreetmap.org">OpenStreetMap</a> data. This
+        is the debugging interface. You may search for a name or address
+        (forward search) or look up data by its geographic coordinate (reverse
+        search). Each result comes with a link to a details page where you
+        can inspect what data about the object is saved in the database and
+        investigate how the address of the object has been computed.
+      </p>
+
+      For more information visit the
+      <a href="https://nominatim.org">Nominatim home page</a>.
+    </div>
+
+  {{/if}}
+
+  <div id="map-wrapper">
+    <div id="map-position">
+      <div id="map-position-inner"></div>
+      <div id="map-position-close"><a href="#">hide</a></div>
+    </div>
+    <div id="map"></div>
+  </div>
+</div>
+</script>
+<script id="reversepage-template" type="text/x-handlebars-template">
+
+{{#*inline "partial_one_result"}}
+  <div class="result" data-position="{{iResNum}}">
+    {{formatMapIcon aResult}}
+
+    <span class="name">{{aResult.display_name}}</span>
+    <span class="type">{{formatLabel aResult}}</span>
+    <p class="coords">{{aResult.lat}},{{aResult.lon}}</p>  
+
+    <a class="details btn btn-outline-secondary btn-sm"
+       href="details.html?osmtype={{shortOSMType aResult.osm_type}}&osmid={{aResult.osm_id}}">details</a>
+  </div>
+{{/inline}}
+
+<div class="top-bar">
+  <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+    <div class="form-group">
+      <input name="format" type="hidden" value="html">
+      <label>lat</label>
+      <input name="lat"
+             type="text"
+             class="form-control form-control-sm"
+             placeholder="latitude"
+             value="{{fLat}}" />
+      <a id="switch-coords" class="btn btn-outline-secondary btn-sm" title="switch lat and lon">&lt;&gt;</a>
+      <label>lon</label>
+      <input name="lon"
+             type="text"
+             class="form-control form-control-sm"
+             placeholder="longitude"
+             value="{{fLon}}" />
+      <label>max zoom</label>
+      <select name="zoom" class="form-control form-control-sm" value="{{iZoom}}">
+        {{zoomLevels iZoom}}
+      </select>
+      <button type="submit" class="btn btn-primary btn-sm mx-1">
+        Search
+      </button>
+    </div>
+    <div class="search-type-link">
+      <a href="/search.html">forward search</a>
+    </div>
+  </form>
+</div>
+
+<div id="content">
+  {{#if aPlace}}
+    <div id="searchresults" class="sidebar">
+      {{>partial_one_result iResNum=0 aResult=aPlace env=env}}
+    </div>
+  {{else}}
+    <div id="intro" class="sidebar">
+      Search for coordinates or click anywhere on the map.
+    </div>
+  {{/if}}
+
+  <div id="map-wrapper">
+    <div id="map-position">
+      <div id="map-position-inner"></div>
+      <div id="map-position-close"><a href="#">hide</a></div>
+    </div>
+    <div id="map"></div>
+  </div>
+</div>
+</script>
+<script id="detailspage-template" type="text/x-handlebars-template">
+
+{{#*inline "partial_details_one_row"}}
+  <tr class="{{#unless this.isaddress}}notused{{/unless}}">
+    <td class="name">
+      {{#if this.localname}}
+        {{this.localname}}
+      {{else}}
+        <span class="noname">No Name</span>
+      {{/if}}
+    </td>
+    <td>{{formatPlaceType this}}</td>
+    <td>{{osmLink this}}</td>
+    <td>{{this.rank_address}}</td>
+    <td>{{formatAdminLevel this.admin_level}}</td>
+    <td>{{formatDistance this.distance}}</td>
+    <td>{{detailsPermaLink this 'details >'}}</td>
+  </tr>
+{{/inline}}
+
+{{#*inline "partial_details_keyword_one_row"}}
+  <tr>
+    <td>{{formatKeywordToken this.token}}</td>
+    {{#if this.id}}
+      <td>word id: {{this.id}}</td>
+    {{/if}}
+  </tr>
+{{/inline}}
+
+
+{{#*inline "partial_h2"}}
+  <tr class="all-columns"><td colspan="6"><h2>{{this}}</h2></td></tr>
+{{/inline}}
+
+{{#*inline "partial_h3"}}
+  <tr class="all-columns"><td colspan="6"><h3>{{this}}</h3></td></tr>
+{{/inline}}
+
+<div class="container">
+  <div class="row">
+    <div class="col-sm-10">
+      <h1>
+        {{aPlace.localname}}
+        <small>{{detailsPermaLink aPlace 'link to this page'}}</small>
+      </h1>
+    </div>
+    <div class="col-sm-2 text-right">
+      {{formatMapIcon aPlace}}
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-6">
+      <table id="locationdetails" class="table table-striped">
+        <tr>
+          <td>Name</td>
+          <td>
+            {{#each aPlace.names}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+        <tr>
+          <td>Type</td>
+          <td>{{aPlace.category}}:{{aPlace.type}}</td>
+        </tr>
+        <tr>
+          <td>Last Updated</td>
+          <td>{{aPlace.indexed_date}}</td>
+        </tr>
+        <tr>
+          <td>Admin Level</td>
+          <td>{{aPlace.admin_level}}</td>
+        </tr>
+        <tr>
+          <td>Rank</td>
+          <td>{{formatSearchRank aPlace.rank_search}}</td>
+        </tr>
+        {{#if aPlace.calculated_importance}}
+          <tr>
+            <td>Importance</td>
+            <td>
+              {{aPlace.calculated_importance}}
+              {{#unless aPlace.importance}} (estimated){{/unless}}
+            </td>
+          </tr>
+        {{/if}}
+        <tr>
+          <td>Coverage</td>
+          <td>{{coverageType aPlace}}</td>
+        </tr>
+        <tr>
+          <td>Centre Point (lat,lon)</td>
+          <td>
+            {{aPlace.centroid.coordinates.[1]}},{{aPlace.centroid.coordinates.[0]}}
+          </td>
+        </tr>
+        <tr>
+          <td>OSM</td>
+          <td>{{osmLink aPlace}}
+        </tr>
+        <tr>
+          <td>
+            Place Id
+            (<a href="https://nominatim.org/release-docs/develop/api/Output/#place_id-is-not-a-persistent-id">on this server</a>)
+          </td>
+          <td>{{aPlace.place_id}}</td>
+        </tr>
+        {{#if aPlace.calculated_wikipedia}}
+          <tr>
+            <td>Wikipedia Calculated</td>
+            <td>{{wikipediaLink aPlace}}</td>
+          </tr>
+        {{/if}}
+        <tr>
+          <td>Computed Postcode</td>
+          <td>{{aPlace.calculated_postcode}}</td>
+        </tr>
+        <tr>
+          <td>Address Tags</td>
+          <td>
+            {{#each aPlace.addresstags}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+        <tr>
+          <td>Extra Tags</td>
+          <td>
+            {{#each aPlace.extratags}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+      </table>
+    </div>
+    <div class="col-md-6">
+      <div id="map"></div>
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-12">
+      <h2>Address</h2>
+       <table id="address" class="table table-striped table-small">
+        <thead>
+          <tr>
+            <th>Local name</th>
+            <th>Type</th>
+            <th>OSM</th>
+            <th>Address rank</th>
+            <th>Admin level</th>
+            <th>Distance</th>
+            <th></th>
+          </tr>
+        </thead>
+        <tbody>
+          {{#if aPlace.address}}
+            {{#each aPlace.address}}
+              {{> partial_details_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{#if aPlace.linked_places}}
+            {{> partial_h2 'Linked Places'}}
+            {{#each aPlace.linked_places}}
+              {{> partial_details_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{#if aPlace.keywords}}
+            {{> partial_h2 'Name Keywords'}}
+            {{#each aPlace.keywords.name}}
+              {{> partial_details_keyword_one_row}}
+            {{/each}}
+
+            {{> partial_h2 'Address Keywords'}}
+            {{#each aPlace.keywords.address}}
+              {{> partial_details_keyword_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{> partial_h2 'Parent Of'}}
+          {{#if aPlace.hierarchy}}
+
+            {{#each aPlace.hierarchy as |lines type|}}
+              {{> partial_h3 type}}
+              {{#each lines}}
+                {{> partial_details_one_row}}
+              {{/each}}
+            {{/each}}
+          {{else}}
+            <tr>
+              <td>
+                <a class="btn btn-outline-secondary btn-sm"
+                  href="{{base_url}}&hierarchy=1">display child places</a>
+              </td>
+            </tr>
+          {{/if}}
+          {{tooManyHierarchyLinesWarning aPlace}}
+        </tbody>
+      </table>
+    </div>
+  </div>
+</div>
+
+</script>
+<script id="detailspage-index-template" type="text/x-handlebars-template">
+<div class="container" id="details-index-page">
+  <div class="row">
+    <div class="col-md-12">
+
+      <h1>Show details for place</h1>
+
+      <div class="search-form">
+        <h4>Search by place id</h4>
+
+        <form class="form-inline" action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern="^[0-9]+$"
+                 name="place_id"
+                 placeholder="12345" />
+          <input type="submit"
+                 class="btn btn-primary btn-sm"
+                 value="Show" />
+        </form>
+      </div>
+
+      <div class="search-form">
+        <h4>Search by OSM type and OSM id</h4>
+
+        <form id="form-by-type-and-id"
+              class="form-inline"
+              action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern="^[NWR][0-9]+$"
+                 placeholder="N123 or W123 or R123" />
+          <input type="hidden" name="osmtype" />
+          <input type="hidden" name="osmid" />
+          <input type="submit" class="btn btn-primary btn-sm" value="Show" />
+        </form>
+      </div>
+
+      <div class="search-form">
+        <h4>Search by openstreetmap.org URL</h4>
+
+        <form id="form-by-osm-url"
+              class="form-inline"
+              action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern=".*openstreetmap.*"
+                 placeholder="https://www.openstreetmap.org/relation/123" />
+          <input type="hidden" name="osmtype" />
+          <input type="hidden" name="osmid" />
+          <input type="submit" class="btn btn-primary btn-sm" value="Show" />
+        </form>
+      </div>
+
+    </div>
+  </div>
+</div></script>
+<script id="deletable-template" type="text/x-handlebars-template">
+<div class="container">
+  <div class="row">
+    <div class="col-sm-12">
+      <h1>Deletable</h1>
+
+      <p>
+          {{aPolygons.length}} objects have been deleted in OSM but are still in the Nominatim database.
+      </p>
+
+      <table class="table table-striped table-hover">
+        <thead>
+          <th>Place id</th>
+          <th>Country Code</th>
+          <th>Name</th>
+          <th>OSM id</th>
+          <th>OSM type</th>
+          <th>Class</th>
+          <th>Type</th>
+        </thead>
+        <tbody>
+          {{#each aPolygons}}
+          <tr>
+            <td>{{detailsLink this place_id}}</td>
+            <td>{{country_code}}</td>
+            <td>{{name}}</td>
+            <td>{{osmLink this}}</td>
+            <td>{{osm_type}}</td>
+            <td>{{class}}</td>
+            <td>{{type}}</td>
+          </tr>
+          {{/each}}
+        </tbody>
+      </table>
+
+
+    </div>
+  </div>
+</div
+
+</script>
 <script id="polygons-template" type="text/x-handlebars-template">
 <div class="container">
   <div class="row">
index 642b330700fbb75274ccd83fd17b670590535641..aba9dbb15ecaabfbd03885192d59b2a64e444976 100644 (file)
   <link href="assets/css/search.css" rel="stylesheet" type="text/css" />
   <link href="assets/css/details.css" rel="stylesheet" type="text/css" />
 </head>
-<body id="reverse-page">
+<body id="BODYID">
 
-  <div id="error-overlay">
-    You need Javascript enabled to view this page.
-  </div>
+  <div id="error-overlay"></div>
 
   <header class="container-fluid">
     <div class="row">
@@ -32,6 +30,7 @@
         </div>
       </div>
       <div id="last-updated" class="col-4 text-center">
+        <div id="loading">loading...</div>
         Data from <a id="api-request-link" href="">API request</a>
         <br>
         Data last updated:
   <script src="handlebar_helpers.js"></script>
 
   <script src="assets/js/nominatim-ui.js"></script>
+<script id="searchpage-template" type="text/x-handlebars-template">
+{{#*inline "partial_one_result"}}
+  <div class="result" data-position="{{iResNum}}">
+    {{formatMapIcon aResult}}
+
+    <span class="name">{{aResult.display_name}}</span>
+    <span class="type">({{formatLabel aResult}})</span>
+    <p class="coords">{{aResult.lat}},{{aResult.lon}}</p>  
+
+    <a class="details btn btn-outline-secondary btn-sm"
+       href="details.html?osmtype={{shortOSMType aResult.osm_type}}&osmid={{aResult.osm_id}}">details</a>
+  </div>
+{{/inline}}
+
+<div class="top-bar">
+  <ul class="nav nav-tabs">
+    <li class="nav-item">
+      <a class="nav-link {{#unless hStructured}}active{{/unless}}" data-toggle="tab" href="#simple">simple</a>
+    </li>
+    <li class="nav-item">
+      <a class="nav-link {{#if hStructured}}active{{/if}}" data-toggle="tab" href="#structured">structured</a>
+    </li>
+    <div class="search-type-link">
+      <a id="switch-to-reverse" href="/reverse.html">reverse search</a>
+    </div>
+  </ul>
+  <div class="tab-content p-2">
+    <div class="tab-pane {{#unless hStructured}}active{{/unless}}" id="simple" role="tabpanel">
+      <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+        <input id="q"
+               name="q"
+               type="text"
+               class="form-control form-control-sm"
+               placeholder="Search"
+               value="{{sQuery}}" />
+
+        <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>
+        </div>
+      </form>
+    </div>
+    <div class="tab-pane {{#if hStructured}}active{{/if}}" id="structured" role="tabpanel">
+      <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+        <input name="street" type="text" class="form-control form-control-sm mr-1"
+               placeholder="House number/Street"
+               value="{{hStructured.street}}" />
+        <input name="city" type="text" class="form-control form-control-sm mr-1"
+               placeholder="City"
+               value="{{hStructured.city}}" />
+        <input id="county" name="county" type="text" class="form-control form-control-sm mr-1"
+               placeholder="County"
+               value="{{hStructured.county}}" />
+        <input name="state" type="text" class="form-control form-control-sm mr-1"
+               placeholder="State"
+               value="{{hStructured.state}}" />
+        <input name="country" type="text" class="form-control form-control-sm mr-1"
+               placeholder="Country"
+               value="{{hStructured.country}}" />
+        <input name="postalcode" type="text" class="form-control form-control-sm mr-1"
+               placeholder="Postal Code"
+               value="{{hStructured.postalcode}}" />
+
+        <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>
+        </div>
+      </form>
+    </div>
+  </div> <!-- /tab-content -->
+</div> <!-- /top-bar -->
+
+<div id="content">
+
+  {{#if sQuery}}
+    <div id="searchresults" class="sidebar">
+      {{#each aSearchResults as |aResult|}}
+        {{>partial_one_result iResNum=@index aResult=aResult env=env}}
+      {{/each}}
+
+      {{#if aSearchResults}}
+        {{#if sMoreURL}}
+          <div class="more">
+            <a class="btn btn-primary" href="{{sMoreURL}}">
+              Search for more results
+            </a>
+          </div>
+        {{/if}}
+      {{else}}
+        <div class="noresults">No search results found</div>
+      {{/if}}
+    </div>
+
+  {{else}}
+
+    <div id="intro" class="sidebar">
+      <h2>Welcome to Nominatim</h2>
+
+      <p>
+        Nominatim is a search engine for
+        <a href="https://www.openstreetmap.org">OpenStreetMap</a> data. This
+        is the debugging interface. You may search for a name or address
+        (forward search) or look up data by its geographic coordinate (reverse
+        search). Each result comes with a link to a details page where you
+        can inspect what data about the object is saved in the database and
+        investigate how the address of the object has been computed.
+      </p>
+
+      For more information visit the
+      <a href="https://nominatim.org">Nominatim home page</a>.
+    </div>
+
+  {{/if}}
+
+  <div id="map-wrapper">
+    <div id="map-position">
+      <div id="map-position-inner"></div>
+      <div id="map-position-close"><a href="#">hide</a></div>
+    </div>
+    <div id="map"></div>
+  </div>
+</div>
+</script>
 <script id="reversepage-template" type="text/x-handlebars-template">
 
 {{#*inline "partial_one_result"}}
     <div id="map"></div>
   </div>
 </div>
+</script>
+<script id="detailspage-template" type="text/x-handlebars-template">
+
+{{#*inline "partial_details_one_row"}}
+  <tr class="{{#unless this.isaddress}}notused{{/unless}}">
+    <td class="name">
+      {{#if this.localname}}
+        {{this.localname}}
+      {{else}}
+        <span class="noname">No Name</span>
+      {{/if}}
+    </td>
+    <td>{{formatPlaceType this}}</td>
+    <td>{{osmLink this}}</td>
+    <td>{{this.rank_address}}</td>
+    <td>{{formatAdminLevel this.admin_level}}</td>
+    <td>{{formatDistance this.distance}}</td>
+    <td>{{detailsPermaLink this 'details >'}}</td>
+  </tr>
+{{/inline}}
+
+{{#*inline "partial_details_keyword_one_row"}}
+  <tr>
+    <td>{{formatKeywordToken this.token}}</td>
+    {{#if this.id}}
+      <td>word id: {{this.id}}</td>
+    {{/if}}
+  </tr>
+{{/inline}}
+
+
+{{#*inline "partial_h2"}}
+  <tr class="all-columns"><td colspan="6"><h2>{{this}}</h2></td></tr>
+{{/inline}}
+
+{{#*inline "partial_h3"}}
+  <tr class="all-columns"><td colspan="6"><h3>{{this}}</h3></td></tr>
+{{/inline}}
+
+<div class="container">
+  <div class="row">
+    <div class="col-sm-10">
+      <h1>
+        {{aPlace.localname}}
+        <small>{{detailsPermaLink aPlace 'link to this page'}}</small>
+      </h1>
+    </div>
+    <div class="col-sm-2 text-right">
+      {{formatMapIcon aPlace}}
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-6">
+      <table id="locationdetails" class="table table-striped">
+        <tr>
+          <td>Name</td>
+          <td>
+            {{#each aPlace.names}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+        <tr>
+          <td>Type</td>
+          <td>{{aPlace.category}}:{{aPlace.type}}</td>
+        </tr>
+        <tr>
+          <td>Last Updated</td>
+          <td>{{aPlace.indexed_date}}</td>
+        </tr>
+        <tr>
+          <td>Admin Level</td>
+          <td>{{aPlace.admin_level}}</td>
+        </tr>
+        <tr>
+          <td>Rank</td>
+          <td>{{formatSearchRank aPlace.rank_search}}</td>
+        </tr>
+        {{#if aPlace.calculated_importance}}
+          <tr>
+            <td>Importance</td>
+            <td>
+              {{aPlace.calculated_importance}}
+              {{#unless aPlace.importance}} (estimated){{/unless}}
+            </td>
+          </tr>
+        {{/if}}
+        <tr>
+          <td>Coverage</td>
+          <td>{{coverageType aPlace}}</td>
+        </tr>
+        <tr>
+          <td>Centre Point (lat,lon)</td>
+          <td>
+            {{aPlace.centroid.coordinates.[1]}},{{aPlace.centroid.coordinates.[0]}}
+          </td>
+        </tr>
+        <tr>
+          <td>OSM</td>
+          <td>{{osmLink aPlace}}
+        </tr>
+        <tr>
+          <td>
+            Place Id
+            (<a href="https://nominatim.org/release-docs/develop/api/Output/#place_id-is-not-a-persistent-id">on this server</a>)
+          </td>
+          <td>{{aPlace.place_id}}</td>
+        </tr>
+        {{#if aPlace.calculated_wikipedia}}
+          <tr>
+            <td>Wikipedia Calculated</td>
+            <td>{{wikipediaLink aPlace}}</td>
+          </tr>
+        {{/if}}
+        <tr>
+          <td>Computed Postcode</td>
+          <td>{{aPlace.calculated_postcode}}</td>
+        </tr>
+        <tr>
+          <td>Address Tags</td>
+          <td>
+            {{#each aPlace.addresstags}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+        <tr>
+          <td>Extra Tags</td>
+          <td>
+            {{#each aPlace.extratags}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+      </table>
+    </div>
+    <div class="col-md-6">
+      <div id="map"></div>
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-12">
+      <h2>Address</h2>
+       <table id="address" class="table table-striped table-small">
+        <thead>
+          <tr>
+            <th>Local name</th>
+            <th>Type</th>
+            <th>OSM</th>
+            <th>Address rank</th>
+            <th>Admin level</th>
+            <th>Distance</th>
+            <th></th>
+          </tr>
+        </thead>
+        <tbody>
+          {{#if aPlace.address}}
+            {{#each aPlace.address}}
+              {{> partial_details_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{#if aPlace.linked_places}}
+            {{> partial_h2 'Linked Places'}}
+            {{#each aPlace.linked_places}}
+              {{> partial_details_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{#if aPlace.keywords}}
+            {{> partial_h2 'Name Keywords'}}
+            {{#each aPlace.keywords.name}}
+              {{> partial_details_keyword_one_row}}
+            {{/each}}
+
+            {{> partial_h2 'Address Keywords'}}
+            {{#each aPlace.keywords.address}}
+              {{> partial_details_keyword_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{> partial_h2 'Parent Of'}}
+          {{#if aPlace.hierarchy}}
+
+            {{#each aPlace.hierarchy as |lines type|}}
+              {{> partial_h3 type}}
+              {{#each lines}}
+                {{> partial_details_one_row}}
+              {{/each}}
+            {{/each}}
+          {{else}}
+            <tr>
+              <td>
+                <a class="btn btn-outline-secondary btn-sm"
+                  href="{{base_url}}&hierarchy=1">display child places</a>
+              </td>
+            </tr>
+          {{/if}}
+          {{tooManyHierarchyLinesWarning aPlace}}
+        </tbody>
+      </table>
+    </div>
+  </div>
+</div>
+
+</script>
+<script id="detailspage-index-template" type="text/x-handlebars-template">
+<div class="container" id="details-index-page">
+  <div class="row">
+    <div class="col-md-12">
+
+      <h1>Show details for place</h1>
+
+      <div class="search-form">
+        <h4>Search by place id</h4>
+
+        <form class="form-inline" action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern="^[0-9]+$"
+                 name="place_id"
+                 placeholder="12345" />
+          <input type="submit"
+                 class="btn btn-primary btn-sm"
+                 value="Show" />
+        </form>
+      </div>
+
+      <div class="search-form">
+        <h4>Search by OSM type and OSM id</h4>
+
+        <form id="form-by-type-and-id"
+              class="form-inline"
+              action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern="^[NWR][0-9]+$"
+                 placeholder="N123 or W123 or R123" />
+          <input type="hidden" name="osmtype" />
+          <input type="hidden" name="osmid" />
+          <input type="submit" class="btn btn-primary btn-sm" value="Show" />
+        </form>
+      </div>
+
+      <div class="search-form">
+        <h4>Search by openstreetmap.org URL</h4>
+
+        <form id="form-by-osm-url"
+              class="form-inline"
+              action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern=".*openstreetmap.*"
+                 placeholder="https://www.openstreetmap.org/relation/123" />
+          <input type="hidden" name="osmtype" />
+          <input type="hidden" name="osmid" />
+          <input type="submit" class="btn btn-primary btn-sm" value="Show" />
+        </form>
+      </div>
+
+    </div>
+  </div>
+</div></script>
+<script id="deletable-template" type="text/x-handlebars-template">
+<div class="container">
+  <div class="row">
+    <div class="col-sm-12">
+      <h1>Deletable</h1>
+
+      <p>
+          {{aPolygons.length}} objects have been deleted in OSM but are still in the Nominatim database.
+      </p>
+
+      <table class="table table-striped table-hover">
+        <thead>
+          <th>Place id</th>
+          <th>Country Code</th>
+          <th>Name</th>
+          <th>OSM id</th>
+          <th>OSM type</th>
+          <th>Class</th>
+          <th>Type</th>
+        </thead>
+        <tbody>
+          {{#each aPolygons}}
+          <tr>
+            <td>{{detailsLink this place_id}}</td>
+            <td>{{country_code}}</td>
+            <td>{{name}}</td>
+            <td>{{osmLink this}}</td>
+            <td>{{osm_type}}</td>
+            <td>{{class}}</td>
+            <td>{{type}}</td>
+          </tr>
+          {{/each}}
+        </tbody>
+      </table>
+
+
+    </div>
+  </div>
+</div
+
+</script>
+<script id="polygons-template" type="text/x-handlebars-template">
+<div class="container">
+  <div class="row">
+    <div class="col-sm-12">
+      <h1>Broken polygons</h1>
+
+      <p>
+          Total number of broken polygons: {{aPolygons.length}}.
+      </p>
+
+      <table class="table table-striped table-hover">
+        <thead>
+          <th>OSM type</th>
+          <th>OSM id</th>
+          <th>Class</th>
+          <th>Type</th>
+          <th>Name</th>
+          <th>Country Code</th>
+          <th>Error message</th>
+          <th>Updated</th>
+          <th>&nbsp;</th>
+        </thead>
+        <tbody>
+          {{#each aPolygons}}
+          <tr>
+            <td>{{osm_type}}</td>
+            <td>{{osmLink this}}</td>
+            <td>{{class}}</td>
+            <td>{{type}}</td>
+            <td>{{name}}</td>
+            <td>{{country_code}}</td>
+            <td>{{errormessage}}</td>
+            <td>{{updated}}</td>
+            <td>
+              <a href="http://localhost:8111/import?url=https://www.openstreetmap.org/api/0.6/{{formatOSMType osm_type}}/{{osm_id}}/full" target="josm">josm</a>
+            </td>
+          </tr>
+          {{/each}}
+        </tbody>
+      </table>
+
+
+    </div>
+  </div>
+</div
+
 </script>
 </body>
 </html>
diff --git a/dist/reversepage.hbs b/dist/reversepage.hbs
deleted file mode 100644 (file)
index ba80e74..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-
-{{#*inline "partial_one_result"}}
-  <div class="result" data-position="{{iResNum}}">
-    {{formatMapIcon aResult}}
-
-    <span class="name">{{aResult.display_name}}</span>
-    <span class="type">{{formatLabel aResult}}</span>
-    <p class="coords">{{aResult.lat}},{{aResult.lon}}</p>  
-
-    <a class="details btn btn-outline-secondary btn-sm"
-       href="details.html?osmtype={{shortOSMType aResult.osm_type}}&osmid={{aResult.osm_id}}">details</a>
-  </div>
-{{/inline}}
-
-<div class="top-bar">
-  <form class="form-inline" role="search" accept-charset="UTF-8" action="">
-    <div class="form-group">
-      <input name="format" type="hidden" value="html">
-      <label>lat</label>
-      <input name="lat"
-             type="text"
-             class="form-control form-control-sm"
-             placeholder="latitude"
-             value="{{fLat}}" />
-      <a id="switch-coords" class="btn btn-outline-secondary btn-sm" title="switch lat and lon">&lt;&gt;</a>
-      <label>lon</label>
-      <input name="lon"
-             type="text"
-             class="form-control form-control-sm"
-             placeholder="longitude"
-             value="{{fLon}}" />
-      <label>max zoom</label>
-      <select name="zoom" class="form-control form-control-sm" value="{{iZoom}}">
-        {{zoomLevels iZoom}}
-      </select>
-      <button type="submit" class="btn btn-primary btn-sm mx-1">
-        Search
-      </button>
-    </div>
-    <div class="search-type-link">
-      <a href="/search.html">forward search</a>
-    </div>
-  </form>
-</div>
-
-<div id="content">
-  {{#if aPlace}}
-    <div id="searchresults" class="sidebar">
-      {{>partial_one_result iResNum=0 aResult=aPlace env=env}}
-    </div>
-  {{else}}
-    <div id="intro" class="sidebar">
-      Search for coordinates or click anywhere on the map.
-    </div>
-  {{/if}}
-
-  <div id="map-wrapper">
-    <div id="map-position">
-      <div id="map-position-inner"></div>
-      <div id="map-position-close"><a href="#">hide</a></div>
-    </div>
-    <div id="map"></div>
-  </div>
-</div>
index e8aa46ac2d7aebe50d83b1ec912753ddcacff6d2..aba9dbb15ecaabfbd03885192d59b2a64e444976 100644 (file)
   <link href="assets/css/search.css" rel="stylesheet" type="text/css" />
   <link href="assets/css/details.css" rel="stylesheet" type="text/css" />
 </head>
-<body id="search-page">
+<body id="BODYID">
 
-  <div id="error-overlay">
-    You need Javascript enabled to view this page.
-  </div>
+  <div id="error-overlay"></div>
 
   <header class="container-fluid">
     <div class="row">
@@ -32,6 +30,7 @@
         </div>
       </div>
       <div id="last-updated" class="col-4 text-center">
+        <div id="loading">loading...</div>
         Data from <a id="api-request-link" href="">API request</a>
         <br>
         Data last updated:
     <div id="map"></div>
   </div>
 </div>
+</script>
+<script id="reversepage-template" type="text/x-handlebars-template">
+
+{{#*inline "partial_one_result"}}
+  <div class="result" data-position="{{iResNum}}">
+    {{formatMapIcon aResult}}
+
+    <span class="name">{{aResult.display_name}}</span>
+    <span class="type">{{formatLabel aResult}}</span>
+    <p class="coords">{{aResult.lat}},{{aResult.lon}}</p>  
+
+    <a class="details btn btn-outline-secondary btn-sm"
+       href="details.html?osmtype={{shortOSMType aResult.osm_type}}&osmid={{aResult.osm_id}}">details</a>
+  </div>
+{{/inline}}
+
+<div class="top-bar">
+  <form class="form-inline" role="search" accept-charset="UTF-8" action="">
+    <div class="form-group">
+      <input name="format" type="hidden" value="html">
+      <label>lat</label>
+      <input name="lat"
+             type="text"
+             class="form-control form-control-sm"
+             placeholder="latitude"
+             value="{{fLat}}" />
+      <a id="switch-coords" class="btn btn-outline-secondary btn-sm" title="switch lat and lon">&lt;&gt;</a>
+      <label>lon</label>
+      <input name="lon"
+             type="text"
+             class="form-control form-control-sm"
+             placeholder="longitude"
+             value="{{fLon}}" />
+      <label>max zoom</label>
+      <select name="zoom" class="form-control form-control-sm" value="{{iZoom}}">
+        {{zoomLevels iZoom}}
+      </select>
+      <button type="submit" class="btn btn-primary btn-sm mx-1">
+        Search
+      </button>
+    </div>
+    <div class="search-type-link">
+      <a href="/search.html">forward search</a>
+    </div>
+  </form>
+</div>
+
+<div id="content">
+  {{#if aPlace}}
+    <div id="searchresults" class="sidebar">
+      {{>partial_one_result iResNum=0 aResult=aPlace env=env}}
+    </div>
+  {{else}}
+    <div id="intro" class="sidebar">
+      Search for coordinates or click anywhere on the map.
+    </div>
+  {{/if}}
+
+  <div id="map-wrapper">
+    <div id="map-position">
+      <div id="map-position-inner"></div>
+      <div id="map-position-close"><a href="#">hide</a></div>
+    </div>
+    <div id="map"></div>
+  </div>
+</div>
+</script>
+<script id="detailspage-template" type="text/x-handlebars-template">
+
+{{#*inline "partial_details_one_row"}}
+  <tr class="{{#unless this.isaddress}}notused{{/unless}}">
+    <td class="name">
+      {{#if this.localname}}
+        {{this.localname}}
+      {{else}}
+        <span class="noname">No Name</span>
+      {{/if}}
+    </td>
+    <td>{{formatPlaceType this}}</td>
+    <td>{{osmLink this}}</td>
+    <td>{{this.rank_address}}</td>
+    <td>{{formatAdminLevel this.admin_level}}</td>
+    <td>{{formatDistance this.distance}}</td>
+    <td>{{detailsPermaLink this 'details >'}}</td>
+  </tr>
+{{/inline}}
+
+{{#*inline "partial_details_keyword_one_row"}}
+  <tr>
+    <td>{{formatKeywordToken this.token}}</td>
+    {{#if this.id}}
+      <td>word id: {{this.id}}</td>
+    {{/if}}
+  </tr>
+{{/inline}}
+
+
+{{#*inline "partial_h2"}}
+  <tr class="all-columns"><td colspan="6"><h2>{{this}}</h2></td></tr>
+{{/inline}}
+
+{{#*inline "partial_h3"}}
+  <tr class="all-columns"><td colspan="6"><h3>{{this}}</h3></td></tr>
+{{/inline}}
+
+<div class="container">
+  <div class="row">
+    <div class="col-sm-10">
+      <h1>
+        {{aPlace.localname}}
+        <small>{{detailsPermaLink aPlace 'link to this page'}}</small>
+      </h1>
+    </div>
+    <div class="col-sm-2 text-right">
+      {{formatMapIcon aPlace}}
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-6">
+      <table id="locationdetails" class="table table-striped">
+        <tr>
+          <td>Name</td>
+          <td>
+            {{#each aPlace.names}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+        <tr>
+          <td>Type</td>
+          <td>{{aPlace.category}}:{{aPlace.type}}</td>
+        </tr>
+        <tr>
+          <td>Last Updated</td>
+          <td>{{aPlace.indexed_date}}</td>
+        </tr>
+        <tr>
+          <td>Admin Level</td>
+          <td>{{aPlace.admin_level}}</td>
+        </tr>
+        <tr>
+          <td>Rank</td>
+          <td>{{formatSearchRank aPlace.rank_search}}</td>
+        </tr>
+        {{#if aPlace.calculated_importance}}
+          <tr>
+            <td>Importance</td>
+            <td>
+              {{aPlace.calculated_importance}}
+              {{#unless aPlace.importance}} (estimated){{/unless}}
+            </td>
+          </tr>
+        {{/if}}
+        <tr>
+          <td>Coverage</td>
+          <td>{{coverageType aPlace}}</td>
+        </tr>
+        <tr>
+          <td>Centre Point (lat,lon)</td>
+          <td>
+            {{aPlace.centroid.coordinates.[1]}},{{aPlace.centroid.coordinates.[0]}}
+          </td>
+        </tr>
+        <tr>
+          <td>OSM</td>
+          <td>{{osmLink aPlace}}
+        </tr>
+        <tr>
+          <td>
+            Place Id
+            (<a href="https://nominatim.org/release-docs/develop/api/Output/#place_id-is-not-a-persistent-id">on this server</a>)
+          </td>
+          <td>{{aPlace.place_id}}</td>
+        </tr>
+        {{#if aPlace.calculated_wikipedia}}
+          <tr>
+            <td>Wikipedia Calculated</td>
+            <td>{{wikipediaLink aPlace}}</td>
+          </tr>
+        {{/if}}
+        <tr>
+          <td>Computed Postcode</td>
+          <td>{{aPlace.calculated_postcode}}</td>
+        </tr>
+        <tr>
+          <td>Address Tags</td>
+          <td>
+            {{#each aPlace.addresstags}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+        <tr>
+          <td>Extra Tags</td>
+          <td>
+            {{#each aPlace.extratags}}
+              <div class="line">
+                <span class="name">{{this}}</span> ({{@key}})
+              </div>
+            {{/each}}
+          </td>
+        </tr>
+      </table>
+    </div>
+    <div class="col-md-6">
+      <div id="map"></div>
+    </div>
+  </div>
+  <div class="row">
+    <div class="col-md-12">
+      <h2>Address</h2>
+       <table id="address" class="table table-striped table-small">
+        <thead>
+          <tr>
+            <th>Local name</th>
+            <th>Type</th>
+            <th>OSM</th>
+            <th>Address rank</th>
+            <th>Admin level</th>
+            <th>Distance</th>
+            <th></th>
+          </tr>
+        </thead>
+        <tbody>
+          {{#if aPlace.address}}
+            {{#each aPlace.address}}
+              {{> partial_details_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{#if aPlace.linked_places}}
+            {{> partial_h2 'Linked Places'}}
+            {{#each aPlace.linked_places}}
+              {{> partial_details_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{#if aPlace.keywords}}
+            {{> partial_h2 'Name Keywords'}}
+            {{#each aPlace.keywords.name}}
+              {{> partial_details_keyword_one_row}}
+            {{/each}}
+
+            {{> partial_h2 'Address Keywords'}}
+            {{#each aPlace.keywords.address}}
+              {{> partial_details_keyword_one_row}}
+            {{/each}}
+          {{/if}}
+
+          {{> partial_h2 'Parent Of'}}
+          {{#if aPlace.hierarchy}}
+
+            {{#each aPlace.hierarchy as |lines type|}}
+              {{> partial_h3 type}}
+              {{#each lines}}
+                {{> partial_details_one_row}}
+              {{/each}}
+            {{/each}}
+          {{else}}
+            <tr>
+              <td>
+                <a class="btn btn-outline-secondary btn-sm"
+                  href="{{base_url}}&hierarchy=1">display child places</a>
+              </td>
+            </tr>
+          {{/if}}
+          {{tooManyHierarchyLinesWarning aPlace}}
+        </tbody>
+      </table>
+    </div>
+  </div>
+</div>
+
+</script>
+<script id="detailspage-index-template" type="text/x-handlebars-template">
+<div class="container" id="details-index-page">
+  <div class="row">
+    <div class="col-md-12">
+
+      <h1>Show details for place</h1>
+
+      <div class="search-form">
+        <h4>Search by place id</h4>
+
+        <form class="form-inline" action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern="^[0-9]+$"
+                 name="place_id"
+                 placeholder="12345" />
+          <input type="submit"
+                 class="btn btn-primary btn-sm"
+                 value="Show" />
+        </form>
+      </div>
+
+      <div class="search-form">
+        <h4>Search by OSM type and OSM id</h4>
+
+        <form id="form-by-type-and-id"
+              class="form-inline"
+              action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern="^[NWR][0-9]+$"
+                 placeholder="N123 or W123 or R123" />
+          <input type="hidden" name="osmtype" />
+          <input type="hidden" name="osmid" />
+          <input type="submit" class="btn btn-primary btn-sm" value="Show" />
+        </form>
+      </div>
+
+      <div class="search-form">
+        <h4>Search by openstreetmap.org URL</h4>
+
+        <form id="form-by-osm-url"
+              class="form-inline"
+              action="details.html">
+          <input type="edit"
+                 class="form-control input-sm"
+                 pattern=".*openstreetmap.*"
+                 placeholder="https://www.openstreetmap.org/relation/123" />
+          <input type="hidden" name="osmtype" />
+          <input type="hidden" name="osmid" />
+          <input type="submit" class="btn btn-primary btn-sm" value="Show" />
+        </form>
+      </div>
+
+    </div>
+  </div>
+</div></script>
+<script id="deletable-template" type="text/x-handlebars-template">
+<div class="container">
+  <div class="row">
+    <div class="col-sm-12">
+      <h1>Deletable</h1>
+
+      <p>
+          {{aPolygons.length}} objects have been deleted in OSM but are still in the Nominatim database.
+      </p>
+
+      <table class="table table-striped table-hover">
+        <thead>
+          <th>Place id</th>
+          <th>Country Code</th>
+          <th>Name</th>
+          <th>OSM id</th>
+          <th>OSM type</th>
+          <th>Class</th>
+          <th>Type</th>
+        </thead>
+        <tbody>
+          {{#each aPolygons}}
+          <tr>
+            <td>{{detailsLink this place_id}}</td>
+            <td>{{country_code}}</td>
+            <td>{{name}}</td>
+            <td>{{osmLink this}}</td>
+            <td>{{osm_type}}</td>
+            <td>{{class}}</td>
+            <td>{{type}}</td>
+          </tr>
+          {{/each}}
+        </tbody>
+      </table>
+
+
+    </div>
+  </div>
+</div
+
+</script>
+<script id="polygons-template" type="text/x-handlebars-template">
+<div class="container">
+  <div class="row">
+    <div class="col-sm-12">
+      <h1>Broken polygons</h1>
+
+      <p>
+          Total number of broken polygons: {{aPolygons.length}}.
+      </p>
+
+      <table class="table table-striped table-hover">
+        <thead>
+          <th>OSM type</th>
+          <th>OSM id</th>
+          <th>Class</th>
+          <th>Type</th>
+          <th>Name</th>
+          <th>Country Code</th>
+          <th>Error message</th>
+          <th>Updated</th>
+          <th>&nbsp;</th>
+        </thead>
+        <tbody>
+          {{#each aPolygons}}
+          <tr>
+            <td>{{osm_type}}</td>
+            <td>{{osmLink this}}</td>
+            <td>{{class}}</td>
+            <td>{{type}}</td>
+            <td>{{name}}</td>
+            <td>{{country_code}}</td>
+            <td>{{errormessage}}</td>
+            <td>{{updated}}</td>
+            <td>
+              <a href="http://localhost:8111/import?url=https://www.openstreetmap.org/api/0.6/{{formatOSMType osm_type}}/{{osm_id}}/full" target="josm">josm</a>
+            </td>
+          </tr>
+          {{/each}}
+        </tbody>
+      </table>
+
+
+    </div>
+  </div>
+</div
+
 </script>
 </body>
 </html>
diff --git a/dist/searchpage.hbs b/dist/searchpage.hbs
deleted file mode 100644 (file)
index ce2fc47..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-{{#*inline "partial_one_result"}}
-  <div class="result" data-position="{{iResNum}}">
-    {{formatMapIcon aResult}}
-
-    <span class="name">{{aResult.display_name}}</span>
-    <span class="type">({{formatLabel aResult}})</span>
-    <p class="coords">{{aResult.lat}},{{aResult.lon}}</p>  
-
-    <a class="details btn btn-outline-secondary btn-sm"
-       href="details.html?osmtype={{shortOSMType aResult.osm_type}}&osmid={{aResult.osm_id}}">details</a>
-  </div>
-{{/inline}}
-
-<div class="top-bar">
-  <ul class="nav nav-tabs">
-    <li class="nav-item">
-      <a class="nav-link {{#unless hStructured}}active{{/unless}}" data-toggle="tab" href="#simple">simple</a>
-    </li>
-    <li class="nav-item">
-      <a class="nav-link {{#if hStructured}}active{{/if}}" data-toggle="tab" href="#structured">structured</a>
-    </li>
-    <div class="search-type-link">
-      <a id="switch-to-reverse" href="/reverse.html">reverse search</a>
-    </div>
-  </ul>
-  <div class="tab-content p-2">
-    <div class="tab-pane {{#unless hStructured}}active{{/unless}}" id="simple" role="tabpanel">
-      <form class="form-inline" role="search" accept-charset="UTF-8" action="">
-        <input id="q"
-               name="q"
-               type="text"
-               class="form-control form-control-sm"
-               placeholder="Search"
-               value="{{sQuery}}" />
-
-        <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>
-        </div>
-      </form>
-    </div>
-    <div class="tab-pane {{#if hStructured}}active{{/if}}" id="structured" role="tabpanel">
-      <form class="form-inline" role="search" accept-charset="UTF-8" action="">
-        <input name="street" type="text" class="form-control form-control-sm mr-1"
-               placeholder="House number/Street"
-               value="{{hStructured.street}}" />
-        <input name="city" type="text" class="form-control form-control-sm mr-1"
-               placeholder="City"
-               value="{{hStructured.city}}" />
-        <input id="county" name="county" type="text" class="form-control form-control-sm mr-1"
-               placeholder="County"
-               value="{{hStructured.county}}" />
-        <input name="state" type="text" class="form-control form-control-sm mr-1"
-               placeholder="State"
-               value="{{hStructured.state}}" />
-        <input name="country" type="text" class="form-control form-control-sm mr-1"
-               placeholder="Country"
-               value="{{hStructured.country}}" />
-        <input name="postalcode" type="text" class="form-control form-control-sm mr-1"
-               placeholder="Postal Code"
-               value="{{hStructured.postalcode}}" />
-
-        <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>
-        </div>
-      </form>
-    </div>
-  </div> <!-- /tab-content -->
-</div> <!-- /top-bar -->
-
-<div id="content">
-
-  {{#if sQuery}}
-    <div id="searchresults" class="sidebar">
-      {{#each aSearchResults as |aResult|}}
-        {{>partial_one_result iResNum=@index aResult=aResult env=env}}
-      {{/each}}
-
-      {{#if aSearchResults}}
-        {{#if sMoreURL}}
-          <div class="more">
-            <a class="btn btn-primary" href="{{sMoreURL}}">
-              Search for more results
-            </a>
-          </div>
-        {{/if}}
-      {{else}}
-        <div class="noresults">No search results found</div>
-      {{/if}}
-    </div>
-
-  {{else}}
-
-    <div id="intro" class="sidebar">
-      <h2>Welcome to Nominatim</h2>
-
-      <p>
-        Nominatim is a search engine for
-        <a href="https://www.openstreetmap.org">OpenStreetMap</a> data. This
-        is the debugging interface. You may search for a name or address
-        (forward search) or look up data by its geographic coordinate (reverse
-        search). Each result comes with a link to a details page where you
-        can inspect what data about the object is saved in the database and
-        investigate how the address of the object has been computed.
-      </p>
-
-      For more information visit the
-      <a href="https://nominatim.org">Nominatim home page</a>.
-    </div>
-
-  {{/if}}
-
-  <div id="map-wrapper">
-    <div id="map-position">
-      <div id="map-position-inner"></div>
-      <div id="map-position-close"><a href="#">hide</a></div>
-    </div>
-    <div id="map"></div>
-  </div>
-</div>
index 5eabed97a78255b58dc03463e8508efb1b30fe81..ab814d77ed45f6b908718319bc327b807bebf63f 100755 (executable)
@@ -50,6 +50,17 @@ footer p {
   margin: 1em;
 }
 
+#loading {
+  display: none;
+  position: absolute;
+  top: 0;
+  width: 100%;
+  background-color: #eee;
+  z-index: 100;
+  padding: 10px;
+  text-align: center;
+}
+
 #error-overlay {
   text-align: center;
   font-style: italic;
index c7ae6f922772a36237b00c53066405b539cee635..4ff6b2377dd6f5929c5347763ec82ea78ac7a875 100644 (file)
@@ -131,14 +131,17 @@ function hide_error() {
 }
 
 
-$(document).ajaxError(function (event, jqXHR, ajaxSettings/* , thrownError */) {
-  // console.log(thrownError);
-  // console.log(ajaxSettings);
-  var url = ajaxSettings.url;
-  show_error('Error fetching results from <a href="' + url + '">' + url + '</a>');
-});
-
-
 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 <a href="' + url + '">' + url + '</a>');
+  });
 });
diff --git a/src/assets/js/controller.js b/src/assets/js/controller.js
new file mode 100644 (file)
index 0000000..3c122ee
--- /dev/null
@@ -0,0 +1,50 @@
+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();
+    }
+  }
+
+  parse_url_and_load_page();
+
+  // load page after form submit
+  $(document).on('submit', 'form', function (e) {
+    e.preventDefault();
+
+    window.history.pushState(myhistory, '', '?' + $(this).serialize());
+
+    parse_url_and_load_page();
+  });
+
+  // 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;
+
+    e.preventDefault();
+
+    window.history.pushState(myhistory, '', target_url);
+
+    parse_url_and_load_page();
+  });
+
+  // deal with back-button and other user action
+  window.onpopstate = function () {
+    parse_url_and_load_page();
+  };
+});
+
index 308b70c6dbf023a0f459626e10b1eb538d5ff262..1dc8f0ece7ac7b1df12f9be0d6d0607d75fb8ddf 100644 (file)
@@ -2,8 +2,7 @@
 // DELETABLE PAGE
 // *********************************************************
 
-jQuery(document).ready(function () {
-  if (!$('#deletable-page').length) { return; }
+function deletable_page_load() {
 
   var api_request_params = {
     format: 'json'
@@ -17,4 +16,4 @@ jQuery(document).ready(function () {
 
     update_data_date();
   });
-});
+}
index 919e19a4dcaa074a572d78c83548edb8308f0497..23447e96cc98d09224d270d0c0971c24fc9539e4 100644 (file)
@@ -54,8 +54,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');
@@ -111,4 +110,4 @@ jQuery(document).ready(function () {
       alert('invalid input');
     }
   });
-});
+}
index 3ccaf1132b88c93b73b87cb1f3fa2dd5f04eefc0..94706491df03b4e8223a5bf4257627139ffd333d 100644 (file)
@@ -2,9 +2,8 @@
 // BROKEN POLYGON PAGE
 // *********************************************************
 
-jQuery(document).ready(function () {
-  if (!$('#polygons-page').length) { return; }
-
+function polygons_page_load() {
+  //
   var api_request_params = {
     format: 'json'
   };
@@ -17,4 +16,4 @@ jQuery(document).ready(function () {
 
     update_data_date();
   });
-});
+}
index a315338d989db38139f7779127b7fb8bf2416422..be9c20a3e48d30f7dfa60ba57dda72eacf155091 100755 (executable)
@@ -292,12 +292,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);
 
@@ -452,4 +449,6 @@ jQuery(document).ready(function () {
       );
     }
   }
-});
+}
+
+
index ce8fc70e9941014a24094767a5d595901392b0a5..836eddc608ea6689f77f2aeabb1e72f5cfbd3ade 100644 (file)
@@ -17,9 +17,7 @@
 </head>
 <body id="BODYID">
 
-  <div id="error-overlay">
-    You need Javascript enabled to view this page.
-  </div>
+  <div id="error-overlay"></div>
 
   <header class="container-fluid">
     <div class="row">
@@ -32,6 +30,7 @@
         </div>
       </div>
       <div id="last-updated" class="col-4 text-center">
+        <div id="loading">loading...</div>
         Data from <a id="api-request-link" href="">API request</a>
         <br>
         Data last updated: