import React from 'react'; import { Box, Typography, Card, CardContent, Grid, Chip, IconButton, Menu, MenuItem, Button, Avatar, } from '@mui/material'; import { MoreVert as MoreVertIcon, Folder as FolderIcon, ArrowForward as ArrowForwardIcon, } from '@mui/icons-material'; import type { IKnowledge } from '@/interfaces/database/knowledge'; interface KnowledgeGridViewProps { knowledgeBases: IKnowledge[]; maxItems?: number; showSeeAll?: boolean; onSeeAll?: () => void; onEdit?: (kb: IKnowledge) => void; onDelete?: (kb: IKnowledge) => void; onView?: (kb: IKnowledge) => void; loading?: boolean; } interface KnowledgeCardProps { knowledge: IKnowledge; onMenuClick: (event: React.MouseEvent, kb: IKnowledge) => void; } const KnowledgeCard: React.FC = ({ knowledge, onMenuClick }) => { const getStatusInfo = (permission: string) => { switch (permission) { case 'me': return { label: '私有', color: '#E3F2FD', textColor: '#1976D2' }; case 'team': return { label: '团队', color: '#E8F5E8', textColor: '#388E3C' }; default: return { label: '公开', color: '#FFF3E0', textColor: '#F57C00' }; } }; const statusInfo = getStatusInfo(knowledge.permission || 'me'); // 格式化更新时间 const formatUpdateTime = (timestamp: number) => { if (!timestamp) return '未知'; const date = new Date(timestamp); return date.toLocaleDateString('zh-CN', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }); }; // 格式化token数量 const formatTokenNum = (tokenNum: number) => { if (tokenNum < 1000) return tokenNum.toString(); if (tokenNum < 1000000) return `${(tokenNum / 1000).toFixed(1)}K`; return `${(tokenNum / 1000000).toFixed(1)}M`; }; return ( {/* 显示avatar */} {knowledge.avatar ? ( ) : ( )} {knowledge.name} onMenuClick(e, knowledge)} > {knowledge.description || '暂无描述'} {knowledge.doc_num || 0} 文档数量 {knowledge.chunk_num || 0} 分块数量 {formatTokenNum(knowledge.token_num || 0)} Token数量 {/* 显示更新时间 */} 最后更新: {formatUpdateTime(knowledge.update_time)} {/* 显示创建者 */} {knowledge.nickname && ( 创建者: {knowledge.nickname} )} {/* 显示语言 */} {knowledge.language && ( 语言: {knowledge.language} )} ); }; const KnowledgeGridView: React.FC = ({ knowledgeBases, maxItems, showSeeAll = false, onSeeAll, onEdit, onDelete, onView, loading = false, }) => { const [anchorEl, setAnchorEl] = React.useState(null); const [selectedKB, setSelectedKB] = React.useState(null); const handleMenuClick = (event: React.MouseEvent, kb: IKnowledge) => { setAnchorEl(event.currentTarget); setSelectedKB(kb); }; const handleMenuClose = () => { setAnchorEl(null); setSelectedKB(null); }; const handleEdit = () => { if (selectedKB && onEdit) { onEdit(selectedKB); } handleMenuClose(); }; const handleDelete = () => { if (selectedKB && onDelete) { onDelete(selectedKB); } handleMenuClose(); }; const handleView = () => { if (selectedKB && onView) { onView(selectedKB); } handleMenuClose(); }; const displayedKBs = maxItems ? knowledgeBases.slice(0, maxItems) : knowledgeBases; const hasMore = maxItems && knowledgeBases.length > maxItems; if (loading) { return ( 加载中... ); } if (knowledgeBases.length === 0) { return ( 暂无知识库 创建您的第一个知识库开始使用 ); } return ( {displayedKBs.map((kb) => ( ))} {showSeeAll && hasMore && ( )} 查看详情 编辑 导出 删除 ); }; export default KnowledgeGridView;