Loading lib/Travelynx.pm +35 −0 Original line number Diff line number Diff line Loading @@ -774,6 +774,38 @@ sub startup { } ); $self->helper( 'get_privacy_by_name' => sub { my ( $self, $name ) = @_; my $res = $self->pg->db->select( 'users', [ 'id', 'public_level' ], { name => $name, status => 1 } ); if ( my $user = $res->hash ) { return $user; } return; } ); $self->helper( 'set_privacy' => sub { my ( $self, $uid, $public_level ) = @_; $self->pg->db->update( 'users', { public_level => $public_level }, { id => $uid } ); } ); $self->helper( 'mark_for_password_reset' => sub { my ( $self, $db, $uid, $token ) = @_; Loading Loading @@ -1696,6 +1728,7 @@ sub startup { $r->get('/recover/:id/:token')->to('account#recover_password'); $r->get('/register')->to('account#registration_form'); $r->get('/reg/:id/:token')->to('account#verify'); $r->get('/status/:name')->to('traveling#user_status'); $r->post('/action')->to('traveling#log_action'); $r->post('/geolocation')->to('traveling#geolocation'); $r->post('/list_departures')->to('traveling#redirect_to_station'); Loading @@ -1715,6 +1748,7 @@ sub startup { ); $authed_r->get('/account')->to('account#account'); $authed_r->get('/account/privacy')->to('account#privacy'); $authed_r->get('/ajax/status_card.html')->to('traveling#status_card'); $authed_r->get('/cancelled')->to('traveling#cancelled'); $authed_r->get('/change_password')->to('account#password_form'); Loading @@ -1728,6 +1762,7 @@ sub startup { $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'); $authed_r->post('/account/privacy')->to('account#privacy'); $authed_r->post('/journey/add')->to('traveling#add_journey_form'); $authed_r->post('/journey/edit')->to('traveling#edit_journey'); $authed_r->post('/change_password')->to('account#change_password'); Loading lib/Travelynx/Controller/Account.pm +22 −0 Original line number Diff line number Diff line Loading @@ -208,6 +208,28 @@ sub do_logout { $self->redirect_to('/login'); } sub privacy { my ($self) = @_; my $user = $self->current_user; my $public_level = $user->{is_public}; if ( $self->param('action') and $self->param('action') eq 'save' ) { if ( $self->param('public_status') ) { $public_level |= 0x02; } else { $public_level &= ~0x02; } $self->set_privacy( $user->{id}, $public_level ); } else { $self->param( public_status => $public_level & 0x02 ? 1 : 0 ); } $self->render( 'privacy', name => $user->{name} ); } sub change_mail { my ($self) = @_; Loading lib/Travelynx/Controller/Traveling.pm +38 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,44 @@ sub homepage { } } sub user_status { my ($self) = @_; my $name = $self->stash('name'); my $user = $self->get_privacy_by_name($name); if ( $user and ( $user->{public_level} & 0x02 ) ) { my $status = $self->get_user_status( $user->{id} ); $self->render( 'user_status', name => $name, journey => $status ); } else { $self->render('not_found'); } } sub public_status_card { my ($self) = @_; my $name = $self->stash('name'); my $user = $self->get_privacy_by_name($name); if ( $user and ( $user->{public_level} & 0x02 ) ) { my $status = $self->get_user_status( $user->{id} ); $self->render( '_public_status_card', name => $name, journey => $status ); } else { $self->render('not_found'); } } sub status_card { my ($self) = @_; my $status = $self->get_user_status; Loading templates/_public_status_card.html.ep 0 → 100644 +87 −0 Original line number Diff line number Diff line % if ($journey->{checked_in}) { <div class="card green darken-4"> <div class="card-content white-text"> <span class="card-title"><%= $name %> ist unterwegs</span> <p> In <b><%= $journey->{train_type} %> <%= $journey->{train_no} %></b> % if ($journey->{arr_name}) { von <b><%= $journey->{dep_name} %></b> nach <b><%= $journey->{arr_name} %></b>. % } % else { ab <b><%= $journey->{dep_name} %></b>. % } </p> <p> <b><%= $journey->{real_departure}->strftime('%H:%M') %></b> % if ($journey->{real_departure}->epoch != $journey->{sched_departure}->epoch) { (<%= sprintf('%+d', ($journey->{real_departure}->epoch - $journey->{sched_departure}->epoch)/60) %>) % } → % if ($journey->{real_arrival}->epoch) { <b><%= $journey->{real_arrival}->strftime('%H:%M') %></b> % if ($journey->{real_arrival}->epoch != $journey->{sched_arrival}->epoch) { (<%= sprintf('%+d', ($journey->{real_arrival}->epoch - $journey->{sched_arrival}->epoch)/60) %>) % } % } % elsif ($journey->{arr_name}) { noch nicht bekannt % } % else { unbekannt % } </p> <p> <div class="center"> % if ($journey->{departure_countdown} > 120) { Abfahrt in <%= sprintf('%.f', $journey->{departure_countdown} / 60) %> Minuten % } % elsif ($journey->{departure_countdown} > 60) { Abfahrt in einer Minute % } % elsif ($journey->{departure_countdown} > 0) { Abfahrt in weniger als einer Minute % } % elsif (defined $journey->{arrival_countdown}) { % if ($journey->{arrival_countdown} > 60) { Ankunft in <%= sprintf('%.f', $journey->{arrival_countdown} / 60) %> Minute<%= sprintf('%.f', $journey->{arrival_countdown} / 60) == 1 ? '' : 'n' %> % } % elsif ($journey->{arrival_countdown} > 0) { Ankunft in weniger als einer Minute % } % else { Ziel erreicht % } % } % elsif ($journey->{arr_name}) { Ankunft in mehr als zwei Stunden % } </div> <div class="progress green darken-3" style="height: 1ex;"> <div class="determinate white" style="width: <%= sprintf('%.2f', 100 * ($journey->{journey_completion} // 0)); %>%;"></div> </div> </p> % if (@{$journey->{messages} // []} > 0 and $journey->{messages}[0]) { <p style="margin-bottom: 2ex;"> <ul> % for my $message (reverse @{$journey->{messages} // []}) { % if ($journey->{sched_departure}->epoch - $message->[0]->epoch < 1800) { <li> <i class="material-icons tiny">warning</i> <%= $message->[0]->strftime('%H:%M') %>: <%= $message->[1] %></li> % } % } </ul> </p> % } </div> </div> % } % else { <div class="card grey darken-4"> <div class="card-content white-text"> <span class="card-title"><%= $name %> ist gerade nicht eingecheckt</span> <p> Zuletzt gesehen in <%= $journey->{arr_name} %>. </p> </div> </div> % } templates/account.html.ep +14 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,20 @@ <th scope="row">Passwort</th> <td><a href="/change_password"><i class="material-icons">edit</i> ändern</a></td> </tr> <tr> <th scope="row">Privatsphäre</th> <td> % if ($acc->{is_public} == 0) { Keine öffentlichen Daten % } % else { Öffentliche Daten: % } % if ($acc->{is_public} & 0x02) { Status % } <a href="/account/privacy"><i class="material-icons">edit</i> ändern</a></td> </tr> <tr> <th scope="row">Registriert am</th> <td><%= $acc->{registered_at}->strftime('%d.%m.%Y %H:%M') %></td> Loading Loading
lib/Travelynx.pm +35 −0 Original line number Diff line number Diff line Loading @@ -774,6 +774,38 @@ sub startup { } ); $self->helper( 'get_privacy_by_name' => sub { my ( $self, $name ) = @_; my $res = $self->pg->db->select( 'users', [ 'id', 'public_level' ], { name => $name, status => 1 } ); if ( my $user = $res->hash ) { return $user; } return; } ); $self->helper( 'set_privacy' => sub { my ( $self, $uid, $public_level ) = @_; $self->pg->db->update( 'users', { public_level => $public_level }, { id => $uid } ); } ); $self->helper( 'mark_for_password_reset' => sub { my ( $self, $db, $uid, $token ) = @_; Loading Loading @@ -1696,6 +1728,7 @@ sub startup { $r->get('/recover/:id/:token')->to('account#recover_password'); $r->get('/register')->to('account#registration_form'); $r->get('/reg/:id/:token')->to('account#verify'); $r->get('/status/:name')->to('traveling#user_status'); $r->post('/action')->to('traveling#log_action'); $r->post('/geolocation')->to('traveling#geolocation'); $r->post('/list_departures')->to('traveling#redirect_to_station'); Loading @@ -1715,6 +1748,7 @@ sub startup { ); $authed_r->get('/account')->to('account#account'); $authed_r->get('/account/privacy')->to('account#privacy'); $authed_r->get('/ajax/status_card.html')->to('traveling#status_card'); $authed_r->get('/cancelled')->to('traveling#cancelled'); $authed_r->get('/change_password')->to('account#password_form'); Loading @@ -1728,6 +1762,7 @@ sub startup { $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'); $authed_r->post('/account/privacy')->to('account#privacy'); $authed_r->post('/journey/add')->to('traveling#add_journey_form'); $authed_r->post('/journey/edit')->to('traveling#edit_journey'); $authed_r->post('/change_password')->to('account#change_password'); Loading
lib/Travelynx/Controller/Account.pm +22 −0 Original line number Diff line number Diff line Loading @@ -208,6 +208,28 @@ sub do_logout { $self->redirect_to('/login'); } sub privacy { my ($self) = @_; my $user = $self->current_user; my $public_level = $user->{is_public}; if ( $self->param('action') and $self->param('action') eq 'save' ) { if ( $self->param('public_status') ) { $public_level |= 0x02; } else { $public_level &= ~0x02; } $self->set_privacy( $user->{id}, $public_level ); } else { $self->param( public_status => $public_level & 0x02 ? 1 : 0 ); } $self->render( 'privacy', name => $user->{name} ); } sub change_mail { my ($self) = @_; Loading
lib/Travelynx/Controller/Traveling.pm +38 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,44 @@ sub homepage { } } sub user_status { my ($self) = @_; my $name = $self->stash('name'); my $user = $self->get_privacy_by_name($name); if ( $user and ( $user->{public_level} & 0x02 ) ) { my $status = $self->get_user_status( $user->{id} ); $self->render( 'user_status', name => $name, journey => $status ); } else { $self->render('not_found'); } } sub public_status_card { my ($self) = @_; my $name = $self->stash('name'); my $user = $self->get_privacy_by_name($name); if ( $user and ( $user->{public_level} & 0x02 ) ) { my $status = $self->get_user_status( $user->{id} ); $self->render( '_public_status_card', name => $name, journey => $status ); } else { $self->render('not_found'); } } sub status_card { my ($self) = @_; my $status = $self->get_user_status; Loading
templates/_public_status_card.html.ep 0 → 100644 +87 −0 Original line number Diff line number Diff line % if ($journey->{checked_in}) { <div class="card green darken-4"> <div class="card-content white-text"> <span class="card-title"><%= $name %> ist unterwegs</span> <p> In <b><%= $journey->{train_type} %> <%= $journey->{train_no} %></b> % if ($journey->{arr_name}) { von <b><%= $journey->{dep_name} %></b> nach <b><%= $journey->{arr_name} %></b>. % } % else { ab <b><%= $journey->{dep_name} %></b>. % } </p> <p> <b><%= $journey->{real_departure}->strftime('%H:%M') %></b> % if ($journey->{real_departure}->epoch != $journey->{sched_departure}->epoch) { (<%= sprintf('%+d', ($journey->{real_departure}->epoch - $journey->{sched_departure}->epoch)/60) %>) % } → % if ($journey->{real_arrival}->epoch) { <b><%= $journey->{real_arrival}->strftime('%H:%M') %></b> % if ($journey->{real_arrival}->epoch != $journey->{sched_arrival}->epoch) { (<%= sprintf('%+d', ($journey->{real_arrival}->epoch - $journey->{sched_arrival}->epoch)/60) %>) % } % } % elsif ($journey->{arr_name}) { noch nicht bekannt % } % else { unbekannt % } </p> <p> <div class="center"> % if ($journey->{departure_countdown} > 120) { Abfahrt in <%= sprintf('%.f', $journey->{departure_countdown} / 60) %> Minuten % } % elsif ($journey->{departure_countdown} > 60) { Abfahrt in einer Minute % } % elsif ($journey->{departure_countdown} > 0) { Abfahrt in weniger als einer Minute % } % elsif (defined $journey->{arrival_countdown}) { % if ($journey->{arrival_countdown} > 60) { Ankunft in <%= sprintf('%.f', $journey->{arrival_countdown} / 60) %> Minute<%= sprintf('%.f', $journey->{arrival_countdown} / 60) == 1 ? '' : 'n' %> % } % elsif ($journey->{arrival_countdown} > 0) { Ankunft in weniger als einer Minute % } % else { Ziel erreicht % } % } % elsif ($journey->{arr_name}) { Ankunft in mehr als zwei Stunden % } </div> <div class="progress green darken-3" style="height: 1ex;"> <div class="determinate white" style="width: <%= sprintf('%.2f', 100 * ($journey->{journey_completion} // 0)); %>%;"></div> </div> </p> % if (@{$journey->{messages} // []} > 0 and $journey->{messages}[0]) { <p style="margin-bottom: 2ex;"> <ul> % for my $message (reverse @{$journey->{messages} // []}) { % if ($journey->{sched_departure}->epoch - $message->[0]->epoch < 1800) { <li> <i class="material-icons tiny">warning</i> <%= $message->[0]->strftime('%H:%M') %>: <%= $message->[1] %></li> % } % } </ul> </p> % } </div> </div> % } % else { <div class="card grey darken-4"> <div class="card-content white-text"> <span class="card-title"><%= $name %> ist gerade nicht eingecheckt</span> <p> Zuletzt gesehen in <%= $journey->{arr_name} %>. </p> </div> </div> % }
templates/account.html.ep +14 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,20 @@ <th scope="row">Passwort</th> <td><a href="/change_password"><i class="material-icons">edit</i> ändern</a></td> </tr> <tr> <th scope="row">Privatsphäre</th> <td> % if ($acc->{is_public} == 0) { Keine öffentlichen Daten % } % else { Öffentliche Daten: % } % if ($acc->{is_public} & 0x02) { Status % } <a href="/account/privacy"><i class="material-icons">edit</i> ändern</a></td> </tr> <tr> <th scope="row">Registriert am</th> <td><%= $acc->{registered_at}->strftime('%d.%m.%Y %H:%M') %></td> Loading