// typescript import React, { useEffect, useState } from "react"; import { Badge, Button, Card, Checkbox, Input, Pagination } from "antd"; import { Search as SearchIcon } from "lucide-react"; import type { Dataset } from "@/pages/DataManagement/dataset.model.ts"; import { queryDatasetsUsingGet, queryDatasetByIdUsingGet, } from "@/pages/DataManagement/dataset.api.ts"; interface SelectDatasetProps { selectedDatasets: string[]; onSelectedDatasetsChange: (next: string[]) => void; // distributions now: { datasetId: { labelName: { labelValue: count } } } onDistributionsChange?: ( next: Record>> ) => void; onDatasetsChange?: (list: Dataset[]) => void; } const SelectDataset: React.FC = ({ selectedDatasets, onSelectedDatasetsChange, onDistributionsChange, onDatasetsChange, }) => { const [datasets, setDatasets] = useState([]); const [loading, setLoading] = useState(false); const [searchQuery, setSearchQuery] = useState(""); const [pagination, setPagination] = useState({ page: 1, size: 10, total: 0 }); const [distributions, setDistributions] = useState< Record>> >({}); // Helper: flatten nested distribution for preview and filter logic const flattenDistribution = ( dist?: Record> ): Array<{ label: string; value: string; count: number }> => { if (!dist) return []; const items: Array<{ label: string; value: string; count: number }> = []; Object.entries(dist).forEach(([label, values]) => { if (values && typeof values === "object") { Object.entries(values).forEach(([val, cnt]) => { items.push({ label, value: val, count: cnt }); }); } }); return items; }; // Fetch dataset list useEffect(() => { const fetchDatasets = async () => { try { setLoading(true); const { data } = await queryDatasetsUsingGet({ page: pagination.page, size: pagination.size, keyword: searchQuery?.trim() || undefined, }); const list = data?.content || data?.data || []; setDatasets(list); onDatasetsChange?.(list); setPagination((prev) => ({ ...prev, total: data?.totalElements ?? data?.total ?? 0, })); } finally { setLoading(false); } }; fetchDatasets().then(() => {}); }, [pagination.page, pagination.size, searchQuery]); // Fetch label distributions when datasets change useEffect(() => { const fetchDistributions = async () => { if (!datasets?.length) return; const idsToFetch = datasets .map((d) => String(d.id)) .filter((id) => !distributions[id]); if (!idsToFetch.length) return; try { const next: Record< string, Record> > = { ...distributions }; for (const id of idsToFetch) { let dist: Record> | undefined = undefined; try { const detRes = await queryDatasetByIdUsingGet(id); const det = detRes?.data; if (det) { const picked = det?.distribution; if (picked && typeof picked === "object") { // Assume picked is now { labelName: { labelValue: count } } dist = picked as Record>; } } } catch { dist = undefined; } next[String(id)] = dist || {}; } setDistributions(next); onDistributionsChange?.(next); } catch { // ignore } }; fetchDistributions().then(() => {}); // eslint-disable-next-line react-hooks/exhaustive-deps }, [datasets]); const onToggleDataset = (datasetId: string, checked: boolean) => { if (checked) { const next = Array.from(new Set([...selectedDatasets, datasetId])); onSelectedDatasetsChange(next); } else { onSelectedDatasetsChange( selectedDatasets.filter((id) => id !== datasetId) ); } }; const onClearSelection = () => { onSelectedDatasetsChange([]); }; return (
选择数据集 (已选择: {selectedDatasets.length}/{pagination.total})
} placeholder="搜索数据集" value={searchQuery} onChange={(e) => { setSearchQuery(e.target.value); setPagination((p) => ({ ...p, page: 1 })); }} />
{loading && (
正在加载数据集...
)} {!loading && datasets.map((dataset) => { const idStr = String(dataset.id); const checked = selectedDatasets.includes(idStr); const distFor = distributions[idStr]; const flat = flattenDistribution(distFor); return ( onToggleDataset(idStr, !checked)} >
onToggleDataset(idStr, e.target.checked)} />
{dataset.name} {dataset.datasetType}
{dataset.description}
{dataset.fileCount}条 {dataset.size}
{distFor ? ( flat.length > 0 ? (
{flat.slice(0, 8).map((it) => ( {`${it.label}/${it.value}: ${it.count}`} ))}
) : (
未检测到标签分布
) ) : (
加载标签分布...
)}
); })}
setPagination((prev) => ({ ...prev, page: p, size: ps })) } />
); }; export default SelectDataset;