diff --git a/extensions/sql-database-projects/package.json b/extensions/sql-database-projects/package.json index 87f1aa7c57..70c067ee40 100644 --- a/extensions/sql-database-projects/package.json +++ b/extensions/sql-database-projects/package.json @@ -174,62 +174,57 @@ "view/item/context": [ { "command": "sqlDatabaseProjects.build", - "when": "view == sqlDatabaseProjectsView", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project", "group": "1_dbProjectsFirst@1" }, { "command": "sqlDatabaseProjects.deploy", - "when": "view == sqlDatabaseProjectsView", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project", "group": "1_dbProjectsFirst@2" }, { "command": "sqlDatabaseProjects.schemaCompare", - "when": "view == sqlDatabaseProjectsView", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project", "group": "1_dbProjectsFirst@3" }, { "command": "sqlDatabaseProjects.newItem", - "when": "view == sqlDatabaseProjectsView", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project || viewItem == databaseProject.itemType.folder", "group": "2_dbProjects_newMain@1" }, { "command": "sqlDatabaseProjects.newFolder", - "when": "view == sqlDatabaseProjectsView", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project || viewItem == databaseProject.itemType.folder", "group": "2_dbProjects_newMain@2" }, { "command": "sqlDatabaseProjects.newTable", - "when": "view == sqlDatabaseProjectsView", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project || viewItem == databaseProject.itemType.folder", "group": "3_dbProjects_newItem@1" }, { "command": "sqlDatabaseProjects.newView", - "when": "view == sqlDatabaseProjectsView", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project || viewItem == databaseProject.itemType.folder", "group": "3_dbProjects_newItem@2" }, { "command": "sqlDatabaseProjects.newStoredProcedure", - "when": "view == sqlDatabaseProjectsView", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project || viewItem == databaseProject.itemType.folder", "group": "3_dbProjects_newItem@3" }, { "command": "sqlDatabaseProjects.newScript", - "when": "view == sqlDatabaseProjectsView", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project || viewItem == databaseProject.itemType.folder", "group": "3_dbProjects_newItem@9" }, { "command": "sqlDatabaseProjects.addDatabaseReference", - "when": "view == sqlDatabaseProjectsView", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.referencesRoot", "group": "4_dbProjects_addDatabaseReference" }, { "command": "sqlDatabaseProjects.close", - "when": "view == sqlDatabaseProjectsView", - "group": "9_dbProjectsLast" - }, - { - "command": "sqlDatabaseProjects.properties", - "when": "view == sqlDatabaseProjectsView", + "when": "view == sqlDatabaseProjectsView && viewItem == databaseProject.itemType.project", "group": "9_dbProjectsLast" } ], diff --git a/extensions/sql-database-projects/src/common/constants.ts b/extensions/sql-database-projects/src/common/constants.ts index 843deb8408..342c010fea 100644 --- a/extensions/sql-database-projects/src/common/constants.ts +++ b/extensions/sql-database-projects/src/common/constants.ts @@ -146,3 +146,14 @@ export const dataSourceSetting = 'Data Source'; export const integratedSecuritySetting = 'Integrated Security'; export const userIdSetting = 'User ID'; export const passwordSetting = 'Password'; + +// Tree item types +export enum DatabaseProjectItemType { + project = 'databaseProject.itemType.project', + folder = 'databaseProject.itemType.folder', + file = 'databaseProject.itemType.file', + referencesRoot = 'databaseProject.itemType.referencesRoot', + reference = 'databaseProject.itemType.reference', + dataSourceRoot = 'databaseProject.itemType.dataSourceRoot', + dataSource = 'databaseProject.itemType.dataSource' +} diff --git a/extensions/sql-database-projects/src/models/project.ts b/extensions/sql-database-projects/src/models/project.ts index 45d25dc29a..f585330b57 100644 --- a/extensions/sql-database-projects/src/models/project.ts +++ b/extensions/sql-database-projects/src/models/project.ts @@ -336,8 +336,10 @@ export class Project { break; case EntryType.Folder: this.addFolderToProjFile(entry.relativePath); + break; case EntryType.DatabaseReference: this.addDatabaseReferenceToProjFile(entry); + break; // not required but adding so that we dont miss when we add new items } await this.serializeToProjFile(this.projFileXmlDoc); diff --git a/extensions/sql-database-projects/src/models/tree/dataSourceTreeItem.ts b/extensions/sql-database-projects/src/models/tree/dataSourceTreeItem.ts index 9f80cf4da4..c2ef862d8d 100644 --- a/extensions/sql-database-projects/src/models/tree/dataSourceTreeItem.ts +++ b/extensions/sql-database-projects/src/models/tree/dataSourceTreeItem.ts @@ -34,7 +34,9 @@ export class DataSourcesTreeItem extends BaseProjectTreeItem { } public get treeItem(): vscode.TreeItem { - return new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Collapsed); + const dataSource = new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Collapsed); + dataSource.contextValue = constants.DatabaseProjectItemType.dataSourceRoot; + return dataSource; } } diff --git a/extensions/sql-database-projects/src/models/tree/databaseReferencesTreeItem.ts b/extensions/sql-database-projects/src/models/tree/databaseReferencesTreeItem.ts index a5c380073c..7038c1ecaa 100644 --- a/extensions/sql-database-projects/src/models/tree/databaseReferencesTreeItem.ts +++ b/extensions/sql-database-projects/src/models/tree/databaseReferencesTreeItem.ts @@ -32,6 +32,8 @@ export class DatabaseReferencesTreeItem extends BaseProjectTreeItem { } public get treeItem(): vscode.TreeItem { - return new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Collapsed); + const refFolderItem = new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Collapsed); + refFolderItem.contextValue = constants.DatabaseProjectItemType.referencesRoot; + return refFolderItem; } } diff --git a/extensions/sql-database-projects/src/models/tree/fileFolderTreeItem.ts b/extensions/sql-database-projects/src/models/tree/fileFolderTreeItem.ts index 9c45b4fa51..9d6068f60c 100644 --- a/extensions/sql-database-projects/src/models/tree/fileFolderTreeItem.ts +++ b/extensions/sql-database-projects/src/models/tree/fileFolderTreeItem.ts @@ -8,6 +8,7 @@ import * as path from 'path'; import { BaseProjectTreeItem } from './baseTreeItem'; import { ProjectRootTreeItem } from './projectTreeItem'; import { Project } from '../project'; +import { DatabaseProjectItemType } from '../../common/constants'; /** * Node representing a folder in a project @@ -26,7 +27,9 @@ export class FolderNode extends BaseProjectTreeItem { } public get treeItem(): vscode.TreeItem { - return new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Expanded); + const folderItem = new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Expanded); + folderItem.contextValue = DatabaseProjectItemType.folder; + return folderItem; } public get project(): Project { @@ -58,7 +61,7 @@ export class FileNode extends BaseProjectTreeItem { arguments: [this.fileSystemUri] }; - treeItem.contextValue = 'File'; + treeItem.contextValue = DatabaseProjectItemType.file; return treeItem; } diff --git a/extensions/sql-database-projects/src/models/tree/projectTreeItem.ts b/extensions/sql-database-projects/src/models/tree/projectTreeItem.ts index d4980097ae..55ab068812 100644 --- a/extensions/sql-database-projects/src/models/tree/projectTreeItem.ts +++ b/extensions/sql-database-projects/src/models/tree/projectTreeItem.ts @@ -11,6 +11,7 @@ import * as fileTree from './fileFolderTreeItem'; import { Project, ProjectEntry, EntryType } from '../project'; import * as utils from '../../common/utils'; import { DatabaseReferencesTreeItem } from './databaseReferencesTreeItem'; +import { DatabaseProjectItemType } from '../../common/constants'; /** * TreeNode root that represents an entire project @@ -40,7 +41,9 @@ export class ProjectRootTreeItem extends BaseProjectTreeItem { } public get treeItem(): vscode.TreeItem { - return new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Expanded); + const projectItem = new vscode.TreeItem(this.uri, vscode.TreeItemCollapsibleState.Expanded); + projectItem.contextValue = DatabaseProjectItemType.project; + return projectItem; } /** diff --git a/extensions/sql-database-projects/src/test/projectTree.test.ts b/extensions/sql-database-projects/src/test/projectTree.test.ts index 1b45f26f1d..3297b6ddce 100644 --- a/extensions/sql-database-projects/src/test/projectTree.test.ts +++ b/extensions/sql-database-projects/src/test/projectTree.test.ts @@ -11,6 +11,7 @@ import * as path from 'path'; import { Project, EntryType } from '../models/project'; import { FolderNode, FileNode, sortFileFolderNodes } from '../models/tree/fileFolderTreeItem'; import { ProjectRootTreeItem } from '../models/tree/projectTreeItem'; +import { DatabaseProjectItemType } from '../common/constants'; describe('Project Tree tests', function (): void { it('Should correctly order tree nodes by type, then by name', async function (): Promise { @@ -78,5 +79,18 @@ describe('Project Tree tests', function (): void { '/TestProj.sqlproj/someFolder/bNestedFolder', '/TestProj.sqlproj/someFolder/aNestedTest.sql', '/TestProj.sqlproj/someFolder/bNestedTest.sql']); + + should(tree.children.map(x => x.treeItem.contextValue)).deepEqual([ + DatabaseProjectItemType.dataSourceRoot, + DatabaseProjectItemType.referencesRoot, + DatabaseProjectItemType.folder, + DatabaseProjectItemType.folder, + DatabaseProjectItemType.file]); + + should(tree.children.find(x => x.uri.path === '/TestProj.sqlproj/someFolder')?.children.map(y => y.treeItem.contextValue)).deepEqual([ + DatabaseProjectItemType.folder, + DatabaseProjectItemType.folder, + DatabaseProjectItemType.file, + DatabaseProjectItemType.file]); }); });