diff --git a/client/src/components/DogForm.jsx b/client/src/components/DogForm.jsx new file mode 100644 index 0000000..6bc27bb --- /dev/null +++ b/client/src/components/DogForm.jsx @@ -0,0 +1,230 @@ +import { useState, useEffect } from 'react' +import { X } from 'lucide-react' +import axios from 'axios' + +function DogForm({ dog, onClose, onSave }) { + const [formData, setFormData] = useState({ + name: '', + registration_number: '', + breed: '', + sex: 'male', + birth_date: '', + color: '', + microchip: '', + notes: '', + sire_id: '', + dam_id: '' + }) + const [dogs, setDogs] = useState([]) + const [loading, setLoading] = useState(false) + const [error, setError] = useState('') + + useEffect(() => { + fetchDogs() + if (dog) { + setFormData({ + name: dog.name || '', + registration_number: dog.registration_number || '', + breed: dog.breed || '', + sex: dog.sex || 'male', + birth_date: dog.birth_date || '', + color: dog.color || '', + microchip: dog.microchip || '', + notes: dog.notes || '', + sire_id: dog.sire?.id || '', + dam_id: dog.dam?.id || '' + }) + } + }, [dog]) + + const fetchDogs = async () => { + try { + const res = await axios.get('/api/dogs') + setDogs(res.data) + } catch (error) { + console.error('Error fetching dogs:', error) + } + } + + const handleChange = (e) => { + const { name, value } = e.target + setFormData(prev => ({ ...prev, [name]: value })) + } + + const handleSubmit = async (e) => { + e.preventDefault() + setError('') + setLoading(true) + + try { + if (dog) { + // Update existing dog + await axios.put(`/api/dogs/${dog.id}`, formData) + } else { + // Create new dog + await axios.post('/api/dogs', formData) + } + onSave() + onClose() + } catch (error) { + setError(error.response?.data?.error || 'Failed to save dog') + setLoading(false) + } + } + + 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 ( +
+
e.stopPropagation()}> +
+

{dog ? 'Edit Dog' : 'Add New Dog'}

+ +
+ +
+ {error &&
{error}
} + +
+
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+ +
+ +