diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts
index 65ed00a1eba..c26d967523b 100644
--- a/src/vs/code/electron-browser/issue/issueReporterMain.ts
+++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts
@@ -88,6 +88,8 @@ export class IssueReporter extends Disposable {
os: `${os.type()} ${os.arch()} ${os.release()}${isSnap ? ' snap' : ''}`
},
extensionsDisabled: !!this.environmentService.disableExtensions,
+ fileOnExtension: configuration.data.extensionId ? true : undefined,
+ selectedExtension: configuration.data.extensionId ? configuration.data.enabledExtensions.filter(extension => extension.id === configuration.data.extensionId)[0] : undefined
});
const issueReporterElement = this.getElementById('issue-reporter');
@@ -698,9 +700,13 @@ export class IssueReporter extends Disposable {
private setSourceOptions(): void {
const sourceSelect = this.getElementById('issue-source')! as HTMLSelectElement;
- const selected = sourceSelect.selectedIndex;
+ const { issueType, fileOnExtension } = this.issueReporterModel.getData();
+ let selected = sourceSelect.selectedIndex;
+ if (selected === -1 && fileOnExtension !== undefined) {
+ selected = fileOnExtension ? 2 : 1;
+ }
+
sourceSelect.innerHTML = '';
- const { issueType } = this.issueReporterModel.getData();
if (issueType === IssueType.FeatureRequest) {
sourceSelect.append(...[
this.makeOption('', localize('selectSource', "Select source"), true),
@@ -959,10 +965,15 @@ export class IssueReporter extends Disposable {
return 0;
});
- const makeOption = (extension: IOption) => ``;
+ const makeOption = (extension: IOption, selectedExtension?: IssueReporterExtensionData) => {
+ const selected = selectedExtension && extension.id === selectedExtension.id;
+ return ``;
+ };
+
const extensionsSelector = this.getElementById('extension-selector');
if (extensionsSelector) {
- extensionsSelector.innerHTML = '' + extensionOptions.map(makeOption).join('\n');
+ const { selectedExtension } = this.issueReporterModel.getData();
+ extensionsSelector.innerHTML = '' + extensionOptions.map(extension => makeOption(extension, selectedExtension)).join('\n');
this.addEventListener('extension-selector', 'change', (e: Event) => {
const selectedExtensionId = (e.target).value;
diff --git a/src/vs/platform/issue/common/issue.ts b/src/vs/platform/issue/common/issue.ts
index 0058f556840..d9d0e1c4492 100644
--- a/src/vs/platform/issue/common/issue.ts
+++ b/src/vs/platform/issue/common/issue.ts
@@ -56,6 +56,7 @@ export interface IssueReporterData extends WindowData {
styles: IssueReporterStyles;
enabledExtensions: IssueReporterExtensionData[];
issueType?: IssueType;
+ extensionId?: string;
}
export interface ISettingSearchResult {
diff --git a/src/vs/workbench/api/common/apiCommands.ts b/src/vs/workbench/api/common/apiCommands.ts
index 05aebd151ea..c7f4f1972c6 100644
--- a/src/vs/workbench/api/common/apiCommands.ts
+++ b/src/vs/workbench/api/common/apiCommands.ts
@@ -144,6 +144,13 @@ export class RemoveFromRecentlyOpenedAPICommand {
}
CommandsRegistry.registerCommand(RemoveFromRecentlyOpenedAPICommand.ID, adjustHandler(RemoveFromRecentlyOpenedAPICommand.execute));
+export class OpenIssueReporter {
+ public static ID = 'vscode.openIssueReporter';
+ public static execute(executor: ICommandsExecutor, extensionId: string): Promise {
+ return executor.executeCommand('workbench.action.openIssueReporter', [extensionId]);
+ }
+}
+
interface RecentEntry {
uri: URI;
type: 'workspace' | 'folder' | 'file';
diff --git a/src/vs/workbench/api/common/extHostApiCommands.ts b/src/vs/workbench/api/common/extHostApiCommands.ts
index 737a581ee51..d4f1eb5ba6d 100644
--- a/src/vs/workbench/api/common/extHostApiCommands.ts
+++ b/src/vs/workbench/api/common/extHostApiCommands.ts
@@ -15,7 +15,7 @@ import * as search from 'vs/workbench/contrib/search/common/search';
import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands';
import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands';
import { CustomCodeAction } from 'vs/workbench/api/common/extHostLanguageFeatures';
-import { ICommandsExecutor, OpenFolderAPICommand, DiffAPICommand, OpenAPICommand, RemoveFromRecentlyOpenedAPICommand, SetEditorLayoutAPICommand } from './apiCommands';
+import { ICommandsExecutor, OpenFolderAPICommand, DiffAPICommand, OpenAPICommand, RemoveFromRecentlyOpenedAPICommand, SetEditorLayoutAPICommand, OpenIssueReporter } from './apiCommands';
import { EditorGroupLayout } from 'vs/workbench/services/editor/common/editorGroupsService';
import { isFalsyOrEmpty } from 'vs/base/common/arrays';
@@ -258,6 +258,13 @@ export class ExtHostApiCommands {
{ name: 'layout', description: 'The editor layout to set.', constraint: (value: EditorGroupLayout) => typeof value === 'object' && Array.isArray(value.groups) }
]
});
+
+ this._register(OpenIssueReporter.ID, adjustHandler(OpenIssueReporter.execute), {
+ description: 'Opens the issue reporter with the provided extension id as the selected source',
+ args: [
+ { name: 'extensionId', description: 'extensionId to report an issue on', constraint: (value: any) => typeof value === 'string' }
+ ]
+ });
}
// --- command impl
diff --git a/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts b/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts
index e734abdc41b..cbb10f15a37 100644
--- a/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts
+++ b/src/vs/workbench/contrib/issue/electron-browser/issue.contribution.ts
@@ -6,9 +6,9 @@
import { Registry } from 'vs/platform/registry/common/platform';
import * as nls from 'vs/nls';
import product from 'vs/platform/product/node/product';
-import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
+import { SyncActionDescriptor, ICommandAction, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions';
import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions';
-import { OpenIssueReporterAction, ReportPerformanceIssueUsingReporterAction, OpenProcessExplorer } from 'vs/workbench/contrib/issue/electron-browser/issueActions';
+import { ReportPerformanceIssueUsingReporterAction, OpenProcessExplorer } from 'vs/workbench/contrib/issue/electron-browser/issueActions';
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issue';
import { WorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issueService';
@@ -19,8 +19,27 @@ const helpCategory = nls.localize('help', "Help");
const workbenchActionsRegistry = Registry.as(Extensions.WorkbenchActions);
if (!!product.reportIssueUrl) {
- workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(OpenIssueReporterAction, OpenIssueReporterAction.ID, OpenIssueReporterAction.LABEL), 'Help: Open Issue Reporter', helpCategory);
workbenchActionsRegistry.registerWorkbenchAction(new SyncActionDescriptor(ReportPerformanceIssueUsingReporterAction, ReportPerformanceIssueUsingReporterAction.ID, ReportPerformanceIssueUsingReporterAction.LABEL), 'Help: Report Performance Issue', helpCategory);
+
+ const OpenIssueReporterActionId = 'workbench.action.openIssueReporter';
+ const OpenIssueReporterActionLabel = nls.localize({ key: 'reportIssueInEnglish', comment: ['Translate this to "Report Issue in English" in all languages please!'] }, "Report Issue");
+
+ CommandsRegistry.registerCommand(OpenIssueReporterActionId, function (accessor, args?: [string]) {
+ let extensionId: string | undefined;
+ if (args && Array.isArray(args)) {
+ [extensionId] = args;
+ }
+
+ return accessor.get(IWorkbenchIssueService).openReporter({ extensionId });
+ });
+
+ const command: ICommandAction = {
+ id: OpenIssueReporterActionId,
+ title: { value: OpenIssueReporterActionLabel, original: 'Help: Open Issue Reporter' },
+ category: helpCategory
+ };
+
+ MenuRegistry.appendMenuItem(MenuId.CommandPalette, { command });
}
const developerCategory = nls.localize('developer', "Developer");
diff --git a/src/vs/workbench/contrib/issue/electron-browser/issueActions.ts b/src/vs/workbench/contrib/issue/electron-browser/issueActions.ts
index 884189cbaeb..4eaaf7c3029 100644
--- a/src/vs/workbench/contrib/issue/electron-browser/issueActions.ts
+++ b/src/vs/workbench/contrib/issue/electron-browser/issueActions.ts
@@ -8,23 +8,6 @@ import * as nls from 'vs/nls';
import { IssueType } from 'vs/platform/issue/common/issue';
import { IWorkbenchIssueService } from 'vs/workbench/contrib/issue/electron-browser/issue';
-export class OpenIssueReporterAction extends Action {
- static readonly ID = 'workbench.action.openIssueReporter';
- static readonly LABEL = nls.localize({ key: 'reportIssueInEnglish', comment: ['Translate this to "Report Issue in English" in all languages please!'] }, "Report Issue");
-
- constructor(
- id: string,
- label: string,
- @IWorkbenchIssueService private readonly issueService: IWorkbenchIssueService
- ) {
- super(id, label);
- }
-
- run(): Promise {
- return this.issueService.openReporter().then(() => true);
- }
-}
-
export class OpenProcessExplorer extends Action {
static readonly ID = 'workbench.action.openProcessExplorer';
static readonly LABEL = nls.localize('openProcessExplorer', "Open Process Explorer");