fix: correctly validate number inputs against null/NaN bypass in admin modals

This commit is contained in:
2026-05-29 18:35:11 +01:00
parent cf81916278
commit ddaa468a3e
2 changed files with 42 additions and 11 deletions
@@ -50,11 +50,31 @@ import { Button } from '$lib/components/ui/button';
} }
function validateNoticeDurationField() { function validateNoticeDurationField() {
formErrors.notice_duration = (formData.notice_duration_hours < 0 || isNaN(formData.notice_duration_hours)) ? 'Must be a positive number' : ''; const val = formData.notice_duration_hours;
if (val === null || val === undefined || val === '') {
formErrors.notice_duration = 'Must be a positive number';
return;
}
const num = Number(val);
if (isNaN(num) || num < 0 || !Number.isInteger(num)) {
formErrors.notice_duration = 'Must be a positive whole number';
} else {
formErrors.notice_duration = '';
}
} }
function validateExpiryField() { function validateExpiryField() {
formErrors.expiry = (formData.expiry_months < 1 || isNaN(formData.expiry_months)) ? 'Must be at least 1 month' : ''; const val = formData.expiry_months;
if (val === null || val === undefined || val === '') {
formErrors.expiry = 'Must be at least 1 month';
return;
}
const num = Number(val);
if (isNaN(num) || num < 1 || !Number.isInteger(num)) {
formErrors.expiry = 'Must be a whole number of at least 1 month';
} else {
formErrors.expiry = '';
}
} }
function validateAllFields() { function validateAllFields() {
@@ -68,10 +88,14 @@ import { Button } from '$lib/components/ui/button';
!formErrors.name && !formErrors.name &&
!formErrors.notice_duration && !formErrors.notice_duration &&
!formErrors.expiry && !formErrors.expiry &&
formData.notice_duration_hours >= 0 && formData.notice_duration_hours !== null &&
!isNaN(formData.notice_duration_hours) && formData.notice_duration_hours !== undefined &&
formData.expiry_months >= 1 && formData.notice_duration_hours !== '' &&
!isNaN(formData.expiry_months) Number(formData.notice_duration_hours) >= 0 &&
formData.expiry_months !== null &&
formData.expiry_months !== undefined &&
formData.expiry_months !== '' &&
Number(formData.expiry_months) >= 1
); );
async function fetchData() { async function fetchData() {
@@ -40,6 +40,9 @@
let serviceErrors = $state<Record<string, string>>({}); let serviceErrors = $state<Record<string, string>>({});
function validatePrice(price: any): string { function validatePrice(price: any): string {
if (price === null || price === undefined || price === '') {
return 'Price is required';
}
const numPrice = parseFloat(price); const numPrice = parseFloat(price);
if (isNaN(numPrice)) { if (isNaN(numPrice)) {
return 'Price must be a valid number'; return 'Price must be a valid number';
@@ -57,20 +60,24 @@
return ''; return '';
} }
function validateDuration(value: number, field: string): string { function validateDuration(value: any, field: string): string {
if (isNaN(value)) { if (value === null || value === undefined || value === '') {
return 'Field cannot be empty';
}
const num = Number(value);
if (isNaN(num)) {
return 'Must be a valid number'; return 'Must be a valid number';
} }
if (!Number.isInteger(value)) { if (!Number.isInteger(num)) {
return 'Must be a whole number'; return 'Must be a whole number';
} }
if (field === 'duration_minutes' && value <= 0) { if (field === 'duration_minutes' && num <= 0) {
return 'Duration must be greater than 0'; return 'Duration must be greater than 0';
} }
if (field === 'minimum_age_required' && (value < 0 || value > 100)) { if (field === 'minimum_age_required' && (num < 0 || num > 100)) {
return 'Must be between 0 and 100'; return 'Must be between 0 and 100';
} }