import { useState, useEffect } from 'react'; import { useAuth } from '@/contexts/AuthContext'; import { supabase } from '@/integrations/supabase/client'; import { useToast } from '@/hooks/use-toast'; import { Download, Filter, Search, Check, X } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from '@/components/ui/card'; import { TaskCard } from '@/components/TaskCard'; import { ExportOptions } from '@/components/ExportOptions'; interface Task { id: string; task_name: string; description: string; priority: string; due_date: string | null; status: string; created_at: string; upload_id: string; } interface Upload { id: string; file_name: string; } const TaskList = () => { const { user } = useAuth(); const { toast } = useToast(); const [tasks, setTasks] = useState([]); const [filteredTasks, setFilteredTasks] = useState([]); const [uploads, setUploads] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(''); const [priorityFilter, setPriorityFilter] = useState(''); const [statusFilter, setStatusFilter] = useState(''); const [documentFilter, setDocumentFilter] = useState(''); const [viewMode, setViewMode] = useState<'table' | 'card'>('table'); useEffect(() => { if (user) { fetchTasks(); fetchUploads(); } }, [user]); useEffect(() => { applyFilters(); }, [tasks, searchTerm, priorityFilter, statusFilter, documentFilter]); const fetchTasks = async () => { try { setLoading(true); const { data, error } = await supabase .from('tasks') .select('*') .eq('user_id', user?.id) .order('created_at', { ascending: false }); if (error) throw error; setTasks(data || []); setFilteredTasks(data || []); } catch (error) { console.error('Error fetching tasks:', error); toast({ title: 'Error', description: 'Failed to load tasks', variant: 'destructive', }); } finally { setLoading(false); } }; const fetchUploads = async () => { try { const { data, error } = await supabase .from('uploads') .select('id, file_name') .eq('user_id', user?.id); if (error) throw error; setUploads(data || []); } catch (error) { console.error('Error fetching uploads:', error); } }; const applyFilters = () => { let result = [...tasks]; // Apply search term filter if (searchTerm) { result = result.filter( task => task.task_name.toLowerCase().includes(searchTerm.toLowerCase()) || task.description.toLowerCase().includes(searchTerm.toLowerCase()) ); } // Apply priority filter if (priorityFilter) { result = result.filter(task => task.priority === priorityFilter); } // Apply status filter if (statusFilter) { result = result.filter(task => task.status === statusFilter); } // Apply document filter if (documentFilter) { result = result.filter(task => task.upload_id === documentFilter); } setFilteredTasks(result); }; const updateTaskStatus = async (taskId: string, newStatus: string) => { try { const { error } = await supabase .from('tasks') .update({ status: newStatus }) .eq('id', taskId); if (error) throw error; setTasks(prevTasks => prevTasks.map(task => task.id === taskId ? { ...task, status: newStatus } : task ) ); toast({ title: 'Task updated', description: `Task status changed to ${newStatus}`, }); } catch (error) { console.error('Error updating task:', error); toast({ title: 'Update failed', description: 'Failed to update task status', variant: 'destructive', }); } }; const getDocumentName = (uploadId: string) => { const upload = uploads.find(u => u.id === uploadId); return upload ? upload.file_name : 'Unknown Document'; }; const getPriorityBadge = (priority: string) => { switch (priority.toLowerCase()) { case 'high': return {priority}; case 'medium': return {priority}; case 'low': return {priority}; default: return {priority}; } }; const getStatusBadge = (status: string) => { switch (status.toLowerCase()) { case 'completed': return {status}; case 'in progress': return {status}; case 'open': return {status}; default: return {status}; } }; const clearFilters = () => { setSearchTerm(''); setPriorityFilter(''); setStatusFilter(''); setDocumentFilter(''); }; if (loading) { return (

Loading tasks...

); } return (
Tasks Actionable items extracted from your policy documents
setSearchTerm(e.target.value)} />
{(searchTerm || priorityFilter || statusFilter || documentFilter) && ( )}
{filteredTasks.length === 0 ? (

No tasks found

{tasks.length > 0 ? 'Try changing your filters or search term' : 'Upload a policy document to extract tasks'}

{tasks.length === 0 && ( )}
) : viewMode === 'table' ? (
Task Priority Status Document Actions {filteredTasks.map((task) => ( {task.task_name} {getPriorityBadge(task.priority)} {getStatusBadge(task.status)} {getDocumentName(task.upload_id)}
{task.status !== 'Completed' ? ( ) : ( )}
))}
) : (
{filteredTasks.map((task) => ( updateTaskStatus(task.id, newStatus)} /> ))}
)}
Showing {filteredTasks.length} of {tasks.length} tasks
); }; export default TaskList;