import { useState } from 'react'; import { Card } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { LayoutGrid, Calendar as CalendarIcon, ChevronLeft, ChevronRight } from 'lucide-react'; import { Task } from './TaskCard'; import TaskCard from './TaskCard'; import { format, startOfWeek, endOfWeek, startOfMonth, endOfMonth, addWeeks, addMonths, isWithinInterval } from 'date-fns'; interface KanbanBoardProps { tasks: Task[]; onTaskStatusChange?: (taskId: string, newStatus: Task['status']) => void; onTaskUpdate?: (taskId: string, updates: Partial) => void; } type ViewMode = 'traditional' | 'weekly' | 'monthly'; export default function KanbanBoard({ tasks, onTaskStatusChange, onTaskUpdate }: KanbanBoardProps) { const [viewMode, setViewMode] = useState('traditional'); const [currentDate, setCurrentDate] = useState(new Date()); const [draggedTask, setDraggedTask] = useState(null); const columns = [ { id: 'todo', title: 'To Do', status: 'todo' as const }, { id: 'inProgress', title: 'In Progress', status: 'inProgress' as const }, { id: 'done', title: 'Done', status: 'done' as const } ]; const getTasksForColumn = (status: Task['status']) => { let filteredTasks = tasks.filter(task => task.status === status); if (viewMode === 'weekly') { const weekStart = startOfWeek(currentDate); const weekEnd = endOfWeek(currentDate); filteredTasks = filteredTasks.filter(task => task.dueDate && isWithinInterval(task.dueDate, { start: weekStart, end: weekEnd }) ); } else if (viewMode === 'monthly') { const monthStart = startOfMonth(currentDate); const monthEnd = endOfMonth(currentDate); filteredTasks = filteredTasks.filter(task => task.dueDate && isWithinInterval(task.dueDate, { start: monthStart, end: monthEnd }) ); } return filteredTasks; }; const handleDragStart = (taskId: string) => { setDraggedTask(taskId); }; const handleDragEnd = () => { setDraggedTask(null); }; const handleDrop = (status: Task['status']) => { if (draggedTask) { onTaskStatusChange?.(draggedTask, status); console.log(`Task ${draggedTask} moved to ${status}`); setDraggedTask(null); } }; const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); }; const navigatePeriod = (direction: 'prev' | 'next') => { if (viewMode === 'weekly') { setCurrentDate(addWeeks(currentDate, direction === 'next' ? 1 : -1)); } else if (viewMode === 'monthly') { setCurrentDate(addMonths(currentDate, direction === 'next' ? 1 : -1)); } }; const getPeriodTitle = () => { if (viewMode === 'weekly') { return `Week of ${format(startOfWeek(currentDate), 'MMM d')}`; } else if (viewMode === 'monthly') { return format(currentDate, 'MMMM yyyy'); } return 'All Tasks'; }; return (
{/* Header */}

Task Board

{viewMode !== 'traditional' && (
{getPeriodTitle()}
)}
{/* View Mode Tabs */} setViewMode(value as ViewMode)}> Traditional Weekly Monthly {/* Kanban Columns */}
{columns.map((column) => { const columnTasks = getTasksForColumn(column.status); return ( handleDrop(column.status)} data-testid={`column-${column.id}`} >

{column.title}

{columnTasks.length}
{columnTasks.map((task) => (
handleDragStart(task.id)} onDragEnd={handleDragEnd} className={`cursor-move ${draggedTask === task.id ? 'opacity-50' : ''}`} > { onTaskUpdate?.(task.id, { isTracking: true }); console.log(`Timer started for ${task.title}`); }} onPause={() => { onTaskUpdate?.(task.id, { isTracking: false }); console.log(`Timer paused for ${task.title}`); }} onEdit={() => { console.log(`Edit task ${task.title}`); }} isDragging={draggedTask === task.id} />
))} {columnTasks.length === 0 && (
No tasks in {column.title.toLowerCase()}
)}
); })}
); }