reports.js 7.8 KB

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