import * as React from 'react'; import { ListFilter } from 'lucide-react'; import { flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table'; import type { ColumnDef, SortingState, VisibilityState, ColumnFiltersState, } from '@tanstack/react-table'; import { FileContext } from 'librechat-data-provider'; import type { AugmentedColumnDef } from '~/common'; import type { TFile } from 'librechat-data-provider'; import { Button, Input, Table, TableBody, TableCell, TableHead, TableHeader, TableRow, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuTrigger, } from '~/components/ui'; import { useDeleteFilesFromTable } from '~/hooks/Files'; import { NewTrashIcon, Spinner } from '~/components/svg'; import useLocalize from '~/hooks/useLocalize'; import ActionButton from '../ActionButton'; import UploadFileButton from './UploadFileButton'; interface DataTableProps { columns: ColumnDef[]; data: TData[]; } const contextMap = { [FileContext.filename]: 'com_ui_name', [FileContext.updatedAt]: 'com_ui_date', [FileContext.source]: 'com_ui_storage', [FileContext.context]: 'com_ui_context', [FileContext.bytes]: 'com_ui_size', }; type Style = { width?: number | string; maxWidth?: number | string; minWidth?: number | string }; export default function DataTableFile({ columns, data, }: DataTableProps) { const localize = useLocalize(); const [isDeleting, setIsDeleting] = React.useState(false); const [rowSelection, setRowSelection] = React.useState({}); const [sorting, setSorting] = React.useState([]); const [columnFilters, setColumnFilters] = React.useState([]); const [columnVisibility, setColumnVisibility] = React.useState({}); const { deleteFiles } = useDeleteFilesFromTable(() => setIsDeleting(false)); const table = useReactTable({ data, columns, onSortingChange: setSorting, getCoreRowModel: getCoreRowModel(), getSortedRowModel: getSortedRowModel(), onColumnFiltersChange: setColumnFilters, getFilteredRowModel: getFilteredRowModel(), onColumnVisibilityChange: setColumnVisibility, getPaginationRowModel: getPaginationRowModel(), onRowSelectionChange: setRowSelection, state: { sorting, columnFilters, columnVisibility, rowSelection, }, }); return ( <>

Files

{ console.log('click'); }} />
{' '} {table .getAllColumns() .filter((column) => column.getCanHide()) .map((column) => { return ( column.toggleVisibility(!!value)} > {localize(contextMap[column.id])} ); })} table.getColumn('filename')?.setFilterValue(event.target.value)} className="max-w-sm dark:border-gray-500" /> { console.log('click'); }} />
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header, index) => { const style: Style = { maxWidth: '32px', minWidth: '125px' }; if (header.id === 'filename') { style.maxWidth = '25%'; style.width = '25%'; style.minWidth = '150px'; } if (header.id === 'icon') { style.width = '25px'; style.maxWidth = '25px'; style.minWidth = '35px'; } if (header.id === 'vectorStores') { style.maxWidth = '50%'; style.width = '50%'; style.minWidth = '300px'; } if (index === 0 && header.id === 'select') { style.width = '25px'; style.maxWidth = '25px'; style.minWidth = '35px'; } return ( {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} ); })} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell, index) => { const maxWidth = (cell.column.columnDef as AugmentedColumnDef)?.meta?.size ?? 'auto'; const style: Style = {}; if (cell.column.id === 'filename') { style.maxWidth = maxWidth; } else if (index === 0) { style.maxWidth = '20px'; } return ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ); })} )) ) : ( {localize('com_files_no_results')} )}
{localize( 'com_files_number_selected', `${table.getFilteredSelectedRowModel().rows.length}`, `${table.getFilteredRowModel().rows.length}`, )}
); }