/** * Storage Saturation Report - Main JavaScript * Loads report via mode=getreport. PDF/Image export via client-side jsPDF + html2canvas (no XI Chromium pipeline). */ $(document).ready(function() { load_report(); $('#export-pdf-btn').on('click', function() { exportToPdf(); }); $('#export-image-btn').on('click', function() { exportToImage(); }); function load_report() { var baseUrl = window.saturationreportBaseUrl || (window.location.pathname.replace(/\/[^/]*$/, '/index.php')); var url = baseUrl + '?mode=getreport'; $.get(url, function(html) { $('#report').html(html); }).fail(function() { $('#report').html( '
' + 'Error loading storage saturation report.' + '
' ); }); } function getComponentBase() { return (window.saturationreportBaseUrl || '').replace(/\/[^/]*$/, ''); } function loadScript(src, onload, onerror) { var script = document.createElement('script'); script.src = src; script.onload = onload; script.onerror = onerror || function() {}; document.head.appendChild(script); } function exportToPdf() { var btn = $('#export-pdf-btn'); var originalText = btn.html(); btn.prop('disabled', true).html(' Generating...'); function doPdf() { if (typeof html2canvas === 'undefined') { var componentBase = getComponentBase(); var localH2c = componentBase ? (componentBase + '/scripts/vendor/html2canvas.min.js') : ''; var cdnH2c = 'https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js'; loadScript(localH2c || cdnH2c, function() { doPdf(); }, function() { if (localH2c) { loadScript(cdnH2c, doPdf, fallbackPdf); return; } fallbackPdf(); }); return; } if (typeof window.jspdf === 'undefined' || !window.jspdf.jsPDF) { var componentBase = getComponentBase(); var localJspdf = componentBase ? (componentBase + '/scripts/vendor/jspdf.umd.min.js') : ''; var cdnJspdf = 'https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js'; loadScript(localJspdf || cdnJspdf, doPdf, function() { if (localJspdf) loadScript(cdnJspdf, doPdf, fallbackPdf); else fallbackPdf(); }); return; } var container = document.getElementById('saturationreport-container'); if (!container) container = document.getElementById('report'); if (!container) { alert('Report container not found'); btn.prop('disabled', false).html(originalText); return; } html2canvas(container, { backgroundColor: '#ffffff', scale: 2, logging: false, useCORS: true }).then(function(canvas) { try { var JsPDF = window.jspdf.jsPDF; var doc = new JsPDF('p', 'mm', 'a4'); var pageW = doc.internal.pageSize.getWidth(); var pageH = doc.internal.pageSize.getHeight(); var margin = 10; var maxW = pageW - 2 * margin; var maxH = pageH - 2 * margin; var imgW = maxW; var imgH = (canvas.height * maxW) / canvas.width; if (imgH > maxH) { imgH = maxH; imgW = (canvas.width * maxH) / canvas.height; } doc.addImage(canvas.toDataURL('image/png'), 'PNG', margin, margin, imgW, imgH); doc.save('storage-saturation-report-' + new Date().getTime() + '.pdf'); } catch (err) { console.error('PDF export error:', err); alert('Failed to generate PDF. Try Print to PDF from the browser.'); } btn.prop('disabled', false).html(originalText); }).catch(function(err) { console.error('Capture error:', err); fallbackPdf(); }); } function fallbackPdf() { btn.prop('disabled', false).html(originalText); window.print(); } doPdf(); } function exportToImage() { if (typeof html2canvas === 'undefined') { var componentBase = (window.saturationreportBaseUrl || '').replace(/\/[^/]*$/, ''); var localSrc = componentBase ? (componentBase + '/scripts/vendor/html2canvas.min.js') : ''; var cdnSrc = 'https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js'; var script = document.createElement('script'); script.src = localSrc || cdnSrc; script.onload = function() { captureImage(); }; script.onerror = function() { if (localSrc && script.src === localSrc) { var fallback = document.createElement('script'); fallback.src = cdnSrc; fallback.onload = function() { captureImage(); }; fallback.onerror = function() { alert('Failed to load image export library. Please try using browser screenshot or print-to-PDF instead.'); }; document.head.appendChild(fallback); } else { alert('Failed to load image export library. Please try using browser screenshot or print-to-PDF instead.'); } }; document.head.appendChild(script); } else { captureImage(); } } function captureImage() { var container = document.getElementById('saturationreport-container'); if (!container) { container = document.getElementById('report'); } if (!container) { alert('Report container not found'); return; } var btn = $('#export-image-btn'); var originalText = btn.html(); btn.prop('disabled', true).html(' Generating...'); html2canvas(container, { backgroundColor: '#ffffff', scale: 2, logging: false, useCORS: true }).then(function(canvas) { var link = document.createElement('a'); link.download = 'saturation-report-' + new Date().getTime() + '.png'; link.href = canvas.toDataURL('image/png'); link.click(); btn.prop('disabled', false).html(originalText); }).catch(function(err) { console.error('Error capturing image:', err); alert('Failed to generate image. Please try using browser screenshot or print-to-PDF instead.'); btn.prop('disabled', false).html(originalText); }); } });