2   import { fetch_from_api, update_html_title } from '../lib/api_utils.js';
 
   3   import { page } from '../lib/stores.js';
 
   6     osmLink, wikipediaLink, coverageType, isAdminBoundary,
 
   7     formatAddressRank, formatKeywordToken, formatOSMType
 
   8   } from '../lib/helpers.js';
 
   9   import Header from '../components/Header.svelte';
 
  10   import MapIcon from '../components/MapIcon.svelte';
 
  11   import SearchSectionDetails from '../components/SearchSectionDetails.svelte';
 
  12   import DetailsOneRow from '../components/DetailsOneRow.svelte';
 
  13   import DetailsLink from '../components/DetailsLink.svelte';
 
  14   import DetailsPostcodeHint from '../components/DetailsPostcodeHint.svelte';
 
  15   import InfoRow from '../components/DetailsInfoRow.svelte';
 
  16   import InfoRowList from '../components/DetailsInfoRowList.svelte';
 
  17   import Map from '../components/Map.svelte';
 
  21   let api_request_params;
 
  22   let api_request_finished = false;
 
  24   function loaddata(search_params) {
 
  25     api_request_params = {
 
  26       place_id: search_params.get('place_id'),
 
  27       osmtype: search_params.get('osmtype'),
 
  28       osmid: search_params.get('osmid'),
 
  29       class: search_params.get('class'),
 
  30       keywords: search_params.get('keywords'),
 
  32       hierarchy: (search_params.get('hierarchy') === '1' ? 1 : 0),
 
  37     api_request_finished = false;
 
  39     if (api_request_params.place_id || (api_request_params.osmtype && api_request_params.osmid)) {
 
  41       if (api_request_params.place_id) {
 
  42         update_html_title('Details for ' + api_request_params.place_id);
 
  44         update_html_title('Details for ' + api_request_params.osmtype + api_request_params.osmid);
 
  47       fetch_from_api('details', api_request_params, function (data) {
 
  48         window.scrollTo(0, 0);
 
  49         api_request_finished = true;
 
  50         aPlace = (data && !data.error) ? data : undefined;
 
  57   function place_has_keywords(aThisPlace) {
 
  58     // Return false if Nominatim API sends 'keywords: { name: [], address: [] }'
 
  60       aThisPlace.keywords && aThisPlace.keywords.name && aThisPlace.keywords.address
 
  61       && (aThisPlace.keywords.name.length > 0 || aThisPlace.keywords.address.length > 0)
 
  67     if (pageinfo.tab === 'details') {
 
  68       loaddata(pageinfo.params);
 
  69       base_url = window.location.search;
 
  72   $: reverse_only = Nominatim_Config.Reverse_Only;
 
  76   <SearchSectionDetails api_request_params={api_request_params}/>
 
  79 <div class="container">
 
  82       <div class="col-sm-10">
 
  84           {aPlace.localname || `${formatOSMType(aPlace.osm_type)} ${aPlace.osm_id}` }
 
  85           <small><DetailsLink feature={aPlace}>link to this page</DetailsLink></small>
 
  88       <div class="col-sm-2 text-end">
 
  89         <MapIcon aPlace={aPlace} />
 
  93       <div class="col-md-6">
 
  94         <table id="locationdetails" class="table table-striped table-responsive">
 
  96             <InfoRow title="Name">
 
  97             {#if (Array.isArray(aPlace.names)) }
 
  98               <span class="noname fw-bold">No Name</span>
 
 100               <InfoRowList items={aPlace.names} />
 
 103             <InfoRow title="Type">{aPlace.category}:{aPlace.type}</InfoRow>
 
 104             <InfoRow title="Last Updated">{aPlace.indexed_date}</InfoRow>
 
 105             {#if (isAdminBoundary(aPlace)) }
 
 106               <InfoRow title="Admin Level">{aPlace.admin_level}</InfoRow>
 
 108             <InfoRow title="Search Rank">{aPlace.rank_search}</InfoRow>
 
 109             <InfoRow title="Address Rank">
 
 110               {aPlace.rank_address} ({formatAddressRank(aPlace.rank_address)})
 
 112             {#if aPlace.calculated_importance}
 
 113               <InfoRow title="Importance">
 
 114                   {aPlace.calculated_importance}
 
 115                   {#if !aPlace.importance} (estimated){/if}
 
 118             <InfoRow title="Coverage">{coverageType(aPlace)}</InfoRow>
 
 119             <InfoRow title="Centre Point (lat,lon)">
 
 120                 {aPlace.centroid.coordinates[1]},{aPlace.centroid.coordinates[0]}
 
 122             <!-- eslint-disable-next-line svelte/no-at-html-tags -->
 
 123             <InfoRow title="OSM">{@html osmLink(aPlace)}</InfoRow>
 
 124             <InfoRow title="Place Id">
 
 126                (<a href="https://nominatim.org/release-docs/develop/api/Output/#place_id-is-not-a-persistent-id">
 
 130             {#if aPlace.calculated_wikipedia}
 
 131               <!-- eslint-disable-next-line svelte/no-at-html-tags -->
 
 132               <InfoRow title="Wikipedia Calculated">{@html wikipediaLink(aPlace)}</InfoRow>
 
 134             <InfoRow title="Computed Postcode">
 
 135               {#if aPlace.calculated_postcode}
 
 136                 {aPlace.calculated_postcode}
 
 137                 <DetailsPostcodeHint postcode={aPlace.calculated_postcode}
 
 138                                      lat={aPlace.centroid.coordinates[1]}
 
 139                                      lon={aPlace.centroid.coordinates[0]} />
 
 142             <InfoRow title="Address Tags"><InfoRowList items={aPlace.addresstags} /></InfoRow>
 
 143             <InfoRow title="Extra Tags"><InfoRowList items={aPlace.extratags} /></InfoRow>
 
 147       <div class="col-md-6">
 
 148         <div id="map-wrapper">
 
 149           <Map current_result={aPlace} />
 
 154       <div class="col-md-12">
 
 156          <table id="address" class="table table-striped table-small">
 
 162               <th>Address rank</th>
 
 170               {#each aPlace.address as addressLine}
 
 171                 <DetailsOneRow addressLine={addressLine}
 
 172                                bMarkUnusedLines={true}
 
 173                                bDistanceInMeters={false} />
 
 177             {#if aPlace.linked_places}
 
 178               <tr class="all-columns"><td colspan="7"><h2>Linked Places</h2></td></tr>
 
 179               {#each aPlace.linked_places as addressLine}
 
 180                 <DetailsOneRow addressLine={addressLine}
 
 181                                bMarkUnusedLines={true}
 
 182                                bDistanceInMeters={true} />
 
 187               <tr class="all-columns"><td colspan="7"><h2>Keywords</h2></td></tr>
 
 188               {#if api_request_params.keywords}
 
 190                 {#if place_has_keywords(aPlace)}
 
 191                   <tr class="all-columns"><td colspan="7"><h3>Name Keywords</h3></td></tr>
 
 192                   {#each aPlace.keywords.name as keyword}
 
 194                       <td>{formatKeywordToken(keyword.token)}</td>
 
 196                         <td>word id: {keyword.id}</td>
 
 201                   {#if aPlace.keywords.address}
 
 202                     <tr class="all-columns"><td colspan="7"><h3>Address Keywords</h3></td></tr>
 
 203                     {#each aPlace.keywords.address as keyword}
 
 205                         <td>{formatKeywordToken(keyword.token)}</td>
 
 207                           <td>word id: {keyword.id}</td>
 
 213                   <tr><td>Place has no keywords</td></tr>
 
 218                      <a class="btn btn-outline-secondary btn-sm"
 
 219                       href="{base_url}&keywords=1">display keywords</a>
 
 225             <tr class="all-columns"><td colspan="7"><h2>Parent Of</h2></td></tr>
 
 226             {#if api_request_params.hierarchy}
 
 227               {#if aPlace.hierarchy && typeof (aPlace.hierarchy) === 'object'
 
 228                 && Object.keys(aPlace.hierarchy).length}
 
 229                 {#each Object.keys(aPlace.hierarchy) as type}
 
 230                   <tr class="all-columns"><td colspan="7"><h3>{type}</h3></td></tr>
 
 231                   {#each aPlace.hierarchy[type] as line}
 
 232                     <DetailsOneRow addressLine={line} bDistanceInMeters={true} />
 
 236                 {#if Object.keys(aPlace.hierarchy) > 500}
 
 237                   <p>There are more child objects which are not shown.</p>
 
 240                 <tr><td>Place is not parent of other places</td></tr>
 
 245                    <a class="btn btn-outline-secondary btn-sm"
 
 246                     href="{base_url}&hierarchy=1">display child places</a>
 
 254   {:else if (window.location.search !== '' && api_request_finished)}
 
 267   h1 small :global(a) {
 
 275     background-color: white;
 
 283     background-color: white !important;
 
 287     border-top: none !important;
 
 288     padding-left: 0 !important;
 
 290   :global(span.noname){
 
 299     border: 1px solid #666;