diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2019-11-25 21:18:57 +0100 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2019-11-25 21:18:57 +0100 | 
| commit | 4f0fee7783d3919110287ee9edd0c3a86e961814 (patch) | |
| tree | 5080e355e0f1d268c526073b0a12b84aff6295cd | |
| parent | 613f7d6087ab62f9fd36d3cb2c42da1f91ebb48e (diff) | |
show cancelled trains in connections list
| -rwxr-xr-x | lib/Travelynx.pm | 51 | ||||
| -rw-r--r-- | templates/_connections.html.ep | 49 | 
2 files changed, 79 insertions, 21 deletions
| diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index a07d851..1c5b449 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -2276,6 +2276,7 @@ sub startup {  			  map { [ $_, $_->departure ? $_->departure->epoch : 0 ] }  			  @{ $stationboard->{results} };  			my @results; +			my @cancellations;  			my %via_count = map { $_ => 0 } @destinations;  			for my $train ( @{ $stationboard->{results} } ) {  				if ( not $train->departure ) { @@ -2291,14 +2292,43 @@ sub startup {  				{  					next;  				} -				my @via = ( $train->route_post, $train->route_end ); -				for my $dest (@destinations) { -					if ( $via_count{$dest} < 2 -						and List::Util::any { $_ eq $dest } @via ) -					{ -						push( @results, [ $train, $dest ] ); -						$via_count{$dest}++; -						next; + +             # In general, this function is meant to return feasible +             # connections. However, cancelled connections may also be of +             # interest and are also useful for logging cancellations. +             # To satisfy both demands with (hopefully) little confusion and +             # UI clutter, this function returns two concatenated arrays: +             # actual connections (ordered by actual departure time) followed +             # by cancelled connections (ordered by scheduled departure time). +             # This is easiest to achieve in two separate loops. +             # +             # Note that a cancelled train may still have a matching destination +             # in its route_post, e.g. if it leaves out $ds100 due to +             # unscheduled route changes but continues on schedule afterwards +             # -- so it is only cancelled at $ds100, not on the remainder of +             # the route. Also note that this specific case is not yet handled +             # properly by the cancellation logic etc. + +				if ( $train->departure_is_cancelled ) { +					my @via +					  = ( $train->sched_route_post, $train->sched_route_end ); +					for my $dest (@destinations) { +						if ( List::Util::any { $_ eq $dest } @via ) { +							push( @cancellations, [ $train, $dest ] ); +							next; +						} +					} +				} +				else { +					my @via = ( $train->route_post, $train->route_end ); +					for my $dest (@destinations) { +						if ( $via_count{$dest} < 2 +							and List::Util::any { $_ eq $dest } @via ) +						{ +							push( @results, [ $train, $dest ] ); +							$via_count{$dest}++; +							next; +						}  					}  				}  			} @@ -2311,8 +2341,11 @@ sub startup {  					$_->[0]->departure->epoch // $_->[0]->sched_departure->epoch  				]  			  } @results; +			@cancellations = map { $_->[0] } +			  sort { $a->[1] <=> $b->[1] } +			  map { [ $_, $_->[0]->sched_departure->epoch ] } @cancellations; -			return @results; +			return ( @results, @cancellations );  		}  	); diff --git a/templates/_connections.html.ep b/templates/_connections.html.ep index f1d8c2b..a30e896 100644 --- a/templates/_connections.html.ep +++ b/templates/_connections.html.ep @@ -1,28 +1,42 @@  <div class="hide-on-med-and-up"><table class="striped"><tbody>  	% for my $res (@{$connections}) {  		% my ($train, $via) = @{$res}; +		% my $td_class = ''; +		% my $link_class = 'action-checkin'; +		% if ($train->is_cancelled) { +			% $td_class = 'cancelled'; +			% $link_class = 'action-cancelled-from'; +		% }  		<tr> -			<td> +			<td class="<%= $td_class %>">  				% if ($checkin_from) { -					<a class="action-checkin" data-station="<%= $train->station_uic %>" data-train="<%= $train->train_id %>" data-dest="<%= $via %>"><%= $train->line %></a> +					<a class="<%= $link_class %>" data-station="<%= $train->station_uic %>" data-train="<%= $train->train_id %>" data-dest="<%= $via %>"><%= $train->line %></a>  				% }  				% else {  					%= $train->line  				% }  			</td> -			<td> +			<td class="<%= $td_class %>">  				% if ($checkin_from) { -					<a class="action-checkin" data-station="<%= $train->station_uic %>" data-train="<%= $train->train_id %>" data-dest="<%= $via %>"><%= $via %></a> +					<a class="<%= $link_class %>" data-station="<%= $train->station_uic %>" data-train="<%= $train->train_id %>" data-dest="<%= $via %>"><%= $via %></a>  				% }  				% else {  					%= $via  				% }  			</td> -			<td><%= $train->departure->strftime('%H:%M') %> -				% if ($train->departure_delay) { -					%= sprintf('(%+d)', $train->departure_delay) +			<td> +				% if ($train->departure_is_cancelled) { +					%= $train->sched_departure->strftime('%H:%M') +					⊖  				% } -				<br/>Gleis <%= $train->platform || '?' %></td> +				% else { +					%= $train->departure->strftime('%H:%M') +					% if ($train->departure_delay) { +						%= sprintf('(%+d)', $train->departure_delay) +					% } +					<br/>Gleis <%= $train->platform || '?' %> +				% } +			</td>  		</tr>  	% }  </tbody></table></div> @@ -52,11 +66,22 @@  					%= $via  				% }  			</td> -			<td><%= $train->departure->strftime('%H:%M') %> -				% if ($train->departure_delay) { -					%= sprintf('(%+d)', $train->departure_delay) +			<td> +				% if ($train->departure_is_cancelled) { +					%= $train->sched_departure->strftime('%H:%M') +					(fällt aus) +				% } +				% else { +					%= $train->departure->strftime('%H:%M') +					% if ($train->departure_delay) { +						%= sprintf('(%+d)', $train->departure_delay) +					% }  				% } -			</td><td>Gleis <%= $train->platform || '?' %></td> +			</td><td> +				% if (not $train->departure_is_cancelled) { +					Gleis <%= $train->platform || '?' %> +				% } +			</td>  		</tr>  	% }  </tbody></table></div> | 
