mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 18:46:40 -05:00
Refresh fix for Edit Data (#11710)
* hook in grid panel to edit data input through the editDataResultsInput * added then at end of refreshGrid to ensure cell reset happens after refresh. * abstraction * Timeout removed as its causing issues with refreshing * added await for dataRows * Added working timeout for refresh * removed spaces * added comment explaining isRefresh * Timeout set to 500 for better coverage. Co-authored-by: Amir Omidi <amomidi@microsoft.com> Co-authored-by: Anthony Dresser <andresse@microsoft.com>
This commit is contained in:
@@ -85,8 +85,10 @@ export class EditDataInput extends EditorInput implements IConnectableInput {
|
|||||||
|
|
||||||
this._register(
|
this._register(
|
||||||
this._queryModelService.onEditSessionReady((result) => {
|
this._queryModelService.onEditSessionReady((result) => {
|
||||||
if (self.uri === result.ownerUri) {
|
if (this.uri === result.ownerUri) {
|
||||||
self.initEditEnd(result);
|
this._results.editDataGridPanel.onRefreshComplete.then(() => {
|
||||||
|
this.initEditEnd(result);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ import { EditorInput } from 'vs/workbench/common/editor';
|
|||||||
import { Emitter } from 'vs/base/common/event';
|
import { Emitter } from 'vs/base/common/event';
|
||||||
import { URI } from 'vs/base/common/uri';
|
import { URI } from 'vs/base/common/uri';
|
||||||
|
|
||||||
|
export interface IGridPanel {
|
||||||
|
readonly onRefreshComplete: Promise<void>;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Input for the EditDataResultsEditor. This input helps with logic for the viewing and editing of
|
* Input for the EditDataResultsEditor. This input helps with logic for the viewing and editing of
|
||||||
* data in the results grid.
|
* data in the results grid.
|
||||||
@@ -25,6 +29,7 @@ export class EditDataResultsInput extends EditorInput {
|
|||||||
|
|
||||||
public readonly onRestoreViewStateEmitter = new Emitter<void>();
|
public readonly onRestoreViewStateEmitter = new Emitter<void>();
|
||||||
public readonly onSaveViewStateEmitter = new Emitter<void>();
|
public readonly onSaveViewStateEmitter = new Emitter<void>();
|
||||||
|
private _editDataGridPanel: IGridPanel;
|
||||||
|
|
||||||
constructor(private _uri: string) {
|
constructor(private _uri: string) {
|
||||||
super();
|
super();
|
||||||
@@ -32,6 +37,14 @@ export class EditDataResultsInput extends EditorInput {
|
|||||||
this._hasBootstrapped = false;
|
this._hasBootstrapped = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get editDataGridPanel(): IGridPanel {
|
||||||
|
return this._editDataGridPanel;
|
||||||
|
}
|
||||||
|
|
||||||
|
set editDataGridPanel(gridPanel: IGridPanel) {
|
||||||
|
this._editDataGridPanel = gridPanel;
|
||||||
|
}
|
||||||
|
|
||||||
getTypeId(): string {
|
getTypeId(): string {
|
||||||
return EditDataResultsInput.ID;
|
return EditDataResultsInput.ID;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ import { onUnexpectedError } from 'vs/base/common/errors';
|
|||||||
export class EditDataGridPanel extends GridParentComponent {
|
export class EditDataGridPanel extends GridParentComponent {
|
||||||
// The time(in milliseconds) we wait before refreshing the grid.
|
// The time(in milliseconds) we wait before refreshing the grid.
|
||||||
// We use clearTimeout and setTimeout pair to avoid unnecessary refreshes.
|
// We use clearTimeout and setTimeout pair to avoid unnecessary refreshes.
|
||||||
private refreshGridTimeoutInMs = 200;
|
// Timeout is set to allow the grid to refresh fully before allowing a manual refresh.
|
||||||
|
private refreshGridTimeoutInMs = 1000;
|
||||||
|
|
||||||
// The timeout handle for the refresh grid task
|
// The timeout handle for the refresh grid task
|
||||||
private refreshGridTimeoutHandle: any;
|
private refreshGridTimeoutHandle: any;
|
||||||
@@ -78,6 +79,7 @@ export class EditDataGridPanel extends GridParentComponent {
|
|||||||
public loadDataFunction: (offset: number, count: number) => Promise<{}[]>;
|
public loadDataFunction: (offset: number, count: number) => Promise<{}[]>;
|
||||||
public onBeforeAppendCell: (row: number, column: number) => string;
|
public onBeforeAppendCell: (row: number, column: number) => string;
|
||||||
public onGridRendered: (event: Slick.OnRenderedEventArgs<any>) => void;
|
public onGridRendered: (event: Slick.OnRenderedEventArgs<any>) => void;
|
||||||
|
public onRefreshComplete: Promise<void>;
|
||||||
|
|
||||||
private savedViewState: {
|
private savedViewState: {
|
||||||
gridSelections: Slick.Range[];
|
gridSelections: Slick.Range[];
|
||||||
@@ -132,7 +134,7 @@ export class EditDataGridPanel extends GridParentComponent {
|
|||||||
self.handleMessage(self, event);
|
self.handleMessage(self, event);
|
||||||
break;
|
break;
|
||||||
case 'resultSet':
|
case 'resultSet':
|
||||||
self.handleResultSet(self, event);
|
this.onRefreshComplete = self.handleResultSet(self, event);
|
||||||
break;
|
break;
|
||||||
case 'editSessionReady':
|
case 'editSessionReady':
|
||||||
self.handleEditSessionReady(self, event);
|
self.handleEditSessionReady(self, event);
|
||||||
@@ -358,7 +360,7 @@ export class EditDataGridPanel extends GridParentComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
handleResultSet(self: EditDataGridPanel, event: any): void {
|
async handleResultSet(self: EditDataGridPanel, event: any): Promise<void> {
|
||||||
// Clone the data before altering it to avoid impacting other subscribers
|
// Clone the data before altering it to avoid impacting other subscribers
|
||||||
let resultSet = assign({}, event.data);
|
let resultSet = assign({}, event.data);
|
||||||
if (!resultSet.complete) {
|
if (!resultSet.complete) {
|
||||||
@@ -385,7 +387,7 @@ export class EditDataGridPanel extends GridParentComponent {
|
|||||||
self.windowSize,
|
self.windowSize,
|
||||||
index => { return {}; },
|
index => { return {}; },
|
||||||
resultSet.rowCount,
|
resultSet.rowCount,
|
||||||
this.loadDataFunction,
|
await this.loadDataFunction,
|
||||||
),
|
),
|
||||||
columnDefinitions: [rowNumberColumn.getColumnDefinition()].concat(resultSet.columnInfo.map((c, i) => {
|
columnDefinitions: [rowNumberColumn.getColumnDefinition()].concat(resultSet.columnInfo.map((c, i) => {
|
||||||
let columnIndex = (i + 1).toString();
|
let columnIndex = (i + 1).toString();
|
||||||
@@ -410,14 +412,7 @@ export class EditDataGridPanel extends GridParentComponent {
|
|||||||
if (self.placeHolderDataSets[0]) {
|
if (self.placeHolderDataSets[0]) {
|
||||||
this.refreshDatasets();
|
this.refreshDatasets();
|
||||||
}
|
}
|
||||||
self.refreshGrid();
|
await self.refreshGrid(true);
|
||||||
|
|
||||||
// Setup the state of the selected cell
|
|
||||||
this.resetCurrentCell();
|
|
||||||
this.removingNewRow = false;
|
|
||||||
this.newRowVisible = false;
|
|
||||||
this.dirtyCells = [];
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -440,7 +435,11 @@ export class EditDataGridPanel extends GridParentComponent {
|
|||||||
return inputStr.replace(/(\r\n|\n|\r)/g, '\u0000');
|
return inputStr.replace(/(\r\n|\n|\r)/g, '\u0000');
|
||||||
}
|
}
|
||||||
|
|
||||||
private refreshGrid(): Thenable<void> {
|
/**
|
||||||
|
* Code that handles the refresh of the grid.
|
||||||
|
* @param isManual flag used when called by handleResultSet, for required additional processing.
|
||||||
|
*/
|
||||||
|
private refreshGrid(isManual?: boolean): Thenable<void> {
|
||||||
return new Promise<void>(async (resolve, reject) => {
|
return new Promise<void>(async (resolve, reject) => {
|
||||||
|
|
||||||
clearTimeout(this.refreshGridTimeoutHandle);
|
clearTimeout(this.refreshGridTimeoutHandle);
|
||||||
@@ -462,11 +461,18 @@ export class EditDataGridPanel extends GridParentComponent {
|
|||||||
this.logService.error('data set is empty, refresh cancelled.');
|
this.logService.error('data set is empty, refresh cancelled.');
|
||||||
reject();
|
reject();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.firstRender) {
|
if (this.firstRender) {
|
||||||
setTimeout(() => this.setActive());
|
this.resetCurrentCell();
|
||||||
|
this.setActive();
|
||||||
}
|
}
|
||||||
resolve();
|
else if (isManual) {
|
||||||
|
this.resetCurrentCell();
|
||||||
|
this.removingNewRow = false;
|
||||||
|
this.newRowVisible = false;
|
||||||
|
this.dirtyCells = [];
|
||||||
|
}
|
||||||
|
//allow for the grid to render fully before returning.
|
||||||
|
setTimeout(() => resolve(), 500);
|
||||||
}, this.refreshGridTimeoutInMs);
|
}, this.refreshGridTimeoutInMs);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,6 +105,7 @@ export class EditDataResultsEditor extends BaseEditor {
|
|||||||
// to events from the backing data service
|
// to events from the backing data service
|
||||||
this._applySettings();
|
this._applySettings();
|
||||||
let editGridPanel = this._register(this._instantiationService.createInstance(EditDataGridPanel, dataService, input.onSaveViewStateEmitter.event, input.onRestoreViewStateEmitter.event));
|
let editGridPanel = this._register(this._instantiationService.createInstance(EditDataGridPanel, dataService, input.onSaveViewStateEmitter.event, input.onRestoreViewStateEmitter.event));
|
||||||
|
input.editDataGridPanel = editGridPanel;
|
||||||
editGridPanel.render(this.getContainer());
|
editGridPanel.render(this.getContainer());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user