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> | 
