'use client' import { use, useState } from 'react' import Link from 'next/link' import { useRouter } from 'next/navigation' import { trpc } from '@/lib/trpc/client' import { Button } from '@/components/ui/button' import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' import { Input } from '@/components/ui/input' import { Textarea } from '@/components/ui/textarea' import { Label } from '@/components/ui/label' import { Skeleton } from '@/components/ui/skeleton' import { Separator } from '@/components/ui/separator' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select' import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog' import { ArrowLeft, Loader2, Save, Trash2, LayoutTemplate, Plus, X, GripVertical, } from 'lucide-react' import { toast } from 'sonner' const ROUND_TYPE_LABELS: Record = { FILTERING: 'Filtering', EVALUATION: 'Evaluation', LIVE_EVENT: 'Live Event', } const CRITERION_TYPES = [ { value: 'numeric', label: 'Numeric (1-10)' }, { value: 'text', label: 'Text' }, { value: 'boolean', label: 'Yes/No' }, { value: 'section_header', label: 'Section Header' }, ] type Criterion = { id: string label: string type: string description?: string weight?: number min?: number max?: number } export default function RoundTemplateDetailPage({ params, }: { params: Promise<{ id: string }> }) { const { id } = use(params) const router = useRouter() const utils = trpc.useUtils() const { data: template, isLoading } = trpc.roundTemplate.getById.useQuery({ id }) const [name, setName] = useState('') const [description, setDescription] = useState('') const [roundType, setRoundType] = useState('EVALUATION') const [criteria, setCriteria] = useState([]) const [initialized, setInitialized] = useState(false) const [deleteOpen, setDeleteOpen] = useState(false) // Initialize form state from loaded data if (template && !initialized) { setName(template.name) setDescription(template.description || '') setRoundType(template.roundType) setCriteria((template.criteriaJson as Criterion[]) || []) setInitialized(true) } const updateTemplate = trpc.roundTemplate.update.useMutation({ onSuccess: () => { utils.roundTemplate.getById.invalidate({ id }) utils.roundTemplate.list.invalidate() toast.success('Template saved') }, onError: (err) => { toast.error(err.message) }, }) const deleteTemplate = trpc.roundTemplate.delete.useMutation({ onSuccess: () => { utils.roundTemplate.list.invalidate() router.push('/admin/round-templates') toast.success('Template deleted') }, onError: (err) => { toast.error(err.message) }, }) const handleSave = () => { updateTemplate.mutate({ id, name: name.trim(), description: description.trim() || undefined, roundType: roundType as 'FILTERING' | 'EVALUATION' | 'LIVE_EVENT', criteriaJson: criteria, }) } const addCriterion = () => { setCriteria([ ...criteria, { id: `criterion_${Date.now()}`, label: '', type: 'numeric', weight: 1, min: 1, max: 10, }, ]) } const updateCriterion = (index: number, updates: Partial) => { setCriteria(criteria.map((c, i) => (i === index ? { ...c, ...updates } : c))) } const removeCriterion = (index: number) => { setCriteria(criteria.filter((_, i) => i !== index)) } if (isLoading) { return (
) } if (!template) { return (

Template not found

) } return (
{/* Header */}

{template.name}

Edit template configuration and criteria

{/* Basic Info */} Basic Information
setName(e.target.value)} placeholder="e.g., Standard Evaluation Round" />