diff --git a/web/src/views/KnowledgeBase/[knowledgeBaseId]/DocumentDetails.tsx b/web/src/views/KnowledgeBase/[knowledgeBaseId]/DocumentDetails.tsx index ffe4a3e2..08df86cd 100644 --- a/web/src/views/KnowledgeBase/[knowledgeBaseId]/DocumentDetails.tsx +++ b/web/src/views/KnowledgeBase/[knowledgeBaseId]/DocumentDetails.tsx @@ -33,8 +33,8 @@ const DocumentDetails: FC = () => { documentId, parentId: locationParentId, breadcrumbPath - } = location.state as { - documentId: string; + } = (location.state || {}) as { + documentId?: string; parentId?: string; breadcrumbPath?: BreadcrumbPath; }; @@ -51,6 +51,18 @@ const DocumentDetails: FC = () => { const insertModalRef = useRef(null); const isManualRefreshRef = useRef(false); + // Early return if no documentId + if (!documentId) { + return ( +
+
{t('knowledgeBase.documentIdRequired') || '文档ID不能为空'}
+ +
+ ); + } + useEffect(() => { if (documentId) { fetchDocumentDetail(); diff --git a/web/src/views/KnowledgeBase/components/CreateModal.tsx b/web/src/views/KnowledgeBase/components/CreateModal.tsx index 1094a511..f44907bc 100644 --- a/web/src/views/KnowledgeBase/components/CreateModal.tsx +++ b/web/src/views/KnowledgeBase/components/CreateModal.tsx @@ -617,7 +617,7 @@ const CreateModal = forwardRef(({ {thirdPartyPlatform === 'feishu' && ( <> diff --git a/web/src/views/KnowledgeBase/components/RecallTestResult.tsx b/web/src/views/KnowledgeBase/components/RecallTestResult.tsx index 98c67fd4..eb46d8f4 100644 --- a/web/src/views/KnowledgeBase/components/RecallTestResult.tsx +++ b/web/src/views/KnowledgeBase/components/RecallTestResult.tsx @@ -14,6 +14,7 @@ import { NoData } from './noData'; import { formatDateTime } from '@/utils/format'; import InfiniteScroll from 'react-infinite-scroll-component'; import RbMarkdown from '@/components/Markdown'; +import { useMemo } from 'react'; interface RecallTestResultProps { data: RecallTestData[]; @@ -61,6 +62,36 @@ const RecallTestResult = ({ return `**${t('knowledgeBase.question')}:** ${question}\n**${t('knowledgeBase.answer')}:** ${answer}`; }; + // Check if content is valid HTML + const isValidHTML = (content: string): boolean => { + if (!content) return false; + // Check if content contains HTML tags + const htmlTagPattern = /<[^>]+>/; + return htmlTagPattern.test(content); + }; + + // Render content with HTML or Markdown fallback + const renderTextContent = useMemo(() => { + return (content: string) => { + // Try to render as HTML first + if (isValidHTML(content)) { + try { + return ( +
+ ); + } catch (error) { + console.warn('HTML parsing failed, falling back to Markdown:', error); + } + } + + // Fallback to Markdown rendering + return ; + }; + }, []); + const handleItemClick = (e: React.MouseEvent, item: RecallTestData, index: number) => { // Check if the click is on an image or image-related element const target = e.target as HTMLElement; @@ -167,9 +198,9 @@ const RecallTestResult = ({ const qaContent = parseQAContent(item.page_content); if (qaContent) { const formattedContent = formatQAContent(qaContent.question, qaContent.answer); - return ; + return renderTextContent(formattedContent); } - return ; + return renderTextContent(item.page_content); })()}