2013-09-18 01:38:36 +02:00
< ? php
2018-09-25 17:33:31 +02:00
use Carbon\Carbon ;
2020-09-06 23:50:36 +02:00
use Engelsystem\Models\Room ;
2018-10-08 19:30:37 +02:00
use Engelsystem\Models\User\User ;
2020-09-12 19:45:25 +02:00
use Engelsystem\Models\Worklog ;
2020-11-24 17:22:52 +01:00
use Engelsystem\Renderer\Renderer ;
2020-09-12 19:45:25 +02:00
use Illuminate\Support\Collection ;
2020-11-22 14:45:24 +01:00
use Illuminate\Support\Str ;
2020-11-24 17:27:21 +01:00
use Engelsystem\Controllers\SettingsController ;
2018-09-25 17:33:31 +02:00
2016-11-11 16:34:23 +01:00
/**
* Renders user settings page
*
2018-10-11 01:26:34 +02:00
* @ param User $user_source The user
2017-01-03 03:22:48 +01:00
* @ param array $locales Available languages
* @ param array $themes Available themes
* @ param int $buildup_start_date Unix timestamp
* @ param int $teardown_end_date Unix timestamp
* @ param bool $enable_tshirt_size
* @ param array $tshirt_sizes
2020-11-15 18:47:30 +01:00
* @ param array $oauth2_providers
*
2017-01-03 03:22:48 +01:00
* @ return string
2016-11-11 16:34:23 +01:00
*/
2017-01-02 15:43:36 +01:00
function User_settings_view (
$user_source ,
$locales ,
$themes ,
$buildup_start_date ,
$teardown_end_date ,
$enable_tshirt_size ,
2020-11-15 18:47:30 +01:00
$tshirt_sizes ,
$oauth2_providers
2017-01-02 15:43:36 +01:00
) {
2018-10-11 01:26:34 +02:00
$personalData = $user_source -> personalData ;
2019-08-24 10:56:59 +02:00
$enable_user_name = config ( 'enable_user_name' );
2019-12-26 19:07:51 +01:00
$enable_pronoun = config ( 'enable_pronoun' );
2019-04-23 12:42:01 +02:00
$enable_dect = config ( 'enable_dect' );
2019-04-23 12:23:35 +02:00
$enable_planned_arrival = config ( 'enable_planned_arrival' );
2020-11-24 17:22:52 +01:00
/** @var Renderer $renderer */
$renderer = app ( Renderer :: class );
return $renderer -> render (
'pages/settings/settings.twig' ,
[
'title' => 'settings.profile' ,
2020-11-24 17:27:21 +01:00
'settings_menu' => app () -> make ( SettingsController :: class ) -> settingsMenu (),
2020-11-24 17:22:52 +01:00
'content' =>
msg ()
. div ( 'row' , [
div ( 'col-md-9' , [
form ([
form_info ( '' , __ ( 'Here you can change your user details.' )),
form_info ( entry_required () . ' = ' . __ ( 'Entry required!' )),
form_text ( 'nick' , __ ( 'Nick' ), $user_source -> name , true ),
$enable_pronoun
? form_text ( 'pronoun' , __ ( 'Pronoun' ), $personalData -> pronoun , false , 15 )
. form_info ( '' , __ ( 'Will be shown on your profile page and in angel lists.' ))
: '' ,
2020-12-02 14:43:11 +01:00
$enable_user_name
? form_text ( 'lastname' , __ ( 'Last name' ), $personalData -> last_name , false , 64 )
: '' ,
$enable_user_name
? form_text ( 'prename' , __ ( 'First name' ), $personalData -> first_name , false , 64 )
: '' ,
2020-11-24 17:22:52 +01:00
$enable_planned_arrival ? form_date (
'planned_arrival_date' ,
__ ( 'Planned date of arrival' ) . ' ' . entry_required (),
$personalData -> planned_arrival_date
? $personalData -> planned_arrival_date -> getTimestamp ()
: '' ,
$buildup_start_date ,
$teardown_end_date
) : '' ,
$enable_planned_arrival ? form_date (
'planned_departure_date' ,
__ ( 'Planned date of departure' ),
$personalData -> planned_departure_date
? $personalData -> planned_departure_date -> getTimestamp ()
: '' ,
$buildup_start_date ,
$teardown_end_date
) : '' ,
2020-12-02 14:43:11 +01:00
$enable_dect ? form_text ( 'dect' , __ ( 'DECT' ), $user_source -> contact -> dect , false , 40 ) : '' ,
form_text ( 'mobile' , __ ( 'Mobile' ), $user_source -> contact -> mobile , false , 40 ),
form_text ( 'mail' , __ ( 'E-Mail' ) . ' ' . entry_required (), $user_source -> email , false , 254 ),
2020-11-24 17:22:52 +01:00
form_checkbox (
'email_shiftinfo' ,
__ (
'The %s is allowed to send me an email (e.g. when my shifts change)' ,
[ config ( 'app_name' )]
),
$user_source -> settings -> email_shiftinfo
),
2020-12-28 16:04:05 +01:00
form_checkbox (
'email_news' ,
__ ( 'Notify me of new news' ),
$user_source -> settings -> email_news
),
2020-11-24 17:22:52 +01:00
form_checkbox (
'email_by_human_allowed' ,
2021-11-29 22:13:49 +01:00
__ ( 'To receive vouchers, agree that nick, email address, worked hours and shirt size will be stored until the next similar event. To withdraw your approval, send an email to <a href="mailto:%s">%1$s</a>.' , [ config ( 'privacy_email' )]),
2020-11-24 17:22:52 +01:00
$user_source -> settings -> email_human
),
$enable_tshirt_size ? form_select (
'tshirt_size' ,
__ ( 'Shirt size' ),
$tshirt_sizes ,
$personalData -> shirt_size ,
__ ( 'Please select...' )
) : '' ,
form_info ( '' , __ ( 'Please visit the angeltypes page to manage your angeltypes.' )),
form_submit ( 'submit' , __ ( 'Save' ))
]),
form ([
form_info ( __ ( 'Here you can choose your color settings:' )),
form_select ( 'theme' , __ ( 'Color settings:' ), $themes , $user_source -> settings -> theme ),
form_submit ( 'submit_theme' , __ ( 'Save' ))
]),
form ([
form_info ( __ ( 'Here you can choose your language:' )),
form_select ( 'language' , __ ( 'Language:' ), $locales , $user_source -> settings -> language ),
form_submit ( 'submit_language' , __ ( 'Save' ))
]),
])
])
]
);
2016-11-11 16:34:23 +01:00
}
2015-12-30 15:48:41 +01:00
/**
* Gui for deleting user with password field .
2017-01-03 03:22:48 +01:00
*
2018-10-09 21:47:31 +02:00
* @ param User $user
2017-01-03 03:22:48 +01:00
* @ return string
2015-12-30 15:48:41 +01:00
*/
2017-01-02 03:57:23 +01:00
function User_delete_view ( $user )
{
2018-08-29 21:55:32 +02:00
return page_with_title ( sprintf ( __ ( 'Delete %s' ), User_Nick_render ( $user )), [
2017-01-02 15:43:36 +01:00
msg (),
buttons ([
2021-07-22 21:22:21 +02:00
button ( user_edit_link ( $user -> id ), icon ( 'chevron-left' ) . __ ( 'back' ))
2017-01-02 15:43:36 +01:00
]),
error (
2018-08-29 21:55:32 +02:00
__ ( 'Do you really want to delete the user including all his shifts and every other piece of his data?' ),
2017-01-02 15:43:36 +01:00
true
),
form ([
2018-08-29 21:55:32 +02:00
form_password ( 'password' , __ ( 'Your password' )),
form_submit ( 'submit' , __ ( 'Delete' ))
2017-01-02 15:43:36 +01:00
])
]);
2015-12-30 15:48:41 +01:00
}
2015-08-12 23:44:39 +02:00
/**
* View for editing the number of given vouchers
2017-01-03 03:22:48 +01:00
*
2018-10-10 03:10:28 +02:00
* @ param User $user
2017-01-03 03:22:48 +01:00
* @ return string
2015-08-12 23:44:39 +02:00
*/
2017-01-02 03:57:23 +01:00
function User_edit_vouchers_view ( $user )
{
2018-08-29 21:55:32 +02:00
return page_with_title ( sprintf ( __ ( '%s\'s vouchers' ), User_Nick_render ( $user )), [
2017-01-02 15:43:36 +01:00
msg (),
buttons ([
2021-07-22 21:22:21 +02:00
button ( user_link ( $user -> id ), icon ( 'chevron-left' ) . __ ( 'back' ))
2017-01-02 15:43:36 +01:00
]),
2017-12-25 23:12:52 +01:00
info ( sprintf (
2018-08-29 21:55:32 +02:00
__ ( 'Angel should receive at least %d vouchers.' ),
2017-12-25 23:12:52 +01:00
User_get_eligable_voucher_count ( $user )
), true ),
2017-08-28 16:21:10 +02:00
form (
[
2018-10-10 03:10:28 +02:00
form_spinner ( 'vouchers' , __ ( 'Number of vouchers given out' ), $user -> state -> got_voucher ),
2018-08-29 21:55:32 +02:00
form_submit ( 'submit' , __ ( 'Save' ))
2017-08-28 16:21:10 +02:00
],
2018-10-10 03:10:28 +02:00
page_link_to ( 'users' , [ 'action' => 'edit_vouchers' , 'user_id' => $user -> id ])
2017-08-28 16:21:10 +02:00
)
2017-01-02 15:43:36 +01:00
]);
2015-08-12 23:44:39 +02:00
}
2017-01-03 03:22:48 +01:00
/**
2018-10-11 01:26:34 +02:00
* @ param User [] $users
* @ param string $order_by
* @ param int $arrived_count
* @ param int $active_count
* @ param int $force_active_count
* @ param int $freeloads_count
* @ param int $tshirts_count
* @ param int $voucher_count
2017-01-03 03:22:48 +01:00
* @ return string
*/
2017-01-02 15:43:36 +01:00
function Users_view (
$users ,
$order_by ,
$arrived_count ,
$active_count ,
$force_active_count ,
$freeloads_count ,
$tshirts_count ,
$voucher_count
) {
2018-10-11 01:26:34 +02:00
$usersList = [];
foreach ( $users as $user ) {
$u = [];
2019-12-26 19:07:51 +01:00
$u [ 'name' ] = User_Nick_render ( $user ) . User_Pronoun_render ( $user );
2018-10-17 01:30:10 +02:00
$u [ 'first_name' ] = $user -> personalData -> first_name ;
$u [ 'last_name' ] = $user -> personalData -> last_name ;
2021-01-12 14:19:24 +01:00
$u [ 'dect' ] = sprintf ( '<a href="tel:%s">%1$s</a>' , $user -> contact -> dect );
2021-07-22 21:22:21 +02:00
$u [ 'arrived' ] = icon_bool ( $user -> state -> arrived );
2018-10-17 01:30:10 +02:00
$u [ 'got_voucher' ] = $user -> state -> got_voucher ;
2018-10-11 01:26:34 +02:00
$u [ 'freeloads' ] = $user -> getAttribute ( 'freeloads' );
2021-07-22 21:22:21 +02:00
$u [ 'active' ] = icon_bool ( $user -> state -> active );
$u [ 'force_active' ] = icon_bool ( $user -> state -> force_active );
$u [ 'got_shirt' ] = icon_bool ( $user -> state -> got_shirt );
2018-10-17 01:30:10 +02:00
$u [ 'shirt_size' ] = $user -> personalData -> shirt_size ;
2019-07-25 17:40:59 +02:00
$u [ 'arrival_date' ] = $user -> personalData -> planned_arrival_date
2019-07-25 18:53:27 +02:00
? $user -> personalData -> planned_arrival_date -> format ( __ ( 'Y-m-d' )) : '' ;
2019-07-25 17:40:59 +02:00
$u [ 'departure_date' ] = $user -> personalData -> planned_departure_date
2019-07-25 18:53:27 +02:00
? $user -> personalData -> planned_departure_date -> format ( __ ( 'Y-m-d' )) : '' ;
2018-10-17 01:30:10 +02:00
$u [ 'last_login_at' ] = $user -> last_login_at ? $user -> last_login_at -> format ( __ ( 'm/d/Y h:i a' )) : '' ;
2018-10-11 01:26:34 +02:00
$u [ 'actions' ] = table_buttons ([
2021-07-23 01:52:19 +02:00
button_icon ( page_link_to ( 'admin_user' , [ 'id' => $user -> id ]), 'pencil-square' , 'btn-sm' )
2017-01-02 15:43:36 +01:00
]);
2018-10-11 01:26:34 +02:00
$usersList [] = $u ;
2017-01-02 03:57:23 +01:00
}
2018-10-11 01:26:34 +02:00
$usersList [] = [
2018-10-17 01:30:10 +02:00
'name' => '<strong>' . __ ( 'Sum' ) . '</strong>' ,
'arrived' => $arrived_count ,
2017-01-02 15:43:36 +01:00
'got_voucher' => $voucher_count ,
2018-10-17 01:30:10 +02:00
'active' => $active_count ,
2017-01-02 15:43:36 +01:00
'force_active' => $force_active_count ,
'freeloads' => $freeloads_count ,
2018-10-17 01:30:10 +02:00
'got_shirt' => $tshirts_count ,
2018-10-11 01:26:34 +02:00
'actions' => '<strong>' . count ( $usersList ) . '</strong>'
2017-01-02 15:43:36 +01:00
];
2019-08-24 10:56:59 +02:00
$user_table_headers = [
2019-10-08 15:23:46 +02:00
'name' => Users_table_header_link ( 'name' , __ ( 'Nick' ), $order_by )
2019-08-24 10:56:59 +02:00
];
2019-10-08 15:23:46 +02:00
if ( config ( 'enable_user_name' )) {
2019-08-24 10:56:59 +02:00
$user_table_headers [ 'first_name' ] = Users_table_header_link ( 'first_name' , __ ( 'Prename' ), $order_by );
$user_table_headers [ 'last_name' ] = Users_table_header_link ( 'last_name' , __ ( 'Name' ), $order_by );
}
2019-10-08 15:23:46 +02:00
if ( config ( 'enable_dect' )) {
2019-08-24 10:56:59 +02:00
$user_table_headers [ 'dect' ] = Users_table_header_link ( 'dect' , __ ( 'DECT' ), $order_by );
}
$user_table_headers [ 'arrived' ] = Users_table_header_link ( 'arrived' , __ ( 'Arrived' ), $order_by );
$user_table_headers [ 'got_voucher' ] = Users_table_header_link ( 'got_voucher' , __ ( 'Voucher' ), $order_by );
2020-04-24 20:01:26 +02:00
$user_table_headers [ 'freeloads' ] = Users_table_header_link ( 'freeloads' , __ ( 'Freeloads' ), $order_by );
2019-08-24 10:56:59 +02:00
$user_table_headers [ 'active' ] = Users_table_header_link ( 'active' , __ ( 'Active' ), $order_by );
$user_table_headers [ 'force_active' ] = Users_table_header_link ( 'force_active' , __ ( 'Forced' ), $order_by );
$user_table_headers [ 'got_shirt' ] = Users_table_header_link ( 'got_shirt' , __ ( 'T-Shirt' ), $order_by );
$user_table_headers [ 'shirt_size' ] = Users_table_header_link ( 'shirt_size' , __ ( 'Size' ), $order_by );
2019-10-08 15:23:46 +02:00
$user_table_headers [ 'arrival_date' ] = Users_table_header_link (
'planned_arrival_date' ,
__ ( 'Planned arrival' ),
$order_by
);
$user_table_headers [ 'departure_date' ] = Users_table_header_link (
'planned_departure_date' ,
__ ( 'Planned departure' ),
$order_by
);
2019-08-24 10:56:59 +02:00
$user_table_headers [ 'last_login_at' ] = Users_table_header_link ( 'last_login_at' , __ ( 'Last login' ), $order_by );
$user_table_headers [ 'actions' ] = '' ;
2018-08-29 21:55:32 +02:00
return page_with_title ( __ ( 'All users' ), [
2017-01-02 15:43:36 +01:00
msg (),
buttons ([
2021-07-22 21:22:21 +02:00
button ( page_link_to ( 'register' ), icon ( 'plus-lg' ) . __ ( 'New user' ))
2017-01-02 15:43:36 +01:00
]),
2019-08-24 10:56:59 +02:00
table ( $user_table_headers , $usersList )
2017-01-02 15:43:36 +01:00
]);
2014-09-28 14:50:08 +02:00
}
2017-01-03 03:22:48 +01:00
/**
* @ param string $column
* @ param string $label
* @ param string $order_by
* @ return string
*/
2017-01-02 03:57:23 +01:00
function Users_table_header_link ( $column , $label , $order_by )
{
2017-08-28 16:21:10 +02:00
return '<a href="'
. page_link_to ( 'users' , [ 'OrderBy' => $column ])
. '">'
. $label . ( $order_by == $column ? ' <span class="caret"></span>' : '' )
. '</a>' ;
2014-09-28 14:50:08 +02:00
}
2017-01-03 03:22:48 +01:00
/**
2018-10-17 01:30:10 +02:00
* @ param User $user
2017-01-03 03:22:48 +01:00
* @ return string | false
*/
2017-01-02 03:57:23 +01:00
function User_shift_state_render ( $user )
{
2018-10-17 01:30:10 +02:00
if ( ! $user -> state -> arrived ) {
2017-12-24 10:21:52 +01:00
return '' ;
}
2017-12-25 23:12:52 +01:00
2018-10-17 01:30:10 +02:00
$upcoming_shifts = ShiftEntries_upcoming_for_user ( $user -> id );
2017-01-21 13:58:53 +01:00
if ( empty ( $upcoming_shifts )) {
2018-08-29 21:55:32 +02:00
return '<span class="text-success">' . __ ( 'Free' ) . '</span>' ;
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-21 13:58:53 +01:00
$nextShift = array_shift ( $upcoming_shifts );
if ( $nextShift [ 'start' ] > time ()) {
if ( $nextShift [ 'start' ] - time () > 3600 ) {
2017-12-25 23:12:52 +01:00
return '<span class="text-success moment-countdown" data-timestamp="' . $nextShift [ 'start' ] . '">'
2018-08-29 21:55:32 +02:00
. __ ( 'Next shift %c' )
2017-12-25 23:12:52 +01:00
. '</span>' ;
2017-01-02 03:57:23 +01:00
}
2017-12-25 23:12:52 +01:00
return '<span class="text-warning moment-countdown" data-timestamp="' . $nextShift [ 'start' ] . '">'
2018-08-29 21:55:32 +02:00
. __ ( 'Next shift %c' )
2017-12-25 23:12:52 +01:00
. '</span>' ;
2016-09-29 11:18:17 +02:00
}
2017-01-21 13:58:53 +01:00
$halfway = ( $nextShift [ 'start' ] + $nextShift [ 'end' ]) / 2 ;
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
if ( time () < $halfway ) {
2017-12-25 23:12:52 +01:00
return '<span class="text-danger moment-countdown" data-timestamp="' . $nextShift [ 'start' ] . '">'
2018-08-29 21:55:32 +02:00
. __ ( 'Shift started %c' )
2017-12-25 23:12:52 +01:00
. '</span>' ;
2017-01-02 03:57:23 +01:00
}
2017-12-25 23:12:52 +01:00
return '<span class="text-danger moment-countdown" data-timestamp="' . $nextShift [ 'end' ] . '">'
2018-08-29 21:55:32 +02:00
. __ ( 'Shift ends %c' )
2017-12-25 23:12:52 +01:00
. '</span>' ;
2014-08-23 01:55:18 +02:00
}
2019-01-13 16:04:01 +01:00
function User_last_shift_render ( $user )
{
if ( ! $user -> state -> arrived ) {
return '' ;
}
$last_shifts = ShiftEntries_finished_by_user ( $user -> id );
if ( empty ( $last_shifts )) {
return '' ;
}
$lastShift = array_shift ( $last_shifts );
return '<span class="moment-countdown" data-timestamp="' . $lastShift [ 'end' ] . '">'
. __ ( 'Shift ended %c' )
. '</span>' ;
}
2017-01-03 03:22:48 +01:00
/**
* @ param array $needed_angel_type
* @ return string
*/
2017-01-02 03:57:23 +01:00
function User_view_shiftentries ( $needed_angel_type )
{
2020-10-18 01:07:23 +02:00
$shift_info = '<br><a href="'
. page_link_to ( 'angeltypes' , [ 'action' => 'view' , 'angeltype_id' => $needed_angel_type [ 'id' ]])
. '"><b>' . $needed_angel_type [ 'name' ] . '</a>:</b> ' ;
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$shift_entries = [];
foreach ( $needed_angel_type [ 'users' ] as $user_shift ) {
$member = User_Nick_render ( $user_shift );
if ( $user_shift [ 'freeloaded' ]) {
2017-01-03 03:22:48 +01:00
$member = '<del>' . $member . '</del>' ;
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$shift_entries [] = $member ;
}
2017-01-21 19:37:42 +01:00
$shift_info .= join ( ', ' , $shift_entries );
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
return $shift_info ;
2016-11-18 08:47:52 +01:00
}
/**
* Helper that renders a shift line for user view
2017-01-03 03:22:48 +01:00
*
* @ param array $shift
2018-10-10 03:10:28 +02:00
* @ param User $user_source
2017-01-03 03:22:48 +01:00
* @ param bool $its_me
* @ return array
2016-11-18 08:47:52 +01:00
*/
2017-01-02 03:57:23 +01:00
function User_view_myshift ( $shift , $user_source , $its_me )
{
$shift_info = '<a href="' . shift_link ( $shift ) . '">' . $shift [ 'name' ] . '</a>' ;
if ( $shift [ 'title' ]) {
$shift_info .= '<br /><a href="' . shift_link ( $shift ) . '">' . $shift [ 'title' ] . '</a>' ;
}
foreach ( $shift [ 'needed_angeltypes' ] as $needed_angel_type ) {
$shift_info .= User_view_shiftentries ( $needed_angel_type );
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$myshift = [
2021-07-24 21:08:04 +02:00
'date' => icon ( 'calendar3' )
2017-12-27 13:50:53 +01:00
. date ( 'Y-m-d' , $shift [ 'start' ]) . '<br>'
2021-07-22 21:22:21 +02:00
. icon ( 'clock' ) . date ( 'H:i' , $shift [ 'start' ])
2017-12-27 13:50:53 +01:00
. ' - '
. date ( 'H:i' , $shift [ 'end' ]),
2017-12-30 12:07:10 +01:00
'duration' => sprintf ( '%.2f' , ( $shift [ 'end' ] - $shift [ 'start' ]) / 3600 ) . ' h' ,
2020-09-06 23:50:36 +02:00
'room' => Room_name_render ( Room :: find ( $shift [ 'RID' ])),
2017-01-02 15:43:36 +01:00
'shift_info' => $shift_info ,
2017-12-18 11:25:26 +01:00
'comment' => ''
2017-01-02 15:43:36 +01:00
];
2017-12-25 23:12:52 +01:00
if ( $its_me ) {
2017-12-18 11:25:26 +01:00
$myshift [ 'comment' ] = $shift [ 'Comment' ];
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
if ( $shift [ 'freeloaded' ]) {
2017-12-27 13:50:53 +01:00
$myshift [ 'duration' ] = '<p class="text-danger">'
2019-08-23 15:55:22 +02:00
. sprintf ( '%.2f' , - ( $shift [ 'end' ] - $shift [ 'start' ]) / 3600 * 2 ) . ' h'
2017-12-27 13:50:53 +01:00
. '</p>' ;
2018-11-12 14:41:23 +01:00
if ( auth () -> can ( 'user_shifts_admin' )) {
2017-12-25 23:12:52 +01:00
$myshift [ 'comment' ] .= '<br />'
2018-08-29 21:55:32 +02:00
. '<p class="text-danger">' . __ ( 'Freeloaded' ) . ': ' . $shift [ 'freeload_comment' ] . '</p>' ;
2017-01-02 03:57:23 +01:00
} else {
2018-08-29 21:55:32 +02:00
$myshift [ 'comment' ] .= '<br /><p class="text-danger">' . __ ( 'Freeloaded' ) . '</p>' ;
2017-01-02 03:57:23 +01:00
}
2016-11-18 08:47:52 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
$myshift [ 'actions' ] = [
2021-07-23 01:52:19 +02:00
button ( shift_link ( $shift ), icon ( 'eye' ) . __ ( 'view' ), 'btn-sm' )
2017-01-02 15:43:36 +01:00
];
2018-11-12 14:41:23 +01:00
if ( $its_me || auth () -> can ( 'user_shifts_admin' )) {
2017-01-02 15:43:36 +01:00
$myshift [ 'actions' ][] = button (
2018-10-10 03:10:28 +02:00
page_link_to ( 'user_myshifts' , [ 'edit' => $shift [ 'id' ], 'id' => $user_source -> id ]),
2021-07-22 21:22:21 +02:00
icon ( 'pencil-square' ) . __ ( 'edit' ),
2021-07-23 01:52:19 +02:00
'btn-sm'
2017-01-02 15:43:36 +01:00
);
2017-01-02 03:57:23 +01:00
}
2018-10-10 03:10:28 +02:00
if ( Shift_signout_allowed ( $shift , [ 'id' => $shift [ 'TID' ]], $user_source -> id )) {
2017-01-02 15:43:36 +01:00
$myshift [ 'actions' ][] = button (
2017-12-20 00:42:58 +01:00
shift_entry_delete_link ( $shift ),
2021-07-22 21:22:21 +02:00
icon ( 'trash' ) . __ ( 'sign off' ),
2021-07-23 01:52:19 +02:00
'btn-sm'
2017-01-02 15:43:36 +01:00
);
2017-01-02 03:57:23 +01:00
}
$myshift [ 'actions' ] = table_buttons ( $myshift [ 'actions' ]);
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
return $myshift ;
2016-11-18 08:47:52 +01:00
}
/**
* Helper that prepares the shift table for user view
2017-01-03 03:22:48 +01:00
*
2020-09-12 19:45:25 +02:00
* @ param array [] $shifts
* @ param User $user_source
* @ param bool $its_me
* @ param int $tshirt_score
* @ param bool $tshirt_admin
* @ param Worklog [] | Collection $user_worklogs
* @ param bool $admin_user_worklog_privilege
*
2017-01-03 03:22:48 +01:00
* @ return array
2016-11-18 08:47:52 +01:00
*/
2018-01-14 18:09:34 +01:00
function User_view_myshifts (
$shifts ,
$user_source ,
$its_me ,
$tshirt_score ,
$tshirt_admin ,
$user_worklogs ,
$admin_user_worklog_privilege
) {
2017-01-02 03:57:23 +01:00
$myshifts_table = [];
2018-10-11 01:26:34 +02:00
$timeSum = 0 ;
2017-01-02 03:57:23 +01:00
foreach ( $shifts as $shift ) {
2020-04-07 22:01:08 +02:00
$key = $shift [ 'start' ] . '-shift-' . $shift [ 'SID' ] . '-' . $shift [ 'id' ];
2019-08-24 12:32:34 +02:00
$myshifts_table [ $key ] = User_view_myshift ( $shift , $user_source , $its_me );
2017-01-02 15:43:36 +01:00
2017-12-27 12:24:55 +01:00
if ( ! $shift [ 'freeloaded' ]) {
2018-10-11 01:26:34 +02:00
$timeSum += ( $shift [ 'end' ] - $shift [ 'start' ]);
2017-01-02 03:57:23 +01:00
}
2016-09-29 11:18:17 +02:00
}
2017-01-02 15:43:36 +01:00
2018-01-14 18:09:34 +01:00
if ( $its_me || $admin_user_worklog_privilege ) {
foreach ( $user_worklogs as $worklog ) {
2020-09-12 19:45:25 +02:00
$key = $worklog -> worked_at -> timestamp . '-worklog-' . $worklog -> id ;
2019-08-24 12:32:34 +02:00
$myshifts_table [ $key ] = User_view_worklog ( $worklog , $admin_user_worklog_privilege );
2020-09-12 19:45:25 +02:00
$timeSum += $worklog -> hours * 3600 ;
2017-12-29 17:19:27 +01:00
}
}
2017-01-02 03:57:23 +01:00
if ( count ( $myshifts_table ) > 0 ) {
2017-12-29 18:57:11 +01:00
ksort ( $myshifts_table );
2017-01-02 03:57:23 +01:00
$myshifts_table [] = [
2018-08-29 21:55:32 +02:00
'date' => '<b>' . __ ( 'Sum:' ) . '</b>' ,
2018-10-11 01:26:34 +02:00
'duration' => '<b>' . sprintf ( '%.2f' , round ( $timeSum / 3600 , 2 )) . ' h</b>' ,
2017-01-03 14:12:17 +01:00
'room' => '' ,
'shift_info' => '' ,
'comment' => '' ,
'actions' => ''
2017-01-02 15:43:36 +01:00
];
2017-12-27 20:30:05 +01:00
if ( config ( 'enable_tshirt_size' , false ) && ( $its_me || $tshirt_admin )) {
2017-12-27 12:24:55 +01:00
$myshifts_table [] = [
2018-08-29 21:55:32 +02:00
'date' => '<b>' . __ ( 'Your t-shirt score' ) . '™:</b>' ,
2017-12-30 12:07:10 +01:00
'duration' => '<b>' . $tshirt_score . '</b>' ,
2017-12-27 12:24:55 +01:00
'room' => '' ,
'shift_info' => '' ,
'comment' => '' ,
'actions' => ''
];
}
2017-01-02 03:57:23 +01:00
}
return $myshifts_table ;
2016-11-18 08:47:52 +01:00
}
2017-12-29 17:19:27 +01:00
/**
* Renders table entry for user work log
2018-01-14 18:09:34 +01:00
*
2020-09-12 19:45:25 +02:00
* @ param Worklog $worklog
* @ param bool $admin_user_worklog_privilege
2018-01-14 18:09:34 +01:00
* @ return array
2017-12-29 17:19:27 +01:00
*/
2020-09-12 19:45:25 +02:00
function User_view_worklog ( Worklog $worklog , $admin_user_worklog_privilege )
2018-01-14 18:09:34 +01:00
{
2017-12-29 17:19:27 +01:00
$actions = '' ;
2018-01-14 18:09:34 +01:00
if ( $admin_user_worklog_privilege ) {
2017-12-29 17:19:27 +01:00
$actions = table_buttons ([
button (
user_worklog_edit_link ( $worklog ),
2021-07-22 21:22:21 +02:00
icon ( 'pencil-square' ) . __ ( 'edit' ),
2021-07-23 01:52:19 +02:00
'btn-sm'
2017-12-29 17:19:27 +01:00
),
button (
user_worklog_delete_link ( $worklog ),
2021-07-22 21:22:21 +02:00
icon ( 'trash' ) . __ ( 'delete' ),
2021-07-23 01:52:19 +02:00
'btn-sm'
2017-12-29 17:19:27 +01:00
)
]);
}
2018-01-14 17:47:26 +01:00
2017-12-29 17:19:27 +01:00
return [
2021-07-24 21:08:04 +02:00
'date' => icon ( 'calendar3' ) . date ( 'Y-m-d' , $worklog -> worked_at -> timestamp ),
2020-09-12 19:45:25 +02:00
'duration' => sprintf ( '%.2f' , $worklog -> hours ) . ' h' ,
2017-12-29 17:19:27 +01:00
'room' => '' ,
2018-08-29 21:55:32 +02:00
'shift_info' => __ ( 'Work log entry' ),
2020-09-12 19:45:25 +02:00
'comment' => $worklog -> comment . '<br>'
2018-01-14 18:09:34 +01:00
. sprintf (
2018-08-29 21:55:32 +02:00
__ ( 'Added by %s at %s' ),
2020-09-12 19:45:25 +02:00
User_Nick_render ( $worklog -> creator ),
$worklog -> created_at -> format ( 'Y-m-d H:i' )
2018-01-14 18:09:34 +01:00
),
2017-12-29 17:19:27 +01:00
'actions' => $actions
];
}
2016-11-18 08:47:52 +01:00
/**
* Renders view for a single user
2017-01-03 03:22:48 +01:00
*
2020-09-12 19:45:25 +02:00
* @ param User $user_source
* @ param bool $admin_user_privilege
* @ param bool $freeloader
* @ param array [] $user_angeltypes
* @ param array [] $user_groups
* @ param array [] $shifts
* @ param bool $its_me
* @ param int $tshirt_score
* @ param bool $tshirt_admin
* @ param bool $admin_user_worklog_privilege
* @ param Worklog [] | Collection $user_worklogs
*
2017-01-03 03:22:48 +01:00
* @ return string
2016-11-18 08:47:52 +01:00
*/
2017-12-27 13:50:53 +01:00
function User_view (
$user_source ,
$admin_user_privilege ,
$freeloader ,
$user_angeltypes ,
$user_groups ,
$shifts ,
$its_me ,
$tshirt_score ,
2017-12-29 17:19:27 +01:00
$tshirt_admin ,
$admin_user_worklog_privilege ,
$user_worklogs
2017-12-27 13:50:53 +01:00
) {
2020-04-20 00:01:37 +02:00
$auth = auth ();
2018-09-17 12:33:15 +02:00
$nightShiftsConfig = config ( 'night_shifts' );
2018-10-10 03:10:28 +02:00
$user_name = htmlspecialchars (
$user_source -> personalData -> first_name ) . ' ' . htmlspecialchars ( $user_source -> personalData -> last_name
);
2017-12-29 13:18:28 +01:00
$myshifts_table = '' ;
2018-01-14 18:09:34 +01:00
if ( $its_me || $admin_user_privilege ) {
$my_shifts = User_view_myshifts (
$shifts ,
$user_source ,
$its_me ,
$tshirt_score ,
$tshirt_admin ,
$user_worklogs ,
$admin_user_worklog_privilege
);
if ( count ( $my_shifts ) > 0 ) {
2017-12-29 13:18:28 +01:00
$myshifts_table = table ([
2018-08-29 21:55:32 +02:00
'date' => __ ( 'Day & time' ),
'duration' => __ ( 'Duration' ),
'room' => __ ( 'Location' ),
'shift_info' => __ ( 'Name & workmates' ),
'comment' => __ ( 'Comment' ),
'actions' => __ ( 'Action' )
2017-12-29 13:18:28 +01:00
], $my_shifts );
2018-10-10 03:10:28 +02:00
} elseif ( $user_source -> state -> force_active ) {
2018-08-29 21:55:32 +02:00
$myshifts_table = success ( __ ( 'You have done enough to get a t-shirt.' ), true );
2017-12-29 13:18:28 +01:00
}
}
2017-01-02 15:43:36 +01:00
return page_with_title (
2017-12-25 23:12:52 +01:00
'<span class="icon-icon_angel"></span> '
2019-12-26 19:07:51 +01:00
. (
( config ( 'enable_pronoun' ) && $user_source -> personalData -> pronoun )
? '<small>' . htmlspecialchars ( $user_source -> personalData -> pronoun ) . '</small> '
: ''
2020-05-13 18:26:32 +02:00
)
2018-10-10 03:10:28 +02:00
. htmlspecialchars ( $user_source -> name )
2019-08-24 10:56:59 +02:00
. ( config ( 'enable_user_name' ) ? ' <small>' . $user_name . '</small>' : '' ),
2017-01-02 15:43:36 +01:00
[
msg (),
2021-09-10 14:30:16 +02:00
div ( 'row' , [
2017-01-02 15:43:36 +01:00
div ( 'col-md-12' , [
buttons ([
2021-09-24 20:28:51 +02:00
$auth -> can ( 'user.edit.shirt' ) ? button (
url ( '/admin/user/' . $user_source -> id . '/shirt' ),
icon ( 'person' ) . __ ( 'Shirt' )
) : '' ,
2017-01-02 15:43:36 +01:00
$admin_user_privilege ? button (
2018-10-10 03:10:28 +02:00
page_link_to ( 'admin_user' , [ 'id' => $user_source -> id ]),
2021-07-22 21:22:21 +02:00
icon ( 'pencil-square' ) . __ ( 'edit' )
2017-01-02 15:43:36 +01:00
) : '' ,
$admin_user_privilege ? button (
user_driver_license_edit_link ( $user_source ),
2021-07-22 21:22:21 +02:00
icon ( 'wallet2' ) . __ ( 'driving license' )
2017-01-02 15:43:36 +01:00
) : '' ,
2020-09-04 23:52:22 +02:00
(( $admin_user_privilege || $auth -> can ( 'admin_arrive' )) && ! $user_source -> state -> arrived ) ?
2019-06-04 16:00:33 +02:00
form ([
form_hidden ( 'action' , 'arrived' ),
form_hidden ( 'user' , $user_source -> id ),
2021-07-23 01:52:19 +02:00
form_submit ( 'submit' , __ ( 'arrived' ), '' , false , 'primary' )
2019-06-04 16:00:33 +02:00
], page_link_to ( 'admin_arrive' ), true ) : '' ,
2017-01-02 15:43:36 +01:00
$admin_user_privilege ? button (
2017-12-25 23:12:52 +01:00
page_link_to (
'users' ,
2018-10-10 03:10:28 +02:00
[ 'action' => 'edit_vouchers' , 'user_id' => $user_source -> id ]
2017-12-25 23:12:52 +01:00
),
2021-07-22 21:22:21 +02:00
icon ( 'file-binary-fill' ) . __ ( 'Edit vouchers' )
2017-01-02 15:43:36 +01:00
) : '' ,
2017-12-29 17:19:27 +01:00
$admin_user_worklog_privilege ? button (
user_worklog_add_link ( $user_source ),
2021-07-22 21:22:21 +02:00
icon ( 'list' ) . __ ( 'Add work log' )
2017-12-29 17:19:27 +01:00
) : '' ,
2017-12-25 23:12:52 +01:00
$its_me ? button (
page_link_to ( 'user_settings' ),
2021-07-22 21:22:21 +02:00
icon ( 'gear' ) . __ ( 'Settings' )
2017-12-25 23:12:52 +01:00
) : '' ,
2020-04-20 00:01:37 +02:00
( $its_me && $auth -> can ( 'ical' )) ? button (
2018-10-10 03:10:28 +02:00
page_link_to ( 'ical' , [ 'key' => $user_source -> api_key ]),
2021-07-24 21:08:04 +02:00
icon ( 'calendar3' ) . __ ( 'iCal Export' )
2017-01-02 15:43:36 +01:00
) : '' ,
2020-04-20 00:01:37 +02:00
( $its_me && $auth -> can ( 'shifts_json_export' )) ? button (
2018-10-10 03:10:28 +02:00
page_link_to ( 'shifts_json_export' , [ 'key' => $user_source -> api_key ]),
2021-07-22 21:22:21 +02:00
icon ( 'box-arrow-up-right' ) . __ ( 'JSON Export' )
2017-01-02 15:43:36 +01:00
) : '' ,
2020-04-20 00:01:37 +02:00
( $its_me && (
$auth -> can ( 'shifts_json_export' )
|| $auth -> can ( 'ical' )
|| $auth -> can ( 'atom' )
)) ? button (
2017-08-28 16:21:10 +02:00
page_link_to ( 'user_myshifts' , [ 'reset' => 1 ]),
2021-07-22 21:22:21 +02:00
icon ( 'arrow-repeat' ) . __ ( 'Reset API key' )
2017-01-02 15:43:36 +01:00
) : ''
])
])
]),
div ( 'row' , [
2020-11-22 14:45:24 +01:00
div ( 'col-md-2' , [
2021-07-22 21:22:21 +02:00
heading ( icon ( 'phone' )
2021-01-12 14:19:24 +01:00
. '<a href="tel:' . $user_source -> contact -> dect . '">'
. $user_source -> contact -> dect , 1 )
. '</a>'
2017-01-02 15:43:36 +01:00
]),
2017-12-24 10:48:04 +01:00
User_view_state ( $admin_user_privilege , $freeloader , $user_source ),
User_angeltypes_render ( $user_angeltypes ),
2020-11-22 14:45:24 +01:00
User_groups_render ( $user_groups ),
$admin_user_privilege ? User_oauth_render ( $user_source ) : '' ,
2017-01-02 15:43:36 +01:00
]),
2018-08-29 21:55:32 +02:00
( $its_me || $admin_user_privilege ) ? '<h2>' . __ ( 'Shifts' ) . '</h2>' : '' ,
2017-12-29 13:18:28 +01:00
$myshifts_table ,
2018-09-17 12:33:15 +02:00
( $its_me && $nightShiftsConfig [ 'enabled' ]) ? info (
2021-07-24 21:08:04 +02:00
icon ( 'info-circle' ) . sprintf (
2018-09-17 12:33:15 +02:00
__ ( 'Your night shifts between %d and %d am count twice.' ),
$nightShiftsConfig [ 'start' ],
$nightShiftsConfig [ 'end' ]
),
2017-12-25 23:12:52 +01:00
true
) : '' ,
2017-01-02 15:43:36 +01:00
$its_me && count ( $shifts ) == 0
? error ( sprintf (
2018-08-29 21:55:32 +02:00
__ ( 'Go to the <a href="%s">shifts table</a> to sign yourself up for some shifts.' ),
2017-01-02 15:43:36 +01:00
page_link_to ( 'user_shifts' )
), true )
2017-12-26 20:41:35 +01:00
: '' ,
2020-04-07 16:28:03 +02:00
$its_me ? ical_hint () : ''
2017-01-03 03:22:48 +01:00
]
);
2014-08-22 22:34:13 +02:00
}
2017-12-24 10:21:52 +01:00
/**
2017-12-25 23:12:52 +01:00
* Render the state section of user view
*
2018-10-10 03:10:28 +02:00
* @ param bool $admin_user_privilege
* @ param bool $freeloader
* @ param User $user_source
2017-12-25 23:12:52 +01:00
* @ return string
2017-12-24 10:21:52 +01:00
*/
2017-12-25 23:12:52 +01:00
function User_view_state ( $admin_user_privilege , $freeloader , $user_source )
{
if ( $admin_user_privilege ) {
2017-12-24 10:48:04 +01:00
$state = User_view_state_admin ( $freeloader , $user_source );
} else {
$state = User_view_state_user ( $user_source );
}
2020-11-22 14:45:24 +01:00
return div ( 'col-md-2' , [
2018-08-29 21:55:32 +02:00
heading ( __ ( 'User state' ), 4 ),
2017-12-24 10:48:04 +01:00
join ( '<br>' , $state )
]);
}
/**
* Render the state section of user view for users .
2017-12-25 23:12:52 +01:00
*
2018-10-10 03:10:28 +02:00
* @ param User $user_source
2017-12-25 23:12:52 +01:00
* @ return array
2017-12-24 10:48:04 +01:00
*/
2017-12-25 23:12:52 +01:00
function User_view_state_user ( $user_source )
{
2017-12-24 10:21:52 +01:00
$state = [
2017-12-24 10:48:04 +01:00
User_shift_state_render ( $user_source )
2017-12-24 10:21:52 +01:00
];
2017-12-25 23:12:52 +01:00
2018-10-10 03:10:28 +02:00
if ( $user_source -> state -> arrived ) {
2021-07-22 21:22:21 +02:00
$state [] = '<span class="text-success">' . icon ( 'house' ) . __ ( 'Arrived' ) . '</span>' ;
2017-12-24 10:48:04 +01:00
} else {
2018-08-29 21:55:32 +02:00
$state [] = '<span class="text-danger">' . __ ( 'Not arrived' ) . '</span>' ;
2017-12-24 10:48:04 +01:00
}
2017-12-25 23:12:52 +01:00
2017-12-24 10:48:04 +01:00
return $state ;
}
/**
* Render the state section of user view for admins .
2017-12-25 23:12:52 +01:00
*
2018-10-10 03:10:28 +02:00
* @ param bool $freeloader
* @ param User $user_source
2017-12-25 23:12:52 +01:00
* @ return array
2017-12-24 10:48:04 +01:00
*/
2017-12-25 23:12:52 +01:00
function User_view_state_admin ( $freeloader , $user_source )
{
2017-12-24 10:48:04 +01:00
$state = [];
2017-12-25 23:12:52 +01:00
if ( $freeloader ) {
2021-07-22 21:22:21 +02:00
$state [] = '<span class="text-danger">' . icon ( 'exclamation-circle' ) . __ ( 'Freeloader' ) . '</span>' ;
2017-12-24 10:21:52 +01:00
}
2017-12-25 23:12:52 +01:00
2017-12-24 10:21:52 +01:00
$state [] = User_shift_state_render ( $user_source );
2017-12-25 23:12:52 +01:00
2018-10-10 03:10:28 +02:00
if ( $user_source -> state -> arrived ) {
2021-07-22 21:22:21 +02:00
$state [] = '<span class="text-success">' . icon ( 'house' )
2018-10-10 03:10:28 +02:00
. sprintf (
__ ( 'Arrived at %s' ),
2018-10-14 00:26:05 +02:00
$user_source -> state -> arrival_date ? $user_source -> state -> arrival_date -> format ( 'Y-m-d' ) : ''
2018-10-10 03:10:28 +02:00
)
2017-12-24 10:48:04 +01:00
. '</span>' ;
2018-10-10 03:10:28 +02:00
if ( $user_source -> state -> force_active ) {
2018-08-29 21:55:32 +02:00
$state [] = '<span class="text-success">' . __ ( 'Active (forced)' ) . '</span>' ;
2018-10-10 03:10:28 +02:00
} elseif ( $user_source -> state -> active ) {
2018-08-29 21:55:32 +02:00
$state [] = '<span class="text-success">' . __ ( 'Active' ) . '</span>' ;
2017-12-24 10:21:52 +01:00
}
2018-10-17 01:30:10 +02:00
if ( $user_source -> state -> got_shirt ) {
2018-08-29 21:55:32 +02:00
$state [] = '<span class="text-success">' . __ ( 'T-Shirt' ) . '</span>' ;
2017-12-24 10:21:52 +01:00
}
2017-12-24 10:48:04 +01:00
} else {
2018-10-10 03:10:28 +02:00
$arrivalDate = $user_source -> personalData -> planned_arrival_date ;
2017-12-24 10:48:04 +01:00
$state [] = '<span class="text-danger">'
2020-09-21 22:47:14 +02:00
. ( $arrivalDate ? sprintf (
2018-10-10 03:10:28 +02:00
__ ( 'Not arrived (Planned: %s)' ),
2020-09-21 22:47:14 +02:00
$arrivalDate -> format ( 'Y-m-d' )
) : __ ( 'Not arrived' ))
2017-12-24 10:48:04 +01:00
. '</span>' ;
2017-12-24 10:21:52 +01:00
}
2017-12-25 23:12:52 +01:00
2020-10-18 00:52:27 +02:00
$voucherCount = $user_source -> state -> got_voucher ;
$availableCount = $voucherCount + User_get_eligable_voucher_count ( $user_source );
$availableCount = max ( $voucherCount , $availableCount );
2018-10-10 03:10:28 +02:00
if ( $user_source -> state -> got_voucher > 0 ) {
2017-12-24 10:48:04 +01:00
$state [] = '<span class="text-success">'
2021-07-22 21:22:21 +02:00
. icon ( 'file-binary-fill' )
2020-10-18 00:52:27 +02:00
. __ ( 'Got %s of %s vouchers' , [ $voucherCount , $availableCount ])
2017-12-25 23:12:52 +01:00
. '</span>' ;
2017-12-24 10:48:04 +01:00
} else {
2020-10-18 00:52:27 +02:00
$state [] = '<span class="text-danger">'
. __ ( 'Got no vouchers' )
. ( $availableCount ? ' (' . __ ( 'out of %s' , [ $availableCount ]) . ')' : '' )
. '</span>' ;
2017-12-24 10:21:52 +01:00
}
2017-12-24 10:48:04 +01:00
return $state ;
2017-12-24 10:21:52 +01:00
}
2017-01-03 03:22:48 +01:00
/**
* @ param array [] $user_angeltypes
* @ return string
*/
2017-01-02 03:57:23 +01:00
function User_angeltypes_render ( $user_angeltypes )
{
$output = [];
foreach ( $user_angeltypes as $angeltype ) {
2017-01-03 03:22:48 +01:00
$class = 'text-success' ;
2018-01-14 17:47:26 +01:00
if ( $angeltype [ 'restricted' ] == 1 && empty ( $angeltype [ 'confirm_user_id' ])) {
2017-01-03 03:22:48 +01:00
$class = 'text-warning' ;
2017-01-02 03:57:23 +01:00
}
2017-01-03 14:12:17 +01:00
$output [] = '<a href="' . angeltype_link ( $angeltype [ 'id' ]) . '" class="' . $class . '">'
2021-07-22 21:22:21 +02:00
. ( $angeltype [ 'supporter' ] ? icon ( 'patch-check' ) : '' ) . $angeltype [ 'name' ]
2017-01-03 14:12:17 +01:00
. '</a>' ;
2016-09-29 11:18:17 +02:00
}
2020-11-22 14:45:24 +01:00
return div ( 'col-md-2' , [
2018-08-29 21:55:32 +02:00
heading ( __ ( 'Angeltypes' ), 4 ),
2017-12-24 10:48:04 +01:00
join ( '<br>' , $output )
]);
2014-08-23 01:55:18 +02:00
}
2017-01-03 03:22:48 +01:00
/**
* @ param array [] $user_groups
* @ return string
*/
2017-01-02 03:57:23 +01:00
function User_groups_render ( $user_groups )
{
$output = [];
foreach ( $user_groups as $group ) {
2018-10-24 16:25:10 +02:00
$groupName = preg_replace ( '/(^\d+-)/' , '' , $group [ 'Name' ]);
$output [] = __ ( $groupName );
2017-01-02 03:57:23 +01:00
}
2017-12-24 10:48:04 +01:00
2020-11-22 14:45:24 +01:00
return div ( 'col-md-2' , [
2018-08-29 21:55:32 +02:00
'<h4>' . __ ( 'Rights' ) . '</h4>' ,
2017-12-24 10:48:04 +01:00
join ( '<br>' , $output )
]);
2014-08-23 01:55:18 +02:00
}
2020-11-22 14:45:24 +01:00
/**
* @ param User $user
* @ return string
*/
function User_oauth_render ( User $user )
{
$config = config ( 'oauth' );
$output = [];
foreach ( $user -> oauth as $oauth ) {
$output [] = __ (
isset ( $config [ $oauth -> provider ][ 'name' ])
? $config [ $oauth -> provider ][ 'name' ]
: Str :: ucfirst ( $oauth -> provider )
);
}
return div ( 'col-md-2' , [
heading ( __ ( 'OAuth' ), 4 ),
join ( '<br>' , $output ),
]);
}
2013-09-18 01:38:36 +02:00
/**
* Render a user nickname .
2013-12-26 13:34:48 +01:00
*
2018-10-09 21:47:31 +02:00
* @ param array | User $user
2019-05-31 04:03:19 +02:00
* @ param bool $plain
2013-09-18 01:38:36 +02:00
* @ return string
*/
2019-05-31 04:03:19 +02:00
function User_Nick_render ( $user , $plain = false )
2017-01-02 03:57:23 +01:00
{
2018-10-17 01:30:10 +02:00
if ( is_array ( $user )) {
$user = ( new User ()) -> forceFill ( $user );
2018-10-09 21:47:31 +02:00
}
2019-05-31 04:03:19 +02:00
if ( $plain ) {
return sprintf ( '%s (%u)' , $user -> name , $user -> id );
}
2017-11-19 16:29:51 +01:00
return render_profile_link (
2018-10-17 01:30:10 +02:00
'<span class="icon-icon_angel"></span> ' . htmlspecialchars ( $user -> name ) . '</a>' ,
$user -> id ,
( $user -> state -> arrived ? '' : 'text-muted' )
2017-11-19 16:29:51 +01:00
);
}
2019-12-26 19:07:51 +01:00
/**
* Format the user pronoun
*
* @ param User $user
* @ return string
*/
function User_Pronoun_render ( User $user ) : string
{
if ( ! config ( 'enable_pronoun' ) || ! $user -> personalData -> pronoun ) {
return '' ;
}
return ' (' . htmlspecialchars ( $user -> personalData -> pronoun ) . ')' ;
}
2017-11-19 16:29:51 +01:00
/**
* @ param string $text
* @ param int $user_id
* @ param string $class
* @ return string
*/
function render_profile_link ( $text , $user_id = null , $class = '' )
{
$profile_link = page_link_to ( 'user-settings' );
if ( ! is_null ( $user_id )) {
$profile_link = page_link_to ( 'users' , [ 'action' => 'view' , 'user_id' => $user_id ]);
}
return sprintf (
'<a class="%s" href="%s">%s</a>' ,
$class ,
$profile_link ,
$text
);
2013-09-18 01:38:36 +02:00
}
2017-01-03 03:22:48 +01:00
/**
* @ return string | null
*/
2017-01-02 03:57:23 +01:00
function render_user_departure_date_hint ()
{
2019-04-23 12:23:35 +02:00
if ( config ( 'enable_planned_arrival' ) && ! auth () -> user () -> personalData -> planned_departure_date ) {
2018-08-29 21:55:32 +02:00
$text = __ ( 'Please enter your planned date of departure on your settings page to give us a feeling for teardown capacities.' );
2021-07-24 12:38:23 +02:00
return render_profile_link ( $text , null , 'text-danger' );
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
return null ;
2016-11-15 16:28:20 +01:00
}
2017-01-03 03:22:48 +01:00
/**
* @ return string | null
*/
2017-01-02 03:57:23 +01:00
function render_user_freeloader_hint ()
{
2018-10-10 03:10:28 +02:00
if ( User_is_freeloader ( auth () -> user ())) {
2017-01-02 15:43:36 +01:00
return sprintf (
2018-08-29 21:55:32 +02:00
__ ( 'You freeloaded at least %s shifts. Shift signup is locked. Please go to heavens desk to be unlocked again.' ),
2017-01-21 23:07:20 +01:00
config ( 'max_freeloadable_shifts' )
2017-01-02 15:43:36 +01:00
);
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
return null ;
2016-11-15 16:28:20 +01:00
}
2017-01-03 03:22:48 +01:00
/**
* Hinweis für Engel , die noch nicht angekommen sind
*
* @ return string | null
*/
2017-01-02 03:57:23 +01:00
function render_user_arrived_hint ()
{
2018-10-17 01:30:10 +02:00
if ( ! auth () -> user () -> state -> arrived ) {
2018-09-25 17:33:31 +02:00
/** @var Carbon $buildup */
$buildup = config ( 'buildup_start' );
if ( ! empty ( $buildup ) && $buildup -> lessThan ( new Carbon ())) {
2018-08-29 21:55:32 +02:00
return __ ( 'You are not marked as arrived. Please go to heaven\'s desk, get your angel badge and/or tell them that you arrived already.' );
2017-11-30 21:32:04 +01:00
}
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
return null ;
2016-11-15 16:28:20 +01:00
}
2017-01-03 03:22:48 +01:00
/**
* @ return string | null
*/
2017-01-02 03:57:23 +01:00
function render_user_tshirt_hint ()
{
2018-10-17 01:30:10 +02:00
if ( config ( 'enable_tshirt_size' ) && ! auth () -> user () -> personalData -> shirt_size ) {
2018-08-29 21:55:32 +02:00
$text = __ ( 'You need to specify a tshirt size in your settings!' );
2021-07-24 12:38:23 +02:00
return render_profile_link ( $text , null , 'text-danger' );
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
return null ;
2016-11-15 16:28:20 +01:00
}
2017-01-03 03:22:48 +01:00
/**
* @ return string | null
*/
2017-01-02 03:57:23 +01:00
function render_user_dect_hint ()
{
2018-10-09 21:47:31 +02:00
$user = auth () -> user ();
2019-04-23 12:42:01 +02:00
if ( $user -> state -> arrived && config ( 'enable_dect' ) && ! $user -> contact -> dect ) {
2018-08-29 21:55:32 +02:00
$text = __ ( 'You need to specify a DECT phone number in your settings! If you don\'t have a DECT phone, just enter \'-\'.' );
2021-07-24 12:38:23 +02:00
return render_profile_link ( $text , null , 'text-danger' );
2017-01-02 03:57:23 +01:00
}
2017-01-02 15:43:36 +01:00
2017-01-02 03:57:23 +01:00
return null ;
2016-11-15 16:28:20 +01:00
}