// js/ui/ui-processing.js // 文件列表展示与处理进度相关的 UI 逻辑。 (function(global) { 'use strict'; const fileListContainer = document.getElementById('fileListContainer'); const fileList = document.getElementById('fileList'); const downloadAllBtn = document.getElementById('downloadAllBtn'); const processBtn = document.getElementById('processBtn'); const resultsSection = document.getElementById('resultsSection'); const resultsSummary = document.getElementById('resultsSummary'); const progressSection = document.getElementById('progressSection'); const batchProgressText = document.getElementById('batchProgressText'); const concurrentProgressText = document.getElementById('concurrentProgressText'); const progressStep = document.getElementById('progressStep'); const progressPercentage = document.getElementById('progressPercentage'); const progressBar = document.getElementById('progressBar'); const progressLog = document.getElementById('progressLog'); // 使用事件委托绑定验证刷新按钮 document.addEventListener('click', (e) => { const refreshBtn = e.target.closest('#validationRefreshBtn'); if (refreshBtn) { console.log('[Validation] Refresh button clicked'); e.preventDefault(); e.stopPropagation(); if (typeof window.refreshValidationState === 'function') { window.refreshValidationState(); } else { console.warn('[Validation] window.refreshValidationState not available'); } } }); function updateFileListUI(pdfFiles, isProcessing, onRemoveFile) { if (!fileList || !fileListContainer) return; fileList.innerHTML = ''; if (pdfFiles.length > 0) { fileListContainer.classList.remove('hidden'); pdfFiles.forEach((file, index) => { const displayPath = global.getFileDisplayPath(file); const displayName = (displayPath.split('/').pop() || file.name || '').trim() || file.name; const listItem = document.createElement('div'); listItem.className = 'file-list-item'; let virtualBadge = ''; const vType = (file && file.virtualType) ? String(file.virtualType) : ''; const nameLower = (file && file.name) ? file.name.toLowerCase() : ''; const isRetranslate = vType === 'retranslate' || /-retranslate-/.test(nameLower); const isRetryFailed = vType === 'retry-failed' || /-retry-failed-/.test(nameLower); if (isRetranslate) { virtualBadge = '重译'; } else if (isRetryFailed) { virtualBadge = '失败重试'; } const extSource = displayName || file.name || ''; const ext = (extSource.split('.').pop() || '').toLowerCase(); const icon = ext === 'pdf' ? 'carbon:document-pdf' : 'carbon:document'; const iconColor = ext === 'pdf' ? 'text-red-500' : 'text-gray-500'; const isExcluded = typeof global.isExtensionExcluded === 'function' ? global.isExtensionExcluded(ext) : false; listItem.innerHTML = `
处理总结:
在 ${pdfFilesLength} 个选定文件中,尝试处理了 ${totalAttempted} 个。
`; downloadAllBtn.disabled = successCount === 0; window.scrollTo({ top: resultsSection.offsetTop - 20, behavior: 'smooth' }); } function showProgressSection() { if (!resultsSection || !progressSection || !progressLog || !batchProgressText || !concurrentProgressText) return; resultsSection.classList.add('hidden'); progressSection.classList.remove('hidden'); progressLog.innerHTML = ''; batchProgressText.textContent = ''; concurrentProgressText.textContent = ''; updateProgress('初始化...', 0); window.scrollTo({ top: progressSection.offsetTop - 20, behavior: 'smooth' }); } function updateConcurrentProgress(count) { if (concurrentProgressText) { concurrentProgressText.textContent = `当前并发任务数: ${count}`; } } function updateOverallProgress(success, skipped, errors, totalFiles) { if (!batchProgressText || !progressPercentage || !progressBar) return; const completedCount = success + skipped + errors; if (totalFiles > 0) { const percentage = totalFiles > 0 ? Math.round((completedCount / totalFiles) * 100) : 0; batchProgressText.textContent = `整体进度: ${completedCount} / ${totalFiles} 完成`; progressPercentage.textContent = `${percentage}%`; progressBar.style.width = `${percentage}%`; } else { batchProgressText.textContent = ''; progressPercentage.textContent = '0%'; progressBar.style.width = '0%'; } } function updateProgress(stepText, percentage) { if (progressStep) { progressStep.textContent = stepText; } } function addProgressLog(text) { if (!progressLog) return; const timestamp = new Date().toLocaleTimeString(); const logLine = document.createElement('div'); logLine.textContent = `[${timestamp}] ${text}`; progressLog.appendChild(logLine); progressLog.scrollTop = progressLog.scrollHeight; } /** * 文件预览功能 * @param {File} file - 要预览的文件对象 */ function previewFile(file) { const ext = file.name.split('.').pop().toLowerCase(); // 创建预览模态框 const modal = document.createElement('div'); modal.className = 'fixed inset-0 z-[9999] flex items-center justify-center bg-black/60 backdrop-blur-sm'; modal.style.animation = 'fadeIn 0.2s ease-out'; const modalContent = document.createElement('div'); modalContent.className = 'relative bg-white rounded-lg shadow-2xl w-[90vw] h-[90vh] flex flex-col'; modalContent.style.animation = 'slideUp 0.3s ease-out'; // 头部 const header = document.createElement('div'); header.className = 'flex items-center justify-between px-6 py-4 border-b border-gray-200'; header.innerHTML = `PDF 加载失败
${error.message}
Word 预览库未加载
请刷新页面重试
Word 文件加载失败
${error.message}
PowerPoint 文件预览
建议使用 Microsoft PowerPoint 或其他本地应用打开此文件。
文件信息:
名称: ${file.name}
大小: ${global.formatFileSize ? global.formatFileSize(file.size) : (file.size / 1024).toFixed(2) + ' KB'}
${escapeHtml(text)}`;
};
reader.readAsText(file);
} else {
// 不支持的类型
contentArea.innerHTML = `
暂不支持预览此文件类型
支持的类型: PDF, Word (DOCX), TXT, MD, YAML, HTML