]> git.openstreetmap.org Git - nominatim-ui.git/commitdiff
when searching for OSM Url, show detail page result page
authormarc tobias <mtmail@gmx.net>
Sun, 11 Dec 2022 02:36:26 +0000 (03:36 +0100)
committermtmail <mtmail@gmx.net>
Sun, 11 Dec 2022 13:02:08 +0000 (14:02 +0100)
src/lib/helpers.js
src/lib/stores.js
test/search.js
test/unit/helpers.js

index dfe4cedc760229c65a068030287539d442eb9aeb..023da0920b417a5f3c700f1737e7d4afd83903fe 100644 (file)
@@ -13,6 +13,15 @@ export function formatOSMType(sType, bExcludeExternal) {
   return '';
 }
 
+// https://www.openstreetmap.org/relation/123 => ['R', 123]
+// w123 => ['W', 123]
+export function identifyLinkInQuery(query) {
+  if (!query) return undefined;
+  const m = query.match(/\/(relation|way|node)\/(\d+)/) || query.match(/^([nwr])(\d+)$/i);
+  if (!m) return undefined;
+  return [m[1][0].toUpperCase(), Number(m[2])];
+}
+
 export function osmLink(aPlace) {
   if (!aPlace.osm_type) return '';
   var sOSMType = formatOSMType(aPlace.osm_type, false);
index 35344ce7cf97c2473886743c4b3b90dcc60ede69..5e755c1eddfa9c36046e560b121356e81b67a257 100644 (file)
@@ -1,4 +1,5 @@
 import { writable } from 'svelte/store';
+import { identifyLinkInQuery } from './helpers.js';
 
 export const map_store = writable();
 export const results_store = writable();
@@ -54,6 +55,16 @@ export function refresh_page(pagename, params) {
     }
   }
 
+  if (pagename === 'search' && params.has('q')) {
+    const arrTypeAndId = identifyLinkInQuery(params.get('q'));
+    if (arrTypeAndId instanceof Array) {
+      pagename = 'details';
+      params = new URLSearchParams();
+      params.set('osmtype', arrTypeAndId[0]);
+      params.set('osmid', arrTypeAndId[1]);
+    }
+  }
+
   page.set({ tab: pagename, params: params });
   last_api_request_url_store.set(null);
   error_store.set(null);
index b398b0d5d2f009f9bf2de9fdc31f02962edbf825..3470814676d4d9e2a5912fc75433ddef8e70dca8 100644 (file)
@@ -143,4 +143,23 @@ describe('Search Page', function () {
       assert.ok(page_header.includes('Paris'));
     });
   });
+
+  describe('Search for OSM URL', function () {
+    before(async function () {
+      page = await browser.newPage();
+      await page.goto('http://localhost:9999/search.html');
+      await page.type('input[name=q]', 'https://www.openstreetmap.org/relation/3459013#map=11/41.2388/-8.3867');
+      await page.click('button[type=submit]');
+      await page.waitForSelector('table#address');
+    });
+
+    after(async function () {
+      await page.close();
+    });
+
+    it('should redirect to detail page search', async function () {
+      assert.equal(await page.title(), 'Details for R3459013 | Nominatim Demo');
+      assert.ok((await page.$eval('.container h1', el => el.textContent)).includes('Porto'));
+    });
+  });
 });
index cea1512e23f5ad68459fb63d3f5a331982d4fba6..ed57c03c95f862c1c68050533f49260c6184fbee 100644 (file)
@@ -1,8 +1,17 @@
 import assert from 'assert';
-import { formatLabel, wikipediaLink } from '../../src/lib/helpers.js';
+import { identifyLinkInQuery, formatLabel, wikipediaLink } from '../../src/lib/helpers.js';
 
 describe('Helpers', function () {
 
+  it('.identifyLinkInQuery', function () {
+    assert.equal(identifyLinkInQuery(''), undefined);
+    assert.equal(identifyLinkInQuery('http://example.com'), undefined);
+
+    assert.deepStrictEqual(identifyLinkInQuery('https://www.openstreetmap.org/relation/1234#map=11/41.2388/-8.3867'), ['R', 1234]);
+    assert.deepStrictEqual(identifyLinkInQuery('n1234'), ['N', 1234]);
+    assert.deepStrictEqual(identifyLinkInQuery('W1234'), ['W', 1234]);
+  });
+
   it('.formatLabel', function () {
     // not enough data
     assert.equal(formatLabel({}), '');