diff --git a/client/src/components/DogForm.jsx b/client/src/components/DogForm.jsx index 750821a..24b6f24 100644 --- a/client/src/components/DogForm.jsx +++ b/client/src/components/DogForm.jsx @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react' -import { X } from 'lucide-react' +import { X, Award } from 'lucide-react' import axios from 'axios' function DogForm({ dog, onClose, onSave }) { @@ -12,9 +12,10 @@ function DogForm({ dog, onClose, onSave }) { color: '', microchip: '', notes: '', - sire_id: null, // Changed from '' to null - dam_id: null, // Changed from '' to null - litter_id: null // Changed from '' to null + sire_id: null, + dam_id: null, + litter_id: null, + is_champion: false, }) const [dogs, setDogs] = useState([]) const [litters, setLitters] = useState([]) @@ -36,9 +37,10 @@ function DogForm({ dog, onClose, onSave }) { color: dog.color || '', microchip: dog.microchip || '', notes: dog.notes || '', - sire_id: dog.sire?.id || null, // Ensure null, not '' - dam_id: dog.dam?.id || null, // Ensure null, not '' - litter_id: dog.litter_id || null // Ensure null, not '' + sire_id: dog.sire?.id || null, + dam_id: dog.dam?.id || null, + litter_id: dog.litter_id || null, + is_champion: !!dog.is_champion, }) setUseManualParents(!dog.litter_id) } @@ -48,8 +50,7 @@ function DogForm({ dog, onClose, onSave }) { try { const res = await axios.get('/api/dogs') setDogs(res.data || []) - } catch (error) { - console.error('Error fetching dogs:', error) + } catch (e) { setDogs([]) } } @@ -57,16 +58,11 @@ function DogForm({ dog, onClose, onSave }) { const fetchLitters = async () => { try { const res = await axios.get('/api/litters') - const litterData = res.data || [] - setLitters(litterData) - setLittersAvailable(litterData.length > 0) - // Only default to manual if no litters exist - if (litterData.length === 0) { - setUseManualParents(true) - } - } catch (error) { - console.error('Error fetching litters:', error) - // If endpoint fails, gracefully fallback to manual mode + const data = res.data || [] + setLitters(data) + setLittersAvailable(data.length > 0) + if (data.length === 0) setUseManualParents(true) + } catch (e) { setLitters([]) setLittersAvailable(false) setUseManualParents(true) @@ -74,25 +70,27 @@ function DogForm({ dog, onClose, onSave }) { } const handleChange = (e) => { - const { name, value } = e.target - - // Convert empty strings to null for ID fields - let processedValue = value - if (name === 'sire_id' || name === 'dam_id' || name === 'litter_id') { - processedValue = value === '' ? null : parseInt(value) + const { name, value, type, checked } = e.target + + if (type === 'checkbox') { + setFormData(prev => ({ ...prev, [name]: checked })) + return } - - setFormData(prev => ({ ...prev, [name]: processedValue })) - - // If litter is selected, auto-populate parents + + let processed = value + if (name === 'sire_id' || name === 'dam_id' || name === 'litter_id') { + processed = value === '' ? null : parseInt(value) + } + setFormData(prev => ({ ...prev, [name]: processed })) + if (name === 'litter_id' && value) { - const selectedLitter = litters.find(l => l.id === parseInt(value)) - if (selectedLitter) { + const sel = litters.find(l => l.id === parseInt(value)) + if (sel) { setFormData(prev => ({ ...prev, - sire_id: selectedLitter.sire_id, - dam_id: selectedLitter.dam_id, - breed: prev.breed || selectedLitter.sire_name?.split(' ')[0] || '' + sire_id: sel.sire_id, + dam_id: sel.dam_id, + breed: prev.breed || sel.sire_name?.split(' ')[0] || '' })) } } @@ -102,11 +100,10 @@ function DogForm({ dog, onClose, onSave }) { e.preventDefault() setError('') setLoading(true) - try { - const submitData = { + const submitData = { ...formData, - // Ensure null values are sent, not empty strings + is_champion: formData.is_champion ? 1 : 0, sire_id: formData.sire_id || null, dam_id: formData.dam_id || null, litter_id: useManualParents ? null : (formData.litter_id || null), @@ -114,25 +111,22 @@ function DogForm({ dog, onClose, onSave }) { birth_date: formData.birth_date || null, color: formData.color || null, microchip: formData.microchip || null, - notes: formData.notes || null + notes: formData.notes || null, } - if (dog) { - // Update existing dog await axios.put(`/api/dogs/${dog.id}`, submitData) } else { - // Create new dog await axios.post('/api/dogs', submitData) } onSave() onClose() - } catch (error) { - setError(error.response?.data?.error || 'Failed to save dog') + } catch (err) { + setError(err.response?.data?.error || 'Failed to save dog') setLoading(false) } } - const males = dogs.filter(d => d.sex === 'male' && d.id !== dog?.id) + const males = dogs.filter(d => d.sex === 'male' && d.id !== dog?.id) const females = dogs.filter(d => d.sex === 'female' && d.id !== dog?.id) return ( @@ -140,9 +134,7 @@ function DogForm({ dog, onClose, onSave }) {