diff --git a/.changeset/fn-7380-task-detail-delete-close.md b/.changeset/fn-7380-task-detail-delete-close.md new file mode 100644 index 0000000000..b052526884 --- /dev/null +++ b/.changeset/fn-7380-task-detail-delete-close.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Close task details immediately after confirming task deletion. +category: fix +dev: Updates shared task-detail delete close behavior and split-detail host wiring so detail shells close before delete requests settle. diff --git a/packages/dashboard/app/components/ListView.tsx b/packages/dashboard/app/components/ListView.tsx index 19a8c438e0..fd9ab55839 100644 --- a/packages/dashboard/app/components/ListView.tsx +++ b/packages/dashboard/app/components/ListView.tsx @@ -1846,6 +1846,20 @@ export function ListView({ }; }, []); + const closeEmbeddedTaskDetail = useCallback(() => { + /* + FNXC:TaskDetailDelete 2026-07-01-09:46: + List split-detail is an embedded TaskDetailContent host, so optimistic delete close must clear the selected task synchronously and remove the persisted selection before the delete request settles. Clear any pending detail fetch so a delayed response cannot resurrect the closed split panel. + */ + detailFetchTargetRef.current = null; + if (detailFetchTimerRef.current) { + clearTimeout(detailFetchTimerRef.current); + detailFetchTimerRef.current = null; + } + setSelectedTaskId(null); + setSelectedTaskSnapshot(null); + }, []); + const handleEmbeddedOpenDetail = useCallback((nextTask: Task | TaskDetail) => { setSelectedTaskId(nextTask.id); setSelectedTaskSnapshot(nextTask); @@ -2855,6 +2869,7 @@ export function ListView({ projectId={projectId} tasks={tasks} embedded + onRequestClose={closeEmbeddedTaskDetail} onOpenDetail={handleEmbeddedOpenDetail} onMoveTask={onMoveTask} onDeleteTask={onDeleteTask} diff --git a/packages/dashboard/app/components/TaskDetailModal.tsx b/packages/dashboard/app/components/TaskDetailModal.tsx index 512919ce8b..07f35da5f1 100644 --- a/packages/dashboard/app/components/TaskDetailModal.tsx +++ b/packages/dashboard/app/components/TaskDetailModal.tsx @@ -1957,8 +1957,8 @@ export function TaskDetailContent({ return; } /* - FNXC:TaskDetailDelete 2026-06-23-10:55: - Task detail hosts must close optimistically after the operator completes every required delete prompt and before the server delete request settles. Keep async success/error toasts attached to the delete promise so conflict handling and failure reporting continue after the modal, embedded panel, or floating host is gone. + FNXC:TaskDetailDelete 2026-07-01-09:40: + Task detail hosts must close optimistically after the operator completes every required delete prompt and before each server delete request starts. Keep this helper idempotent so dependency/lineage retries preserve async prompts and toasts without reopening or repeatedly closing the modal, main panel, list split, or right-dock host. */ requestClose(); deleteCloseRequested = true; diff --git a/packages/dashboard/app/components/__tests__/ListView.test.tsx b/packages/dashboard/app/components/__tests__/ListView.test.tsx index 6e61827369..8873021931 100644 --- a/packages/dashboard/app/components/__tests__/ListView.test.tsx +++ b/packages/dashboard/app/components/__tests__/ListView.test.tsx @@ -161,12 +161,15 @@ vi.mock("../TaskDetailModal", () => ({ TaskDetailContent: ({ task, onOpenDetail, + onRequestClose, }: { task: Task | TaskDetail; onOpenDetail?: (task: Task | TaskDetail) => void; + onRequestClose?: () => void; }) => (