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 +% } |