'use client'; import { useState, useEffect } from 'react'; import { format } from 'date-fns'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Skeleton } from '@/components/ui/skeleton'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Task, TaskStatus, Priority } from '@/lib/types/autotask'; import { useApi } from '@/lib/hooks/use-api'; import { ChevronRight, AlertCircle, Clock, CheckCircle, ListTodo } from 'lucide-react'; interface TaskListProps { resourceId?: number; projectId?: number; } export function TaskList({ resourceId, projectId }: TaskListProps) { const [statusLabels, setStatusLabels] = useState>({}); let url = '/api/tasks'; if (resourceId) url += `?resourceId=${resourceId}`; else if (projectId) url += `?projectId=${projectId}`; const { data, loading, error, refetch } = useApi<{ tasks: Task[] }>(url); // Fetch picklist values for status useEffect(() => { fetch('/api/picklists?entity=Tasks&field=status') .then(res => res.json()) .then(data => setStatusLabels(data.picklistValues || {})) .catch(console.error); }, []); const getStatusBadge = (status: number) => { const label = statusLabels[status] || `Status ${status}`; let variant: 'default' | 'secondary' | 'destructive' | 'outline' = 'default'; let icon = null; switch (status) { case TaskStatus.New: variant = 'destructive'; icon = ; break; case TaskStatus.InProgress: variant = 'default'; icon = ; break; case TaskStatus.Complete: variant = 'secondary'; icon = ; break; default: variant = 'outline'; } return ( {icon} {label} ); }; const getPriorityBadge = (priority: number) => { let variant: 'default' | 'secondary' | 'destructive' | 'outline' = 'default'; let label = 'Normal'; switch (priority) { case Priority.Critical: variant = 'destructive'; label = 'Critical'; break; case Priority.High: variant = 'default'; label = 'High'; break; case Priority.Medium: variant = 'secondary'; label = 'Medium'; break; case Priority.Low: variant = 'outline'; label = 'Low'; break; } return {label}; }; if (loading) { return ( Tasks
{[1, 2, 3].map(i => ( ))}
); } if (error) { return ( Tasks
Error loading tasks: {error}
); } const tasks = data?.tasks || []; return (
Tasks {tasks.length}
{tasks.length === 0 ? (
No tasks found
) : ( Title Status Priority Progress Created Due {tasks.map((task) => ( {task.title} {getStatusBadge(task.status)} {getPriorityBadge(task.priority)}
{task.percentComplete || 0}%
{format(new Date(task.createDateTime), 'MMM d, yyyy')} {task.endDateTime ? format(new Date(task.endDateTime), 'MMM d, yyyy') : '-'} ))}
)}
); }