Adding option to open referenced project from SQL Project reference item (#23178)

* Adding hook to open a referenced SQL project

* cleanup

* adding docstring
This commit is contained in:
Benjin Dubishar
2023-05-22 17:51:23 -07:00
committed by GitHub
parent dca1a467f3
commit 676f419ddd
7 changed files with 47 additions and 5 deletions

View File

@@ -572,6 +572,7 @@ export enum DatabaseProjectItemType {
table = 'databaseProject.itemType.file.table',
referencesRoot = 'databaseProject.itemType.referencesRoot',
reference = 'databaseProject.itemType.reference',
sqlProjectReference = 'databaseProject.itemType.reference.sqlProject',
dataSourceRoot = 'databaseProject.itemType.dataSourceRoot',
sqlcmdVariablesRoot = 'databaseProject.itemType.sqlcmdVariablesRoot',
sqlcmdVariable = 'databaseProject.itemType.sqlcmdVariable',

View File

@@ -81,6 +81,7 @@ export default class MainController implements vscode.Disposable {
this.context.subscriptions.push(vscode.commands.registerCommand('sqlDatabaseProjects.newPublishProfile', async (node: WorkspaceTreeItem) => { return this.projectsController.addItemPromptFromNode(node, ItemType.publishProfile); }));
this.context.subscriptions.push(vscode.commands.registerCommand('sqlDatabaseProjects.addDatabaseReference', async (node: WorkspaceTreeItem) => { return this.projectsController.addDatabaseReference(node); }));
this.context.subscriptions.push(vscode.commands.registerCommand('sqlDatabaseProjects.openReferencedSqlProject', async (node: WorkspaceTreeItem) => { return this.projectsController.openReferencedSqlProject(node); }));
this.context.subscriptions.push(vscode.commands.registerCommand('sqlDatabaseProjects.openContainingFolder', async (node: WorkspaceTreeItem) => { return this.projectsController.openContainingFolder(node); }));
this.context.subscriptions.push(vscode.commands.registerCommand('sqlDatabaseProjects.editProjectFile', async (node: WorkspaceTreeItem) => { return this.projectsController.editProjectFile(node); }));
this.context.subscriptions.push(vscode.commands.registerCommand('sqlDatabaseProjects.delete', async (node: WorkspaceTreeItem) => { return this.projectsController.delete(node); }));

View File

@@ -28,7 +28,7 @@ import { BuildHelper } from '../tools/buildHelper';
import { readPublishProfile, promptForSavingProfile, savePublishProfile } from '../models/publishProfile/publishProfile';
import { AddDatabaseReferenceDialog } from '../dialogs/addDatabaseReferenceDialog';
import { ISystemDatabaseReferenceSettings, IDacpacReferenceSettings, IProjectReferenceSettings, INugetPackageReferenceSettings } from '../models/IDatabaseReferenceSettings';
import { DatabaseReferenceTreeItem } from '../models/tree/databaseReferencesTreeItem';
import { DatabaseReferenceTreeItem, SqlProjectReferenceTreeItem } from '../models/tree/databaseReferencesTreeItem';
import { CreateProjectFromDatabaseDialog } from '../dialogs/createProjectFromDatabaseDialog';
import { UpdateProjectFromDatabaseDialog } from '../dialogs/updateProjectFromDatabaseDialog';
import { TelemetryActions, TelemetryReporter, TelemetryViews } from '../common/telemetry';
@@ -1028,6 +1028,22 @@ export class ProjectsController {
await vscode.commands.executeCommand(constants.revealFileInOsCommand, vscode.Uri.file(project.projectFilePath));
}
/**
* Open the project indicated by `context` in the workspace
* @param context a SqlProjectReferenceTreeItem in the project's tree
*/
public async openReferencedSqlProject(context: dataworkspace.WorkspaceTreeItem): Promise<void> {
const node = context.element as BaseProjectTreeItem;
const project = await this.getProjectFromContext(node);
if (!(node instanceof SqlProjectReferenceTreeItem)) {
return;
}
const absolutePath = path.normalize(path.join(project.projectFolderPath, node.reference.fsUri.fsPath));
await this.openProjectInWorkspace(absolutePath);
}
/**
* Opens the .sqlproj file for the given project. Upon update of file, prompts user to
* reload their project.

View File

@@ -10,6 +10,7 @@ import * as constants from '../../common/constants';
import { BaseProjectTreeItem } from './baseTreeItem';
import { IconPathHelper } from '../../common/iconHelper';
import { IDatabaseReferenceProjectEntry } from 'sqldbproj';
import { SqlProjectReferenceProjectEntry } from '../projectEntry';
/**
* Folder for containing references nodes in the tree
@@ -35,7 +36,9 @@ export class DatabaseReferencesTreeItem extends BaseProjectTreeItem {
}
for (const reference of databaseReferences) {
this.references.push(new DatabaseReferenceTreeItem(reference, this.relativeProjectUri, this.projectFileUri));
this.references.push(reference instanceof SqlProjectReferenceProjectEntry
? new SqlProjectReferenceTreeItem(reference, this.relativeProjectUri, this.projectFileUri)
: new DatabaseReferenceTreeItem(reference, this.relativeProjectUri, this.projectFileUri));
}
}
@@ -57,7 +60,7 @@ export class DatabaseReferencesTreeItem extends BaseProjectTreeItem {
}
export class DatabaseReferenceTreeItem extends BaseProjectTreeItem {
constructor(private reference: IDatabaseReferenceProjectEntry, referencesNodeRelativeProjectUri: vscode.Uri, sqlprojUri: vscode.Uri) {
constructor(public readonly reference: IDatabaseReferenceProjectEntry, referencesNodeRelativeProjectUri: vscode.Uri, sqlprojUri: vscode.Uri) {
super(vscode.Uri.file(path.join(referencesNodeRelativeProjectUri.fsPath, reference.referenceName)), sqlprojUri);
this.entryKey = this.friendlyName;
}
@@ -79,3 +82,9 @@ export class DatabaseReferenceTreeItem extends BaseProjectTreeItem {
return refItem;
}
}
export class SqlProjectReferenceTreeItem extends DatabaseReferenceTreeItem {
public override get type(): constants.DatabaseProjectItemType {
return constants.DatabaseProjectItemType.sqlProjectReference;
}
}