From 477d40472736917d95e5278690e68d4330a1433d Mon Sep 17 00:00:00 2001 From: yujiangping Date: Mon, 16 Mar 2026 18:57:49 +0800 Subject: [PATCH 1/2] feat:knowledge ui change --- web/src/views/KnowledgeBase/index.tsx | 68 +++++++++++++++++---------- web/src/views/KnowledgeBase/types.ts | 1 + 2 files changed, 44 insertions(+), 25 deletions(-) diff --git a/web/src/views/KnowledgeBase/index.tsx b/web/src/views/KnowledgeBase/index.tsx index 1ad6997b..165c16f9 100644 --- a/web/src/views/KnowledgeBase/index.tsx +++ b/web/src/views/KnowledgeBase/index.tsx @@ -1,7 +1,7 @@ import { useEffect, useState, useRef, useMemo, useCallback, type FC } from 'react'; import { Row, Col, Button, Dropdown, Modal, message, Tooltip } from 'antd' import type { MenuProps } from 'antd'; -import { EllipsisOutlined } from '@ant-design/icons'; +import { EllipsisOutlined, RightOutlined, DownOutlined } from '@ant-design/icons'; import { useNavigate, useLocation } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; @@ -185,7 +185,7 @@ const KnowledgeBaseManagement: FC = () => { } }; const formatData = (data: KnowledgeBaseListItem) => { - const keys: (keyof KnowledgeBaseListItem)[] = ['type', 'permission_id'] + const keys: (keyof KnowledgeBaseListItem)[] = ['permission_id','type'] return keys.map(key => ({ key, label: t(`knowledgeBase.${key}`), @@ -569,7 +569,9 @@ const KnowledgeBaseManagement: FC = () => { e.stopPropagation()}> @@ -578,41 +580,57 @@ const KnowledgeBaseManagement: FC = () => { } > -
handleToDetail(item)}> -
+
handleToDetail(item)}> +
+ {/*
{t('knowledgeBase.description')}
*/} + +
{(item.description && item.description != '') ? item.description : t('knowledgeBase.noDescription')}
+
+
+
{item.descriptionItems?.map((description: Record) => (
-
{(description.label as string)}
+
{(description.label as string)}
{(description.children as string)}
))} - {item.description && ( -
-
{t('knowledgeBase.description')}
- -
{item.description || t('knowledgeBase.noDescription')}
-
-
- )} +
{hasModelInfo && ( - +
e.stopPropagation()}>
e.stopPropagation()} + className="rb:flex rb:items-center rb:pt-2 rb:px-2 rb:text-[12px] rb:leading-5 rb:cursor-pointer rb:rounded rb:transition-colors" + onClick={() => { + setData(prev => prev.map(d => d.id === item.id ? { ...d, _expanded: !d._expanded } : d)); + }} > - {t('knowledgeBase.models')}: - - {modelInfo.summary.join('、')} - + {/* {t('knowledgeBase.models')}: */} + + {modelInfo.summary[0].split(':')[0]}:{modelInfo.summary[0].split(':').slice(1).join(':')} + + + {item._expanded ? : } +
- + {item._expanded && ( +
+ {modelInfo.summary.slice(1).map((text, idx) => { + const [label, value] = text.split(':'); + return ( +
+ {label}:{value} +
+ ); + })} +
+ )} +
)}
diff --git a/web/src/views/KnowledgeBase/types.ts b/web/src/views/KnowledgeBase/types.ts index 373de344..f5abf955 100644 --- a/web/src/views/KnowledgeBase/types.ts +++ b/web/src/views/KnowledgeBase/types.ts @@ -283,6 +283,7 @@ export interface KnowledgeBaseListItem extends KnowledgeBase { reranker?: Model; llm?: Model; image2text?: Model; + _expanded?: boolean; } // 知识库列表响应 From f4f04036f39dca20fbeb873664e01540fca73dd1 Mon Sep 17 00:00:00 2001 From: yujiangping Date: Tue, 17 Mar 2026 15:41:16 +0800 Subject: [PATCH 2/2] feat:knowledge ui upgrade --- web/src/assets/images/CloudUploadOutlined.svg | 26 + web/src/components/Upload/UploadFiles.tsx | 4 +- web/src/i18n/en.ts | 1 + web/src/i18n/zh.ts | 1 + .../[knowledgeBaseId]/CreateDataset.tsx | 560 +++++++++--------- .../[knowledgeBaseId]/Private.css | 15 +- .../[knowledgeBaseId]/Private.tsx | 8 +- .../KnowledgeBase/[knowledgeBaseId]/Share.tsx | 25 +- .../components/KnowledgeGraph.tsx | 6 +- .../KnowledgeBase/components/RecallTest.tsx | 6 +- .../components/RecallTestDrawer.tsx | 2 +- .../components/RecallTestResult.tsx | 8 +- 12 files changed, 354 insertions(+), 308 deletions(-) create mode 100644 web/src/assets/images/CloudUploadOutlined.svg diff --git a/web/src/assets/images/CloudUploadOutlined.svg b/web/src/assets/images/CloudUploadOutlined.svg new file mode 100644 index 00000000..86fdf286 --- /dev/null +++ b/web/src/assets/images/CloudUploadOutlined.svg @@ -0,0 +1,26 @@ + + + 编组 12 + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/src/components/Upload/UploadFiles.tsx b/web/src/components/Upload/UploadFiles.tsx index 68377d4d..36ae859d 100644 --- a/web/src/components/Upload/UploadFiles.tsx +++ b/web/src/components/Upload/UploadFiles.tsx @@ -240,10 +240,10 @@ const UploadFiles = forwardRef(({ if (isCanDrag) { return ( -
+
-
+
{(!isAutoUpload || !hasProgress && (!fileList || !fileList.length)) && <>
diff --git a/web/src/i18n/en.ts b/web/src/i18n/en.ts index 4df98709..572fe8ab 100644 --- a/web/src/i18n/en.ts +++ b/web/src/i18n/en.ts @@ -630,6 +630,7 @@ export const en = { documentInfo: 'Document Information', documentPreview:'Document Preview', type: 'Type', + viewBasicInfo: 'View Basic Information', permission_id: 'Permission', status: 'Status', created_at: 'Created At', diff --git a/web/src/i18n/zh.ts b/web/src/i18n/zh.ts index 1808c18a..538d25ac 100644 --- a/web/src/i18n/zh.ts +++ b/web/src/i18n/zh.ts @@ -133,6 +133,7 @@ export const zh = { documentInfo: '文档信息', documentPreview: '文档预览', type: '类型', + viewBasicInfo:'查看基本信息', permission_id: '权限', status: '状态', created_at: '创建时间', diff --git a/web/src/views/KnowledgeBase/[knowledgeBaseId]/CreateDataset.tsx b/web/src/views/KnowledgeBase/[knowledgeBaseId]/CreateDataset.tsx index 760c4292..e9478481 100644 --- a/web/src/views/KnowledgeBase/[knowledgeBaseId]/CreateDataset.tsx +++ b/web/src/views/KnowledgeBase/[knowledgeBaseId]/CreateDataset.tsx @@ -2,6 +2,7 @@ import { useMemo,useRef, useState, useEffect } from 'react'; import { Button, Flex, Radio, Steps, Modal, Input, Spin, message, Checkbox, Select, Form, Progress} from 'antd'; import { useTranslation } from 'react-i18next'; import { useLocation, useNavigate, useParams } from 'react-router-dom'; +import './Private.css'; import Table, { type TableRef } from '@/components/Table' import type { AnyObject } from 'antd/es/_util/type'; import type { UploadFileResponse,KnowledgeBaseDocumentData } from '@/views/KnowledgeBase/types'; @@ -32,7 +33,7 @@ const { TextArea } = Input; }; const getActiveRadioStyle = (active: boolean): React.CSSProperties => ({ ...radioWrapperBaseStyle, - border: active ? '1px solid #1677ff' : radioWrapperBaseStyle.border, + border: active ? '1px solid #171719' : radioWrapperBaseStyle.border, }); @@ -549,7 +550,7 @@ const CreateDataset = () => { <> {contextHolder} -
+
{/* {t('knowledgeBase.createA') + ' ' + t('knowledgeBase.dataset')} */} @@ -557,298 +558,299 @@ const CreateDataset = () => { exit {t('common.exit')}
-
- +
+
- +
- {current === 0 && ( -
- {source && source === 'local' && ( - { - console.log('File list changed:', fileList); - }} - onRemove={async (file) => { - // 如果文件正在上传,取消上传 - const fileUid = file.uid; - const abortController = abortControllersRef.current.get(fileUid); - if (abortController) { - abortController.abort(); - abortControllersRef.current.delete(fileUid); - console.log('Upload cancelled:', (file as any).name); - // 取消上传后直接返回 true,允许移除文件 - return true; - } - - // Only delete server file when file upload was successful (has response.id) - if (file.response?.id) { - try { - await deleteDocument(file.response.id); - setRechunkFileIds(prev => prev.filter(id => id !== file.response.id)); - console.log('Server file deleted:', file.response.id); + {current === 0 && ( +
+ {source && source === 'local' && ( + { + console.log('File list changed:', fileList); + }} + onRemove={async (file) => { + // 如果文件正在上传,取消上传 + const fileUid = file.uid; + const abortController = abortControllersRef.current.get(fileUid); + if (abortController) { + abortController.abort(); + abortControllersRef.current.delete(fileUid); + console.log('Upload cancelled:', (file as any).name); + // 取消上传后直接返回 true,允许移除文件 return true; - } catch (error) { - console.error('Failed to delete file:', error); - messageApi.error(t('common.deleteFailed') || 'Failed to delete file'); - return false; // Don't remove file when deletion fails } - } - - // Also allow removal in other cases (such as failed uploads) - return true; - }} /> - )} - {source && source === 'link' && ( -
+ + // Only delete server file when file upload was successful (has response.id) + if (file.response?.id) { + try { + await deleteDocument(file.response.id); + setRechunkFileIds(prev => prev.filter(id => id !== file.response.id)); + console.log('Server file deleted:', file.response.id); + return true; + } catch (error) { + console.error('Failed to delete file:', error); + messageApi.error(t('common.deleteFailed') || 'Failed to delete file'); + return false; // Don't remove file when deletion fails + } + } + + // Also allow removal in other cases (such as failed uploads) + return true; + }} /> + )} + {source && source === 'link' && ( +
-
- {t('knowledgeBase.webLink')} -
-