diff --git a/extensions/mssql/src/contracts.ts b/extensions/mssql/src/contracts.ts index 1d32baf097..789e5cf7ce 100644 --- a/extensions/mssql/src/contracts.ts +++ b/extensions/mssql/src/contracts.ts @@ -1108,7 +1108,7 @@ export namespace TableDesignerGenerateScriptRequest { } export namespace TableDesignerGenerateChangePreviewReportRequest { - export const type = new RequestType('tabledesigner/generatepreviewreport'); + export const type = new RequestType('tabledesigner/generatepreviewreport'); } export namespace DisposeTableDesignerRequest { export const type = new RequestType('tabledesigner/dispose'); diff --git a/extensions/mssql/src/features.ts b/extensions/mssql/src/features.ts index d3c03131eb..17d62415c3 100644 --- a/extensions/mssql/src/features.ts +++ b/extensions/mssql/src/features.ts @@ -1151,7 +1151,7 @@ export class TableDesignerFeature extends SqlOpsFeature { } }; - const generatePreviewReport = (tableInfo: azdata.designers.TableInfo): Thenable => { + const generatePreviewReport = (tableInfo: azdata.designers.TableInfo): Thenable => { try { return client.sendRequest(contracts.TableDesignerGenerateChangePreviewReportRequest.type, tableInfo); } diff --git a/src/sql/azdata.proposed.d.ts b/src/sql/azdata.proposed.d.ts index 7829525ea1..b0648f2b0f 100644 --- a/src/sql/azdata.proposed.d.ts +++ b/src/sql/azdata.proposed.d.ts @@ -1099,7 +1099,7 @@ declare module 'azdata' { * Generate preview report describing the changes to be made. * @param table the table information */ - generatePreviewReport(table: TableInfo): Thenable; + generatePreviewReport(table: TableInfo): Thenable; /** * Notify the provider that the table designer has been closed. @@ -1515,6 +1515,17 @@ declare module 'azdata' { */ view: TableDesignerView; } + + export interface GeneratePreviewReportResult { + /** + * Report generated for generate preview + */ + report: string; + /** + * Format (mimeType) of the report + */ + mimeType: string; + } } export interface ExecutionPlanGraph { diff --git a/src/sql/workbench/api/browser/mainThreadDataProtocol.ts b/src/sql/workbench/api/browser/mainThreadDataProtocol.ts index 74dabd0cfd..ebcaa5733c 100644 --- a/src/sql/workbench/api/browser/mainThreadDataProtocol.ts +++ b/src/sql/workbench/api/browser/mainThreadDataProtocol.ts @@ -525,7 +525,7 @@ export class MainThreadDataProtocol extends Disposable implements MainThreadData generateScript(tableInfo: azdata.designers.TableInfo): Thenable { return self._proxy.$generateScriptForTableDesigner(handle, tableInfo); }, - generatePreviewReport(tableInfo: azdata.designers.TableInfo): Thenable { + generatePreviewReport(tableInfo: azdata.designers.TableInfo): Thenable { return self._proxy.$generatePreviewReportForTableDesigner(handle, tableInfo); }, disposeTableDesigner(tableInfo: azdata.designers.TableInfo): Thenable { diff --git a/src/sql/workbench/api/common/extHostDataProtocol.ts b/src/sql/workbench/api/common/extHostDataProtocol.ts index baca88680a..c4ee2f511e 100644 --- a/src/sql/workbench/api/common/extHostDataProtocol.ts +++ b/src/sql/workbench/api/common/extHostDataProtocol.ts @@ -909,7 +909,7 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape { return this._resolveProvider(handle).generateScript(table); } - public override $generatePreviewReportForTableDesigner(handle: number, table: azdata.designers.TableInfo): Thenable { + public override $generatePreviewReportForTableDesigner(handle: number, table: azdata.designers.TableInfo): Thenable { return this._resolveProvider(handle).generatePreviewReport(table); } diff --git a/src/sql/workbench/api/common/sqlExtHost.protocol.ts b/src/sql/workbench/api/common/sqlExtHost.protocol.ts index 85b09255b9..d1f8860b2c 100644 --- a/src/sql/workbench/api/common/sqlExtHost.protocol.ts +++ b/src/sql/workbench/api/common/sqlExtHost.protocol.ts @@ -556,7 +556,7 @@ export abstract class ExtHostDataProtocolShape { /** * Generate preview report. */ - $generatePreviewReportForTableDesigner(handle: number, table: azdata.designers.TableInfo): Thenable { throw ni(); } + $generatePreviewReportForTableDesigner(handle: number, table: azdata.designers.TableInfo): Thenable { throw ni(); } /** * Dispose the table designer. diff --git a/src/sql/workbench/services/tableDesigner/browser/tableDesignerComponentInput.ts b/src/sql/workbench/services/tableDesigner/browser/tableDesignerComponentInput.ts index ace7842b05..05cc3e8913 100644 --- a/src/sql/workbench/services/tableDesigner/browser/tableDesignerComponentInput.ts +++ b/src/sql/workbench/services/tableDesigner/browser/tableDesignerComponentInput.ts @@ -178,10 +178,10 @@ export class TableDesignerComponentInput implements DesignerComponentInput { sticky: true }); - let report; + let previewReportResult: azdata.designers.GeneratePreviewReportResult; try { this.updateState(this.valid, this.dirty, 'generateReport'); - report = await this._provider.generatePreviewReport(this.tableInfo); + previewReportResult = await this._provider.generatePreviewReport(this.tableInfo); reportNotificationHandle.close(); this.updateState(this.valid, this.dirty); } catch (error) { @@ -190,7 +190,7 @@ export class TableDesignerComponentInput implements DesignerComponentInput { return; } const dialog = this._instantiationService.createInstance(TableDesignerPublishDialog); - const result = await dialog.open(report.report); + const result = await dialog.open(previewReportResult.report, previewReportResult.mimeType); if (result === TableDesignerPublishDialogResult.GenerateScript) { await this.generateScript(); } else if (result === TableDesignerPublishDialogResult.UpdateDatabase) { diff --git a/src/sql/workbench/services/tableDesigner/browser/tableDesignerPublishDialog.ts b/src/sql/workbench/services/tableDesigner/browser/tableDesignerPublishDialog.ts index ac01232439..4a0ef42fa9 100644 --- a/src/sql/workbench/services/tableDesigner/browser/tableDesignerPublishDialog.ts +++ b/src/sql/workbench/services/tableDesigner/browser/tableDesignerPublishDialog.ts @@ -20,6 +20,7 @@ import { attachModalDialogStyler } from 'sql/workbench/common/styler'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { MarkdownRenderer } from 'vs/editor/browser/core/markdownRenderer'; +import { Mimes } from 'vs/base/common/mime'; const OkText: string = localize('tableDesigner.UpdateDatabase', "Update Database"); const CancelText: string = localize('tableDesigner.cancel', "Cancel"); @@ -34,6 +35,7 @@ export enum TableDesignerPublishDialogResult { export class TableDesignerPublishDialog extends Modal { private _report?: string; + private _mimeType: string = Mimes.text; private _okButton?: Button; private _generateScriptButton?: Button; private _cancelButton?: Button; @@ -54,8 +56,9 @@ export class TableDesignerPublishDialog extends Modal { this._markdownRenderer = instantiationService.createInstance(MarkdownRenderer, {}); } - public open(report: string): Promise { + public open(report: string, mimeType: string = Mimes.text): Promise { this._report = report; + this._mimeType = mimeType; this.render(); this.show(); const promise = new Promise((resolve) => { @@ -78,8 +81,13 @@ export class TableDesignerPublishDialog extends Modal { protected renderBody(container: HTMLElement) { const body = DOM.append(container, DOM.$('.table-designer-publish-dialog')); - const markdownElement = this._markdownRenderer.render({ value: this._report }).element; - DOM.append(body, markdownElement); + if (this._mimeType === Mimes.markdown) { + const markdownElement = this._markdownRenderer.render({ value: this._report }).element; + DOM.append(body, markdownElement); + } else { + // default to plain text + body.innerText = this._report; + } } protected layout(height?: number): void {