From be397e0557a3638c101e9935fe98626c46fbeb6c Mon Sep 17 00:00:00 2001 From: admin <572701190@qq.com> Date: Wed, 1 Jul 2026 16:46:55 +0800 Subject: [PATCH] Separate dataset upload queues --- frontend/src/main.tsx | 30 +++++++++++++++++++++--------- frontend/src/styles.css | 24 ++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index b8118a8..4ae3f28 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -637,7 +637,7 @@ function App() { const [selectedGpuIds, setSelectedGpuIds] = useState([]); const [selectedCondaEnv, setSelectedCondaEnv] = useState("auto"); const [uploadKind, setUploadKind] = useState<"images" | "masks">("images"); - const [uploadFiles, setUploadFiles] = useState(null); + const [uploadFilesByKind, setUploadFilesByKind] = useState>({ images: null, masks: null }); const [agentValidation, setAgentValidation] = useState(null); const [weightVerification, setWeightVerification] = useState(null); const [agentBusy, setAgentBusy] = useState(false); @@ -761,6 +761,7 @@ function App() { const uploadAccept = uploadKind === "images" ? "image/*,video/*,.zip,.tar,.tar.gz,.tgz" : "image/*,.txt,.json,.yaml,.yml,.zip,.tar,.tar.gz,.tgz"; + const activeUploadFiles = uploadFilesByKind[uploadKind]; const inferenceOutputs = useMemo(() => { const predictions = results.filter((item) => item.role === "segmentation" && item.previewable).slice(0, 8); const heatmaps = results.filter((item) => item.role === "heatmap" && item.previewable).slice(0, 8); @@ -979,12 +980,13 @@ function App() { } async function uploadDatasetFiles() { - if (!uploadFiles || uploadFiles.length === 0) return; + const files = uploadFilesByKind[uploadKind]; + if (!files || files.length === 0) return; setBusy(true); try { setActionError(""); const body = new FormData(); - Array.from(uploadFiles).forEach((file) => body.append("files", file)); + Array.from(files).forEach((file) => body.append("files", file)); let res: Response; try { res = await fetch(`${API_BASE}/api/datasets/${encodeURIComponent(datasetName)}/upload/${uploadKind}`, { @@ -997,7 +999,7 @@ function App() { if (!res.ok) throw new Error(await res.text()); setSelectedDatasetName(datasetName); setUploadModalOpen(false); - setUploadFiles(null); + setUploadFilesByKind((current) => ({ ...current, [uploadKind]: null })); await refresh(); } catch (err) { setActionError(String(err)); @@ -1528,7 +1530,7 @@ function App() { 说明 setDatasetDescription(event.target.value)} /> - {datasetNameExists && 已存在同名数据集,不能重复创建,但可以继续上传追加文件。} + {datasetNameExists && 将追加到现有数据集的 {uploadKind},不会新建同名数据集。}
{(["images", "masks"] as const).map((kind) => ( ))}
+
+ images 已选择 {uploadFilesByKind.images?.length ?? 0} + masks 已选择 {uploadFilesByKind.masks?.length ?? 0} +
- +
diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 76e14ef..bab6a02 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -839,6 +839,30 @@ textarea { font-weight: 760; } +.uploadKindCounts { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 8px; +} + +.uploadKindCounts span { + min-width: 0; + padding: 7px 9px; + border: 1px solid var(--line); + border-radius: 6px; + background: rgba(8, 10, 8, 0.72); + color: var(--muted); + font-size: 12px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.uploadKindCounts span.active { + border-color: rgba(157, 226, 111, 0.58); + color: var(--ink); +} + .drop { min-height: 128px; display: grid;