feat(FN-4805): merge fusion/fn-4805
This commit is contained in:
@@ -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}
|
||||
|
||||
@@ -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 () => {
|
||||
|
||||
Reference in New Issue
Block a user