Path: blob/main/src/vs/workbench/contrib/chat/browser/chatContentParts/chatPullRequestContentPart.ts
3296 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/chatPullRequestContent.css';6import * as dom from '../../../../../base/browser/dom.js';7import { Emitter } from '../../../../../base/common/event.js';8import { Disposable, IDisposable } from '../../../../../base/common/lifecycle.js';9import { IChatPullRequestContent } from '../../common/chatService.js';10import { IChatRendererContent } from '../../common/chatViewModel.js';11import { ChatTreeItem } from '../chat.js';12import { IChatContentPart } from './chatContentParts.js';13import { Codicon } from '../../../../../base/common/codicons.js';14import { ThemeIcon } from '../../../../../base/common/themables.js';15import { localize } from '../../../../../nls.js';16import { addDisposableListener } from '../../../../../base/browser/dom.js';17import { IOpenerService } from '../../../../../platform/opener/common/opener.js';1819export class ChatPullRequestContentPart extends Disposable implements IChatContentPart {20public readonly domNode: HTMLElement;2122private _onDidChangeHeight = this._register(new Emitter<void>());23public readonly onDidChangeHeight = this._onDidChangeHeight.event;2425constructor(26private readonly pullRequestContent: IChatPullRequestContent,27@IOpenerService private readonly openerService: IOpenerService28) {29super();3031this.domNode = dom.$('.chat-pull-request-content-part');32const container = dom.append(this.domNode, dom.$('.container'));33const contentContainer = dom.append(container, dom.$('.content-container'));3435const titleContainer = dom.append(contentContainer, dom.$('.title-container'));36const icon = dom.append(titleContainer, dom.$('.icon'));37icon.classList.add(...ThemeIcon.asClassNameArray(Codicon.gitPullRequest));38const titleElement = dom.append(titleContainer, dom.$('.title'));39titleElement.textContent = `${this.pullRequestContent.title} - ${this.pullRequestContent.author}`;4041const descriptionElement = dom.append(contentContainer, dom.$('.description'));42const descriptionWrapper = dom.append(descriptionElement, dom.$('.description-wrapper'));43descriptionWrapper.textContent = this.pullRequestContent.description;4445const seeMoreContainer = dom.append(descriptionElement, dom.$('.see-more'));46const seeMore: HTMLAnchorElement = dom.append(seeMoreContainer, dom.$('a'));47seeMore.textContent = localize('chatPullRequest.seeMore', 'See more');48this._register(addDisposableListener(seeMore, 'click', (e) => {49e.preventDefault();50e.stopPropagation();51this.openerService.open(this.pullRequestContent.uri);52}));53seeMore.href = this.pullRequestContent.uri.toString();54}5556hasSameContent(other: IChatRendererContent, followingContent: IChatRendererContent[], element: ChatTreeItem): boolean {57return other.kind === 'pullRequest';58}5960addDisposable(disposable: IDisposable): void {61this._register(disposable);62}63}646566