datatables.js 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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. var 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. //Set up any action columns
  25. function doActionButton(url, id)
  26. {
  27. window.open(url, "_blank");
  28. }
  29. window.doActionButton=doActionButton;
  30. var renderFunctions = [];
  31. dataTableHeadersConfig.forEach(function (headerColumn, columnIndex){
  32. if(headerColumn.type === "action")
  33. {
  34. let buttonUrl = dataTableColumnsConfig[columnIndex].buttonUrl;
  35. let parameters = dataTableColumnsConfig[columnIndex].querystring_parameters;
  36. console.log(parameters);
  37. let renderBody = `if (type === "display") {console.log(row);`;
  38. renderBody += `return '<button class="action-button" onclick="doActionButton(`;
  39. renderBody += `\\'`+buttonUrl;
  40. parameters.forEach(function (parameter, index){
  41. if(index === 0)
  42. {
  43. renderBody += '?';
  44. }
  45. else
  46. {
  47. renderBody += '&';
  48. }
  49. for(let key in parameter)
  50. {
  51. renderBody += key+'=';
  52. if(parameter[key] === 'row.id')
  53. {
  54. renderBody += '\'+'+encodeURIComponent(parameter[key])+'+\'';
  55. }
  56. else
  57. {
  58. renderBody += encodeURIComponent(parameter[key]);
  59. }
  60. }
  61. })
  62. renderBody += `\\'`;
  63. renderBody += ")\">"+dataTableColumnsConfig[columnIndex].buttonText+"</button>'}return data;";
  64. renderFunctions[columnIndex] = new Function('data', 'type', 'row', 'meta', renderBody);
  65. console.log(renderFunctions[columnIndex]);
  66. dataTableColumnsConfig[columnIndex].searchable = false;
  67. dataTableColumnsConfig[columnIndex].orderable = false;
  68. dataTableColumnsConfig[columnIndex].render = renderFunctions[columnIndex];
  69. }
  70. })
  71. dataTableInstance = $(`#${dataTableName}-table`).DataTable({
  72. responsive: true,
  73. retrieve: true,
  74. searching: false,
  75. processing: true,
  76. serverSide: true,
  77. orderCellsTop: true,
  78. fixedHeader: true,
  79. ajax: {
  80. url: '/api/report-data/' + dataTableName,
  81. type: 'POST',
  82. dataSrc: function (json) {
  83. //console.log('Returned data:', json);
  84. //populate any dropdown headers
  85. //console.log(dataTableHeadersConfig);
  86. dataTableHeadersConfig.forEach(function(headerConfig, index){
  87. if(headerConfig.searchtype == "dropdown")
  88. {
  89. //console.log('Tyson here');
  90. var dropdown = $('#'+headerConfig.header.replace(' ', '-')+'FilterDropdown');
  91. //console.log(dropdown);
  92. dropdown.empty().append($('<option>',{
  93. value: '',
  94. text: '-- Not Filtered --'
  95. }));
  96. json.dropdowndata[index].forEach(function (option) {
  97. var selected = false;
  98. if(json.searchterms && json.searchterms[index]){
  99. Object.keys(searchTerms[index]).forEach(function (key){
  100. var searchValue = searchTerms[index][key]
  101. console.log('value: '+searchValue)
  102. if(option === searchValue)
  103. {
  104. selected = true;
  105. }})}
  106. dropdown.append($('<option>',{
  107. value: option,
  108. text: option
  109. }).prop('selected', selected))});
  110. }});
  111. return json.data;
  112. },
  113. data: function (d) {
  114. d.searchTerms = searchTerms || {};
  115. }
  116. },
  117. columns: dataTableColumnsConfig,
  118. dom: 'lBfrtip',
  119. buttons: [
  120. { extend: 'copyHtml5', className: 'dt-button' },
  121. { extend: 'csvHtml5', className: 'dt-button' },
  122. { extend: 'excelHtml5', className: 'dt-button' },
  123. { extend: 'pdfHtml5', className: 'dt-button' },
  124. { extend: 'print', className: 'dt-button' },
  125. ],
  126. layout: {
  127. topStart: 'buttons'
  128. },
  129. columnDefs: [
  130. { responsivePriority: 1, targets: 1 },
  131. { responsivePriority: 2, targets: -1 },
  132. {visible:false, targets:0}
  133. ]
  134. });
  135. }
  136. document.addEventListener('livewire:init', function () {
  137. console.log('Initializing DataTable');
  138. initializeDataTable();
  139. });
  140. let inner = {};
  141. function getFilterInput(searchTerm, index, searchType, extra){
  142. switch (searchType) {
  143. case "text":
  144. case "number":
  145. inner[index] = searchTerm;
  146. break;
  147. case "date":
  148. if($.isEmptyObject(inner[index])) {
  149. inner[index] = {"start": "", "end": ""};
  150. }
  151. if (extra === "start") {
  152. inner[index].start = searchTerm;
  153. }
  154. else if (extra === "end") {
  155. inner[index].end = searchTerm;
  156. }
  157. break;
  158. case "dropdown":
  159. inner[index] = searchTerm;
  160. break;
  161. }
  162. searchTerms[index] = inner;
  163. console.log(searchTerms[index]);
  164. dataTableInstance.ajax.reload();
  165. }
  166. window.getFilterInput = getFilterInput;
  167. document.addEventListener('DOMContentLoaded', () => {
  168. console.log("datatables.js is working!");
  169. });