// Task drawer: edit details, subtasks, tags, priority, due date, description. const TDIcons = window.Icons; const { taskProgress: tdProgress, uid: tdUid } = window.PMStore; const { Priority: TDPriority, Tag: TDTag, Checkbox: TDCheckbox, ProgressBar: TDProgress, STATUS_META: TD_STATUS, PRIORITY_META: TD_PRIO } = window.UI; function TaskDrawer({ task, state, onClose, onUpdate, onDelete, onAddSubtask, onUpdateSubtask, onRemoveSubtask }) { const [newSubtask, setNewSubtask] = React.useState(''); const subtaskInputRef = React.useRef(null); React.useEffect(() => { const onEsc = (e) => { if (e.key === 'Escape') onClose(); }; window.addEventListener('keydown', onEsc); return () => window.removeEventListener('keydown', onEsc); }, [onClose]); if (!task) return null; const project = state.projects.find(p => p.id === task.projectId); const tagById = Object.fromEntries(state.tags.map(t => [t.id, t])); const pct = tdProgress(task); const handleAddSubtask = () => { const v = newSubtask.trim(); if (!v) return; onAddSubtask(task.id, v); setNewSubtask(''); setTimeout(() => subtaskInputRef.current?.focus(), 30); }; const toggleTag = (tagId) => { const has = task.tags.includes(tagId); onUpdate(task.id, { tags: has ? task.tags.filter(t => t !== tagId) : [...task.tags, tagId] }); }; return (