feat(FN-4592): complete Step 4 — enable userPaused unpause in detail modal

Fusion-Task-Id: FN-4592
Fusion-Task-Lineage: b013a15e-7cd9-4ba4-b380-22627cefb394
This commit is contained in:
Fusion
2026-05-15 06:27:12 -07:00
committed by gsxdsm
parent 7ca0e10b11
commit ff05d5572b
2 changed files with 31 additions and 4 deletions

View File

@@ -1523,9 +1523,11 @@ export function TaskDetailContent({
}
}, [task.id, onDuplicateTask, requestClose, addToast, confirm]);
const isTaskPaused = task.paused || task.userPaused;
const handleTogglePause = useCallback(async () => {
try {
if (task.paused) {
if (isTaskPaused) {
await unpauseTask(task.id, projectId);
addToast(`Unpaused ${task.id}`, "success");
} else {
@@ -1536,7 +1538,7 @@ export function TaskDetailContent({
} catch (err) {
addToast(getErrorMessage(err), "error");
}
}, [task.id, task.paused, requestClose, addToast]);
}, [isTaskPaused, task.id, requestClose, addToast]);
const handleApprovePlan = useCallback(async () => {
try {
@@ -3341,7 +3343,7 @@ export function TaskDetailContent({
)}
{/* Actions dropdown — less common operations */}
{(task.column !== "triage" || task.status === "awaiting-approval" || canRetryTask || task.paused) && (
{(task.column !== "triage" || task.status === "awaiting-approval" || canRetryTask || isTaskPaused) && (
<div className="detail-actions-dropdown" ref={actionsMenuRef}>
<button
className="btn btn-sm"
@@ -3426,7 +3428,7 @@ export function TaskDetailContent({
role="menuitem"
onClick={() => handleActionsMenuItemClick(handleTogglePause)}
>
{task.paused ? "Unpause" : "Pause"}
{isTaskPaused ? "Unpause" : "Pause"}
</button>
)}
{task.column !== "done" && task.paused && task.pausedByAgentId && (

View File

@@ -880,6 +880,31 @@ describe("TaskDetailModal", () => {
expect(screen.getByRole("menuitem", { name: "Unpause" })).toBeTruthy();
});
it("renders Unpause for userPaused-only tasks and unpauses once", async () => {
const { unpauseTask } = await import("../../api");
const mockUnpauseTask = vi.mocked(unpauseTask);
render(
<TaskDetailModal
task={makeTask({ id: "FN-001", column: "todo", paused: undefined, userPaused: true })}
onClose={noop}
onMoveTask={noopMove}
onDeleteTask={noopDelete}
onMergeTask={noopMerge}
onOpenDetail={noopOpenDetail}
addToast={noop}
/>,
);
await userEvent.click(screen.getByRole("button", { name: /actions/i }));
await userEvent.click(screen.getByRole("menuitem", { name: "Unpause" }));
await waitFor(() => {
expect(mockUnpauseTask).toHaveBeenCalledTimes(1);
expect(mockUnpauseTask).toHaveBeenCalledWith("FN-001", undefined);
});
});
it("hides Pause/Unpause button for agent-assigned tasks", async () => {
const { fetchAgent } = await import("../../api");
const mockFetchAgent = vi.mocked(fetchAgent);