import React from 'react'; import { motion } from 'framer-motion'; import { HiOutlineTrash, HiOutlineArrowDownTray, HiOutlineCheckCircle, HiOutlineXMark, } from 'react-icons/hi2'; import Typography from '../ui/Typography'; /** * Props for BulkActions component */ export interface BulkActionsProps { selectedCount: number; onBulkDelete: () => void; onBulkExport: (format: 'json' | 'csv') => void; onSelectAll: () => void; onClearSelection: () => void; } /** * Bulk actions component for selected entities */ export const BulkActions: React.FC = ({ selectedCount, onBulkDelete, onBulkExport, onSelectAll, onClearSelection, }) => { const [showDeleteConfirm, setShowDeleteConfirm] = React.useState(false); const [showExportMenu, setShowExportMenu] = React.useState(false); const [isDeleting, setIsDeleting] = React.useState(false); const handleBulkDelete = React.useCallback(async () => { setIsDeleting(true); try { await onBulkDelete(); setShowDeleteConfirm(false); } catch { setIsDeleting(false); } }, [onBulkDelete]); const handleExport = React.useCallback(async (format: 'json' | 'csv') => { await onBulkExport(format); setShowExportMenu(false); }, [onBulkExport]); React.useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (showExportMenu) { const target = event.target as Element; if (!target.closest('[data-export-menu]')) { setShowExportMenu(false); } } }; document.addEventListener('click', handleClickOutside); return () => document.removeEventListener('click', handleClickOutside); }, [showExportMenu]); if (selectedCount === 0) { return null; } return (
{selectedCount} entity{selectedCount > 1 ? 's' : ''} selected
{/* Select All */} {/* Clear Selection */} {/* Export Dropdown */}
{showExportMenu && ( )}
{/* Delete Selected */}
{/* Delete Confirmation Modal */} {showDeleteConfirm && ( { if (e.target === e.currentTarget) { setShowDeleteConfirm(false); } }} > e.stopPropagation()} >
Delete Entities This action cannot be undone
Are you sure you want to delete {selectedCount} selected entit{selectedCount > 1 ? 'ies' : 'y'}? This will permanently remove {selectedCount > 1 ? 'them' : 'it'} from your database.
)}
); };