mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 18:46:40 -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 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 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 Project = localize('dataworkspace.project', "Project");
|
||||||
export const Workspace = localize('dataworkspace.workspace', "Workspace");
|
|
||||||
export const LocationSelectorTitle = localize('dataworkspace.locationSelectorTitle', "Location");
|
export const LocationSelectorTitle = localize('dataworkspace.locationSelectorTitle', "Location");
|
||||||
export const ProjectFilePlaceholder = localize('dataworkspace.projectFilePlaceholder', "Select project file");
|
export const ProjectFilePlaceholder = localize('dataworkspace.projectFilePlaceholder', "Select project file");
|
||||||
export const WorkspacePlaceholder = localize('dataworkspace.workspacePlaceholder', "Select workspace ({0}) file", WorkspaceFileExtension);
|
export const WorkspacePlaceholder = localize('dataworkspace.workspacePlaceholder', "Select workspace ({0}) file", WorkspaceFileExtension);
|
||||||
|
|||||||
@@ -207,9 +207,7 @@ export class OpenExistingDialog extends DialogBase {
|
|||||||
width: '18px',
|
width: '18px',
|
||||||
height: '16px'
|
height: '16px'
|
||||||
}).component();
|
}).component();
|
||||||
this.register(localProjectBrowseFolderButton.onDidClick(async () => {
|
this.register(localProjectBrowseFolderButton.onDidClick(() => this.onBrowseButtonClick()));
|
||||||
await this.projectBrowse();
|
|
||||||
}));
|
|
||||||
|
|
||||||
const flexContainer = this.createHorizontalContainer(view, [this.filePathTextBox, localProjectBrowseFolderButton]);
|
const flexContainer = this.createHorizontalContainer(view, [this.filePathTextBox, localProjectBrowseFolderButton]);
|
||||||
flexContainer.updateCssStyles({ 'margin-top': '-10px' });
|
flexContainer.updateCssStyles({ 'margin-top': '-10px' });
|
||||||
@@ -225,9 +223,17 @@ export class OpenExistingDialog extends DialogBase {
|
|||||||
this.initDialogComplete?.resolve();
|
this.initDialogComplete?.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async projectBrowse(): Promise<void> {
|
public async onBrowseButtonClick(): Promise<void> {
|
||||||
|
const projectFilePath = await browseForProject(this.workspaceService);
|
||||||
|
if (projectFilePath) {
|
||||||
|
this.filePathTextBox!.value = projectFilePath.fsPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function browseForProject(workspaceService: IWorkspaceService): Promise<vscode.Uri | undefined> {
|
||||||
const filters: { [name: string]: string[] } = {};
|
const filters: { [name: string]: string[] } = {};
|
||||||
const projectTypes = await this.workspaceService.getAllProjectTypes();
|
const projectTypes = await workspaceService.getAllProjectTypes();
|
||||||
filters[constants.AllProjectTypes] = [...new Set(projectTypes.map(type => type.projectFileExtension))];
|
filters[constants.AllProjectTypes] = [...new Set(projectTypes.map(type => type.projectFileExtension))];
|
||||||
projectTypes.forEach(type => {
|
projectTypes.forEach(type => {
|
||||||
filters[type.displayName] = [type.projectFileExtension];
|
filters[type.displayName] = [type.projectFileExtension];
|
||||||
@@ -241,11 +247,5 @@ export class OpenExistingDialog extends DialogBase {
|
|||||||
filters: filters
|
filters: filters
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!fileUris || fileUris.length === 0) {
|
return fileUris?.[0];
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const projectFilePath = fileUris[0].fsPath;
|
|
||||||
this.filePathTextBox!.value = projectFilePath;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import { WorkspaceService } from './services/workspaceService';
|
|||||||
import { WorkspaceTreeItem, IExtension } from 'dataworkspace';
|
import { WorkspaceTreeItem, IExtension } from 'dataworkspace';
|
||||||
import { DataWorkspaceExtension } from './common/dataWorkspaceExtension';
|
import { DataWorkspaceExtension } from './common/dataWorkspaceExtension';
|
||||||
import { NewProjectDialog } from './dialogs/newProjectDialog';
|
import { NewProjectDialog } from './dialogs/newProjectDialog';
|
||||||
import { OpenExistingDialog } from './dialogs/openExistingDialog';
|
import { browseForProject, OpenExistingDialog } from './dialogs/openExistingDialog';
|
||||||
import { IWorkspaceService } from './common/interfaces';
|
import { IWorkspaceService } from './common/interfaces';
|
||||||
import { IconPathHelper } from './common/iconHelper';
|
import { IconPathHelper } from './common/iconHelper';
|
||||||
import { ProjectDashboard } from './dialogs/projectDashboard';
|
import { ProjectDashboard } from './dialogs/projectDashboard';
|
||||||
@@ -37,13 +37,19 @@ export async function activate(context: vscode.ExtensionContext): Promise<IExten
|
|||||||
} else {
|
} else {
|
||||||
await createNewProjectWithQuickpick(workspaceService);
|
await createNewProjectWithQuickpick(workspaceService);
|
||||||
}
|
}
|
||||||
|
|
||||||
}));
|
}));
|
||||||
|
|
||||||
context.subscriptions.push(vscode.commands.registerCommand('projects.openExisting', async () => {
|
context.subscriptions.push(vscode.commands.registerCommand('projects.openExisting', async () => {
|
||||||
|
if (getAzdataApi()) {
|
||||||
const dialog = new OpenExistingDialog(workspaceService);
|
const dialog = new OpenExistingDialog(workspaceService);
|
||||||
await dialog.open();
|
await dialog.open();
|
||||||
|
} else {
|
||||||
|
const projectFileUri = await browseForProject(workspaceService);
|
||||||
|
if (!projectFileUri) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await workspaceService.addProjectsToWorkspace([projectFileUri]);
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
context.subscriptions.push(vscode.commands.registerCommand('dataworkspace.refresh', () => {
|
context.subscriptions.push(vscode.commands.registerCommand('dataworkspace.refresh', () => {
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ export class WorkspaceService implements IWorkspaceService {
|
|||||||
const provider = ProjectProviderRegistry.getProviderByProjectType(projectTypeId);
|
const provider = ProjectProviderRegistry.getProviderByProjectType(projectTypeId);
|
||||||
if (provider) {
|
if (provider) {
|
||||||
const projectFile = await provider.createProject(name, location, projectTypeId);
|
const projectFile = await provider.createProject(name, location, projectTypeId);
|
||||||
this.addProjectsToWorkspace([projectFile]);
|
await this.addProjectsToWorkspace([projectFile]);
|
||||||
this._onDidWorkspaceProjectsChange.fire();
|
this._onDidWorkspaceProjectsChange.fire();
|
||||||
return projectFile;
|
return projectFile;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -62,18 +62,18 @@ suite('Open Existing Dialog', function (): void {
|
|||||||
test('project browse', async function (): Promise<void> {
|
test('project browse', async function (): Promise<void> {
|
||||||
const workspaceServiceMock = TypeMoq.Mock.ofType<WorkspaceService>();
|
const workspaceServiceMock = TypeMoq.Mock.ofType<WorkspaceService>();
|
||||||
workspaceServiceMock.setup(x => x.getAllProjectTypes()).returns(() => Promise.resolve([testProjectType]));
|
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);
|
const dialog = new OpenExistingDialog(workspaceServiceMock.object);
|
||||||
await dialog.open();
|
await dialog.open();
|
||||||
should.equal(dialog.filePathTextBox!.value ?? '', '', 'Project file should initially be empty');
|
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');
|
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'));
|
const projectFile = vscode.Uri.file(generateUniqueProjectFilePath('testproj'));
|
||||||
sinon.stub(vscode.window, 'showOpenDialog').returns(Promise.resolve([projectFile]));
|
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');
|
should.equal(dialog.filePathTextBox!.value, projectFile.fsPath, 'Project file should be set');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user