From 07c71449c320decb58070066f376313e3375130f Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Sun, 23 Apr 2017 21:31:36 +0000
Subject: [PATCH] Replace popup with right pane

---
 index.js   |   26 ------
 map.js     |   80 ++++++++++---------
 common.js  |   26 ++++++
 lang_en.js |    4 +
 map.html   |    2 
 lang_pl.js |    4 +
 map.css    |   58 +++++++++++++-
 7 files changed, 129 insertions(+), 71 deletions(-)

diff --git a/common.js b/common.js
index 1d91ce0..4ec77f3 100644
--- a/common.js
+++ b/common.js
@@ -144,6 +144,32 @@
 	}
 }
 
+function displayVehicle(vehicleInfo) {
+	if(!vehicleInfo) return document.createTextNode('');
+	
+	var span = document.createElement('span');
+	span.className = 'vehicleInfo';
+	
+	var floor_type = '';
+	if(vehicleInfo.low == 0) {
+		setText(span, lang.high_floor_sign);
+		floor_type = lang.high_floor;
+	} else if(vehicleInfo.low == 1) {
+		setText(span, lang.partially_low_floor_sign);
+		floor_type = lang.partially_low_floor;
+	} else if(vehicleInfo.low == 2) {
+		setText(span, lang.low_floor_sign);
+		floor_type = lang.low_floor;
+	}
+	
+	span.title = lang.tram_type_pattern
+		.replace('$num', vehicleInfo.num)
+		.replace('$type', vehicleInfo.type)
+		.replace('$floor', floor_type);
+	
+	return span;
+}
+
 // Element mangling
 function deleteChildren(element) {
 	while(element.lastChild) element.removeChild(element.lastChild);
diff --git a/index.js b/index.js
index 551d035..de7a2c8 100644
--- a/index.js
+++ b/index.js
@@ -87,32 +87,6 @@
 	return lang.time_minutes_prefix + ((actual.getTime() - planned.getTime()) / 1000 / 60) + lang.time_minutes_suffix;
 }
 
-function displayVehicle(vehicleInfo) {
-	if(!vehicleInfo) return document.createTextNode('');
-	
-	var span = document.createElement('span');
-	span.className = 'vehicleInfo';
-	
-	var floor_type = '';
-	if(vehicleInfo.low == 0) {
-		setText(span, lang.high_floor_sign);
-		floor_type = lang.high_floor;
-	} else if(vehicleInfo.low == 1) {
-		setText(span, lang.partially_low_floor_sign);
-		floor_type = lang.partially_low_floor;
-	} else if(vehicleInfo.low == 2) {
-		setText(span, lang.low_floor_sign);
-		floor_type = lang.low_floor;
-	}
-	
-	span.title = lang.tram_type_pattern
-		.replace('$num', vehicleInfo.num)
-		.replace('$type', vehicleInfo.type)
-		.replace('$floor', floor_type);
-	
-	return span;
-}
-
 function fail(message, more) {
 	if(times_timer) clearTimeout(times_timer);
 	
diff --git a/lang_en.js b/lang_en.js
index e527968..7dce3fc 100644
--- a/lang_en.js
+++ b/lang_en.js
@@ -38,6 +38,10 @@
 	time_minutes_ago_prefix: '',
 	time_minutes_ago_suffix: ' min ago',
 	
+	type_vehicle: 'Vehicle',
+	type_stop: 'Stop',
+	type_stoppoint: 'Stop point',
+	
 	tram_type_pattern: '$num $type ($floor)',
 	high_floor: 'high floor',
 	high_floor_sign: '\u2010\u00A0',
diff --git a/lang_pl.js b/lang_pl.js
index f343603..ddb1f30 100644
--- a/lang_pl.js
+++ b/lang_pl.js
@@ -38,6 +38,10 @@
 	time_minutes_ago_prefix: '',
 	time_minutes_ago_suffix: ' min temu',
 	
+	type_vehicle: 'Pojazd',
+	type_stop: 'Przystanek',
+	type_stoppoint: 'Punkt przystankowy',
+	
 	tram_type_pattern: '$num $type ($floor)',
 	high_floor: 'wysokopodłogowy',
 	high_floor_sign: '\u2010\u00A0',
diff --git a/map.css b/map.css
index e497aec..a6e04f6 100644
--- a/map.css
+++ b/map.css
@@ -1,25 +1,71 @@
 html, body, #map {
-	width: 100%;
-	height: 100%;
 	margin: 0;
 	font-family: sans-serif;
+	overflow: hidden;
+}
+
+#map {
+	position: absolute;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+}
+
+#map .ol-attribution {
+	left: 0;
+	right: auto;
 }
 
 #popup {
 	color: black;
 	background: white;
 	padding: 5px;
-	border: 1px solid black;
-	border-radius: 10px;
-	font-size: 12px;
+	border-left: 1px solid black;
+	font-size: 14px;
+	
+	position: absolute;
+	width: 300px;
+	right: -315px;
+	top: 0;
+	bottom: 0;
+	
+	transition: right .4s;
+	transition: width .4s;
+	
+	opacity: .8;
+}
+
+#popup.show {
+	right: 0;
+}
+
+@media (max-width: 600px) {
+	#popup {
+		width: 90%;
+		right: -100%;
+	}
+	
+	#popup.show {
+		right: 0%;
+	}
+}
+
+#popup .type {
+	padding-bottom: 0;
+	color: #444;
+	font-size: 80%;
 }
 #popup p {
 	margin: 0;
 	padding: 5px;
 }
-#popup .bold {
+#popup .name {
 	font-weight: bold;
 }
+#popup .vehicleInfo {
+	font-size: 21px;
+}
 
 #title {
 	top: .5em;
diff --git a/map.html b/map.html
index a1cf93c..ab987b6 100644
--- a/map.html
+++ b/map.html
@@ -11,8 +11,8 @@
 <div id="map">
 <div id="title" class="ol-unselectable ol-control"><a href="/">TTSS Kraków</a></div>
 <div id="fail" class="ol-unselectable ol-control"></div>
-<div id="popup"></div>
 </div>
+<div id="popup"></div>
 <script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha384-3ceskX3iaEnIogmQchP8opvBy3Mi7Ce34nWjpBIwVTHfGYWQS9jwHDVRnpKKHJg7" crossorigin="anonymous"></script>
 <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList"></script>
 <script src="https://openlayers.org/en/v4.1.0/build/ol.js" integrity="sha384-FkrvSU9IkctjoF6eTvw82jZvg4Rn04zw5X2nCQnYF+vT8IbAY+DJ23IIoaVDtiMe" crossorigin="anonymous"></script>
diff --git a/map.js b/map.js
index f19bd45..fb460e8 100644
--- a/map.js
+++ b/map.js
@@ -14,10 +14,10 @@
 var stop_points_source = null;
 var stop_points_layer = null;
 
+var feature_id = null;
+
 var map = null;
-var popup_feature_id = null;
 var popup_element = document.getElementById('popup');
-var popup = null;
 var fail_element = document.getElementById('fail');
 
 var ignore_hashchange = false;
@@ -42,20 +42,8 @@
 	}
 }
 
-function popupHide() {
-	popup.setPosition(undefined);
-	popup_feature_id = null;
-}
-
-function popupShow(coordinates, id) {
-	popup.setPosition(coordinates);
-	if(id) {
-		popup_feature_id = id;
-	}
-}
-
 function getGeometry(object) {
-	return new ol.geom.Point(ol.proj.fromLonLat([object.longitude / 3600000.0, object.latitude / 3600000.0]))
+	return new ol.geom.Point(ol.proj.fromLonLat([object.longitude / 3600000.0, object.latitude / 3600000.0]));
 }
 
 function updateVehicles() {
@@ -77,8 +65,8 @@
 			if(vehicle.isDeleted) {
 				if(vehicle_feature) {
 					vehicles_source.removeFeature(vehicle_feature);
-					if(popup_feature_id == vehicle_feature.getId()) {
-						popupHide();
+					if(feature_id == vehicle_feature.getId()) {
+						featureClicked();
 					}
 				}
 				continue;
@@ -128,10 +116,6 @@
 			} else {
 				vehicle_feature.setProperties(vehicle);
 				vehicle_feature.getStyle().getImage().setRotation(Math.PI * parseFloat(vehicle.heading) / 180.0);
-				
-				if(popup_feature_id == vehicle_feature.getId()) {
-					popupShow(vehicle_feature.getGeometry().getCoordinates());
-				}
 			}
 		}
 		
@@ -193,7 +177,9 @@
 
 function featureClicked(feature) {
 	if(!feature) {
-		popupHide();
+		feature_id = null;
+		
+		$(popup_element).removeClass('show');
 		
 		ignore_hashchange = true;
 		window.location.hash = '';
@@ -205,20 +191,49 @@
 	
 	deleteChildren(popup_element);
 	
-	addParaWithText(popup_element, feature.get('name')).className = 'bold';
+	var type;
+	var name = feature.get('name');
+	var additional;
+	
 	switch(feature.getId().substr(0, 1)) {
 		case 'v':
-			var vehicle_type = parseVehicle(feature.get('id'));
-			if(vehicle_type) {
-				addParaWithText(popup_element, vehicle_type.num + ' ' + vehicle_type.type);
+			type = lang.type_vehicle;
+			
+			if(!feature.get('vehicle_type')) {
+				break;
 			}
+			
+			var span = displayVehicle(feature.get('vehicle_type'));
+			
+			additional = document.createElement('p');
+			setText(additional, span.title);
+			additional.insertBefore(span, additional.firstChild);
 		break;
+		case 's':
+			type = lang.type_stop;
+		break;
+		case 'p':
+			type = lang.type_stoppoint;
+		break;
+	}
+	
+	addParaWithText(popup_element, type).className = 'type';
+	addParaWithText(popup_element, name).className = 'name';
+	
+	if(additional) {
+		popup_element.appendChild(additional);
 	}
 	
 	ignore_hashchange = true;
 	window.location.hash = '#!' + feature.getId();
 	
-	popupShow(coordinates, feature.getId());
+	map.getView().animate({
+		center: feature.getGeometry().getCoordinates(),
+	});
+	
+	$(popup_element).addClass('show');
+	
+	feature_id = feature.getId();
 }
 
 function hash() {
@@ -260,9 +275,6 @@
 	}
 	
 	featureClicked(feature);
-	if(feature) {
-		map.getView().setCenter(feature.getGeometry().getCoordinates());
-	}
 }
 
 function init() {
@@ -298,13 +310,6 @@
 		source: vehicles_source,
 	});
 	
-	popup = new ol.Overlay({
-		element: popup_element,
-		positioning: 'bottom-center',
-		stopEvent: false,
-		offset: [0, -12]
-	});
-	
 	map = new ol.Map({
 		target: 'map',
 		layers: [
@@ -315,7 +320,6 @@
 			stop_points_layer,
 			vehicles_layer,
 		],
-		overlays: [popup],
 		view: new ol.View({
 			center: ol.proj.fromLonLat([19.94, 50.06]),
 			zoom: 13

--
Gitblit v1.9.1