mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
Add open existing project functionality for VS Code (#15958)
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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', () => {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user