datatables.js 6.7 KB

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