diff --git a/src/sql/workbench/parts/tasks/browser/tasksRenderer.ts b/src/sql/workbench/parts/tasks/browser/tasksRenderer.ts index 85aa511e88..485e6d1a70 100644 --- a/src/sql/workbench/parts/tasks/browser/tasksRenderer.ts +++ b/src/sql/workbench/parts/tasks/browser/tasksRenderer.ts @@ -8,6 +8,8 @@ import { TaskNode, TaskStatus } from 'sql/platform/tasks/common/tasksNode'; import * as dom from 'vs/base/browser/dom'; import { localize } from 'vs/nls'; import * as Utils from 'sql/platform/connection/common/utils'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IntervalTimer } from 'vs/base/common/async'; const $ = dom.$; @@ -17,6 +19,7 @@ export interface ITaskHistoryTemplateData { label: HTMLSpanElement; description: HTMLSpanElement; time: HTMLSpanElement; + disposables: Array; } /** @@ -36,15 +39,15 @@ export class TaskHistoryRenderer implements IRenderer { /** * Returns the element's height in the tree, in pixels. */ - public getHeight(tree: ITree, element: any): number { + public getHeight(tree: ITree, element: TaskNode): number { return TaskHistoryRenderer.TASKOBJECT_HEIGHT; } /** * Returns a template ID for a given element. */ - public getTemplateId(tree: ITree, element: any): string { - return TaskHistoryRenderer.TASKOBJECT_TEMPLATE_ID; + public getTemplateId(tree: ITree, element: TaskNode): string { + return element.id; } /** @@ -57,6 +60,7 @@ export class TaskHistoryRenderer implements IRenderer { taskTemplate.label = dom.append(taskTemplate.root, $('.label')); taskTemplate.description = dom.append(taskTemplate.root, $('.description')); taskTemplate.time = dom.append(taskTemplate.root, $('.time')); + taskTemplate.disposables = []; return taskTemplate; } @@ -108,15 +112,15 @@ export class TaskHistoryRenderer implements IRenderer { templateData.description.textContent = description; templateData.description.title = templateData.description.textContent; - this.timer(element, templateData); - let self = this; - setInterval(function () { - self.timer(element, templateData); - }, 1000); + this.timer(element, templateData.time); + + const timer = new IntervalTimer(); + timer.cancelAndSet(() => this.timer(element, templateData.time), 1000); + templateData.disposables.push(timer); } } - public timer(taskNode: TaskNode, templateData: ITaskHistoryTemplateData) { + private timer(taskNode: TaskNode, element: HTMLElement): void { let timeLabel = ''; if (taskNode.status === TaskStatus.Failed) { timeLabel += taskNode.startTime + ' Error: ' + taskNode.message; @@ -134,12 +138,11 @@ export class TaskHistoryRenderer implements IRenderer { timeLabel += ' (' + Utils.parseNumAsTimeString(duration) + ')'; } } - templateData.time.textContent = timeLabel; - templateData.time.title = timeLabel; + element.textContent = timeLabel; + element.title = timeLabel; } - public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { - // no op - // InputBox disposed in wrapUp + public disposeTemplate(tree: ITree, templateId: string, templateData: ITaskHistoryTemplateData): void { + dispose(templateData.disposables); } }