| | |
| | import { PlusIcon } from 'lucide-react'; |
| | import { Button, Checkbox, DotsIcon, FileIcon } from '@librechat/client'; |
| | import type { ColumnDef } from '@tanstack/react-table'; |
| | import type { TFile } from 'librechat-data-provider'; |
| | import { formatDate, getFileType } from '~/utils'; |
| | import { useLocalize } from '~/hooks'; |
| |
|
| | export const fileTableColumns: ColumnDef<TFile>[] = [ |
| | { |
| | id: 'select', |
| | header: ({ table }) => { |
| | return ( |
| | <Checkbox |
| | checked={ |
| | table.getIsAllPageRowsSelected() || |
| | (table.getIsSomePageRowsSelected() && 'indeterminate') |
| | } |
| | onCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)} |
| | aria-label="Select all" |
| | className="flex" |
| | /> |
| | ); |
| | }, |
| | cell: ({ row }) => { |
| | return ( |
| | <Checkbox |
| | checked={row.getIsSelected()} |
| | onCheckedChange={(value) => row.toggleSelected(!!value)} |
| | aria-label="Select row" |
| | className="flex" |
| | /> |
| | ); |
| | }, |
| | enableSorting: false, |
| | enableHiding: false, |
| | }, |
| | { |
| | meta: { |
| | size: '50px', |
| | }, |
| | accessorKey: 'icon', |
| | header: () => { |
| | return 'Icon'; |
| | }, |
| | cell: ({ row }) => { |
| | const file = row.original; |
| | return <FileIcon file={file} fileType={getFileType(file.type)} />; |
| | }, |
| | }, |
| | { |
| | meta: { |
| | size: '150px', |
| | }, |
| | accessorKey: 'filename', |
| | header: ({ column }) => { |
| | const localize = useLocalize(); |
| | return <>{localize('com_ui_name')}</>; |
| | }, |
| | cell: ({ row }) => { |
| | const file = row.original; |
| | return <span className="self-center truncate">{file.filename}</span>; |
| | }, |
| | }, |
| | { |
| | accessorKey: 'vectorStores', |
| | header: () => { |
| | return 'Vector Stores'; |
| | }, |
| | cell: ({ row }) => { |
| | const { vectorsAttached: attachedVectorStores } = row.original; |
| | return ( |
| | <> |
| | {attachedVectorStores.map((vectorStore, index) => { |
| | if (index === 4) { |
| | return ( |
| | <span |
| | key={index} |
| | className="ml-2 mt-2 flex w-fit flex-row items-center rounded-full bg-[#f5f5f5] px-2 text-gray-500" |
| | > |
| | <PlusIcon className="h-3 w-3" /> |
| | |
| | {attachedVectorStores.length - index} more |
| | </span> |
| | ); |
| | } |
| | if (index > 4) { |
| | return null; |
| | } |
| | return ( |
| | <span key={index} className="ml-2 mt-2 rounded-full bg-[#f2f8ec] px-2 text-[#91c561]"> |
| | {vectorStore.name} |
| | </span> |
| | ); |
| | })} |
| | </> |
| | ); |
| | }, |
| | }, |
| | { |
| | accessorKey: 'updatedAt', |
| | header: () => { |
| | const localize = useLocalize(); |
| | return 'Modified'; |
| | }, |
| | cell: ({ row }) => formatDate(row.original.updatedAt), |
| | }, |
| | { |
| | accessorKey: 'actions', |
| | header: () => { |
| | return 'Actions'; |
| | }, |
| | cell: ({ row }) => { |
| | return ( |
| | <> |
| | <Button className="w-min content-center bg-transparent text-gray-500 hover:bg-slate-200"> |
| | <DotsIcon className="text-grey-100 m-0 size-5 p-0" /> |
| | </Button> |
| | </> |
| | ); |
| | }, |
| | }, |
| | ]; |
| |
|