summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xlib/Travelynx.pm51
-rw-r--r--lib/Travelynx/Command/work.pm12
-rwxr-xr-xlib/Travelynx/Controller/Profile.pm28
-rwxr-xr-xlib/Travelynx/Controller/Traveling.pm15
-rw-r--r--lib/Travelynx/Model/InTransit.pm93
-rw-r--r--templates/_checked_in.html.ep37
-rw-r--r--templates/_map.html.ep20
-rw-r--r--templates/_public_status_card.html.ep31
-rw-r--r--templates/about.html.ep2
-rw-r--r--templates/changelog.html.ep35
-rw-r--r--templates/departures.html.ep10
-rw-r--r--templates/landingpage.html.ep25
-rw-r--r--templates/profile.html.ep2
-rw-r--r--templates/user_status.html.ep2
14 files changed, 236 insertions, 127 deletions
diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm
index 521ea2c..af46e5a 100755
--- a/lib/Travelynx.pm
+++ b/lib/Travelynx.pm
@@ -1478,7 +1478,17 @@ sub startup {
and $wr
and not exists $wagonorder->{error} )
{
+ my $dt
+ = $opt{datetime}->clone->set_time_zone('UTC');
$data->{wagonorder_dep} = $wagonorder;
+ $data->{wagonorder_param} = {
+ time => $dt->rfc3339 =~ s{(?=Z)}{.000}r,
+ number => $opt{train_no},
+ evaNumber => $opt{eva},
+ administrationId => 80,
+ date => $dt->strftime('%Y-%m-%d'),
+ category => $opt{train_type},
+ };
$user_data->{wagongroups} = [];
for my $group ( $wr->groups ) {
my @wagons;
@@ -1890,6 +1900,7 @@ sub startup {
uid => $uid,
db => $db,
with_data => 1,
+ with_polyline => 1,
with_timestamps => 1,
with_visibility => 1,
postprocess => 1,
@@ -2320,12 +2331,12 @@ sub startup {
my @stations = uniq_by { $_->{name} } map {
{
- name => $_->{to_name},
- latlon => $_->{to_latlon}
+ name => $_->{to_name} // $_->{arr_name},
+ latlon => $_->{to_latlon} // $_->{arr_latlon},
},
{
- name => $_->{from_name},
- latlon => $_->{from_latlon}
+ name => $_->{from_name} // $_->{dep_name},
+ latlon => $_->{from_latlon} // $_->{dep_latlon}
}
} @journeys;
@@ -2350,8 +2361,8 @@ sub startup {
for my $journey (@polyline_journeys) {
my @polyline = @{ $journey->{polyline} };
- my $from_eva = $journey->{from_eva};
- my $to_eva = $journey->{to_eva};
+ my $from_eva = $journey->{from_eva} // $journey->{dep_eva};
+ my $to_eva = $journey->{to_eva} // $journey->{arr_eva};
my $from_index
= first_index { $_->[2] and $_->[2] == $from_eva } @polyline;
@@ -2387,7 +2398,7 @@ sub startup {
or $to_index == -1 )
{
# Fall back to route
- delete $journey->{polyline};
+ push( @beeline_journeys, $journey );
next;
}
@@ -2409,6 +2420,9 @@ sub startup {
. ( $to_index - $from_index );
$seen{$key} = 1;
+ if ( $from_index > $to_index ) {
+ ( $to_index, $from_index ) = ( $from_index, $to_index );
+ }
@polyline = @polyline[ $from_index .. $to_index ];
my @polyline_coords;
for my $coord (@polyline) {
@@ -2422,13 +2436,19 @@ sub startup {
my @route = @{ $journey->{route} };
my $from_index = first_index {
- ( $_->[1] and $_->[1] == $journey->{from_eva} )
- or $_->[0] eq $journey->{from_name}
+ ( $_->[1]
+ and $_->[1]
+ == ( $journey->{from_eva} // $journey->{dep_eva} ) )
+ or $_->[0] eq
+ ( $journey->{from_name} // $journey->{dep_name} )
}
@route;
my $to_index = first_index {
- ( $_->[1] and $_->[1] == $journey->{to_eva} )
- or $_->[0] eq $journey->{to_name}
+ ( $_->[1]
+ and $_->[1]
+ == ( $journey->{to_eva} // $journey->{arr_eva} ) )
+ or $_->[0] eq
+ ( $journey->{to_name} // $journey->{arr_name} )
}
@route;
@@ -2436,15 +2456,15 @@ sub startup {
my $rename = $self->app->renamed_station;
$from_index = first_index {
( $rename->{ $_->[0] } // $_->[0] ) eq
- $journey->{from_name}
+ ( $journey->{from_name} // $journey->{dep_name} )
}
@route;
}
if ( $to_index == -1 ) {
my $rename = $self->app->renamed_station;
$to_index = first_index {
- ( $rename->{ $_->[0] } // $_->[0] ) eq
- $journey->{to_name}
+ ( $rename->{ $_->[0] } // $_->[0] ) eq
+ ( $journey->{to_name} // $journey->{arr_name} )
}
@route;
}
@@ -2467,7 +2487,8 @@ sub startup {
# and entered manually (-> beeline also shown on map, typically
# significantly differs from detailed route) -- unless the user
# sets include_manual, of course.
- if ( $journey->{edited} & 0x0010
+ if ( $journey->{edited}
+ and $journey->{edited} & 0x0010
and @route <= 2
and not $include_manual )
{
diff --git a/lib/Travelynx/Command/work.pm b/lib/Travelynx/Command/work.pm
index 2caad05..4876e98 100644
--- a/lib/Travelynx/Command/work.pm
+++ b/lib/Travelynx/Command/work.pm
@@ -134,6 +134,18 @@ sub run {
$found_arr->eva );
}
}
+ if ( $found_arr and $found_arr->is_cancelled ) {
+
+ # check out (adds a cancelled journey and resets journey state
+ # to destination selection)
+ $self->app->checkout_p(
+ station => $arr,
+ force => 0,
+ dep_eva => $dep,
+ arr_eva => $arr,
+ uid => $uid
+ )->wait;
+ }
}
)->catch(
sub {
diff --git a/lib/Travelynx/Controller/Profile.pm b/lib/Travelynx/Controller/Profile.pm
index c35642d..db30d36 100755
--- a/lib/Travelynx/Controller/Profile.pm
+++ b/lib/Travelynx/Controller/Profile.pm
@@ -111,6 +111,13 @@ sub profile {
$status->{arr_name} = undef;
}
+ my $map_data = {};
+ if ( $status->{checked_in} ) {
+ $map_data = $self->journeys_to_map_data(
+ journeys => [$status],
+ );
+ }
+
my @journeys;
if (
@@ -190,6 +197,8 @@ sub profile {
: 0,
journey => $status,
journeys => [@journeys],
+ with_map => 1,
+ %{$map_data},
}
);
}
@@ -494,6 +503,13 @@ sub user_status {
$og_data{description} = $tw_data{description} = q{};
}
+ my $map_data = {};
+ if ( $status->{checked_in} ) {
+ $map_data = $self->journeys_to_map_data(
+ journeys => [$status],
+ );
+ }
+
$self->respond_to(
json => {
json => {
@@ -516,7 +532,9 @@ sub user_status {
journey => $status,
twitter => \%tw_data,
opengraph => \%og_data,
- version => $self->app->config->{version} // 'UNKNOWN',
+ with_map => 1,
+ %{$map_data},
+ version => $self->app->config->{version} // 'UNKNOWN',
},
);
}
@@ -555,6 +573,7 @@ sub status_card {
my $status = $self->get_user_status( $user->{id} );
my $visibility;
+ my $map_data = {};
if ( $status->{checked_in} or $status->{arr_name} ) {
my $visibility = $status->{effective_visibility};
if (
@@ -579,12 +598,19 @@ sub status_card {
$status->{arr_name} = undef;
}
+ if ( $status->{checked_in} ) {
+ $map_data = $self->journeys_to_map_data(
+ journeys => [$status],
+ );
+ }
+
$self->render(
'_public_status_card',
name => $name,
privacy => $user,
journey => $status,
from_profile => $self->param('profile') ? 1 : 0,
+ %{$map_data},
);
}
diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm
index 4653043..0d89fb9 100755
--- a/lib/Travelynx/Controller/Traveling.pm
+++ b/lib/Travelynx/Controller/Traveling.pm
@@ -353,6 +353,9 @@ sub homepage {
$self->stash( timeline => [@timeline] );
my @recent_targets;
if ( $status->{checked_in} ) {
+ my $map_data = $self->journeys_to_map_data(
+ journeys => [$status],
+ );
my $journey_visibility
= $self->compute_effective_visibility(
$user->{default_visibility_str},
@@ -371,6 +374,8 @@ sub homepage {
journey_visibility => $journey_visibility,
connections_iris => $connections_iris,
connections_hafas => $connections_hafas,
+ with_map => 1,
+ %{$map_data},
);
$self->users->mark_seen( uid => $uid );
}
@@ -381,6 +386,8 @@ sub homepage {
user => $user,
user_status => $status,
journey_visibility => $journey_visibility,
+ with_map => 1,
+ %{$map_data},
);
$self->users->mark_seen( uid => $uid );
}
@@ -393,6 +400,8 @@ sub homepage {
user => $user,
user_status => $status,
journey_visibility => $journey_visibility,
+ with_map => 1,
+ %{$map_data},
);
$self->users->mark_seen( uid => $uid );
return;
@@ -431,6 +440,9 @@ sub status_card {
$self->stash( timeline => [@timeline] );
if ( $status->{checked_in} ) {
+ my $map_data = $self->journeys_to_map_data(
+ journeys => [$status],
+ );
my $journey_visibility
= $self->compute_effective_visibility(
$self->current_user->{default_visibility_str},
@@ -448,6 +460,7 @@ sub status_card {
journey_visibility => $journey_visibility,
connections_iris => $connections_iris,
connections_hafas => $connections_hafas,
+ %{$map_data},
);
}
)->catch(
@@ -456,6 +469,7 @@ sub status_card {
'_checked_in',
journey => $status,
journey_visibility => $journey_visibility,
+ %{$map_data},
);
}
)->wait;
@@ -465,6 +479,7 @@ sub status_card {
'_checked_in',
journey => $status,
journey_visibility => $journey_visibility,
+ %{$map_data},
);
}
elsif ( $status->{cancellation} ) {
diff --git a/lib/Travelynx/Model/InTransit.pm b/lib/Travelynx/Model/InTransit.pm
index 2bd3dad..a90cd08 100644
--- a/lib/Travelynx/Model/InTransit.pm
+++ b/lib/Travelynx/Model/InTransit.pm
@@ -12,11 +12,12 @@ use DateTime;
use JSON;
my %visibility_itoa = (
- 100 => 'public',
- 80 => 'travelynx',
- 60 => 'followers',
- 30 => 'unlisted',
- 10 => 'private',
+ 100 => 'public',
+ 80 => 'travelynx',
+ 60 => 'followers',
+ 30 => 'unlisted',
+ 10 => 'private',
+ default => 'default',
);
my %visibility_atoi = (
@@ -104,6 +105,7 @@ sub add {
my $persistent_data;
my $json = JSON->new;
+ my $now = DateTime->now( time_zone => 'Europe/Berlin' );
if ($train) {
@@ -115,16 +117,16 @@ sub add {
cancelled => $train->departure_is_cancelled ? 1
: 0,
checkin_station_id => $checkin_station_id,
- checkin_time => DateTime->now( time_zone => 'Europe/Berlin' ),
- dep_platform => $train->platform,
- train_type => $train->type,
- train_line => $train->line_no,
- train_no => $train->train_no,
- train_id => $train->train_id,
- sched_departure => $train->sched_departure,
- real_departure => $train->departure,
- route => $json->encode($route),
- messages => $json->encode(
+ checkin_time => $now,
+ dep_platform => $train->platform,
+ train_type => $train->type,
+ train_line => $train->line_no,
+ train_no => $train->train_no,
+ train_id => $train->train_id,
+ sched_departure => $train->sched_departure,
+ real_departure => $train->departure,
+ route => $json->encode($route),
+ messages => $json->encode(
[ map { [ $_->[0]->epoch, $_->[1] ] } $train->messages ]
),
data => JSON->new->encode(
@@ -175,16 +177,16 @@ sub add {
? 1
: 0,
checkin_station_id => $stop->loc->eva,
- checkin_time => DateTime->now( time_zone => 'Europe/Berlin' ),
- dep_platform => $stop->{platform},
- train_type => $product->type // q{},
- train_line => $product->line_no,
- train_no => $product->number // q{},
- train_id => $journey->id,
- sched_departure => $stop->{sched_dep},
- real_departure => $stop->{rt_dep} // $stop->{sched_dep},
- route => $json->encode( \@route ),
- data => JSON->new->encode(
+ checkin_time => $now,
+ dep_platform => $stop->{platform},
+ train_type => $product->type // q{},
+ train_line => $product->line_no,
+ train_no => $product->number // q{},
+ train_id => $journey->id,
+ sched_departure => $stop->{sched_dep},
+ real_departure => $stop->{rt_dep} // $stop->{sched_dep},
+ route => $json->encode( \@route ),
+ data => JSON->new->encode(
{
rt => $stop->{rt_dep} ? 1 : 0,
%{ $data // {} }
@@ -260,16 +262,16 @@ sub add {
? 1
: 0,
checkin_station_id => $stop->eva,
- checkin_time => DateTime->now( time_zone => 'Europe/Berlin' ),
- dep_platform => $stop->platform,
- train_type => $journey->type // q{},
- train_line => $line,
- train_no => $number,
- train_id => $data->{trip_id},
- sched_departure => $stop->sched_dep,
- real_departure => $stop->rt_dep // $stop->sched_dep,
- route => $json->encode( \@route ),
- data => JSON->new->encode(
+ checkin_time => $now,
+ dep_platform => $stop->platform,
+ train_type => $journey->type // q{},
+ train_line => $line,
+ train_no => $number,
+ train_id => $data->{trip_id},
+ sched_departure => $stop->sched_dep,
+ real_departure => $stop->rt_dep // $stop->sched_dep,
+ route => $json->encode( \@route ),
+ data => JSON->new->encode(
{
rt => $stop->{rt_dep} ? 1 : 0,
%{ $data // {} }
@@ -359,16 +361,14 @@ sub postprocess {
$ret->{wagongroups} = $ret->{user_data}{wagongroups};
$ret->{platform_type} = 'Gleis';
- if ( $ret->{train_type} =~ m{ ast | bus | ruf }ix ) {
+ if ( $ret->{train_type} and $ret->{train_type} =~ m{ ast | bus | ruf }ix ) {
$ret->{platform_type} = 'Steig';
}
$ret->{visibility_str}
- = $ret->{visibility}
- ? $visibility_itoa{ $ret->{visibility} }
- : 'default';
+ = $visibility_itoa{ $ret->{visibility} // 'default' };
$ret->{effective_visibility_str}
- = $visibility_itoa{ $ret->{effective_visibility} };
+ = $visibility_itoa{ $ret->{effective_visibility} // 'default' };
my @parsed_messages;
for my $message ( @{ $ret->{messages} // [] } ) {
@@ -460,7 +460,7 @@ sub get {
my $table = 'in_transit';
- if ( $opt{with_timestamps} ) {
+ if ( $opt{with_timestamps} or $opt{with_polyline} ) {
$table = 'in_transit_str';
}
@@ -474,13 +474,16 @@ sub get {
$ret = $res->hash;
}
+ if ( $opt{with_polyline} and $ret ) {
+ $ret->{dep_latlon} = [ $ret->{dep_lat}, $ret->{dep_lon} ];
+ $ret->{arr_latlon} = [ $ret->{arr_lat}, $ret->{arr_lon} ];
+ }
+
if ( $opt{with_visibility} and $ret ) {
$ret->{visibility_str}
- = $ret->{visibility}
- ? $visibility_itoa{ $ret->{visibility} }
- : 'default';
+ = $visibility_itoa{ $ret->{visibility} // 'default' };
$ret->{effective_visibility_str}
- = $visibility_itoa{ $ret->{effective_visibility} };
+ = $visibility_itoa{ $ret->{effective_visibility} // 'default' };
}
if ( $opt{postprocess} and $ret ) {
diff --git a/templates/_checked_in.html.ep b/templates/_checked_in.html.ep
index 3fd226b..016e56b 100644
--- a/templates/_checked_in.html.ep
+++ b/templates/_checked_in.html.ep
@@ -68,7 +68,7 @@
% }
% if (my $wr = $journey->{wagonorder}) {
<br/>
- <!-- <a href="https://dbf.finalrewind.org/carriage-formation?<%= $journey->{train_no} %>/<%= $journey->{sched_departure}->strftime('%Y%m%d%H%M') %>?e=<%= $journey->{dep_direction} // q{} %>"> -->
+ <a href="https://dbf.finalrewind.org/carriage-formation?<%= join('&', map { $_ . '=' . $journey->{extra_data}{wagonorder_param}{$_} } sort keys %{$journey->{extra_data}{wagonorder_param}}) %>&amp;e=<%= $journey->{dep_direction} // q{} %>">
% my $direction = $wr->direction == 100 ? '→' : '←';
% my $rev = 0;
% if ($journey->{dep_direction}) {
@@ -111,7 +111,7 @@
% }
% }
%= $direction
- <!-- </a> -->
+ </a>
% }
</div>
<div class="progress" style="height: 1ex;">
@@ -321,9 +321,10 @@
% if (@{stash('timeline') // []}) {
%= include '_timeline_link', timeline => stash('timeline'), from_checkin => 1
% }
- % if ($journey->{arr_name}) {
+ % if ($journey->{arr_name} and @{$journey->{extra_data}{him_msg} // []}) {
<div class="card" style="margin-top: <%= scalar @{stash('timeline') // []} ? '1.5rem' : '3em' %>;">
<div class="card-content">
+ <i class="material-icons small right sync-failed-marker grey-text" style="display: none;">sync_problem</i>
<span class="card-title">Meldungen</span>
% if (@{$journey->{extra_data}{him_msg} // []}) {
<p style="margin-bottom: 2ex;">
@@ -349,33 +350,21 @@
</p>
% }
</div>
- <div class="card-action">
- % my $url = 'https://dbf.finalrewind.org/z/';
- % if ($journey->{is_dbris}) {
- % $url .= $journey->{train_id} =~ s{#}{%23}gr . '?dbris=' . $journey->{backend_name};
- <a style="margin-right: 0;" href="<%= $url %>"><i class="material-icons left" aria-hidden="true">timeline</i> Details</a>
- % }
- % elsif ($journey->{is_hafas}) {
- % $url .= $journey->{train_id} =~ s{#}{%23}gr . '?hafas=' . $journey->{backend_name};
- <a style="margin-right: 0;" href="<%= $url %>"><i class="material-icons left" aria-hidden="true">timeline</i> Details</a>
- % }
- % elsif ($journey->{extra_data}{trip_id} and not $journey->{is_dbris}) {
- % $url .= $journey->{extra_data}{trip_id} =~ s{#}{%23}gr;
- <a style="margin-right: 0;" href="<%= $url %>"><i class="material-icons left" aria-hidden="true">timeline</i> Zuglauf</a>
- % }
- % else {
- &nbsp;
- % }
- % if ($journey->{extra_data}{trip_id}) {
- <a class="right" style="margin-right: 0;" href="https://dbf.finalrewind.org/map/<%= $journey->{extra_data}{trip_id} =~ s{#}{%23}gr %>/<%= $journey->{train_line} || 0 %>?<%= $journey->{is_hafas} ? 'hafas' : 'dbris' %>=<%= $journey->{backend_name} // 'ÖBB' %>&amp;from=<%= $journey->{dep_name} %>&amp;to=<%= $journey->{arr_name} %>"><i class="material-icons left" aria-hidden="true">map</i> Karte</a>
- % }
- </div>
</div>
% }
% if ($journey->{arr_name}) {
<div class="card" style="margin-top: 3em;">
<div class="card-content">
<i class="material-icons small right sync-failed-marker grey-text" style="display: none;">sync_problem</i>
+ <span class="card-title">Karte</span>
+ <div id="map" style="height: 70vh;">
+ </div>
+ %= include '_map', with_map_header => 0, station_coordinates => stash('station_coordinates'), polyline_groups => stash('polyline_groups')
+ </div>
+ </div>
+ <div class="card" style="margin-top: 3em;">
+ <div class="card-content">
+ <i class="material-icons small right sync-failed-marker grey-text" style="display: none;">sync_problem</i>
<span class="card-title">Ziel ändern?</span>
<div class="targetlist">
% for my $station (@{$journey->{route_after}}) {
diff --git a/templates/_map.html.ep b/templates/_map.html.ep
index daa16f0..223bd68 100644
--- a/templates/_map.html.ep
+++ b/templates/_map.html.ep
@@ -1,16 +1,18 @@
-<div class="row">
- <div class="col s12">
- <div id="map" style="height: 70vh;">
+% if (stash('with_map_header') // 1) {
+ <div class="row">
+ <div class="col s12">
+ <div id="map" style="height: 70vh;">
+ </div>
</div>
</div>
-</div>
-<div class="row">
- <div class="col s12">
- <span style="color: #f03;">●</span> Ein-/Ausstiegsstation<br/>
- <span style="color: #673ab7;">—</span> Streckenverlauf oder Luftlinie
+ <div class="row">
+ <div class="col s12">
+ <span style="color: #f03;">●</span> Ein-/Ausstiegsstation<br/>
+ <span style="color: #673ab7;">—</span> Streckenverlauf oder Luftlinie
+ </div>
</div>
-</div>
+% }
<script>
var map = L.map('map').setView([51.306, 9.712], 6);
diff --git a/templates/_public_status_card.html.ep b/templates/_public_status_card.html.ep
index 972a07a..33f4236 100644
--- a/templates/_public_status_card.html.ep
+++ b/templates/_public_status_card.html.ep
@@ -14,9 +14,6 @@
<a href="/p/<%= $name %>"><%= $name %></a> ist unterwegs
% }
<i class="material-icons right"><%= visibility_icon($journey->{effective_visibility_str}) %></i>
- % if (stash('from_timeline') and $journey->{extra_data}{trip_id}) {
- <a class="right" href="https://dbf.finalrewind.org/map/<%= $journey->{extra_data}{trip_id} =~ s{#}{%23}gr %>/<%= $journey->{train_line} || 0 %>?dbris=<%= $journey->{is_dbris} ? $journey->{backend_name} : q{} %>&amp;hafas=<%= $journey->{is_hafas} ? $journey->{backend_name} : q{} %>&amp;from=<%= $journey->{dep_name} %>&amp;to=<%= $journey->{arr_name} // '' %>"><i class="material-icons">map</i></a>
- % }
% if (not $journey->{extra_data}{rt}) {
<i class="material-icons right grey-text">gps_off</i>
% }
@@ -197,6 +194,11 @@
</ul>
</div>
% }
+ % if (stash('station_coordinates')) {
+ <div id="map" style="height: 70vh;">
+ </div>
+ %= include '_map', with_map_header => 0, station_coordinates => stash('station_coordinates'), polyline_groups => stash('polyline_groups')
+ % }
% if ( @{$journey->{wagongroups} // []} ) {
% if (stash('from_timeline')) {
<div class="wagons" style="margin-top: 2ex;">
@@ -221,7 +223,7 @@
% }
% if (not stash('from_timeline')) {
<div style="margin-top: 2ex;">
- Zuglauf:<br/>
+ Route:<br/>
% my $before = 1;
% my $within = 0;
% my $at_startstop = 0;
@@ -268,27 +270,6 @@
</div>
% }
</div>
- % if (0 and not stash('from_timeline')) {
- <div class="card-action">
- % if ($journey->{traewelling_url}) {
- <a style="margin-right: 0;" href="<%= $journey->{traewelling_url} %>"><i class="material-icons left">timeline</i> Träwelling</a>
- % }
- % elsif ($journey->{is_hafas}) {
- % my $url = 'https://dbf.finalrewind.org/z/' . $journey->{train_id} =~ s{#}{%23}gr . '?hafas=' . $journey->{backend_name};
- <a style="margin-right: 0;" href="<%= $url %>"><i class="material-icons left">timeline</i> Details</a>
- % }
- % elsif ($journey->{extra_data}{trip_id}) {
- % my $url = 'https://dbf.finalrewind.org/z/' . $journey->{extra_data}{trip_id} =~ s{#}{%23}gr;
- <a style="margin-right: 0;" href="<%= $url %>"><i class="material-icons left">timeline</i> Zuglauf</a>
- % }
- % else {
- &nbsp;
- % }
- % if ($journey->{extra_data}{trip_id}) {
- <a class="right" style="margin-right: 0;" href="https://dbf.finalrewind.org/map/<%= $journey->{extra_data}{trip_id} =~ s{#}{%23}gr %>/<%= $journey->{train_line} || 0 %>?dbris=<%= $journey->{is_dbris} ? $journey->{backend_name} : q{} %>&amp;hafas=<%= $journey->{is_hafas} ? $journey->{backend_name} : q{} %>&amp;from=<%= $journey->{dep_name} %>&amp;to=<%= $journey->{arr_name} // '' %>"><i class="material-icons left">map</i> Karte</a>
- % }
- </div>
- % }
</div>
% }
% else {
diff --git a/templates/about.html.ep b/templates/about.html.ep
index 939830f..3167d91 100644
--- a/templates/about.html.ep
+++ b/templates/about.html.ep
@@ -3,7 +3,7 @@
<a href="https://finalrewind.org/projects/travelynx">travelynx</a> v<%= stash('version') // '???' %><br/>
Entwickelt von <a href="https://finalrewind.org">derf</a>
und <a href="https://github.com/derf/travelynx/graphs/contributors">weiteren</a><br/>
- <a href="<%= app->config->{ref}{source} // 'https://github.com/derf/travelynx' %>">Quelltext</a> lizensiert unter AGPL v3<br/><br/>
+ <a href="<%= app->config->{ref}{source} // 'https://git.finalrewind.org/travelynx' %>">Quelltext</a> lizensiert unter AGPL v3<br/><br/>
Backends:
<a href="https://finalrewind.org/projects/Travel-Status-DE-DBRIS/">Travel::Status::DE::DBRIS</a>
v<%= $Travel::Status::DE::DBRIS::VERSION %>,
diff --git a/templates/changelog.html.ep b/templates/changelog.html.ep
index 34bab38..7a1417f 100644
--- a/templates/changelog.html.ep
+++ b/templates/changelog.html.ep
@@ -2,6 +2,41 @@
<div class="row">
<div class="col s12 m1 l1">
+ 2.12
+ </div>
+ <div class="col s12 m11 l11">
+ <p>
+ <i class="material-icons left" aria-label="Neues Feature">add</i>
+ Kartografische Visualisierung der Route bei eigenen Checkins und auf
+ der Statusseite sowie Angaben zu Meldungen, Rollmaterial, Route und
+ Auslastung auf der Statusseite. Feinheiten wie die Markierung der
+ geschätzten aktuellen Zugposition oder eine regelmäßige
+ Aktualisierung ohne Zurücksetzen der Kartenansicht folgen später.
+ Die Kartenlinks zu dbf.finalrewind.org entfallen.
+ </p>
+ <p>
+ <i class="material-icons left" aria-label="Ankündigung">announcement</i>
+ Das IRIS-TTS-Backend der Deutschen Bahn wird wegen zunehmend
+ schlechter Datenanreicherunngsmöglichkeiten nicht mehr
+ weiterentwickelt. Bei Checkins per IRIS-TTS stehen regelmäßig keine
+ Echtzeitdaten und insbesondere bei Nebenbahnen auch keine
+ Kartendaten zur Verfügung. In diesem Fall fehlt auch die
+ ersatzwiese Visualisierung der Luftlinie zwischen den
+ Unterwegshalten. Dies betrifft auch die Visualisierung in der
+ Fahrtenkarte.
+ </p>
+ <p>
+ <i class="material-icons left" aria-label="Ankündigung">announcement</i>
+ Derzeit besteht wegen inkompatibler Backends keine
+ Synchronisierungsmöglichkeit zwischen Träwelling (transitous MOTIS)
+ und travelynx (DB IRIS-TTS / DB HAFAS / bahn.de).
+ MOTIS-Unterstützung in travelynx ist in Arbeit.
+ </p>
+ </div>
+</div>
+
+<div class="row">
+ <div class="col s12 m1 l1">
2.11
</div>
<div class="col s12 m11 l11">
diff --git a/templates/departures.html.ep b/templates/departures.html.ep
index 4be1f23..bbae40f 100644
--- a/templates/departures.html.ep
+++ b/templates/departures.html.ep
@@ -137,8 +137,14 @@
Fahrt auswählen zum Einchecken.
% }
% else {
- Keine Abfahrten gefunden. Ein Checkin ist frühestens 30 Minuten vor
- und maximal 120 Minuten nach Abfahrt möglich.
+ % if ($dbris or $hafas) {
+ Keine Abfahrten im ausgewählten Zeitfenster
+ (<%= $datetime->strftime('%d.%m.%Y %H:%M') %> ± 30min).
+ % }
+ % else {
+ Keine Abfahrten gefunden. Ein Checkin ist frühestens 30 Minuten vor
+ und maximal 120 Minuten nach Abfahrt möglich.
+ % }
% }
</p>
% if (not $user_status->{checked_in} or ($can_check_out and $user_status->{arr_eva} and $user_status->{arrival_countdown} <= 0)) {
diff --git a/templates/landingpage.html.ep b/templates/landingpage.html.ep
index ef5fade..4198e65 100644
--- a/templates/landingpage.html.ep
+++ b/templates/landingpage.html.ep
@@ -78,6 +78,25 @@
% }
</div>
</div>
+ % if (not $user->{backend_name}) {
+ <div class="row">
+ <div class="col s12">
+ <div class="card purple white-text">
+ <div class="card-content">
+ <span class="card-title">Legacy-Backend ausgewählt</span>
+ <p>
+ Das aktuell aktive IRIS-Backend wird nicht mehr weiterentwickelt und voraussichtlich bald von der Deutschen Bahn abgeschaltet.
+ Schon jetzt ist die Datenqualität wegen zunehmend schlechter Datenaufbereitungsmöglichkeiten oft unzureichend.
+ Das bahn.de-Backend ist fast jeder Hinsicht besser geeignet; lediglich bei Verspätungs- und Servicemeldungen ist es geringfügig weniger detailliert.
+ </p>
+ </div>
+ <div class="card-action">
+ <a class="btn btn-flat" href="/account/select_backend?redirect_to=/">Backend wechseln</a>
+ </div>
+ </div>
+ </div>
+ </div>
+ % }
<h2 style="margin-left: 0.75rem;">Letzte Fahrten</h2>
%= include '_history_trains', date_format => '%d.%m.%Y', journeys => [journeys->get(uid => $user->{id}, limit => 5, with_datetime => 1)];
% }
@@ -86,9 +105,9 @@
<div class="col s12">
<p>
Travelynx erlaubt das Einchecken in Verkehrsmittel (Busse,
- Bahnen, Züge) unter anderem in Deutschland, Österrich, der
- Schweiz, Luxembourg, Irland und Teilen der USA. So können die
- eigenen Fahrten später inklusive Echtzeitdaten und
+ Bahnen, Züge) unter anderem in Deutschland, Österreich, der
+ Schweiz, Luxemburg, Irland, Dänemark und Teilen der USA. So
+ können die eigenen Fahrten später inklusive Echtzeitdaten und
eingetragenen Servicemeldungen nachvollzogen und brennende
Fragen wie „Wie viele Stunden war ich letzten Monat unterwegs?“
beantwortet werden.
diff --git a/templates/profile.html.ep b/templates/profile.html.ep
index 6f78ea0..a2c965c 100644
--- a/templates/profile.html.ep
+++ b/templates/profile.html.ep
@@ -79,7 +79,7 @@
</div>
<div class="row">
<div class="col s12 publicstatuscol" data-user="<%= $name %>" data-profile="1">
- %= include '_public_status_card', name => $name, privacy => $privacy, journey => $journey, from_profile => 1
+ %= include '_public_status_card', name => $name, privacy => $privacy, journey => $journey, from_profile => 1, station_coordinates => stash('station_coordinates'), polyline_groups => stash('polyline_groups')
</div>
</div>
% if ($journeys and @{$journeys}) {
diff --git a/templates/user_status.html.ep b/templates/user_status.html.ep
index 45fba54..bf11004 100644
--- a/templates/user_status.html.ep
+++ b/templates/user_status.html.ep
@@ -1,5 +1,5 @@
<div class="row">
<div class="col s12 publicstatuscol" data-user="<%= $name %>">
- %= include '_public_status_card', name => $name, privacy => $privacy, journey => $journey
+ %= include '_public_status_card', name => $name, privacy => $privacy, journey => $journey, station_coordinates => stash('station_coordinates'), polyline_groups => stash('polyline_groups')
</div>
</div>