Path: blob/main/src/vs/sessions/contrib/agentFeedback/browser/agentFeedbackAttachmentWidget.ts
13401 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import './media/agentFeedbackAttachment.css';6import * as dom from '../../../../base/browser/dom.js';7import { Codicon } from '../../../../base/common/codicons.js';8import { ThemeIcon } from '../../../../base/common/themables.js';9import { Disposable } from '../../../../base/common/lifecycle.js';10import * as event from '../../../../base/common/event.js';11import { localize } from '../../../../nls.js';12import { IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';13import { IAgentFeedbackVariableEntry } from '../../../../workbench/contrib/chat/common/attachments/chatVariableEntries.js';14import { AgentFeedbackHover } from './agentFeedbackHover.js';1516/**17* Attachment widget that renders "N comments" with a comment icon18* and a custom hover showing all feedback items with actions.19*/20export class AgentFeedbackAttachmentWidget extends Disposable {2122readonly element: HTMLElement;2324private readonly _onDidDelete = this._store.add(new event.Emitter<Event>());25readonly onDidDelete = this._onDidDelete.event;2627private readonly _onDidOpen = this._store.add(new event.Emitter<void>());28readonly onDidOpen = this._onDidOpen.event;2930constructor(31private readonly _attachment: IAgentFeedbackVariableEntry,32options: { shouldFocusClearButton: boolean; supportsDeletion: boolean },33container: HTMLElement,34@IInstantiationService private readonly _instantiationService: IInstantiationService,35) {36super();3738this.element = dom.append(container, dom.$('.chat-attached-context-attachment.agent-feedback-attachment'));39this.element.tabIndex = 0;40this.element.role = 'button';4142// Icon43const iconSpan = dom.$('span');44iconSpan.classList.add(...ThemeIcon.asClassNameArray(Codicon.comment));45const pillIcon = dom.$('div.chat-attached-context-pill', {}, iconSpan);46this.element.appendChild(pillIcon);4748// Label49const label = dom.$('span.chat-attached-context-custom-text', {}, this._attachment.name);50this.element.appendChild(label);5152const deletionCurrentlyNotSupported = true;5354// Clear button55if (options.supportsDeletion && !deletionCurrentlyNotSupported) {56const clearBtn = dom.append(this.element, dom.$('.chat-attached-context-clear-button'));57const clearIcon = dom.$('span');58clearIcon.classList.add(...ThemeIcon.asClassNameArray(Codicon.close));59clearBtn.appendChild(clearIcon);60clearBtn.title = localize('removeAttachment', "Remove");61this._store.add(dom.addDisposableListener(clearBtn, dom.EventType.CLICK, (e) => {62e.preventDefault();63e.stopPropagation();64this._onDidDelete.fire(e);65}));66if (options.shouldFocusClearButton) {67clearBtn.focus();68}69}7071// Aria label72this.element.ariaLabel = localize('chat.agentFeedback', "Attached agent feedback, {0}", this._attachment.name);7374// Custom interactive hover75this._store.add(this._instantiationService.createInstance(AgentFeedbackHover, this.element, this._attachment, options.supportsDeletion));76}77}787980