mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-27 17:23:21 -05:00
* Fix #3439 Trusted doesn't get saved in Notebooks The main fix is to add a memento to store trust information. This is only needed for saved files - untitled files are always trusted as the user created them. On clicking trusted or saving a file, the trusted state is cached. In the future, we will also handle code execution here too by sending notification on snapshot state. I found issue #5506 during testing - existing issue where we should track trusted state changing on run. In the case all cells are ran, the whole notebook should become trusted. Finally, I did a decent amount of refactoring to move more logic to the model - removing unnecessary calls from components which duplicated model behavior, moving trust notification to the model or at least the notebook service completely. Added tests and logging for catch handling
105 lines
3.7 KiB
TypeScript
105 lines
3.7 KiB
TypeScript
/*---------------------------------------------------------------------------------------------
|
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
|
*--------------------------------------------------------------------------------------------*/
|
|
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
|
|
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
|
import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor';
|
|
import { EditorOptions } from 'vs/workbench/common/editor';
|
|
import * as DOM from 'vs/base/browser/dom';
|
|
import { bootstrapAngular } from 'sql/platform/bootstrap/node/bootstrapService';
|
|
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
|
|
|
|
import { CancellationToken } from 'vs/base/common/cancellation';
|
|
import { NotebookInput } from 'sql/workbench/parts/notebook/notebookInput';
|
|
import { NotebookModule } from 'sql/workbench/parts/notebook/notebook.module';
|
|
import { NOTEBOOK_SELECTOR } from 'sql/workbench/parts/notebook/notebook.component';
|
|
import { INotebookParams } from 'sql/workbench/services/notebook/common/notebookService';
|
|
import { IStorageService } from 'vs/platform/storage/common/storage';
|
|
|
|
export class NotebookEditor extends BaseEditor {
|
|
|
|
public static ID: string = 'workbench.editor.notebookEditor';
|
|
private _notebookContainer: HTMLElement;
|
|
|
|
constructor(
|
|
@ITelemetryService telemetryService: ITelemetryService,
|
|
@IThemeService themeService: IThemeService,
|
|
@IInstantiationService private instantiationService: IInstantiationService,
|
|
@IStorageService storageService: IStorageService
|
|
) {
|
|
super(NotebookEditor.ID, telemetryService, themeService, storageService);
|
|
}
|
|
|
|
public get notebookInput(): NotebookInput {
|
|
return this.input as NotebookInput;
|
|
}
|
|
|
|
/**
|
|
* Called to create the editor in the parent element.
|
|
*/
|
|
public createEditor(parent: HTMLElement): void {
|
|
}
|
|
|
|
/**
|
|
* Sets focus on this editor. Specifically, it sets the focus on the hosted text editor.
|
|
*/
|
|
public focus(): void {
|
|
}
|
|
|
|
/**
|
|
* Updates the internal variable keeping track of the editor's size, and re-calculates the sash position.
|
|
* To be called when the container of this editor changes size.
|
|
*/
|
|
public layout(dimension: DOM.Dimension): void {
|
|
if (this.notebookInput) {
|
|
this.notebookInput.doChangeLayout();
|
|
}
|
|
}
|
|
|
|
public setInput(input: NotebookInput, options: EditorOptions): Promise<void> {
|
|
if (this.input && this.input.matches(input)) {
|
|
return Promise.resolve(undefined);
|
|
}
|
|
|
|
const parentElement = this.getContainer();
|
|
|
|
super.setInput(input, options, CancellationToken.None);
|
|
|
|
DOM.clearNode(parentElement);
|
|
|
|
if (!input.hasBootstrapped) {
|
|
let container = DOM.$<HTMLElement>('.notebookEditor');
|
|
container.style.height = '100%';
|
|
this._notebookContainer = DOM.append(parentElement, container);
|
|
input.container = this._notebookContainer;
|
|
return Promise.resolve(this.bootstrapAngular(input));
|
|
} else {
|
|
this._notebookContainer = DOM.append(parentElement, input.container);
|
|
input.doChangeLayout();
|
|
return Promise.resolve(null);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Load the angular components and record for this input that we have done so
|
|
*/
|
|
private bootstrapAngular(input: NotebookInput): void {
|
|
// Get the bootstrap params and perform the bootstrap
|
|
input.hasBootstrapped = true;
|
|
let params: INotebookParams = {
|
|
notebookUri: input.notebookUri,
|
|
input: input,
|
|
providerInfo: input.getProviderInfo(),
|
|
profile: input.connectionProfile
|
|
};
|
|
bootstrapAngular(this.instantiationService,
|
|
NotebookModule,
|
|
this._notebookContainer,
|
|
NOTEBOOK_SELECTOR,
|
|
params,
|
|
input
|
|
);
|
|
}
|
|
}
|