Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/chat/browser/chatContentParts/chatPullRequestContentPart.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import './media/chatPullRequestContent.css';
7
import * as dom from '../../../../../base/browser/dom.js';
8
import { Emitter } from '../../../../../base/common/event.js';
9
import { Disposable, IDisposable } from '../../../../../base/common/lifecycle.js';
10
import { IChatPullRequestContent } from '../../common/chatService.js';
11
import { IChatRendererContent } from '../../common/chatViewModel.js';
12
import { ChatTreeItem } from '../chat.js';
13
import { IChatContentPart } from './chatContentParts.js';
14
import { Codicon } from '../../../../../base/common/codicons.js';
15
import { ThemeIcon } from '../../../../../base/common/themables.js';
16
import { localize } from '../../../../../nls.js';
17
import { addDisposableListener } from '../../../../../base/browser/dom.js';
18
import { IOpenerService } from '../../../../../platform/opener/common/opener.js';
19
20
export class ChatPullRequestContentPart extends Disposable implements IChatContentPart {
21
public readonly domNode: HTMLElement;
22
23
private _onDidChangeHeight = this._register(new Emitter<void>());
24
public readonly onDidChangeHeight = this._onDidChangeHeight.event;
25
26
constructor(
27
private readonly pullRequestContent: IChatPullRequestContent,
28
@IOpenerService private readonly openerService: IOpenerService
29
) {
30
super();
31
32
this.domNode = dom.$('.chat-pull-request-content-part');
33
const container = dom.append(this.domNode, dom.$('.container'));
34
const contentContainer = dom.append(container, dom.$('.content-container'));
35
36
const titleContainer = dom.append(contentContainer, dom.$('.title-container'));
37
const icon = dom.append(titleContainer, dom.$('.icon'));
38
icon.classList.add(...ThemeIcon.asClassNameArray(Codicon.gitPullRequest));
39
const titleElement = dom.append(titleContainer, dom.$('.title'));
40
titleElement.textContent = `${this.pullRequestContent.title} - ${this.pullRequestContent.author}`;
41
42
const descriptionElement = dom.append(contentContainer, dom.$('.description'));
43
const descriptionWrapper = dom.append(descriptionElement, dom.$('.description-wrapper'));
44
descriptionWrapper.textContent = this.pullRequestContent.description;
45
46
const seeMoreContainer = dom.append(descriptionElement, dom.$('.see-more'));
47
const seeMore: HTMLAnchorElement = dom.append(seeMoreContainer, dom.$('a'));
48
seeMore.textContent = localize('chatPullRequest.seeMore', 'See more');
49
this._register(addDisposableListener(seeMore, 'click', (e) => {
50
e.preventDefault();
51
e.stopPropagation();
52
this.openerService.open(this.pullRequestContent.uri);
53
}));
54
seeMore.href = this.pullRequestContent.uri.toString();
55
}
56
57
hasSameContent(other: IChatRendererContent, followingContent: IChatRendererContent[], element: ChatTreeItem): boolean {
58
return other.kind === 'pullRequest';
59
}
60
61
addDisposable(disposable: IDisposable): void {
62
this._register(disposable);
63
}
64
}
65
66