import { useState } from 'react'; import type { Task, User } from './data'; import { getUserById } from './data'; import { Avatar, PriorityBadge, StatusBadge } from './Shared'; interface ListProps { tasks: Task[]; currentUser: User; onTaskClick: (t: Task) => void; filterUser: string | null; searchQuery: string; onToggleDone: (taskId: string) => void; } type SortKey = 'dueDate' | 'priority' | 'status' | 'assignee'; const PRIO_ORDER = { critical: 0, high: 1, medium: 2, low: 3 }; export function ListView({ tasks, currentUser, onTaskClick, filterUser, searchQuery, onToggleDone }: ListProps) { const [sortBy, setSortBy] = useState('dueDate'); const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc'); const [menuOpen, setMenuOpen] = useState(null); let filtered = tasks; if (currentUser.role === 'employee') filtered = filtered.filter(t => t.assignee === currentUser.id); if (filterUser) filtered = filtered.filter(t => t.assignee === filterUser); if (searchQuery) filtered = filtered.filter(t => t.title.toLowerCase().includes(searchQuery.toLowerCase())); const sorted = [...filtered].sort((a, b) => { let cmp = 0; if (sortBy === 'dueDate') cmp = a.dueDate.localeCompare(b.dueDate); else if (sortBy === 'priority') cmp = PRIO_ORDER[a.priority] - PRIO_ORDER[b.priority]; else if (sortBy === 'status') cmp = a.status.localeCompare(b.status); else if (sortBy === 'assignee') cmp = a.assignee.localeCompare(b.assignee); return sortDir === 'asc' ? cmp : -cmp; }); const toggleSort = (key: SortKey) => { if (sortBy === key) setSortDir(d => d === 'asc' ? 'desc' : 'asc'); else { setSortBy(key); setSortDir('asc'); } }; return (
Sort by: {(['dueDate', 'priority', 'status', 'assignee'] as SortKey[]).map(k => ( ))}
{sorted.map(t => { const u = getUserById(t.assignee); const due = new Date(t.dueDate + 'T00:00:00'); const overdue = due < new Date() && t.status !== 'done'; return ( ); })}
TitleAssigneePriorityStatusDue DateTagsActions
onToggleDone(t.id)} /> onTaskClick(t)} style={{ cursor: 'pointer' }}>{t.title}
{u?.name}
{due.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} {t.tags.slice(0, 2).map(tag => {tag})} {t.tags.length > 2 && +{t.tags.length - 2}} {menuOpen === t.id && (
)}
); }