Uecko_ERP/packages/rdx-ui/src/components/datatable/with-row-selection.tsx
2025-10-16 19:59:13 +02:00

50 lines
1.5 KiB
TypeScript

import { Checkbox } from "@repo/shadcn-ui/components";
import type { ColumnDef } from "@tanstack/react-table";
import * as React from "react";
// Columna estable (definida una vez)
const selectionCol: ColumnDef<any, unknown> = {
id: "select",
header: ({ table }) => (
<Checkbox
checked={table.getIsAllPageRowsSelected() || (table.getIsSomePageRowsSelected() && "indeterminate")}
onCheckedChange={(v) => table.toggleAllPageRowsSelected(!!v)}
aria-label="Select all"
className="translate-y-[2px]"
/>
),
cell: ({ row }) => (
<Checkbox
checked={row.getIsSelected()}
onCheckedChange={(v) => row.toggleSelected(!!v)}
aria-label="Select row"
className="translate-y-[2px]"
/>
),
enableSorting: false,
enableHiding: false,
size: 36, minSize: 36, maxSize: 36,
};
// Función pura (sin hooks)
export function withRowSelection<T>(
base: ColumnDef<T, unknown>[],
enabled: boolean
): ColumnDef<T, unknown>[] {
if (!enabled) return base; // misma referencia si está desactivado
// Evita duplicar si ya viene incluida
if (base.length > 0 && base[0].id === selectionCol.id) return base;
return [selectionCol as ColumnDef<T, unknown>, ...base];
}
// Custom hook ergonómico
export function useWithRowSelection<T>(
baseColumns: ColumnDef<T, unknown>[],
enabled: boolean
) {
return React.useMemo(
() => withRowSelection(baseColumns, enabled),
[baseColumns, enabled]
);
}