fix(FN-4162): keep GitHub tracking enable button mounted while saving

- Keep the inline GitHub tracking Enable button mounted during save
- Disable the button while showing the in-flight tracking status spinner
- Update dashboard tests to assert the stable mounted-button behavior
- Add a changeset for the published CLI package

Fusion-Task-Id: FN-4162
This commit is contained in:
Fusion
2026-05-13 06:27:21 -07:00
committed by gsxdsm
parent 9a64d04f29
commit d42ddf77bc
3 changed files with 10 additions and 6 deletions

View File

@@ -0,0 +1,5 @@
---
"@runfusion/fusion": patch
---
Keep the GitHub tracking Enable button mounted (and disabled) while a save is in flight so the header layout stays stable.

View File

@@ -2448,11 +2448,12 @@ export function TaskDetailContent({
</span> </span>
)} )}
</div> </div>
{showInlineGithubTrackingEnableButton && !isSavingGithubTracking && ( {showInlineGithubTrackingEnableButton && (
<button <button
type="button" type="button"
className="btn btn-sm btn-primary detail-github-tracking-enable" className="btn btn-sm btn-primary detail-github-tracking-enable"
aria-label="Enable GitHub tracking" aria-label="Enable GitHub tracking"
disabled={isSavingGithubTracking}
onClick={() => void handleToggleGithubTracking()} onClick={() => void handleToggleGithubTracking()}
> >
Enable Enable

View File

@@ -2386,7 +2386,7 @@ describe("TaskDetailModal", () => {
expect(screen.queryByRole("button", { name: "Collapse GitHub tracking details" })).toBeNull(); expect(screen.queryByRole("button", { name: "Collapse GitHub tracking details" })).toBeNull();
}); });
it("FN-4228 shows a spinner instead of the inline enable button while saving", async () => { it("FN-4228 keeps the inline enable button mounted and disabled while saving", async () => {
const { updateTask } = await import("../../api"); const { updateTask } = await import("../../api");
const mockUpdate = vi.mocked(updateTask); const mockUpdate = vi.mocked(updateTask);
let resolveUpdate: ((task: Task) => void) | undefined; let resolveUpdate: ((task: Task) => void) | undefined;
@@ -2417,9 +2417,8 @@ describe("TaskDetailModal", () => {
fireEvent.click(screen.getByRole("button", { name: "Enable GitHub tracking" })); fireEvent.click(screen.getByRole("button", { name: "Enable GitHub tracking" }));
await waitFor(() => { const enableButton = await screen.findByRole("button", { name: "Enable GitHub tracking" });
expect(screen.queryByRole("button", { name: "Enable GitHub tracking" })).toBeNull(); expect(enableButton).toBeDisabled();
});
expect(screen.getByRole("status", { name: "Enabling GitHub tracking" })).toBeInTheDocument(); expect(screen.getByRole("status", { name: "Enabling GitHub tracking" })).toBeInTheDocument();
expect(screen.getByRole("button", { name: "Expand GitHub tracking details" })).toHaveAttribute("aria-expanded", "false"); expect(screen.getByRole("button", { name: "Expand GitHub tracking details" })).toHaveAttribute("aria-expanded", "false");
@@ -2437,7 +2436,6 @@ describe("TaskDetailModal", () => {
} as Task); } as Task);
await waitFor(() => { await waitFor(() => {
expect(screen.queryByRole("button", { name: "Enable GitHub tracking" })).toBeNull();
expect(screen.queryByRole("status", { name: "Enabling GitHub tracking" })).toBeNull(); expect(screen.queryByRole("status", { name: "Enabling GitHub tracking" })).toBeNull();
}); });
}); });