From 53f28ac458d99c5f77dec404dde5e5b06e5908cf Mon Sep 17 00:00:00 2001 From: Accusys Date: Sat, 4 Jul 2026 22:48:23 +0800 Subject: [PATCH] fix: FilesView filter logic - remove 'registered_scan' status Bug: Scan files were getting status 'registered_scan' which doesn't match any filter value (unregistered/pending/processing/completed/indexed/unindexed). When toggling filters on/off, files would disappear because their status didn't match any valid filter. Fix: - Removed 'registered_scan' status entirely - Fetch regFiles FIRST to get real statuses - Scan files default to 'unregistered' status - regFiles overlay with actual status (pending/processing/completed) - Increased regFiles page_size to 200 for larger libraries --- portal/src/views/FilesView.vue | 63 ++++++++++++++++++---------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/portal/src/views/FilesView.vue b/portal/src/views/FilesView.vue index 519d74e..710a9dd 100644 --- a/portal/src/views/FilesView.vue +++ b/portal/src/views/FilesView.vue @@ -262,50 +262,53 @@ async function fetchFiles() { loading.value = true try { const config = getCurrentConfig() - const scanResp = await httpFetch(`${config.api_base_url}/api/v1/files/scan`) - const scanFiles: any[] = (scanResp?.files || []).map((f: any) => { - const mediaType = getMediaType(f.file_name) - return { - ...f, - media_type: mediaType, - status: f.is_registered ? 'registered_scan' : 'unregistered', - is_indexed: false - } - }) - - // Get registered files with real processing status + + // Get registered files with real processing status FIRST let regFiles: any[] = [] try { - const regResp = await httpFetch(`${config.api_base_url}/api/v1/files?page=1&page_size=100`) + const regResp = await httpFetch(`${config.api_base_url}/api/v1/files?page=1&page_size=200`) regFiles = (regResp?.files || regResp?.data || []).map((f: any) => { const mediaType = getMediaType(f.file_name) return { ...f, media_type: mediaType, status: f.status || 'pending', - is_indexed: f.total_chunks > 0 || false + is_indexed: (f.total_chunks || 0) > 0 } }) } catch { - // Registered files API may not be available; use scan data only + // Registered files API may not be available } - // Merge: scan results first, then overlay with registered statuses - const merged = new Map() - for (const f of scanFiles) { - merged.set(f.file_path, f) - } - for (const f of regFiles) { - // Preserve media_type from scan if not set in regFiles - const existing = merged.get(f.file_path) - if (existing) { - merged.set(f.file_path, { - ...f, - media_type: f.media_type || existing.media_type - }) - } else { - merged.set(f.file_path, f) + // Get scan results + const scanResp = await httpFetch(`${config.api_base_url}/api/v1/files/scan`) + const scanFiles: any[] = (scanResp?.files || []).map((f: any) => { + const mediaType = getMediaType(f.file_name) + return { + ...f, + media_type: mediaType, + is_indexed: false } + }) + + // Build a set of registered file paths for quick lookup + const registeredPaths = new Set(regFiles.map(f => f.file_path)) + + // Merge: start with scan results, override with registered data where available + const merged = new Map() + + // First pass: add all scan results + for (const f of scanFiles) { + const isRegistered = registeredPaths.has(f.file_path) + merged.set(f.file_path, { + ...f, + status: isRegistered ? 'pending' : 'unregistered' + }) + } + + // Second pass: override with real registered data + for (const f of regFiles) { + merged.set(f.file_path, f) } files.value = Array.from(merged.values())