Agent: Updated Alerts dialog UI (#1874)

* finished alert dialog UI

* removed unused import
This commit is contained in:
Aditya Bist
2018-07-10 14:21:58 -07:00
committed by GitHub
parent 0b1e9c7c66
commit 4eea24997f
5 changed files with 329 additions and 132 deletions

View File

@@ -111,26 +111,89 @@ export class AlertDialog extends AgentDialog<AlertData> {
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<AlertData> {
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<AlertData> {
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<AlertData> {
}
}
});
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<AlertData> {
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<AlertData> {
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<AlertData> {
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<AlertData> {
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<AlertData> {
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<AlertData> {
} else {
this.model.eventDescriptionKeyword = '';
}
this.model.notificationMessage = this.additionalMessageTextBox.value;
this.model.delayBetweenResponses = +this.delayMinutesTextBox.value * 60 + +this.delaySecondsTextBox.value;
}
}

View File

@@ -240,7 +240,7 @@ export class JobDialog extends AgentDialog<JobData> {
}).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();

View File

@@ -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) => {