Add open existing project functionality for VS Code (#15958)

This commit is contained in:
Charles Gagnon
2021-07-01 09:20:46 -07:00
committed by GitHub
parent a6644333c0
commit 41bac47cbd
5 changed files with 40 additions and 35 deletions

View File

@@ -51,7 +51,6 @@ export const OpenExistingDialogTitle = localize('dataworkspace.openExistingDialo
export const FileNotExistError = (fileType: string, filePath: string): string => { return localize('dataworkspace.fileNotExistError', "The selected {0} file '{1}' does not exist or is not a file.", fileType, filePath); };
export const CloneParentDirectoryNotExistError = (location: string): string => { return localize('dataworkspace.cloneParentDirectoryNotExistError', "The selected clone path '{0}' does not exist or is not a directory.", location); };
export const Project = localize('dataworkspace.project', "Project");
export const Workspace = localize('dataworkspace.workspace', "Workspace");
export const LocationSelectorTitle = localize('dataworkspace.locationSelectorTitle', "Location");
export const ProjectFilePlaceholder = localize('dataworkspace.projectFilePlaceholder', "Select project file");
export const WorkspacePlaceholder = localize('dataworkspace.workspacePlaceholder', "Select workspace ({0}) file", WorkspaceFileExtension);

View File

@@ -207,9 +207,7 @@ export class OpenExistingDialog extends DialogBase {
width: '18px',
height: '16px'
}).component();
this.register(localProjectBrowseFolderButton.onDidClick(async () => {
await this.projectBrowse();
}));
this.register(localProjectBrowseFolderButton.onDidClick(() => this.onBrowseButtonClick()));
const flexContainer = this.createHorizontalContainer(view, [this.filePathTextBox, localProjectBrowseFolderButton]);
flexContainer.updateCssStyles({ 'margin-top': '-10px' });
@@ -225,27 +223,29 @@ export class OpenExistingDialog extends DialogBase {
this.initDialogComplete?.resolve();
}
public async projectBrowse(): Promise<void> {
const filters: { [name: string]: string[] } = {};
const projectTypes = await this.workspaceService.getAllProjectTypes();
filters[constants.AllProjectTypes] = [...new Set(projectTypes.map(type => type.projectFileExtension))];
projectTypes.forEach(type => {
filters[type.displayName] = [type.projectFileExtension];
});
const fileUris = await vscode.window.showOpenDialog({
canSelectFiles: true,
canSelectFolders: false,
canSelectMany: false,
openLabel: constants.SelectProjectFileActionName,
filters: filters
});
if (!fileUris || fileUris.length === 0) {
return;
public async onBrowseButtonClick(): Promise<void> {
const projectFilePath = await browseForProject(this.workspaceService);
if (projectFilePath) {
this.filePathTextBox!.value = projectFilePath.fsPath;
}
const projectFilePath = fileUris[0].fsPath;
this.filePathTextBox!.value = projectFilePath;
}
}
export async function browseForProject(workspaceService: IWorkspaceService): Promise<vscode.Uri | undefined> {
const filters: { [name: string]: string[] } = {};
const projectTypes = await workspaceService.getAllProjectTypes();
filters[constants.AllProjectTypes] = [...new Set(projectTypes.map(type => type.projectFileExtension))];
projectTypes.forEach(type => {
filters[type.displayName] = [type.projectFileExtension];
});
const fileUris = await vscode.window.showOpenDialog({
canSelectFiles: true,
canSelectFolders: false,
canSelectMany: false,
openLabel: constants.SelectProjectFileActionName,
filters: filters
});
return fileUris?.[0];
}

View File

@@ -9,7 +9,7 @@ import { WorkspaceService } from './services/workspaceService';
import { WorkspaceTreeItem, IExtension } from 'dataworkspace';
import { DataWorkspaceExtension } from './common/dataWorkspaceExtension';
import { NewProjectDialog } from './dialogs/newProjectDialog';
import { OpenExistingDialog } from './dialogs/openExistingDialog';
import { browseForProject, OpenExistingDialog } from './dialogs/openExistingDialog';
import { IWorkspaceService } from './common/interfaces';
import { IconPathHelper } from './common/iconHelper';
import { ProjectDashboard } from './dialogs/projectDashboard';
@@ -37,13 +37,19 @@ export async function activate(context: vscode.ExtensionContext): Promise<IExten
} else {
await createNewProjectWithQuickpick(workspaceService);
}
}));
context.subscriptions.push(vscode.commands.registerCommand('projects.openExisting', async () => {
const dialog = new OpenExistingDialog(workspaceService);
await dialog.open();
if (getAzdataApi()) {
const dialog = new OpenExistingDialog(workspaceService);
await dialog.open();
} else {
const projectFileUri = await browseForProject(workspaceService);
if (!projectFileUri) {
return;
}
await workspaceService.addProjectsToWorkspace([projectFileUri]);
}
}));
context.subscriptions.push(vscode.commands.registerCommand('dataworkspace.refresh', () => {

View File

@@ -143,7 +143,7 @@ export class WorkspaceService implements IWorkspaceService {
const provider = ProjectProviderRegistry.getProviderByProjectType(projectTypeId);
if (provider) {
const projectFile = await provider.createProject(name, location, projectTypeId);
this.addProjectsToWorkspace([projectFile]);
await this.addProjectsToWorkspace([projectFile]);
this._onDidWorkspaceProjectsChange.fire();
return projectFile;
} else {

View File

@@ -62,18 +62,18 @@ suite('Open Existing Dialog', function (): void {
test('project browse', async function (): Promise<void> {
const workspaceServiceMock = TypeMoq.Mock.ofType<WorkspaceService>();
workspaceServiceMock.setup(x => x.getAllProjectTypes()).returns(() => Promise.resolve([testProjectType]));
sinon.stub(vscode.window, 'showOpenDialog').returns(Promise.resolve([]));
const showOpenDialogStub = sinon.stub(vscode.window, 'showOpenDialog').returns(Promise.resolve([]));
const dialog = new OpenExistingDialog(workspaceServiceMock.object);
await dialog.open();
should.equal(dialog.filePathTextBox!.value ?? '', '', 'Project file should initially be empty');
await dialog.projectBrowse();
await dialog.onBrowseButtonClick();
should.equal(dialog.filePathTextBox!.value ?? '', '', 'Project file should not be set when no file is selected');
sinon.restore();
showOpenDialogStub.restore();
const projectFile = vscode.Uri.file(generateUniqueProjectFilePath('testproj'));
sinon.stub(vscode.window, 'showOpenDialog').returns(Promise.resolve([projectFile]));
await dialog.projectBrowse();
await dialog.onBrowseButtonClick();
should.equal(dialog.filePathTextBox!.value, projectFile.fsPath, 'Project file should be set');
});
});