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