'use client'; // File: components/review-task/ReviewTaskInbox.tsx // Review Task inbox พร้อม aggregate status indicator (T071) import React, { useState } from 'react'; import { Clock, CheckCircle2, AlertTriangle, ArrowRightLeft, Users } from 'lucide-react'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Progress } from '@/components/ui/progress'; import { DelegatedBadge } from '@/components/review-task/DelegatedBadge'; type ReviewTaskStatus = 'PENDING' | 'IN_PROGRESS' | 'COMPLETED' | 'DELEGATED' | 'EXPIRED' | 'CANCELLED'; interface ReviewTaskItem { publicId: string; status: ReviewTaskStatus; discipline?: { name: string }; assignedToUser?: { publicId: string; fullName?: string; email?: string }; delegatedFromUser?: { publicId: string; fullName?: string; email?: string }; dueDate?: string; rfaNumber?: string; documentTitle?: string; } interface AggregateStatus { total: number; completed: number; pending: number; completionPct: number; isAllComplete: boolean; hasExpired: boolean; } interface ReviewTaskInboxProps { tasks: ReviewTaskItem[]; aggregateStatus?: AggregateStatus; onStartTask: (taskPublicId: string) => void; onCompleteTask: (taskPublicId: string) => void; isLoading?: boolean; } const STATUS_CONFIG: Record = { PENDING: { label: 'Pending', variant: 'outline' }, IN_PROGRESS: { label: 'In Progress', variant: 'secondary' }, COMPLETED: { label: 'Completed', variant: 'default' }, DELEGATED: { label: 'Delegated', variant: 'secondary' }, EXPIRED: { label: 'Expired', variant: 'destructive' }, CANCELLED: { label: 'Cancelled', variant: 'outline' }, }; export function ReviewTaskInbox({ tasks, aggregateStatus, onStartTask, onCompleteTask, isLoading, }: ReviewTaskInboxProps) { const [filter, setFilter] = useState('ALL'); const filtered = filter === 'ALL' ? tasks : tasks.filter((t) => t.status === filter); return (
{aggregateStatus && (
Parallel Review Progress {aggregateStatus.completionPct}%
{aggregateStatus.completed}/{aggregateStatus.total} tasks complete {aggregateStatus.isAllComplete && ( All Complete )} {aggregateStatus.hasExpired && ( Has Expired )}
)}
{(['ALL', 'PENDING', 'IN_PROGRESS', 'COMPLETED'] as const).map((s) => ( ))}
{filtered.map((task) => { const config = STATUS_CONFIG[task.status]; const isOverdue = task.dueDate && new Date(task.dueDate) < new Date() && task.status !== 'COMPLETED'; return (
{task.rfaNumber ?? task.publicId} {config.label} {task.delegatedFromUser && ( )} {isOverdue && ( Overdue )}
{task.documentTitle && (

{task.documentTitle}

)}
{task.discipline && {task.discipline.name}} {task.dueDate && ( {new Date(task.dueDate).toLocaleDateString('th-TH')} )}
{task.status === 'PENDING' && ( )} {task.status === 'IN_PROGRESS' && ( )} {task.status === 'COMPLETED' && ( )} {task.status === 'DELEGATED' && ( )}
); })} {filtered.length === 0 && (
No review tasks found.
)}
); }