diff options
-rw-r--r-- | index.pl | 83 | ||||
-rw-r--r-- | public/static/js/travelynx-actions.js | 26 | ||||
-rw-r--r-- | templates/checkin.html.ep | 54 | ||||
-rw-r--r-- | templates/checkout.html.ep | 31 | ||||
-rw-r--r-- | templates/departures.html.ep | 8 | ||||
-rw-r--r-- | templates/landingpage.html.ep | 2 | ||||
-rw-r--r-- | templates/layouts/default.html.ep | 1 |
7 files changed, 86 insertions, 119 deletions
@@ -181,6 +181,10 @@ app->attr( sub epoch_to_dt { my ($epoch) = @_; + # Bugs (and user errors) may lead to undefined timestamps. Set them to + # 1970-01-01 to avoid crashing and show obviously wrong data instead. + $epoch //= 0; + return DateTime->from_epoch( epoch => $epoch, time_zone => 'Europe/Berlin' @@ -479,10 +483,7 @@ helper 'get_user_status' => sub { if ( @{$rows} ) { my $now = DateTime->now( time_zone => 'Europe/Berlin' ); - my $ts = DateTime->from_epoch( - epoch => $rows->[0][1], - time_zone => 'Europe/Berlin' - ); + my $ts = epoch_to_dt( $rows->[0][1] ); my $checkin_station_name = $rows->[0][3]; my @route = split( qr{[|]}, $rows->[0][8] // q{} ); my @route_after; @@ -529,41 +530,63 @@ get '/' => sub { $self->render('landingpage'); }; -get '/a/checkin' => sub { - my ($self) = @_; - my $station = $self->param('station'); - my $train_id = $self->param('train'); - - my ( $train, $error ) = $self->checkin( $station, $train_id ); +post '/action' => sub { + my ($self) = @_; + my $params = $self->req->json; - if ($error) { - $self->render( - 'checkin', - error => $error, - train => undef - ); + if ( not exists $params->{action} ) { + $params = $self->req->params->to_hash; } - else { + + if ( not $params->{action} ) { $self->render( - 'checkin', - error => undef, - train => $train + json => {}, + status => 400, ); + return; } -}; -get '/a/checkout' => sub { - my ($self) = @_; - my $station = $self->param('station'); - my $force = $self->param('force'); + my $station = $params->{station}; - my $error = $self->checkout( $station, $force ); + if ( $params->{action} eq 'checkin' ) { - if ($error) { - $self->render( 'checkout', error => $error ); + my ( $train, $error ) + = $self->checkin( $params->{station}, $params->{train}, ); + + if ($error) { + $self->render( + json => { + success => 0, + error => $error, + }, + ); + } + else { + $self->render( + json => { + success => 1, + }, + ); + } } - else { - $self->redirect_to("/${station}"); + elsif ( $params->{action} eq 'checkout' ) { + my $error = $self->checkout( $params->{station}, $params->{force}, ); + + if ($error) { + $self->render( + json => { + success => 0, + error => $error, + }, + ); + } + else { + $self->render( + json => { + success => 1, + }, + ); + } } }; diff --git a/public/static/js/travelynx-actions.js b/public/static/js/travelynx-actions.js new file mode 100644 index 0000000..3fbbdea --- /dev/null +++ b/public/static/js/travelynx-actions.js @@ -0,0 +1,26 @@ +$(document).ready(function() { + $('.action-checkin').click(function() { + var link = $(this); + req = { + action: 'checkin', + station: link.data('station'), + train: link.data('train'), + }; + link.replaceWith('<div class="progress"><div class="indeterminate"></div></div>'); + $.post('/action', req, function(data) { + $(location).attr('href', '/'); + }); + }); + $('.action-checkout').click(function() { + var link = $(this); + req = { + action: 'checkout', + station: link.data('station'), + force: link.data('force'), + }; + link.replaceWith('<div class="progress"><div class="indeterminate"></div></div>'); + $.post('/action', req, function(data) { + $(location).attr('href', '/' + req.station); + }); + }); +}); diff --git a/templates/checkin.html.ep b/templates/checkin.html.ep deleted file mode 100644 index 7e68a0b..0000000 --- a/templates/checkin.html.ep +++ /dev/null @@ -1,54 +0,0 @@ -% if ($error) { - <div class="row"> - <div class="col s12 m6"> - <div class="card red darken-4"> - <div class="card-content white-text"> - <span class="card-title">I am Error</span> - <p><%= $error %></p> - </div> - <div class="card-action"> - % if (param('station')) { - <a href="/<%= param('station') %>">Zurück zu den Abfahrten</a> - % } - % else { - <a href="/">Zur Hauptseite</a> - % } - </div> - </div> - </div> -% } -% else { - <div class="row"> - <div class="col s12"> - <div class="card green darken-4"> - <div class="card-content white-text"> - <span class="card-title">Eingecheckt in <%= $train->line %></span> - <p>Abfahrt um <%= $train->sched_departure->strftime('%H:%M') %> - % if ($train->departure_delay) { - +<%= $train->departure_delay %> - % } - </p> - </div> - </div> - </div> - </div> - <div class="row"> - <div class="col s12"> - Weitere Route: - </div> - </div> - <div class="row"> - <div class="col s12"> - <table> - <tbody> - % for my $station ($train->route_post) { - <tr> - <td><%= $station %></td> - <td><a href="/a/checkout?station=<%= $station %>">hier auschecken</a></td> - </tr> - % } - </tbody> - </table> - </div> - </div> -% } diff --git a/templates/checkout.html.ep b/templates/checkout.html.ep deleted file mode 100644 index 1b5a4f2..0000000 --- a/templates/checkout.html.ep +++ /dev/null @@ -1,31 +0,0 @@ -% if ($error) { - <div class="row"> - <div class="col s12 m6"> - <div class="card red darken-4"> - <div class="card-content white-text"> - <span class="card-title">I am Error</span> - <p><%= $error %></p> - </div> - <div class="card-action"> - <a href="/a/checkout?station=<%= param('station') %>&force=1">Ohne Echtzeitdaten auschecken</a> - % if (param('station')) { - <a href="/<%= param('station') %>">Zurück zu den Abfahrten</a> - % } - % else { - <a href="/">Zur Hauptseite</a> - % } - </div> - </div> - </div> -% } -% else { - <div class="row"> - <div class="col s12"> - <div class="card green darken-4"> - <div class="card-content white-text"> - <span class="card-title">Erfolgreich ausgecheckt</span> - </div> - </div> - </div> - </div> -% } diff --git a/templates/departures.html.ep b/templates/departures.html.ep index bbe0149..bd11d15 100644 --- a/templates/departures.html.ep +++ b/templates/departures.html.ep @@ -9,7 +9,9 @@ ab <%= $status->{station_name} %></p> </div> <div class="card-action"> - <a href="/a/checkout?station=<%= $ds100 %>">Hier auschecken</a> + <a class="action-checkout" data-station="<%= $ds100 %>"> + Hier auschecken + </a> </div> </div> % } @@ -28,12 +30,12 @@ % for my $result (@{$results}) { <tr> <td> - <a href="/a/checkin?station=<%= $ds100 %>&train=<%= $result->train_id %>" title="Check In"> + <a class="action-checkin" data-station="<%= $ds100 %>" data-train="<%= $result->train_id %>"> <%= $result->line %> </a> </td> <td> - <a href="/a/checkin?station=<%= $ds100 %>&train=<%= $result->train_id %>" title="Check In"> + <a class="action-checkin" data-station="<%= $ds100 %>" data-train="<%= $result->train_id %>"> <%= $result->destination %> </a> </td> diff --git a/templates/landingpage.html.ep b/templates/landingpage.html.ep index 0207118..a33d83a 100644 --- a/templates/landingpage.html.ep +++ b/templates/landingpage.html.ep @@ -13,7 +13,7 @@ <tbody> % my $is_after = 0; % for my $station (@{$status->{route_after}}) { - <tr><td><a href="/a/checkout?station=<%= $station %>"><%= $station %></a></td></tr> + <tr><td><a class="action-checkout" data-station="<%= $station %>"><%= $station %></a></td></tr> % } </tbody> </table> diff --git a/templates/layouts/default.html.ep b/templates/layouts/default.html.ep index 5e0091c..d11bd2a 100644 --- a/templates/layouts/default.html.ep +++ b/templates/layouts/default.html.ep @@ -9,6 +9,7 @@ %= stylesheet '/static/css/local.css' %= javascript '/static/js/jquery-2.2.4.min.js' %= javascript '/static/js/materialize.min.js' + %= javascript '/static/js/travelynx-actions.js' </head> <body> |