diff --git a/src/sql/parts/notebook/models/modelInterfaces.ts b/src/sql/parts/notebook/models/modelInterfaces.ts index a80e26ad04..116f7a8584 100644 --- a/src/sql/parts/notebook/models/modelInterfaces.ts +++ b/src/sql/parts/notebook/models/modelInterfaces.ts @@ -378,6 +378,9 @@ export interface INotebookModel { pushEditOperations(edits: ISingleNotebookEditOperation[]): void; getApplicableConnectionProviderIds(kernelName: string): string[]; + + /** Event fired once we get call back from ConfigureConnection method in sqlops extension */ + readonly onValidConnectionSelected: Event; } export interface NotebookContentChange { diff --git a/src/sql/parts/notebook/models/notebookModel.ts b/src/sql/parts/notebook/models/notebookModel.ts index a8879ef234..9b095b0dd4 100644 --- a/src/sql/parts/notebook/models/notebookModel.ts +++ b/src/sql/parts/notebook/models/notebookModel.ts @@ -66,6 +66,7 @@ export class NotebookModel extends Disposable implements INotebookModel { private _defaultKernel: nb.IKernelSpec; private _kernelDisplayNameToConnectionProviderIds: Map = new Map(); private _kernelDisplayNameToNotebookProviderIds: Map = new Map(); + private _onValidConnectionSelected = new Emitter(); constructor(private notebookOptions: INotebookModelOptions, startSessionImmediately?: boolean, private connectionProfile?: IConnectionProfile) { super(); @@ -229,6 +230,10 @@ export class NotebookModel extends Disposable implements INotebookModel { return this._onProviderIdChanged.event; } + public get onValidConnectionSelected(): Event{ + return this._onValidConnectionSelected.event; + } + public getApplicableConnectionProviderIds(kernelDisplayName: string): string[] { let ids = []; if (kernelDisplayName) { @@ -451,11 +456,18 @@ export class NotebookModel extends Disposable implements INotebookModel { let newConnectionProfile = new ConnectionProfile(this.notebookOptions.capabilitiesService, newConnection); this._activeConnection = newConnectionProfile; this.refreshConnections(newConnectionProfile); - this._activeClientSession.updateConnection(this._activeConnection.toIConnectionProfile()).catch((error) => { - if (error) { - this.notifyError(error.message); - } - }); + this._activeClientSession.updateConnection(this._activeConnection.toIConnectionProfile()).then( + result => { + //Remove 'Select connection' from 'Attach to' drop-down since its a valid connection + this._onValidConnectionSelected.fire(true); + }, + error => { + if (error) { + this.notifyError(notebookUtils.getErrorMessage(error)); + //Selected a wrong connection, Attach to should be defaulted with 'Select connection' + this._onValidConnectionSelected.fire(false); + } + }); } catch (err) { let msg = notebookUtils.getErrorMessage(err); this.notifyError(localize('changeContextFailed', 'Changing context failed: {0}', msg)); diff --git a/src/sql/parts/notebook/notebookActions.ts b/src/sql/parts/notebook/notebookActions.ts index a2f13b9222..b546aba939 100644 --- a/src/sql/parts/notebook/notebookActions.ts +++ b/src/sql/parts/notebook/notebookActions.ts @@ -215,8 +215,11 @@ export class AttachToDropdown extends SelectBox { super([msgLoadingContexts], msgLoadingContexts, contextViewProvider, container, { labelText: attachToLabel, labelOnTop: false } as ISelectBoxOptionsWithLabel); if (modelRegistered) { modelRegistered - .then((model) => this.updateModel(model)) - .catch((err) => { + .then(model => { + this.updateModel(model); + this.updateAttachToDropdown(model); + }) + .catch(err => { // No-op for now }); } @@ -229,16 +232,37 @@ export class AttachToDropdown extends SelectBox { public updateModel(model: INotebookModel): void { this.model = model; model.contextsChanged(() => { - if (this.model.clientSession.kernel && this.model.clientSession.kernel.name) { - let nameLower = this.model.clientSession.kernel.name.toLowerCase(); - let currentKernelSpec = this.model.specs.kernels.find(kernel => kernel.name && kernel.name.toLowerCase() === nameLower); - this.loadAttachToDropdown(this.model, currentKernelSpec.display_name); + let kernelDisplayName: string = this.getKernelDisplayName(); + if (kernelDisplayName) { + this.loadAttachToDropdown(this.model, kernelDisplayName); } }); } + private updateAttachToDropdown(model: INotebookModel): void { + this.model = model; + model.onValidConnectionSelected(validConnection => { + let kernelDisplayName: string = this.getKernelDisplayName(); + if (kernelDisplayName) { + this.loadAttachToDropdown(this.model, kernelDisplayName, !validConnection); + } + }); + } + + private getKernelDisplayName(): string { + let kernelDisplayName: string; + if (this.model.clientSession && this.model.clientSession.kernel && this.model.clientSession.kernel.name) { + let currentKernelName = this.model.clientSession.kernel.name.toLowerCase(); + let currentKernelSpec = this.model.specs.kernels.find(kernel => kernel.name && kernel.name.toLowerCase() === currentKernelName); + if (currentKernelSpec) { + kernelDisplayName = currentKernelSpec.display_name; + } + } + return kernelDisplayName; + } + // Load "Attach To" dropdown with the values corresponding to Kernel dropdown - public async loadAttachToDropdown(model: INotebookModel, currentKernel: string): Promise { + public async loadAttachToDropdown(model: INotebookModel, currentKernel: string, showSelectConnection?: boolean): Promise { let connProviderIds = this.model.getApplicableConnectionProviderIds(currentKernel); if ((connProviderIds && connProviderIds.length === 0) || currentKernel === noKernel) { this.setOptions([msgLocalHost]); @@ -246,16 +270,30 @@ export class AttachToDropdown extends SelectBox { else { let connections = this.getConnections(model); this.enable(); - if (connections.length === 1 && connections[0] === msgAddNewConnection) { - connections.unshift(msgSelectConnection); - this.selectWithOptionName(msgSelectConnection); + if (showSelectConnection) { + connections = this.loadWithSelectConnection(connections); } else { - connections.push(msgAddNewConnection); + if (connections.length === 1 && connections[0] === msgAddNewConnection) { + connections.unshift(msgSelectConnection); + this.selectWithOptionName(msgSelectConnection); + } + else { + connections.push(msgAddNewConnection); + } } this.setOptions(connections); } + } + private loadWithSelectConnection(connections: string[]): string[] { + if (connections && connections.length > 0) { + connections.unshift(msgSelectConnection); + this.selectWithOptionName(msgSelectConnection); + connections.push(msgAddNewConnection); + this.setOptions(connections); + } + return connections; } //Get connections from context diff --git a/src/sqltest/parts/notebook/common.ts b/src/sqltest/parts/notebook/common.ts index f866582ce1..7e1e65b42e 100644 --- a/src/sqltest/parts/notebook/common.ts +++ b/src/sqltest/parts/notebook/common.ts @@ -89,7 +89,11 @@ export class NotebookModelStub implements INotebookModel { } getApplicableConnectionProviderIds(kernelName: string): string[] { throw new Error('Method not implemented.'); - } + } + get onValidConnectionSelected(): Event + { + throw new Error('method not implemented.'); + } } export class NotebookManagerStub implements INotebookManager {