diff --git a/frontend/src/pages/Sites/List.tsx b/frontend/src/pages/Sites/List.tsx index b10a54dd..11d72980 100644 --- a/frontend/src/pages/Sites/List.tsx +++ b/frontend/src/pages/Sites/List.tsx @@ -17,6 +17,7 @@ import InputField from '../../components/form/input/InputField'; import Select from '../../components/form/Select'; import ViewToggle from '../../components/common/ViewToggle'; import WorkflowGuide from '../../components/onboarding/WorkflowGuide'; +import ConfirmDialog from '../../components/common/ConfirmDialog'; import { useOnboardingStore } from '../../store/onboardingStore'; import { PlusIcon, @@ -75,6 +76,9 @@ export default function SiteList() { // Site Management Modals const [selectedSite, setSelectedSite] = useState(null); const [togglingSiteId, setTogglingSiteId] = useState(null); + const [showDeleteConfirm, setShowDeleteConfirm] = useState(false); + const [siteToDelete, setSiteToDelete] = useState(null); + const [isDeleting, setIsDeleting] = useState(false); // Filters const [searchTerm, setSearchTerm] = useState(''); @@ -229,10 +233,20 @@ export default function SiteList() { } }; - const handleDeleteSite = async (siteId: number) => { + const handleDeleteSite = (site: Site) => { + setSiteToDelete(site); + setShowDeleteConfirm(true); + }; + + const confirmDeleteSite = async () => { + if (!siteToDelete) return; + try { - await deleteSite(siteId); + setIsDeleting(true); + await deleteSite(siteToDelete.id); toast.success('Site deleted successfully'); + setShowDeleteConfirm(false); + setSiteToDelete(null); await loadSites(); } catch (error: any) { if (isUpgradeError(error)) { @@ -240,6 +254,8 @@ export default function SiteList() { } else { toast.error(`Failed to delete site: ${error.message}`); } + } finally { + setIsDeleting(false); } }; @@ -414,23 +430,21 @@ export default function SiteList() { {/* Status badge and toggle in top right */}
- handleToggle(site.id, enabled)} disabled={togglingSiteId === site.id} /> - {site.is_active ? 'Active' : 'Inactive'} @@ -597,7 +611,10 @@ export default function SiteList() { }} onFilterReset={clearFilters} onDelete={async (id) => { - await handleDeleteSite(id); + const site = filteredSites.find(s => s.id === id); + if (site) { + handleDeleteSite(site); + } }} getItemDisplayName={(row) => row.name} /> @@ -680,6 +697,22 @@ export default function SiteList() { )} )} + + {/* Delete Confirmation Dialog */} + { + setShowDeleteConfirm(false); + setSiteToDelete(null); + }} + onConfirm={confirmDeleteSite} + title="Delete Site" + message={`Are you sure you want to delete "${siteToDelete?.name}"? This action cannot be undone.`} + confirmText="Delete" + cancelText="Cancel" + variant="danger" + isLoading={isDeleting} + /> ); }