/**
* ==========================================================================
* 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);
});
});
}
};