summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--index.pl83
-rw-r--r--public/static/js/travelynx-actions.js26
-rw-r--r--templates/checkin.html.ep54
-rw-r--r--templates/checkout.html.ep31
-rw-r--r--templates/departures.html.ep8
-rw-r--r--templates/landingpage.html.ep2
-rw-r--r--templates/layouts/default.html.ep1
7 files changed, 86 insertions, 119 deletions
diff --git a/index.pl b/index.pl
index dcc941c..6d00a1d 100644
--- a/index.pl
+++ b/index.pl
@@ -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') %>&amp;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 %>&amp;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 %>&amp;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>