From 9f0f6af57964bf04a166009a2ea687629a4c6519 Mon Sep 17 00:00:00 2001 From: Jacek Kowalski <Jacek@jacekk.info> Date: Tue, 02 May 2017 16:08:11 +0000 Subject: [PATCH] Show list of object when ambiguous one is selected --- map.js | 116 +++++++++++++++++++++++++++++++------- lang_en.js | 1 lang_pl.js | 1 map.css | 6 +- 4 files changed, 100 insertions(+), 24 deletions(-) diff --git a/lang_en.js b/lang_en.js index 269cb14..c49a63f 100644 --- a/lang_en.js +++ b/lang_en.js @@ -43,6 +43,7 @@ type_stop: 'Stop', type_stoppoint: 'Stop point', + select_feature: 'There is more than one feature here. Select the proper one:', departures_for_stop: 'Click for stop departures (and not only this stop point).', tram_type_pattern: '$num $type ($floor)', diff --git a/lang_pl.js b/lang_pl.js index 9e9e2b6..5159b44 100644 --- a/lang_pl.js +++ b/lang_pl.js @@ -43,6 +43,7 @@ type_stop: 'Przystanek', type_stoppoint: 'Punkt przystankowy', + select_feature: 'W tym miejscu znajduje się więcej niż jeden element. Wybierz właściwy z listy:', departures_for_stop: 'Kliknij, by zobaczyć odjazdy dla całego przystanku (a nie tylko punktu przystankowego).', tram_type_pattern: '$num $type ($floor)', diff --git a/map.css b/map.css index ebf1cb5..56ca077 100644 --- a/map.css +++ b/map.css @@ -25,8 +25,8 @@ font-size: 14px; position: absolute; - width: 300px; - right: -315px; + width: 350px; + right: -365px; top: 0; bottom: 0; @@ -43,7 +43,7 @@ @media (max-width: 600px) { #popup { - width: 90%; + width: 80%; right: -100%; } diff --git a/map.js b/map.js index fa587a0..d5e037e 100644 --- a/map.js +++ b/map.js @@ -25,6 +25,7 @@ var map = null; var map_sphere = null; var popup_element = document.getElementById('popup'); +var popup_close_callback; var fail_element = document.getElementById('fail'); var ignore_hashchange = false; @@ -368,6 +369,31 @@ }).fail(fail_ajax_popup); } +function showPanel(contents, closeCallback) { + var old_callback = popup_close_callback; + popup_close_callback = null; + if(old_callback) old_callback(); + popup_close_callback = closeCallback; + + deleteChildren(popup_element); + + var close = addParaWithText(popup_element, '×'); + close.className = 'close'; + close.addEventListener('click', function() { hidePanel(); }); + + popup_element.appendChild(contents); + + $(popup_element).addClass('show'); +} + +function hidePanel() { + var old_callback = popup_close_callback; + popup_close_callback = null; + if(old_callback) old_callback(); + + $(popup_element).removeClass('show'); +} + function featureClicked(feature) { if(feature && !feature.getId()) return; @@ -375,23 +401,13 @@ route_source.clear(); if(!feature) { - feature_clicked = null; - - $(popup_element).removeClass('show'); - - ignore_hashchange = true; - window.location.hash = ''; - + hidePanel(); return; } var coordinates = feature.getGeometry().getCoordinates(); - deleteChildren(popup_element); - - var close = addParaWithText(popup_element, '×'); - close.className = 'close'; - close.addEventListener('click', function() { featureClicked(); }); + var div = document.createElement('div'); var type; var name = feature.get('name'); @@ -460,17 +476,14 @@ loader.className = 'active'; loader.colSpan = thead.childNodes.length; - addParaWithText(popup_element, type).className = 'type'; - addParaWithText(popup_element, name).className = 'name'; + addParaWithText(div, type).className = 'type'; + addParaWithText(div, name).className = 'name'; if(additional) { - popup_element.appendChild(additional); + div.appendChild(additional); } - popup_element.appendChild(table); - - ignore_hashchange = true; - window.location.hash = '#!' + feature.getId(); + div.appendChild(table); styleFeature(feature, true); @@ -478,7 +491,22 @@ center: feature.getGeometry().getCoordinates(), }) }, 10); - $(popup_element).addClass('show'); + ignore_hashchange = true; + window.location.hash = '#!' + feature.getId(); + + showPanel(div, function() { + if(!ignore_hashchange) { + ignore_hashchange = true; + window.location.hash = ''; + + feature_clicked = null; + unstyleSelectedFeatures(); + route_source.clear(); + + if(feature_xhr) feature_xhr.abort(); + if(feature_timer) clearTimeout(feature_timer); + } + }); feature_clicked = feature; } @@ -621,8 +649,50 @@ // Display popup on click map.on('singleclick', function(e) { var point = e.coordinate; - var feature = map.forEachFeatureAtPixel(e.pixel, function(feature) { return feature; }); + var features = []; + map.forEachFeatureAtPixel(e.pixel, function(feature) { if(feature.getId()) features.push(feature); }); + if(features.length > 1) { + var div = document.createElement('div'); + + addParaWithText(div, lang.select_feature); + + for(var i = 0; i < features.length; i++) { + var feature = features[i]; + + var p = document.createElement('p'); + var a = document.createElement('a'); + p.appendChild(a); + a.addEventListener('click', function(feature) { return function() { + featureClicked(feature); + }}(feature)); + + var type = ''; + switch(feature.getId().substr(0, 1)) { + case 'v': + type = lang.type_vehicle + ' ' + feature.get('vehicle_type').num; + break; + case 's': + type = lang.type_stop; + break; + case 'p': + type = lang.type_stoppoint; + break; + } + + addElementWithText(a, 'span', type).className = 'small'; + a.appendChild(document.createTextNode(' ')); + addElementWithText(a, 'span', feature.get('name')); + + div.appendChild(p); + } + + showPanel(div); + + return; + } + + var feature = features[0]; if(!feature) { if(stops_layer.getVisible()) { feature = returnClosest(point, feature, stops_source.getClosestFeatureToCoordinate(point)); @@ -641,6 +711,10 @@ featureClicked(feature); }); + + fail_element.addEventListener('click', function() { + fail_element.style.top = '-10em'; + }); // Change mouse cursor when over marker map.on('pointermove', function(e) { -- Gitblit v1.9.1