From 5ae9495bc65a0801c5dc0d1f1f5614eb76d1cf1f Mon Sep 17 00:00:00 2001 From: Vladimir Chernov Date: Wed, 9 Sep 2020 17:54:48 +0300 Subject: [PATCH] Sql Assessment fixes (#12169) * prevent simultaneous actions runs and label fix * sqltools service version update --- extensions/mssql/config.json | 2 +- .../contrib/assessment/browser/asmtActions.ts | 11 ++++++----- .../browser/asmtResultsView.component.ts | 16 +++++++++++++--- .../contrib/assessment/browser/media/asmt.css | 6 ++++++ .../assessment/test/browser/asmtActions.test.ts | 1 + 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/extensions/mssql/config.json b/extensions/mssql/config.json index fdc6a29815..94911352a1 100644 --- a/extensions/mssql/config.json +++ b/extensions/mssql/config.json @@ -1,6 +1,6 @@ { "downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}", - "version": "3.0.0-release.16", + "version": "3.0.0-release.22", "downloadFileNames": { "Windows_86": "win-x86-netcoreapp3.1.zip", "Windows_64": "win-x64-netcoreapp3.1.zip", diff --git a/src/sql/workbench/contrib/assessment/browser/asmtActions.ts b/src/sql/workbench/contrib/assessment/browser/asmtActions.ts index 853a9c8bb3..d4ec3fa33a 100644 --- a/src/sql/workbench/contrib/assessment/browser/asmtActions.ts +++ b/src/sql/workbench/contrib/assessment/browser/asmtActions.ts @@ -36,6 +36,7 @@ export interface IAssessmentComponent { stopProgress(mode: AssessmentType): any; recentResult: SqlAssessmentResultInfo; isActive: boolean; + isBusy: boolean; } @@ -61,7 +62,7 @@ abstract class AsmtServerAction extends Action { public async run(context: IAsmtActionInfo): Promise { this._telemetryService.sendActionEvent(TelemetryView.SqlAssessment, this.id); - if (context && context.component) { + if (context && context.component && !context.component.isBusy) { context.component.showProgress(this.asmtType); let serverResults = this.getServerItems(context.ownerUri); let connectionUri: string = this._connectionManagement.getConnectionUriFromId(context.connectionId); @@ -138,7 +139,7 @@ export class AsmtDatabaseSelectItemsAction extends Action { public async run(context: IAsmtActionInfo): Promise { this._telemetryService.sendActionEvent(TelemetryView.SqlAssessment, this.id); - if (context && context.component) { + if (context && context.component && !context.component.isBusy) { context.component.showProgress(AssessmentType.AvailableRules); let dbAsmtResults = await this._assessmentService.getAssessmentItems(context.ownerUri, AssessmentTargetType.Database); context.component.showInitialResults(dbAsmtResults, AssessmentType.AvailableRules); @@ -186,7 +187,7 @@ export class AsmtDatabaseInvokeItemsAction extends Action { public async run(context: IAsmtActionInfo): Promise { this._telemetryService.sendActionEvent(TelemetryView.SqlAssessment, this.id); - if (context && context.component) { + if (context && context.component && !context.component.isBusy) { context.component.showProgress(AssessmentType.InvokeAssessment); let dbAsmtResults = await this._assessmentService.assessmentInvoke(context.ownerUri, AssessmentTargetType.Database); context.component.showInitialResults(dbAsmtResults, AssessmentType.InvokeAssessment); @@ -241,7 +242,7 @@ export class AsmtSamplesLinkAction extends Action { export class AsmtGenerateHTMLReportAction extends Action { public static readonly ID = 'asmtaction.generatehtmlreport'; - public static readonly LABEL = nls.localize('asmtaction.generatehtmlreport', "Make HTML Report"); + public static readonly LABEL = nls.localize('asmtaction.generatehtmlreport', "Create HTML Report"); public static readonly ICON = 'bookreport'; constructor( @@ -294,7 +295,7 @@ export class AsmtGenerateHTMLReportAction extends Action { } } -function generateReportFileName(resultDate): string { +function generateReportFileName(resultDate: Date): string { const datetime = `${resultDate.toISOString().replace(/-/g, '').replace('T', '').replace(/:/g, '').split('.')[0]}`; return `SqlAssessmentReport_${datetime}.html`; diff --git a/src/sql/workbench/contrib/assessment/browser/asmtResultsView.component.ts b/src/sql/workbench/contrib/assessment/browser/asmtResultsView.component.ts index f6bc2d35c4..c391bfb80f 100644 --- a/src/sql/workbench/contrib/assessment/browser/asmtResultsView.component.ts +++ b/src/sql/workbench/contrib/assessment/browser/asmtResultsView.component.ts @@ -110,7 +110,13 @@ export class AsmtResultsViewComponent extends TabChild implements IAssessmentCom id: 'tags', formatter: (row, cell, value, columnDef, dataContext) => this.renderTags(row, cell, value, columnDef, dataContext) }, - { name: LocalizedStrings.CHECKID_COLUMN_NAME, field: 'checkId', maxWidth: 140, id: 'checkId' } + { + name: LocalizedStrings.CHECKID_COLUMN_NAME, + field: 'checkId', + maxWidth: 140, + id: 'checkId', + formatter: (_row, _cell, value, _columnDef, _dataContext) => `${value}` + } ]; private dataView: any; private filterPlugin: any; @@ -190,6 +196,10 @@ export class AsmtResultsViewComponent extends TabChild implements IAssessmentCom return this.isVisible; } + public get isBusy(): boolean { + return Object.values(this.spinner).find(item => item.style.visibility === 'visible') !== undefined; + } + public layout(): void { let statusBar = this.layoutService.getContainer(Parts.STATUSBAR_PART); if (dom.isInDOM(this.actionBarContainer.nativeElement) && dom.isInDOM(statusBar)) { @@ -499,13 +509,13 @@ export class AsmtResultsViewComponent extends TabChild implements IAssessmentCom private renderTags(_row, _cell, _value, _columnDef, dataContext) { if (dataContext.tags !== undefined) { - return dataContext.tags.join(`, `); + return `${dataContext.tags.join(', ')}`; } return dataContext.tags; } private renderTarget(_row, _cell, _value, _columnDef, dataContext) { - return `
${dataContext.targetName}
`; + return `
${dataContext.targetName}
`; } private detailSelectionFormatter(_row: number, _cell: number, _value: any, _columnDef: Slick.Column, dataContext: Slick.SlickData): string | undefined { diff --git a/src/sql/workbench/contrib/assessment/browser/media/asmt.css b/src/sql/workbench/contrib/assessment/browser/media/asmt.css index 72b616a1ae..8995831ff8 100644 --- a/src/sql/workbench/contrib/assessment/browser/media/asmt.css +++ b/src/sql/workbench/contrib/assessment/browser/media/asmt.css @@ -130,3 +130,9 @@ asmtview-component .asmtview-grid .slick-cell.error-row { position: relative; top: 50px; } + +#asmtDiv .ellps { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} diff --git a/src/sql/workbench/contrib/assessment/test/browser/asmtActions.test.ts b/src/sql/workbench/contrib/assessment/test/browser/asmtActions.test.ts index 395ccec0c9..f7841e5cb0 100644 --- a/src/sql/workbench/contrib/assessment/test/browser/asmtActions.test.ts +++ b/src/sql/workbench/contrib/assessment/test/browser/asmtActions.test.ts @@ -86,6 +86,7 @@ class AssessmentTestViewComponent implements IAssessmentComponent { dateUpdated: Date.now() }; isActive: boolean = true; + isBusy: boolean = false; } let mockAssessmentService: TypeMoq.Mock;