Display multi-line messages correctly in query results (#2935)

This commit is contained in:
Matt Irvine
2018-10-17 15:43:00 -07:00
committed by GitHub
parent 2c007115f7
commit 5a0490e81f

View File

@@ -74,8 +74,9 @@ export class MessagePanelState {
} }
export class MessagePanel extends ViewletPanel { export class MessagePanel extends ViewletPanel {
private messageLineCountMap = new Map<IResultMessage, number>();
private ds = new MessageDataSource(); private ds = new MessageDataSource();
private renderer = new MessageRenderer(); private renderer = new MessageRenderer(this.messageLineCountMap);
private model = new Model(); private model = new Model();
private controller: MessageController; private controller: MessageController;
private container = $('div message-tree').getHTMLElement(); private container = $('div message-tree').getHTMLElement();
@@ -143,29 +144,40 @@ export class MessagePanel extends ViewletPanel {
private onMessage(message: IResultMessage | IResultMessage[]) { private onMessage(message: IResultMessage | IResultMessage[]) {
let hasError = false; let hasError = false;
let lines: number;
if (isArray(message)) { if (isArray(message)) {
hasError = message.find(e => e.isError) ? true : false; hasError = message.find(e => e.isError) ? true : false;
lines = message.reduce((currentTotal, resultMessage) => currentTotal + this.countMessageLines(resultMessage), 0);
this.model.messages.push(...message); this.model.messages.push(...message);
} else { } else {
hasError = message.isError; hasError = message.isError;
lines = this.countMessageLines(message);
this.model.messages.push(message); this.model.messages.push(message);
} }
this.maximumBodySize += lines * 22;
if (hasError) { if (hasError) {
this.setExpanded(true); this.setExpanded(true);
} }
if (this.state.scrollPosition) { if (this.state.scrollPosition) {
this.tree.refresh(this.model).then(() => { 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 { } else {
const previousScrollPosition = this.tree.getScrollPosition(); const previousScrollPosition = this.tree.getScrollPosition();
this.tree.refresh(this.model).then(() => { 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) { if (previousScrollPosition === 1) {
this.tree.setScrollPosition(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() { private reset() {
@@ -220,8 +232,15 @@ class MessageDataSource implements IDataSource {
} }
class MessageRenderer implements IRenderer { class MessageRenderer implements IRenderer {
constructor(private messageLineCountMap: Map<IResultMessage, number>) {
}
getHeight(tree: ITree, element: any): number { 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 { 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 { renderElement(tree: ITree, element: IResultMessage, templateId: string, templateData: IMessageTemplate | IBatchTemplate): void {
if (templateId === TemplateIds.MESSAGE || templateId === TemplateIds.ERROR) { if (templateId === TemplateIds.MESSAGE || templateId === TemplateIds.ERROR) {
let data: IMessageTemplate = templateData; 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) { } else if (templateId === TemplateIds.BATCH) {
let data = templateData as IBatchTemplate; let data = templateData as IBatchTemplate;
data.timeStamp.innerText = element.time; data.timeStamp.innerText = element.time;