/** * 模型列表 - 桌面端表格视图 */ import React from 'react' import { Button } from '@/components/ui/button' import { Checkbox } from '@/components/ui/checkbox' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { Pencil, Trash2 } from 'lucide-react' import type { ModelInfo } from '../types' interface ModelTableProps { /** 当前页显示的模型 (分页后的) */ paginatedModels: ModelInfo[] /** 所有模型列表 (未分页) */ allModels: ModelInfo[] /** 过滤后的模型列表 */ filteredModels: ModelInfo[] /** 已选中的模型索引集合 */ selectedModels: Set /** 编辑模型回调 */ onEdit: (model: ModelInfo, index: number) => void /** 删除模型回调 */ onDelete: (index: number) => void /** 切换选中状态回调 */ onToggleSelection: (index: number) => void /** 切换全选回调 */ onToggleSelectAll: () => void /** 检查模型是否被使用 */ isModelUsed: (modelName: string) => boolean /** 搜索关键词 */ searchQuery: string } export const ModelTable = React.memo(function ModelTable({ paginatedModels, allModels, filteredModels, selectedModels, onEdit, onDelete, onToggleSelection, onToggleSelectAll, isModelUsed, searchQuery, }: ModelTableProps) { return (
0} onCheckedChange={onToggleSelectAll} /> 使用 模型名称 模型标识符 提供商 视觉 温度 输入价格 输出价格 操作 {paginatedModels.length === 0 ? ( {searchQuery ? '未找到匹配的模型' : '暂无模型配置'} ) : ( paginatedModels.map((model, displayIndex) => { const actualIndex = allModels.findIndex(m => m === model) const used = isModelUsed(model.name) return ( onToggleSelection(actualIndex)} /> {model.name} {model.model_identifier} {model.api_provider} {model.temperature != null ? model.temperature : -} ¥{model.price_in}/M ¥{model.price_out}/M
) }) )}
) })