"use client"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, DropdownMenuSeparator, DropdownMenuCheckboxItem, } from "@/components/ui/dropdown-menu"; import { Badge } from "@/components/ui/badge"; import { ChevronDown, Database, FileText, BookOpen, Scale } from "lucide-react"; import { cn } from "@/lib/utils"; // 系统知识库图标映射 const getSystemKnowledgeBaseIcon = (name: string) => { if (name.includes("法律法规")) return Scale; if (name.includes("原理")) return BookOpen; if (name.includes("案例")) return FileText; return Database; }; export interface KnowledgeBase { id: string; name: string; description: string; documentCount: number; enabled: boolean; isSystem?: boolean; // 是否为系统知识库 icon?: React.ComponentType<{ className?: string }>; } interface KnowledgeSelectorProps { selectedBases: string[]; onBasesChange: (baseIds: string[]) => void; systemKnowledgeBases?: KnowledgeBase[]; // 系统知识库列表(从后端动态加载) userKnowledgeBases?: KnowledgeBase[]; // 用户的知识库列表 className?: string; } export default function KnowledgeSelector({ selectedBases, onBasesChange, systemKnowledgeBases = [], userKnowledgeBases = [], className }: KnowledgeSelectorProps) { const [isOpen, setIsOpen] = useState(false); // 为系统知识库添加图标(如果还没有的话) const systemBasesWithIcons = systemKnowledgeBases.map(kb => ({ ...kb, icon: kb.icon || getSystemKnowledgeBaseIcon(kb.name), isSystem: true, })); // 合并系统知识库和用户知识库 const allKnowledgeBases = [ ...systemBasesWithIcons, ...userKnowledgeBases.map(kb => ({ ...kb, isSystem: false, // 用户知识库标记为非系统 })) ]; const enabledBases = allKnowledgeBases.filter(base => base.enabled); const selectedCount = selectedBases.length; const totalEnabled = enabledBases.length; const handleToggleBase = (baseId: string) => { const newSelectedBases = selectedBases.includes(baseId) ? selectedBases.filter(id => id !== baseId) : [...selectedBases, baseId]; onBasesChange(newSelectedBases); }; const handleSelectAll = () => { const allEnabledIds = enabledBases.map(base => base.id); onBasesChange(allEnabledIds); }; const handleSelectNone = () => { onBasesChange([]); }; return (
选择知识库
{/* 快速操作 */}
{/* 系统知识库 */} {systemBasesWithIcons.length > 0 && (
系统知识库
{systemBasesWithIcons.map((base) => { const BaseIcon = base.icon || Database; const isSelected = selectedBases.includes(base.id); const isDisabled = !base.enabled; return ( handleToggleBase(base.id)} disabled={isDisabled} className={cn( "flex items-start space-x-3 p-3 cursor-pointer", isDisabled && "opacity-50 cursor-not-allowed" )} >
{base.name} {isSelected && ( 已选 )} {isDisabled && ( 不可用 )}

{base.description}

{base.documentCount} 个文档
); })}
)} {/* 用户知识库 */} {userKnowledgeBases.length > 0 && ( <>
我的知识库
{userKnowledgeBases.map((base) => { const isSelected = selectedBases.includes(base.id); const isDisabled = !base.enabled; return ( handleToggleBase(base.id)} disabled={isDisabled} className={cn( "flex items-start space-x-3 p-3 cursor-pointer", isDisabled && "opacity-50 cursor-not-allowed" )} >
{base.name} {isSelected && ( 已选 )} {isDisabled && ( 不可用 )}

{base.description}

{base.documentCount} 个文档
); })}
)} {selectedCount > 0 && ( <>
已选择 {selectedCount} 个知识库
)}
); }