'use client'; import { useState } from 'react'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Label } from '@/components/ui/label'; import { Input } from '@/components/ui/input'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from '@/components/ui/alert-dialog'; import { Badge } from '@/components/ui/badge'; interface Project { id: string; title: string; category: string; } interface DeliberationRankingFormProps { projects: Project[]; mode: 'SINGLE_WINNER_VOTE' | 'FULL_RANKING'; onSubmit: (votes: Array<{ projectId: string; rank?: number; isWinnerPick?: boolean }>) => void; disabled?: boolean; } export function DeliberationRankingForm({ projects, mode, onSubmit, disabled = false }: DeliberationRankingFormProps) { const [selectedWinner, setSelectedWinner] = useState(''); const [rankings, setRankings] = useState>({}); const [confirmDialogOpen, setConfirmDialogOpen] = useState(false); const handleSubmit = () => { if (mode === 'SINGLE_WINNER_VOTE') { if (!selectedWinner) { return; } } else { // FULL_RANKING mode - check if all ranks are assigned const assignedRanks = Object.values(rankings); if (assignedRanks.length !== projects.length) { return; } } setConfirmDialogOpen(true); }; const handleConfirm = () => { if (mode === 'SINGLE_WINNER_VOTE') { onSubmit([ { projectId: selectedWinner, isWinnerPick: true } ]); } else { // FULL_RANKING mode const votes = Object.entries(rankings).map(([projectId, rank]) => ({ projectId, rank })); onSubmit(votes); } setConfirmDialogOpen(false); }; const isValid = mode === 'SINGLE_WINNER_VOTE' ? !!selectedWinner : Object.keys(rankings).length === projects.length; return ( <> {mode === 'SINGLE_WINNER_VOTE' ? 'Select Winner' : 'Rank All Projects'} {mode === 'SINGLE_WINNER_VOTE' ? 'Choose your top pick for this category' : 'Assign a rank (1 = best) to each project'} {mode === 'SINGLE_WINNER_VOTE' ? (
{projects.map((project) => (
))}
) : (
{projects.map((project) => (
{ const rank = parseInt(e.target.value) || 0; if (rank > 0 && rank <= projects.length) { setRankings({ ...rankings, [project.id]: rank }); } else if (e.target.value === '') { const newRankings = { ...rankings }; delete newRankings[project.id]; setRankings(newRankings); } }} className="w-20" />

{project.title}

{project.category}
))}
)}
{/* Confirmation Dialog */} Confirm Your Vote {mode === 'SINGLE_WINNER_VOTE' ? 'You have selected your winner. This vote cannot be changed once submitted.' : 'You have ranked all projects. This ranking cannot be changed once submitted.'} Review Confirm Vote ); }