datatables.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. import 'tailwindcss';
  2. import $ from 'jquery';
  3. import 'laravel-datatables-vite';
  4. import JSZip from 'jszip'; // Required for Excel and CSV export
  5. import 'datatables.net';
  6. import 'datatables.net-buttons';
  7. import 'datatables.net-buttons/js/buttons.html5.js'; // For HTML5 export buttons
  8. import 'datatables.net-buttons/js/buttons.print.min.js'; // For the print button
  9. import 'datatables.net-responsive';
  10. import 'pdfmake/build/pdfmake.js'; // Required for PDF export
  11. import 'pdfmake/build/vfs_fonts.js'; // Required for PDF export
  12. import './dataTables.tailwindcss.js';
  13. import 'datatables.net-responsive-dt';
  14. // Ensure jQuery is available globally
  15. window.$ = window.jQuery = $;
  16. window.JSZip = JSZip;
  17. // Initialize DataTable
  18. let dataTableInstance;
  19. var searchTerms ={};
  20. function initializeDataTable() {
  21. var dataTableName = document.getElementById('datatable-config').dataset.datatableName;
  22. var dataTableColumnsConfig = JSON.parse(document.getElementById('datatable-config').dataset.datatableColumnsConfig);
  23. if ($.fn.DataTable.isDataTable(`#${dataTableName}-table`)) {
  24. dataTableInstance.destroy();
  25. $(`#${dataTableName}-table tbody`).empty(); // Clear rows to prevent residue
  26. }
  27. dataTableInstance = $(`#${dataTableName}-table`).DataTable({
  28. responsive: true,
  29. retrieve: true,
  30. searching: false,
  31. processing: true,
  32. serverSide: true,
  33. orderCellsTop: true,
  34. fixedHeader: true,
  35. ajax: {
  36. url: '/api/report-data/' + dataTableName,
  37. type: 'POST',
  38. dataSrc: function (json) {
  39. console.log('Returned rows:', json.data);
  40. return json.data;
  41. },
  42. data: function (d) {
  43. d.searchTerms = searchTerms || {};
  44. }
  45. },
  46. columns: dataTableColumnsConfig,
  47. dom: 'lBfrtip',
  48. buttons: [
  49. { extend: 'copyHtml5', className: 'dt-button' },
  50. { extend: 'csvHtml5', className: 'dt-button' },
  51. { extend: 'excelHtml5', className: 'dt-button' },
  52. { extend: 'pdfHtml5', className: 'dt-button' },
  53. { extend: 'print', className: 'dt-button' },
  54. ],
  55. layout: {
  56. topStart: 'buttons'
  57. },
  58. columnDefs: [
  59. { responsivePriority: 1, targets: 0 },
  60. { responsivePriority: 2, targets: -1 }
  61. ]
  62. });
  63. }
  64. document.addEventListener('livewire:init', function () {
  65. console.log('Initializing DataTable');
  66. initializeDataTable();
  67. });
  68. let inner = {};
  69. function getFilterInput(searchTerm, index, searchType, extra){
  70. switch (searchType) {
  71. case "text":
  72. case "number":
  73. inner[index] = searchTerm;
  74. break;
  75. case "date":
  76. if($.isEmptyObject(inner[index])) {
  77. inner[index] = {"start": "", "end": ""};
  78. }
  79. if (extra === "start") {
  80. inner[index].start = searchTerm;
  81. console.log("start date: ");
  82. }
  83. else if (extra === "end") {
  84. inner[index].end = searchTerm;
  85. }
  86. break;
  87. }
  88. searchTerms[index] = inner;
  89. console.log(searchTerms[index]);
  90. dataTableInstance.ajax.reload();
  91. }
  92. window.getFilterInput = getFilterInput;
  93. document.addEventListener('DOMContentLoaded', () => {
  94. console.log("datatables.js is working!");
  95. });