From b6c2b93c908b017309b321f430577bca16642c6c Mon Sep 17 00:00:00 2001 From: Linda Eskilsson Date: Thu, 23 Apr 2026 12:51:38 +0200 Subject: [PATCH 1/2] fix: add client-side validation for future birth dates in PetForm --- frontend/src/components/PetForm.jsx | 58 +++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/PetForm.jsx b/frontend/src/components/PetForm.jsx index 22f92e7..4c3b1fc 100644 --- a/frontend/src/components/PetForm.jsx +++ b/frontend/src/components/PetForm.jsx @@ -10,9 +10,21 @@ const PetForm = ({ onCancel, onSave }) => { weight: '' }); const [isSubmitting, setIsSubmitting] = useState(false); + const [fieldErrors, setFieldErrors] = useState({}); + + const today = new Date().toISOString().split('T')[0]; + const handleSubmit = async (e) => { e.preventDefault(); + setFieldErrors({}); + + // Klient-validering: framtida datum + if (formData.dob && formData.dob > today) { + setFieldErrors({ dob: 'Födelsedatum kan inte vara i framtiden.' }); + return; + } + setIsSubmitting(true); try { @@ -32,11 +44,31 @@ const PetForm = ({ onCancel, onSave }) => { onSave(); } catch (error) { console.error("Kunde inte spara djuret:", error); - alert("Något gick fel vid sparning. Kontrollera att alla obligatoriska fält är ifyllda."); - } finally { - setIsSubmitting(false); - } - }; + if (error.response?.status === 400) { + const data = error.response.data; + const errors = {}; + if (data?.errors) { + // Spring returnerar vanligtvis { errors: [{ field, defaultMessage }] } + data.errors.forEach(err => { + if (err.field === 'dateOfBirth') { + errors.dob = 'Födelsedatum kan inte vara i framtiden.'; + } else { + errors[err.field] = err.defaultMessage; + } + }); + } else if (data?.dateOfBirth || data?.message?.toLowerCase().includes('date')) { + errors.dob = 'Födelsedatum kan inte vara i framtiden.'; + } else { + errors.general = 'Något gick fel vid sparning. Kontrollera att alla obligatoriska fält är ifyllda.'; + } + setFieldErrors(errors); + } else { + setFieldErrors({ general: 'Något gick fel vid sparning. Försök igen.' }); + } } + finally { + setIsSubmitting(false); + } +}; return (
@@ -111,10 +143,17 @@ const PetForm = ({ onCancel, onSave }) => { setFormData({...formData, dob: e.target.value})} - className="w-full px-4 py-3 rounded-lg border border-slate-200 bg-slate-50 focus:ring-2 focus:ring-blue-500 focus:bg-white outline-none transition font-medium italic" + max={today} + onChange={(e) => { + setFormData({...formData, dob: e.target.value}); + if (fieldErrors.dob) setFieldErrors({...fieldErrors, dob: undefined}); + }} + className={`w-full px-4 py-3 rounded-lg border bg-slate-50 focus:ring-2 focus:ring-blue-500 focus:bg-white outline-none transition font-medium italic ${fieldErrors.dob ? 'border-red-400 focus:ring-red-400' : 'border-slate-200'}`} required /> + {fieldErrors.dob && ( +

{fieldErrors.dob}

+ )}
{/* VIKT */} @@ -132,6 +171,11 @@ const PetForm = ({ onCancel, onSave }) => { + {fieldErrors.general && ( +
+ {fieldErrors.general} +
+ )} {/* KNAPPAR */}
+ {/* GENERELLT FEL */} {fieldErrors.general && ( -
+
{fieldErrors.general}
)}