"use client" import * as React from "react" import { ColumnDef, ColumnFiltersState, ColumnSizingState, flexRender, getCoreRowModel, getFilteredRowModel, getPaginationRowModel, getSortedRowModel, SortingState, useReactTable, VisibilityState, } from "@tanstack/react-table" import { IconChevronDown, IconChevronLeft, IconChevronRight, IconChevronsLeft, IconChevronsRight, IconLayoutColumns, IconPlus, IconTrash, } from "@tabler/icons-react" import { Button } from "@/components/ui/button" import { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table" interface CommandsDataTableProps { columns: ColumnDef[] data: TData[] onBulkDelete?: (selectedIds: number[]) => void onAdd?: () => void } export function CommandsDataTable({ columns, data, onBulkDelete, onAdd, }: CommandsDataTableProps) { const [sorting, setSorting] = React.useState([]) const [columnFilters, setColumnFilters] = React.useState([]) const [columnVisibility, setColumnVisibility] = React.useState({}) const [rowSelection, setRowSelection] = React.useState({}) const [columnSizing, setColumnSizing] = React.useState({}) const table = useReactTable({ data, columns, getCoreRowModel: getCoreRowModel(), getPaginationRowModel: getPaginationRowModel(), getSortedRowModel: getSortedRowModel(), getFilteredRowModel: getFilteredRowModel(), onSortingChange: setSorting, onColumnFiltersChange: setColumnFilters, onColumnVisibilityChange: setColumnVisibility, onRowSelectionChange: setRowSelection, onColumnSizingChange: setColumnSizing, enableColumnResizing: true, columnResizeMode: 'onChange', state: { sorting, columnFilters, columnVisibility, rowSelection, columnSizing, }, }) // 获取选中的行 const selectedRows = table.getFilteredSelectedRowModel().rows // 处理批量删除 const handleBulkDelete = () => { if (onBulkDelete && selectedRows.length > 0) { const selectedIds = selectedRows.map((row) => (row.original as { id: number }).id) onBulkDelete(selectedIds) } } return (
{/* 工具栏 */}
{/* 搜索框 */}
table.getColumn("displayName")?.setFilterValue(event.target.value) } className="max-w-sm" />
{/* 右侧操作按钮 */}
{/* 列显示控制 */} {table .getAllColumns() .filter( (column) => typeof column.accessorFn !== "undefined" && column.getCanHide() ) .map((column) => { return ( column.toggleVisibility(!!value)} > {column.id === "id" && "ID"} {column.id === "displayName" && "名称"} {column.id === "tool" && "所属工具"} {column.id === "commandTemplate" && "命令模板"} {column.id === "description" && "描述"} {column.id === "updatedAt" && "更新时间"} {!["id", "displayName", "tool", "commandTemplate", "description", "updatedAt"].includes(column.id) && column.id} ) })} {/* 批量删除按钮 */} {onBulkDelete && ( )} {/* 添加命令按钮 */} {onAdd && ( )}
{/* 表格 */}
{table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => { return ( {header.isPlaceholder ? null : flexRender( header.column.columnDef.header, header.getContext() )} {header.column.getCanResize() && (
header.column.resetSize()} className="absolute -right-2.5 top-0 h-full w-5 cursor-col-resize select-none touch-none bg-transparent flex justify-center" >
)} ) })} ))} {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => ( {row.getVisibleCells().map((cell) => ( {flexRender(cell.column.columnDef.cell, cell.getContext())} ))} )) ) : ( 暂无数据 )}
{/* 分页控制 */}
{/* 选中行信息 */}
{table.getFilteredSelectedRowModel().rows.length} of{" "} {table.getFilteredRowModel().rows.length} row(s) selected
{/* 分页控制器 */}
{/* 每页显示数量选择 */}
{/* 页码信息 */}
Page {table.getState().pagination.pageIndex + 1} of{" "} {table.getPageCount()}
{/* 分页按钮 */}
) }