Added ability to have different user statuses

This commit is contained in:
Pinga 2025-02-04 10:31:11 +02:00
parent 33068b1356
commit 29db0ae8b6
5 changed files with 60 additions and 13 deletions

View file

@ -144,6 +144,23 @@ class Auth
$auth->login($email, $password, $rememberDuration); $auth->login($email, $password, $rememberDuration);
if ($auth->isArchived()) {
self::$auth->logOut();
redirect()->route('login')->with('error','User has been archived, please contact registry support');
}
if ($auth->isBanned()) {
self::$auth->logOut();
redirect()->route('login')->with('error','User has been banned, please contact registry support');
}
if ($auth->isPendingReview()) {
self::$auth->logOut();
redirect()->route('login')->with('error','User is pending review, please contact registry support');
}
if ($auth->isSuspended()) {
self::$auth->logOut();
redirect()->route('login')->with('error','User has been suspended, please contact registry support');
}
// check if a valid code is provided // check if a valid code is provided
global $container; global $container;
$db = $container->get('db'); $db = $container->get('db');

View file

@ -47,7 +47,7 @@ class UsersController extends Controller
'username' => v::regex('/^[a-zA-Z0-9_-]+$/')->length(3, 20)->setName('Username'), 'username' => v::regex('/^[a-zA-Z0-9_-]+$/')->length(3, 20)->setName('Username'),
'password' => v::stringType()->notEmpty()->length(6, 255)->setName('Password'), 'password' => v::stringType()->notEmpty()->length(6, 255)->setName('Password'),
'password_confirmation' => v::equals($data['password'] ?? '')->setName('Password Confirmation'), 'password_confirmation' => v::equals($data['password'] ?? '')->setName('Password Confirmation'),
'status' => v::in(['active', 'inactive'])->setName('Status'), 'status' => v::in(['0', '4'])->setName('Status'),
'role' => v::in(['admin', 'registrar'])->setName('Role'), 'role' => v::in(['admin', 'registrar'])->setName('Role'),
]; ];
@ -105,6 +105,7 @@ class UsersController extends Controller
'username' => $username, 'username' => $username,
'verified' => $verified, 'verified' => $verified,
'roles_mask' => 6, 'roles_mask' => 6,
'status' => $status,
'registered' => \time() 'registered' => \time()
] ]
); );
@ -141,6 +142,7 @@ class UsersController extends Controller
'username' => $username, 'username' => $username,
'verified' => $verified, 'verified' => $verified,
'roles_mask' => 0, 'roles_mask' => 0,
'status' => $status,
'registered' => \time() 'registered' => \time()
] ]
); );
@ -243,7 +245,7 @@ class UsersController extends Controller
$validators = [ $validators = [
'email' => v::email()->notEmpty()->setName('Email'), 'email' => v::email()->notEmpty()->setName('Email'),
'username' => v::regex('/^[a-zA-Z0-9_-]+$/')->length(3, 20)->setName('Username'), 'username' => v::regex('/^[a-zA-Z0-9_-]+$/')->length(3, 20)->setName('Username'),
'status' => v::in(['0', '1'])->setName('Status'), 'status' => v::in(['0', '1', '2', '3', '4', '5'])->setName('Status'),
'verified' => v::in(['0', '1'])->setName('Verified'), // Ensure verified is checked as 0 or 1 'verified' => v::in(['0', '1'])->setName('Verified'), // Ensure verified is checked as 0 or 1
]; ];

View file

@ -71,8 +71,8 @@
<div class="mb-3"> <div class="mb-3">
<label class="form-label required">{{ __('Status') }}</label> <label class="form-label required">{{ __('Status') }}</label>
<select class="form-select" name="status" required> <select class="form-select" name="status" required>
<option value="active">{{ __('Active') }}</option> <option value="0">{{ __('Active') }}</option>
<option value="inactive">{{ __('Inactive') }}</option> <option value="4">{{ __('Pending Review') }}</option>
</select> </select>
</div> </div>
</div> </div>

View file

@ -72,11 +72,14 @@
<label class="form-label required">{{ __('Status') }}</label> <label class="form-label required">{{ __('Status') }}</label>
<select class="form-select" name="status" required> <select class="form-select" name="status" required>
<option value="0" {{ user.status == 0 ? 'selected' : '' }}>{{ __('Active') }}</option> <option value="0" {{ user.status == 0 ? 'selected' : '' }}>{{ __('Active') }}</option>
<option value="1" {{ user.status == 1 ? 'selected' : '' }}>{{ __('Inactive') }}</option> <option value="1" {{ user.status == 1 ? 'selected' : '' }}>{{ __('Archived') }}</option>
<option value="2" {{ user.status == 2 ? 'selected' : '' }}>{{ __('Banned') }}</option>
<option value="4" {{ user.status == 4 ? 'selected' : '' }}>{{ __('Pending Review') }}</option>
<option value="5" {{ user.status == 5 ? 'selected' : '' }}>{{ __('Suspended') }}</option>
</select> </select>
</div> </div>
</div> </div>
<!-- Verified --> <!-- Verified -->
<div class="col-md-6"> <div class="col-md-6">
<div class="mb-3"> <div class="mb-3">

View file

@ -51,12 +51,37 @@
} }
function statusBadgeFormatter(cell) { function statusBadgeFormatter(cell) {
var value = cell.getValue(); const value = cell.getValue();
if (value === 0) { let badgeClass = 'secondary';
return '<span class="status status-green">ok</span>'; let statusText = 'Unknown';
} else {
return '<span class="status status-red">Trouble</span>'; switch (value) {
case 0: // NORMAL
badgeClass = 'success';
statusText = 'Normal';
break;
case 1: // ARCHIVED
badgeClass = 'dark';
statusText = 'Archived';
break;
case 2: // BANNED
badgeClass = 'danger';
statusText = 'Banned';
break;
case 4: // PENDING_REVIEW
badgeClass = 'warning';
statusText = 'Pending Review';
break;
case 5: // SUSPENDED
badgeClass = 'info';
statusText = 'Suspended';
break;
default:
badgeClass = 'secondary';
statusText = 'Unknown';
} }
return `<span class="status status-${badgeClass}">${statusText}</span>`;
} }
var searchTerm = ""; // global variable to hold the search term var searchTerm = ""; // global variable to hold the search term
@ -122,8 +147,8 @@
{title:"{{ __('Name') }}", field:"username", width:200, resizable:false, headerSort:true, formatter: userLinkFormatter, responsive:0}, {title:"{{ __('Name') }}", field:"username", width:200, resizable:false, headerSort:true, formatter: userLinkFormatter, responsive:0},
{title:"{{ __('Email') }}", field:"email", width:300, resizable:false, headerSort:true, responsive:2}, {title:"{{ __('Email') }}", field:"email", width:300, resizable:false, headerSort:true, responsive:2},
{title:"{{ __('Roles') }}", field:"roles_mask", width:200, resizable:false, headerSort:true, formatter: roleLabelFormatter, responsive:2}, {title:"{{ __('Roles') }}", field:"roles_mask", width:200, resizable:false, headerSort:true, formatter: roleLabelFormatter, responsive:2},
{title:"{{ __('Verified') }}", field:"verified", width:150, resizable:false, headerSort:true, formatter: verifiedFormatter, responsive:2}, {title:"{{ __('Verified') }}", field:"verified", width:200, resizable:false, headerSort:true, formatter: verifiedFormatter, responsive:2},
{title:"{{ __('Status') }}", field:"status", width:150, resizable:false, headerSort:true, formatter: statusBadgeFormatter, responsive:2}, {title:"{{ __('Status') }}", field:"status", width:200, resizable:false, headerSort:true, formatter: statusBadgeFormatter, responsive:2},
{title: "{{ __('Actions') }}", formatter: actionsFormatter, responsive:0, headerSort: false, download:false, hozAlign: "center", cellClick:function(e, cell){ e.stopPropagation(); }}, {title: "{{ __('Actions') }}", formatter: actionsFormatter, responsive:0, headerSort: false, download:false, hozAlign: "center", cellClick:function(e, cell){ e.stopPropagation(); }},
] ]
}); });