Compare commits

...

10 Commits

Author SHA1 Message Date
Karl Burtram
84009f65ec Save grid selection/vertical scroll when switching tabs 2019-01-08 15:37:20 -08:00
kisantia
191648df0a Fix database not getting set correctly in DacFx wizard deploy scenario (#3641)
* fix db not getting set correctly for deploy scenario if coming from import page

* removed space so that comments go directly after //
2019-01-07 12:06:20 -08:00
Matt Irvine
1265a56ff4 Update edit data for result set streaming changes (#3634) 2019-01-07 12:06:11 -08:00
Aditya Bist
2171d44922 removed potentially PII (#3619) 2018-12-12 14:13:50 -08:00
Anthony Dresser
812f315e69 Account for different situations for stream setting (#3615)
* add cases for different situation

* default streaming setting false
2018-12-12 12:12:18 -08:00
Karl Burtram
d48258a0fb Turn off "something went wrong" message (#3606) 2018-12-11 16:19:23 -08:00
Karl Burtram
8ec78f67af Merge branch 'master' into release/1.3 2018-12-11 15:10:32 -08:00
Karl Burtram
348b03327e Merge branch 'master' into release/1.3 2018-12-11 11:29:01 -08:00
Karl Burtram
6497bbcc38 Merge branch 'master' into release/1.3 2018-12-10 17:39:23 -08:00
Karl Burtram
a1abca26df Remove a style that is breaking the "Clear MRU" list (#3587) 2018-12-10 17:36:55 -08:00
9 changed files with 113 additions and 78 deletions

View File

@@ -131,7 +131,7 @@ export class DeployConfigPage extends DacFxConfigPage {
this.model.database = this.databaseTextBox.value; this.model.database = this.databaseTextBox.value;
}); });
// Initialize with upgrade existing true //Initialize with upgrade existing true
upgradeRadioButton.checked = true; upgradeRadioButton.checked = true;
this.model.upgradeExisting = true; this.model.upgradeExisting = true;
@@ -152,7 +152,7 @@ export class DeployConfigPage extends DacFxConfigPage {
this.databaseDropdown = this.view.modelBuilder.dropDown().withProperties({ this.databaseDropdown = this.view.modelBuilder.dropDown().withProperties({
required: true required: true
}).component(); }).component();
// Handle database changes //Handle database changes
this.databaseDropdown.onValueChanged(async () => { this.databaseDropdown.onValueChanged(async () => {
this.model.database = (<sqlops.CategoryValue>this.databaseDropdown.value).name; this.model.database = (<sqlops.CategoryValue>this.databaseDropdown.value).name;
}); });
@@ -172,7 +172,8 @@ export class DeployConfigPage extends DacFxConfigPage {
} }
let values = await this.getDatabaseValues(); let values = await this.getDatabaseValues();
if (this.model.database === undefined) { //set the database to the first dropdown value if upgrading, otherwise it should get set to the textbox value
if (this.model.upgradeExisting) {
this.model.database = values[0].name; this.model.database = values[0].name;
} }

View File

@@ -105,10 +105,12 @@
background: url('clear-search-results.svg'); background: url('clear-search-results.svg');
} }
/*
.vs-dark .search-action.clear-search-results, .vs-dark .search-action.clear-search-results,
.hc-black .search-action.clear-search-results { .hc-black .search-action.clear-search-results {
background: url('clear-search-results-dark.svg'); background: url('clear-search-results-dark.svg');
} }
*/
.connection-details-title { .connection-details-title {
font-size: 14px; font-size: 14px;

View File

@@ -168,8 +168,7 @@ export const DashboardModule = (params, selector: string, instantiationService:
if (e instanceof NavigationEnd) { if (e instanceof NavigationEnd) {
this.navigations++; this.navigations++;
TelemetryUtils.addTelemetry(this.telemetryService, TelemetryKeys.DashboardNavigated, { TelemetryUtils.addTelemetry(this.telemetryService, TelemetryKeys.DashboardNavigated, {
numberOfNavigations: this.navigations, numberOfNavigations: this.navigations
routeUrl: e.url
}); });
} }
}); });

View File

@@ -343,6 +343,9 @@ export class EditDataComponent extends GridParentComponent implements OnInit, On
handleResultSet(self: EditDataComponent, event: any): void { handleResultSet(self: EditDataComponent, event: any): 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 = Object.assign({}, event.data); let resultSet = Object.assign({}, event.data);
if (!resultSet.complete) {
return;
}
// Add an extra 'new row' // Add an extra 'new row'
resultSet.rowCount++; resultSet.rowCount++;

View File

@@ -308,7 +308,7 @@ let registryProperties = {
'sql.results.streaming': { 'sql.results.streaming': {
'type': 'boolean', 'type': 'boolean',
'description': localize('sql.results.streaming', 'Enable results streaming; contains few minor visual issues'), 'description': localize('sql.results.streaming', 'Enable results streaming; contains few minor visual issues'),
'default': true 'default': false
}, },
'sql.copyIncludeHeaders': { 'sql.copyIncludeHeaders': {
'type': 'boolean', 'type': 'boolean',

View File

@@ -88,7 +88,8 @@ export class GridTableState extends Disposable {
private _canBeMaximized: boolean; private _canBeMaximized: boolean;
/* The top row of the current scroll */ /* The top row of the current scroll */
public scrollPosition = 0; public scrollPositionY = 0;
public scrollPositionX = 0;
public selection: Slick.Range[]; public selection: Slick.Range[];
public activeCell: Slick.Cell; public activeCell: Slick.Cell;
@@ -145,7 +146,7 @@ export class GridPanel extends ViewletPanel {
super(options, keybindingService, contextMenuService, configurationService); super(options, keybindingService, contextMenuService, configurationService);
this.splitView = new ScrollableSplitView(this.container, { enableResizing: false, verticalScrollbarVisibility: ScrollbarVisibility.Visible }); this.splitView = new ScrollableSplitView(this.container, { enableResizing: false, verticalScrollbarVisibility: ScrollbarVisibility.Visible });
this.splitView.onScroll(e => { this.splitView.onScroll(e => {
if (this.state) { if (this.state && this.splitView.length !== 0) {
this.state.scrollPosition = e; this.state.scrollPosition = e;
} }
}); });
@@ -185,12 +186,31 @@ export class GridPanel extends ViewletPanel {
} }
this.reset(); this.reset();
})); }));
this.addResultSet(this.runner.batchSets.reduce<sqlops.ResultSetSummary[]>((p, e) => {
if (this.configurationService.getValue<boolean>('sql.results.streaming')) {
p = p.concat(e.resultSetSummaries);
} else {
p = p.concat(e.resultSetSummaries.filter(c => c.complete));
}
return p;
}, []));
this.maximumBodySize = this.tables.reduce((p, c) => {
return p + c.maximumSize;
}, 0);
if (this.state && this.state.scrollPosition) {
this.splitView.setScrollPosition(this.state.scrollPosition);
}
} }
private onResultSet(resultSet: sqlops.ResultSetSummary | sqlops.ResultSetSummary[]) { private onResultSet(resultSet: sqlops.ResultSetSummary | sqlops.ResultSetSummary[]) {
if (this.configurationService.getValue<boolean>('sql.results.streaming')) { let resultsToAdd: sqlops.ResultSetSummary[];
this.addResultSet(resultSet); if (!Array.isArray(resultSet)) {
resultsToAdd = [resultSet];
} else {
resultsToAdd = resultSet.splice(0);
}
const sizeChanges = () => {
this.tables.map(t => { this.tables.map(t => {
t.state.canBeMaximized = this.tables.length > 1; t.state.canBeMaximized = this.tables.length > 1;
}); });
@@ -202,6 +222,17 @@ export class GridPanel extends ViewletPanel {
if (this.state && this.state.scrollPosition) { if (this.state && this.state.scrollPosition) {
this.splitView.setScrollPosition(this.state.scrollPosition); this.splitView.setScrollPosition(this.state.scrollPosition);
} }
};
if (this.configurationService.getValue<boolean>('sql.results.streaming')) {
this.addResultSet(resultsToAdd);
sizeChanges();
} else {
resultsToAdd = resultsToAdd.filter(e => e.complete);
if (resultsToAdd.length > 0) {
this.addResultSet(resultsToAdd);
}
sizeChanges();
} }
} }
@@ -210,9 +241,19 @@ export class GridPanel extends ViewletPanel {
if (!Array.isArray(resultSet)) { if (!Array.isArray(resultSet)) {
resultsToUpdate = [resultSet]; resultsToUpdate = [resultSet];
} else { } else {
resultsToUpdate = resultSet; resultsToUpdate = resultSet.splice(0);
} }
const sizeChanges = () => {
this.maximumBodySize = this.tables.reduce((p, c) => {
return p + c.maximumSize;
}, 0);
if (this.state && this.state.scrollPosition) {
this.splitView.setScrollPosition(this.state.scrollPosition);
}
};
if (this.configurationService.getValue<boolean>('sql.results.streaming')) { if (this.configurationService.getValue<boolean>('sql.results.streaming')) {
for (let set of resultsToUpdate) { for (let set of resultsToUpdate) {
let table = this.tables.find(t => t.resultSet.batchId === set.batchId && t.resultSet.id === set.id); let table = this.tables.find(t => t.resultSet.batchId === set.batchId && t.resultSet.id === set.id);
@@ -222,47 +263,20 @@ export class GridPanel extends ViewletPanel {
warn('Got result set update request for non-existant table'); warn('Got result set update request for non-existant table');
} }
} }
sizeChanges();
this.maximumBodySize = this.tables.reduce((p, c) => {
return p + c.maximumSize;
}, 0);
if (this.state && this.state.scrollPosition) {
this.splitView.setScrollPosition(this.state.scrollPosition);
}
} else { } else {
let change = false; resultsToUpdate = resultsToUpdate.filter(e => e.complete);
if (resultsToUpdate.length > 0) {
for (let set of resultsToUpdate) { this.addResultSet(resultsToUpdate);
if (set.complete) { }
this.addResultSet(set); sizeChanges();
change = true;
} }
} }
if (change) { private addResultSet(resultSet: sqlops.ResultSetSummary[]) {
this.maximumBodySize = this.tables.reduce((p, c) => {
return p + c.maximumSize;
}, 0);
if (this.state && this.state.scrollPosition) {
this.splitView.setScrollPosition(this.state.scrollPosition);
}
}
}
}
private addResultSet(resultSet: sqlops.ResultSetSummary | sqlops.ResultSetSummary[]) {
let resultsToAdd: sqlops.ResultSetSummary[];
if (!Array.isArray(resultSet)) {
resultsToAdd = [resultSet];
} else {
resultsToAdd = resultSet;
}
let tables: GridTable<any>[] = []; let tables: GridTable<any>[] = [];
for (let set of resultsToAdd) { for (let set of resultSet) {
let tableState: GridTableState; let tableState: GridTableState;
if (this._state) { if (this._state) {
tableState = this.state.tableStates.find(e => e.batchId === set.batchId && e.resultId === set.id); tableState = this.state.tableStates.find(e => e.batchId === set.batchId && e.resultId === set.id);
@@ -442,6 +456,7 @@ class GridTable<T> extends Disposable implements IView {
}); });
this.dataProvider.dataRows = collection; this.dataProvider.dataRows = collection;
this.table.updateRowCount(); this.table.updateRowCount();
this.setupState();
} }
public onRemove() { public onRemove() {
@@ -535,12 +550,18 @@ class GridTable<T> extends Disposable implements IView {
}); });
this.table.grid.onScroll.subscribe((e, data) => { this.table.grid.onScroll.subscribe((e, data) => {
if (!this.scrolled && this.state.scrollPosition && isInDOM(this.container)) { if (!this.visible) {
// If the grid is not set up yet it can get scroll events resetting the top to 0px,
// so ignore those events
return;
}
if (!this.scrolled && (this.state.scrollPositionY || this.state.scrollPositionX) && isInDOM(this.container)) {
this.scrolled = true; this.scrolled = true;
this.table.grid.scrollTo(this.state.scrollPosition); this.restoreScrollState();
} }
if (this.state && isInDOM(this.container)) { if (this.state && isInDOM(this.container)) {
this.state.scrollPosition = data.scrollTop; this.state.scrollPositionY = data.scrollTop;
this.state.scrollPositionX = data.scrollLeft;
} }
}); });
@@ -549,8 +570,13 @@ class GridTable<T> extends Disposable implements IView {
this.state.activeCell = this.table.grid.getActiveCell(); this.state.activeCell = this.table.grid.getActiveCell();
} }
}); });
}
this.setupState(); private restoreScrollState() {
if (this.state.scrollPositionX || this.state.scrollPositionY) {
this.table.grid.scrollTo(this.state.scrollPositionY);
this.table.grid.getContainerNode().children[3].scrollLeft = this.state.scrollPositionX;
}
} }
private setupState() { private setupState() {
@@ -559,20 +585,18 @@ class GridTable<T> extends Disposable implements IView {
this._register(this.state.onCanBeMaximizedChange(this.rebuildActionBar, this)); this._register(this.state.onCanBeMaximizedChange(this.rebuildActionBar, this));
if (this.state.scrollPosition) { this.restoreScrollState();
// most of the time this won't do anything
this.table.grid.scrollTo(this.state.scrollPosition);
// the problem here is that the scrolling state slickgrid uses
// doesn't work with it offDOM.
}
if (this.state.selection) { // Setting the active cell resets the selection so save it here
this.selectionModel.setSelectedRanges(this.state.selection); let savedSelection = this.state.selection;
}
if (this.state.activeCell) { if (this.state.activeCell) {
this.table.setActiveCell(this.state.activeCell.row, this.state.activeCell.cell); this.table.setActiveCell(this.state.activeCell.row, this.state.activeCell.cell);
} }
if (savedSelection) {
this.selectionModel.setSelectedRanges(savedSelection);
}
} }
public get state(): GridTableState { public get state(): GridTableState {

View File

@@ -387,8 +387,14 @@ export class QueryModelService implements IQueryModelService {
// We do not have a query runner for this editor, so create a new one // We do not have a query runner for this editor, so create a new one
// and map it to the results uri // and map it to the results uri
queryRunner = this._instantiationService.createInstance(QueryRunner, ownerUri); queryRunner = this._instantiationService.createInstance(QueryRunner, ownerUri);
const resultSetEventType = 'resultSet';
queryRunner.addListener(QREvents.RESULT_SET, resultSet => { queryRunner.addListener(QREvents.RESULT_SET, resultSet => {
this._fireQueryEvent(ownerUri, 'resultSet', resultSet); this._fireQueryEvent(ownerUri, resultSetEventType, resultSet);
});
queryRunner.onResultSetUpdate(resultSetSummaries => {
resultSetSummaries.forEach(resultSet => {
this._fireQueryEvent(ownerUri, resultSetEventType, resultSet);
})
}); });
queryRunner.addListener(QREvents.BATCH_START, batch => { queryRunner.addListener(QREvents.BATCH_START, batch => {
let link = undefined; let link = undefined;

View File

@@ -97,8 +97,8 @@ export default class QueryRunner extends Disposable {
return l.concat(e); return l.concat(e);
} }
}); });
private _echoedResultSet = echo(this._debouncedResultSet.event); // private _echoedResultSet = echo(this._debouncedResultSet.event);
public readonly onResultSet = this._echoedResultSet.event; public readonly onResultSet = this._debouncedResultSet.event;
private _onResultSetUpdate = this._register(new Emitter<sqlops.ResultSetSummary>()); private _onResultSetUpdate = this._register(new Emitter<sqlops.ResultSetSummary>());
private _debouncedResultSetUpdate = debounceEvent<sqlops.ResultSetSummary, sqlops.ResultSetSummary[]>(this._onResultSetUpdate.event, (l, e) => { private _debouncedResultSetUpdate = debounceEvent<sqlops.ResultSetSummary, sqlops.ResultSetSummary[]>(this._onResultSetUpdate.event, (l, e) => {
@@ -109,8 +109,8 @@ export default class QueryRunner extends Disposable {
return l.concat(e); return l.concat(e);
} }
}); });
private _echoedResultSetUpdate = echo(this._debouncedResultSetUpdate.event); // private _echoedResultSetUpdate = echo(this._debouncedResultSetUpdate.event);
public readonly onResultSetUpdate = this._echoedResultSetUpdate.event; public readonly onResultSetUpdate = this._debouncedResultSetUpdate.event;
private _onQueryStart = this._register(new Emitter<void>()); private _onQueryStart = this._register(new Emitter<void>());
public readonly onQueryStart: Event<void> = this._onQueryStart.event; public readonly onQueryStart: Event<void> = this._onQueryStart.event;
@@ -203,9 +203,9 @@ export default class QueryRunner extends Disposable {
return TPromise.as(undefined); return TPromise.as(undefined);
} }
this._echoedMessages.clear(); this._echoedMessages.clear();
this._echoedResultSet.clear(); // this._echoedResultSet.clear();
this._debouncedMessage.clear(); this._debouncedMessage.clear();
this._debouncedResultSet.clear(); // this._debouncedResultSet.clear();
this._planXml = new Deferred<string>(); this._planXml = new Deferred<string>();
this._batchSets = []; this._batchSets = [];
this._hasCompleted = false; this._hasCompleted = false;
@@ -434,10 +434,10 @@ export default class QueryRunner extends Disposable {
}; };
return this._queryManagementService.getQueryRows(rowData).then(r => r, error => { return this._queryManagementService.getQueryRows(rowData).then(r => r, error => {
this._notificationService.notify({ // this._notificationService.notify({
severity: Severity.Error, // severity: Severity.Error,
message: nls.localize('query.gettingRowsFailedError', 'Something went wrong getting more rows: {0}', error) // message: nls.localize('query.gettingRowsFailedError', 'Something went wrong getting more rows: {0}', error)
}); // });
return error; return error;
}); });
} }
@@ -492,11 +492,11 @@ export default class QueryRunner extends Disposable {
} }
resolve(result); resolve(result);
}, error => { }, error => {
let errorMessage = nls.localize('query.moreRowsFailedError', 'Something went wrong getting more rows:'); // let errorMessage = nls.localize('query.moreRowsFailedError', 'Something went wrong getting more rows:');
self._notificationService.notify({ // self._notificationService.notify({
severity: Severity.Error, // severity: Severity.Error,
message: `${errorMessage} ${error}` // message: `${errorMessage} ${error}`
}); // });
reject(error); reject(error);
}); });
}); });

View File

@@ -24,7 +24,7 @@ export function resolveCommonProperties(commit: string, version: string, machine
result['sessionID'] = ''; result['sessionID'] = '';
// __GDPR__COMMON__ "commitHash" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } // __GDPR__COMMON__ "commitHash" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
result['commitHash'] = commit; result['commitHash'] = '';
// __GDPR__COMMON__ "version" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } // __GDPR__COMMON__ "version" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }
result['version'] = version; result['version'] = version;
// __GDPR__COMMON__ "common.platformVersion" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } // __GDPR__COMMON__ "common.platformVersion" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" }