import React, { useState, useEffect } from 'react'; interface Task { id: string; name: string; status: string; priority: string; assignee: string; due_date: string; tags: string[]; } type SortKey = 'name' | 'status' | 'priority' | 'due_date'; export default function App() { const [tasks, setTasks] = useState([]); const [sortKey, setSortKey] = useState('due_date'); const [sortAsc, setSortAsc] = useState(true); const [filterStatus, setFilterStatus] = useState('all'); const [filterPriority, setFilterPriority] = useState('all'); const [searchTerm, setSearchTerm] = useState(''); const [loading, setLoading] = useState(true); useEffect(() => { // Mock data setTimeout(() => { setTasks([ { id: '1', name: 'Complete project proposal', status: 'in progress', priority: 'high', assignee: 'John Doe', due_date: '2024-02-15', tags: ['design', 'planning'] }, { id: '2', name: 'Review design mockups', status: 'open', priority: 'medium', assignee: 'Jane Smith', due_date: '2024-02-14', tags: ['design'] }, { id: '3', name: 'Update documentation', status: 'closed', priority: 'low', assignee: 'Bob Johnson', due_date: '2024-02-10', tags: ['docs'] }, { id: '4', name: 'Fix critical bug', status: 'in progress', priority: 'urgent', assignee: 'Alice Williams', due_date: '2024-02-12', tags: ['bug', 'urgent'] }, { id: '5', name: 'Team meeting prep', status: 'open', priority: 'medium', assignee: 'John Doe', due_date: '2024-02-16', tags: ['meeting'] }, { id: '6', name: 'Refactor API endpoints', status: 'in progress', priority: 'high', assignee: 'Jane Smith', due_date: '2024-02-18', tags: ['backend', 'refactor'] }, { id: '7', name: 'Write unit tests', status: 'open', priority: 'medium', assignee: 'Bob Johnson', due_date: '2024-02-20', tags: ['testing'] }, ]); setLoading(false); }, 500); }, []); const handleSort = (key: SortKey) => { if (sortKey === key) { setSortAsc(!sortAsc); } else { setSortKey(key); setSortAsc(true); } }; const filteredTasks = tasks.filter(task => { if (filterStatus !== 'all' && task.status !== filterStatus) return false; if (filterPriority !== 'all' && task.priority !== filterPriority) return false; if (searchTerm && !task.name.toLowerCase().includes(searchTerm.toLowerCase())) return false; return true; }); const sortedTasks = [...filteredTasks].sort((a, b) => { let aVal = a[sortKey]; let bVal = b[sortKey]; if (sortKey === 'due_date') { aVal = new Date(a.due_date).getTime(); bVal = new Date(b.due_date).getTime(); } if (aVal < bVal) return sortAsc ? -1 : 1; if (aVal > bVal) return sortAsc ? 1 : -1; return 0; }); if (loading) { return
Loading tasks...
; } return (

📋 Task Grid

Sortable and filterable task list

setSearchTerm(e.target.value)} className="search-input" />
{sortedTasks.map(task => ( ))}
handleSort('name')} className="sortable"> Task Name {sortKey === 'name' && (sortAsc ? '↑' : '↓')} handleSort('status')} className="sortable"> Status {sortKey === 'status' && (sortAsc ? '↑' : '↓')} handleSort('priority')} className="sortable"> Priority {sortKey === 'priority' && (sortAsc ? '↑' : '↓')} Assignee handleSort('due_date')} className="sortable"> Due Date {sortKey === 'due_date' && (sortAsc ? '↑' : '↓')} Tags
{task.name} {task.status} {task.priority} {task.assignee} {task.due_date} {task.tags.map(tag => {tag})}
{sortedTasks.length === 0 && (
No tasks match your filters
)}
); }