diff --git a/extensions/agent/src/dialogs/alertDialog.ts b/extensions/agent/src/dialogs/alertDialog.ts index dd981ead4a..3c4b3651e4 100644 --- a/extensions/agent/src/dialogs/alertDialog.ts +++ b/extensions/agent/src/dialogs/alertDialog.ts @@ -111,26 +111,89 @@ export class AlertDialog extends AgentDialog { private static readonly DelayMinutesTextBoxLabel: string = localize('alertDialog.DelayMinutes', 'Delay Minutes'); private static readonly DelaySecondsTextBoxLabel: string = localize('alertDialog.DelaySeconds', 'Delay Seconds'); + // Object dropdown strings + private static readonly AccessMethodsLabel: string = localize('alertDialog.AccessMethods', 'Access Methods'); + private static readonly AdvancedAnalyticsLabel: string = localize('alertDialog.AdvancedAnalyticsLabel', 'Advanced Analytics'); + private static readonly AvailabilityReplicaLabel: string = localize('alertDialog.AvailabilityReplica', 'Availability Replica'); + private static readonly BatchRespStatisticsLabel: string = localize('alertDialog.BatchRespStatistics', 'Batch Resp Statistics'); + private static readonly BrokerActivationLabel: string = localize('alertDialog.BrokerActivation', 'Broker Activation'); + private static readonly BrokerStatisticsLabel: string = localize('alertDialog.BrokerStatistics', 'Broker Statistics'); + private static readonly BrokerTOStatisticsLabel: string = localize('alertDialog.BrokerTOStatistics', 'Broker TO Statistics'); + private static readonly BrokerDBMTransportLabel: string = localize('alertDialog.BrokerDBMTransport', 'Broker/DBM Transport'); + private static readonly BufferManagerLabel: string = localize('alertDialog.BufferManager', 'Buffer Manager'); + private static readonly BufferNodeLabel: string = localize('alertDialog.BufferNode', 'Buffer Node'); + private static readonly CatalogMetadataLabel: string = localize('alertDialog.CatalogMetadata', 'Catalog Metadata'); + private static readonly CLRLabel: string = localize('alertDialog.CLR', 'CLR'); + private static readonly ColumnstoreLabel: string = localize('alertDialog.Columnstore', 'Columnstore'); + private static readonly CursorManagerLabel: string = localize('alertDialog.CursorManagerLabel', 'Cursor Manager by Type'); + private static readonly CursorManagerTotalLabel: string = localize('alertDialog.CursorManagerTotalLabel', 'Cursor Manager Total'); + private static readonly DatabaseReplicaLabel: string = localize('alertDialog.DatabaseReplica', 'Database Replica'); + private static readonly DatabasesLabel: string = localize('alertDialog.DatabasesLabel', 'Databases'); + private static readonly DeprecatedFeaturesLabel: string = localize('alertDialog.DeprecatedFeatures', 'Deprecated Features'); + private static readonly ExecStatisticsLabel: string = localize('alertDialog.ExecStatistics', 'Exec Statistics'); + private static readonly ExternalScriptsLabel: string = localize('alertDialog.ExternalScripts', 'External Scripts'); + private static readonly FileTableLabel: string = localize('alertDialog.FileTable', 'File Table'); + private static readonly GeneralStatisticsLabel: string = localize('alertDialog.GeneralStatistics', 'General Statistics'); + private static readonly HTTPStorageLabel: string = localize('alertDialog.HTTPStorage', 'HTTP Storage'); + private static readonly LatchesLabel: string = localize('alertDialog.Latches', 'Latches'); + private static readonly LocksLabel: string = localize('alertDialog.Locks', 'Locks'); + private static readonly LogPoolFreePoolLabel: string = localize('alertDialog.LogPoolFreePool', 'LogPool FreePool'); + private static readonly MemoryBrokerClerksLabel: string = localize('alertDialog.MemoryBrokerClerks', 'Memory Broker Clerks'); + private static readonly MemoryManagerLabel: string = localize('alertDialog.MemoryManager', 'Memory Manager'); + private static readonly MemoryNodeLabel: string = localize('alertDialog.MemoryNode', 'Memory Node'); + private static readonly PlanCacheLabel: string = localize('alertDialog.PlanCache', 'Plan Cache'); + private static readonly QueryStoreLabel: string = localize('alertDialog.QueryStore', 'Query Store'); + private static readonly ResourcePoolStatsLabel: string = localize('alertDialog.ResourcePoolStats', 'Resource Pool Stats'); + private static readonly SQLErrorsLabel: string = localize('alertDialog.SQLErrors', 'SQL Errors'); + private static readonly SQLServer2017XTPCursorsLabel: string = localize('alertDialog.SQLServer2017XTPCursors', 'SQL Server 2017 XTP Cursors'); + private static readonly SQLServer2017XTPGarbageCollectionLabel: string = localize('alertDialog.SQLServer2017XTPGarbageCollection', 'SQL Server 2017 XTP Garbage Collection'); + private static readonly SQLServer2017XTPIOGovernerLabel: string = localize('alertDialog.SQLServer2017XTPIOGoverner', 'SQL Server 2017 XTP IO Governer'); + private static readonly SQLServer2017XTPPhantomProcessorLabel: string = localize('alertDialog.SQLServer2017XTPPhantomProcessor', 'SQL Server 2017 XTP Phantom Processor'); + private static readonly SQLServer2017XTPStorageLabel: string = localize('alertDialog.SQLServer2017XTPStorage', 'SQL Server 2017 XTP Storage'); + private static readonly SQLServer2017XTPTransactionLogLabel: string = localize('alertDialog.SQLServer2017XTPTransactionLog', 'SQL Server 2017 XTP Transaction Log'); + private static readonly SQLServer2017XTPTransactionsLabel: string = localize('alertDialog.SQLServer2017XTPTransactions', 'SQL Server 2017 XTP Transactions'); + private static readonly TransactionsLabel: string = localize('alertDialog.Transactions', 'Transactions'); + private static readonly UserSettableLabel: string = localize('alertDialog.UserSettable', 'User Settable'); + private static readonly WaitStatisticsLabel: string = localize('alertDialog.WaitStatistics', 'Wait Statistics'); + private static readonly WorkloadGroupStats: string = localize('alertDialog.WorkloadGroupStats', 'Workload Group Stats'); + private static readonly ObjectDropdownOptions: string[] = [AlertDialog.AccessMethodsLabel, AlertDialog.AdvancedAnalyticsLabel, AlertDialog.AvailabilityReplicaLabel, + AlertDialog.BatchRespStatisticsLabel, AlertDialog.BrokerActivationLabel, AlertDialog.BrokerStatisticsLabel, AlertDialog.BrokerTOStatisticsLabel, AlertDialog.BrokerDBMTransportLabel, + AlertDialog.BufferManagerLabel, AlertDialog.BufferNodeLabel, AlertDialog.CatalogMetadataLabel, AlertDialog.CLRLabel, AlertDialog.ColumnstoreLabel, + AlertDialog.CursorManagerLabel, AlertDialog.CursorManagerTotalLabel, AlertDialog.DatabaseReplicaLabel, AlertDialog.DatabasesLabel, AlertDialog.DeprecatedFeaturesLabel, + AlertDialog.ExecStatisticsLabel, AlertDialog.ExternalScriptsLabel, AlertDialog.FileTableLabel, AlertDialog.GeneralStatisticsLabel, AlertDialog.HTTPStorageLabel, + AlertDialog.LatchesLabel, AlertDialog.LocksLabel, AlertDialog.LogPoolFreePoolLabel, AlertDialog.MemoryBrokerClerksLabel, AlertDialog.MemoryManagerLabel, + AlertDialog.MemoryNodeLabel, AlertDialog.PlanCacheLabel, AlertDialog.QueryStoreLabel, AlertDialog.ResourcePoolStatsLabel, AlertDialog.SQLErrorsLabel, + AlertDialog.SQLServer2017XTPCursorsLabel, AlertDialog.SQLServer2017XTPGarbageCollectionLabel, AlertDialog.SQLServer2017XTPIOGovernerLabel, + AlertDialog.SQLServer2017XTPPhantomProcessorLabel, AlertDialog.SQLServer2017XTPStorageLabel, AlertDialog.SQLServer2017XTPTransactionLogLabel, + AlertDialog.SQLServer2017XTPTransactionsLabel, AlertDialog.TransactionsLabel, AlertDialog.UserSettableLabel, AlertDialog.WaitStatisticsLabel, + AlertDialog.WorkloadGroupStats]; + // UI Components private generalTab: sqlops.window.modelviewdialog.DialogTab; private responseTab: sqlops.window.modelviewdialog.DialogTab; private optionsTab: sqlops.window.modelviewdialog.DialogTab; + // Form Models + private eventAlertFormModel: sqlops.FormContainer; + private performanceConditionAlertFormModel: sqlops.FormContainer; + private wmiEventFormModel: sqlops.FormContainer; + // General tab controls private nameTextBox: sqlops.InputBoxComponent; private typeDropDown: sqlops.DropDownComponent; private severityDropDown: sqlops.DropDownComponent; + private errorNumberTextBox: sqlops.InputBoxComponent; private databaseDropDown: sqlops.DropDownComponent; private enabledCheckBox: sqlops.CheckBoxComponent; - private errorNumberRadioButton: sqlops.RadioButtonComponent; - private severityRadioButton: sqlops.RadioButtonComponent; - private errorNumberTextBox: sqlops.InputBoxComponent; private raiseAlertMessageCheckBox: sqlops.CheckBoxComponent; private raiseAlertMessageTextBox: sqlops.InputBoxComponent; + private severityRadioButton: sqlops.RadioButtonComponent; + private errorNumberRadioButton: sqlops.RadioButtonComponent; + private objectDropDown: sqlops.DropDownComponent; // Response tab controls - private executeJobTextBox: sqlops.InputBoxComponent; + private executeJobDropdown: sqlops.DropDownComponent; private executeJobCheckBox: sqlops.CheckBoxComponent; private newJobButton: sqlops.ButtonComponent; private notifyOperatorsCheckBox: sqlops.CheckBoxComponent; @@ -144,12 +207,14 @@ export class AlertDialog extends AgentDialog { private delayMinutesTextBox: sqlops.InputBoxComponent; private delaySecondsTextBox: sqlops.InputBoxComponent; + private jobs: string[]; private databases: string[]; - constructor(ownerUri: string, alertInfo: sqlops.AgentAlertInfo = undefined) { + constructor(ownerUri: string, alertInfo: sqlops.AgentAlertInfo = undefined, jobs: string[]) { super(ownerUri, new AlertData(ownerUri, alertInfo), alertInfo ? AlertDialog.EditDialogTitle : AlertDialog.CreateDialogTitle); + this.jobs = jobs; } protected async initializeDialog(dialog: sqlops.window.modelviewdialog.Dialog) { @@ -160,122 +225,150 @@ export class AlertDialog extends AgentDialog { this.responseTab = sqlops.window.modelviewdialog.createTab(AlertDialog.ResponseTabText); this.optionsTab = sqlops.window.modelviewdialog.createTab(AlertDialog.OptionsTabText); - this.initializeGeneralTab(this.databases); + this.initializeGeneralTab(this.databases, dialog); this.initializeResponseTab(); this.initializeOptionsTab(); dialog.content = [this.generalTab, this.responseTab, this.optionsTab]; } - private initializeGeneralTab(databases: string[]) { + private initializeGeneralTab(databases: string[], dialog: sqlops.window.modelviewdialog.Dialog) { this.generalTab.registerContent(async view => { // create controls this.nameTextBox = view.modelBuilder.inputBox().component(); + this.nameTextBox.required = true; + this.nameTextBox.onTextChanged(() => { + if (this.nameTextBox.value.length > 0) { + dialog.okButton.enabled = true; + } else { + dialog.okButton.enabled = false; + } + }); this.enabledCheckBox = view.modelBuilder.checkBox() .withProperties({ label: AlertDialog.EnabledCheckboxLabel }).component(); - this.databaseDropDown = view.modelBuilder.dropDown() - .withProperties({ - value: databases[0], - values: databases - }).component(); + this.enabledCheckBox.checked = true; this.typeDropDown = view.modelBuilder.dropDown() - .withProperties({ - value: AlertDialog.AlertTypes[0], - values: AlertDialog.AlertTypes - }).component(); + .withProperties({ + value: '', + values: AlertDialog.AlertTypes + }).component(); + this.initializeSqlServerEventAlert(view, databases); + }); + } - this.severityRadioButton = view.modelBuilder.radioButton() - .withProperties({ - value: 'serverity', - name: 'alertTypeOptions', - label: AlertDialog.SeverityLabel, - checked: true - }).component(); + private async initializeSqlServerPerformanceConditionAlert(view: sqlops.ModelView) { + this.objectDropDown = view.modelBuilder.dropDown() + .withProperties({ + value: '', + values: AlertDialog.ObjectDropdownOptions + }).component(); + this.performanceConditionAlertFormModel = view.modelBuilder.formContainer() + .withFormItems([{ + component: this.nameTextBox, + title: AlertDialog.NameLabel + }, { + component: this.typeDropDown, + title: AlertDialog.TypeLabel + }, { + component: this.objectDropDown, + title: 'Object' + }]).component(); + } - this.severityDropDown = view.modelBuilder.dropDown() - .withProperties({ - value: AlertDialog.AlertSeverities[0], - values: AlertDialog.AlertSeverities - }).component(); + private async initializeSqlServerEventAlert(view: sqlops.ModelView, databases: string[]) { + this.databaseDropDown = view.modelBuilder.dropDown() + .withProperties({ + value: databases[0], + values: databases + }).component(); - this.errorNumberRadioButton = view.modelBuilder.radioButton() - .withProperties({ - value: 'errorNumber', - name: 'alertTypeOptions', - label: AlertDialog.ErrorNumberLabel - }).component(); + this.severityDropDown = view.modelBuilder.dropDown() + .withProperties({ + value: AlertDialog.AlertSeverities[0], + values: AlertDialog.AlertSeverities, + width: 320 + }).component(); - this.errorNumberTextBox = view.modelBuilder.inputBox().component(); + let severityFormContainer = view.modelBuilder.formContainer() + .withFormItems([{ + component: this.severityDropDown, + title: '' + }]).component(); - this.errorNumberRadioButton.onDidClick(() => { - this.errorNumberTextBox.enabled = true; - this.severityDropDown.enabled = false; - }); + this.severityRadioButton = view.modelBuilder.radioButton() + .withProperties({ + value: 'Severity', + name: 'radioButtonOptions', + label: AlertDialog.SeverityLabel + }).component(); - this.severityRadioButton.onDidClick(() => { - this.errorNumberTextBox.enabled = false; - this.severityDropDown.enabled = true; - }); + this.severityRadioButton.checked = true; + this.severityDropDown.enabled = true; - this.raiseAlertMessageCheckBox = view.modelBuilder.checkBox() - .withProperties({ - label: AlertDialog.RaiseIfMessageContainsLabel - }).component(); + this.severityRadioButton.onDidClick(() => { + this.errorNumberTextBox.enabled = false; + this.errorNumberRadioButton.checked = false; + this.severityDropDown.enabled = true; + }); - this.raiseAlertMessageTextBox = view.modelBuilder.inputBox().component(); - this.raiseAlertMessageTextBox.enabled = false; + this.errorNumberTextBox = view.modelBuilder.inputBox() + .withProperties({ + inputType: 'text', + placeHolder: '1', + width: 320 + }).component(); - this.raiseAlertMessageCheckBox.onChanged(() => { - this.raiseAlertMessageTextBox.enabled = this.raiseAlertMessageCheckBox.checked; - }); + let errorNumberFormContainer = view.modelBuilder.formContainer() + .withFormItems([{ + component: this.errorNumberTextBox, + title: '' + }]).component(); - let formModel = view.modelBuilder.formContainer() - .withFormItems([{ - component: this.nameTextBox, - title: AlertDialog.NameLabel - }, { - component: this.enabledCheckBox, - title: '' - }, { - component: this.typeDropDown, - title: AlertDialog.TypeLabel - }, { - component: this.databaseDropDown, - title: AlertDialog.DatabaseLabel - }, - { - component: this.severityRadioButton, - title: '' - }, - { - component: this.severityDropDown, - title: '' - }, - { - component: this.errorNumberRadioButton, - title: '' - }, - { - component: this.errorNumberTextBox, - title: '' - }, - { - component: this.raiseAlertMessageCheckBox, - title: '' - }, { - component: this.raiseAlertMessageTextBox, - title: AlertDialog.MessageTextLabel - } - ]).withLayout({ width: '100%' }).component(); + this.errorNumberRadioButton = view.modelBuilder.radioButton() + .withProperties({ + value: 'Error Number', + name: 'radioButtonOptions', + label: AlertDialog.ErrorNumberLabel + }).component(); - await view.initializeModel(formModel); + this.errorNumberRadioButton.checked = false; + this.errorNumberRadioButton.onDidClick(() => { + this.severityRadioButton.checked = false; + this.errorNumberTextBox.enabled = true; + this.severityDropDown.enabled = false; + }); + + this.raiseAlertMessageCheckBox = view.modelBuilder.checkBox() + .withProperties({ + label: AlertDialog.RaiseIfMessageContainsLabel + }).component(); + + this.raiseAlertMessageTextBox = view.modelBuilder.inputBox() + .withProperties({ + width: 320 + }) + .component(); + this.raiseAlertMessageTextBox.enabled = false; + let raiseAlertMessageContainer = view.modelBuilder.formContainer() + .withFormItems([{ + component: this.raiseAlertMessageTextBox, + title: AlertDialog.MessageTextLabel + }]) + .component(); + + this.raiseAlertMessageCheckBox.onChanged(() => { + if (this.raiseAlertMessageCheckBox.checked) { + this.raiseAlertMessageTextBox.enabled = true; + } else { + this.raiseAlertMessageTextBox.enabled = false; + } // initialize control values this.nameTextBox.value = this.model.name; this.raiseAlertMessageTextBox.value = this.model.eventDescriptionKeyword; @@ -299,6 +392,40 @@ export class AlertDialog extends AgentDialog { } } }); + let flexRadioButtonContainer = view.modelBuilder.flexContainer() + .withLayout({ + flexFlow: 'column' + }).withItems([this.errorNumberRadioButton, errorNumberFormContainer, + this.severityRadioButton, severityFormContainer, this.raiseAlertMessageCheckBox, + raiseAlertMessageContainer]) + .component(); + + this.eventAlertFormModel = view.modelBuilder.formContainer() + .withFormItems([{ + component: this.nameTextBox, + title: AlertDialog.NameLabel + }, { + component: this.enabledCheckBox, + title: '' + }, { + component: this.typeDropDown, + title: AlertDialog.TypeLabel + }, { + component: this.databaseDropDown, + title: AlertDialog.DatabaseLabel + }, { + component: flexRadioButtonContainer, + title: '' + } + ]).withLayout({ width: '100%' }).component(); + + let flexModel = view.modelBuilder.flexContainer() + .withItems([this.eventAlertFormModel]).component(); + + await view.initializeModel(flexModel); + + this.nameTextBox.value = this.model.name; + this.enabledCheckBox.checked = this.model.isEnabled; } private initializeResponseTab() { @@ -308,12 +435,39 @@ export class AlertDialog extends AgentDialog { label: AlertDialog.ExecuteJobCheckBoxLabel }).component(); - this.executeJobTextBox = view.modelBuilder.inputBox().component(); + this.executeJobDropdown = view.modelBuilder.dropDown() + .withProperties({ + value: this.jobs[0], + values: this.jobs, + width: 380 + }).component(); + this.executeJobDropdown.editable = true; + this.executeJobDropdown.enabled = false; this.newJobButton = view.modelBuilder.button().withProperties({ label: AlertDialog.NewJobButtonLabel, width: 80 }).component(); + this.newJobButton.enabled = false; + + let executeJobContainer = view.modelBuilder.formContainer() + .withFormItems([{ + component: this.executeJobDropdown, + title: AlertDialog.ExecuteJobTextBoxLabel + },{ component: this.newJobButton, + title: '' + }]) + .component(); + + this.executeJobCheckBox.onChanged(() => { + if (this.executeJobCheckBox.checked) { + this.executeJobDropdown.enabled = true; + this.newJobButton.enabled = true; + } else { + this.executeJobDropdown.enabled = false; + this.newJobButton.enabled = false; + } + }); this.notifyOperatorsCheckBox = view.modelBuilder.checkBox() .withProperties({ @@ -328,31 +482,49 @@ export class AlertDialog extends AgentDialog { AlertDialog.OperatorPagerColumnLabel ], data: [], - height: 500 + height: 500, + width: 380 }).component(); this.newOperatorButton = view.modelBuilder.button().withProperties({ - label: this.newOperatorButton, + label: AlertDialog.NewOperatorButtonLabel, width: 80 }).component(); + this.operatorsTable.enabled = false; + this.newOperatorButton.enabled = false; + + let operatorContainer = view.modelBuilder.formContainer() + .withFormItems([{ + component: this.operatorsTable, + title: AlertDialog.OperatorListLabel + }, { + component: this.newOperatorButton, + title: '' + }]) + .component(); + + this.notifyOperatorsCheckBox.onChanged(() => { + if (this.notifyOperatorsCheckBox.checked) { + this.operatorsTable.enabled = true; + this.newOperatorButton.enabled = true; + } else { + this.operatorsTable.enabled = false; + this.newOperatorButton.enabled = false; + } + }); + + let flexModel = view.modelBuilder.flexContainer() + .withLayout({ + flexFlow: 'column' + }) + .withItems([this.executeJobCheckBox, executeJobContainer, this.notifyOperatorsCheckBox, operatorContainer]) + .component(); + let formModel = view.modelBuilder.formContainer() .withFormItems([{ - component: this.executeJobCheckBox, + component: flexModel, title: '' - }, { - component: this.executeJobTextBox, - title: AlertDialog.ExecuteJobTextBoxLabel - }, { - component: this.newJobButton, - title: AlertDialog.NewJobButtonLabel - }, { - component: this.notifyOperatorsCheckBox, - title: '' - }, { - component: this.operatorsTable, - title: AlertDialog.OperatorListLabel, - actions: [this.newOperatorButton] }]).withLayout({ width: '100%' }).component(); await view.initializeModel(formModel); @@ -372,11 +544,29 @@ export class AlertDialog extends AgentDialog { label: AlertDialog.IncludeErrorInPagerCheckBoxLabel }).component(); - this.additionalMessageTextBox = view.modelBuilder.inputBox().component(); + this.additionalMessageTextBox = view.modelBuilder.inputBox() + .withProperties({ + multiline: true, + height: 150, + inputType: 'text' + }) + .component(); - this.delayMinutesTextBox = view.modelBuilder.inputBox().component(); + this.delayMinutesTextBox = view.modelBuilder.inputBox() + .withValidation(component => +component.value >= 0) + .withProperties({ + inputType: 'number' + }) + .component(); + this.delayMinutesTextBox.required = true; - this.delaySecondsTextBox = view.modelBuilder.inputBox().component(); + this.delaySecondsTextBox = view.modelBuilder.inputBox() + .withValidation(component => +component.value >= 0) + .withProperties({ + inputType: 'number' + }) + .component(); + this.delaySecondsTextBox.required = true; let formModel = view.modelBuilder.formContainer() .withFormItems([{ @@ -408,6 +598,11 @@ export class AlertDialog extends AgentDialog { if (index >= 0) { severityNumber = index + 1; } + } else { + let errorNumber = +this.errorNumberTextBox.value; + if (errorNumber) { + severityNumber = errorNumber; + } } return severityNumber; } @@ -415,7 +610,6 @@ export class AlertDialog extends AgentDialog { protected updateModel() { this.model.name = this.nameTextBox.value; this.model.isEnabled = this.enabledCheckBox.checked; - this.model.alertType = this.getDropdownValue(this.typeDropDown); let databaseName = this.getDropdownValue(this.databaseDropDown); this.model.databaseName = (databaseName !== AlertDialog.AllDatabases) ? databaseName : undefined; @@ -433,5 +627,7 @@ export class AlertDialog extends AgentDialog { } else { this.model.eventDescriptionKeyword = ''; } + this.model.notificationMessage = this.additionalMessageTextBox.value; + this.model.delayBetweenResponses = +this.delayMinutesTextBox.value * 60 + +this.delaySecondsTextBox.value; } } diff --git a/extensions/agent/src/dialogs/jobDialog.ts b/extensions/agent/src/dialogs/jobDialog.ts index add86fafb2..1bbc126171 100644 --- a/extensions/agent/src/dialogs/jobDialog.ts +++ b/extensions/agent/src/dialogs/jobDialog.ts @@ -240,7 +240,7 @@ export class JobDialog extends AgentDialog { }).component(); this.newAlertButton.onDidClick((e)=>{ - let alertDialog = new AlertDialog(this.model.ownerUri); + let alertDialog = new AlertDialog(this.model.ownerUri, null, []); alertDialog.onSuccess((dialogModel) => { }); alertDialog.openDialog(); diff --git a/extensions/agent/src/mainController.ts b/extensions/agent/src/mainController.ts index 81d62475e7..8216fed1fb 100644 --- a/extensions/agent/src/mainController.ts +++ b/extensions/agent/src/mainController.ts @@ -39,8 +39,8 @@ export class MainController { let dialog = new PickScheduleDialog(ownerUri); dialog.showDialog(); }); - vscode.commands.registerCommand('agent.openAlertDialog', (ownerUri: string, alertInfo: sqlops.AgentAlertInfo) => { - let dialog = new AlertDialog(ownerUri, alertInfo); + vscode.commands.registerCommand('agent.openAlertDialog', (ownerUri: string, alertInfo: sqlops.AgentAlertInfo, jobs: string[]) => { + let dialog = new AlertDialog(ownerUri, alertInfo, jobs); dialog.openDialog(); }); vscode.commands.registerCommand('agent.openOperatorDialog', (ownerUri: string, operatorInfo: sqlops.AgentOperatorInfo) => { diff --git a/src/sql/parts/jobManagement/agent/agentView.component.ts b/src/sql/parts/jobManagement/agent/agentView.component.ts index 8634879fb1..f47fb63e20 100644 --- a/src/sql/parts/jobManagement/agent/agentView.component.ts +++ b/src/sql/parts/jobManagement/agent/agentView.component.ts @@ -7,16 +7,8 @@ import 'vs/css!../common/media/jobs'; import 'sql/parts/dashboard/common/dashboardPanelStyles'; import * as nls from 'vs/nls'; -import { Component, Inject, forwardRef, ElementRef, ChangeDetectorRef, ViewChild, Injectable } from '@angular/core'; -import * as Utils from 'sql/parts/connection/common/utils'; -import { RefreshWidgetAction, EditDashboardAction } from 'sql/parts/dashboard/common/actions'; -import { IColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import * as themeColors from 'vs/workbench/common/theme'; -import { DashboardPage } from 'sql/parts/dashboard/common/dashboardPage.component'; -import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service'; -import { AgentJobInfo, AgentJobHistoryInfo } from 'sqlops'; +import { Component, Inject, forwardRef, ChangeDetectorRef, ViewChild, Injectable } from '@angular/core'; +import { AgentJobInfo } from 'sqlops'; import { PanelComponent, IPanelOptions, NavigationBarLayout } from 'sql/base/browser/ui/panel/panel.component'; import { IJobManagementService } from 'sql/parts/jobManagement/common/interfaces'; @@ -32,12 +24,6 @@ export class AgentViewComponent { @ViewChild(PanelComponent) private _panel: PanelComponent; - // tslint:disable:no-unused-variable - private readonly jobsComponentTitle: string = nls.localize('jobview.Jobs', "Jobs"); - private readonly alertsComponentTitle: string = nls.localize('jobview.Alerts', "Alerts"); - private readonly proxiesComponentTitle: string = nls.localize('jobview.Proxies', "Proxies"); - private readonly operatorsComponentTitle: string = nls.localize('jobview.Operators', "Operators"); - private _showHistory: boolean = false; private _jobId: string = null; private _agentJobInfo: AgentJobInfo = null; @@ -49,6 +35,11 @@ export class AgentViewComponent { public proxiesIconClass: string = 'proxiesview-icon'; public operatorsIconClass: string = 'operatorsview-icon'; + private readonly jobsComponentTitle: string = nls.localize('jobview.Jobs', "Jobs"); + private readonly alertsComponentTitle: string = nls.localize('jobview.Alerts', "Alerts"); + private readonly proxiesComponentTitle: string = nls.localize('jobview.Proxies', "Proxies"); + private readonly operatorsComponentTitle: string = nls.localize('jobview.Operators', "Operators"); + // tslint:disable-next-line:no-unused-variable private readonly panelOpt: IPanelOptions = { showTabsWhenOne: true, diff --git a/src/sql/parts/jobManagement/views/alertsView.component.ts b/src/sql/parts/jobManagement/views/alertsView.component.ts index 8988c8d4f5..7301e24e18 100644 --- a/src/sql/parts/jobManagement/views/alertsView.component.ts +++ b/src/sql/parts/jobManagement/views/alertsView.component.ts @@ -164,7 +164,17 @@ export class AlertsViewComponent extends JobManagementView implements OnInit { public openCreateAlertDialog() { let ownerUri: string = this._commonService.connectionManagementService.connectionInfo.ownerUri; - this._commandService.executeCommand('agent.openAlertDialog', ownerUri); + this._jobManagementService.getJobs(ownerUri).then((result) => { + if (result && result.jobs.length > 0) { + let jobs = []; + result.jobs.forEach(job => { + jobs.push(job.name); + }); + this._commandService.executeCommand('agent.openAlertDialog', ownerUri, null, jobs); + } else { + this._commandService.executeCommand('agent.openAlertDialog', ownerUri, null, null); + } + }); } private refreshJobs() {