'use client';
import * as React from 'react';
import { cn } from '@djangocfg/ui-core/lib';
import { ArrowUp, ArrowDown, ArrowUpDown } from 'lucide-react';
import {
TableHeader,
TableRow,
TableHead,
} from '@djangocfg/ui-core/components';
import { useDataTableContext } from '../context/DataTableContext';
export function DataTableHeader() {
const { columns, selectionMode, selectAllVisible, isSelected, rows, getRowId } =
useDataTableContext();
const allVisibleSelected = rows.length > 0 && rows.every((r) => isSelected(getRowId(r)));
return (
{selectionMode === 'multiple' && (
)}
{selectionMode === 'single' && }
{columns.map((col) => (
))}
);
}
DataTableHeader.displayName = 'DataTableHeader';
function DataTableHeaderCell({ column }: { column: { key: string; header: React.ReactNode; sortable?: boolean; align?: 'left' | 'center' | 'right' } }) {
const { sort, setSort } = useDataTableContext();
const isSorted = sort.key === column.key;
return (
column.sortable && setSort(column.key)}
data-sort={isSorted ? sort.direction : undefined}
>
{column.header}
{column.sortable && (
{isSorted && sort.direction === 'asc' && }
{isSorted && sort.direction === 'desc' && }
{!isSorted && }
)}
);
}
function DataTableFilterRow() {
const { columns, filters, setFilter, selectionMode } = useDataTableContext();
const hasFilterable = columns.some((c) => c.filterable);
if (!hasFilterable) return null;
return (
{selectionMode !== 'none' && }
{columns.map((col) => (
{col.filterable ? (
setFilter(col.key, e.target.value)}
placeholder="Filter…"
className={cn(
'w-full rounded-sm border border-input bg-background px-2 py-1 text-xs',
'placeholder:text-muted-foreground',
'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring'
)}
/>
) : (
)}
))}
);
}