function exportAllData(format, api, loader, reportTitle, column) { const params = new URLSearchParams({ searchPRNo: ($('#srchPRNo').val() || '').trim(), searchItemNo: ($('#srchItemNo').val() || '').trim(), searchItemName: ($('#srchItem').val() || '').trim(), searchDept: ($('#srchDept').val() || '').trim(), searchStatusName: ($('#srchStatus').val() || '').trim(), pageNumber: 1, pageSize: 999999 }); loader.show(); $.ajax({ url: `${api}?${params}`, type: 'GET', success: function (json) { loader.hide(); if (!json.data || json.data.length === 0) { toastr.warning('No data to export.'); return; } triggerClientExport(json.data, format, reportTitle, column); }, error: function () { loader.hide(); toastr.error('Failed to fetch data for export.'); } }); } function triggerClientExport(data, format, reportTitle, column) { const tempTableId = 'tempExportTable'; // Filter out action/button columns (data: null) and strip render functions const exportColumns = column .filter(c => c.data !== null && c.data !== undefined) .map(c => ({ data: c.data, title: c.title || c.data, // Keep render only for non-display logic (dates etc), // but strip HTML from output render: c.render ? function (data, type, row) { if (type === 'export' || type === 'display') { const result = c.render(data, 'display', row); // Strip HTML tags for export return $('
').html(result).text(); } return data; } : undefined })); $('body').append(`
`); const tempTable = $(`#${tempTableId}`).DataTable({ data: data, columns: exportColumns, dom: 'Brt', buttons: [ { extend: format, title: reportTitle, exportOptions: { columns: ':visible', format: { body: function (data) { // Strip any remaining HTML tags return $('
').html(data).text(); } } } } ], paging: false, searching: false, info: false }); setTimeout(function () { tempTable.button(0).trigger(); }, 500); setTimeout(function () { tempTable.destroy(); $('#tempExportWrapper').remove(); }, 2000); }