import { format, isPast, parseISO } from 'date-fns'; import { ChevronRight, GripVertical } from 'lucide-react'; import type { ProjectTask } from '@/types'; import { Checkbox } from '@/components/ui/checkbox'; import { Badge } from '@/components/ui/badge'; import { AssigneeAvatars } from './AssignmentPicker'; const taskStatusColors: Record = { pending: 'bg-gray-500/10 text-gray-400 border-gray-500/20', in_progress: 'bg-blue-500/10 text-blue-400 border-blue-500/20', completed: 'bg-green-500/10 text-green-400 border-green-500/20', blocked: 'bg-red-500/10 text-red-400 border-red-500/20', review: 'bg-yellow-500/10 text-yellow-400 border-yellow-500/20', on_hold: 'bg-orange-500/10 text-orange-400 border-orange-500/20', }; const priorityColors: Record = { none: 'bg-gray-500/20 text-gray-400', low: 'bg-green-500/20 text-green-400', medium: 'bg-yellow-500/20 text-yellow-400', high: 'bg-red-500/20 text-red-400', }; interface TaskRowProps { task: ProjectTask; isSelected: boolean; isExpanded: boolean; showDragHandle: boolean; onSelect: () => void; onToggleExpand: () => void; onToggleStatus: () => void; togglePending: boolean; dragHandleProps?: Record; } export default function TaskRow({ task, isSelected, isExpanded, showDragHandle, onSelect, onToggleExpand, onToggleStatus, togglePending, dragHandleProps, }: TaskRowProps) { const hasSubtasks = task.subtasks && task.subtasks.length > 0; const completedSubtasks = hasSubtasks ? task.subtasks.filter((s) => s.status === 'completed').length : 0; const isOverdue = task.due_date && task.status !== 'completed' && isPast(parseISO(task.due_date)); return (
{/* Drag handle */} {showDragHandle && (
e.stopPropagation()} >
)} {/* Expand chevron */} {/* Checkbox */}
e.stopPropagation()} className="shrink-0">
{/* Title */} {task.title} {/* Metadata columns */} {/* Assignee avatars */} {task.assignments && task.assignments.length > 0 && ( )} {/* Mobile-only: compact priority dot + overdue indicator */}
{isOverdue && {task.due_date ? format(parseISO(task.due_date), 'M/d') : ''}}
{/* Subtask progress bar */} {hasSubtasks && (
)}
); }