diff --git a/extensions/data-workspace/src/common/constants.ts b/extensions/data-workspace/src/common/constants.ts index 0173be6b24..a74be5a0c7 100644 --- a/extensions/data-workspace/src/common/constants.ts +++ b/extensions/data-workspace/src/common/constants.ts @@ -14,7 +14,7 @@ export const SelectProjectFileActionName = localize('SelectProjectFileActionName export const AllProjectTypes = localize('AllProjectTypes', "All Project Types"); export const ProviderNotFoundForProjectTypeError = (projectType: string): string => { return localize('UnknownProjectTypeError', "No provider was found for project type with id: '{0}'", projectType); }; export const RestartConfirmation = localize('dataworkspace.restartConfirmation', "Azure Data Studio needs to be restarted for the project to be added to the workspace. Restart now?"); -export const ProjectsFailedToLoad = localize('dataworkspace.projectsFailedToLoad', "Some projects failed to load. To view more details, [open the developer console](command:workbench.action.toggleDevTools)"); +export const projectFailedToLoad = (project: string, error: string) => { return localize('projectFailedToLoad', "Project '{0}' failed to load: {1} To view more details, [open the developer console](command:workbench.action.toggleDevTools).", project, error) }; export const fileDoesNotExist = (name: string): string => { return localize('fileDoesNotExist', "File '{0}' doesn't exist", name); }; export const projectNameNull = localize('projectNameNull', "Project name is null"); export const noPreviousData = (tableName: string): string => { return localize('noPreviousData', "Prior {0} for the current project will appear here, please run to see the results.", tableName); }; diff --git a/extensions/data-workspace/src/common/utils.ts b/extensions/data-workspace/src/common/utils.ts index a300a58b8e..1be645a7ef 100644 --- a/extensions/data-workspace/src/common/utils.ts +++ b/extensions/data-workspace/src/common/utils.ts @@ -91,3 +91,12 @@ export async function showInfoMessageWithLearnMoreLink(message: string, link: st void vscode.env.openExternal(vscode.Uri.parse(link)); } } + +/** + * Consolidates on the error message string + */ +export function getErrorMessage(error: any): string { + return (error instanceof Error) + ? (typeof error.message === 'string' ? error.message : '') + : typeof error === 'string' ? error : `${JSON.stringify(error, undefined, '\t')}`; +} diff --git a/extensions/data-workspace/src/common/workspaceTreeDataProvider.ts b/extensions/data-workspace/src/common/workspaceTreeDataProvider.ts index efb6b10592..51bc35b674 100644 --- a/extensions/data-workspace/src/common/workspaceTreeDataProvider.ts +++ b/extensions/data-workspace/src/common/workspaceTreeDataProvider.ts @@ -6,9 +6,10 @@ import * as vscode from 'vscode'; import * as path from 'path'; import { IWorkspaceService } from './interfaces'; -import { dragAndDropNotSupported, onlyMovingOneFileIsSupported, ProjectsFailedToLoad, UnknownProjectsError } from './constants'; +import { dragAndDropNotSupported, onlyMovingOneFileIsSupported, projectFailedToLoad, UnknownProjectsError } from './constants'; import { WorkspaceTreeItem } from 'dataworkspace'; import { TelemetryReporter } from './telemetry'; +import { getErrorMessage } from './utils'; import Logger from './logger'; /** @@ -54,7 +55,7 @@ export class WorkspaceTreeDataProvider implements vscode.TreeDataProvider = {}; - let errorCount = 0; + let errorMessages: { project: vscode.Uri, errorMessage: string }[] = []; for (const project of projects) { try { const projectProvider = await this._workspaceService.getProjectProvider(project); @@ -79,13 +80,15 @@ export class WorkspaceTreeDataProvider implements vscode.TreeDataProvider 0) { - void vscode.window.showErrorMessage(ProjectsFailedToLoad); + if (errorMessages.length > 0) { + for (let error of errorMessages) { + void vscode.window.showErrorMessage(projectFailedToLoad(path.basename(error.project.fsPath), error.errorMessage + (error.errorMessage.endsWith('.') ? '' : '.'))); + } } TelemetryReporter.sendMetricsEvent(typeMetric, 'OpenWorkspaceProjectTypes');