add journey detail view

This commit is contained in:
Daniel Friesel 2019-03-17 18:34:33 +01:00
parent 629ca9e9f6
commit 11d77d4bb9
4 changed files with 190 additions and 14 deletions

View file

@ -241,6 +241,26 @@ app->attr(
);
}
);
app->attr(
get_journey_actions_query => sub {
my ($self) = @_;
return $self->app->dbh->prepare(
qq{
select action_id, action_time, stations.ds100, stations.name,
train_type, train_line, train_no, train_id,
sched_time, real_time,
route, messages
from user_actions
left outer join stations on station_id = stations.id
where user_id = ?
and (action_time = ? or action_time = ?)
order by action_time desc
limit 2
}
);
}
);
app->attr(
get_userid_query => sub {
my ($self) = @_;
@ -775,14 +795,21 @@ helper 'check_if_mail_is_blacklisted' => sub {
};
helper 'get_user_travels' => sub {
my ( $self, $limit ) = @_;
my ( $self, %opt ) = @_;
my $uid = $self->current_user->{id};
my $query = $self->app->get_all_actions_query;
if ($limit) {
if ( $opt{limit} ) {
$query = $self->app->get_last_actions_query;
}
$query->execute($uid);
if ( $opt{uid} and $opt{checkin_epoch} and $opt{checkout_epoch} ) {
$query = $self->app->get_journey_actions_query;
$query->execute( $opt{uid}, $opt{checkin_epoch}, $opt{checkout_epoch} );
}
else {
$query->execute($uid);
}
my @travels;
my $prev_action = 0;
@ -805,6 +832,7 @@ helper 'get_user_travels' => sub {
to_name => $name,
sched_arrival => epoch_to_dt($raw_sched_ts),
rt_arrival => epoch_to_dt($raw_real_ts),
checkout => epoch_to_dt($raw_ts),
type => $train_type,
line => $train_line,
no => $train_no,
@ -823,13 +851,23 @@ helper 'get_user_travels' => sub {
my $ref = $travels[-1];
$ref->{from_name} = $name;
$ref->{completed} = 1;
$ref->{sched_departure} = epoch_to_dt($raw_sched_ts),
$ref->{rt_departure} = epoch_to_dt($raw_real_ts),
$ref->{type} //= $train_type;
$ref->{sched_departure} = epoch_to_dt($raw_sched_ts);
$ref->{rt_departure} = epoch_to_dt($raw_real_ts);
$ref->{checkin} = epoch_to_dt($raw_ts);
$ref->{type} //= $train_type;
$ref->{line} //= $train_line;
$ref->{no} //= $train_no;
$ref->{messages} //= [ split( qr{[|]}, $raw_messages ) ];
$ref->{route} //= [ split( qr{[|]}, $raw_route ) ];
if ( $opt{verbose} ) {
my @parsed_messages;
for my $message ( @{ $ref->{messages} // [] } ) {
my ( $ts, $msg ) = split( qr{:}, $message );
push( @parsed_messages, [ epoch_to_dt($ts), $msg ] );
}
$ref->{messages} = [@parsed_messages];
}
}
$prev_action = $action;
}
@ -1340,7 +1378,7 @@ get '/history' => sub {
my ($self) = @_;
$self->respond_to(
json => { json => [ $self->get_user_travels(0) ] },
json => { json => [ $self->get_user_travels ] },
any => { template => 'history' }
);
};
@ -1348,7 +1386,42 @@ get '/history' => sub {
get '/history.json' => sub {
my ($self) = @_;
$self->render( json => [ $self->get_user_travels(0) ] );
$self->render( json => [ $self->get_user_travels ] );
};
get '/journey/:id' => sub {
my ($self) = @_;
my ( $uid, $checkin_ts, $checkout_ts ) = split( qr{-}, $self->stash('id') );
if ( $uid != $self->current_user->{id} ) {
$self->render(
'journey',
error => 'notfound',
journey => {}
);
return;
}
my @journeys = $self->get_user_travels(
uid => $uid,
checkin_epoch => $checkin_ts,
checkout_epoch => $checkout_ts,
verbose => 1,
);
if ( @journeys == 0 ) {
$self->render(
'journey',
error => 'notfound',
journey => {}
);
return;
}
$self->render(
'journey',
error => undef,
journey => $journeys[0]
);
};
get '/export.json' => sub {

View file

@ -19,12 +19,13 @@
</tr>
</thead>
<tbody>
% for my $travel (get_user_travels(0)) {
% for my $travel (get_user_travels()) {
% if ($travel->{completed}) {
% my $detail_link = '/journey/' . current_user()->{id} . '-' . $travel->{checkin}->epoch . '-' . $travel->{checkout}->epoch;
<tr>
<td><%= $travel->{sched_departure}->strftime('%d.%m.%Y') %></td>
<td><%= $travel->{type} %> <%= $travel->{line} // '' %> <%= $travel->{no} %></td>
<td><%= $travel->{from_name} %> → <%= $travel->{to_name} %></td>
<td><a href="<%= $detail_link %>"><%= $travel->{type} %> <%= $travel->{line} // '' %> <%= $travel->{no} %></a></td>
<td><a href="<%= $detail_link %>"><%= $travel->{from_name} %> → <%= $travel->{to_name} %></a></td>
<td><%= $travel->{rt_departure}->strftime('%H:%M') %>
% if ($travel->{sched_departure} != $travel->{rt_departure}) {
(+<%= ($travel->{rt_departure}->epoch - $travel->{sched_departure}->epoch) / 60 %>)

101
templates/journey.html.ep Normal file
View file

@ -0,0 +1,101 @@
% if ($error) {
<div class="row">
<div class="col s12">
<div class="card red darken-4">
<div class="card-content white-text">
<span class="card-title">Fehler</span>
<p>Zugfahrt nicht gefunden.<p/>
</div>
</div>
</div>
</div>
% }
% else {
<div class="row">
<div class="col s12">
<p>
Fahrt von
<b><%= $journey->{from_name} %></b>
nach
<b><%= $journey->{to_name} %></b>
am
<b><%= $journey->{sched_departure}->strftime('%d.%m.%Y') %></b>
</p>
<table class="striped">
<tr>
<th scope="row">Zug</th>
<td>
<%= $journey->{type} %> <%= $journey->{no} %>
% if ($journey->{line}) {
(Linie <%= $journey->{type} %> <%= $journey->{line} %>)
% }
</td>
</tr>
<tr>
<th scope="row">Abfahrt</th>
<td>
% if ($journey->{rt_departure} != $journey->{sched_departure}) {
%= $journey->{rt_departure}->strftime('%H:%M');
(+<%= ($journey->{rt_departure}->epoch - $journey->{sched_departure}->epoch) / 60 %>,
Plan: <%= $journey->{sched_departure}->strftime('%H:%M'); %>)
% }
% else {
%= $journey->{sched_departure}->strftime('%H:%M');
% }
</td>
</tr>
<tr>
<th scope="row">Ankunft</th>
<td>
% if ($journey->{rt_arrival}->epoch == 0 and $journey->{sched_arrival}->epoch == 0) {
<i class="material-icons">timer_off</i>
% }
% elsif ($journey->{rt_arrival} != $journey->{sched_arrival}) {
%= $journey->{rt_arrival}->strftime('%H:%M');
(+<%= ($journey->{rt_arrival}->epoch - $journey->{sched_arrival}->epoch) / 60 %>,
Plan: <%= $journey->{sched_arrival}->strftime('%H:%M'); %>)
% }
% else {
%= $journey->{sched_arrival}->strftime('%H:%M');
% }
</td>
</tr>
<tr>
<th scope="row">Meldungen</th>
<td>
% for my $message (@{$journey->{messages} // []}) {
% my ($ts, $msg) = @{$message};
<%= $ts->strftime('%d.%m.%Y %H:%M') %> : <%= $msg %>
% }
<br/>
</td>
</tr>
<tr>
<th scope="row">Route</th>
<td>
% my $within = 0;
% my $at_startstop = 0;
% for my $station (@{$journey->{route}}) {
% if ($station eq $journey->{from_name}) {
% $within = 1; $at_startstop = 1;
% }
% elsif ($station eq $journey->{to_name}) {
% $within = 0; $at_startstop = 1;
% }
% else {
% $at_startstop = 0;
% }
% if ($at_startstop or $within) {
<%= $station %>
% }
% else {
<span style="color: #666666;"><%= $station %></span>
% }
<br/>
% }
</td>
</tr>
</table>
</div>
</div>
% }

View file

@ -75,12 +75,13 @@
</tr>
</thead>
<tbody>
% for my $travel (get_user_travels(1)) {
% for my $travel (get_user_travels(limit => 1)) {
% if ($travel->{completed}) {
<tr>
% my $detail_link = '/journey/' . current_user()->{id} . '-' . $travel->{checkin}->epoch . '-' . $travel->{checkout}->epoch;
<td><%= $travel->{sched_departure}->strftime('%d.%m.%Y') %></td>
<td><%= $travel->{type} %> <%= $travel->{line} // $travel->{no} %></td>
<td><%= $travel->{from_name} %> → <%= $travel->{to_name} %></td>
<td><a href="<%= $detail_link %>"><%= $travel->{type} %> <%= $travel->{line} // $travel->{no} %></a></td>
<td><a href="<%= $detail_link %>"><%= $travel->{from_name} %> → <%= $travel->{to_name} %></a></td>
% if ($travel->{rt_arrival}->epoch and $travel->{rt_departure}->epoch) {
<td><%= ($travel->{rt_arrival}->epoch - $travel->{rt_departure}->epoch) / 60 %> min
</td>