Notebook fixes: Fix #4129, fix #4116, Fix #3913, fix empty results error (#4150)

- Fixes #4129 Overlapping command help windows in notebook
  - Do not show parameter hints for inactive cells, to avoid them hanging around when no longer selected
- Fixes #4116 Notebooks: Intellisense Doesn't Work using Add New Connection
  - Move connect/disconnect logic to 1 place (code component) instead of 2
  - Handle the case where you connect after choosing active cell. We now hook to the event and update connection
- Fix issues in sql session manager where result outputs 0 rows. This was failing to show the empty resultset contents, which is a regression vs. query editor. It also put unhandled error on the debug console
- Fix #3913 Notebook: words selected in other cells should be unselected on cell change

Note: after fix, now looks as follows. Need to do follow up to get correct grid min height

![image](https://user-images.githubusercontent.com/10819925/53280226-9e629580-36cc-11e9-8f40-59cd913caeee.png)
This commit is contained in:
Kevin Cunnane
2019-02-25 10:52:07 -08:00
committed by GitHub
parent f2c9d968a4
commit 2ae369fbdb
4 changed files with 72 additions and 37 deletions

View File

@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import 'vs/css!./code';
import { OnInit, Component, Input, Inject, forwardRef, ElementRef, ChangeDetectorRef, ViewChild, Output, EventEmitter, OnChanges, SimpleChange } from '@angular/core';
import { OnInit, Component, Input, Inject, ElementRef, ViewChild, Output, EventEmitter, OnChanges, SimpleChange } from '@angular/core';
import { AngularDisposable } from 'sql/base/node/lifecycle';
import { QueryTextEditor } from 'sql/parts/modelComponents/queryTextEditor';
@@ -32,6 +32,7 @@ import { CellTypes } from 'sql/parts/notebook/models/contracts';
import { OVERRIDE_EDITOR_THEMING_SETTING } from 'sql/workbench/services/notebook/common/notebookService';
import * as notebookUtils from 'sql/parts/notebook/notebookUtils';
import { UntitledEditorModel } from 'vs/workbench/common/editor/untitledEditorModel';
import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement';
export const CODE_SELECTOR: string = 'code-component';
const MARKDOWN_CLASS = 'markdown';
@@ -67,6 +68,9 @@ export class CodeComponent extends AngularDisposable implements OnInit, OnChange
this.checkForLanguageMagics();
this.updateLanguageMode();
}));
this._register(value.onValidConnectionSelected(() => {
this.updateConnectionState(this.isActive());
}));
}
@Input() set activeCellId(value: string) {
@@ -105,6 +109,8 @@ export class CodeComponent extends AngularDisposable implements OnInit, OnChange
this._cellToggleMoreActions = this._instantiationService.createInstance(CellToggleMoreActions);
this._register(debounceEvent(this._layoutEmitter.event, (l, e) => e, 250, /*leading=*/false)
(() => this.layout()));
// Handle disconnect on removal of the cell, if it was the active cell
this._register({ dispose: () => this.updateConnectionState(false) });
}
@@ -121,11 +127,7 @@ export class CodeComponent extends AngularDisposable implements OnInit, OnChange
if (propName === 'activeCellId') {
let changedProp = changes[propName];
let isActive = this.cellModel.id === changedProp.currentValue;
if (isActive && this._model.defaultKernel.display_name === notebookConstants.SQL
&& this.cellModel.cellType === CellTypes.Code
&& this.cellModel.cellUri) {
this._model.notebookOptions.connectionService.connect(this._model.activeConnection, this.cellModel.cellUri.toString()).catch(e => console.log(e));
}
this.updateConnectionState(isActive);
this.toggleMoreActionsButton(isActive);
if (this._editor) {
this._editor.toggleEditorSelected(isActive);
@@ -135,6 +137,28 @@ export class CodeComponent extends AngularDisposable implements OnInit, OnChange
}
}
private updateConnectionState(isConnected: boolean) {
if (this.isSqlCodeCell()) {
let cellUri = this.cellModel.cellUri.toString();
let connectionService = this.connectionService;
if (!isConnected && connectionService && connectionService.isConnected(cellUri)) {
connectionService.disconnect(cellUri).catch(e => console.log(e));
} else if (this._model.activeConnection && this._model.activeConnection.id !== '-1') {
connectionService.connect(this._model.activeConnection, cellUri).catch(e => console.log(e));
}
}
}
private get connectionService(): IConnectionManagementService {
return this._model && this._model.notebookOptions && this._model.notebookOptions.connectionService;
}
private isSqlCodeCell() {
return this._model.defaultKernel.display_name === notebookConstants.SQL
&& this.cellModel.cellType === CellTypes.Code
&& this.cellModel.cellUri;
}
ngAfterContentInit(): void {
this.createEditor();
this._register(DOM.addDisposableListener(window, DOM.EventType.RESIZE, e => {