Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/vs/sessions/browser/parts/chatCompositeBar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ import { ChatPillActionViewItem } from '../../../workbench/browser/chatPills.js'
import { SessionActivatingActionRunner } from '../sessionActionRunner.js';
import { ISessionsService } from '../../services/sessions/browser/sessionsService.js';
import { getSessionConversationStatusAriaLabel } from '../sessionConversationGroups.js';
import { IConfigurationService } from '../../../platform/configuration/common/configuration.js';
import { observableConfigValue } from '../../../platform/observable/common/platformObservableUtils.js';
import { SHOW_SESSION_METADATA_IN_CHAT_INPUT_SETTING } from '../../common/sessionConfig.js';

interface IChatTab {
readonly chat: IChat;
Expand Down Expand Up @@ -114,6 +117,7 @@ export class ChatCompositeBar extends Disposable {
private readonly _sessionToolbar: MenuWorkbenchToolBar;
private readonly _metaRow: HTMLElement;
private readonly _metaToolbar: MenuWorkbenchToolBar;
private readonly _showMetadataInChatInput: IObservable<boolean>;
private readonly _tabs: IChatTab[] = [];
private readonly _tabDisposables = this._register(new DisposableStore());

Expand All @@ -122,6 +126,7 @@ export class ChatCompositeBar extends Disposable {
private _editingTab: IChatTab | undefined;
private _delegate: IChatCompositeBarDelegate | undefined;
private _showSessionActions = false;
private _metadataInInput = false;

private readonly _onDidChangeVisibility = this._register(new Emitter<boolean>());
readonly onDidChangeVisibility: Event<boolean> = this._onDidChangeVisibility.event;
Expand Down Expand Up @@ -153,9 +158,11 @@ export class ChatCompositeBar extends Disposable {
@ISessionsProvidersService private readonly _sessionsProvidersService: ISessionsProvidersService,
@ICommandService private readonly _commandService: ICommandService,
@ISessionsService sessionsService: ISessionsService,
@IConfigurationService configurationService: IConfigurationService,
) {
super();

this._showMetadataInChatInput = observableConfigValue(SHOW_SESSION_METADATA_IN_CHAT_INPUT_SETTING, false, configurationService);
this._container = $('.chat-composite-bar.session-chat-tabs-bar');

// Tabs row — only shown when the group has multiple chats or is split out.
Expand Down Expand Up @@ -285,6 +292,7 @@ export class ChatCompositeBar extends Disposable {
this._newChatContainer.classList.toggle('hidden', !supportsMultipleChats || isQuickChat);
this._newChatAction.enabled = supportsMultipleChats && !isQuickChat && !delegate.session.isArchived.read(reader);
this._showSessionActions = delegate.showSessionActions.read(reader);
this._metadataInInput = this._showMetadataInChatInput.read(reader);
this._sessionActionsContainer.classList.toggle('hidden', !this._showSessionActions);
this._updateMetaRowVisibility();

Expand All @@ -293,7 +301,7 @@ export class ChatCompositeBar extends Disposable {
}

private _updateMetaRowVisibility(): void {
this._metaRow.style.display = this._showSessionActions && !this._metaToolbar.isEmpty() ? '' : 'none';
this._metaRow.style.display = this._showSessionActions && !this._metadataInInput && !this._metaToolbar.isEmpty() ? '' : 'none';
}

setAriaLabel(label: string): void {
Expand Down
24 changes: 21 additions & 3 deletions src/vs/sessions/test/browser/chatCompositeBar.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,16 @@ import { URI } from '../../../base/common/uri.js';
import { mock } from '../../../base/test/common/mock.js';
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../base/test/common/utils.js';
import { ICommandService } from '../../../platform/commands/common/commands.js';
import { IConfigurationService } from '../../../platform/configuration/common/configuration.js';
import { TestConfigurationService } from '../../../platform/configuration/test/common/testConfigurationService.js';
import { MenuRegistry } from '../../../platform/actions/common/actions.js';
import { TestInstantiationService } from '../../../platform/instantiation/test/common/instantiationServiceMock.js';
import { workbenchInstantiationService } from '../../../workbench/test/browser/workbenchTestServices.js';
import { ChatCompositeBar, IChatCompositeBarDelegate } from '../../browser/parts/chatCompositeBar.js';
import { getSessionChatDragData, isSessionChatDrag } from '../../browser/dnd.js';
import { CLOSE_CHAT_COMMAND_ID } from '../../common/sessionCommands.js';
import { SHOW_SESSION_METADATA_IN_CHAT_INPUT_SETTING } from '../../common/sessionConfig.js';
import { Menus } from '../../browser/menus.js';
import { ISessionsProvidersService } from '../../services/sessions/browser/sessionsProvidersService.js';
import { ISessionsPartService } from '../../services/sessions/browser/sessionsPartService.js';
import { ISessionsService } from '../../services/sessions/browser/sessionsService.js';
Expand Down Expand Up @@ -83,16 +88,19 @@ interface IChatCompositeBarHarness {
readonly tabs: readonly HTMLElement[];
}

function createHarness(disposables: Pick<DisposableStore, 'add'>, isQuickChat = false): IChatCompositeBarHarness {
function createHarness(disposables: Pick<DisposableStore, 'add'>, options?: { readonly isQuickChat?: boolean; readonly showMetadataInInput?: boolean }): IChatCompositeBarHarness {
const store = disposables.add(new DisposableStore());
const instantiationService = workbenchInstantiationService(undefined, store);
const commandService = new TestCommandService();
const sessionsService = new TestSessionsService();
const mainChat = createChat('main', 'Main Chat');
const secondaryChat = createChat('secondary', 'Secondary Chat');
const session = createSession([mainChat, secondaryChat], mainChat, isQuickChat);
const session = createSession([mainChat, secondaryChat], mainChat, options?.isQuickChat);

instantiationService.stub(ICommandService, commandService);
instantiationService.stub(IConfigurationService, new TestConfigurationService({
[SHOW_SESSION_METADATA_IN_CHAT_INPUT_SETTING]: options?.showMetadataInInput ?? false,
}));
instantiationService.stub(ISessionsService, sessionsService);
instantiationService.stub(ISessionsManagementService, new class extends mock<ISessionsManagementService>() {
override readonly onDidChangeSessions = Event.None;
Expand Down Expand Up @@ -145,11 +153,21 @@ suite('Sessions - ChatCompositeBar', () => {
});

test('hides New Chat for workspace-less sessions', () => {
const { bar } = createHarness(disposables, true);
const { bar } = createHarness(disposables, { isQuickChat: true });

assert.strictEqual(bar.element.querySelector('.chat-composite-bar-new-chat')?.classList.contains('hidden'), true);
});

test('hides header metadata pills when they are configured in the chat input', () => {
disposables.add(MenuRegistry.appendMenuItem(Menus.SessionHeaderMeta, {
command: { id: 'test.sessionMetadata', title: 'Changes' },
group: 'navigation',
}));
const { bar } = createHarness(disposables, { showMetadataInInput: true });

assert.strictEqual(bar.element.querySelector<HTMLElement>('.chat-composite-bar-meta-row')?.style.display, 'none');
});

test('middle-click closes the targeted inactive non-main chat', () => {
const { store, commandService, sessionsService, bar, session, tabs } = createHarness(disposables);
let bubbled = 0;
Expand Down
Loading