diff --git a/.changeset/fn-9009-quick-add-merger-label.md b/.changeset/fn-9009-quick-add-merger-label.md new file mode 100644 index 0000000000..296716f5b8 --- /dev/null +++ b/.changeset/fn-9009-quick-add-merger-label.md @@ -0,0 +1,7 @@ +--- +"@runfusion/fusion": patch +--- + +summary: Quick Add model menu now labels the merger row “Merger” with spacing matching other roles. +category: fix +dev: Adds the tasks.modelMerger translation key for the top-level Quick Add menu row. diff --git a/packages/dashboard/app/components/QuickEntryBox.tsx b/packages/dashboard/app/components/QuickEntryBox.tsx index 12b05ee9fe..8472df2a8f 100644 --- a/packages/dashboard/app/components/QuickEntryBox.tsx +++ b/packages/dashboard/app/components/QuickEntryBox.tsx @@ -2427,7 +2427,11 @@ export function QuickEntryBox({ onCreate, onMoveTask, addToast, tasks = [], avai }} > {activeModelSubmenu === null ? ( - // Top-level menu with Plan/Executor/Reviewer choices + /* + * FNXC:QuickAddModelMenu 2026-08-12-22:04: + * Top-level model rows use bare role names and matching icon alignment because + * .model-menu-item-label has no gap. Submenu headers retain the " Model" form. + */
-
) : ( diff --git a/packages/dashboard/app/components/__tests__/QuickEntryBox.test.tsx b/packages/dashboard/app/components/__tests__/QuickEntryBox.test.tsx index dda4bed671..8140ab0ff2 100644 --- a/packages/dashboard/app/components/__tests__/QuickEntryBox.test.tsx +++ b/packages/dashboard/app/components/__tests__/QuickEntryBox.test.tsx @@ -2863,7 +2863,7 @@ describe("QuickEntryBox", () => { expect(screen.getByTestId("model-nested-menu")).toBeTruthy(); }); - it("shows Plan, Executor, and Reviewer options in model menu", () => { + it("uses bare role labels and uniform icon spacing for every model-menu row", () => { renderQuickEntryBox({}); expandQuickEntry(); const textarea = screen.getByTestId("quick-entry-input"); @@ -2871,9 +2871,42 @@ describe("QuickEntryBox", () => { fireEvent.change(textarea, { target: { value: "Task with models" } }); openModelMenu(); - expect(screen.getByTestId("model-menu-plan")).toBeTruthy(); - expect(screen.getByTestId("model-menu-executor")).toBeTruthy(); - expect(screen.getByTestId("model-menu-validator")).toBeTruthy(); + for (const [testId, role] of [ + ["model-menu-plan", "Plan"], + ["model-menu-executor", "Executor"], + ["model-menu-validator", "Reviewer"], + ["model-menu-merger", "Merger"], + ]) { + const row = screen.getByTestId(testId); + const label = row.querySelector(".model-menu-item-label"); + const icon = label?.querySelector("svg") as SVGSVGElement | null; + + expect(label?.textContent).toBe(role); + expect(icon).not.toBeNull(); + expect(icon?.style.verticalAlign).toBe("middle"); + expect(icon?.style.marginRight).toBe("6px"); + } + + expect(screen.getByTestId("model-menu-merger").textContent).not.toContain("Model"); + }); + + it("keeps the Merger label after an override and opens its Model submenu", () => { + renderQuickEntryBox({}); + expandQuickEntry(); + const textarea = screen.getByTestId("quick-entry-input"); + + fireEvent.change(textarea, { target: { value: "Task with models" } }); + openModelMenu(); + fireEvent.click(screen.getByTestId("model-menu-merger")); + fireEvent.click(screen.getByTestId("dropdown-select-merger model")); + fireEvent.click(screen.getByTestId("model-submenu-back")); + + const mergerRow = screen.getByTestId("model-menu-merger"); + expect(mergerRow.querySelector(".model-menu-item-label")?.textContent).toBe("Merger"); + expect(mergerRow.classList.contains("model-menu-item--active")).toBe(true); + + fireEvent.click(mergerRow); + expect(screen.getByText("Merger Model")).toBeTruthy(); }); it("does not render a separate Thinking option in the model menu", () => {