mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 10:58:30 -05:00
Sql Assessment fixes (#12169)
* prevent simultaneous actions runs and label fix * sqltools service version update
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/v{#version#}/microsoft.sqltools.servicelayer-{#fileName#}",
|
"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": {
|
"downloadFileNames": {
|
||||||
"Windows_86": "win-x86-netcoreapp3.1.zip",
|
"Windows_86": "win-x86-netcoreapp3.1.zip",
|
||||||
"Windows_64": "win-x64-netcoreapp3.1.zip",
|
"Windows_64": "win-x64-netcoreapp3.1.zip",
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ export interface IAssessmentComponent {
|
|||||||
stopProgress(mode: AssessmentType): any;
|
stopProgress(mode: AssessmentType): any;
|
||||||
recentResult: SqlAssessmentResultInfo;
|
recentResult: SqlAssessmentResultInfo;
|
||||||
isActive: boolean;
|
isActive: boolean;
|
||||||
|
isBusy: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -61,7 +62,7 @@ abstract class AsmtServerAction extends Action {
|
|||||||
|
|
||||||
public async run(context: IAsmtActionInfo): Promise<boolean> {
|
public async run(context: IAsmtActionInfo): Promise<boolean> {
|
||||||
this._telemetryService.sendActionEvent(TelemetryView.SqlAssessment, this.id);
|
this._telemetryService.sendActionEvent(TelemetryView.SqlAssessment, this.id);
|
||||||
if (context && context.component) {
|
if (context && context.component && !context.component.isBusy) {
|
||||||
context.component.showProgress(this.asmtType);
|
context.component.showProgress(this.asmtType);
|
||||||
let serverResults = this.getServerItems(context.ownerUri);
|
let serverResults = this.getServerItems(context.ownerUri);
|
||||||
let connectionUri: string = this._connectionManagement.getConnectionUriFromId(context.connectionId);
|
let connectionUri: string = this._connectionManagement.getConnectionUriFromId(context.connectionId);
|
||||||
@@ -138,7 +139,7 @@ export class AsmtDatabaseSelectItemsAction extends Action {
|
|||||||
|
|
||||||
public async run(context: IAsmtActionInfo): Promise<boolean> {
|
public async run(context: IAsmtActionInfo): Promise<boolean> {
|
||||||
this._telemetryService.sendActionEvent(TelemetryView.SqlAssessment, this.id);
|
this._telemetryService.sendActionEvent(TelemetryView.SqlAssessment, this.id);
|
||||||
if (context && context.component) {
|
if (context && context.component && !context.component.isBusy) {
|
||||||
context.component.showProgress(AssessmentType.AvailableRules);
|
context.component.showProgress(AssessmentType.AvailableRules);
|
||||||
let dbAsmtResults = await this._assessmentService.getAssessmentItems(context.ownerUri, AssessmentTargetType.Database);
|
let dbAsmtResults = await this._assessmentService.getAssessmentItems(context.ownerUri, AssessmentTargetType.Database);
|
||||||
context.component.showInitialResults(dbAsmtResults, AssessmentType.AvailableRules);
|
context.component.showInitialResults(dbAsmtResults, AssessmentType.AvailableRules);
|
||||||
@@ -186,7 +187,7 @@ export class AsmtDatabaseInvokeItemsAction extends Action {
|
|||||||
|
|
||||||
public async run(context: IAsmtActionInfo): Promise<boolean> {
|
public async run(context: IAsmtActionInfo): Promise<boolean> {
|
||||||
this._telemetryService.sendActionEvent(TelemetryView.SqlAssessment, this.id);
|
this._telemetryService.sendActionEvent(TelemetryView.SqlAssessment, this.id);
|
||||||
if (context && context.component) {
|
if (context && context.component && !context.component.isBusy) {
|
||||||
context.component.showProgress(AssessmentType.InvokeAssessment);
|
context.component.showProgress(AssessmentType.InvokeAssessment);
|
||||||
let dbAsmtResults = await this._assessmentService.assessmentInvoke(context.ownerUri, AssessmentTargetType.Database);
|
let dbAsmtResults = await this._assessmentService.assessmentInvoke(context.ownerUri, AssessmentTargetType.Database);
|
||||||
context.component.showInitialResults(dbAsmtResults, AssessmentType.InvokeAssessment);
|
context.component.showInitialResults(dbAsmtResults, AssessmentType.InvokeAssessment);
|
||||||
@@ -241,7 +242,7 @@ export class AsmtSamplesLinkAction extends Action {
|
|||||||
|
|
||||||
export class AsmtGenerateHTMLReportAction extends Action {
|
export class AsmtGenerateHTMLReportAction extends Action {
|
||||||
public static readonly ID = 'asmtaction.generatehtmlreport';
|
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';
|
public static readonly ICON = 'bookreport';
|
||||||
|
|
||||||
constructor(
|
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]}`;
|
const datetime = `${resultDate.toISOString().replace(/-/g, '').replace('T', '').replace(/:/g, '').split('.')[0]}`;
|
||||||
return `SqlAssessmentReport_${datetime}.html`;
|
return `SqlAssessmentReport_${datetime}.html`;
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,13 @@ export class AsmtResultsViewComponent extends TabChild implements IAssessmentCom
|
|||||||
id: 'tags',
|
id: 'tags',
|
||||||
formatter: (row, cell, value, columnDef, dataContext) => this.renderTags(row, cell, value, columnDef, dataContext)
|
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) => `<span title='${value}'>${value}</span>`
|
||||||
|
}
|
||||||
];
|
];
|
||||||
private dataView: any;
|
private dataView: any;
|
||||||
private filterPlugin: any;
|
private filterPlugin: any;
|
||||||
@@ -190,6 +196,10 @@ export class AsmtResultsViewComponent extends TabChild implements IAssessmentCom
|
|||||||
return this.isVisible;
|
return this.isVisible;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get isBusy(): boolean {
|
||||||
|
return Object.values(this.spinner).find(item => item.style.visibility === 'visible') !== undefined;
|
||||||
|
}
|
||||||
|
|
||||||
public layout(): void {
|
public layout(): void {
|
||||||
let statusBar = this.layoutService.getContainer(Parts.STATUSBAR_PART);
|
let statusBar = this.layoutService.getContainer(Parts.STATUSBAR_PART);
|
||||||
if (dom.isInDOM(this.actionBarContainer.nativeElement) && dom.isInDOM(statusBar)) {
|
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) {
|
private renderTags(_row, _cell, _value, _columnDef, dataContext) {
|
||||||
if (dataContext.tags !== undefined) {
|
if (dataContext.tags !== undefined) {
|
||||||
return dataContext.tags.join(`, `);
|
return `<span title='${dataContext.tags.join(', ')}'>${dataContext.tags.join(', ')}</span>`;
|
||||||
}
|
}
|
||||||
return dataContext.tags;
|
return dataContext.tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
private renderTarget(_row, _cell, _value, _columnDef, dataContext) {
|
private renderTarget(_row, _cell, _value, _columnDef, dataContext) {
|
||||||
return `<div class='carbon-taskbar'><span class='action-label codicon ${TARGET_ICON_CLASS[dataContext.targetType]}'>${dataContext.targetName}</span></div>`;
|
return `<div class='carbon-taskbar ellps'><span class='action-label codicon ${TARGET_ICON_CLASS[dataContext.targetType]}' title='${dataContext.targetName}'>${dataContext.targetName}</span></div>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private detailSelectionFormatter(_row: number, _cell: number, _value: any, _columnDef: Slick.Column<Slick.SlickData>, dataContext: Slick.SlickData): string | undefined {
|
private detailSelectionFormatter(_row: number, _cell: number, _value: any, _columnDef: Slick.Column<Slick.SlickData>, dataContext: Slick.SlickData): string | undefined {
|
||||||
|
|||||||
@@ -130,3 +130,9 @@ asmtview-component .asmtview-grid .slick-cell.error-row {
|
|||||||
position: relative;
|
position: relative;
|
||||||
top: 50px;
|
top: 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#asmtDiv .ellps {
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ class AssessmentTestViewComponent implements IAssessmentComponent {
|
|||||||
dateUpdated: Date.now()
|
dateUpdated: Date.now()
|
||||||
};
|
};
|
||||||
isActive: boolean = true;
|
isActive: boolean = true;
|
||||||
|
isBusy: boolean = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mockAssessmentService: TypeMoq.Mock<AssessmentService>;
|
let mockAssessmentService: TypeMoq.Mock<AssessmentService>;
|
||||||
|
|||||||
Reference in New Issue
Block a user