import React from 'react' import { Plus, CheckCircle2, Clock, CircleDot, AlertCircle, Ban } from 'lucide-react' import type { Task, TaskStatus } from '../../types/task' import { TaskCard } from './TaskCard' import { calculateTaskTotalSeconds, formatSecondsToHuman } from '../../lib/timeUtils' interface TaskKanbanViewProps { tasks: Task[] onToggleTimer: (task: Task) => void onStatusChange: (task: Task, newStatus: TaskStatus) => void onEditTask: (task: Task) => void onAddTaskToStatus: (status: TaskStatus) => void activeTaskId?: number | null activeTaskSeconds?: number } interface ColumnDef { status: TaskStatus label: string icon: React.ElementType colorClass: string bgLightClass: string borderColor: string } const COLUMNS: ColumnDef[] = [ { status: 'NOT_STARTED', label: 'A Fazer', icon: CircleDot, colorClass: 'text-muted', bgLightClass: 'bg-surface-sunken', borderColor: 'border-border-soft', }, { status: 'IN_PROGRESS', label: 'Em Andamento', icon: Clock, colorClass: 'text-teal-400', bgLightClass: 'bg-teal-500/10', borderColor: 'border-teal-500/20', }, { status: 'COMPLETED', label: 'ConcluĂ­do', icon: CheckCircle2, colorClass: 'text-emerald-400', bgLightClass: 'bg-emerald-500/10', borderColor: 'border-emerald-500/20', }, { status: 'CANCELED', label: 'Cancelado', icon: Ban, colorClass: 'text-rose-400', bgLightClass: 'bg-rose-500/10', borderColor: 'border-rose-500/20', }, ] export const TaskKanbanView: React.FC = ({ tasks, onToggleTimer, onStatusChange, onEditTask, onAddTaskToStatus, activeTaskId, activeTaskSeconds, }) => { const [dragOverColumn, setDragOverColumn] = React.useState(null) const handleDragOver = (e: React.DragEvent, status: TaskStatus) => { e.preventDefault() e.dataTransfer.dropEffect = 'move' if (dragOverColumn !== status) { setDragOverColumn(status) } } const handleDragLeave = (e: React.DragEvent) => { e.preventDefault() setDragOverColumn(null) } const handleDrop = (e: React.DragEvent, targetStatus: TaskStatus) => { e.preventDefault() setDragOverColumn(null) const taskIdStr = e.dataTransfer.getData('text/plain') if (!taskIdStr) return const taskId = Number(taskIdStr) const targetTask = tasks.find((t) => t.id === taskId) if (targetTask && targetTask.status !== targetStatus) { onStatusChange(targetTask, targetStatus) } } return (
{COLUMNS.map((col) => { const columnTasks = tasks.filter((t) => t.status === col.status) const colTotalSeconds = columnTasks.reduce( (acc, t) => acc + calculateTaskTotalSeconds(t), 0 ) const Icon = col.icon const isOver = dragOverColumn === col.status return (
handleDragOver(e, col.status)} onDragLeave={handleDragLeave} onDrop={(e) => handleDrop(e, col.status)} className={`flex flex-col rounded-3xl border transition-all duration-200 min-h-[500px] bg-surface/60 backdrop-blur-md shadow-xs ${ isOver ? 'border-brand ring-2 ring-brand/30 bg-brand/5' : col.borderColor }`} > {/* Column Header */}

{col.label} {columnTasks.length}

{colTotalSeconds > 0 && ( {formatSecondsToHuman(colTotalSeconds)} investidos )}
{/* Column Body / Cards List */}
{columnTasks.map((task) => ( ))} {columnTasks.length === 0 && (

Nenhuma tarefa nesta coluna

)}
) })}
) }