mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-22 01:25:38 -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._queryModelService.onEditSessionReady((result) => {
|
||||
if (self.uri === result.ownerUri) {
|
||||
self.initEditEnd(result);
|
||||
if (this.uri === result.ownerUri) {
|
||||
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 { 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
|
||||
* data in the results grid.
|
||||
@@ -25,6 +29,7 @@ export class EditDataResultsInput extends EditorInput {
|
||||
|
||||
public readonly onRestoreViewStateEmitter = new Emitter<void>();
|
||||
public readonly onSaveViewStateEmitter = new Emitter<void>();
|
||||
private _editDataGridPanel: IGridPanel;
|
||||
|
||||
constructor(private _uri: string) {
|
||||
super();
|
||||
@@ -32,6 +37,14 @@ export class EditDataResultsInput extends EditorInput {
|
||||
this._hasBootstrapped = false;
|
||||
}
|
||||
|
||||
get editDataGridPanel(): IGridPanel {
|
||||
return this._editDataGridPanel;
|
||||
}
|
||||
|
||||
set editDataGridPanel(gridPanel: IGridPanel) {
|
||||
this._editDataGridPanel = gridPanel;
|
||||
}
|
||||
|
||||
getTypeId(): string {
|
||||
return EditDataResultsInput.ID;
|
||||
}
|
||||
|
||||
@@ -39,7 +39,8 @@ import { onUnexpectedError } from 'vs/base/common/errors';
|
||||
export class EditDataGridPanel extends GridParentComponent {
|
||||
// The time(in milliseconds) we wait before refreshing the grid.
|
||||
// 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
|
||||
private refreshGridTimeoutHandle: any;
|
||||
@@ -78,6 +79,7 @@ export class EditDataGridPanel extends GridParentComponent {
|
||||
public loadDataFunction: (offset: number, count: number) => Promise<{}[]>;
|
||||
public onBeforeAppendCell: (row: number, column: number) => string;
|
||||
public onGridRendered: (event: Slick.OnRenderedEventArgs<any>) => void;
|
||||
public onRefreshComplete: Promise<void>;
|
||||
|
||||
private savedViewState: {
|
||||
gridSelections: Slick.Range[];
|
||||
@@ -132,7 +134,7 @@ export class EditDataGridPanel extends GridParentComponent {
|
||||
self.handleMessage(self, event);
|
||||
break;
|
||||
case 'resultSet':
|
||||
self.handleResultSet(self, event);
|
||||
this.onRefreshComplete = self.handleResultSet(self, event);
|
||||
break;
|
||||
case 'editSessionReady':
|
||||
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
|
||||
let resultSet = assign({}, event.data);
|
||||
if (!resultSet.complete) {
|
||||
@@ -385,7 +387,7 @@ export class EditDataGridPanel extends GridParentComponent {
|
||||
self.windowSize,
|
||||
index => { return {}; },
|
||||
resultSet.rowCount,
|
||||
this.loadDataFunction,
|
||||
await this.loadDataFunction,
|
||||
),
|
||||
columnDefinitions: [rowNumberColumn.getColumnDefinition()].concat(resultSet.columnInfo.map((c, i) => {
|
||||
let columnIndex = (i + 1).toString();
|
||||
@@ -410,14 +412,7 @@ export class EditDataGridPanel extends GridParentComponent {
|
||||
if (self.placeHolderDataSets[0]) {
|
||||
this.refreshDatasets();
|
||||
}
|
||||
self.refreshGrid();
|
||||
|
||||
// Setup the state of the selected cell
|
||||
this.resetCurrentCell();
|
||||
this.removingNewRow = false;
|
||||
this.newRowVisible = false;
|
||||
this.dirtyCells = [];
|
||||
|
||||
await self.refreshGrid(true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -440,7 +435,11 @@ export class EditDataGridPanel extends GridParentComponent {
|
||||
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) => {
|
||||
|
||||
clearTimeout(this.refreshGridTimeoutHandle);
|
||||
@@ -462,11 +461,18 @@ export class EditDataGridPanel extends GridParentComponent {
|
||||
this.logService.error('data set is empty, refresh cancelled.');
|
||||
reject();
|
||||
}
|
||||
|
||||
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);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -105,6 +105,7 @@ export class EditDataResultsEditor extends BaseEditor {
|
||||
// to events from the backing data service
|
||||
this._applySettings();
|
||||
let editGridPanel = this._register(this._instantiationService.createInstance(EditDataGridPanel, dataService, input.onSaveViewStateEmitter.event, input.onRestoreViewStateEmitter.event));
|
||||
input.editDataGridPanel = editGridPanel;
|
||||
editGridPanel.render(this.getContainer());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user