From 79ee33be7c26fae2c2512f77f7ee807f0ee4f985 Mon Sep 17 00:00:00 2001 From: "guangfei.zhao" Date: Wed, 19 Nov 2025 17:44:12 +0800 Subject: [PATCH] fix(knowledge): ensure proper id handling in document operations refactor(teams): update user deletion to use user_id instead of id refactor(knowledge): optimize data grid locale handling with useCallback style(knowledge): adjust similarity display format in test chunks refactor(knowledge): improve document selection logic and typing --- .../components/DocumentListComponent.tsx | 43 +++++++++++++------ .../knowledge/components/TestChunkResult.tsx | 6 +-- src/pages/knowledge/detail.tsx | 2 +- src/pages/knowledge/overview.tsx | 9 ++-- src/pages/setting/teams.tsx | 2 +- 5 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/pages/knowledge/components/DocumentListComponent.tsx b/src/pages/knowledge/components/DocumentListComponent.tsx index d9b1b46..4528ac1 100644 --- a/src/pages/knowledge/components/DocumentListComponent.tsx +++ b/src/pages/knowledge/components/DocumentListComponent.tsx @@ -49,7 +49,7 @@ import { BugReportOutlined as ProcessIcon, Download as DownloadIcon, } from '@mui/icons-material'; -import { DataGrid, type GridColDef, type GridRowSelectionModel } from '@mui/x-data-grid'; +import { DataGrid, type GridColDef, type GridRowSelectionModel, type GridRowId } from '@mui/x-data-grid'; import { zhCN, enUS } from '@mui/x-data-grid/locales'; import type { IKnowledgeFile } from '@/interfaces/database/knowledge'; import type { IDocumentInfoFilter } from '@/interfaces/database/document'; @@ -147,7 +147,7 @@ const getStatusChip = (status: string) => { }; const getRunStatusChip = (run: RunningStatus, progress: number) => { - const statusConfig = { + const statusConfig = { [RunningStatus.UNSTART]: { label: translate('knowledge.runStatus.unstart'), color: 'default' as const }, [RunningStatus.RUNNING]: { label: translate('knowledge.runStatus.parsing'), color: 'info' as const }, [RunningStatus.CANCEL]: { label: translate('knowledge.runStatus.cancel'), color: 'warning' as const }, @@ -163,7 +163,7 @@ const getRunStatusChip = (run: RunningStatus, progress: number) => { - {(progress*100).toFixed(2)}% + {(progress * 100).toFixed(2)}% @@ -218,10 +218,10 @@ const DocumentListComponent: React.FC = ({ const { i18n, t } = useTranslation(); // 根据当前语言获取DataGrid的localeText - const getDataGridLocale = () => { + const getDataGridLocale = useCallback(() => { const currentLanguage = i18n.language; return currentLanguage === LanguageAbbreviation.Zh ? zhCN : enUS; - }; + }, [i18n]); const handleFilterSubmit = useCallback(() => { const filter = { @@ -346,6 +346,24 @@ const DocumentListComponent: React.FC = ({ setSelectedSuffix(typeof value === 'string' ? value.split(',') : value); }; + // 选中数量计算(强类型) + const countSelected = (model: GridRowSelectionModel, totalCount: number): number => { + const size = model.ids.size ?? 0; + return model.type === 'exclude' ? Math.max(totalCount - size, 0) : size; + }; + + // 获取当前页有效选中 ID 列表(强类型) + const getSelectedIdsOnCurrentPage = (model: GridRowSelectionModel, currentFiles: IKnowledgeFile[]): string[] => { + if (model.type === 'include') { + return Array.from(model.ids).map((id) => id.toString()); + } + const excluded = model.ids; + return currentFiles + .map((f) => f.id) + .filter((id) => !excluded.has(id)) + .map((id) => id.toString()); + }; + // 处理分页变化 const handlePaginationModelChange = (model: { page: number; pageSize: number }) => { if (model.page !== page - 1) { // DataGrid的page是0-based,我们的是1-based @@ -603,23 +621,22 @@ const DocumentListComponent: React.FC = ({ {t('knowledge.uploadFile')} - {rowSelectionModel.ids.size > 0 && ( + {countSelected(rowSelectionModel, total) > 0 && ( <> - )} @@ -640,7 +657,9 @@ const DocumentListComponent: React.FC = ({ checkboxSelection disableRowSelectionOnClick rowSelectionModel={rowSelectionModel} - onRowSelectionModelChange={onRowSelectionModelChange} + onRowSelectionModelChange={(model: GridRowSelectionModel) => { + onRowSelectionModelChange(model); + }} pageSizeOptions={[10, 25, 50, 100]} paginationMode="server" rowCount={total} diff --git a/src/pages/knowledge/components/TestChunkResult.tsx b/src/pages/knowledge/components/TestChunkResult.tsx index b46aad6..d1d3feb 100644 --- a/src/pages/knowledge/components/TestChunkResult.tsx +++ b/src/pages/knowledge/components/TestChunkResult.tsx @@ -162,20 +162,20 @@ function TestChunkResult(props: TestChunkResultProps) { {chunk.vector_similarity !== undefined && ( )} {chunk.term_similarity !== undefined && ( diff --git a/src/pages/knowledge/detail.tsx b/src/pages/knowledge/detail.tsx index 717c4f2..fd19a98 100644 --- a/src/pages/knowledge/detail.tsx +++ b/src/pages/knowledge/detail.tsx @@ -134,7 +134,7 @@ function KnowledgeBaseDetail() { // 删除文件 const handleDeleteFiles = async () => { try { - await deleteDocuments(Array.from(rowSelectionModel.ids) as string[]); + await deleteDocuments(Array.from(rowSelectionModel.ids).map((id) => id.toString())); setDeleteDialogOpen(false); setRowSelectionModel({ type: 'include', diff --git a/src/pages/knowledge/overview.tsx b/src/pages/knowledge/overview.tsx index 8dc808c..7347bfb 100644 --- a/src/pages/knowledge/overview.tsx +++ b/src/pages/knowledge/overview.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useCallback } from 'react'; import { Box, Grid, Paper, Typography, IconButton, TextField, Tabs, Tab, Fab, Avatar, Chip, Dialog, DialogTitle, DialogContent, DialogActions, Button, Card, CardContent, Divider } from '@mui/material'; import { DataGrid, type GridColDef } from '@mui/x-data-grid'; import { @@ -10,7 +10,6 @@ import { useTranslation } from 'react-i18next'; import { useNavigate, useParams } from 'react-router-dom'; import { useKnowledgeOverview, useKnowledgeDetail } from '@/hooks/knowledge-hooks'; import logger from '@/utils/logger'; -import i18n from '@/locales'; import { enUS, zhCN } from '@mui/x-data-grid/locales'; import KnowledgeBreadcrumbs from './components/KnowledgeBreadcrumbs'; import { LanguageAbbreviation } from '@/constants/common'; @@ -38,14 +37,14 @@ interface KnowledgeLogsPageProps { } function KnowledgeLogsPage({ embedded = false, kbId: kbIdProp }: KnowledgeLogsPageProps) { - const { t } = useTranslation(); + const { t, i18n } = useTranslation(); const [paginationModel, setPaginationModel] = React.useState({ page: 0, pageSize: 50 }); // 根据当前语言获取DataGrid的localeText - const getDataGridLocale = () => { + const getDataGridLocale = useCallback(() => { const currentLanguage = i18n.language; return currentLanguage === LanguageAbbreviation.Zh ? zhCN : enUS; - }; + }, [i18n]); // 路由参数与数据Hook const { id: kbIdParam = '' } = useParams(); diff --git a/src/pages/setting/teams.tsx b/src/pages/setting/teams.tsx index 12353c5..42ee9cd 100644 --- a/src/pages/setting/teams.tsx +++ b/src/pages/setting/teams.tsx @@ -178,7 +178,7 @@ function TeamsSetting() { handleDeleteUser(user.id)} + onClick={() => handleDeleteUser(user.user_id)} >