import React, { useState } from 'react'; import type { KanbanColumnWithCards, KanbanCard } from '../../types'; import KanbanCardComponent from './KanbanCard'; interface KanbanColumnProps { column: KanbanColumnWithCards; onUpdateColumn: (columnId: number, updates: Partial) => void; onDeleteColumn: (columnId: number) => void; onCreateCard: (columnId: number) => void; onDeleteCard: (cardId: number) => void; onMoveCard: (cardId: number, targetColumnId: number, newPosition: number) => void; onCardClick: (card: KanbanCard) => void; } const KanbanColumn: React.FC = ({ column, onUpdateColumn, onDeleteColumn, onCreateCard, onDeleteCard, onMoveCard, onCardClick }) => { const [isEditing, setIsEditing] = useState(false); const [editName, setEditName] = useState(column.name); const [draggedOver, setDraggedOver] = useState(false); const handleSaveName = () => { const defaultColumns = ['ToDo', 'In Progress', 'Waiting', 'Done']; if (defaultColumns.includes(column.name)) { // Prevent renaming default columns setEditName(column.name); setIsEditing(false); return; } if (editName.trim() && editName !== column.name) { onUpdateColumn(column.id, { name: editName.trim() }); } setIsEditing(false); }; const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter') { handleSaveName(); } else if (e.key === 'Escape') { setEditName(column.name); setIsEditing(false); } }; const handleDragOver = (e: React.DragEvent) => { e.preventDefault(); setDraggedOver(true); }; const handleDragLeave = () => { setDraggedOver(false); }; const handleDrop = (e: React.DragEvent) => { e.preventDefault(); setDraggedOver(false); const cardId = parseInt(e.dataTransfer.getData('cardId')); const sourceColumnId = parseInt(e.dataTransfer.getData('sourceColumnId')); if (sourceColumnId === column.id) return; // Same column, ignore // Find the position to drop at const rect = e.currentTarget.getBoundingClientRect(); const y = e.clientY - rect.top; const cardHeight = 120; // Approximate card height const position = Math.floor(y / cardHeight); onMoveCard(cardId, column.id, Math.min(position, column.cards.length)); }; const getColumnColor = () => { if (column.color) { return column.color; } // Default colors based on position const colors = ['#3B82F6', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6', '#06B6D4']; return colors[column.position % colors.length]; }; return (
{/* Column Header */}
{isEditing ? ( setEditName(e.target.value)} onBlur={handleSaveName} onKeyDown={handleKeyPress} className="px-2 py-1 text-sm font-medium bg-white dark:bg-gray-700 border rounded" autoFocus /> ) : (

{ const defaultColumns = ['ToDo', 'In Progress', 'Waiting', 'Done']; return !defaultColumns.includes(column.name) ? 'cursor-pointer hover:text-blue-600' : ''; })() }`} onClick={() => { const defaultColumns = ['ToDo', 'In Progress', 'Waiting', 'Done']; if (!defaultColumns.includes(column.name)) { setIsEditing(true); } }} > {column.name}

)} {column.cards.length}
{(() => { const defaultColumns = ['ToDo', 'In Progress', 'Waiting', 'Done']; return !defaultColumns.includes(column.name) && ( ); })()}
{/* Cards */}
{column.cards.map((card) => ( onCardClick(card)} onDelete={onDeleteCard} sourceColumnId={column.id} /> ))}
{/* Add Card Button */}
); }; export default KanbanColumn;