feat(knowledge): add team filtering and improve request handling

This commit is contained in:
2025-10-29 13:24:19 +08:00
parent ef0a99ea30
commit 184c232cc8
3 changed files with 58 additions and 56 deletions

View File

@@ -1,4 +1,4 @@
import React, { useState, useCallback, useMemo } from 'react';
import React, { useState, useCallback, useMemo, useEffect } from 'react';
import {
Box,
Typography,
@@ -24,15 +24,16 @@ import { useUserData } from '@/hooks/useUserData';
import KnowledgeGridView from '@/components/knowledge/KnowledgeGridView';
import type { IKnowledge } from '@/interfaces/database/knowledge';
import { useDialog } from '@/hooks/useDialog';
import logger from '@/utils/logger';
const KnowledgeBaseList: React.FC = () => {
const navigate = useNavigate();
const {deleteKnowledge} = useKnowledgeOperations();
const { deleteKnowledge } = useKnowledgeOperations();
// 搜索和筛选状态
const [searchTerm, setSearchTerm] = useState('');
const [teamFilter, setTeamFilter] = useState('all');
const [teamFilter, setTeamFilter] = useState<string[]>([]);
const pageSize = 12; // 每页显示12个知识库
// 获取用户数据(包含租户列表)
@@ -45,6 +46,7 @@ const KnowledgeBaseList: React.FC = () => {
loading,
error,
currentPage,
setTeamFilter: hookSetTeamFilter,
setKeywords,
setCurrentPage,
refresh,
@@ -61,10 +63,16 @@ const KnowledgeBaseList: React.FC = () => {
}, [setKeywords]);
// 处理团队筛选
const handleTeamFilterChange = useCallback((value: string) => {
setTeamFilter(value);
setCurrentPage(1); // 筛选时重置到第一页
}, [setCurrentPage]);
const handleTeamFilterChange = useCallback((value: string[]) => {
if (value.includes('all')) {
setTeamFilter([]);
hookSetTeamFilter([]);
} else {
setTeamFilter(value);
hookSetTeamFilter(value);
}
setCurrentPage(1);
}, [setCurrentPage, hookSetTeamFilter]);
// 处理分页变化
const handlePageChange = useCallback((_: React.ChangeEvent<unknown>, page: number) => {
@@ -107,46 +115,22 @@ const KnowledgeBaseList: React.FC = () => {
navigate(`/knowledge/${kb.id}`);
}, [navigate]);
// 根据团队筛选过滤知识库
const filteredKnowledgeBases = useMemo(() => {
if (!knowledgeBases) return [];
if (teamFilter === 'all') {
return knowledgeBases;
}
// 根据租户ID筛选
if (teamFilter !== 'all') {
return knowledgeBases.filter(kb => {
// 如果选择的是特定租户ID则筛选该租户的知识库
if (teamFilter === 'me') {
// 假设'me'表示当前用户的知识库,这里可以根据实际业务逻辑调整
return kb.permission === 'me' || kb.tenant_id === tenantList?.[0].tenant_id;
}
// 如果是具体的租户ID
return kb.tenant_id === teamFilter;
});
}
return knowledgeBases;
}, [knowledgeBases, teamFilter, tenantList]);
// 计算总页数(基于筛选后的结果)
const totalPages = Math.ceil(filteredKnowledgeBases.length / pageSize);
const totalPages = Math.ceil(knowledgeBases.length / pageSize);
// 获取当前页的数据
const currentPageData = useMemo(() => {
const startIndex = (currentPage - 1) * pageSize;
const endIndex = startIndex + pageSize;
return filteredKnowledgeBases.slice(startIndex, endIndex);
}, [filteredKnowledgeBases, currentPage, pageSize]);
return knowledgeBases.slice(startIndex, endIndex);
}, [knowledgeBases, currentPage, pageSize]);
// 构建团队筛选选项
const teamFilterOptions = useMemo(() => {
const options = [
{ value: 'all', label: '全部' },
];
// 添加租户选项
if (tenantList && tenantList.length > 0) {
tenantList.forEach(tenant => {
@@ -156,7 +140,7 @@ const KnowledgeBaseList: React.FC = () => {
});
});
}
return options;
}, [tenantList]);
@@ -192,13 +176,17 @@ const KnowledgeBaseList: React.FC = () => {
),
}}
/>
<FormControl sx={{ minWidth: 120 }}>
<InputLabel></InputLabel>
<Select
value={teamFilter}
value={teamFilter.length > 0 ? teamFilter[0] : 'all'}
label="团队筛选"
onChange={(e) => handleTeamFilterChange(e.target.value)}
defaultValue={'all'}
onChange={(e) => {
const value = e.target.value as string;
handleTeamFilterChange([value]);
}}
>
{teamFilterOptions.map(option => (
<MenuItem key={option.value} value={option.value}>
@@ -243,7 +231,7 @@ const KnowledgeBaseList: React.FC = () => {
onDelete={handleDeleteKnowledge}
loading={loading}
searchTerm={searchTerm}
teamFilter={teamFilter}
// teamFilter={teamFilter}
onCreateKnowledge={handleCreateKnowledge}
/>
@@ -261,7 +249,7 @@ const KnowledgeBaseList: React.FC = () => {
showLastButton
/>
<Typography variant="body2" color="text.secondary" textAlign="center">
{filteredKnowledgeBases.length} {currentPage} {totalPages}
{knowledgeBases.length} {currentPage} {totalPages}
</Typography>
</Stack>
</Box>