diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2019-03-17 18:34:33 +0100 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2019-03-17 18:34:33 +0100 | 
| commit | 11d77d4bb95e0f79d2afbcf0ab9bb7b66cc12003 (patch) | |
| tree | a748c24a00ed6ed6fcc27d7c50f22477aa019fec | |
| parent | 629ca9e9f69be662ef877e1f0e5bf2e020e4a691 (diff) | |
add journey detail view
| -rwxr-xr-x | index.pl | 89 | ||||
| -rw-r--r-- | templates/history.html.ep | 7 | ||||
| -rw-r--r-- | templates/journey.html.ep | 101 | ||||
| -rw-r--r-- | templates/landingpage.html.ep | 7 | 
4 files changed, 190 insertions, 14 deletions
| @@ -242,6 +242,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 { diff --git a/templates/history.html.ep b/templates/history.html.ep index cf81765..d79b515 100644 --- a/templates/history.html.ep +++ b/templates/history.html.ep @@ -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 %>) diff --git a/templates/journey.html.ep b/templates/journey.html.ep new file mode 100644 index 0000000..520b2ef --- /dev/null +++ b/templates/journey.html.ep @@ -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> +% } diff --git a/templates/landingpage.html.ep b/templates/landingpage.html.ep index c672dd2..dcc0083 100644 --- a/templates/landingpage.html.ep +++ b/templates/landingpage.html.ep @@ -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> | 
