feat(expiration): add validation for expiration days and update user interface

This commit is contained in:
ReturnFI
2025-12-19 19:33:10 +00:00
parent 1a017216e0
commit b84ec1a9ac
3 changed files with 47 additions and 10 deletions

View File

@ -17,6 +17,7 @@ $(function () {
const passwordRegex = /^[a-zA-Z0-9]+$/;
let cachedUserData = [];
let searchTimeout = null;
const PRACTICAL_MAX_DAYS = 36500;
function setCookie(name, value, days) {
let expires = "";
@ -63,6 +64,7 @@ $(function () {
const isValid = usernameRegex.test(username);
$(errorElement).text(isValid ? "" : "Usernames can only contain letters, numbers, and underscores.");
$(inputElement).closest('form').find('button[type="submit"]').prop('disabled', !isValid);
return isValid;
}
function validatePassword(inputElement, errorElement) {
@ -70,8 +72,26 @@ $(function () {
const isValid = password === '' || passwordRegex.test(password);
$(errorElement).text(isValid ? "" : "Password can only contain letters and numbers.");
$('#editSubmitButton').prop('disabled', !isValid);
return isValid;
}
function validateExpirationDays(inputElement, errorElement) {
const days = parseInt($(inputElement).val(), 10);
let isValid = !isNaN(days) && days >= 0;
let errorMessage = "";
if (!isValid) {
errorMessage = "Please enter a non-negative number.";
} else if (days > PRACTICAL_MAX_DAYS) {
isValid = false;
errorMessage = `For unlimited duration, please use 0. Values above ${PRACTICAL_MAX_DAYS} are not practical.`;
}
$(errorElement).text(errorMessage);
$(inputElement).closest('form').find('button[type="submit"]').prop('disabled', !isValid);
return isValid;
}
function refreshUserList() {
const query = $("#searchInput").val().trim();
if (query !== "") {
@ -149,6 +169,10 @@ $(function () {
validateUsername(this, `#${this.id}Error`);
});
$('#addExpirationDays, #addBulkExpirationDays, #editExpirationDays').on('input', function() {
validateExpirationDays(this, `#${this.id}Error`);
});
$(".filter-button").on("click", function (e) {
e.preventDefault();
const filter = $(this).data("filter");
@ -260,6 +284,7 @@ $(function () {
const statusText = dataRow.find("td:eq(3)").text().trim();
$('#editPasswordError').text('');
$('#editExpirationDaysError').text('');
$('#editSubmitButton').prop('disabled', false);
$("#originalUsername").val(user);
@ -480,7 +505,7 @@ $(function () {
$('#addUserModal').on('show.bs.modal', function () {
$('#addUserForm, #addBulkUsersForm').trigger('reset');
$('#addUsernameError, #addBulkPrefixError').text('');
$('#addUsernameError, #addBulkPrefixError, #addExpirationDaysError, #addBulkExpirationDaysError').text('');
Object.assign(document.getElementById('addTrafficLimit'), {value: 30});
Object.assign(document.getElementById('addExpirationDays'), {value: 30});
Object.assign(document.getElementById('addBulkTrafficLimit'), {value: 30});