'use client'; import React, { useState, useEffect } from 'react'; import { cn } from '@/public/lib/utils'; interface Project { id: string; name: string; status: 'active' | 'inactive'; last_activity: string; } interface ProjectSelectorProps { selectedProjectIds: string[]; onProjectChange: (projectIds: string[]) => void; } export default function ProjectSelector({ selectedProjectIds, onProjectChange }: ProjectSelectorProps) { const [isOpen, setIsOpen] = useState(false); const [searchTerm, setSearchTerm] = useState(''); const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(false); // 模拟项目数据 - 在实际应用中应该从API获取 const mockProjects: Project[] = [ { id: 'bc43bc81-c781-4caa-8256-9710fd5bee80', name: '视频制作项目 A', status: 'active', last_activity: '2024-01-15T10:30:00Z' }, { id: 'd203016d-6f7e-4d1c-b66b-1b7d33632800', name: '视频制作项目 B', status: 'active', last_activity: '2024-01-15T09:15:00Z' }, { id: '029bbc09-6d83-440b-97fe-e2aa37b8042d', name: '视频制作项目 C', status: 'active', last_activity: '2024-01-14T16:45:00Z' }, { id: 'f47ac10b-58cc-4372-a567-0e02b2c3d479', name: '视频制作项目 D', status: 'inactive', last_activity: '2024-01-10T14:20:00Z' }, ]; useEffect(() => { // 模拟加载项目列表 setLoading(true); setTimeout(() => { setProjects(mockProjects); setLoading(false); }, 500); }, []); const filteredProjects = projects.filter(project => project.name.toLowerCase().includes(searchTerm.toLowerCase()) || project.id.toLowerCase().includes(searchTerm.toLowerCase()) ); const handleProjectToggle = (projectId: string) => { if (selectedProjectIds.includes(projectId)) { // 移除项目 onProjectChange(selectedProjectIds.filter(id => id !== projectId)); } else { // 添加项目 onProjectChange([...selectedProjectIds, projectId]); } }; const handleSelectAll = () => { const activeProjects = filteredProjects.filter(p => p.status === 'active'); onProjectChange(activeProjects.map(p => p.id)); }; const handleClearAll = () => { onProjectChange([]); }; const getSelectedProjectNames = () => { return selectedProjectIds .map(id => projects.find(p => p.id === id)?.name || id.slice(0, 8)) .join(', '); }; return (
{/* 选择器按钮 */} {/* 下拉面板 */} {isOpen && (
{/* 搜索框 */}
setSearchTerm(e.target.value)} className="w-full px-3 py-2 bg-gray-700 border border-gray-600 rounded text-white placeholder-gray-400 text-sm focus:outline-none focus:border-blue-500" />
{/* 批量操作 */}
已选 {selectedProjectIds.length} 个
{/* 项目列表 */}
{loading ? (
加载中...
) : filteredProjects.length === 0 ? (
{searchTerm ? '未找到匹配的项目' : '暂无项目'}
) : (
{filteredProjects.map((project) => (
handleProjectToggle(project.id)} > {}} // 由父级点击处理 className="rounded" />
{project.name}
ID: {project.id}
最后活动: {new Date(project.last_activity).toLocaleDateString()}
))}
)}
{/* 底部信息 */}
共 {projects.length} 个项目 支持多选对比
)} {/* 点击外部关闭 */} {isOpen && (
setIsOpen(false)} /> )}
); }