diff --git a/frontend/src/components/tasks/TaskDetailsPanel.tsx b/frontend/src/components/tasks/TaskDetailsPanel.tsx index 8ebfb767..cd54e1ba 100644 --- a/frontend/src/components/tasks/TaskDetailsPanel.tsx +++ b/frontend/src/components/tasks/TaskDetailsPanel.tsx @@ -64,6 +64,7 @@ interface TaskDetailsPanelProps { onClose: () => void; onEditTask?: (task: TaskWithAttemptStatus) => void; onDeleteTask?: (taskId: string) => void; + isDialogOpen?: boolean; // New prop to indicate if any dialog is open } const statusLabels: Record = { @@ -141,6 +142,7 @@ export function TaskDetailsPanel({ onClose, onEditTask, onDeleteTask, + isDialogOpen = false, }: TaskDetailsPanelProps) { const [taskAttempts, setTaskAttempts] = useState([]); const [selectedAttempt, setSelectedAttempt] = useState( @@ -187,7 +189,7 @@ export function TaskDetailsPanel({ // Handle ESC key locally to prevent global navigation useEffect(() => { - if (!isOpen) return; + if (!isOpen || isDialogOpen) return; // Don't handle ESC if dialog is open const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "Escape") { @@ -199,7 +201,7 @@ export function TaskDetailsPanel({ document.addEventListener("keydown", handleKeyDown, true); // Use capture phase return () => document.removeEventListener("keydown", handleKeyDown, true); - }, [isOpen, onClose]); + }, [isOpen, onClose, isDialogOpen]); // Available executors const availableExecutors = [ diff --git a/frontend/src/pages/project-tasks.tsx b/frontend/src/pages/project-tasks.tsx index cd8f45a5..41f064b0 100644 --- a/frontend/src/pages/project-tasks.tsx +++ b/frontend/src/pages/project-tasks.tsx @@ -404,6 +404,7 @@ export function ProjectTasks() { onClose={handleClosePanel} onEditTask={handleEditTask} onDeleteTask={handleDeleteTask} + isDialogOpen={isTaskDialogOpen || isProjectSettingsOpen} /> )}