diff --git a/extensions/data-workspace/package.json b/extensions/data-workspace/package.json index 1342eabb03..25d64b581b 100644 --- a/extensions/data-workspace/package.json +++ b/extensions/data-workspace/package.json @@ -105,7 +105,14 @@ "icon": "images/data-workspace.svg" } ] - } + }, + "viewsWelcome": [ + { + "view": "dataworkspace.views.main", + "contents": "%projects-view-no-workspace-content%", + "when": "workbenchState != workspace" + } + ] }, "dependencies": { "vscode-nls": "^4.0.0" diff --git a/extensions/data-workspace/package.nls.json b/extensions/data-workspace/package.nls.json index a76bec3655..62eb92f848 100644 --- a/extensions/data-workspace/package.nls.json +++ b/extensions/data-workspace/package.nls.json @@ -5,5 +5,6 @@ "main-view-name": "Projects", "add-project-command": "Add Project", "refresh-workspace-command": "Refresh", - "remove-project-command":"Remove Project" + "remove-project-command": "Remove Project", + "projects-view-no-workspace-content": "To use projects, open a workspace and add projects to it, or use the 'Add Project' feature and we will create a workspace for you.\n[Open Workspace](command:workbench.action.openWorkspace)\n[Add Project](command:projects.addProject)" } diff --git a/extensions/data-workspace/src/common/constants.ts b/extensions/data-workspace/src/common/constants.ts index deae08ead1..ee95189a5f 100644 --- a/extensions/data-workspace/src/common/constants.ts +++ b/extensions/data-workspace/src/common/constants.ts @@ -11,4 +11,5 @@ export const ExtensionActivationErrorMessage = (extensionId: string, err: any): export const UnknownProjectsErrorMessage = (projectFiles: string[]): string => { return localize('UnknownProjectsError', "No provider was found for the following projects: {0}", projectFiles.join(EOL)); }; export const SelectProjectFileActionName = localize('SelectProjectFileActionName', "Select"); +export const AllProjectTypes = localize('AllProjectTypes', "All Project Types"); diff --git a/extensions/data-workspace/src/common/interfaces.ts b/extensions/data-workspace/src/common/interfaces.ts index 9f6875d4d0..fab6e1e1f5 100644 --- a/extensions/data-workspace/src/common/interfaces.ts +++ b/extensions/data-workspace/src/common/interfaces.ts @@ -70,18 +70,3 @@ export interface IWorkspaceService { */ readonly onDidWorkspaceProjectsChange: vscode.Event; } - -/** - * Represents the item for the workspace tree - */ -export interface WorkspaceTreeItem { - /** - * Gets the tree data provider - */ - treeDataProvider: vscode.TreeDataProvider; - - /** - * Gets the raw element returned by the tree data provider - */ - element: any; -} diff --git a/extensions/data-workspace/src/common/workspaceTreeDataProvider.ts b/extensions/data-workspace/src/common/workspaceTreeDataProvider.ts index d9d3686ddd..099e645e1d 100644 --- a/extensions/data-workspace/src/common/workspaceTreeDataProvider.ts +++ b/extensions/data-workspace/src/common/workspaceTreeDataProvider.ts @@ -4,8 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { IWorkspaceService, WorkspaceTreeItem as WorkspaceTreeItem } from './interfaces'; +import { IWorkspaceService } from './interfaces'; import { UnknownProjectsErrorMessage } from './constants'; +import { WorkspaceTreeItem } from 'dataworkspace'; /** * Tree data provider for the workspace main view diff --git a/extensions/data-workspace/src/dataworkspace.d.ts b/extensions/data-workspace/src/dataworkspace.d.ts index 99dc286075..89e00dd387 100644 --- a/extensions/data-workspace/src/dataworkspace.d.ts +++ b/extensions/data-workspace/src/dataworkspace.d.ts @@ -62,4 +62,19 @@ declare module 'dataworkspace' { */ readonly icon: string | vscode.Uri | { light: string | vscode.Uri, dark: string | vscode.Uri } } + + /** + * Represents the item for the workspace tree + */ + export interface WorkspaceTreeItem { + /** + * Gets the tree data provider + */ + treeDataProvider: vscode.TreeDataProvider; + + /** + * Gets the raw element returned by the tree data provider + */ + element: any; + } } diff --git a/extensions/data-workspace/src/main.ts b/extensions/data-workspace/src/main.ts index 1a4e599365..3c3cf032e0 100644 --- a/extensions/data-workspace/src/main.ts +++ b/extensions/data-workspace/src/main.ts @@ -7,8 +7,8 @@ import * as vscode from 'vscode'; import * as path from 'path'; import { WorkspaceTreeDataProvider } from './common/workspaceTreeDataProvider'; import { WorkspaceService } from './services/workspaceService'; -import { SelectProjectFileActionName } from './common/constants'; -import { WorkspaceTreeItem } from './common/interfaces'; +import { AllProjectTypes, SelectProjectFileActionName } from './common/constants'; +import { WorkspaceTreeItem } from 'dataworkspace'; export function activate(context: vscode.ExtensionContext): void { const workspaceService = new WorkspaceService(); @@ -18,10 +18,11 @@ export function activate(context: vscode.ExtensionContext): void { // To Sakshi - You can replace the implementation with your complete dialog implementation // but all the code here should be reusable by you if (vscode.workspace.workspaceFile) { - const filter: { [name: string]: string[] } = {}; + const filters: { [name: string]: string[] } = {}; const projectTypes = await workspaceService.getAllProjectTypes(); + filters[AllProjectTypes] = projectTypes.map(type => type.projectFileExtension); projectTypes.forEach(type => { - filter[type.displayName] = projectTypes.map(projectType => projectType.projectFileExtension); + filters[type.displayName] = [type.projectFileExtension]; }); let fileUris = await vscode.window.showOpenDialog({ canSelectFiles: true, @@ -29,7 +30,7 @@ export function activate(context: vscode.ExtensionContext): void { canSelectMany: false, defaultUri: vscode.Uri.file(path.dirname(vscode.workspace.workspaceFile.path)), openLabel: SelectProjectFileActionName, - filters: filter + filters: filters }); if (!fileUris || fileUris.length === 0) { return; diff --git a/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts b/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts index db6e31b577..411c62c664 100644 --- a/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts +++ b/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts @@ -9,8 +9,7 @@ import * as vscode from 'vscode'; import * as should from 'should'; import { WorkspaceTreeDataProvider } from '../common/workspaceTreeDataProvider'; import { WorkspaceService } from '../services/workspaceService'; -import { WorkspaceTreeItem } from '../common/interfaces'; -import { IProjectProvider } from 'dataworkspace'; +import { IProjectProvider, WorkspaceTreeItem } from 'dataworkspace'; import { MockTreeDataProvider } from './projectProviderRegistry.test'; suite('workspaceTreeDataProvider Tests', function (): void { diff --git a/extensions/sql-database-projects/src/controllers/projectController.ts b/extensions/sql-database-projects/src/controllers/projectController.ts index 2415de41ff..0bfc6cefcc 100644 --- a/extensions/sql-database-projects/src/controllers/projectController.ts +++ b/extensions/sql-database-projects/src/controllers/projectController.ts @@ -29,6 +29,7 @@ import { BuildHelper } from '../tools/buildHelper'; import { PublishProfile, load } from '../models/publishProfile/publishProfile'; import { AddDatabaseReferenceDialog } from '../dialogs/addDatabaseReferenceDialog'; import { ISystemDatabaseReferenceSettings, IDacpacReferenceSettings, IProjectReferenceSettings } from '../models/IDatabaseReferenceSettings'; +import { WorkspaceTreeItem } from 'dataworkspace'; /** * Controller for managing project lifecycle @@ -188,7 +189,7 @@ export class ProjectsController { * @returns path of the built dacpac */ public async buildProject(project: Project): Promise; - public async buildProject(context: Project | BaseProjectTreeItem): Promise { + public async buildProject(context: Project | BaseProjectTreeItem | WorkspaceTreeItem): Promise { const project: Project = this.getProjectFromContext(context); // Check mssql extension for project dlls (tracking issue #10273) @@ -564,7 +565,11 @@ export class ProjectsController { } } - private getProjectFromContext(context: Project | BaseProjectTreeItem) { + private getProjectFromContext(context: Project | BaseProjectTreeItem | WorkspaceTreeItem) { + if ('element' in context) { + return context.element.project; + } + if (context instanceof Project) { return context; }