Path: blob/main/src/vs/sessions/contrib/changes/browser/changesViewActions.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 { Codicon } from '../../../../base/common/codicons.js';6import { Disposable } from '../../../../base/common/lifecycle.js';7import { localize2 } from '../../../../nls.js';8import { Action2, IAction2Options, MenuId, registerAction2 } from '../../../../platform/actions/common/actions.js';9import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';10import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../../workbench/common/contributions.js';11import { IViewsService } from '../../../../workbench/services/views/common/viewsService.js';12import { ISessionsManagementService } from '../../../services/sessions/common/sessionsManagement.js';13import { ContextKeyExpr, IContextKeyService } from '../../../../platform/contextkey/common/contextkey.js';14import { bindContextKey } from '../../../../platform/observable/common/platformObservableUtils.js';15import { ActiveSessionContextKeys, CHANGES_VIEW_ID, ChangesContextKeys } from '../common/changes.js';16import { IsSessionsWindowContext } from '../../../../workbench/common/contextkeys.js';17import { IOpenerService } from '../../../../platform/opener/common/opener.js';18import { ChangesViewPane } from './changesView.js';19import { URI } from '../../../../base/common/uri.js';20import { isEqual } from '../../../../base/common/resources.js';21import { IEditorService } from '../../../../workbench/services/editor/common/editorService.js';2223const openChangesViewActionOptions: IAction2Options = {24id: 'workbench.action.agentSessions.openChangesView',25title: localize2('openChangesView', "Changes"),26icon: Codicon.diffMultiple,27f1: false,28};2930class OpenChangesViewAction extends Action2 {3132static readonly ID = openChangesViewActionOptions.id;3334constructor() {35super(openChangesViewActionOptions);36}3738async run(accessor: ServicesAccessor): Promise<void> {39const viewsService = accessor.get(IViewsService);40await viewsService.openView(CHANGES_VIEW_ID, true);41}42}4344registerAction2(OpenChangesViewAction);4546class ChangesViewActionsContribution extends Disposable implements IWorkbenchContribution {4748static readonly ID = 'workbench.contrib.changesViewActions';4950constructor(51@IContextKeyService contextKeyService: IContextKeyService,52@ISessionsManagementService sessionManagementService: ISessionsManagementService,53) {54super();5556// Bind context key: true when the active session has changes57this._register(bindContextKey(ActiveSessionContextKeys.HasChanges, contextKeyService, reader => {58const activeSession = sessionManagementService.activeSession.read(reader);59if (!activeSession) {60return false;61}62const changes = activeSession.changes.read(reader);63return changes.length > 0;64}));65}66}6768registerWorkbenchContribution2(ChangesViewActionsContribution.ID, ChangesViewActionsContribution, WorkbenchPhase.AfterRestored);6970class OpenPullRequestAction extends Action2 {71static readonly ID = 'workbench.action.agentSessions.openPullRequest';7273constructor() {74super({75id: OpenPullRequestAction.ID,76title: localize2('openPullRequest', "Open Pull Request"),77icon: Codicon.gitPullRequest,78f1: false,79menu: {80id: MenuId.ChatEditingSessionChangesToolbar,81group: 'navigation',82order: 9,83when: ContextKeyExpr.and(84IsSessionsWindowContext,85ActiveSessionContextKeys.HasPullRequest)86}87});88}8990async run(accessor: ServicesAccessor): Promise<void> {91const openerService = accessor.get(IOpenerService);92const sessionManagementService = accessor.get(ISessionsManagementService);93const activeSession = sessionManagementService.activeSession.get();94if (!activeSession) {95return;96}9798const gitHubInfo = activeSession.gitHubInfo.get();99if (!gitHubInfo?.pullRequest?.uri) {100return;101}102103await openerService.open(gitHubInfo.pullRequest.uri);104}105}106107registerAction2(OpenPullRequestAction);108109class OpenFileAction extends Action2 {110static readonly ID = 'workbench.action.agentSessions.openFile';111112constructor() {113super({114id: OpenFileAction.ID,115title: localize2('openFile', "Open File"),116icon: Codicon.goToFile,117f1: false,118menu: {119id: MenuId.ChatEditingSessionChangeToolbar,120group: 'navigation',121order: 1,122alt: {123id: 'workbench.action.agentSessions.openChanges',124title: localize2('openChanges', "Open Changes"),125icon: Codicon.gitCompare,126},127when: ContextKeyExpr.and(128IsSessionsWindowContext,129ChangesContextKeys.ChangeKind.isEqualTo('file'))130}131});132}133134async run(accessor: ServicesAccessor, _sessionResource: URI, _ref: string, ...resources: URI[]): Promise<void> {135const editorService = accessor.get(IEditorService);136await Promise.all(resources.map(resource => editorService.openEditor({ resource })));137}138}139140registerAction2(OpenFileAction);141142class OpenChangesAction extends Action2 {143static readonly ID = 'workbench.action.agentSessions.openChanges';144145constructor() {146super({147id: OpenChangesAction.ID,148title: localize2('openChanges', "Open Changes"),149icon: Codicon.gitCompare,150f1: false151});152}153154async run(accessor: ServicesAccessor, _sessionResource: URI, _ref: string, ...resources: URI[]): Promise<void> {155const viewsService = accessor.get(IViewsService);156const editorService = accessor.get(IEditorService);157158const view = viewsService.getViewWithId<ChangesViewPane>(CHANGES_VIEW_ID);159const sessionChanges = view?.viewModel.activeSessionChangesObs.get();160161const changes = sessionChanges?.filter(change =>162resources.some(resource => isEqual(change.modifiedUri ?? change.originalUri, resource))163) ?? [];164165await Promise.all(changes.map(change => editorService.openEditor({166original: { resource: change.originalUri },167modified: { resource: change.modifiedUri }168})));169}170}171172registerAction2(OpenChangesAction);173174175