Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ export function ChatSidebar({
const [editingTitle, setEditingTitle] = useState("");
const inputRef = useRef<HTMLInputElement>(null);

// 获取用户认证状态
// Get user authentication status
const { isLoading: userAuthLoading, isSpeedMode } = useAuth();

// Add delete dialog status
Expand Down
2 changes: 1 addition & 1 deletion frontend/app/[locale]/chat/internal/chatInterface.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1097,7 +1097,7 @@ export function ChatInterface() {
} else {
// Cache has content, display normally
setIsLoadingHistoricalConversation(false);
setIsLoading(false); // 确保 isLoading 状态也被重置
setIsLoading(false); // Ensure isLoading state is also reset

// For cases where there are cached messages, also trigger scrolling to the bottom.
setShouldScrollToBottom(true);
Expand Down
4 changes: 2 additions & 2 deletions frontend/app/[locale]/chat/streaming/chatStreamMain.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ export function ChatStreamMain({
const lastUserMessageIdRef = useRef<string | null>(null);
const messagesEndRef = useRef<HTMLDivElement>(null);

// 处理消息分类
// Handle message classification
useEffect(() => {
const finalMsgs: ChatMessageType[] = [];
const taskMsgs: any[] = [];
Expand Down Expand Up @@ -310,7 +310,7 @@ export function ChatStreamMain({
setShowScrollButton(false);
}

// 显示顶部渐变效果
// Show top gradient effect
if (scrollTop > 10) {
setShowTopFade(true);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ export function ChatStreamMessage({
<ChatAttachment
attachments={message.attachments as AttachmentItem[]}
onImageClick={onImageClick}
className="justify-end" // 靠右对齐
className="justify-end" // Right align
/>
</div>
</div>
Expand Down
10 changes: 5 additions & 5 deletions frontend/app/[locale]/chat/streaming/taskWindow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -938,7 +938,7 @@ export function TaskWindow({ messages, isStreaming = false }: TaskWindowProps) {
if (lastMessage.finalAnswer) {
const timer = setTimeout(() => {
setIsExpanded(false);
}, 1000); // 1秒后折叠
}, 1000); // Collapse after 1 second
return () => clearTimeout(timer);
}
}
Expand Down Expand Up @@ -1004,9 +1004,9 @@ export function TaskWindow({ messages, isStreaming = false }: TaskWindowProps) {

return (
<div key={message.id || groupIndex} className="relative mb-5">
{/* 使用flex布局确保圆点与文本内容对齐 */}
{/* Use flex layout to ensure dots align with text content */}
<div className="flex items-start">
{/* 圆点容器 */}
{/* Dot container */}
<div
className="flex-shrink-0 mr-3"
style={{ position: "relative", top: "0.95rem" }}
Expand All @@ -1033,7 +1033,7 @@ export function TaskWindow({ messages, isStreaming = false }: TaskWindowProps) {
></div>
</div>

{/* 消息内容 */}
{/* Message content */}
<div className="flex-1 text-sm break-words min-w-0">
{renderMessageContent(message)}

Expand All @@ -1056,7 +1056,7 @@ export function TaskWindow({ messages, isStreaming = false }: TaskWindowProps) {
);
};

// 计算容器高度:内容高度 + header高度,但不超过最大高度
// Calculate container height: content height + header height, but not exceeding maximum height
const maxHeight = 300;
const headerHeight = 55;
const availableHeight = maxHeight - headerHeight;
Expand Down
28 changes: 14 additions & 14 deletions frontend/app/[locale]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,40 +57,40 @@ export default function Home() {
const [adminRequiredPromptOpen, setAdminRequiredPromptOpen] =
useState(false);

// 处理需要登录的操作
// Handle operations that require login
const handleAuthRequired = (e: React.MouseEvent) => {
if (!user) {
e.preventDefault();
setLoginPromptOpen(true);
}
};

// 确认登录对话框
// Confirm login dialog
const handleCloseLoginPrompt = () => {
setLoginPromptOpen(false);
};

// 处理登录按钮点击
// Handle login button click
const handleLoginClick = () => {
setLoginPromptOpen(false);
openLoginModal();
};

// 处理注册按钮点击
// Handle register button click
const handleRegisterClick = () => {
setLoginPromptOpen(false);
openRegisterModal();
};

// 处理需要管理员权限的操作
// Handle operations that require admin privileges
const handleAdminRequired = (e: React.MouseEvent) => {
if (user?.role !== "admin") {
e.preventDefault();
setAdminRequiredPromptOpen(true);
}
};

// 关闭管理员提示框
// Close admin prompt dialog
const handleCloseAdminPrompt = () => {
setAdminRequiredPromptOpen(false);
};
Expand All @@ -115,7 +115,7 @@ export default function Home() {
</h1>
</div>
<div className="hidden md:flex items-center gap-6">
{/* Github 按钮 */}
{/* Github button */}
<Link
href="https://github.com/ModelEngine-Group/nexent"
target="_blank"
Expand All @@ -133,7 +133,7 @@ export default function Home() {
</svg>
Github
</Link>
{/* ModelEngine 链接始终显示 */}
{/* ModelEngine link always visible */}
<Link
href="http://modelengine-ai.net"
className="text-sm font-medium text-slate-600 hover:text-slate-900 dark:text-slate-300 dark:hover:text-white transition-colors"
Expand All @@ -156,7 +156,7 @@ export default function Home() {
<DownOutlined className="text-[10px]" />
</a>
</Dropdown>
{/* 登录状态切换显示 - 只在完整版显示 */}
{/* Login status toggle display - only shown in full version */}
{!isSpeedMode && (
<>
{userLoading ? (
Expand All @@ -172,7 +172,7 @@ export default function Home() {
</>
)}
</div>
{/* 右侧汉堡按钮 为移动版预留 */}
{/* Right hamburger button reserved for mobile version */}
<Button variant="ghost" size="icon" className="md:hidden">
<svg
xmlns="http://www.w3.org/2000/svg"
Expand Down Expand Up @@ -244,7 +244,7 @@ export default function Home() {
</Link>
</motion.div>

{/* 数据保护提示 - 只在完整版显示 */}
{/* Data protection notice - only shown in full version */}
{!isSpeedMode && (
<motion.div
initial={{ opacity: 0, y: 20 }}
Expand Down Expand Up @@ -359,7 +359,7 @@ export default function Home() {
</div>
</footer>

{/* 登录提示对话框 - 只在完整版显示 */}
{/* Login prompt dialog - only shown in full version */}
{!isSpeedMode && (
<Modal
title={t("page.loginPrompt.title")}
Expand Down Expand Up @@ -432,15 +432,15 @@ export default function Home() {
</Modal>
)}

{/* 登录和注册模态框 - 只在完整版显示 */}
{/* Login and register modals - only shown in full version */}
{!isSpeedMode && (
<>
<LoginModal />
<RegisterModal />
</>
)}

{/* 管理员提示对话框 - 只在完整版显示 */}
{/* Admin prompt dialog - only shown in full version */}
{!isSpeedMode && (
<Modal
title={t("page.adminPrompt.title")}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,30 +6,30 @@ import { SyncOutlined, PlusOutlined } from '@ant-design/icons'

import { KnowledgeBase } from '@/types/knowledgeBase'

// 知识库布局常量配置
// Knowledge base layout constants configuration
const KB_LAYOUT = {
// 知识库行高配置
ROW_PADDING: 'py-4', // 行垂直内边距
HEADER_PADDING: 'p-3', // 列表头部内边距
BUTTON_PADDING: 'p-2', // 创建按钮区域内边距
TAG_SPACING: 'gap-0.5', // 标签之间的间距
TAG_MARGIN: 'mt-2.5', // 标签容器上边距
// 标签相关配置
TAG_PADDING: 'px-1.5 py-0.5', // 标签内边距
TAG_TEXT: 'text-xs font-medium', // 标签文字样式
TAG_ROUNDED: 'rounded-md', // 标签圆角
// 换行相关配置
TAG_BREAK_HEIGHT: 'h-0.5', // 换行间隔高度
SECOND_ROW_TAG_MARGIN: 'mt-0.5', // 第二行标签上边距
// 其他布局配置
TITLE_MARGIN: 'ml-2', // 标题左边距
EMPTY_STATE_PADDING: 'py-4', // 空状态内边距
// 标题相关配置
TITLE_TEXT: 'text-xl font-bold', // 标题文字样式
KB_NAME_TEXT: 'text-lg font-medium', // 知识库名称文字样式
// 知识库名称配置
KB_NAME_MAX_WIDTH: '220px', // 知识库名称最大宽度
KB_NAME_OVERFLOW: { // 知识库名称溢出样式
// Knowledge base row height configuration
ROW_PADDING: 'py-4', // Row vertical padding
HEADER_PADDING: 'p-3', // List header padding
BUTTON_PADDING: 'p-2', // Create button area padding
TAG_SPACING: 'gap-0.5', // Spacing between tags
TAG_MARGIN: 'mt-2.5', // Tag container top margin
// Tag related configuration
TAG_PADDING: 'px-1.5 py-0.5', // Tag padding
TAG_TEXT: 'text-xs font-medium', // Tag text style
TAG_ROUNDED: 'rounded-md', // Tag rounded corners
// Line break related configuration
TAG_BREAK_HEIGHT: 'h-0.5', // Line break interval height
SECOND_ROW_TAG_MARGIN: 'mt-0.5', // Second row tag top margin
// Other layout configuration
TITLE_MARGIN: 'ml-2', // Title left margin
EMPTY_STATE_PADDING: 'py-4', // Empty state padding
// Title related configuration
TITLE_TEXT: 'text-xl font-bold', // Title text style
KB_NAME_TEXT: 'text-lg font-medium', // Knowledge base name text style
// Knowledge base name configuration
KB_NAME_MAX_WIDTH: '220px', // Knowledge base name max width
KB_NAME_OVERFLOW: { // Knowledge base name overflow style
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
overflow: 'hidden',
Expand All @@ -50,8 +50,8 @@ interface KnowledgeBaseListProps {
onCreateNew: () => void
isSelectable: (kb: KnowledgeBase) => boolean
getModelDisplayName: (modelId: string) => string
containerHeight?: string // 容器总高度,与DocumentList保持一致
onKnowledgeBaseChange?: () => void // 新增:知识库切换时的回调函数
containerHeight?: string // Container total height, consistent with DocumentList
onKnowledgeBaseChange?: () => void // New: callback function when knowledge base switches
}

const KnowledgeBaseList: React.FC<KnowledgeBaseListProps> = ({
Expand All @@ -67,25 +67,25 @@ const KnowledgeBaseList: React.FC<KnowledgeBaseListProps> = ({
onCreateNew,
isSelectable,
getModelDisplayName,
containerHeight = '70vh', // 默认与DocumentList一致的容器高度
onKnowledgeBaseChange // 新增:知识库切换时的回调函数
containerHeight = '70vh', // Default container height consistent with DocumentList
onKnowledgeBaseChange // New: callback function when knowledge base switches
}) => {
const { t } = useTranslation();

// 格式化日期函数,只保留日期部分
// Format date function, only keep date part
const formatDate = (dateString: number) => {
try {
const date = new Date(dateString);
return date.toISOString().split('T')[0]; // 只返回YYYY-MM-DD部分
return date.toISOString().split('T')[0]; // Only return YYYY-MM-DD part
} catch (e) {
return dateString; // 如果解析失败,返回原始字符串
return dateString; // If parsing fails, return original string
}
};


return (
<div className="w-full bg-white border border-gray-200 rounded-md flex flex-col" style={{ height: containerHeight }}>
{/* 固定的头部区域 */}
{/* Fixed header area */}
<div className={`${KB_LAYOUT.HEADER_PADDING} border-b border-gray-200 shrink-0`}>
<div className="flex items-center justify-between">
<div>
Expand Down Expand Up @@ -142,7 +142,7 @@ const KnowledgeBaseList: React.FC<KnowledgeBaseListProps> = ({
</div>
</div>

{/* 固定的选择状态区域 */}
{/* Fixed selection status area */}
<div className="border-b border-gray-200 shrink-0 relative z-10 shadow-md">
<div className="px-5 py-2 bg-blue-50">
<div className="flex items-center">
Expand Down Expand Up @@ -186,7 +186,7 @@ const KnowledgeBaseList: React.FC<KnowledgeBaseListProps> = ({
</div>
</div>

{/* 可滚动的知识库列表区域 */}
{/* Scrollable knowledge base list area */}
<div className="flex-1 overflow-y-auto overflow-x-hidden">
{knowledgeBases.length > 0 ? (
<div className="divide-y-0">
Expand Down Expand Up @@ -272,30 +272,30 @@ const KnowledgeBaseList: React.FC<KnowledgeBaseListProps> = ({
</button>
</div>
<div className={`flex flex-wrap items-center ${KB_LAYOUT.TAG_MARGIN} ${KB_LAYOUT.TAG_SPACING}`}>
{/* 文档数量标签 */}
{/* Document count tag */}
<span className={`inline-flex items-center ${KB_LAYOUT.TAG_PADDING} ${KB_LAYOUT.TAG_ROUNDED} ${KB_LAYOUT.TAG_TEXT} bg-gray-200 text-gray-800 border border-gray-200 mr-1`}>
{t('knowledgeBase.tag.documents', { count: kb.documentCount || 0 })}
</span>

{/* 分块数量标签 */}
{/* Chunk count tag */}
<span className={`inline-flex items-center ${KB_LAYOUT.TAG_PADDING} ${KB_LAYOUT.TAG_ROUNDED} ${KB_LAYOUT.TAG_TEXT} bg-gray-200 text-gray-800 border border-gray-200 mr-1`}>
{t('knowledgeBase.tag.chunks', { count: kb.chunkCount || 0 })}
</span>

{/* 知识库来源标签 */}
{/* Knowledge base source tag */}
<span className={`inline-flex items-center ${KB_LAYOUT.TAG_PADDING} ${KB_LAYOUT.TAG_ROUNDED} ${KB_LAYOUT.TAG_TEXT} bg-gray-200 text-gray-800 border border-gray-200 mr-1`}>
{t('knowledgeBase.tag.source', { source: kb.source })}
</span>

{/* 创建日期标签 - 只显示日期 */}
{/* Creation date tag - only show date */}
<span className={`inline-flex items-center ${KB_LAYOUT.TAG_PADDING} ${KB_LAYOUT.TAG_ROUNDED} ${KB_LAYOUT.TAG_TEXT} bg-gray-200 text-gray-800 border border-gray-200 mr-1`}>
{t('knowledgeBase.tag.createdAt', { date: formatDate(kb.createdAt) })}
</span>

{/* 强制换行 */}
{/* Force line break */}
<div className={`w-full ${KB_LAYOUT.TAG_BREAK_HEIGHT}`}></div>

{/* 模型标签 - 显示正常或不匹配 */}
{/* Model tag - show normal or mismatch */}
<span className={`inline-flex items-center ${KB_LAYOUT.TAG_PADDING} ${KB_LAYOUT.TAG_ROUNDED} ${KB_LAYOUT.TAG_TEXT} ${KB_LAYOUT.SECOND_ROW_TAG_MARGIN} bg-green-100 text-green-800 border border-green-200 mr-1`}>
{t('knowledgeBase.tag.model', { model: getModelDisplayName(kb.embeddingModel) })}
</span>
Expand Down
Loading