/** * @file dashboard/KanbanColumn.tsx * @description Client component rendering a single kanban column container supporting drag-and-drop drop targets, dynamic status updates, and task lists. */ "use client"; import { useState } from "react"; import { Plus } from "lucide-react"; import KanbanCard from "./KanbanCard"; import { KanbanColumnProps, TaskStatus } from "@/types/tasks"; /** * Renders an individual kanban column with an indicator, title, item counter, * add-task button, and drag-and-drop target zone containing its associated task cards. * * @param {KanbanColumnProps} props - The component props containing column configurations, tasks, and event callbacks. * @returns {JSX.Element} The rendered kanban column component. */ export default function KanbanColumn(props: KanbanColumnProps) { const [isDraggingOver, setIsDraggingOver] = useState(false); const indicatorColor = props.color ?? "bg-primary"; /** * Handles the drag-over event to allow items to be dropped into the column. * * @param {React.DragEvent} e - The drag event object. */ const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); e.dataTransfer.dropEffect = "move"; setIsDraggingOver(true); }; /** * Resets the drag-over state when the dragged element leaves the column boundary. */ const handleDragLeave = () => { setIsDraggingOver(false); }; /** * Handles dropping a task card onto the column, extracting task metadata and triggering the move action. * * @param {React.DragEvent} e - The drop event object. */ const handleDrop = (e: React.DragEvent) => { e.preventDefault(); setIsDraggingOver(false); const taskId = e.dataTransfer.getData("text/plain"); const sourceStatus = e.dataTransfer.getData("sourceStatus") as TaskStatus; if (!taskId || sourceStatus === props.id) return; props.onTaskMove?.(taskId, props.id); }; return (
{/* Column Header */}

{props.title}

{props.count}
{/* Card List */}
{props.tasks.length === 0 ? (
No tasks
) : ( props.tasks.map((task) => ( )) )}
); }