Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export abstract class AgentHostSessionEnumPicker extends Disposable {
this._watchProviders(this._sessionsProvidersService.getProviders());
}

render(container: HTMLElement): void {
render(container: HTMLElement): HTMLElement {
this._renderDisposables.clear();
this._containerElement = container;

Expand Down Expand Up @@ -104,6 +104,7 @@ export abstract class AgentHostSessionEnumPicker extends Disposable {
}));

this._updateTrigger();
return trigger;
}

private _watchProviders(providers: readonly ISessionsProvider[]): void {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1227,12 +1227,13 @@ class MobileAgentHostSessionConfigPicker extends AgentHostSessionConfigPicker {
}

interface IConfigPickerWidget extends IDisposable {
render(container: HTMLElement): void;
render(container: HTMLElement): HTMLElement | void;
showPicker?(anchor: HTMLElement, onHide?: () => void): boolean | void;
}

export class PickerActionViewItem extends BaseActionViewItem implements IChatInputPickerResponsiveState {
private _compact = false;
private _focusableElement: HTMLElement | undefined;

constructor(private readonly _picker: IConfigPickerWidget, disposable?: IDisposable) {
super(undefined, { id: '', label: '', enabled: true, class: undefined, tooltip: '', run: () => { } });
Expand All @@ -1243,10 +1244,40 @@ export class PickerActionViewItem extends BaseActionViewItem implements IChatInp

override render(container: HTMLElement): void {
this.element = container;
this._picker.render(container);
this._focusableElement = this._picker.render(container) ?? undefined;
container.classList.toggle('compact-picker', this._compact);
}

override focus(): void {
if (this._focusableElement) {
this._focusableElement.focus();
} else {
super.focus();
}
}

override isFocused(): boolean {
return this._focusableElement
? this._focusableElement === dom.getActiveElement()
: super.isFocused();
}

override blur(): void {
if (this._focusableElement) {
this._focusableElement.blur();
} else {
super.blur();
}
}

override setFocusable(focusable: boolean): void {
if (this._focusableElement) {
this.element?.removeAttribute('tabindex');
} else {
super.setFocusable(focusable);
}
}

isCompact(): boolean {
return this._compact;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -354,14 +354,22 @@ suite('Agent Host Session Config Picker', () => {
test('picker action view items expose responsive compact state', () => {
let pickerAnchor: HTMLElement | undefined;
const item = store.add(new PickerActionViewItem({
render: () => { },
render: container => {
const trigger = document.createElement('a');
trigger.classList.add('action-label');
trigger.tabIndex = 0;
container.appendChild(trigger);
return trigger;
},
showPicker: anchor => {
pickerAnchor = anchor;
return true;
},
dispose: () => { },
}));
const container = document.createElement('div');
document.body.appendChild(container);
store.add(toDisposable(() => container.remove()));
const overflowAnchor = document.createElement('button');
item.render(container);
const expanded = {
Expand All @@ -370,16 +378,28 @@ suite('Agent Host Session Config Picker', () => {
};

item.setCompact(true);
item.setFocusable(true);
item.focus();
item.show(overflowAnchor);
const compact = {
compact: item.isCompact(),
className: container.classList.contains('compact-picker'),
usesOverflowAnchor: pickerAnchor === overflowAnchor,
wrapperTabIndex: container.tabIndex,
tabbableDescendants: container.querySelectorAll('[tabindex="0"]').length,
triggerFocused: item.isFocused(),
};

assert.deepStrictEqual({ expanded, compact }, {
expanded: { compact: false, className: false },
compact: { compact: true, className: true, usesOverflowAnchor: true },
compact: {
compact: true,
className: true,
usesOverflowAnchor: true,
wrapperTabIndex: -1,
tabbableDescendants: 1,
triggerFocused: true,
},
});
});

Expand Down
Loading