From 6d1507aa8f164b186daa4c5f9cbbe04b83704ea7 Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Wed, 1 Jul 2026 10:00:14 -0700 Subject: [PATCH] FN-7380: Close task detail on delete Close task detail hosts immediately after delete confirmation. - Wire the embedded list split-detail host to clear selected task state when detail content requests close. - Keep task-detail delete close idempotent across initial delete failures and follow-up prompts. - Add regression coverage for split-detail closing and optimistic delete failure handling. - Add a patch changeset for the operator-visible delete detail behavior. Files changed: .changeset/fn-7380-task-detail-delete-close.md | 7 ++++ packages/dashboard/app/components/ListView.tsx | 15 +++++++ .../dashboard/app/components/TaskDetailModal.tsx | 4 +- .../app/components/__tests__/ListView.test.tsx | 22 ++++++++++ .../components/__tests__/TaskDetailModal.test.tsx | 49 ++++++++++++++++++++++ 5 files changed, 95 insertions(+), 2 deletions(-) Fusion-Task-Id: FN-7380 Fusion-Task-Lineage: 0b7fa676-cf89-4116-aa64-c10840b6fb07 Co-authored-by: Fusion (runfusion.ai) --- .../fn-7380-task-detail-delete-close.md | 7 +++ .../dashboard/app/components/ListView.tsx | 15 ++++++ .../app/components/TaskDetailModal.tsx | 4 +- .../components/__tests__/ListView.test.tsx | 22 +++++++++ .../__tests__/TaskDetailModal.test.tsx | 49 +++++++++++++++++++ 5 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 .changeset/fn-7380-task-detail-delete-close.md 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; }) => (
{task.id} + {(task.dependencies ?? []).map((dependencyId) => (