Files
ops-Gazelle/sections/user/invite.php
T

103 lines
3.4 KiB
PHP

<?php
/** @phpstan-var \Gazelle\User $Viewer */
/** @phpstan-var \Twig\Environment $Twig */
declare(strict_types=1);
namespace Gazelle;
$userMan = new Manager\User();
if (!isset($_GET['id'])) {
$user = $Viewer;
} else {
$user = $userMan->findById((int)$_GET['id']);
if (is_null($user)) {
Error404::error();
}
}
$ownProfile = $user->id === $Viewer->id;
if (!$Viewer->permitted('users_view_invites') && !$ownProfile) {
Error403::error();
}
$inviteSourceMan = $Viewer->permitted('users_view_invites')
|| $user->isInterviewer()
|| $user->isRecruiter()
? new Manager\InviteSource()
: null;
if ($inviteSourceMan && isset($_GET['edit'])) {
/**
* We have:
* {
* "user-9112": "17",
* "reason-9112": "https:\/\/whe.re\/user\/4567",
* },
*/
$update = [];
foreach (array_key_filter_and_map('user-', $_POST) as $userId => $source) {
if (!isset($update[$userId])) {
$update[$userId] = ['user_id' => $userId];
}
$update[$userId]['source'] = (int)$source;
}
foreach (array_key_filter_and_map('reason-', $_POST) as $userId => $reason) {
if (!isset($update[$userId])) {
$update[$userId] = [];
}
$update[$userId]['profile'] = trim($reason);
}
/**
* Now we have:
* {
* "9112": {
* "user_id": 9112,
* "source": 17,
* "profile": "https:\/\/whe.re\/user\/4567"
* }
* }
*/
if ($update) {
authorize();
$inviteSourceMan->modifyInviteeSource($update);
}
}
$heading = new Util\SortableTableHeader('created', [
// see User\Invite::page() for these table aliases
'id' => ['dbColumn' => 'um.ID', 'defaultSort' => 'desc'],
'username' => ['dbColumn' => 'um.Username', 'defaultSort' => 'desc', 'text' => 'Username'],
'email' => ['dbColumn' => 'um.Email', 'defaultSort' => 'desc', 'text' => 'Email'],
'created' => ['dbColumn' => 'um.created' , 'defaultSort' => 'desc', 'text' => 'Joined'],
'lastseen' => ['dbColumn' => 'ula.last_access', 'defaultSort' => 'desc', 'text' => 'Last Seen'],
'uploaded' => ['dbColumn' => 'uls.Uploaded', 'defaultSort' => 'desc', 'text' => 'Uploaded'],
'downloaded' => ['dbColumn' => 'uls.Downloaded', 'defaultSort' => 'desc', 'text' => 'Downloaded'],
'ratio' => ['dbColumn' => '(uls.Uploaded / uls.Downloaded)', 'defaultSort' => 'desc', 'text' => 'Ratio'],
]);
$paginator = new Util\Paginator(ITEMS_PER_PAGE, (int)($_REQUEST['page'] ?? 1));
$paginator->setTotal($user->invite()->total());
echo $Twig->render('user/invited.twig', [
'edit_source' => $inviteSourceMan && ($_GET['edit'] ?? '') === 'source',
'heading' => $heading,
'invited' => array_map(
fn ($id) => $userMan->findById($id),
$user->invite()->page(
$heading->orderBy(), $heading->dir(), $paginator->limit(), $paginator->offset()
)
),
'invites_open' => new Stats\Users()->newUsersAllowed($user),
'invite_source' => $inviteSourceMan,
'notes' => new Util\Textarea('notes', '', 60, 4),
'own_profile' => $ownProfile,
'paginator' => $paginator,
'user' => $user,
'viewer' => $Viewer,
'wiki_user_classes' => 4,
'wiki_ratio_watch' => 503,
]);