]> git.openstreetmap.org Git - nominatim-ui.git/blobdiff - src/components/LastUpdated.svelte
replace httpbin with beeceptor for mocking HTTP error codes
[nominatim-ui.git] / src / components / LastUpdated.svelte
index f2699031779216696dd492b7536d0d746fcf1374..08be5d9aa54b3b51692c5166958ba65a4441c350 100644 (file)
@@ -1,47 +1,73 @@
 <script>
+  import PageLink from './PageLink.svelte';
+  import * as timeago from 'timeago.js';
   import { last_api_request_url_store } from '../lib/stores.js';
   import { fetch_from_api } from '../lib/api_utils.js';
 
   let last_updated_date;
   let last_api_request_url;
+  let fetch_running = false; // prevent multiple parallel fetch runs
 
   last_api_request_url_store.subscribe(url => {
     last_api_request_url = url;
+
+    if (last_api_request_url) {
+      last_api_request_url = new URL(last_api_request_url, window.location.origin);
+      last_api_request_url.searchParams.delete('polygon_geojson');
+      last_api_request_url = last_api_request_url.toString();
+    }
+
+    if (fetch_running || last_updated_date) return;
+
+    fetch_running = true;
+
     fetch_from_api('status', { format: 'json' }, function (data) {
       last_updated_date = data.data_updated;
+      fetch_running = false;
     });
   });
 </script>
 
 <style>
   #last-updated {
-    font-size: 0.7em;
-    white-space: nowrap;
-    text-align: center;
+    position: relative;
+    font-size: 0.8rem;
+    font-style: italic;
   }
   #loading {
     display: none;
     position: absolute;
+    padding: 0.5em 1em;
     top: 0;
+    left: 0;
     width: 100%;
     background-color: #eee;
     z-index: 100;
-    padding: 10px;
-    text-align: center;
   }
 </style>
 
-<div id="last-updated">
-  <div id="loading">loading...</div>
-  {#if last_updated_date}
-    {#if last_api_request_url}
-      <div id="api-request">
-        Data from <a href="{last_api_request_url}">API request</a>
-        <span id="api-request-debug">
-          (<a href="{last_api_request_url}&debug=1">debug output</a>)
-        </span>
-      </div>
-    {/if}
-    Data last updated: <span id="data-date">{last_updated_date}</span>
-  {/if}
+<div id="last-updated" class="container-fluid py-2 px-4 mb-3">
+  <div id="loading" class="py-2 px-4">
+    <div class="spinner-border spinner-border-sm text-primary me-1" role="status"></div>
+    Loading data from API ...
+  </div>
+  <div class="row">
+    <div class="col-sm-6">
+      {#if last_api_request_url}
+        <div id="api-request">
+          Data from <a href="{last_api_request_url}">API request</a>
+          <span id="api-request-debug">
+            (<a href="{last_api_request_url}&debug=1">debug output</a>)
+          </span>
+        </div>
+      {/if}
+    </div>
+    <div class="col-sm-6 text-end">
+      {#if last_updated_date}
+        Data last updated:
+        <abbr id="data-date" title="{last_updated_date} (UTC timezone)">{timeago.format(new Date(last_updated_date))}</abbr>
+      {/if}
+      (<PageLink page="status">Details</PageLink>)
+    </div>
+  </div>
 </div>