import { Button, Separator, Tooltip, TooltipContent, TooltipTrigger, } from "@repo/shadcn-ui/components"; import { cn } from "@repo/shadcn-ui/lib/utils"; import type { Table } from "@tanstack/react-table"; import { ArrowDownIcon, ArrowUpIcon, CopyPlusIcon, PlusIcon, ScanIcon, TrashIcon, } from "lucide-react"; import React from "react"; import { useTranslation } from "../../locales/i18n.ts"; import type { DataTableMeta } from "./data-table.tsx"; import { DataTableViewOptions } from "./data-table-view-options.tsx"; interface DataTableToolbarProps { table: Table; showViewOptions?: boolean; className?: string; } export function DataTableToolbar({ table, showViewOptions = true, className, }: DataTableToolbarProps) { const { t } = useTranslation(); const meta = table.options.meta as DataTableMeta | undefined; const readOnly = meta?.readOnly ?? false; // Modelos y conteos const allRows = table.getFilteredRowModel().rows; const selectedRows = table.getSelectedRowModel().rows; const totalCount = allRows.length; const selectedCount = selectedRows.length; const hasSelection = selectedCount > 0; // Índices seleccionados (memoizado) const selectedIndexes = React.useMemo(() => selectedRows.map((r) => r.index), [selectedRows]); const handleAdd = React.useCallback(() => { if (!readOnly) meta?.tableOps?.onAdd?.(table); }, [meta, table, readOnly]); const handleDuplicateSelected = React.useCallback(() => { if (!readOnly) meta?.bulkOps?.duplicateSelected?.(selectedIndexes, table); }, [meta, selectedIndexes, table, readOnly]); const handleMoveSelectedUp = React.useCallback(() => { if (!readOnly) meta?.bulkOps?.moveSelectedUp?.(selectedIndexes, table); }, [meta, selectedIndexes, table, readOnly]); const handleMoveSelectedDown = React.useCallback(() => { if (!readOnly) meta?.bulkOps?.moveSelectedDown?.(selectedIndexes, table); }, [meta, selectedIndexes, table, readOnly]); const handleRemoveSelected = React.useCallback(() => { if (!readOnly) meta?.bulkOps?.removeSelected?.(selectedIndexes, table); }, [meta, selectedIndexes, table, readOnly]); const handleClearSelection = React.useCallback(() => { table.resetRowSelection(); }, [table]); // Render principal return (
{/* IZQUIERDA: acciones + contador */}
{/* Botón añadir */} {!readOnly && meta?.tableOps?.onAdd && ( )} {/* Acciones sobre selección */} {hasSelection && ( <> {!readOnly && meta?.bulkOps?.duplicateSelected && ( )} {!readOnly && meta?.bulkOps?.moveSelectedUp && ( {t("components.datatable.actions.move_up")} )} {!readOnly && meta?.bulkOps?.moveSelectedDown && ( {t("components.datatable.actions.move_down")} )} {!readOnly && meta?.bulkOps?.removeSelected && ( <> )} {t("components.datatable.actions.clear_selection")} )} {/* Contador de selección */}
{hasSelection ? t("components.datatable.selection_summary", { count: selectedCount, total: totalCount, }) : t("components.datatable.selection_none", { total: totalCount })}
{/* DERECHA: opciones de vista */}
{showViewOptions && !readOnly && }
); } export const MemoizedDataTableToolbar = React.memo(DataTableToolbar) as typeof DataTableToolbar;