diff --git a/frontend/app/[locale]/agents/components/agentConfig/SkillBuildModal.tsx b/frontend/app/[locale]/agents/components/agentConfig/SkillBuildModal.tsx index 7f969edb9..8f040d4b3 100644 --- a/frontend/app/[locale]/agents/components/agentConfig/SkillBuildModal.tsx +++ b/frontend/app/[locale]/agents/components/agentConfig/SkillBuildModal.tsx @@ -56,7 +56,7 @@ import { SkillFilesAccessDeniedError, type SkillFileNode, } from "@/services/agentConfigService"; -import { MarkdownRenderer } from "@/components/ui/markdownRenderer"; +import { MarkdownRenderer } from "@/components/common/markdownRenderer"; import log from "@/lib/logger"; const { TextArea } = Input; diff --git a/frontend/app/[locale]/agents/components/agentConfig/SkillDetailModal.tsx b/frontend/app/[locale]/agents/components/agentConfig/SkillDetailModal.tsx index 4161a3b1a..05f11d6a3 100644 --- a/frontend/app/[locale]/agents/components/agentConfig/SkillDetailModal.tsx +++ b/frontend/app/[locale]/agents/components/agentConfig/SkillDetailModal.tsx @@ -10,7 +10,7 @@ import { fetchSkillFileContent, SkillFilesAccessDeniedError, } from "@/services/agentConfigService"; -import { MarkdownRenderer } from "@/components/ui/markdownRenderer"; +import { MarkdownRenderer } from "@/components/common/markdownRenderer"; import { buildTreeData, collectDirKeys, diff --git a/frontend/app/[locale]/agents/components/agentConfig/skill/SkillConfigModal.tsx b/frontend/app/[locale]/agents/components/agentConfig/skill/SkillConfigModal.tsx index 6f372e2b4..9729007e2 100644 --- a/frontend/app/[locale]/agents/components/agentConfig/skill/SkillConfigModal.tsx +++ b/frontend/app/[locale]/agents/components/agentConfig/skill/SkillConfigModal.tsx @@ -12,13 +12,13 @@ import { message, Tag, Skeleton, + Tooltip } from "antd"; import { Settings } from "lucide-react"; import { CloseOutlined } from "@ant-design/icons"; import { Skill, SkillParam } from "@/types/agentConfig"; import { KnowledgeBase } from "@/types/knowledgeBase"; -import { Tooltip } from "@/components/ui/tooltip"; import { saveSkillInstance } from "@/services/agentConfigService"; import KnowledgeBaseSelectorModal from "@/components/tool-config/KnowledgeBaseSelectorModal"; import { diff --git a/frontend/app/[locale]/chat/components/chatAttachment.tsx b/frontend/app/[locale]/chat/components/chatAttachment.tsx index d12e939cd..69dfbc71a 100644 --- a/frontend/app/[locale]/chat/components/chatAttachment.tsx +++ b/frontend/app/[locale]/chat/components/chatAttachment.tsx @@ -19,7 +19,7 @@ import { } from "@/services/storageService"; import { cn } from "@/lib/utils"; import { AttachmentItem, ChatAttachmentProps } from "@/types/chat"; -import { FilePreviewDrawer } from "@/components/ui/filePreviewDrawer"; +import { FilePreviewDrawer } from "@/components/common/filePreviewDrawer"; import { App } from "antd"; // Selected file state for preview drawer diff --git a/frontend/app/[locale]/chat/components/chatInput.tsx b/frontend/app/[locale]/chat/components/chatInput.tsx index b609bb999..512f940e9 100644 --- a/frontend/app/[locale]/chat/components/chatInput.tsx +++ b/frontend/app/[locale]/chat/components/chatInput.tsx @@ -15,10 +15,9 @@ import { } from "@ant-design/icons"; import { Input } from "@/components/ui/input"; -import { Button } from "antd"; -import { Tooltip } from "@/components/ui/tooltip"; +import { Button, Tooltip } from "antd"; import { Textarea } from "@/components/ui/textarea"; -import { FilePreviewDrawer } from "@/components/ui/filePreviewDrawer"; +import { FilePreviewDrawer } from "@/components/common/filePreviewDrawer"; import { conversationService } from "@/services/conversationService"; import { useConfig } from "@/hooks/useConfig"; import { extractColorsFromUri } from "@/lib/avatar"; @@ -27,7 +26,7 @@ import { chatConfig } from "@/const/chatConfig"; import { FilePreview } from "@/types/chat"; import { ChatAgentSelector } from "./chatAgentSelector"; -import { TokenUsageIndicator } from "@/components/ui/tokenUsageIndicator"; +import { TokenUsageIndicator } from "@/components/common/tokenUsageIndicator"; import { TokenMetrics } from "@/types/chat"; // Get file extension diff --git a/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx b/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx index 8ed121b00..285225f23 100644 --- a/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx +++ b/frontend/app/[locale]/chat/streaming/chatStreamFinalMessage.tsx @@ -10,7 +10,7 @@ import { ThumbsUp, } from "lucide-react"; -import { MarkdownRenderer } from "@/components/ui/markdownRenderer"; +import { MarkdownRenderer } from "@/components/common/markdownRenderer"; /** * Convert custom code tags to standard markdown code fences @@ -30,8 +30,7 @@ const convertToMarkdownCodeFences = (content: string): string => { }); return content; }; -import { Button } from "antd"; -import { Tooltip, TooltipProvider } from "@/components/ui/tooltip"; +import { Button, Tooltip } from "antd"; import { ChatMessageType, MaxStepsInfo } from "@/types/chat"; import { chatConfig, Opinion } from "@/const/chatConfig"; import { conversationService } from "@/services/conversationService"; @@ -403,7 +402,7 @@ function ChatStreamFinalMessageInner({ {/* Tool button */}
- +
{/* Copy button */} - +
)} diff --git a/frontend/app/[locale]/chat/streaming/taskWindow.tsx b/frontend/app/[locale]/chat/streaming/taskWindow.tsx index 665ed8467..5a5e7a89a 100644 --- a/frontend/app/[locale]/chat/streaming/taskWindow.tsx +++ b/frontend/app/[locale]/chat/streaming/taskWindow.tsx @@ -13,7 +13,7 @@ import { import { ScrollArea } from "@/components/ui/scrollArea"; import { Button, message as antdMessage } from "antd"; -import { MarkdownRenderer, CodeBlock } from "@/components/ui/markdownRenderer"; +import { MarkdownRenderer, CodeBlock } from "@/components/common/markdownRenderer"; import { chatConfig } from "@/const/chatConfig"; import { ChatMessageType, diff --git a/frontend/app/[locale]/knowledges/components/document/DocumentList.tsx b/frontend/app/[locale]/knowledges/components/document/DocumentList.tsx index 0bfbe6467..4f75fd66e 100644 --- a/frontend/app/[locale]/knowledges/components/document/DocumentList.tsx +++ b/frontend/app/[locale]/knowledges/components/document/DocumentList.tsx @@ -18,8 +18,8 @@ import { Glasses, CircleOff, } from "lucide-react"; -import { MarkdownRenderer } from "@/components/ui/markdownRenderer"; -import { FilePreviewDrawer } from "@/components/ui/filePreviewDrawer"; +import { MarkdownRenderer } from "@/components/common/markdownRenderer"; +import { FilePreviewDrawer } from "@/components/common/filePreviewDrawer"; import { UI_CONFIG, diff --git a/frontend/app/[locale]/knowledges/components/knowledge/KnowledgeBaseList.tsx b/frontend/app/[locale]/knowledges/components/knowledge/KnowledgeBaseList.tsx index 7f4878523..53758147b 100644 --- a/frontend/app/[locale]/knowledges/components/knowledge/KnowledgeBaseList.tsx +++ b/frontend/app/[locale]/knowledges/components/knowledge/KnowledgeBaseList.tsx @@ -3,7 +3,7 @@ import { useTranslation } from "react-i18next"; import log from "@/lib/logger"; -import { Button, Input, Select } from "antd"; +import { Button, Input, Select, Tooltip } from "antd"; import { SyncOutlined, PlusOutlined, @@ -19,7 +19,6 @@ import { SquarePen, CircleOff, } from "lucide-react"; -import { Tooltip } from "@/components/ui/tooltip"; import { Can } from "@/components/permission/Can"; import { useAuthorizationContext } from "@/components/providers/AuthorizationProvider"; import { useGroupList } from "@/hooks/group/useGroupList"; diff --git a/frontend/app/[locale]/tenant-resources/components/AssetOwnerResourcesComp.tsx b/frontend/app/[locale]/tenant-resources/components/AssetOwnerResourcesComp.tsx index 38fb3ceb1..6cf23c0a9 100644 --- a/frontend/app/[locale]/tenant-resources/components/AssetOwnerResourcesComp.tsx +++ b/frontend/app/[locale]/tenant-resources/components/AssetOwnerResourcesComp.tsx @@ -54,7 +54,7 @@ export default function AssetOwnerResourcesComp() { ); } + + diff --git a/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx b/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx index f4d20ae0b..cfff26fe9 100644 --- a/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx +++ b/frontend/app/[locale]/tenant-resources/components/UserManageComp.tsx @@ -18,6 +18,8 @@ import { Pagination, Alert, Space, + Divider, + Tooltip } from "antd"; import { Users, @@ -62,7 +64,6 @@ import { useDeployment } from "@/components/providers/deploymentProvider"; import { useAuthorizationContext } from "@/components/providers/AuthorizationProvider"; import { USER_ROLES } from "@/const/auth"; import { Can } from "@/components/permission/Can"; -import { Tooltip } from "@/components/ui/tooltip"; import { getPasswordChecks, getStrengthLevel, @@ -1179,167 +1180,182 @@ export default function UserManageComp() { }; return ( -
+
{/* Page header: grouped header without dividing line */} -
- -
-
- -
-
-

- {t("tenantResources.title") || "Tenant Resource Management"} -

-

- {t("tenantResources.subtitle") || - "Manage tenants, users, groups and resources"} -

-
+
+
+
+
- +
+

+ {t("tenantResources.title") || "Tenant Resource Management"} +

+

+ {t("tenantResources.subtitle") || + "Manage tenants, users, groups and resources"} +

+
+
- - - -
-
-
- setTenantId(id)} - tenants={tenantData?.data || []} - total={tenantData?.total} - page={tenantData?.page} - pageSize={tenantData?.page_size} - totalPages={tenantData?.total_pages} - onPageChange={handlePageChange} - onTenantsRefetch={async () => { - setCurrentPage(1); - return refetchTenants(); - }} - loading={tenantsLoading} - t={t} - onUserListRefresh={() => - setUserListRefreshKey((prev) => prev + 1) - } - onInvitationListRefresh={() => - setInvitationListRefreshKey((prev) => prev + 1) - } - locale={locale} - /> +
+
+ + +
+
+
+ setTenantId(id)} + tenants={tenantData?.data || []} + total={tenantData?.total} + page={tenantData?.page} + pageSize={tenantData?.page_size} + totalPages={tenantData?.total_pages} + onPageChange={handlePageChange} + onTenantsRefetch={async () => { + setCurrentPage(1); + return refetchTenants(); + }} + loading={tenantsLoading} + t={t} + onUserListRefresh={() => + setUserListRefreshKey((prev) => prev + 1) + } + onInvitationListRefresh={() => + setInvitationListRefreshKey((prev) => prev + 1) + } + locale={locale} + /> +
-
- - - -
- {/* Tenant name header */} -
- {isEditingTenantName ? ( - setEditingTenantName(e.target.value)} - onBlur={saveTenantName} - onKeyDown={handleTenantNameKeyDown} - className="text-lg font-semibold text-gray-900 dark:text-gray-100" - placeholder={t("tenantResources.tenants.name")} - /> - ) : ( -
-

- {currentTenantName} -

- + + + +
+ {/* Tenant name header */} +
+ {isEditingTenantName ? ( + setEditingTenantName(e.target.value)} + onBlur={saveTenantName} + onKeyDown={handleTenantNameKeyDown} + className="text-lg font-semibold text-gray-900 dark:text-gray-100" + placeholder={t("tenantResources.tenants.name")} + /> + ) : ( +
+

+ {currentTenantName} +

+ +
+ )} + +
+ +
+ +
+ {tenantId ? ( + + ), + }, + { + key: "groups", + label: t("tenantResources.tabs.groups") || "Groups", + children: , + }, + { + key: "models", + label: t("tenantResources.tabs.models") || "Models", + children: , + }, + { + key: "knowledge", + label: + t("tenantResources.tabs.knowledge") || "Knowledge Base", + children: , + }, + { + key: "agents", + label: t("tenantResources.tabs.agents") || "Agents", + children: , + }, + { + key: "mcp", + label: t("tenantResources.tabs.mcp") || "MCP", + children: , + }, + { + key: "skills", + label: "Skills", + children: , + }, + { + key: "invitations", + label: t("tenantResources.invitation.tab") || "Invitations", + children: ( + + ), + }, + ]} + /> + ) : ( +
+
+ +
+

+ {t("tenantResources.selectTenantFirst") || + "Please select a tenant"} +

+

+ {t("tenantResources.selectTenantDescription") || + "Choose a tenant from the list to manage its users, groups, models, and knowledge base."} +

+
+ )}
- )} -
- {tenantId ? ( - - ), - }, - { - key: "groups", - label: t("tenantResources.tabs.groups") || "Groups", - children: , - }, - { - key: "models", - label: t("tenantResources.tabs.models") || "Models", - children: , - }, - { - key: "knowledge", - label: - t("tenantResources.tabs.knowledge") || "Knowledge Base", - children: , - }, - { - key: "agents", - label: t("tenantResources.tabs.agents") || "Agents", - children: , - }, - { - key: "mcp", - label: t("tenantResources.tabs.mcp") || "MCP", - children: , - }, - { - key: "skills", - label: "Skills", - children: , - }, - { - key: "invitations", - label: t("tenantResources.invitation.tab") || "Invitations", - children: ( - - ), - }, - ]} - /> - ) : ( -
-
- -
-

- {t("tenantResources.selectTenantFirst") || - "Please select a tenant"} -

-

- {t("tenantResources.selectTenantDescription") || - "Choose a tenant from the list to manage its users, groups, models, and knowledge base."} -

- )} -
- - +
+ +
+
); } + + diff --git a/frontend/app/[locale]/tenant-resources/components/resources/AgentList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/AgentList.tsx index 41fbf4c93..2e2383ad5 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/AgentList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/AgentList.tsx @@ -411,20 +411,19 @@ export default function AgentList({ tenantId }: { tenantId: string | null }) { ]; return ( -
-
-
- - +
+
+
{/* View Modal */} diff --git a/frontend/app/[locale]/tenant-resources/components/resources/GroupList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/GroupList.tsx index ec3397219..32af131db 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/GroupList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/GroupList.tsx @@ -12,9 +12,9 @@ import { Popconfirm, message, Select, + Tooltip } from "antd"; import { Edit, Trash2 } from "lucide-react"; -import { Tooltip } from "@/components/ui/tooltip"; import { ColumnsType } from "antd/es/table"; import { useGroupList } from "@/hooks/group/useGroupList"; import { useUserList } from "@/hooks/user/useUserList"; @@ -278,7 +278,7 @@ export default function GroupList({ tenantId }: { tenantId: string | null }) { }; return ( -
+
diff --git a/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx index 688fda8b1..6365ab68a 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/InvitationList.tsx @@ -17,6 +17,7 @@ import { Collapse, DatePicker, Progress, + Tooltip } from "antd"; import { ColumnsType } from "antd/es/table"; import { useInvitationList } from "@/hooks/invitation/useInvitationList"; @@ -41,7 +42,6 @@ import { Copy, CircleSlash, } from "lucide-react"; -import { Tooltip } from "@/components/ui/tooltip"; import { formatDate } from "@/lib/date"; import { useAuthorizationContext } from "@/components/providers/AuthorizationProvider"; import { @@ -443,7 +443,7 @@ export default function InvitationList({ }, [invitations, tenantId]); return ( -
+
@@ -465,8 +465,8 @@ export default function InvitationList({ loading={isLoading} rowKey="invitation_id" pagination={{ pageSize: 10 }} - scroll={{ x: 1000 }} - className="flex-1" + scroll={{ y: "calc(100vh - 560px)" }} + className="flex-1 [&_.ant-table]:h-full" /> ) : ( // Multi-tenant view with collapse diff --git a/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx index 18d70ad51..7b1a703b1 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/KnowledgeList.tsx @@ -2,11 +2,10 @@ import React, { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; -import { Table, Popconfirm, message, Button, Modal, Tag } from "antd"; +import { Table, Popconfirm, message, Button, Modal, Tag, Tooltip } from "antd"; import { ColumnsType } from "antd/es/table"; import { Edit, Trash2, BookOpen } from "lucide-react"; -import { Tooltip } from "@/components/ui/tooltip"; -import { MarkdownRenderer } from "@/components/ui/markdownRenderer"; +import { MarkdownRenderer } from "@/components/common/markdownRenderer"; import { useKnowledgeList } from "@/hooks/knowledge/useKnowledgeList"; import { useGroupList } from "@/hooks/group/useGroupList"; import knowledgeBaseService from "@/services/knowledgeBaseService"; @@ -255,15 +254,15 @@ export default function KnowledgeList({ ]; return ( -
+
{/* Edit Knowledge Base Modal */} diff --git a/frontend/app/[locale]/tenant-resources/components/resources/McpList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/McpList.tsx index 19e8e23ae..412ff402f 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/McpList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/McpList.tsx @@ -760,7 +760,7 @@ export default function McpList({ tenantId }: { tenantId: string | null }) { ]; return ( -
+
-
-
- {t("mcpConfig.serverList.title")} -
`${record.service_name}-${record.mcp_url}`} - loading={loading} - size="small" - pagination={{ pageSize: 7 }} - locale={{ emptyText: t("mcpConfig.serverList.empty") }} - /> - +
+ {t("mcpConfig.serverList.title")} +
`${record.service_name}-${record.mcp_url}`} + loading={loading} + size="small" + pagination={{ pageSize: 7 }} + locale={{ emptyText: t("mcpConfig.serverList.empty") }} + scroll={{ y: "calc(100vh - 560px)" }} + className="flex-1 [&_.ant-table]:h-full" + /> -
- {t("mcpConfig.containerList.title")} -
- + {t("mcpConfig.containerList.title")} +
-
- {t("mcpConfig.openapiService.list.title")} -
- + {t("mcpConfig.openapiService.list.title")} +
{/* Add Modal */} diff --git a/frontend/app/[locale]/tenant-resources/components/resources/ModelList.tsx b/frontend/app/[locale]/tenant-resources/components/resources/ModelList.tsx index 560df8cb8..6715852f7 100644 --- a/frontend/app/[locale]/tenant-resources/components/resources/ModelList.tsx +++ b/frontend/app/[locale]/tenant-resources/components/resources/ModelList.tsx @@ -2,9 +2,8 @@ import React, { useState, useMemo } from "react"; import { useTranslation } from "react-i18next"; -import { Table, Button, Popconfirm, message, Tag, Segmented } from "antd"; +import { Table, Button, Popconfirm, message, Tag, Segmented, Tooltip } from "antd"; import { Edit, Trash2, RefreshCw } from "lucide-react"; -import { Tooltip } from "@/components/ui/tooltip"; import { ColumnsType } from "antd/es/table"; import type { TablePaginationConfig } from "antd"; import { FilterValue, SorterResult } from "antd/es/table/interface"; @@ -361,7 +360,7 @@ export default function ModelList({ tenantId }: { tenantId: string | null }) { ]; return ( -
+
(null); const [savingParams, setSavingParams] = useState(false); @@ -730,8 +729,8 @@ export default function SkillList({ tenantId }: { tenantId: string | null }) { : "closed"; return ( -
-
+
+
), + width: "20%" }, ], [] @@ -207,7 +210,7 @@ export default function UserList({ tenantId, refreshKey }: { tenantId: string | }; return ( -
+
- - import("@/components/ui/PdfViewer").then((mod) => ({ + import("@/components/common/PdfViewer").then((mod) => ({ default: mod.PdfViewer, })), { diff --git a/frontend/components/ui/markdownRenderer.tsx b/frontend/components/common/markdownRenderer.tsx similarity index 99% rename from frontend/components/ui/markdownRenderer.tsx rename to frontend/components/common/markdownRenderer.tsx index 53dfb6962..93dbcce11 100644 --- a/frontend/components/ui/markdownRenderer.tsx +++ b/frontend/components/common/markdownRenderer.tsx @@ -16,8 +16,8 @@ import { visit } from "unist-util-visit"; import { SearchResult } from "@/types/chat"; import { resolveS3UrlToDataUrl } from "@/services/storageService"; import { Tooltip, TooltipProvider } from "@/components/ui/tooltip"; -import { CopyButton } from "@/components/ui/copyButton"; -import { Diagram } from "@/components/ui/Diagram"; +import { CopyButton } from "@/components/common/copyButton"; +import { Diagram } from "@/components/common/Diagram"; interface MarkdownRendererProps { content: string; diff --git a/frontend/components/ui/tokenUsageIndicator.tsx b/frontend/components/common/tokenUsageIndicator.tsx similarity index 98% rename from frontend/components/ui/tokenUsageIndicator.tsx rename to frontend/components/common/tokenUsageIndicator.tsx index 826787e2b..adde20fbf 100644 --- a/frontend/components/ui/tokenUsageIndicator.tsx +++ b/frontend/components/common/tokenUsageIndicator.tsx @@ -1,8 +1,8 @@ "use client"; import React from "react"; -import { Tooltip } from "@/components/ui/tooltip"; import { TokenMetrics } from "@/types/chat"; +import { Tooltip } from "antd" interface TokenUsageIndicatorProps { latestMetrics: TokenMetrics | null; diff --git a/frontend/components/skill/InstallOfficialSkillsModal.tsx b/frontend/components/skill/InstallOfficialSkillsModal.tsx index e3cc83d1f..b8e8d4ce6 100644 --- a/frontend/components/skill/InstallOfficialSkillsModal.tsx +++ b/frontend/components/skill/InstallOfficialSkillsModal.tsx @@ -1,13 +1,12 @@ "use client"; import React, { useState, useEffect } from "react"; -import { Modal, Spin, message } from "antd"; +import { Modal, Spin, message, Tooltip } from "antd"; import { useTranslation } from "react-i18next"; import { CircleCheckBig, CircleOff, CircleDot, LoaderCircle } from "lucide-react"; import { fetchOfficialSkillsWithStatus, installOfficialSkills } from "@/services/skillService"; import { InstallableSkill } from "@/types/agentConfig"; -import { Tooltip } from "@/components/ui/tooltip"; interface InstallOfficialSkillsModalProps { open: boolean;