/** * ========================================================================== * PDF VIEWER & LIST MANAGER - DIRECT PDF VIEWING WITH PDF.JS CANVAS * ========================================================================== */ window.PDFViewer = { activePdfId: null, isMobile: function() { return window.innerWidth <= 768; }, init: function() { if (window.pdfjsLib) { pdfjsLib.GlobalWorkerOptions.workerSrc = '/Assets/help/js/pdf.worker.min.js'; } if (this.isMobile()) { this.showMobileList(); } this.renderPdfList(TVSI_DATA.pdfList); this.setupSearch(); this.setupBatchDownload(); // Mặc định chọn tài liệu đầu tiên nếu chưa chọn if (!this.activePdfId && TVSI_DATA.pdfList.length > 0) { this.selectPdf(TVSI_DATA.pdfList[0].id, false); } }, // Hiển thị danh sách tài liệu trên mobile showMobileList: function() { const layout = document.querySelector('.pdf-layout-split'); if (layout) { layout.classList.remove('mobile-view-active'); } }, // Hiển thị trình đọc tài liệu trên mobile showMobileReader: function() { const layout = document.querySelector('.pdf-layout-split'); if (layout) { layout.classList.add('mobile-view-active'); } const viewport = document.getElementById('pdfViewport'); if (viewport) { viewport.scrollTop = 0; } }, // Render danh sách tài liệu bên thanh trái renderPdfList: function(list) { const container = document.getElementById('pdfItemsList'); if (!container) return; if (list.length === 0) { container.innerHTML = `
Không tìm thấy tài liệu phù hợp
`; return; } container.innerHTML = list.map(item => `
${item.title}
${item.category} • ${item.fileSize} • ${item.pageCount} trang
`).join(''); }, // Chọn và xem tài liệu selectPdf: function(pdfId, triggerMobileReader = true) { const item = TVSI_DATA.pdfList.find(p => p.id === pdfId); if (!item) return; this.activePdfId = pdfId; // Cập nhật class active trong danh sách document.querySelectorAll('.pdf-item').forEach(el => { if (el.dataset.id === pdfId) { el.classList.add('active'); } else { el.classList.remove('active'); } }); // Cập nhật tiêu đề trên thanh công cụ xem const titleEl = document.getElementById('currentPdfTitle'); if (titleEl) { titleEl.innerHTML = ` ${item.title} `; } // Cập nhật link tải về và link mở tab mới const downloadBtn = document.getElementById('btnDownloadCurrentPdf'); if (downloadBtn) { downloadBtn.href = encodeURI(item.fileUrl); downloadBtn.download = item.fileName; } const newTabBtn = document.getElementById('btnOpenPdfNewTab'); if (newTabBtn) { newTabBtn.href = encodeURI(item.fileUrl); } this.renderViewport(item); // Nếu là thao tác bấm trên màn hình điện thoại -> mở màn hình đọc if (triggerMobileReader && this.isMobile()) { this.showMobileReader(); } }, // Render vùng xem PDF bằng PDF.js Canvas renderViewport: function(item) { const viewport = document.getElementById('pdfViewport'); if (!viewport) return; viewport.innerHTML = `
Đang tải và hiển thị trang tài liệu...
`; this.renderPdfPages(item.fileUrl); }, // Vẽ các trang PDF bằng PDF.js Canvas trực tiếp renderPdfPages: function(fileUrl) { if (!window.pdfjsLib) { console.warn('PDF.js library is not available, falling back to iframe'); const wrapper = document.getElementById('pdfPagesWrapper'); if (wrapper) { wrapper.innerHTML = ``; } return; } const loadingTask = pdfjsLib.getDocument({ url: encodeURI(fileUrl), enableXfa: true }); loadingTask.promise.then(pdfDoc => { const indicator = document.getElementById('pdfLoadingIndicator'); if (indicator) indicator.style.display = 'none'; const wrapper = document.getElementById('pdfPagesWrapper'); if (!wrapper) return; wrapper.innerHTML = ''; for (let pageNum = 1; pageNum <= pdfDoc.numPages; pageNum++) { const pageCard = document.createElement('div'); pageCard.className = 'pdf-page-card'; const pageNumTag = document.createElement('div'); pageNumTag.className = 'pdf-page-num-tag'; pageNumTag.textContent = `Trang ${pageNum} / ${pdfDoc.numPages}`; pageCard.appendChild(pageNumTag); const canvas = document.createElement('canvas'); canvas.className = 'pdf-page-canvas'; pageCard.appendChild(canvas); wrapper.appendChild(pageCard); pdfDoc.getPage(pageNum).then(page => { const containerWidth = wrapper.clientWidth || (window.innerWidth <= 768 ? window.innerWidth - 32 : 820); const unscaledViewport = page.getViewport({ scale: 1 }); const targetScale = Math.min(2.5, (containerWidth / unscaledViewport.width) * (window.devicePixelRatio || 1.5)); const viewport = page.getViewport({ scale: targetScale }); canvas.height = viewport.height; canvas.width = viewport.width; canvas.style.width = '100%'; canvas.style.height = 'auto'; const renderContext = { canvasContext: canvas.getContext('2d'), viewport: viewport }; page.render(renderContext); }); } }).catch(err => { console.error('Lỗi khi render PDF qua PDF.js:', err); const indicator = document.getElementById('pdfLoadingIndicator'); if (indicator) { indicator.innerHTML = `
Không thể tải xem trước bản PDF trực tiếp.
↗ Mở file trong tab mới `; } }); }, // Thiết lập ô tìm kiếm tài liệu setupSearch: function() { const searchInput = document.getElementById('pdfSearchInput'); if (!searchInput) return; searchInput.addEventListener('input', (e) => { const keyword = e.target.value.toLowerCase().trim(); const filtered = TVSI_DATA.pdfList.filter(item => item.title.toLowerCase().includes(keyword) || item.category.toLowerCase().includes(keyword) || item.description.toLowerCase().includes(keyword) || item.fileName.toLowerCase().includes(keyword) ); this.renderPdfList(filtered); }); }, // Tải trọn bộ tài liệu setupBatchDownload: function() { const batchBtn = document.getElementById('btnBatchDownloadPdf'); if (!batchBtn) return; batchBtn.addEventListener('click', () => { alert(`Bắt đầu tải trọn bộ ${TVSI_DATA.pdfList.length} tài liệu hướng dẫn PDF.`); TVSI_DATA.pdfList.forEach((item, index) => { setTimeout(() => { const a = document.createElement('a'); a.href = encodeURI(item.fileUrl); a.download = item.fileName; document.body.appendChild(a); a.click(); document.body.removeChild(a); }, index * 350); }); }); } };