diff --git a/frontend/components/Task/TaskHeader.tsx b/frontend/components/Task/TaskHeader.tsx index a63ca2f..4b6e6b3 100644 --- a/frontend/components/Task/TaskHeader.tsx +++ b/frontend/components/Task/TaskHeader.tsx @@ -34,6 +34,7 @@ interface TaskHeaderProps { onEdit?: (e: React.MouseEvent) => void; onDelete?: (e: React.MouseEvent) => void; isUpcomingView?: boolean; + onMenuOpenChange?: (isOpen: boolean) => void; } const TaskHeader: React.FC = ({ @@ -51,6 +52,7 @@ const TaskHeader: React.FC = ({ onEdit: _onEdit, onDelete: _onDelete, isUpcomingView = false, + onMenuOpenChange, }) => { const { t } = useTranslation(); void _onToggleToday; @@ -454,6 +456,7 @@ const TaskHeader: React.FC = ({ onTaskUpdate={onTaskUpdate} showMobileVariant={false} className="" + onMenuOpenChange={onMenuOpenChange} /> )} @@ -632,6 +635,7 @@ const TaskHeader: React.FC = ({ onTaskUpdate={onTaskUpdate} hoverRevealQuickActions={false} showMobileVariant={false} + onMenuOpenChange={onMenuOpenChange} /> )} diff --git a/frontend/components/Task/TaskItem.tsx b/frontend/components/Task/TaskItem.tsx index 5a0a326..df4c4ae 100644 --- a/frontend/components/Task/TaskItem.tsx +++ b/frontend/components/Task/TaskItem.tsx @@ -67,7 +67,7 @@ const SubtasksDisplay: React.FC = ({ } return ( -
+
{subtasks.map((subtask) => { const borderClass = isTaskCompleted(subtask.status) ? 'border-l-4 border-l-green-500' @@ -176,6 +176,9 @@ const TaskItem: React.FC = ({ const { showErrorToast } = useToast(); const [isAnimatingOut, setIsAnimatingOut] = useState(false); + // Status menu state + const [isStatusMenuOpen, setIsStatusMenuOpen] = useState(false); + // Subtasks state const [subtasks, setSubtasks] = useState([]); const [loadingSubtasks, setLoadingSubtasks] = useState(false); @@ -373,7 +376,7 @@ const TaskItem: React.FC = ({ : getPriorityBorderClassName(task.priority); return ( - <> +
= ({ onEdit={handleEdit} onDelete={handleDeleteClick} isUpcomingView={isUpcomingView} + onMenuOpenChange={setIsStatusMenuOpen} /> {/* Progress bar at bottom of parent task */} @@ -450,7 +454,7 @@ const TaskItem: React.FC = ({ onCancel={() => setIsConfirmDialogOpen(false)} /> )} - +
); }; diff --git a/frontend/components/Task/TaskStatusControl.tsx b/frontend/components/Task/TaskStatusControl.tsx index e757b24..775edc9 100644 --- a/frontend/components/Task/TaskStatusControl.tsx +++ b/frontend/components/Task/TaskStatusControl.tsx @@ -32,6 +32,7 @@ interface TaskStatusControlProps { className?: string; variant?: 'pill' | 'square'; showQuickActions?: boolean; + onMenuOpenChange?: (isOpen: boolean) => void; } const quickStartStatuses = new Set([ @@ -50,10 +51,15 @@ const TaskStatusControl: React.FC = ({ className = '', variant = 'square', showQuickActions = true, + onMenuOpenChange, }) => { const { t } = useTranslation(); const [completionMenuOpen, setCompletionMenuOpen] = useState(null); + + useEffect(() => { + onMenuOpenChange?.(completionMenuOpen !== null); + }, [completionMenuOpen, onMenuOpenChange]); const [isCompletingTask, setIsCompletingTask] = useState(false); const desktopCompletionMenuRef = useRef(null); const mobileCompletionMenuRef = useRef(null);