fix: wire Add External Dog button to DogForm modal (removes broken /dogs/new?external=1 nav)
This commit is contained in:
@@ -1,20 +1,24 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
|
||||||
import { Users, Plus, Search, ExternalLink, Award, Filter } from 'lucide-react';
|
import { Users, Plus, Search, ExternalLink, Award, Filter } from 'lucide-react';
|
||||||
|
import DogForm from '../components/DogForm';
|
||||||
|
|
||||||
export default function ExternalDogs() {
|
export default function ExternalDogs() {
|
||||||
const [dogs, setDogs] = useState([]);
|
const [dogs, setDogs] = useState([]);
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
const [search, setSearch] = useState('');
|
const [search, setSearch] = useState('');
|
||||||
const [sexFilter, setSexFilter] = useState('all');
|
const [sexFilter, setSexFilter] = useState('all');
|
||||||
const navigate = useNavigate();
|
const [showAddModal, setShowAddModal] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
fetchDogs();
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
const fetchDogs = () => {
|
||||||
fetch('/api/dogs/external')
|
fetch('/api/dogs/external')
|
||||||
.then(r => r.json())
|
.then(r => r.json())
|
||||||
.then(data => { setDogs(data); setLoading(false); })
|
.then(data => { setDogs(data); setLoading(false); })
|
||||||
.catch(() => setLoading(false));
|
.catch(() => setLoading(false));
|
||||||
}, []);
|
};
|
||||||
|
|
||||||
const filtered = dogs.filter(d => {
|
const filtered = dogs.filter(d => {
|
||||||
const matchSearch = d.name.toLowerCase().includes(search.toLowerCase()) ||
|
const matchSearch = d.name.toLowerCase().includes(search.toLowerCase()) ||
|
||||||
@@ -41,7 +45,7 @@ export default function ExternalDogs() {
|
|||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
className="btn btn-primary"
|
className="btn btn-primary"
|
||||||
onClick={() => navigate('/dogs/new?external=1')}
|
onClick={() => setShowAddModal(true)}
|
||||||
>
|
>
|
||||||
<Plus size={16} /> Add External Dog
|
<Plus size={16} /> Add External Dog
|
||||||
</button>
|
</button>
|
||||||
@@ -75,7 +79,7 @@ export default function ExternalDogs() {
|
|||||||
<ExternalLink size={48} className="empty-icon" />
|
<ExternalLink size={48} className="empty-icon" />
|
||||||
<h3>No external dogs yet</h3>
|
<h3>No external dogs yet</h3>
|
||||||
<p>Add sires, dams, or ancestors that aren't part of your kennel roster.</p>
|
<p>Add sires, dams, or ancestors that aren't part of your kennel roster.</p>
|
||||||
<button className="btn btn-primary" onClick={() => navigate('/dogs/new?external=1')}>
|
<button className="btn btn-primary" onClick={() => setShowAddModal(true)}>
|
||||||
<Plus size={16} /> Add First External Dog
|
<Plus size={16} /> Add First External Dog
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -85,7 +89,7 @@ export default function ExternalDogs() {
|
|||||||
<section className="external-section">
|
<section className="external-section">
|
||||||
<h2 className="section-heading">♂ Sires ({sires.length})</h2>
|
<h2 className="section-heading">♂ Sires ({sires.length})</h2>
|
||||||
<div className="dog-grid">
|
<div className="dog-grid">
|
||||||
{sires.map(dog => <DogCard key={dog.id} dog={dog} navigate={navigate} />)}
|
{sires.map(dog => <DogCard key={dog.id} dog={dog} />)}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
)}
|
)}
|
||||||
@@ -93,25 +97,34 @@ export default function ExternalDogs() {
|
|||||||
<section className="external-section">
|
<section className="external-section">
|
||||||
<h2 className="section-heading">♀ Dams ({dams.length})</h2>
|
<h2 className="section-heading">♀ Dams ({dams.length})</h2>
|
||||||
<div className="dog-grid">
|
<div className="dog-grid">
|
||||||
{dams.map(dog => <DogCard key={dog.id} dog={dog} navigate={navigate} />)}
|
{dams.map(dog => <DogCard key={dog.id} dog={dog} />)}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Add External Dog Modal */}
|
||||||
|
{showAddModal && (
|
||||||
|
<DogForm
|
||||||
|
isExternal={true}
|
||||||
|
onClose={() => setShowAddModal(false)}
|
||||||
|
onSave={() => { fetchDogs(); setShowAddModal(false); }}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function DogCard({ dog, navigate }) {
|
function DogCard({ dog }) {
|
||||||
const photo = dog.photo_urls?.[0];
|
const photo = dog.photo_urls?.[0];
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="dog-card dog-card--external"
|
className="dog-card dog-card--external"
|
||||||
onClick={() => navigate(`/dogs/${dog.id}`)}
|
onClick={() => window.location.href = `/dogs/${dog.id}`}
|
||||||
role="button"
|
role="button"
|
||||||
tabIndex={0}
|
tabIndex={0}
|
||||||
onKeyDown={e => e.key === 'Enter' && navigate(`/dogs/${dog.id}`)}
|
onKeyDown={e => e.key === 'Enter' && (window.location.href = `/dogs/${dog.id}`)}
|
||||||
>
|
>
|
||||||
<div className="dog-card-photo">
|
<div className="dog-card-photo">
|
||||||
{photo
|
{photo
|
||||||
|
|||||||
Reference in New Issue
Block a user