Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/sessions/contrib/changes/browser/changesViewActions.ts
13401 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 { Codicon } from '../../../../base/common/codicons.js';
7
import { Disposable } from '../../../../base/common/lifecycle.js';
8
import { localize2 } from '../../../../nls.js';
9
import { Action2, IAction2Options, MenuId, registerAction2 } from '../../../../platform/actions/common/actions.js';
10
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
11
import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../../workbench/common/contributions.js';
12
import { IViewsService } from '../../../../workbench/services/views/common/viewsService.js';
13
import { ISessionsManagementService } from '../../../services/sessions/common/sessionsManagement.js';
14
import { ContextKeyExpr, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';
15
import { bindContextKey } from '../../../../platform/observable/common/platformObservableUtils.js';
16
import { ActiveSessionContextKeys, CHANGES_VIEW_ID, ChangesContextKeys } from '../common/changes.js';
17
import { IsSessionsWindowContext } from '../../../../workbench/common/contextkeys.js';
18
import { IOpenerService } from '../../../../platform/opener/common/opener.js';
19
import { ChangesViewPane } from './changesView.js';
20
import { URI } from '../../../../base/common/uri.js';
21
import { isEqual } from '../../../../base/common/resources.js';
22
import { IEditorService } from '../../../../workbench/services/editor/common/editorService.js';
23
24
const openChangesViewActionOptions: IAction2Options = {
25
id: 'workbench.action.agentSessions.openChangesView',
26
title: localize2('openChangesView', "Changes"),
27
icon: Codicon.diffMultiple,
28
f1: false,
29
};
30
31
class OpenChangesViewAction extends Action2 {
32
33
static readonly ID = openChangesViewActionOptions.id;
34
35
constructor() {
36
super(openChangesViewActionOptions);
37
}
38
39
async run(accessor: ServicesAccessor): Promise<void> {
40
const viewsService = accessor.get(IViewsService);
41
await viewsService.openView(CHANGES_VIEW_ID, true);
42
}
43
}
44
45
registerAction2(OpenChangesViewAction);
46
47
class ChangesViewActionsContribution extends Disposable implements IWorkbenchContribution {
48
49
static readonly ID = 'workbench.contrib.changesViewActions';
50
51
constructor(
52
@IContextKeyService contextKeyService: IContextKeyService,
53
@ISessionsManagementService sessionManagementService: ISessionsManagementService,
54
) {
55
super();
56
57
// Bind context key: true when the active session has changes
58
this._register(bindContextKey(ActiveSessionContextKeys.HasChanges, contextKeyService, reader => {
59
const activeSession = sessionManagementService.activeSession.read(reader);
60
if (!activeSession) {
61
return false;
62
}
63
const changes = activeSession.changes.read(reader);
64
return changes.length > 0;
65
}));
66
}
67
}
68
69
registerWorkbenchContribution2(ChangesViewActionsContribution.ID, ChangesViewActionsContribution, WorkbenchPhase.AfterRestored);
70
71
class OpenPullRequestAction extends Action2 {
72
static readonly ID = 'workbench.action.agentSessions.openPullRequest';
73
74
constructor() {
75
super({
76
id: OpenPullRequestAction.ID,
77
title: localize2('openPullRequest', "Open Pull Request"),
78
icon: Codicon.gitPullRequest,
79
f1: false,
80
menu: {
81
id: MenuId.ChatEditingSessionChangesToolbar,
82
group: 'navigation',
83
order: 9,
84
when: ContextKeyExpr.and(
85
IsSessionsWindowContext,
86
ActiveSessionContextKeys.HasPullRequest)
87
}
88
});
89
}
90
91
async run(accessor: ServicesAccessor): Promise<void> {
92
const openerService = accessor.get(IOpenerService);
93
const sessionManagementService = accessor.get(ISessionsManagementService);
94
const activeSession = sessionManagementService.activeSession.get();
95
if (!activeSession) {
96
return;
97
}
98
99
const gitHubInfo = activeSession.gitHubInfo.get();
100
if (!gitHubInfo?.pullRequest?.uri) {
101
return;
102
}
103
104
await openerService.open(gitHubInfo.pullRequest.uri);
105
}
106
}
107
108
registerAction2(OpenPullRequestAction);
109
110
class OpenFileAction extends Action2 {
111
static readonly ID = 'workbench.action.agentSessions.openFile';
112
113
constructor() {
114
super({
115
id: OpenFileAction.ID,
116
title: localize2('openFile', "Open File"),
117
icon: Codicon.goToFile,
118
f1: false,
119
menu: {
120
id: MenuId.ChatEditingSessionChangeToolbar,
121
group: 'navigation',
122
order: 1,
123
alt: {
124
id: 'workbench.action.agentSessions.openChanges',
125
title: localize2('openChanges', "Open Changes"),
126
icon: Codicon.gitCompare,
127
},
128
when: ContextKeyExpr.and(
129
IsSessionsWindowContext,
130
ChangesContextKeys.ChangeKind.isEqualTo('file'))
131
}
132
});
133
}
134
135
async run(accessor: ServicesAccessor, _sessionResource: URI, _ref: string, ...resources: URI[]): Promise<void> {
136
const editorService = accessor.get(IEditorService);
137
await Promise.all(resources.map(resource => editorService.openEditor({ resource })));
138
}
139
}
140
141
registerAction2(OpenFileAction);
142
143
class OpenChangesAction extends Action2 {
144
static readonly ID = 'workbench.action.agentSessions.openChanges';
145
146
constructor() {
147
super({
148
id: OpenChangesAction.ID,
149
title: localize2('openChanges', "Open Changes"),
150
icon: Codicon.gitCompare,
151
f1: false
152
});
153
}
154
155
async run(accessor: ServicesAccessor, _sessionResource: URI, _ref: string, ...resources: URI[]): Promise<void> {
156
const viewsService = accessor.get(IViewsService);
157
const editorService = accessor.get(IEditorService);
158
159
const view = viewsService.getViewWithId<ChangesViewPane>(CHANGES_VIEW_ID);
160
const sessionChanges = view?.viewModel.activeSessionChangesObs.get();
161
162
const changes = sessionChanges?.filter(change =>
163
resources.some(resource => isEqual(change.modifiedUri ?? change.originalUri, resource))
164
) ?? [];
165
166
await Promise.all(changes.map(change => editorService.openEditor({
167
original: { resource: change.originalUri },
168
modified: { resource: change.modifiedUri }
169
})));
170
}
171
}
172
173
registerAction2(OpenChangesAction);
174
175