add journey detail view
This commit is contained in:
parent
629ca9e9f6
commit
11d77d4bb9
4 changed files with 190 additions and 14 deletions
89
index.pl
89
index.pl
|
@ -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 {
|
||||
|
|
|
@ -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
101
templates/journey.html.ep
Normal 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>
|
||||
% }
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue