mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-14 03:58:33 -05:00
Display multi-line messages correctly in query results (#2935)
This commit is contained in:
@@ -74,8 +74,9 @@ export class MessagePanelState {
|
||||
}
|
||||
|
||||
export class MessagePanel extends ViewletPanel {
|
||||
private messageLineCountMap = new Map<IResultMessage, number>();
|
||||
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<IResultMessage, 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 {
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user