From 5a0490e81fcfc194a38ab188193639716dc501f5 Mon Sep 17 00:00:00 2001 From: Matt Irvine Date: Wed, 17 Oct 2018 15:43:00 -0700 Subject: [PATCH] Display multi-line messages correctly in query results (#2935) --- src/sql/parts/query/editor/messagePanel.ts | 29 ++++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/sql/parts/query/editor/messagePanel.ts b/src/sql/parts/query/editor/messagePanel.ts index 3f0f699255..231ff1b9a6 100644 --- a/src/sql/parts/query/editor/messagePanel.ts +++ b/src/sql/parts/query/editor/messagePanel.ts @@ -74,8 +74,9 @@ export class MessagePanelState { } export class MessagePanel extends ViewletPanel { + private messageLineCountMap = new Map(); private ds = new MessageDataSource(); - private renderer = new MessageRenderer(); + private renderer = new MessageRenderer(this.messageLineCountMap); private model = new Model(); private controller: MessageController; private container = $('div message-tree').getHTMLElement(); @@ -143,29 +144,40 @@ export class MessagePanel extends ViewletPanel { private onMessage(message: IResultMessage | IResultMessage[]) { let hasError = false; + let lines: number; if (isArray(message)) { hasError = message.find(e => e.isError) ? true : false; + lines = message.reduce((currentTotal, resultMessage) => currentTotal + this.countMessageLines(resultMessage), 0); this.model.messages.push(...message); } else { hasError = message.isError; + lines = this.countMessageLines(message); this.model.messages.push(message); } + this.maximumBodySize += lines * 22; if (hasError) { this.setExpanded(true); } if (this.state.scrollPosition) { this.tree.refresh(this.model).then(() => { - this.tree.setScrollPosition(1); + // Restore the previous scroll position when switching between tabs + this.tree.setScrollPosition(this.state.scrollPosition); }); } else { const previousScrollPosition = this.tree.getScrollPosition(); this.tree.refresh(this.model).then(() => { + // Scroll to the end if the user was already at the end otherwise leave the current scroll position if (previousScrollPosition === 1) { this.tree.setScrollPosition(1); } }); } - this.maximumBodySize = this.model.messages.length * 22; + } + + private countMessageLines(resultMessage: IResultMessage): number { + let lines = resultMessage.message.split('\n').length; + this.messageLineCountMap.set(resultMessage, lines); + return lines; } private reset() { @@ -220,8 +232,15 @@ class MessageDataSource implements IDataSource { } class MessageRenderer implements IRenderer { + constructor(private messageLineCountMap: Map) { + } + getHeight(tree: ITree, element: any): number { - return 22; + const lineHeight = 22; + if (this.messageLineCountMap.has(element)) { + return lineHeight * this.messageLineCountMap.get(element); + } + return lineHeight; } getTemplateId(tree: ITree, element: any): string { @@ -258,7 +277,7 @@ class MessageRenderer implements IRenderer { renderElement(tree: ITree, element: IResultMessage, templateId: string, templateData: IMessageTemplate | IBatchTemplate): void { if (templateId === TemplateIds.MESSAGE || templateId === TemplateIds.ERROR) { let data: IMessageTemplate = templateData; - data.message.innerText = element.message.replace(/(\r\n|\n|\r)/g, ' '); + data.message.innerText = element.message; } else if (templateId === TemplateIds.BATCH) { let data = templateData as IBatchTemplate; data.timeStamp.innerText = element.time;