From 4dd2cc9d9ef9586583ab466040d36302eb29c127 Mon Sep 17 00:00:00 2001
From: Derf Null <derf@finalrewind.org>
Date: Sun, 2 Jul 2023 10:48:34 +0200
Subject: [PATCH] show hours and minutes until arrival, not just minutes

---
 lib/Travelynx/Model/Journeys.pm       | 32 ++++++++++++++-------------
 public/static/js/travelynx-actions.js | 11 +++++++--
 templates/_checked_in.html.ep         |  3 +--
 3 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/lib/Travelynx/Model/Journeys.pm b/lib/Travelynx/Model/Journeys.pm
index b15507f8..08b3d467 100755
--- a/lib/Travelynx/Model/Journeys.pm
+++ b/lib/Travelynx/Model/Journeys.pm
@@ -51,7 +51,7 @@ sub epoch_to_dt {
 }
 
 sub min_to_human {
-	my ($minutes) = @_;
+	my ( $self, $minutes ) = @_;
 
 	my @ret;
 
@@ -1320,7 +1320,7 @@ sub compute_review {
 	$review{traveling_percentage_year}
 	  = sprintf( "%.1f%%", $min_total * 100 / 525948.77 );
 	$review{traveling_percentage_year} =~ tr{.}{,};
-	$review{traveling_time_year} = min_to_human($min_total);
+	$review{traveling_time_year} = $self->min_to_human($min_total);
 
 	if (@linetypes) {
 		$review{typical_type_1} = $linetypes[0][0];
@@ -1336,21 +1336,23 @@ sub compute_review {
 		$review{typical_stops_2} = [ $stops[0][0], $stops[1][0] ];
 	}
 	$review{typical_time}
-	  = min_to_human( $stats->{min_travel_real} / $stats->{num_trains} );
+	  = $self->min_to_human( $stats->{min_travel_real} / $stats->{num_trains} );
 	$review{typical_km}
 	  = sprintf( '%.0f', $stats->{km_route} / $stats->{num_trains} );
 	$review{typical_kmh} = sprintf( '%.0f',
 		$stats->{km_route} / ( $stats->{min_travel_real} / 60 ) );
 	$review{typical_delay_dep}
 	  = sprintf( '%.0f', $stats->{delay_dep} / $stats->{num_trains} );
-	$review{typical_delay_dep_h} = min_to_human( $review{typical_delay_dep} );
+	$review{typical_delay_dep_h}
+	  = $self->min_to_human( $review{typical_delay_dep} );
 	$review{typical_delay_arr}
 	  = sprintf( '%.0f', $stats->{delay_arr} / $stats->{num_trains} );
-	$review{typical_delay_arr_h} = min_to_human( $review{typical_delay_arr} );
+	$review{typical_delay_arr_h}
+	  = $self->min_to_human( $review{typical_delay_arr} );
 
 	if ($longest_t) {
 		$review{longest_t_time}
-		  = min_to_human( $longest_t->{rt_duration} / 60 );
+		  = $self->min_to_human( $longest_t->{rt_duration} / 60 );
 		$review{longest_t_type}   = $longest_t->{type};
 		$review{longest_t_lineno} = $longest_t->{line} // $longest_t->{no};
 		$review{longest_t_from}   = $longest_t->{from_name};
@@ -1369,7 +1371,7 @@ sub compute_review {
 
 	if ($shortest_t) {
 		$review{shortest_t_time}
-		  = min_to_human( $shortest_t->{rt_duration} / 60 );
+		  = $self->min_to_human( $shortest_t->{rt_duration} / 60 );
 		$review{shortest_t_type}   = $shortest_t->{type};
 		$review{shortest_t_lineno} = $shortest_t->{line} // $shortest_t->{no};
 		$review{shortest_t_from}   = $shortest_t->{from_name};
@@ -1391,9 +1393,9 @@ sub compute_review {
 	if ($most_delayed) {
 		$review{most_delayed_type} = $most_delayed->{type};
 		$review{most_delayed_delay_dep}
-		  = min_to_human( $most_delayed->{delay_dep} );
+		  = $self->min_to_human( $most_delayed->{delay_dep} );
 		$review{most_delayed_delay_arr}
-		  = min_to_human( $most_delayed->{delay_arr} );
+		  = $self->min_to_human( $most_delayed->{delay_arr} );
 		$review{most_delayed_lineno} = $most_delayed->{line}
 		  // $most_delayed->{no};
 		$review{most_delayed_from} = $most_delayed->{from_name};
@@ -1406,11 +1408,11 @@ sub compute_review {
 		$review{most_delay_delay_dep} = $most_delay->{delay_dep};
 		$review{most_delay_delay_arr} = $most_delay->{delay_arr};
 		$review{most_delay_sched_time}
-		  = min_to_human( $most_delay->{sched_duration} / 60 );
+		  = $self->min_to_human( $most_delay->{sched_duration} / 60 );
 		$review{most_delay_real_time}
-		  = min_to_human( $most_delay->{rt_duration} / 60 );
+		  = $self->min_to_human( $most_delay->{rt_duration} / 60 );
 		$review{most_delay_delta}
-		  = min_to_human(
+		  = $self->min_to_human(
 			( $most_delay->{rt_duration} - $most_delay->{sched_duration} )
 			/ 60 );
 		$review{most_delay_lineno} = $most_delay->{line} // $most_delay->{no};
@@ -1424,11 +1426,11 @@ sub compute_review {
 		$review{most_undelay_delay_dep} = $most_undelay->{delay_dep};
 		$review{most_undelay_delay_arr} = $most_undelay->{delay_arr};
 		$review{most_undelay_sched_time}
-		  = min_to_human( $most_undelay->{sched_duration} / 60 );
+		  = $self->min_to_human( $most_undelay->{sched_duration} / 60 );
 		$review{most_undelay_real_time}
-		  = min_to_human( $most_undelay->{rt_duration} / 60 );
+		  = $self->min_to_human( $most_undelay->{rt_duration} / 60 );
 		$review{most_undelay_delta}
-		  = min_to_human(
+		  = $self->min_to_human(
 			( $most_undelay->{sched_duration} - $most_undelay->{rt_duration} )
 			/ 60 );
 		$review{most_undelay_lineno} = $most_undelay->{line}
diff --git a/public/static/js/travelynx-actions.js b/public/static/js/travelynx-actions.js
index a9e82188..91b00095 100644
--- a/public/static/js/travelynx-actions.js
+++ b/public/static/js/travelynx-actions.js
@@ -41,12 +41,19 @@ function upd_journey_data() {
 	});
 }
 function upd_countdown() {
-	var now = Date.now() / 1000;
+	const now = Date.now() / 1000;
 	if (j_departure > now) {
 			$('.countdown').text('Abfahrt in ' + Math.round((j_departure - now)/60) + ' Minuten');
 	} else if (j_arrival > 0) {
 		if (j_arrival > now) {
-			$('.countdown').text('Ankunft in ' + Math.round((j_arrival - now)/60) + ' Minuten');
+			var diff = Math.round((j_arrival - now)/60);
+			if (diff >= 120) {
+				$('.countdown').text('Ankunft in ' + Math.floor(diff/60) + ' Stunden und ' + (diff%60) + ' Minuten');
+			} else if (diff >= 60) {
+				$('.countdown').text('Ankunft in 1 Stunde und ' + (diff%60) + ' Minuten');
+			} else {
+				$('.countdown').text('Ankunft in ' + diff + ' Minuten');
+			}
 		} else {
 			$('.countdown').text('Ziel erreicht');
 		}
diff --git a/templates/_checked_in.html.ep b/templates/_checked_in.html.ep
index 472abd2d..0deab373 100644
--- a/templates/_checked_in.html.ep
+++ b/templates/_checked_in.html.ep
@@ -40,8 +40,7 @@
 					% }
 					% elsif (defined $journey->{arrival_countdown}) {
 						% if ($journey->{arrival_countdown} > 60) {
-							Ankunft in <%= sprintf('%.f', $journey->{arrival_countdown} / 60) %>
-							Minute<%= sprintf('%.f', $journey->{arrival_countdown} / 60) == 1 ? '' : 'n' %>
+							Ankunft in <%= journeys->min_to_human(int($journey->{arrival_countdown} / 60)) %>
 						% }
 						% elsif ($journey->{arrival_countdown} > 0) {
 							Ankunft in weniger als einer Minute
-- 
GitLab