mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-18 09:35:39 -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:
@@ -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