diff --git a/extensions/sql-database-projects/package.json b/extensions/sql-database-projects/package.json index eab3a66aad..340a581325 100644 --- a/extensions/sql-database-projects/package.json +++ b/extensions/sql-database-projects/package.json @@ -124,6 +124,11 @@ "command": "sqlDatabaseProjects.addDatabaseReference", "title": "%sqlDatabaseProjects.addDatabaseReference%", "category": "%sqlDatabaseProjects.displayName%" + }, + { + "command": "sqlDatabaseProjects.openContainingFolder", + "title": "%sqlDatabaseProjects.openContainingFolder%", + "category": "%sqlDatabaseProjects.displayName%" } ], "menus": { @@ -188,6 +193,10 @@ { "command": "sqlDatabaseProjects.addDatabaseReference", "when": "false" + }, + { + "command": "sqlDatabaseProjects.openContainingFolder", + "when": "false" } ], "view/item/context": [ @@ -251,6 +260,11 @@ "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.folder || viewItem == databaseProject.itemType.file", "group": "9_dbProjectsLast@2" }, + { + "command": "sqlDatabaseProjects.openContainingFolder", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project", + "group": "9_dbProjectsLast@8" + }, { "command": "sqlDatabaseProjects.close", "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project", diff --git a/extensions/sql-database-projects/package.nls.json b/extensions/sql-database-projects/package.nls.json index f8fe0a9859..338cb53dfd 100644 --- a/extensions/sql-database-projects/package.nls.json +++ b/extensions/sql-database-projects/package.nls.json @@ -23,6 +23,7 @@ "sqlDatabaseProjects.addDatabaseReference": "Add Database Reference", + "sqlDatabaseProjects.openContainingFolder": "Open Containing Folder", "sqlDatabaseProjects.Settings": "Database Projects", "sqlDatabaseProjects.netCoreInstallLocation": "Full Path to .Net Core SDK on the machine.", diff --git a/extensions/sql-database-projects/src/common/constants.ts b/extensions/sql-database-projects/src/common/constants.ts index 6eee7823d2..ddaa46c980 100644 --- a/extensions/sql-database-projects/src/common/constants.ts +++ b/extensions/sql-database-projects/src/common/constants.ts @@ -22,6 +22,12 @@ export const msdbDacpac = 'msdb.dacpac'; export const MicrosoftDatatoolsSchemaSqlSql = 'Microsoft.Data.Tools.Schema.Sql.Sql'; export const databaseSchemaProvider = 'DatabaseSchemaProvider'; +// commands +export const revealFileInOsCommand = 'revealFileInOS'; +export const schemaCompareStartCommand = 'schemaCompare.start'; +export const sqlDatabaseProjectsViewFocusCommand = 'sqlDatabaseProjectsView.focus'; +export const vscodeOpenCommand = 'vscode.open'; + // UI Strings export const projectNodeName = localize('projectNodeName', "Database Project"); diff --git a/extensions/sql-database-projects/src/controllers/mainController.ts b/extensions/sql-database-projects/src/controllers/mainController.ts index 6f03c798cb..664808f2f4 100644 --- a/extensions/sql-database-projects/src/controllers/mainController.ts +++ b/extensions/sql-database-projects/src/controllers/mainController.ts @@ -64,6 +64,7 @@ export default class MainController implements Disposable { this.apiWrapper.registerCommand('sqlDatabaseProjects.newFolder', async (node: BaseProjectTreeItem) => { await this.projectsController.addFolderPrompt(node); }); this.apiWrapper.registerCommand('sqlDatabaseProjects.addDatabaseReference', async (node: BaseProjectTreeItem) => { await this.projectsController.addDatabaseReference(node); }); + this.apiWrapper.registerCommand('sqlDatabaseProjects.openContainingFolder', async (node: BaseProjectTreeItem) => { await this.projectsController.openContainingFolder(node); }); this.apiWrapper.registerCommand('sqlDatabaseProjects.delete', async (node: BaseProjectTreeItem) => { await this.projectsController.delete(node); }); this.apiWrapper.registerCommand('sqlDatabaseProjects.exclude', async (node: FileNode | FolderNode) => { await this.projectsController.exclude(node); }); diff --git a/extensions/sql-database-projects/src/controllers/projectController.ts b/extensions/sql-database-projects/src/controllers/projectController.ts index e437494068..c77b1cb6fe 100644 --- a/extensions/sql-database-projects/src/controllers/projectController.ts +++ b/extensions/sql-database-projects/src/controllers/projectController.ts @@ -96,7 +96,7 @@ export class ProjectsController { public async focusProject(project?: Project): Promise { if (project && this.projects.includes(project)) { - await this.apiWrapper.executeCommand('sqlDatabaseProjectsView.focus'); + await this.apiWrapper.executeCommand(constants.sqlDatabaseProjectsViewFocusCommand); await this.projectTreeViewProvider.focus(project); } } @@ -261,7 +261,7 @@ export class ProjectsController { // check that dacpac exists if (await utils.exists(dacpacPath)) { - this.apiWrapper.executeCommand('schemaCompare.start', dacpacPath); + this.apiWrapper.executeCommand(constants.schemaCompareStartCommand, dacpacPath); } else { this.apiWrapper.showErrorMessage(constants.buildDacpacNotFound); } @@ -346,7 +346,7 @@ export class ProjectsController { const newEntry = await project.addScriptItem(relativeFilePath, newFileText); - this.apiWrapper.executeCommand('vscode.open', newEntry.fsUri); + this.apiWrapper.executeCommand(constants.vscodeOpenCommand, newEntry.fsUri); this.refreshProjectsTree(); } catch (err) { @@ -400,6 +400,15 @@ export class ProjectsController { return project.files.find(x => utils.getPlatformSafeFileEntryPath(x.relativePath) === utils.getPlatformSafeFileEntryPath(utils.trimUri(context.root.uri, context.uri))); } + /** + * Opens the folder containing the project + * @param context a treeItem in a project's hierarchy, to be used to obtain a Project + */ + public async openContainingFolder(context: BaseProjectTreeItem): Promise { + const project = this.getProjectFromContext(context); + await this.apiWrapper.executeCommand(constants.revealFileInOsCommand, Uri.file(project.projectFilePath)); + } + /** * Adds a database reference to the project * @param context a treeItem in a project's hierarchy, to be used to obtain a Project