import { AnimatePresence, LayoutGroup, motion } from "framer-motion"; import { Plus } from "lucide-react"; import { useState } from "react"; import { TaskCard } from "./TaskCard"; import { TaskSchemaModal } from "./TaskSchemaModal"; interface KanbanColumnProps { column: any; labels?: { name: string; color: string; description: string }[]; onTaskClick: (taskId: string) => void; onAgentClick?: (task: any) => void; onTaskDrop?: (taskId: string, newStatus: string) => void; boardId?: string; projectId?: string; onTaskCreated?: () => void; } const COLUMN_COLORS: Record = { todo: "#7c3aed", // Purple in_progress: "#f97316", // Orange in_review: "#ef4444", // Red / Need Review done: "#10b981", // Green / Completed cancelled: "#64748b", // Slate / Cancelled }; export function KanbanColumn({ column, labels = [], onTaskClick, onAgentClick, onTaskDrop, boardId, projectId, onTaskCreated }: KanbanColumnProps) { const dotColor = COLUMN_COLORS[column.status] ?? "#64748b"; const [isDragOver, setIsDragOver] = useState(false); return (
{ e.preventDefault(); e.dataTransfer.dropEffect = "move"; if (!isDragOver) setIsDragOver(true); }} onDragLeave={(e) => { if (!e.currentTarget.contains(e.relatedTarget as Node)) { setIsDragOver(false); } }} onDrop={(e) => { e.preventDefault(); setIsDragOver(false); const taskId = e.dataTransfer.getData("text/plain") || (window as any).__draggedTaskId; delete (window as any).__draggedTaskId; if (taskId && onTaskDrop) { onTaskDrop(taskId, column.status); } }} className={`relative min-w-0 min-h-0 flex flex-col h-full bg-surface-secondary/70 rounded-2xl border transition-all duration-150 shadow-xs overflow-hidden text-content-primary p-2.5 ${ isDragOver ? "border-accent ring-2 ring-accent/30 bg-accent/5 scale-[1.01]" : "border-border/80 hover:border-accent/40" }`} > {/* Column Header */}
{column.name} {column.tasks.length}
{boardId ? ( } /> ) : ( )}
{/* Task List */}
{column.tasks.map((task: any) => ( onTaskClick(task.id)} onAgentClick={onAgentClick} /> ))}
); }