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:
@@ -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 && (
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user