You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

211 lines
6.8 KiB

$(document).ready(function () {
// Initialize DataTable
var table = $('#oc-file-det-tbl').DataTable({
paging: true,
searching: true,
ordering: true,
lengthChange: true,
pageLength: 10,
language: {
emptyTable: "No data available",
lengthMenu: "Display _MENU_ records per page",
info: "Showing _START_ to _END_ of _TOTAL_ entries",
infoEmpty: "No records to show",
infoFiltered: "(filtered from _MAX_ total records)"
},
columnDefs: [
{
orderable: false,
targets: [0, 5] // S.No and OC File columns
}
],
buttons: [
{
extend: 'excelHtml5',
title: "OC File Details",
filename: "OC File Details",
exportOptions: {
columns: ':visible:not(:eq(5))', // exclude OC File column
format: {
body: function (data, row, column, node) {
if (column === 0) {
return row + 1;
}
return $('<div>').html(data).text().trim();
}
}
}
},
'pdfHtml5'
]
});
// --- SEQUENTIAL S.NO FIX ---
table.on('order.dt search.dt draw.dt', function () {
var pageInfo = table.page.info();
table.column(0, { page: 'current' }).nodes().each(function (cell, i) {
cell.innerHTML = pageInfo.start + i + 1;
});
}).draw();
// Move DataTable controls to custom containers
$('#custom-pagination').html($('.dataTables_paginate'));
$('#custom-info').html($('.dataTables_info'));
$('#custom-length').html($('.dataTables_length'));
$('.dataTables_filter').hide(); // hide default search
// Custom search / filtering on the datatable
$('#export-excel').on('click', function () {
table.button('.buttons-excel').trigger();
});
$('#export-pdf').on('click', function () {
var originalLength = table.page.len();
table.one('draw', function () {
var tableClone = $('#oc-file-det-tbl').clone();
tableClone.removeClass('dataTable');
tableClone.find('thead, tbody, tfoot').removeAttr('style');
// Remove "OC File" column (6th col = index 5)
tableClone.find('tr').each(function () {
$(this).find('th:eq(5), td:eq(5)').remove();
});
var pdfContainer = $('#pdf-print-container');
if (!pdfContainer.length) {
$('body').append('<div id="pdf-print-container" style="display:none;"></div>');
pdfContainer = $('#pdf-print-container');
}
pdfContainer.html('<h2 style="text-align:center;">OC File Details</h2>');
pdfContainer.append(tableClone).css({ display: 'block', padding: '20px' });
tableClone.css({ width: '100%', borderCollapse: 'collapse' });
tableClone.find('th, td').css({
border: '1px solid #ccc',
padding: '5px',
fontSize: '10px',
textAlign: 'left',
verticalAlign: 'top'
});
tableClone.find('tr').css({ pageBreakInside: 'avoid', breakInside: 'avoid', webkitBreakInside: 'avoid' });
html2pdf().set({
margin: 0.5,
filename: 'OC File Details.pdf',
image: { type: 'jpeg', quality: 0.98 },
html2canvas: { scale: 2, useCORS: true },
jsPDF: { unit: 'in', format: 'a3', orientation: 'landscape' }
}).from(pdfContainer[0]).save().then(function () {
table.page.len(originalLength).draw();
pdfContainer.hide();
});
});
table.page.len(-1).draw(); // show all rows for PDF
});
function populateFilters() {
var numSet = {}, vendSet = {};
table.rows().every(function () {
var data = this.data();
var fileNum = data[1] ? $('<div>').html(data[1]).text().trim() : '';
var vendName = data[2] ? $('<div>').html(data[2]).text().trim() : '';
if (fileNum) numSet[fileNum] = true;
if (vendName) vendSet[vendName] = true;
});
Object.keys(numSet).sort().forEach(val => $('#file-num-list').append(`<option value="${val}">`));
Object.keys(vendSet).sort().forEach(val => $('#vend-name-list').append(`<option value="${val}">`));
}
populateFilters();
function applyFilters() {
var fileNum = $('#filter-file-num').val();
var vendName = $('#filter-vend-name').val();
table.columns().search(''); // reset all
if (fileNum) table.column(1).search('^' + $.fn.dataTable.util.escapeRegex(fileNum) + '$', true, false);
if (vendName) table.column(2).search('^' + $.fn.dataTable.util.escapeRegex(vendName) + '$', true, false);
table.draw();
}
// Event bindings for filters
$('#filter-file-num').on('input', applyFilters);
$('#filter-vend-name').on('input', applyFilters);
});
// Function to view Supporting Document in modal
function viewFileInModal(fileNum, fileType, filePath) {
var pdfModal = new bootstrap.Modal(document.getElementById('pdf-modal'));
var modalTitle = document.getElementById('pdf-modal-label');
var pdfContainer = document.getElementById('pdf-container');
pdfContainer.innerHTML = ''; // Clear previous pages
pdfContainer.scrollTop = 0; // Scroll to the first page (top)
var decodedFilePath = decodeURIComponent(filePath);
var fileName = decodedFilePath.split(/[\\/]/).pop();
modalTitle.textContent = fileType + " File (" + fileName + ")";
var params = new URLSearchParams();
params.append('file-type', fileType);
params.append('file-path', decodedFilePath);
params.append('file-num', fileNum);
fetch('/api/file/view-supp-docs', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: params.toString()
}).then(function (response) {
if (!response.ok) {
throw new Error('Failed to fetch PDF: ' + response.statusText);
}
return response.arrayBuffer();
}).then(function (pdfData) {
console.log(pdfData);
var blob = new Blob([pdfData], { type: 'application/pdf' });
var blobUrl = URL.createObjectURL(blob);
// Set download link
var downloadBtn = document.getElementById('download-pdf-btn');
downloadBtn.href = blobUrl;
downloadBtn.download = fileName;
return pdfjsLib.getDocument({ data: pdfData }).promise;
}).then(function (pdf) {
let renderPage = function (pageNum) {
return pdf.getPage(pageNum).then(function (page) {
var viewport = page.getViewport({ scale: 1.5 });
var canvas = document.createElement('canvas');
canvas.classList.add('mb-3');
var ctx = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
var renderContext = { canvasContext: ctx, viewport: viewport };
pdfContainer.appendChild(canvas);
return page.render(renderContext).promise;
});
};
// Render all pages sequentially
let sequence = Promise.resolve();
for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
sequence = sequence.then(() => renderPage(pageNum));
}
return sequence;
}).then(function () {
var modalElement = document.getElementById('pdf-modal');
modalElement.addEventListener('shown.bs.modal', function onShown() {
pdfContainer.scrollTop = 0; // Reset scroll position
modalElement.scrollTop = 0; // Reset modal scroll
modalElement.removeEventListener('shown.bs.modal', onShown); // Clean up listener
});
pdfModal.show();
}).catch(function (error) {
alert('Error loading PDF: ' + error.message);
});
}