import { useCallback, useRef, useState } from 'react' import { Droppable } from '@hello-pangea/dnd' import type { AgentInfo } from '../types/visual' import type { KanbanColumn as KanbanColumnType, KanbanTask } from '../types/kanban' import { KanbanCard } from './KanbanCard' import { useI18n } from '../i18n' interface KanbanColumnProps { column: KanbanColumnType tasks: KanbanTask[] agents: AgentInfo[] officeMap?: Record companyMode?: boolean selectedTaskId?: string | null onCardClick: (task: KanbanTask) => void onStartTask?: (taskId: string) => void onQuickCreate?: (title: string) => void } export function KanbanColumn({ column, tasks, agents, officeMap, companyMode, selectedTaskId, onCardClick, onStartTask, onQuickCreate }: KanbanColumnProps) { const { t, translateMaybe } = useI18n() const [adding, setAdding] = useState(false) const [draft, setDraft] = useState('') const committedRef = useRef(false) const commitAdd = useCallback(() => { if (committedRef.current) return // guard: prevent double-fire from Enter + onBlur committedRef.current = true const title = draft.trim() if (title && onQuickCreate) { onQuickCreate(title) } setDraft('') setAdding(false) }, [draft, onQuickCreate]) return (
{translateMaybe('kanban.column', column.name) || column.name} {tasks.length} {onQuickCreate && ( )}
{adding && (
setDraft(e.target.value)} onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); commitAdd() } if (e.key === 'Escape') { committedRef.current = true; setDraft(''); setAdding(false) } }} onBlur={commitAdd} placeholder={t('kanban.taskTitle')} autoFocus />
)} {(provided) => (
{tasks.length === 0 && !adding && (
ยท
)} {tasks.map((task, index) => ( ))} {provided.placeholder}
)}
) }