feat(FN-4805): merge fusion/fn-4805

This commit is contained in:
gsxdsm
2026-05-16 16:03:09 -07:00
parent 2f2fdd5e42
commit 4180816e01
3 changed files with 64 additions and 14 deletions

View File

@@ -511,7 +511,9 @@ export function QuickEntryBox({ onCreate, addToast, tasks = [], availableModels,
planningModelProvider: hasPlanningOverride ? planningProvider : undefined,
planningModelId: hasPlanningOverride ? planningModelId : undefined,
...(isFastMode ? { executionMode: "fast" } : {}),
githubTracking: githubTrackingOverride !== null ? { enabled: githubTrackingOverride } : undefined,
githubTracking: settings?.githubTrackingEnabledByDefault === true
? (githubTrackingOverride !== null ? { enabled: githubTrackingOverride } : undefined)
: undefined,
priority,
nodeId,
});
@@ -560,6 +562,7 @@ export function QuickEntryBox({ onCreate, addToast, tasks = [], availableModels,
resetForm,
isFastMode,
githubTrackingOverride,
settings,
priority,
nodeId,
]);
@@ -1331,10 +1334,16 @@ export function QuickEntryBox({ onCreate, addToast, tasks = [], availableModels,
const selectedAgentLabel = selectedAgent?.name ?? selectedAgentId;
const selectedNode = nodeId ? nodes.find((node) => node.id === nodeId) : undefined;
const projectGithubTrackingDefault = settings?.githubTrackingEnabledByDefault === true;
const effectiveGithubTracking = githubTrackingOverride ?? projectGithubTrackingDefault;
const githubToggleLabel = effectiveGithubTracking
? `GitHub tracking ON for next task (project default: ${projectGithubTrackingDefault ? "on" : "off"})`
: "GitHub tracking OFF for next task";
const githubTrackingProjectEnabled = projectGithubTrackingDefault;
const effectiveGithubTracking = githubTrackingProjectEnabled
? (githubTrackingOverride ?? true)
: false;
const githubToggleDisabledLabel = "GitHub tracking is disabled for this project — enable it in Settings to use per-task tracking";
const githubToggleLabel = githubTrackingProjectEnabled
? (effectiveGithubTracking
? `GitHub tracking ON for next task (project default: ${projectGithubTrackingDefault ? "on" : "off"})`
: "GitHub tracking OFF for next task")
: githubToggleDisabledLabel;
// Show expanded controls based on disclosure state (user preference), not textarea focus
const showExpandedControls = isDisclosureExpanded;
@@ -1850,7 +1859,9 @@ export function QuickEntryBox({ onCreate, addToast, tasks = [], availableModels,
className={`btn btn-sm ${effectiveGithubTracking ? "btn-primary" : ""}`}
onClick={() => setGithubTrackingOverride(!effectiveGithubTracking)}
onMouseDown={(e) => e.preventDefault()}
disabled={!githubTrackingProjectEnabled}
aria-pressed={effectiveGithubTracking}
aria-disabled={!githubTrackingProjectEnabled || undefined}
data-testid="quick-entry-github-toggle"
title={githubToggleLabel}
aria-label={githubToggleLabel}

View File

@@ -766,6 +766,8 @@ describe("QuickEntryBox", () => {
const githubToggle = await screen.findByTestId("quick-entry-github-toggle");
expect(githubToggle.getAttribute("aria-pressed")).toBe("false");
expect(githubToggle).toBeDisabled();
expect(githubToggle.getAttribute("aria-disabled")).toBe("true");
expect(githubToggle.className.includes("btn-primary")).toBe(false);
});
@@ -791,8 +793,9 @@ describe("QuickEntryBox", () => {
const githubToggle = await screen.findByTestId("quick-entry-github-toggle");
expect(githubToggle.getAttribute("aria-pressed")).toBe("false");
expect(githubToggle).toBeDisabled();
fireEvent.click(githubToggle);
expect(githubToggle.getAttribute("aria-pressed")).toBe("true");
expect(githubToggle.getAttribute("aria-pressed")).toBe("false");
unmount();
vi.mocked(fetchSettings).mockResolvedValueOnce({
@@ -864,7 +867,7 @@ describe("QuickEntryBox", () => {
expect(payload.githubTracking).toBeUndefined();
});
it("submits githubTracking override when toggle is clicked", async () => {
it("does not submit githubTracking when project setting is disabled, even if user attempts to toggle", async () => {
vi.mocked(fetchSettings).mockResolvedValueOnce({
githubTrackingEnabledByDefault: false,
} as any);
@@ -873,18 +876,54 @@ describe("QuickEntryBox", () => {
const textarea = screen.getByTestId("quick-entry-input");
const githubToggle = await screen.findByTestId("quick-entry-github-toggle");
expect(githubToggle).toBeDisabled();
fireEvent.click(githubToggle);
fireEvent.change(textarea, { target: { value: "Override github tracking" } });
fireEvent.keyDown(textarea, { key: "Enter" });
await waitFor(() => {
expect(props.onCreate).toHaveBeenCalledWith(
expect.objectContaining({
description: "Override github tracking",
githubTracking: { enabled: true },
}),
);
expect(props.onCreate).toHaveBeenCalled();
});
const payload = props.onCreate.mock.calls[0]?.[0];
expect(payload.githubTracking).toBeUndefined();
});
it("submits githubTracking override when project setting is enabled", async () => {
vi.mocked(fetchSettings).mockResolvedValueOnce({
githubTrackingEnabledByDefault: true,
} as any);
const { props } = renderQuickEntryBox({ availableModels: undefined });
expandQuickEntry();
const textarea = screen.getByTestId("quick-entry-input");
await waitFor(() => {
expect(screen.getByTestId("quick-entry-github-toggle").getAttribute("aria-pressed")).toBe("true");
});
fireEvent.click(screen.getByTestId("quick-entry-github-toggle"));
fireEvent.change(textarea, { target: { value: "Disable github tracking override" } });
fireEvent.keyDown(textarea, { key: "Enter" });
await waitFor(() => {
expect(props.onCreate).toHaveBeenCalled();
});
const payload = props.onCreate.mock.calls[0]?.[0];
expect(payload.githubTracking).toEqual({ enabled: false });
});
it("shows disabled GitHub tracking guidance label when project setting is disabled", async () => {
vi.mocked(fetchSettings).mockResolvedValueOnce({
githubTrackingEnabledByDefault: false,
} as any);
renderQuickEntryBox({ availableModels: undefined });
expandQuickEntry();
const githubToggle = await screen.findByTestId("quick-entry-github-toggle");
const expectedLabel = "GitHub tracking is disabled for this project — enable it in Settings to use per-task tracking";
expect(githubToggle).toHaveAttribute("title", expectedLabel);
expect(githubToggle).toHaveAttribute("aria-label", expectedLabel);
});
it("resets GitHub toggle to project default after successful task creation", async () => {