Skip to content

Commit e4dc939

Browse files
author
Bogdan Tsechoev
committed
Merge branch 'debug_console_links' into 'master'
Bot UI: Make links clickable in debug messages, fixed webkit behavior See merge request postgres-ai/database-lab!882
2 parents 5c12f88 + d47e617 commit e4dc939

File tree

3 files changed

+56
-34
lines changed

3 files changed

+56
-34
lines changed

ui/packages/platform/src/pages/Bot/DebugConsole/DebugConsole.tsx

+16-18
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,24 @@
1-
import React, { useEffect, useRef, useState } from "react";
1+
import React, { useEffect, useRef } from "react";
22
import Dialog from "@material-ui/core/Dialog";
33
import { DialogContent, DialogTitle, makeStyles } from "@material-ui/core";
44
import { useAiBot } from "../hooks";
5-
import rehypeRaw from "rehype-raw";
6-
import remarkGfm from "remark-gfm";
7-
import ReactMarkdown from "react-markdown";
85
import IconButton from "@material-ui/core/IconButton";
96
import CloseIcon from "@material-ui/icons/Close";
10-
import { disallowedHtmlTagsForMarkdown } from "../utils";
117
import { DebugLogs } from "../DebugLogs/DebugLogs";
12-
import { DebugMessage } from "../../../types/api/entities/bot";
8+
import { createMessageFragment } from "../utils";
139

1410
const useStyles = makeStyles(
1511
(theme) => ({
1612
dialogStyle: {
1713
top: '5%!important',
1814
right: '10%!important',
1915
left: 'unset!important',
20-
height: 'fit-content',
21-
width: 'fit-content',
16+
height: '80vh',
17+
width: '80vw',
2218
},
2319
paper: {
2420
width: '80vw',
25-
height: '70vh',
21+
height: '80vh',
2622
opacity: '.5',
2723
transition: '.2s ease',
2824
'&:hover': {
@@ -58,17 +54,19 @@ export const DebugConsole = (props: DebugConsoleProps) => {
5854

5955
useEffect(() => {
6056
if (containerRef.current && debugMessages?.length && threadId && !debugMessagesLoading && isOpen) {
61-
let code: HTMLElement = containerRef.current.getElementsByTagName('code')?.[0];
57+
let code = containerRef.current.getElementsByTagName('code')?.[0];
58+
if (!code) {
59+
code = document.createElement('code');
60+
containerRef.current.appendChild(code);
61+
}
62+
6263
if (code.hasChildNodes()) {
63-
code.appendChild(document.createTextNode(`[${debugMessages[debugMessages.length - 1].created_at}]: ${debugMessages[debugMessages.length - 1].content}\n`))
64+
const lastMessage = debugMessages[debugMessages.length - 1];
65+
const fragment = createMessageFragment([lastMessage]);
66+
code.appendChild(fragment);
6467
} else {
65-
debugMessages.forEach((item) => {
66-
code.appendChild(document.createTextNode(`[${item.created_at}]: ${item.content}\n`))
67-
})
68-
const container = document.getElementById(`logs-container-${threadId}`);
69-
if (container) {
70-
container.appendChild(code)
71-
}
68+
const fragment = createMessageFragment(debugMessages);
69+
code.appendChild(fragment);
7270
}
7371
}
7472
}, [debugMessages, isOpen, threadId, debugMessagesLoading]);

ui/packages/platform/src/pages/Bot/DebugDialog/DebugDialog.tsx

+12-15
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
import React, { useEffect, useRef, useState } from 'react'
22
import Dialog from "@material-ui/core/Dialog";
33
import DialogTitle from '@material-ui/core/DialogTitle';
4-
import { DialogContent, IconButton, makeStyles, Typography } from "@material-ui/core";
5-
import ReactMarkdown from "react-markdown";
6-
import Format from "../../../utils/format";
4+
import { DialogContent, IconButton, makeStyles } from "@material-ui/core";
75
import { icons } from "@postgres.ai/shared/styles/icons";
8-
import { disallowedHtmlTagsForMarkdown } from "../utils";
9-
import { BotMessage, DebugMessage } from "../../../types/api/entities/bot";
10-
import rehypeRaw from "rehype-raw";
11-
import remarkGfm from "remark-gfm";
6+
import { DebugMessage } from "../../../types/api/entities/bot";
127
import { getDebugMessages } from "../../../api/bot/getDebugMessages";
13-
import { PageSpinner } from "@postgres.ai/shared/components/PageSpinner";
14-
import { SyntaxHighlight } from "@postgres.ai/shared/components/SyntaxHighlight";
158
import { DebugLogs } from "../DebugLogs/DebugLogs";
9+
import { createMessageFragment } from "../utils";
1610

1711
type DebugDialogProps = {
1812
isOpen: boolean;
@@ -52,15 +46,18 @@ export const DebugDialog = (props: DebugDialogProps) => {
5246
const debugMessages = useRef<DebugMessage[] | null>(null)
5347

5448
const generateMessages = (messages: DebugMessage[]) => {
55-
const code = document.createElement('code');
56-
messages.forEach((item) => {
57-
code.appendChild(document.createTextNode(`[${item.created_at}]: ${item.content}\n`))
58-
})
5949
const container = document.getElementById(`logs-container-${messageId}`);
6050
if (container) {
61-
container.appendChild(code)
51+
let code = container.getElementsByTagName('code')?.[0];
52+
if (!code) {
53+
code = document.createElement('code');
54+
container.appendChild(code);
55+
}
56+
57+
const fragment = createMessageFragment(messages);
58+
code.appendChild(fragment);
6259
}
63-
}
60+
};
6461

6562
const getDebugMessagesForMessage = async () => {
6663
setDebugLoading(true)

ui/packages/platform/src/pages/Bot/utils.ts

+28-1
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,31 @@ export const disallowedHtmlTagsForMarkdown= [
3030
'frameset',
3131
'audio',
3232
'video',
33-
];
33+
];
34+
35+
export const createMessageFragment = (messages: DebugMessage[]): DocumentFragment => {
36+
const fragment = document.createDocumentFragment();
37+
38+
messages.forEach((item) => {
39+
const textBeforeLink = `[${item.created_at}]: `;
40+
const parts = item.content.split(/(https?:\/\/[^\s]+)/g);
41+
42+
const messageContent = parts.map((part) => {
43+
if (/https?:\/\/[^\s]+/.test(part)) {
44+
const link = document.createElement('a');
45+
link.href = part;
46+
link.target = '_blank';
47+
link.textContent = part;
48+
return link;
49+
} else {
50+
return document.createTextNode(part);
51+
}
52+
});
53+
54+
fragment.appendChild(document.createTextNode(textBeforeLink));
55+
messageContent.forEach((node) => fragment.appendChild(node));
56+
fragment.appendChild(document.createTextNode('\n'));
57+
});
58+
59+
return fragment;
60+
};

0 commit comments

Comments
 (0)