From d153b1bb0cfeedc8232c9055b8198e068370e29b Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Wed, 29 Jul 2026 17:27:13 -0700 Subject: [PATCH] feat(new-workspace): set selected agent as default --- .../components/agent/AgentCombobox.test.tsx | 84 +++++++++++- .../src/components/agent/AgentCombobox.tsx | 123 +++++++++++------- 2 files changed, 156 insertions(+), 51 deletions(-) diff --git a/src/renderer/src/components/agent/AgentCombobox.test.tsx b/src/renderer/src/components/agent/AgentCombobox.test.tsx index 4ef8f7a6521..b205a4e23db 100644 --- a/src/renderer/src/components/agent/AgentCombobox.test.tsx +++ b/src/renderer/src/components/agent/AgentCombobox.test.tsx @@ -1,11 +1,93 @@ +// @vitest-environment happy-dom + +import { cleanup, fireEvent, render, screen } from '@testing-library/react' import { renderToStaticMarkup } from 'react-dom/server' -import { describe, expect, it, vi } from 'vitest' +import { afterEach, describe, expect, it, vi } from 'vitest' import type { TuiAgent } from '../../../../shared/types' import { AGENT_CATALOG, AgentIcon } from '@/lib/agent-catalog' import { AGENT_FAVICON_ASSETS } from '@/lib/agent-favicon-assets' import AgentCombobox from './AgentCombobox' +afterEach(cleanup) + describe('AgentCombobox', () => { + it('sets the closed trigger selection as the default agent', () => { + const onSetDefault = vi.fn() + render( + + ) + + const trigger = screen.getByRole('combobox') + fireEvent.contextMenu(trigger) + + expect(trigger.getAttribute('aria-expanded')).toBe('false') + fireEvent.click(screen.getByRole('menuitem', { name: 'Set as default' })) + expect(onSetDefault).toHaveBeenCalledWith('codex') + }) + + it('maps the closed Blank Terminal selection to the blank default preference', () => { + const onSetDefault = vi.fn() + render( + + ) + + fireEvent.contextMenu(screen.getByRole('combobox')) + fireEvent.click(screen.getByRole('menuitem', { name: 'Set as default' })) + + expect(onSetDefault).toHaveBeenCalledWith('blank') + }) + + it('marks the closed trigger when its selection is already the default', () => { + const onSetDefault = vi.fn() + render( + + ) + + fireEvent.contextMenu(screen.getByRole('combobox')) + const menuItem = screen.getByRole('menuitem', { name: 'Current default' }) + + expect(menuItem.hasAttribute('data-disabled')).toBe(true) + fireEvent.click(menuItem) + expect(onSetDefault).not.toHaveBeenCalled() + }) + + it('keeps the expanded agent-row default action available', () => { + const onSetDefault = vi.fn() + render( + + ) + + fireEvent.click(screen.getByRole('combobox')) + fireEvent.contextMenu(screen.getByRole('option', { name: 'Claude' })) + fireEvent.click(screen.getByRole('menuitem', { name: 'Set as default' })) + + expect(onSetDefault).toHaveBeenCalledWith('claude') + }) + it('keeps enough trigger width for GitHub Copilot when callers pass min-w-0', () => { const markup = renderToStaticMarkup( void triggerClassName?: string /** When set, pressing Enter on the closed combobox trigger invokes this @@ -69,6 +69,12 @@ type ItemRenderArgs = { label: string } +type AgentDefaultContextMenuProps = { + children: React.ReactNode + isDefault: boolean + onSetDefault?: () => void +} + function AgentIconLabel({ icon, label @@ -86,6 +92,29 @@ function AgentIconLabel({ ) } +function AgentDefaultContextMenu({ + children, + isDefault, + onSetDefault +}: AgentDefaultContextMenuProps): React.ReactNode { + if (!onSetDefault) { + return children + } + return ( + + {children} + + + + {isDefault + ? translate('auto.components.agent.AgentCombobox.1b0d6965fa', 'Current default') + : translate('auto.components.agent.AgentCombobox.9c6b59fe58', 'Set as default')} + + + + ) +} + function renderItem({ key, itemValue, @@ -109,23 +138,12 @@ function renderItem({ ) - if (!onSetDefault) { - return row - } return ( // Why: z-[70] sits above PopoverContent's z-[60] so the right-click menu // renders in front of the still-open combobox popover instead of behind it. - - {row} - - - - {isDefault - ? translate('auto.components.agent.AgentCombobox.1b0d6965fa', 'Current default') - : translate('auto.components.agent.AgentCombobox.9c6b59fe58', 'Set as default')} - - - + + {row} + ) } @@ -288,41 +306,46 @@ export default function AgentCombobox({ // trigger free to overflow its dialog column and look misaligned with Project/Name.
- - - + onSetDefault(value ?? 'blank') : undefined} + > + + + +