'use client' import { useState } from 'react' import { trpc } from '@/lib/trpc/client' import { Button } from '@/components/ui/button' import { Checkbox } from '@/components/ui/checkbox' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, DialogDescription, } from '@/components/ui/dialog' import { Badge } from '@/components/ui/badge' import { Input } from '@/components/ui/input' import { Card } from '@/components/ui/card' import { Skeleton } from '@/components/ui/skeleton' import { toast } from 'sonner' import { ChevronLeft, ChevronRight, Loader2 } from 'lucide-react' import Link from 'next/link' export default function ProjectPoolPage() { const [selectedProgramId, setSelectedProgramId] = useState('') const [selectedProjects, setSelectedProjects] = useState([]) const [assignDialogOpen, setAssignDialogOpen] = useState(false) const [targetRoundId, setTargetRoundId] = useState('') const [searchQuery, setSearchQuery] = useState('') const [categoryFilter, setCategoryFilter] = useState<'STARTUP' | 'BUSINESS_CONCEPT' | 'all'>('all') const [currentPage, setCurrentPage] = useState(1) const perPage = 50 const { data: programs } = trpc.program.list.useQuery({ status: 'ACTIVE' }) const { data: poolData, isLoading: isLoadingPool, refetch } = trpc.projectPool.listUnassigned.useQuery( { programId: selectedProgramId, competitionCategory: categoryFilter === 'all' ? undefined : categoryFilter, search: searchQuery || undefined, page: currentPage, perPage, }, { enabled: !!selectedProgramId } ) const { data: rounds, isLoading: isLoadingRounds } = trpc.round.listByProgram.useQuery( { programId: selectedProgramId }, { enabled: !!selectedProgramId } ) const utils = trpc.useUtils() const assignMutation = trpc.projectPool.assignToRound.useMutation({ onSuccess: (result) => { utils.project.list.invalidate() utils.round.get.invalidate() toast.success(`Assigned ${result.assignedCount} project${result.assignedCount !== 1 ? 's' : ''} to round`) setSelectedProjects([]) setAssignDialogOpen(false) setTargetRoundId('') refetch() }, onError: (error) => { toast.error(error.message || 'Failed to assign projects') }, }) const handleBulkAssign = () => { if (selectedProjects.length === 0 || !targetRoundId) return assignMutation.mutate({ projectIds: selectedProjects, roundId: targetRoundId, }) } const handleQuickAssign = (projectId: string, roundId: string) => { assignMutation.mutate({ projectIds: [projectId], roundId, }) } const toggleSelectAll = () => { if (!poolData?.projects) return if (selectedProjects.length === poolData.projects.length) { setSelectedProjects([]) } else { setSelectedProjects(poolData.projects.map((p) => p.id)) } } const toggleSelectProject = (projectId: string) => { if (selectedProjects.includes(projectId)) { setSelectedProjects(selectedProjects.filter((id) => id !== projectId)) } else { setSelectedProjects([...selectedProjects, projectId]) } } return (
{/* Header */}

Project Pool

Assign unassigned projects to evaluation rounds

{/* Program Selector */}
{ setSearchQuery(e.target.value) setCurrentPage(1) }} />
{selectedProjects.length > 0 && ( )}
{/* Projects Table */} {selectedProgramId && ( <> {isLoadingPool ? (
{[...Array(5)].map((_, i) => ( ))}
) : poolData && poolData.total > 0 ? ( <>
{poolData.projects.map((project) => ( ))}
0} onCheckedChange={toggleSelectAll} /> Project Category Country Submitted Action
toggleSelectProject(project.id)} />
{project.title}
{project.teamName}
{project.competitionCategory === 'STARTUP' ? 'Startup' : 'Business Concept'} {project.country || '-'} {project.submittedAt ? new Date(project.submittedAt).toLocaleDateString() : '-'} {isLoadingRounds ? ( ) : ( )}
{/* Pagination */} {poolData.totalPages > 1 && (

Showing {((currentPage - 1) * perPage) + 1} to {Math.min(currentPage * perPage, poolData.total)} of {poolData.total} projects

)} ) : ( No unassigned projects found for this program )} )} {!selectedProgramId && ( Select a program to view unassigned projects )} {/* Bulk Assignment Dialog */} Assign Projects to Round Assign {selectedProjects.length} selected project{selectedProjects.length > 1 ? 's' : ''} to:
) }