diff options
| author | Daniel Friesel <derf@finalrewind.org> | 2019-12-06 21:40:51 +0100 | 
|---|---|---|
| committer | Daniel Friesel <derf@finalrewind.org> | 2019-12-06 21:40:51 +0100 | 
| commit | 094c536eb475b02a26f65769d6ff460d270ef454 (patch) | |
| tree | db36d0265b764825775d23c5edf591ec07252739 | |
| parent | 119f0a6b7d92db63c4dbab3e65dda34285c007e0 (diff) | |
Allow comments to be entered while still in transit
| -rwxr-xr-x | lib/Travelynx.pm | 25 | ||||
| -rwxr-xr-x | lib/Travelynx/Controller/Traveling.pm | 45 | ||||
| -rw-r--r-- | templates/_checked_in.html.ep | 21 | ||||
| -rw-r--r-- | templates/edit_comment.html.ep | 59 | 
4 files changed, 146 insertions, 4 deletions
| diff --git a/lib/Travelynx.pm b/lib/Travelynx.pm index 8a308db..c0ddf83 100755 --- a/lib/Travelynx.pm +++ b/lib/Travelynx.pm @@ -778,6 +778,25 @@ sub startup {  	);  	$self->helper( +		'update_in_transit_comment' => sub { +			my ( $self, $comment ) = @_; +			my $uid = $self->current_user->{id}; + +			my $status = $self->pg->db->select( 'in_transit', ['user_data'], +				{ user_id => $uid } )->expand->hash; +			if ( not $status ) { +				return; +			} +			$status->{user_data}{comment} = $comment; +			$self->pg->db->update( +				'in_transit', +				{ user_data => JSON->new->encode( $status->{user_data} ) }, +				{ user_id   => $uid } +			); +		} +	); + +	$self->helper(  		'update_journey_part' => sub {  			my ( $self, $db, $journey_id, $key, $value ) = @_;  			my $rows; @@ -2652,6 +2671,7 @@ sub startup {  					route_after   => \@route_after,  					messages      => $in_transit->{messages},  					extra_data    => $in_transit->{data}, +					comment       => $in_transit->{user_data}{comment},  				};  				my @parsed_messages; @@ -2818,7 +2838,7 @@ sub startup {  					order_by => { -desc => 'journey_id' },  					limit    => 1  				} -			)->hash; +			)->expand->hash;  			if ($latest) {  				my $ts          = $latest->{checkout_ts}; @@ -2843,6 +2863,7 @@ sub startup {  					arr_ds100       => $latest->{arr_ds100},  					arr_name        => $latest->{arr_name},  					arr_platform    => $latest->{arr_platform}, +					comment         => $latest->{user_data}{comment},  				};  			} @@ -3129,6 +3150,7 @@ sub startup {  	$authed_r->get('/history/:year')->to('traveling#yearly_history');  	$authed_r->get('/history/:year/:month')->to('traveling#monthly_history');  	$authed_r->get('/journey/add')->to('traveling#add_journey_form'); +	$authed_r->get('/journey/comment')->to('traveling#comment_form');  	$authed_r->get('/journey/:id')->to('traveling#journey_details');  	$authed_r->get('/s/*station')->to('traveling#station');  	$authed_r->get('/confirm_mail/:token')->to('account#confirm_mail'); @@ -3137,6 +3159,7 @@ sub startup {  	$authed_r->post('/account/insight')->to('account#insight');  	$authed_r->post('/history/map')->to('traveling#map_history');  	$authed_r->post('/journey/add')->to('traveling#add_journey_form'); +	$authed_r->post('/journey/comment')->to('traveling#comment_form');  	$authed_r->post('/journey/edit')->to('traveling#edit_journey');  	$authed_r->post('/journey/passenger_rights/*filename')  	  ->to('passengerrights#generate'); diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm index c8ba024..f41d8df 100755 --- a/lib/Travelynx/Controller/Traveling.pm +++ b/lib/Travelynx/Controller/Traveling.pm @@ -673,6 +673,51 @@ sub journey_details {  } +sub comment_form { +	my ($self) = @_; +	my $dep_ts = $self->param('dep_ts'); +	my $status = $self->get_user_status; + +	if ( not $status->{checked_in} ) { +		$self->render( +			'edit_comment', +			error   => 'notfound', +			journey => {} +		); +	} +	elsif ( not $dep_ts ) { +		$self->param( dep_ts  => $status->{sched_departure}->epoch ); +		$self->param( comment => $status->{comment} ); +		$self->render( +			'edit_comment', +			error   => undef, +			journey => $status +		); +	} +	elsif ( $self->validation->csrf_protect->has_error('csrf_token') ) { +		$self->render( +			'edit_comment', +			error   => undef, +			journey => $status +		); +	} +	elsif ( $dep_ts != $status->{sched_departure}->epoch ) { + +		# TODO find and update appropriate past journey (if it exists) +		$self->param( comment => $status->{comment} ); +		$self->render( +			'edit_comment', +			error   => undef, +			journey => $status +		); +	} +	else { +		$self->app->log->debug("set comment"); +		$self->update_in_transit_comment( $self->param('comment') ); +		$self->redirect_to('/'); +	} +} +  sub edit_journey {  	my ($self)     = @_;  	my $journey_id = $self->param('journey_id'); diff --git a/templates/_checked_in.html.ep b/templates/_checked_in.html.ep index a493384..5631e12 100644 --- a/templates/_checked_in.html.ep +++ b/templates/_checked_in.html.ep @@ -3,6 +3,9 @@  		<div class="card-content">  			<i class="material-icons small right sync-failed-marker grey-text" style="display: none;">sync_problem</i>  			<span class="card-title">Eingecheckt in <%= $journey->{train_type} %> <%= $journey->{train_no} %></span> +			% if ($journey->{comment}) { +				<p><%= $journey->{comment} %>.</p> +			% }  			<p>  				<div class="center-align countdown"  					data-journey="<%= $journey->{real_departure}->epoch %>;<%= <%= $journey->{real_arrival}->epoch %>" @@ -216,9 +219,16 @@  			% }  		</div>  		<div class="card-action"> -			<a class="action-undo blue-text" data-id="in_transit" style="margin-right: 0;"> -				<i class="material-icons left">undo</i> Rückgängig -			</a> +			% if ($journey->{arr_name}) { +				<a style="margin-right: 0;" href="/journey/comment"> +					<i class="material-icons left">comment</i> Kommentar +				</a> +			% } +			% else { +				<a class="action-undo blue-text" data-id="in_transit" style="margin-right: 0;"> +					<i class="material-icons left">undo</i> Checkin Rückgängig +				</a> +			% }  			% if (defined $journey->{arrival_countdown} and $journey->{arrival_countdown} <= 0) {  				<a  					class="action-checkout right" @@ -276,6 +286,11 @@  					auschecken</a>.  				</p>  			</div> +			<div class="card-action"> +				<a class="action-undo blue-text" data-id="in_transit" style="margin-right: 0;"> +					<i class="material-icons left">undo</i> Checkin Rückgängig +				</a> +			</div>  		</div>  	% }  </div> diff --git a/templates/edit_comment.html.ep b/templates/edit_comment.html.ep new file mode 100644 index 0000000..81353a2 --- /dev/null +++ b/templates/edit_comment.html.ep @@ -0,0 +1,59 @@ +<h1>Zugfahrt kommentieren</h1> +% if ($error or not $journey->{checked_in}) { +	<div class="row"> +		<div class="col s12"> +			<div class="card caution-color"> +				<div class="card-content white-text"> +					<span class="card-title">Fehler</span> +					<p>Du bist gerade nicht eingecheckt. Vergangene Zugfahrten +						kannst du über die Editierfunktion in der History +						kommentieren.</p> +				</div> +			</div> +		</div> +	</div> +% } +% else { +	%= form_for '/journey/comment' => (method => 'POST') => begin +		%= csrf_field +		%= hidden_field 'dep_ts' => param('dep_ts') +		<div class="row"> +			<div class="col s12"> +				<p> +					Eintrag zu +					<b><%= $journey->{train_type} %> <%= $journey->{train_no} %></b> +					von +					<b><%= $journey->{dep_name} %></b> +					nach +					<b><%= $journey->{arr_name} // 'irgendwo' %></b> +					am +					<b><%= $journey->{sched_departure}->strftime('%d.%m.%Y') %></b> +				</p> +				% if (current_user()->{is_public} & 0x04) { +					<p> +						Der hier eingetragene Text ist als Teil deines Nutzerstatus +						öffentlich sichtbar. +					</p> +				% } +			</div> +		</div> +		<div class="row"> +			<div class="col s12"> +				%= text_field 'comment' +			</div> +		</div> +		<div class="row"> +			<div class="col s6 m6 l6 center-align"> +				<a href="/" class="waves-effect waves-light btn"> +					Abbrechen +				</a> +			</div> +			<div class="col s6 m6 l6 center-align"> +				<button class="btn waves-effect waves-light" type="submit" name="action" value="save"> +					Speichern +					<i class="material-icons right">send</i> +				</button> +			</div> +		</div> +	%= end +% } | 
