diff --git a/extensions/data-workspace/src/common/constants.ts b/extensions/data-workspace/src/common/constants.ts index fbddd579c7..dfa7979cad 100644 --- a/extensions/data-workspace/src/common/constants.ts +++ b/extensions/data-workspace/src/common/constants.ts @@ -23,7 +23,7 @@ export const DoNotShowAgain = localize('dataworkspace.doNotShowAgain', "Do not s export const ProjectsFailedToLoad = localize('dataworkspace.projectsFailedToLoad', "Some projects failed to load. Please open console for more information"); export const fileDoesNotExist = (name: string): string => { return localize('fileDoesNotExist', "File '{0}' doesn't exist", name); }; export const projectNameNull = localize('projectNameNull', "Project name is null"); -export const noPreviousData = (tableName: string): string => { return localize('noPreviousData', "Prior {0} will appear here, please run to see the results.", tableName); }; +export const noPreviousData = (tableName: string): string => { return localize('noPreviousData', "Prior {0} for the current project will appear here, please run to see the results.", tableName); }; // config settings export const projectsConfigurationKey = 'projects'; diff --git a/extensions/data-workspace/src/dataworkspace.d.ts b/extensions/data-workspace/src/dataworkspace.d.ts index 78f2e11301..3fd9420fcc 100644 --- a/extensions/data-workspace/src/dataworkspace.d.ts +++ b/extensions/data-workspace/src/dataworkspace.d.ts @@ -67,6 +67,11 @@ declare module 'dataworkspace' { */ createProject(name: string, location: vscode.Uri, projectTypeId: string): Promise; + /** + * Gets the project data corresponding to the project file, to be placed in the dashboard container + */ + getDashboardComponents(projectFile: string): IDashboardTable[]; + /** * Gets the supported project types */ @@ -77,11 +82,6 @@ declare module 'dataworkspace' { */ readonly projectActions: (IProjectAction | IProjectActionGroup)[]; - /** - * Gets the project data to be placed in the dashboard container - */ - readonly dashboardComponents: IDashboardTable[]; - /** * Gets the project image to be used as background in dashboard container */ diff --git a/extensions/data-workspace/src/dialogs/projectDashboard.ts b/extensions/data-workspace/src/dialogs/projectDashboard.ts index 9280d526bd..90cef6772e 100644 --- a/extensions/data-workspace/src/dialogs/projectDashboard.ts +++ b/extensions/data-workspace/src/dialogs/projectDashboard.ts @@ -44,7 +44,7 @@ export class ProjectDashboard { await this.dashboard!.open(); } - private async createDashboard(title: string, location: string): Promise { + private async createDashboard(title: string, projectFilePath: string): Promise { this.dashboard = azdata.window.createModelViewDashboard(title, 'ProjectDashboard', { alwaysShowTabs: false }); this.dashboard.registerTabs(async (modelView: azdata.ModelView) => { this.modelView = modelView; @@ -52,8 +52,8 @@ export class ProjectDashboard { this.overviewTab = { title: '', id: 'overview-tab', - content: this.createContainer(title, location), - toolbar: this.createToolbarContainer() + content: this.createContainer(title, projectFilePath), + toolbar: this.createToolbarContainer(projectFilePath) }; return [ this.overviewTab @@ -61,7 +61,7 @@ export class ProjectDashboard { }); } - private createToolbarContainer(): azdata.ToolbarContainer { + private createToolbarContainer(projectFilePath: string): azdata.ToolbarContainer { const projectActions: (IProjectAction | IProjectActionGroup)[] = this.projectProvider!.projectActions; // Add actions as buttons @@ -92,7 +92,7 @@ export class ProjectDashboard { refreshButton.onDidClick(() => { this.rootContainer?.removeItem(this.tableContainer!); - this.tableContainer = this.createTables(); + this.tableContainer = this.createTables(projectFilePath); this.rootContainer?.addItem(this.tableContainer); }); @@ -123,7 +123,7 @@ export class ProjectDashboard { return button; } - private createContainer(title: string, location: string): azdata.FlexContainer { + private createContainer(title: string, projectFilePath: string): azdata.FlexContainer { this.rootContainer = this.modelView!.modelBuilder.flexContainer().withLayout( { flexFlow: 'column', @@ -131,8 +131,8 @@ export class ProjectDashboard { height: '100%' }).component(); - const headerContainer = this.createHeader(title, location); - this.tableContainer = this.createTables(); + const headerContainer = this.createHeader(title, projectFilePath); + this.tableContainer = this.createTables(projectFilePath); this.rootContainer.addItem(headerContainer); this.rootContainer.addItem(this.tableContainer); @@ -188,8 +188,8 @@ export class ProjectDashboard { /** * Adds all the tables to the container */ - private createTables(): azdata.Component { - const dashboardData: IDashboardTable[] = this.projectProvider!.dashboardComponents; + private createTables(projectFile: string): azdata.Component { + const dashboardData: IDashboardTable[] = this.projectProvider!.getDashboardComponents(projectFile); const tableContainer = this.modelView!.modelBuilder.flexContainer().withLayout( { diff --git a/extensions/data-workspace/src/test/projectProviderRegistry.test.ts b/extensions/data-workspace/src/test/projectProviderRegistry.test.ts index b12b3ccfe0..c7d447d8ec 100644 --- a/extensions/data-workspace/src/test/projectProviderRegistry.test.ts +++ b/extensions/data-workspace/src/test/projectProviderRegistry.test.ts @@ -33,7 +33,9 @@ export function createProjectProvider(projectTypes: IProjectType[], projectActio return Promise.resolve(location); }, projectActions: projectActions, - dashboardComponents: dashboardComponents + getDashboardComponents: (projectFile: string): IDashboardTable[] => { + return dashboardComponents; + } }; return projectProvider; } diff --git a/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts b/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts index 0c31a90e25..3588a19b23 100644 --- a/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts +++ b/extensions/data-workspace/src/test/workspaceTreeDataProvider.test.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IProjectProvider, WorkspaceTreeItem } from 'dataworkspace'; +import { IDashboardTable, IProjectProvider, WorkspaceTreeItem } from 'dataworkspace'; import 'mocha'; import * as should from 'should'; import * as sinon from 'sinon'; @@ -111,7 +111,8 @@ suite('workspaceTreeDataProvider Tests', function (): void { id: 'Target Version', run: async (): Promise => { return Promise.resolve(); } }], - dashboardComponents: [{ + getDashboardComponents: (projectFile: string): IDashboardTable[] => { + return [{ name: 'Deployments', columns: [{ displayName: 'c1', width: 75, type: 'string' }], data: [['d1']] @@ -120,8 +121,8 @@ suite('workspaceTreeDataProvider Tests', function (): void { name: 'Builds', columns: [{ displayName: 'c1', width: 75, type: 'string' }], data: [['d1']] - }] - }; + }]; + }}; const getProjectProviderStub = sinon.stub(workspaceService, 'getProjectProvider'); getProjectProviderStub.onFirstCall().resolves(undefined); getProjectProviderStub.onSecondCall().resolves(projectProvider); diff --git a/extensions/sql-database-projects/src/controllers/projectController.ts b/extensions/sql-database-projects/src/controllers/projectController.ts index d5e4a4fefd..638cd49a6e 100644 --- a/extensions/sql-database-projects/src/controllers/projectController.ts +++ b/extensions/sql-database-projects/src/controllers/projectController.ts @@ -52,61 +52,65 @@ export class ProjectsController { this.buildHelper = new BuildHelper(); } - public get dashboardDeployData(): (string | dataworkspace.IconCellValue)[][] { + public getDashboardDeployData(projectFile: string): (string | dataworkspace.IconCellValue)[][] { const infoRows: (string | dataworkspace.IconCellValue)[][] = []; let count = 0; for (let i = this.deployInfo.length - 1; i >= 0; i--) { - let icon: azdata.IconPath; - let text: string; - if (this.deployInfo[i].status === Status.success) { - icon = IconPathHelper.success; - text = constants.Success; - } else if (this.deployInfo[i].status === Status.failed) { - icon = IconPathHelper.error; - text = constants.Failed; - } else { - icon = IconPathHelper.inProgress; - text = constants.InProgress; - } + if (this.deployInfo[i].projectFile === projectFile) { + let icon: azdata.IconPath; + let text: string; + if (this.deployInfo[i].status === Status.success) { + icon = IconPathHelper.success; + text = constants.Success; + } else if (this.deployInfo[i].status === Status.failed) { + icon = IconPathHelper.error; + text = constants.Failed; + } else { + icon = IconPathHelper.inProgress; + text = constants.InProgress; + } - let infoRow: (string | dataworkspace.IconCellValue)[] = [count.toString(), - { text: text, icon: icon }, - this.deployInfo[i].target, - this.deployInfo[i].timeToCompleteAction, - this.deployInfo[i].startDate]; - infoRows.push(infoRow); - count++; + let infoRow: (string | dataworkspace.IconCellValue)[] = [count.toString(), + { text: text, icon: icon }, + this.deployInfo[i].target, + this.deployInfo[i].timeToCompleteAction, + this.deployInfo[i].startDate]; + infoRows.push(infoRow); + count++; + } } return infoRows; } - public get dashboardBuildData(): (string | dataworkspace.IconCellValue)[][] { + public getDashboardBuildData(projectFile: string): (string | dataworkspace.IconCellValue)[][] { const infoRows: (string | dataworkspace.IconCellValue)[][] = []; let count = 0; for (let i = this.buildInfo.length - 1; i >= 0; i--) { - let icon: azdata.IconPath; - let text: string; - if (this.buildInfo[i].status === Status.success) { - icon = IconPathHelper.success; - text = constants.Success; - } else if (this.buildInfo[i].status === Status.failed) { - icon = IconPathHelper.error; - text = constants.Failed; - } else { - icon = IconPathHelper.inProgress; - text = constants.InProgress; - } + if (this.buildInfo[i].projectFile === projectFile) { + let icon: azdata.IconPath; + let text: string; + if (this.buildInfo[i].status === Status.success) { + icon = IconPathHelper.success; + text = constants.Success; + } else if (this.buildInfo[i].status === Status.failed) { + icon = IconPathHelper.error; + text = constants.Failed; + } else { + icon = IconPathHelper.inProgress; + text = constants.InProgress; + } - let infoRow: (string | dataworkspace.IconCellValue)[] = [count.toString(), - { text: text, icon: icon }, - this.buildInfo[i].target, - this.buildInfo[i].timeToCompleteAction, - this.buildInfo[i].startDate]; - infoRows.push(infoRow); - count++; + let infoRow: (string | dataworkspace.IconCellValue)[] = [count.toString(), + { text: text, icon: icon }, + this.buildInfo[i].target, + this.buildInfo[i].timeToCompleteAction, + this.buildInfo[i].startDate]; + infoRows.push(infoRow); + count++; + } } return infoRows; @@ -176,7 +180,7 @@ export class ProjectsController { const startTime = new Date(); const currentBuildTimeInfo = `${startTime.toLocaleDateString()} ${constants.at} ${startTime.toLocaleTimeString()}`; - let buildInfoNew = new DashboardData(Status.inProgress, project.getProjectTargetVersion(), currentBuildTimeInfo); + let buildInfoNew = new DashboardData(project.projectFilePath, Status.inProgress, project.getProjectTargetVersion(), currentBuildTimeInfo); this.buildInfo.push(buildInfoNew); if (this.buildInfo.length - 1 === maxTableLength) { @@ -276,7 +280,7 @@ export class ProjectsController { const actionStartTime = currentDate.getTime(); const currentDeployTimeInfo = `${currentDate.toLocaleDateString()} ${constants.at} ${currentDate.toLocaleTimeString()}`; - let deployInfoNew = new DashboardData(Status.inProgress, project.getProjectTargetVersion(), currentDeployTimeInfo); + let deployInfoNew = new DashboardData(project.projectFilePath, Status.inProgress, project.getProjectTargetVersion(), currentDeployTimeInfo); this.deployInfo.push(deployInfoNew); if (this.deployInfo.length - 1 === maxTableLength) { diff --git a/extensions/sql-database-projects/src/models/dashboardData/dashboardData.ts b/extensions/sql-database-projects/src/models/dashboardData/dashboardData.ts index 8c1a95081a..aaa52ce3ab 100644 --- a/extensions/sql-database-projects/src/models/dashboardData/dashboardData.ts +++ b/extensions/sql-database-projects/src/models/dashboardData/dashboardData.ts @@ -4,12 +4,14 @@ *--------------------------------------------------------------------------------------------*/ export class DashboardData { + public projectFile: string; public status: Status; public target: string; public timeToCompleteAction: string; public startDate: string; - constructor(status: Status, target: string, startDate: string) { + constructor(projectFile: string, status: Status, target: string, startDate: string) { + this.projectFile = projectFile; this.status = status; this.target = target; this.timeToCompleteAction = ''; diff --git a/extensions/sql-database-projects/src/projectProvider/projectProvider.ts b/extensions/sql-database-projects/src/projectProvider/projectProvider.ts index 78f40638e0..2b4184f8a1 100644 --- a/extensions/sql-database-projects/src/projectProvider/projectProvider.ts +++ b/extensions/sql-database-projects/src/projectProvider/projectProvider.ts @@ -128,7 +128,7 @@ export class SqlDatabaseProjectProvider implements dataworkspace.IProjectProvide /** * Gets the data to be displayed in the project dashboard */ - get dashboardComponents(): dataworkspace.IDashboardTable[] { + getDashboardComponents(projectFile: string): dataworkspace.IDashboardTable[] { const deployInfo: dataworkspace.IDashboardTable = { name: constants.Deployments, columns: [{ displayName: constants.ID, width: 100 }, @@ -136,7 +136,7 @@ export class SqlDatabaseProjectProvider implements dataworkspace.IProjectProvide { displayName: constants.Target, width: 250 }, { displayName: constants.Time, width: 250 }, { displayName: constants.Date, width: 250 }], - data: this.projectController.dashboardDeployData + data: this.projectController.getDashboardDeployData(projectFile) }; const buildInfo: dataworkspace.IDashboardTable = { @@ -146,7 +146,7 @@ export class SqlDatabaseProjectProvider implements dataworkspace.IProjectProvide { displayName: constants.Target, width: 250 }, { displayName: constants.Time, width: 250 }, { displayName: constants.Date, width: 250 }], - data: this.projectController.dashboardBuildData + data: this.projectController.getDashboardBuildData(projectFile) }; return [deployInfo, buildInfo];