// ======================================== // TaskListTab Component // ======================================== // Tasks tab for session detail page import { useIntl } from 'react-intl'; import { ListChecks, Loader2, Circle, CheckCircle, Code, } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/Card'; import { Badge } from '@/components/ui/Badge'; import type { SessionMetadata } from '@/types/store'; export interface TaskListTabProps { session: SessionMetadata; } // Status configuration const taskStatusConfig: Record }> = { pending: { label: 'sessionDetail.tasks.status.pending', variant: 'secondary', icon: Circle, }, in_progress: { label: 'sessionDetail.tasks.status.inProgress', variant: 'warning', icon: Loader2, }, completed: { label: 'sessionDetail.tasks.status.completed', variant: 'success', icon: CheckCircle, }, blocked: { label: 'sessionDetail.tasks.status.blocked', variant: 'destructive', icon: Circle, }, skipped: { label: 'sessionDetail.tasks.status.skipped', variant: 'default', icon: Circle, }, }; /** * TaskListTab component - Display tasks in a list format */ export function TaskListTab({ session }: TaskListTabProps) { const { formatMessage } = useIntl(); const tasks = session.tasks || []; const completed = tasks.filter((t) => t.status === 'completed').length; const inProgress = tasks.filter((t) => t.status === 'in_progress').length; const pending = tasks.filter((t) => t.status === 'pending').length; const blocked = tasks.filter((t) => t.status === 'blocked').length; return (
{/* Stats Bar */}
{completed} {formatMessage({ id: 'sessionDetail.tasks.completed' })} {inProgress} {formatMessage({ id: 'sessionDetail.tasks.inProgress' })} {pending} {formatMessage({ id: 'sessionDetail.tasks.pending' })} {blocked > 0 && ( {blocked} {formatMessage({ id: 'sessionDetail.tasks.blocked' })} )}
{/* Tasks List */} {tasks.length === 0 ? (

{formatMessage({ id: 'sessionDetail.tasks.empty.title' })}

{formatMessage({ id: 'sessionDetail.tasks.empty.message' })}

) : (
{tasks.map((task, index) => { const currentStatusConfig = task.status ? taskStatusConfig[task.status] : taskStatusConfig.pending; const StatusIcon = currentStatusConfig.icon; return (
{task.task_id} {formatMessage({ id: currentStatusConfig.label })} {task.priority && ( {task.priority} )}

{task.title || formatMessage({ id: 'sessionDetail.tasks.untitled' })}

{task.description && (

{task.description}

)} {task.depends_on && task.depends_on.length > 0 && (
Depends on: {task.depends_on.join(', ')}
)}
{task.created_at && (
{new Date(task.created_at).toLocaleDateString()}
)}
); })}
)}
); }