diff --git a/src/app/admin/components/UserAdmin/UserAdminCreditGrant.tsx b/src/app/admin/components/UserAdmin/UserAdminCreditGrant.tsx index 4ee3abb71..e54ec131f 100644 --- a/src/app/admin/components/UserAdmin/UserAdminCreditGrant.tsx +++ b/src/app/admin/components/UserAdmin/UserAdminCreditGrant.tsx @@ -45,6 +45,7 @@ export function UserAdminCreditGrant({ const [customDescription, setCustomDescription] = useState(''); const [expirationDate, setExpirationDate] = useState(''); const [expiryHours, setExpiryHours] = useState(''); + const [neverExpires, setNeverExpires] = useState(false); // API state const [isGrantingCredit, setIsGrantingCredit] = useState(false); @@ -55,8 +56,17 @@ export function UserAdminCreditGrant({ ); const expectNegative = selectedCreditCategory?.expect_negative_amount ?? false; - // Form validation - credit category required; description required for negative amount categories - const isFormValid = selectedCredit && (!expectNegative || customDescription.trim().length > 0); + // Check if expiration is set (either via date or hours) + const hasExpiration = expirationDate.trim() !== '' || expiryHours.trim() !== ''; + + // Form validation: + // - credit category required + // - description required for negative amount categories + // - expiration required unless "Never expires" is checked (only for non-negative categories) + const isFormValid = + selectedCredit && + (!expectNegative || customDescription.trim().length > 0) && + (expectNegative || neverExpires || hasExpiration); const handleCreditTypeChange = (value: string) => { setSelectedCredit(value); @@ -65,6 +75,7 @@ export function UserAdminCreditGrant({ setCustomDescription(''); setExpirationDate(''); setExpiryHours(''); + setNeverExpires(false); }; const handleGrantCredit = async () => { @@ -109,6 +120,7 @@ export function UserAdminCreditGrant({ setCustomDescription(''); setExpirationDate(''); setExpiryHours(''); + setNeverExpires(false); await queryClient.invalidateQueries({ queryKey: ['admin-user-credit-transactions', id] }); } else { setCreditMessage({ @@ -220,7 +232,7 @@ export function UserAdminCreditGrant({ <>
setExpirationDate(e.target.value)} id="date" + disabled={!selectedCredit || neverExpires} />
+
+ +
)}