mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
Show error if trying to create or open project when no project extension is installed (#22021)
* show error if trying to create or open project when no project extensions are found * only check if project providers are available on startup and when extensions change * addressing comments * Update extensions/data-workspace/src/services/workspaceService.ts use some instead of find Co-authored-by: Charles Gagnon <chgagnon@microsoft.com> --------- Co-authored-by: Charles Gagnon <chgagnon@microsoft.com>
This commit is contained in:
@@ -23,6 +23,7 @@ export const gitCloneError = localize('gitCloneError', "Error during git clone.
|
|||||||
export const openedProjectsUndefinedAfterRefresh = localize('openedProjectsUndefinedAfterRefresh', "List of opened projects should not be undefined after refresh from disk.");
|
export const openedProjectsUndefinedAfterRefresh = localize('openedProjectsUndefinedAfterRefresh', "List of opened projects should not be undefined after refresh from disk.");
|
||||||
export const dragAndDropNotSupported = localize('dragAndDropNotSupported', "This project type does not support drag and drop.");
|
export const dragAndDropNotSupported = localize('dragAndDropNotSupported', "This project type does not support drag and drop.");
|
||||||
export const onlyMovingOneFileIsSupported = localize('onlyMovingOneFileIsSupported', "Only moving one file at a time is supported.");
|
export const onlyMovingOneFileIsSupported = localize('onlyMovingOneFileIsSupported', "Only moving one file at a time is supported.");
|
||||||
|
export const noProjectProvidingExtensionsInstalled = localize('noProjectProvidingExtensionsInstalled', "No database project extensions are installed. Please install a database project extension to use this feature.");
|
||||||
|
|
||||||
// UI
|
// UI
|
||||||
export const OkButtonText = localize('dataworkspace.ok', "OK");
|
export const OkButtonText = localize('dataworkspace.ok', "OK");
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import { WorkspaceService } from '../services/workspaceService';
|
|||||||
import { defaultProjectSaveLocation } from './projectLocationHelper';
|
import { defaultProjectSaveLocation } from './projectLocationHelper';
|
||||||
import { openSpecificProjectNewProjectDialog } from '../dialogs/newProjectDialog';
|
import { openSpecificProjectNewProjectDialog } from '../dialogs/newProjectDialog';
|
||||||
import { isValidBasename, isValidBasenameErrorMessage, isValidFilenameCharacter, sanitizeStringForFilename } from './pathUtilsHelper';
|
import { isValidBasename, isValidBasenameErrorMessage, isValidFilenameCharacter, sanitizeStringForFilename } from './pathUtilsHelper';
|
||||||
|
import { noProjectProvidingExtensionsInstalled } from './constants';
|
||||||
|
|
||||||
export class DataWorkspaceExtension implements IExtension {
|
export class DataWorkspaceExtension implements IExtension {
|
||||||
constructor(private workspaceService: WorkspaceService) {
|
constructor(private workspaceService: WorkspaceService) {
|
||||||
@@ -39,6 +40,10 @@ export class DataWorkspaceExtension implements IExtension {
|
|||||||
}
|
}
|
||||||
|
|
||||||
openSpecificProjectNewProjectDialog(projectType: IProjectType): Promise<vscode.Uri | undefined> {
|
openSpecificProjectNewProjectDialog(projectType: IProjectType): Promise<vscode.Uri | undefined> {
|
||||||
|
if (!this.workspaceService.isProjectProviderAvailable) {
|
||||||
|
void vscode.window.showErrorMessage(noProjectProvidingExtensionsInstalled);
|
||||||
|
}
|
||||||
|
|
||||||
return openSpecificProjectNewProjectDialog(projectType, this.workspaceService);
|
return openSpecificProjectNewProjectDialog(projectType, this.workspaceService);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import { getAzdataApi } from './common/utils';
|
|||||||
import { createNewProjectWithQuickpick } from './dialogs/newProjectQuickpick';
|
import { createNewProjectWithQuickpick } from './dialogs/newProjectQuickpick';
|
||||||
import Logger from './common/logger';
|
import Logger from './common/logger';
|
||||||
import { TelemetryReporter } from './common/telemetry';
|
import { TelemetryReporter } from './common/telemetry';
|
||||||
|
import { noProjectProvidingExtensionsInstalled } from './common/constants';
|
||||||
|
|
||||||
export async function activate(context: vscode.ExtensionContext): Promise<IExtension> {
|
export async function activate(context: vscode.ExtensionContext): Promise<IExtension> {
|
||||||
const startTime = new Date().getTime();
|
const startTime = new Date().getTime();
|
||||||
@@ -46,6 +47,11 @@ export async function activate(context: vscode.ExtensionContext): Promise<IExten
|
|||||||
// Make sure all project providing extensions are activated to be sure the project templates show up
|
// Make sure all project providing extensions are activated to be sure the project templates show up
|
||||||
await workspaceService.ensureProviderExtensionLoaded(undefined, true);
|
await workspaceService.ensureProviderExtensionLoaded(undefined, true);
|
||||||
|
|
||||||
|
if (!workspaceService.isProjectProviderAvailable) {
|
||||||
|
void vscode.window.showErrorMessage(noProjectProvidingExtensionsInstalled);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (azdataApi) {
|
if (azdataApi) {
|
||||||
const dialog = new NewProjectDialog(workspaceService);
|
const dialog = new NewProjectDialog(workspaceService);
|
||||||
await dialog.open();
|
await dialog.open();
|
||||||
@@ -58,6 +64,11 @@ export async function activate(context: vscode.ExtensionContext): Promise<IExten
|
|||||||
// Make sure all project providing extensions are activated so that all supported project types show up in the file filter
|
// Make sure all project providing extensions are activated so that all supported project types show up in the file filter
|
||||||
await workspaceService.ensureProviderExtensionLoaded(undefined, true);
|
await workspaceService.ensureProviderExtensionLoaded(undefined, true);
|
||||||
|
|
||||||
|
if (!workspaceService.isProjectProviderAvailable) {
|
||||||
|
void vscode.window.showErrorMessage(noProjectProvidingExtensionsInstalled);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (azdataApi) {
|
if (azdataApi) {
|
||||||
const dialog = new OpenExistingDialog(workspaceService);
|
const dialog = new OpenExistingDialog(workspaceService);
|
||||||
await dialog.open();
|
await dialog.open();
|
||||||
@@ -88,6 +99,10 @@ export async function activate(context: vscode.ExtensionContext): Promise<IExten
|
|||||||
}));
|
}));
|
||||||
Logger.log(`Registering commands took ${new Date().getTime() - registerCommandStartTime}ms`);
|
Logger.log(`Registering commands took ${new Date().getTime() - registerCommandStartTime}ms`);
|
||||||
|
|
||||||
|
context.subscriptions.push(vscode.extensions.onDidChange(() => {
|
||||||
|
workspaceService.updateIfProjectProviderAvailable();
|
||||||
|
}));
|
||||||
|
|
||||||
const iconPathHelperTime = new Date().getTime();
|
const iconPathHelperTime = new Date().getTime();
|
||||||
IconPathHelper.setExtensionContext(context);
|
IconPathHelper.setExtensionContext(context);
|
||||||
Logger.log(`IconPathHelper took ${new Date().getTime() - iconPathHelperTime}ms`);
|
Logger.log(`IconPathHelper took ${new Date().getTime() - iconPathHelperTime}ms`);
|
||||||
|
|||||||
@@ -25,12 +25,26 @@ export class WorkspaceService implements IWorkspaceService {
|
|||||||
|
|
||||||
private openedProjects: vscode.Uri[] | undefined = undefined;
|
private openedProjects: vscode.Uri[] | undefined = undefined;
|
||||||
private excludedProjects: string[] | undefined;
|
private excludedProjects: string[] | undefined;
|
||||||
|
private _isProjectProviderAvailable: boolean = false;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
Logger.log(`Calling getProjectsInWorkspace() from WorkspaceService constructor`);
|
Logger.log(`Calling getProjectsInWorkspace() from WorkspaceService constructor`);
|
||||||
|
this.updateIfProjectProviderAvailable();
|
||||||
this.getProjectsInWorkspace(undefined, true).catch(err => Logger.error(`Error initializing projects in workspace ${err}`));
|
this.getProjectsInWorkspace(undefined, true).catch(err => Logger.error(`Error initializing projects in workspace ${err}`));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get isProjectProviderAvailable(): boolean {
|
||||||
|
return this._isProjectProviderAvailable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public updateIfProjectProviderAvailable(): void {
|
||||||
|
Logger.log(`Checking ${vscode.extensions.all.length} extensions to see if there is a project provider is available`);
|
||||||
|
const startTime = new Date().getTime();
|
||||||
|
|
||||||
|
this._isProjectProviderAvailable = vscode.extensions.all.some(e => e.packageJSON.contributes?.projects?.length > 0);
|
||||||
|
Logger.log(`isProjectProviderAvailable is ${this._isProjectProviderAvailable}. Total time = ${new Date().getTime() - startTime}ms`);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify that a workspace is open or that if one isn't and we're running in ADS, it's ok to create a workspace and restart ADS
|
* Verify that a workspace is open or that if one isn't and we're running in ADS, it's ok to create a workspace and restart ADS
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user