diff --git a/src/sql/workbench/contrib/jobManagement/browser/jobHistory.component.ts b/src/sql/workbench/contrib/jobManagement/browser/jobHistory.component.ts index 53867d9a6d..984c626bf8 100644 --- a/src/sql/workbench/contrib/jobManagement/browser/jobHistory.component.ts +++ b/src/sql/workbench/contrib/jobManagement/browser/jobHistory.component.ts @@ -208,12 +208,10 @@ export class JobHistoryComponent extends JobManagementView implements OnInit { if (self.agentJobHistoryInfo) { self.agentJobHistoryInfo.runDate = self.formatTime(self.agentJobHistoryInfo.runDate); if (self.agentJobHistoryInfo.steps) { - let jobStepStatus = this.didJobFail(self.agentJobHistoryInfo); self._stepRows = self.agentJobHistoryInfo.steps.map(step => { let stepViewRow = new JobStepsViewRow(); stepViewRow.message = step.message; - stepViewRow.runStatus = jobStepStatus ? JobManagementUtilities.convertToStatusString(0) : - JobManagementUtilities.convertToStatusString(step.runStatus); + stepViewRow.runStatus = JobManagementUtilities.convertToStatusString(step.runStatus); self._runStatus = JobManagementUtilities.convertToStatusString(self.agentJobHistoryInfo.runStatus); stepViewRow.stepName = step.stepDetails.stepName; stepViewRow.stepId = step.stepDetails.id.toString(); @@ -224,25 +222,17 @@ export class JobHistoryComponent extends JobManagementView implements OnInit { self._stepRows[0].stepId = nls.localize('stepRow.stepID', "Step ID"); self._stepRows[0].stepName = nls.localize('stepRow.stepName', "Step Name"); self._stepRows[0].message = nls.localize('stepRow.message', "Message"); - this._showSteps = self._stepRows.length > 1; + self._showSteps = self._stepRows.length > 1; } else { self._showSteps = false; } if (self._agentViewComponent.showHistory) { + self._jobManagementService.onStepsChange(self._stepRows); self._cd.detectChanges(); } } } - private didJobFail(job: azdata.AgentJobHistoryInfo): boolean { - for (let i = 0; i < job.steps.length; i++) { - if (job.steps[i].runStatus === 0) { - return true; - } - } - return false; - } - private buildHistoryTree(self: JobHistoryComponent, jobHistories: azdata.AgentJobHistoryInfo[]) { self._treeController.jobHistories = jobHistories; let jobHistoryRows: JobHistoryRow[] = this._treeController.jobHistories.map(job => self.convertToJobHistoryRow(job)); diff --git a/src/sql/workbench/contrib/jobManagement/browser/jobStepsView.component.ts b/src/sql/workbench/contrib/jobManagement/browser/jobStepsView.component.ts index 39abdc1d59..d5b29bbbc2 100644 --- a/src/sql/workbench/contrib/jobManagement/browser/jobStepsView.component.ts +++ b/src/sql/workbench/contrib/jobManagement/browser/jobStepsView.component.ts @@ -14,7 +14,7 @@ import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/work import { CommonServiceInterface } from 'sql/workbench/services/bootstrap/browser/commonServiceInterface.service'; import { JobStepsViewController, JobStepsViewDataSource, JobStepsViewFilter, - JobStepsViewRenderer, JobStepsViewModel + JobStepsViewRenderer, JobStepsViewModel, JobStepsViewRow } from 'sql/workbench/contrib/jobManagement/browser/jobStepsViewTree'; import { JobHistoryComponent } from 'sql/workbench/contrib/jobManagement/browser/jobHistory.component'; import { JobManagementView } from 'sql/workbench/contrib/jobManagement/browser/jobManagementView'; @@ -25,6 +25,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { TabChild } from 'sql/base/browser/ui/panel/tab.component'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import * as TelemetryKeys from 'sql/platform/telemetry/common/telemetryKeys'; +import { IJobManagementService } from 'sql/workbench/services/jobManagement/common/interfaces'; export const JOBSTEPSVIEW_SELECTOR: string = 'jobstepsview-component'; @@ -46,6 +47,7 @@ export class JobStepsViewComponent extends JobManagementView implements OnInit, constructor( @Inject(forwardRef(() => CommonServiceInterface)) commonService: CommonServiceInterface, @Inject(forwardRef(() => JobHistoryComponent)) private _jobHistoryComponent: JobHistoryComponent, + @Inject(IJobManagementService) private _jobManagementService: IJobManagementService, @Inject(IWorkbenchThemeService) private themeService: IWorkbenchThemeService, @Inject(IInstantiationService) instantiationService: IInstantiationService, @Inject(IContextMenuService) contextMenuService: IContextMenuService, @@ -105,6 +107,10 @@ export class JobStepsViewComponent extends JobManagementView implements OnInit, this._register(attachListStyler(this._tree, this.themeService)); const stepsTooltip = nls.localize('agent.steps', "Steps"); jQuery('.steps-header > .steps-icon').attr('title', stepsTooltip); + this._jobManagementService.stepsChanged((data: JobStepsViewRow[]) => { + this._treeDataSource.data = data; + this._tree.refresh(); + }); this._telemetryService.publicLog(TelemetryKeys.JobStepsView); } diff --git a/src/sql/workbench/contrib/jobManagement/browser/jobStepsViewTree.ts b/src/sql/workbench/contrib/jobManagement/browser/jobStepsViewTree.ts index cbf01198cc..74f0202fa0 100644 --- a/src/sql/workbench/contrib/jobManagement/browser/jobStepsViewTree.ts +++ b/src/sql/workbench/contrib/jobManagement/browser/jobStepsViewTree.ts @@ -10,8 +10,9 @@ import * as TreeDefaults from 'vs/base/parts/tree/browser/treeDefaults'; import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { generateUuid } from 'vs/base/common/uuid'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; +import { IJobStepsViewRow } from 'sql/workbench/services/jobManagement/common/interfaces'; -export class JobStepsViewRow { +export class JobStepsViewRow implements IJobStepsViewRow { public stepId: string; public stepName: string; public message: string; diff --git a/src/sql/workbench/services/jobManagement/common/interfaces.ts b/src/sql/workbench/services/jobManagement/common/interfaces.ts index 1833f9fa80..91eab6863d 100644 --- a/src/sql/workbench/services/jobManagement/common/interfaces.ts +++ b/src/sql/workbench/services/jobManagement/common/interfaces.ts @@ -12,12 +12,22 @@ export const SERVICE_ID = 'jobManagementService'; export const IJobManagementService = createDecorator(SERVICE_ID); +export interface IJobStepsViewRow { + stepId: string; + stepName: string; + message: string; + rowID: string; + runStatus: string; +} + export interface IJobManagementService { _serviceBrand: undefined; onDidChange: Event; + stepsChanged: Event; registerProvider(providerId: string, provider: azdata.AgentServicesProvider): void; fireOnDidChange(): void; + onStepsChange(data: IJobStepsViewRow[]): void; getJobs(connectionUri: string): Thenable; getJobHistory(connectionUri: string, jobID: string, jobName: string): Thenable; diff --git a/src/sql/workbench/services/jobManagement/common/jobManagementService.ts b/src/sql/workbench/services/jobManagement/common/jobManagementService.ts index 4ed885ce26..f8b2cc51bb 100644 --- a/src/sql/workbench/services/jobManagement/common/jobManagementService.ts +++ b/src/sql/workbench/services/jobManagement/common/jobManagementService.ts @@ -5,7 +5,7 @@ import { localize } from 'vs/nls'; import * as azdata from 'azdata'; -import { IJobManagementService } from 'sql/workbench/services/jobManagement/common/interfaces'; +import { IJobManagementService, IJobStepsViewRow } from 'sql/workbench/services/jobManagement/common/interfaces'; import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement'; import { Event, Emitter } from 'vs/base/common/event'; @@ -15,6 +15,10 @@ export class JobManagementService implements IJobManagementService { private _onDidChange = new Emitter(); public readonly onDidChange: Event = this._onDidChange.event; + // data oservables for steps tree + private _stepsChanged: Emitter = new Emitter(); + public stepsChanged: Event = this._stepsChanged.event; + private _providers: { [handle: string]: azdata.AgentServicesProvider; } = Object.create(null); private _jobCacheObjectMap: { [server: string]: JobCacheObject; } = {}; private _operatorsCacheObjectMap: { [server: string]: OperatorsCacheObject; } = {}; @@ -23,8 +27,7 @@ export class JobManagementService implements IJobManagementService { private _notebookCacheObjectMap: { [server: string]: NotebookCacheObject; } = {}; constructor( @IConnectionManagementService private _connectionService: IConnectionManagementService - ) { - } + ) { } public fireOnDidChange(): void { this._onDidChange.fire(void 0); @@ -62,6 +65,11 @@ export class JobManagementService implements IJobManagementService { }); } + // Notify Steps changed to steps tree + public onStepsChange(data: IJobStepsViewRow[]): void { + this._stepsChanged.fire(data); + } + // Notebooks public getNotebooks(connectionUri: string): Thenable { return this._runAction(connectionUri, (runner) => {