mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-19 09:35:36 -05:00
Have different node types for the different item types in sql project tree (#22053)
* Have different node types for the different item types in sql project tree * address comments
This commit is contained in:
@@ -38,7 +38,7 @@ export class FolderNode extends BaseProjectTreeItem {
|
||||
/**
|
||||
* Node representing a file in a project
|
||||
*/
|
||||
export class FileNode extends BaseProjectTreeItem {
|
||||
export abstract class FileNode extends BaseProjectTreeItem {
|
||||
public fileSystemUri: vscode.Uri;
|
||||
|
||||
constructor(filePath: vscode.Uri, sqlprojUri: vscode.Uri) {
|
||||
@@ -65,7 +65,16 @@ export class FileNode extends BaseProjectTreeItem {
|
||||
}
|
||||
}
|
||||
|
||||
export class ExternalStreamingJobFileNode extends FileNode {
|
||||
export class SqlObjectFileNode extends FileNode {
|
||||
public override get treeItem(): vscode.TreeItem {
|
||||
const treeItem = super.treeItem;
|
||||
treeItem.contextValue = DatabaseProjectItemType.sqlObjectFile;
|
||||
|
||||
return treeItem;
|
||||
}
|
||||
}
|
||||
|
||||
export class ExternalStreamingJobFileNode extends SqlObjectFileNode {
|
||||
public override get treeItem(): vscode.TreeItem {
|
||||
const treeItem = super.treeItem;
|
||||
treeItem.contextValue = DatabaseProjectItemType.externalStreamingJob;
|
||||
@@ -74,7 +83,7 @@ export class ExternalStreamingJobFileNode extends FileNode {
|
||||
}
|
||||
}
|
||||
|
||||
export class TableFileNode extends FileNode {
|
||||
export class TableFileNode extends SqlObjectFileNode {
|
||||
public override get treeItem(): vscode.TreeItem {
|
||||
const treeItem = super.treeItem;
|
||||
treeItem.contextValue = DatabaseProjectItemType.table;
|
||||
@@ -83,6 +92,42 @@ export class TableFileNode extends FileNode {
|
||||
}
|
||||
}
|
||||
|
||||
export class PreDeployNode extends FileNode {
|
||||
public override get treeItem(): vscode.TreeItem {
|
||||
const treeItem = super.treeItem;
|
||||
treeItem.contextValue = DatabaseProjectItemType.preDeploy;
|
||||
|
||||
return treeItem;
|
||||
}
|
||||
}
|
||||
|
||||
export class PostDeployNode extends FileNode {
|
||||
public override get treeItem(): vscode.TreeItem {
|
||||
const treeItem = super.treeItem;
|
||||
treeItem.contextValue = DatabaseProjectItemType.postDeploy;
|
||||
|
||||
return treeItem;
|
||||
}
|
||||
}
|
||||
|
||||
export class NoneNode extends FileNode {
|
||||
public override get treeItem(): vscode.TreeItem {
|
||||
const treeItem = super.treeItem;
|
||||
treeItem.contextValue = DatabaseProjectItemType.none;
|
||||
|
||||
return treeItem;
|
||||
}
|
||||
}
|
||||
|
||||
export class PublishProfileNode extends FileNode {
|
||||
public override get treeItem(): vscode.TreeItem {
|
||||
const treeItem = super.treeItem;
|
||||
treeItem.contextValue = DatabaseProjectItemType.publishProfile;
|
||||
|
||||
return treeItem;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares two folder/file tree nodes so that folders come before files, then alphabetically
|
||||
* @param a a folder or file tree node
|
||||
|
||||
@@ -62,23 +62,32 @@ export class ProjectRootTreeItem extends BaseProjectTreeItem {
|
||||
* Processes the list of files in a project file to constructs the tree
|
||||
*/
|
||||
private construct() {
|
||||
let treeItemList = this.project.files
|
||||
.concat(this.project.preDeployScripts)
|
||||
.concat(this.project.postDeployScripts)
|
||||
.concat(this.project.noneDeployScripts)
|
||||
.concat(this.project.publishProfiles);
|
||||
// pre deploy scripts
|
||||
for (const preDeployEntry of this.project.preDeployScripts) {
|
||||
const newNode = new fileTree.PreDeployNode(preDeployEntry.fsUri, this.projectFileUri);
|
||||
this.addNode(newNode, preDeployEntry);
|
||||
}
|
||||
|
||||
for (const entry of treeItemList) {
|
||||
if (entry.type !== EntryType.File && entry.relativePath.startsWith(RelativeOuterPath)) {
|
||||
continue;
|
||||
}
|
||||
// post deploy scripts
|
||||
for (const postDeployEntry of this.project.postDeployScripts) {
|
||||
const newNode = new fileTree.PostDeployNode(postDeployEntry.fsUri, this.projectFileUri);
|
||||
this.addNode(newNode, postDeployEntry);
|
||||
}
|
||||
|
||||
const parentNode = this.getEntryParentNode(entry);
|
||||
// none scripts
|
||||
for (const noneEntry of this.project.noneDeployScripts) {
|
||||
const newNode = new fileTree.NoneNode(noneEntry.fsUri, this.projectFileUri);
|
||||
this.addNode(newNode, noneEntry);
|
||||
}
|
||||
|
||||
if (Object.keys(parentNode.fileChildren).includes(path.basename(entry.fsUri.path))) {
|
||||
continue; // ignore duplicate entries
|
||||
}
|
||||
// publish profiles
|
||||
for (const publishProfile of this.project.publishProfiles) {
|
||||
const newNode = new fileTree.PublishProfileNode(publishProfile.fsUri, this.projectFileUri);
|
||||
this.addNode(newNode, publishProfile);
|
||||
}
|
||||
|
||||
// sql object scripts and folders
|
||||
for (const entry of this.project.files) {
|
||||
let newNode: fileTree.FolderNode | fileTree.FileNode;
|
||||
|
||||
switch (entry.type) {
|
||||
@@ -89,7 +98,7 @@ export class ProjectRootTreeItem extends BaseProjectTreeItem {
|
||||
newNode = new fileTree.TableFileNode(entry.fsUri, this.projectFileUri);
|
||||
}
|
||||
else {
|
||||
newNode = new fileTree.FileNode(entry.fsUri, this.projectFileUri);
|
||||
newNode = new fileTree.SqlObjectFileNode(entry.fsUri, this.projectFileUri);
|
||||
}
|
||||
|
||||
break;
|
||||
@@ -100,10 +109,25 @@ export class ProjectRootTreeItem extends BaseProjectTreeItem {
|
||||
throw new Error(`Unknown EntryType: '${entry.type}'`);
|
||||
}
|
||||
|
||||
parentNode.fileChildren[path.basename(entry.fsUri.path)] = newNode;
|
||||
this.addNode(newNode, entry);
|
||||
}
|
||||
}
|
||||
|
||||
private addNode(newNode: fileTree.FileNode | fileTree.FolderNode, entry: FileProjectEntry): void {
|
||||
// Don't add external folders
|
||||
if (entry.type !== EntryType.File && entry.relativePath.startsWith(RelativeOuterPath)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const parentNode = this.getEntryParentNode(entry);
|
||||
|
||||
if (Object.keys(parentNode.fileChildren).includes(path.basename(entry.fsUri.path))) {
|
||||
return; // ignore duplicate entries
|
||||
}
|
||||
|
||||
parentNode.fileChildren[path.basename(entry.fsUri.path)] = newNode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the immediate parent tree node for an entry in a project file
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user