datatables.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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. var dataTableHeadersConfig = JSON.parse(document.getElementById('datatable-config').dataset.datatableHeadersConfig);
  24. if ($.fn.DataTable.isDataTable(`#${dataTableName}-table`)) {
  25. dataTableInstance.destroy();
  26. $(`#${dataTableName}-table tbody`).empty(); // Clear rows to prevent residue
  27. }
  28. dataTableInstance = $(`#${dataTableName}-table`).DataTable({
  29. responsive: true,
  30. retrieve: true,
  31. searching: false,
  32. processing: true,
  33. serverSide: true,
  34. orderCellsTop: true,
  35. fixedHeader: true,
  36. ajax: {
  37. url: '/api/report-data/' + dataTableName,
  38. type: 'POST',
  39. dataSrc: function (json) {
  40. //console.log('Returned data:', json);
  41. //populate any dropdown headers
  42. //console.log(dataTableHeadersConfig);
  43. dataTableHeadersConfig.forEach(function(headerConfig, index){
  44. if(headerConfig.searchtype == "dropdown")
  45. {
  46. //console.log('Tyson here');
  47. var dropdown = $('#'+headerConfig.header.replace(' ', '-')+'FilterDropdown');
  48. //console.log(dropdown);
  49. dropdown.empty().append($('<option>',{
  50. value: '',
  51. text: '-- Select --'
  52. }));
  53. json.dropdowndata[index].forEach(function (option) {
  54. var selected = false;
  55. if(json.searchterms && json.searchterms[index]){
  56. console.log('search terms '+index);
  57. console.log(option);
  58. if((json.searchterms[index][index]) && (option === json.searchterms[index][index]))
  59. {
  60. console.log("selected");
  61. selected = true;
  62. }
  63. }
  64. dropdown.append($('<option>',{
  65. value: option,
  66. text: option
  67. }).prop('selected', selected))});
  68. }});
  69. return json.data;
  70. },
  71. data: function (d) {
  72. d.searchTerms = searchTerms || {};
  73. }
  74. },
  75. columns: dataTableColumnsConfig,
  76. dom: 'lBfrtip',
  77. buttons: [
  78. { extend: 'copyHtml5', className: 'dt-button' },
  79. { extend: 'csvHtml5', className: 'dt-button' },
  80. { extend: 'excelHtml5', className: 'dt-button' },
  81. { extend: 'pdfHtml5', className: 'dt-button' },
  82. { extend: 'print', className: 'dt-button' },
  83. ],
  84. layout: {
  85. topStart: 'buttons'
  86. },
  87. columnDefs: [
  88. { responsivePriority: 1, targets: 0 },
  89. { responsivePriority: 2, targets: -1 }
  90. ]
  91. });
  92. }
  93. document.addEventListener('livewire:init', function () {
  94. console.log('Initializing DataTable');
  95. initializeDataTable();
  96. });
  97. let inner = {};
  98. function getFilterInput(searchTerm, index, searchType, extra){
  99. switch (searchType) {
  100. case "text":
  101. case "number":
  102. inner[index] = searchTerm;
  103. break;
  104. case "date":
  105. if($.isEmptyObject(inner[index])) {
  106. inner[index] = {"start": "", "end": ""};
  107. }
  108. if (extra === "start") {
  109. inner[index].start = searchTerm;
  110. }
  111. else if (extra === "end") {
  112. inner[index].end = searchTerm;
  113. }
  114. break;
  115. case "dropdown":
  116. inner[index] = searchTerm;
  117. break;
  118. }
  119. searchTerms[index] = inner;
  120. console.log(searchTerms[index]);
  121. dataTableInstance.ajax.reload();
  122. }
  123. window.getFilterInput = getFilterInput;
  124. document.addEventListener('DOMContentLoaded', () => {
  125. console.log("datatables.js is working!");
  126. });