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
This commit is contained in:
Accusys
2026-07-04 22:48:23 +08:00
parent 7fc4dcbddb
commit 53f28ac458

View File

@@ -262,50 +262,53 @@ async function fetchFiles() {
loading.value = true
try {
const config = getCurrentConfig()
const scanResp = await httpFetch<any>(`${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<any>(`${config.api_base_url}/api/v1/files?page=1&page_size=100`)
const regResp = await httpFetch<any>(`${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<string, any>()
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<any>(`${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<string, any>()
// 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())