id), icon('chevron-left') . __('back')),
]),
error(
__('Do you really want to delete the user including all his shifts and every other piece of his data?'),
true
),
form([
form_password('password', __('Your password'), 'current-password'),
form_submit('submit', __('Delete')),
]),
]);
}
/**
* View for editing the number of given vouchers
*
* @param User $user
* @return string
*/
function User_edit_vouchers_view($user)
{
$link = button(user_link($user->id), icon('chevron-left'), 'btn-sm');
return page_with_title(
$link . ' ' . sprintf(__('%s\'s vouchers'), User_Nick_render($user)),
[
msg(),
info(sprintf(
$user->state->force_active
? __('Angel can receive another %d vouchers and is FA.')
: __('Angel can receive another %d vouchers.'),
User_get_eligable_voucher_count($user)
), true),
form(
[
form_spinner('vouchers', __('Number of vouchers given out'), $user->state->got_voucher),
form_submit('submit', __('form.save')),
],
url('/users', ['action' => 'edit_vouchers', 'user_id' => $user->id])
),
]
);
}
/**
* @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
* @return string
*/
function Users_view(
$users,
$order_by,
$arrived_count,
$active_count,
$force_active_count,
$freeloads_count,
$tshirts_count,
$voucher_count
) {
$goodie = GoodieType::from(config('goodie_type'));
$goodie_enabled = $goodie !== GoodieType::None;
$goodie_tshirt = $goodie === GoodieType::Tshirt;
$usersList = [];
foreach ($users as $user) {
$u = [];
$u['name'] = User_Nick_render($user)
. User_Pronoun_render($user)
. ($user->state->user_info
? ' '
: '');
$u['first_name'] = htmlspecialchars((string) $user->personalData->first_name);
$u['last_name'] = htmlspecialchars((string) $user->personalData->last_name);
$u['dect'] = sprintf('%1$s', htmlspecialchars((string) $user->contact->dect));
$u['arrived'] = icon_bool($user->state->arrived);
if (config('enable_voucher')) {
$u['got_voucher'] = $user->state->got_voucher;
}
$u['freeloads'] = $user->getAttribute('freeloads');
$u['active'] = icon_bool($user->state->active);
$u['force_active'] = icon_bool($user->state->force_active);
if ($goodie_enabled) {
$u['got_shirt'] = icon_bool($user->state->got_shirt);
if ($goodie_tshirt) {
$u['shirt_size'] = $user->personalData->shirt_size;
}
}
$u['arrival_date'] = $user->personalData->planned_arrival_date
? $user->personalData->planned_arrival_date->format(__('general.date')) : '';
$u['departure_date'] = $user->personalData->planned_departure_date
? $user->personalData->planned_departure_date->format(__('general.date')) : '';
$u['last_login_at'] = $user->last_login_at ? $user->last_login_at->format(__('general.datetime')) : '';
$u['actions'] = table_buttons([
button_icon(url('/admin-user', ['id' => $user->id]), 'pencil', 'btn-sm'),
]);
$usersList[] = $u;
}
$usersList[] = [
'name' => '' . __('Sum') . '',
'arrived' => $arrived_count,
'got_voucher' => $voucher_count,
'active' => $active_count,
'force_active' => $force_active_count,
'freeloads' => $freeloads_count,
'got_shirt' => $tshirts_count,
'actions' => '' . count($usersList) . '',
];
$user_table_headers = [];
if (!config('display_full_name')) {
$user_table_headers['name'] = Users_table_header_link('name', __('general.nick'), $order_by);
}
if (config('enable_user_name')) {
$user_table_headers['first_name'] = Users_table_header_link('first_name', __('settings.profile.firstname'), $order_by);
$user_table_headers['last_name'] = Users_table_header_link('last_name', __('settings.profile.lastname'), $order_by);
}
if (config('enable_dect')) {
$user_table_headers['dect'] = Users_table_header_link('dect', __('general.dect'), $order_by);
}
$user_table_headers['arrived'] = Users_table_header_link('arrived', __('Arrived'), $order_by);
if (config('enable_voucher')) {
$user_table_headers['got_voucher'] = Users_table_header_link('got_voucher', __('Voucher'), $order_by);
}
$user_table_headers['freeloads'] = Users_table_header_link('freeloads', __('Freeloads'), $order_by);
$user_table_headers['active'] = Users_table_header_link('active', __('user.active'), $order_by);
$user_table_headers['force_active'] = Users_table_header_link('force_active', __('Forced'), $order_by);
if ($goodie_enabled) {
if ($goodie_tshirt) {
$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);
} else {
$user_table_headers['got_shirt'] = Users_table_header_link('got_shirt', __('Goodie'), $order_by);
}
}
$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
);
$user_table_headers['last_login_at'] = Users_table_header_link('last_login_at', __('Last login'), $order_by);
$user_table_headers['actions'] = '';
foreach (config('disabled_user_view_columns') ?? [] as $key) {
unset($user_table_headers[$key]);
}
$link = button(url('/register'), icon('plus-lg'), 'add');
return page_with_title(__('All users') . ' ' . $link, [
msg(),
table($user_table_headers, $usersList),
]);
}
/**
* @param string $column
* @param string $label
* @param string $order_by
* @return string
*/
function Users_table_header_link($column, $label, $order_by)
{
return ''
. $label . ($order_by == $column ? ' ' : '')
. '';
}
/**
* @param User $user
* @return string|false
*/
function User_shift_state_render($user)
{
if (!$user->state->arrived) {
return '';
}
$upcoming_shifts = ShiftEntries_upcoming_for_user($user);
if ($upcoming_shifts->isEmpty()) {
return '' . __('free') . '';
}
/** @var ShiftEntry $nextShiftEntry */
$nextShiftEntry = $upcoming_shifts->first();
$start = $nextShiftEntry->shift->start;
$end = $nextShiftEntry->shift->end;
$startFormat = $start->format(__('general.datetime'));
$endFormat = $end->format(__('general.datetime'));
$startTimestamp = $start->timestamp;
$endTimestamp = $end->timestamp;
if ($startTimestamp > time()) {
if ($startTimestamp - time() > 3600) {
return ''
. __('Next shift %c')
. '';
}
return ''
. __('Next shift %c')
. '';
}
$halfway = ($startTimestamp + $endTimestamp) / 2;
if (time() < $halfway) {
return ''
. __('Shift started %c')
. '';
}
return ''
. __('Shift ends %c')
. '';
}
function User_last_shift_render($user)
{
if (!$user->state->arrived) {
return '';
}
$last_shifts = ShiftEntries_finished_by_user($user);
if ($last_shifts->isEmpty()) {
return '';
}
/** @var ShiftEntry $lastShiftEntry */
$lastShiftEntry = $last_shifts->first();
$end = $lastShiftEntry->shift->end;
return ''
. __('Shift ended %c')
. '';
}
/**
* @param array $needed_angel_type
* @return string
*/
function User_view_shiftentries($needed_angel_type)
{
$shift_info = '
' . htmlspecialchars($needed_angel_type['name']) . ': ';
$shift_entries = [];
foreach ($needed_angel_type['users'] as $user_shift) {
$member = User_Nick_render($user_shift);
if ($user_shift['freeloaded']) {
$member = '' . $member . '';
}
$shift_entries[] = $member;
}
$shift_info .= join(', ', $shift_entries);
return $shift_info;
}
/**
* Helper that renders a shift line for user view
*
* @param Shift $shift
* @param User $user_source
* @param bool $its_me
* @return array
*/
function User_view_myshift(Shift $shift, $user_source, $its_me)
{
$shift_info = '' . htmlspecialchars($shift->shiftType->name) . '';
if ($shift->title) {
$shift_info .= '
' . htmlspecialchars($shift->title) . '';
}
foreach ($shift->needed_angeltypes as $needed_angel_type) {
$shift_info .= User_view_shiftentries($needed_angel_type);
}
$myshift = [
'date' => icon('calendar-event')
. $shift->start->format(__('general.date')) . '
'
. icon('clock-history') . $shift->start->format('H:i')
. ' - '
. $shift->end->format(__('H:i')),
'duration' => sprintf('%.2f', ($shift->end->timestamp - $shift->start->timestamp) / 3600) . ' h',
'location' => location_name_render($shift->location),
'shift_info' => $shift_info,
'comment' => '',
'start' => $shift->start,
'end' => $shift->end,
];
if ($its_me) {
$myshift['comment'] = htmlspecialchars($shift->user_comment);
}
if ($shift->freeloaded) {
$myshift['duration'] = '
' . sprintf('%.2f', -($shift->end->timestamp - $shift->start->timestamp) / 3600 * 2) . ' h' . '
'; if (auth()->can('user_shifts_admin')) { $myshift['comment'] .= '' . __('Freeloaded') . ': ' . htmlspecialchars($shift->freeloaded_comment) . '
'; } else { $myshift['comment'] .= '' . __('Freeloaded') . '
'; } } $myshift['actions'] = [ button(shift_link($shift), icon('eye') . __('view'), 'btn-sm'), ]; if ($its_me || auth()->can('user_shifts_admin')) { $myshift['actions'][] = button( url('/user-myshifts', ['edit' => $shift->shift_entry_id, 'id' => $user_source->id]), icon('pencil') . __('edit'), 'btn-sm' ); } if (Shift_signout_allowed($shift, (new AngelType())->forceFill(['id' => $shift->angel_type_id]), $user_source->id)) { $myshift['actions'][] = button( shift_entry_delete_link($shift), icon('trash') . __('sign off'), 'btn-sm' ); } $myshift['actions'] = table_buttons($myshift['actions']); return $myshift; } /** * Helper that prepares the shift table for user view * * @param Shift[]|Collection $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 * * @return array */ function User_view_myshifts( $shifts, $user_source, $its_me, $tshirt_score, $tshirt_admin, $user_worklogs, $admin_user_worklog_privilege ) { $goodie = GoodieType::from(config('goodie_type')); $goodie_enabled = $goodie !== GoodieType::None; $goodie_tshirt = $goodie === GoodieType::Tshirt; $myshifts_table = []; $timeSum = 0; foreach ($shifts as $shift) { $key = $shift->start->timestamp . '-shift-' . $shift->shift_entry_id . $shift->id; $myshifts_table[$key] = User_view_myshift($shift, $user_source, $its_me); if (!$shift->freeloaded) { $timeSum += ($shift->end->timestamp - $shift->start->timestamp); } } foreach ($user_worklogs as $worklog) { $key = $worklog->worked_at->timestamp . '-worklog-' . $worklog->id; $myshifts_table[$key] = User_view_worklog($worklog, $admin_user_worklog_privilege); $timeSum += $worklog->hours * 3600; } if (count($myshifts_table) > 0) { ksort($myshifts_table); $myshifts_table = array_values($myshifts_table); foreach ($myshifts_table as $i => &$shift) { $before = $myshifts_table[$i - 1] ?? null; $after = $myshifts_table[$i + 1] ?? null; if (Carbon::now() > $shift['start'] && Carbon::now() < $shift['end']) { $shift['row-class'] = 'border border-info border-2'; } elseif ($after && Carbon::now() > $shift['end'] && Carbon::now() < $after['start']) { $shift['row-class'] = 'border-bottom border-info'; } elseif (!$before && Carbon::now() < $shift['start']) { $shift['row-class'] = 'border-top-info'; } elseif (!$after && Carbon::now() > $shift['end']) { $shift['row-class'] = 'border-bottom border-info'; } } $myshifts_table[] = [ 'date' => '' . __('Sum:') . '', 'duration' => '' . sprintf('%.2f', round($timeSum / 3600, 2)) . ' h', 'location' => '', 'shift_info' => '', 'comment' => '', 'actions' => '', ]; if ($goodie_enabled && ($its_me || $tshirt_admin)) { $myshifts_table[] = [ 'date' => '' . ($goodie_tshirt ? __('Your T-shirt score') : __('Your goodie score')) . '™:', 'duration' => '' . $tshirt_score . '', 'location' => '', 'shift_info' => '', 'comment' => '', 'actions' => '', ]; } } return $myshifts_table; } /** * Renders table entry for user work log * * @param Worklog $worklog * @param bool $admin_user_worklog_privilege * @return array */ function User_view_worklog(Worklog $worklog, $admin_user_worklog_privilege) { $actions = ''; if ($admin_user_worklog_privilege) { $actions = table_buttons([ button( url('/admin/user/' . $worklog->user->id . '/worklog/' . $worklog->id), icon('pencil') . __('edit'), 'btn-sm' ), button( url('/admin/user/' . $worklog->user->id . '/worklog/' . $worklog->id . '/delete'), icon('trash') . __('delete'), 'btn-sm' ), ]); } return [ 'date' => icon('calendar-event') . date(__('general.date'), $worklog->worked_at->timestamp), 'duration' => sprintf('%.2f', $worklog->hours) . ' h', 'location' => '', 'shift_info' => __('Work log entry'), 'comment' => htmlspecialchars($worklog->comment) . '