fix: replace all any types with proper interfaces
All checks were successful
Deploy Admin Frontend / build-and-deploy (push) Successful in 8s
All checks were successful
Deploy Admin Frontend / build-and-deploy (push) Successful in 8s
This commit is contained in:
parent
d07bca4897
commit
9e36c10d31
@ -8,6 +8,43 @@ import dayjs from 'dayjs'
|
||||
|
||||
const { Title } = Typography
|
||||
|
||||
// ── Types ──
|
||||
|
||||
interface KnowledgeSourceItem {
|
||||
id: string
|
||||
userId?: string
|
||||
knowledgeBaseId?: string
|
||||
originalFilename?: string
|
||||
title?: string
|
||||
mimeType?: string
|
||||
sizeBytes?: number
|
||||
textLength?: number
|
||||
parseStatus?: string
|
||||
indexStatus?: string
|
||||
createdAt?: string
|
||||
userName?: string
|
||||
kbName?: string
|
||||
}
|
||||
|
||||
interface PaginatedSources {
|
||||
items: KnowledgeSourceItem[]
|
||||
total: number
|
||||
page: number
|
||||
limit: number
|
||||
}
|
||||
|
||||
interface KnowledgeBaseItem {
|
||||
id: string
|
||||
title?: string
|
||||
name?: string
|
||||
}
|
||||
|
||||
interface PaginatedKnowledgeBases {
|
||||
items: KnowledgeBaseItem[]
|
||||
}
|
||||
|
||||
// ── Labels ──
|
||||
|
||||
const mimeLabels: Record<string, string> = {
|
||||
'text/plain': '文本', 'text/markdown': 'Markdown',
|
||||
'application/pdf': 'PDF', 'application/epub+zip': 'EPUB',
|
||||
@ -25,6 +62,8 @@ const indexStatusColors: Record<string, string> = {
|
||||
pending: 'default', indexing: 'processing', completed: 'green', failed: 'red',
|
||||
}
|
||||
|
||||
// ── Component ──
|
||||
|
||||
export default function KnowledgeSourcesPage() {
|
||||
const [page, setPage] = useState(1)
|
||||
const [kbFilter, setKbFilter] = useState<string>()
|
||||
@ -38,24 +77,23 @@ export default function KnowledgeSourcesPage() {
|
||||
if (kbFilter) p.set('knowledgeBaseId', kbFilter)
|
||||
if (statusFilter) p.set('parseStatus', statusFilter)
|
||||
if (search) p.set('search', search)
|
||||
return api.get<any>(`/admin-api/knowledge-bases/all-sources?${p.toString()}`)
|
||||
return api.get<PaginatedSources>(`/admin-api/knowledge-bases/all-sources?${p.toString()}`)
|
||||
},
|
||||
staleTime: 10_000,
|
||||
})
|
||||
|
||||
// KB list for filter dropdown
|
||||
const { data: kbList } = useQuery({
|
||||
queryKey: ['admin', 'kb-list'],
|
||||
queryFn: () => api.get<{ items: any[] }>('/admin-api/knowledge-bases?limit=200').then(d => d?.items || []),
|
||||
queryFn: () => api.get<PaginatedKnowledgeBases>('/admin-api/knowledge-bases?limit=200').then(d => d.items),
|
||||
staleTime: 60_000,
|
||||
})
|
||||
|
||||
const columns = [
|
||||
{ title: '文件名', dataIndex: 'originalFilename', width: 220, ellipsis: true, render: (v: string, r: any) => v || r.title || '-' },
|
||||
{ title: '知识库', dataIndex: 'kbName', width: 140, ellipsis: true, render: (v: string, r: any) => v || r.knowledgeBaseId },
|
||||
{ title: '文件名', dataIndex: 'originalFilename', width: 220, ellipsis: true, render: (v: string, r: KnowledgeSourceItem) => v || r.title || '-' },
|
||||
{ title: '知识库', dataIndex: 'kbName', width: 140, ellipsis: true, render: (v: string, r: KnowledgeSourceItem) => v || r.knowledgeBaseId },
|
||||
{ title: '类型', dataIndex: 'mimeType', width: 80, render: (v: string) => mimeLabels[v] || v?.split('/').pop() || '-' },
|
||||
{ title: '大小', dataIndex: 'sizeBytes', width: 80, render: (v: number) => v ? (v / 1024).toFixed(1) + 'KB' : '-' },
|
||||
{ title: '字数', dataIndex: 'textLength', width: 70, render: (v: number) => v || '-' },
|
||||
{ title: '大小', dataIndex: 'sizeBytes', width: 80, render: (v: number) => v ? `${(v / 1024).toFixed(1)} KB` : '-' },
|
||||
{ title: '字数', dataIndex: 'textLength', width: 70, render: (v: number | undefined) => v != null ? v : '-' },
|
||||
{
|
||||
title: '解析', dataIndex: 'parseStatus', width: 90,
|
||||
render: (v: string) => <Tag color={parseStatusColors[v] || 'default'}>{parseStatusLabels[v] || v}</Tag>,
|
||||
@ -75,12 +113,12 @@ export default function KnowledgeSourcesPage() {
|
||||
onChange={e => { setSearch(e.target.value); setPage(1) }} style={{ width: 200 }} />
|
||||
<Select placeholder="知识库筛选" allowClear value={kbFilter}
|
||||
onChange={v => { setKbFilter(v); setPage(1) }} style={{ width: 160 }}
|
||||
options={(kbList || []).map((kb: any) => ({ value: kb.id, label: kb.title || kb.name || kb.id }))} />
|
||||
options={(kbList || []).map(kb => ({ value: kb.id, label: kb.title || kb.name || kb.id }))} />
|
||||
<Select placeholder="解析状态" allowClear value={statusFilter}
|
||||
onChange={v => { setStatusFilter(v); setPage(1) }} style={{ width: 130 }}
|
||||
options={Object.entries(parseStatusLabels).map(([v, l]) => ({ value: v, label: l }))} />
|
||||
</Space>
|
||||
<Table dataSource={data?.items || []} columns={columns} rowKey="id" loading={isLoading}
|
||||
<Table<KnowledgeSourceItem> dataSource={data?.items || []} columns={columns} rowKey="id" loading={isLoading}
|
||||
pagination={{ current: page, defaultPageSize: 20, total: data?.total || 0, onChange: setPage }}
|
||||
size="small" scroll={{ x: 1000 }} />
|
||||
</div>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user