import React, { useState } from "react"; import { Button } from "../ui/button"; import { Select } from "../ui/select"; import { Columns } from "lucide-react"; import { __ } from "../../lib/i18n"; import { ConfirmationDialog } from "../ui/confirmation-dialog"; interface BulkActionOption { value: string; label: string; } interface StatusFilterOption { key: string; label: string; count: number; } interface ColumnVisibilityOption { key: string; label: string; visible: boolean; } interface BulkActionToolbarProps { selectedIds: (string | number)[]; bulkAction: string; setBulkAction: (action: string) => void; onApply: () => void; onClearSelection: () => void; statusFilter: string; setStatusFilter: (filter: string) => void; statusOptions: StatusFilterOption[]; showColumnsDropdown: boolean; setShowColumnsDropdown: (show: boolean) => void; columnOptions: ColumnVisibilityOption[]; onToggleColumn: (columnKey: string) => void; bulkMutationPending: boolean; totalItems: number; bulkActionOptions: BulkActionOption[]; } export const BulkActionToolbar: React.FC = ({ selectedIds, bulkAction, setBulkAction, onApply, onClearSelection, statusFilter, setStatusFilter, statusOptions, showColumnsDropdown, setShowColumnsDropdown, columnOptions, onToggleColumn, bulkMutationPending, totalItems, bulkActionOptions, }) => { const [confirmDialog, setConfirmDialog] = useState<{ isOpen: boolean; action: string; count: number; }>({ isOpen: false, action: "", count: 0, }); const handleApplyClick = () => { if (!bulkAction || selectedIds.length === 0) { onApply(); // Let parent handle validation messages return; } // Show confirmation dialog setConfirmDialog({ isOpen: true, action: bulkAction, count: selectedIds.length, }); }; const handleConfirm = () => { setConfirmDialog({ isOpen: false, action: "", count: 0 }); onApply(); // Execute the actual bulk action setBulkAction(""); // Reset bulk action selection }; const handleCancel = () => { setConfirmDialog({ isOpen: false, action: "", count: 0 }); }; // Close dropdown when clicking outside React.useEffect(() => { const handleClickOutside = (event: MouseEvent) => { const target = event.target as HTMLElement; if ( target.closest("[data-columns-trigger]") || target.closest("[data-columns-content]") ) { return; } setShowColumnsDropdown(false); }; if (showColumnsDropdown) { document.addEventListener("click", handleClickOutside); return () => document.removeEventListener("click", handleClickOutside); } }, [showColumnsDropdown, setShowColumnsDropdown]); return ( <> {/* Bulk actions toolbar - Always above the table */}
{/* Top row: Bulk actions and status tabs */}
{/* Left: Bulk actions - all in one line */}
{/* Selection info right after Apply button */} {selectedIds.length > 0 && (
{`${__("Selected:", "yatra")} ${selectedIds.length}`}
)}
{/* Right: Status filter tabs */}
{statusOptions.map((filter) => { const isActive = statusFilter === filter.key; return ( ); })} {/* Columns visibility toggle - only when there are column options */} {columnOptions.length > 0 && (
{/* Columns dropdown */} {showColumnsDropdown && (
e.stopPropagation()} >
{__("Show Columns", "yatra")}
{columnOptions.map((option) => ( ))}
)}
)}
{/* Bulk Action Confirmation Dialog */} { switch (confirmDialog.action) { case "delete": return __("Delete Permanently", "yatra"); case "mark_trash": case "trash": return __("Move to Trash", "yatra"); case "mark_publish": case "publish": return __("Publish Items", "yatra"); case "mark_draft": case "draft": return __("Make Draft", "yatra"); case "mark_archived": return __("Archive Items", "yatra"); case "restore": return __("Restore Items", "yatra"); default: return __("Confirm Bulk Action", "yatra"); } })()} message={(() => { const count = confirmDialog.count; switch (confirmDialog.action) { case "delete": return __( "Are you sure you want to permanently delete {count} item(s)? This action cannot be undone.", "yatra", ).replace("{count}", count.toString()); case "mark_trash": case "trash": return __( "Are you sure you want to move {count} item(s) to trash?", "yatra", ).replace("{count}", count.toString()); case "mark_publish": case "publish": return __( "Are you sure you want to publish {count} item(s)?", "yatra", ).replace("{count}", count.toString()); case "mark_draft": case "draft": return __( "Are you sure you want to make {count} item(s) draft?", "yatra", ).replace("{count}", count.toString()); case "mark_archived": return __( "Are you sure you want to archive {count} item(s)?", "yatra", ).replace("{count}", count.toString()); case "restore": return __( "Are you sure you want to restore {count} item(s)?", "yatra", ).replace("{count}", count.toString()); default: return __( "Are you sure you want to perform this action on {count} item(s)?", "yatra", ).replace("{count}", count.toString()); } })()} confirmText={(() => { switch (confirmDialog.action) { case "delete": return __("Delete Permanently", "yatra"); case "mark_trash": case "trash": return __("Move to Trash", "yatra"); case "mark_publish": case "publish": return __("Publish", "yatra"); case "mark_draft": case "draft": return __("Make Draft", "yatra"); case "mark_archived": return __("Archive", "yatra"); case "restore": return __("Restore", "yatra"); default: return __("Confirm", "yatra"); } })()} cancelText={__("Cancel", "yatra")} variant={confirmDialog.action === "delete" ? "danger" : "warning"} isLoading={bulkMutationPending} /> ); };