datatable.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. /***
  2. Wrapper/Helper Class for datagrid based on jQuery Datatable Plugin
  3. ***/
  4. var Datatable = function() {
  5. var tableOptions; // main options
  6. var dataTable; // datatable object
  7. var table; // actual table jquery object
  8. var tableContainer; // actual table container object
  9. var tableWrapper; // actual table wrapper jquery object
  10. var tableInitialized = false;
  11. var ajaxParams = {}; // set filter mode
  12. var the;
  13. var countSelectedRecords = function() {
  14. var selected = $('tbody > tr > td:nth-child(1) input[type="checkbox"]:checked', table).size();
  15. var text = tableOptions.dataTable.language.metronicGroupActions;
  16. if (selected > 0) {
  17. $('.table-group-actions > span', tableWrapper).text(text.replace("_TOTAL_", selected));
  18. } else {
  19. $('.table-group-actions > span', tableWrapper).text("");
  20. }
  21. };
  22. return {
  23. //main function to initiate the module
  24. init: function(options) {
  25. if (!$().dataTable) {
  26. return;
  27. }
  28. the = this;
  29. // default settings
  30. options = $.extend(true, {
  31. src: "", // actual table
  32. filterApplyAction: "filter",
  33. filterCancelAction: "filter_cancel",
  34. resetGroupActionInputOnSuccess: true,
  35. loadingMessage: 'Loading...',
  36. dataTable: {
  37. "dom": "<'row'<'col-md-8 col-sm-12'pli><'col-md-4 col-sm-12'<'table-group-actions pull-right'>>r><'table-scrollable't><'row'<'col-md-8 col-sm-12'pli><'col-md-4 col-sm-12'>>", // datatable layout
  38. "pageLength": 10, // default records per page
  39. "language": { // language settings
  40. // metronic spesific
  41. "metronicGroupActions": "_TOTAL_ records selected: ",
  42. "metronicAjaxRequestGeneralError": "Could not complete request. Please check your internet connection",
  43. // data tables spesific
  44. "lengthMenu": "<span class='seperator'>|</span>View _MENU_ records",
  45. "info": "<span class='seperator'>|</span>Found total _TOTAL_ records",
  46. "infoEmpty": "No records found to show",
  47. "emptyTable": "No data available in table",
  48. "zeroRecords": "No matching records found",
  49. "paginate": {
  50. "previous": "Prev",
  51. "next": "Next",
  52. "last": "Last",
  53. "first": "First",
  54. "page": "Page",
  55. "pageOf": "of"
  56. }
  57. },
  58. "orderCellsTop": true,
  59. "columnDefs": [{ // define columns sorting options(by default all columns are sortable extept the first checkbox column)
  60. 'orderable': false,
  61. 'targets': [0]
  62. }],
  63. "pagingType": "bootstrap_extended", // pagination type(bootstrap, bootstrap_full_number or bootstrap_extended)
  64. "autoWidth": false, // disable fixed width and enable fluid table
  65. "processing": false, // enable/disable display message box on record load
  66. "serverSide": true, // enable/disable server side ajax loading
  67. "ajax": { // define ajax settings
  68. "url": "", // ajax URL
  69. "type": "POST", // request type
  70. "timeout": 20000,
  71. "data": function(data) { // add request parameters before submit
  72. $.each(ajaxParams, function(key, value) {
  73. data[key] = value;
  74. });
  75. Metronic.blockUI({
  76. message: tableOptions.loadingMessage,
  77. target: tableContainer,
  78. overlayColor: 'none',
  79. cenrerY: true,
  80. boxed: true
  81. });
  82. },
  83. "dataSrc": function(res) { // Manipulate the data returned from the server
  84. if (res.customActionMessage) {
  85. Metronic.alert({
  86. type: (res.customActionStatus == 'OK' ? 'success' : 'danger'),
  87. icon: (res.customActionStatus == 'OK' ? 'check' : 'warning'),
  88. message: res.customActionMessage,
  89. container: tableWrapper,
  90. place: 'prepend'
  91. });
  92. }
  93. if (res.customActionStatus) {
  94. if (tableOptions.resetGroupActionInputOnSuccess) {
  95. $('.table-group-action-input', tableWrapper).val("");
  96. }
  97. }
  98. if ($('.group-checkable', table).size() === 1) {
  99. $('.group-checkable', table).attr("checked", false);
  100. $.uniform.update($('.group-checkable', table));
  101. }
  102. if (tableOptions.onSuccess) {
  103. tableOptions.onSuccess.call(undefined, the);
  104. }
  105. Metronic.unblockUI(tableContainer);
  106. return res.data;
  107. },
  108. "error": function() { // handle general connection errors
  109. if (tableOptions.onError) {
  110. tableOptions.onError.call(undefined, the);
  111. }
  112. Metronic.alert({
  113. type: 'danger',
  114. icon: 'warning',
  115. message: tableOptions.dataTable.language.metronicAjaxRequestGeneralError,
  116. container: tableWrapper,
  117. place: 'prepend'
  118. });
  119. Metronic.unblockUI(tableContainer);
  120. }
  121. },
  122. "drawCallback": function(oSettings) { // run some code on table redraw
  123. if (tableInitialized === false) { // check if table has been initialized
  124. tableInitialized = true; // set table initialized
  125. table.show(); // display table
  126. }
  127. Metronic.initUniform($('input[type="checkbox"]', table)); // reinitialize uniform checkboxes on each table reload
  128. countSelectedRecords(); // reset selected records indicator
  129. // callback for ajax data load
  130. if (tableOptions.onDataLoad) {
  131. tableOptions.onDataLoad.call(undefined, the);
  132. }
  133. }
  134. }
  135. }, options);
  136. tableOptions = options;
  137. // create table's jquery object
  138. table = $(options.src);
  139. tableContainer = table.parents(".table-container");
  140. // apply the special class that used to restyle the default datatable
  141. var tmp = $.fn.dataTableExt.oStdClasses;
  142. $.fn.dataTableExt.oStdClasses.sWrapper = $.fn.dataTableExt.oStdClasses.sWrapper + " dataTables_extended_wrapper";
  143. $.fn.dataTableExt.oStdClasses.sFilterInput = "form-control input-small input-sm input-inline";
  144. $.fn.dataTableExt.oStdClasses.sLengthSelect = "form-control input-xsmall input-sm input-inline";
  145. // initialize a datatable
  146. dataTable = table.DataTable(options.dataTable);
  147. // revert back to default
  148. $.fn.dataTableExt.oStdClasses.sWrapper = tmp.sWrapper;
  149. $.fn.dataTableExt.oStdClasses.sFilterInput = tmp.sFilterInput;
  150. $.fn.dataTableExt.oStdClasses.sLengthSelect = tmp.sLengthSelect;
  151. // get table wrapper
  152. tableWrapper = table.parents('.dataTables_wrapper');
  153. // build table group actions panel
  154. if ($('.table-actions-wrapper', tableContainer).size() === 1) {
  155. $('.table-group-actions', tableWrapper).html($('.table-actions-wrapper', tableContainer).html()); // place the panel inside the wrapper
  156. $('.table-actions-wrapper', tableContainer).remove(); // remove the template container
  157. }
  158. // handle group checkboxes check/uncheck
  159. $('.group-checkable', table).change(function() {
  160. var set = $('tbody > tr > td:nth-child(1) input[type="checkbox"]', table);
  161. var checked = $(this).is(":checked");
  162. $(set).each(function() {
  163. $(this).attr("checked", checked);
  164. });
  165. $.uniform.update(set);
  166. countSelectedRecords();
  167. });
  168. // handle row's checkbox click
  169. table.on('change', 'tbody > tr > td:nth-child(1) input[type="checkbox"]', function() {
  170. countSelectedRecords();
  171. });
  172. // handle filter submit button click
  173. table.on('click', '.filter-submit', function(e) {
  174. e.preventDefault();
  175. the.submitFilter();
  176. });
  177. // handle filter cancel button click
  178. table.on('click', '.filter-cancel', function(e) {
  179. e.preventDefault();
  180. the.resetFilter();
  181. });
  182. },
  183. submitFilter: function() {
  184. the.setAjaxParam("action", tableOptions.filterApplyAction);
  185. // get all typeable inputs
  186. $('textarea.form-filter, select.form-filter, input.form-filter:not([type="radio"],[type="checkbox"])', table).each(function() {
  187. the.setAjaxParam($(this).attr("name"), $(this).val());
  188. });
  189. // get all checkboxes
  190. $('input.form-filter[type="checkbox"]:checked', table).each(function() {
  191. the.addAjaxParam($(this).attr("name"), $(this).val());
  192. });
  193. // get all radio buttons
  194. $('input.form-filter[type="radio"]:checked', table).each(function() {
  195. the.setAjaxParam($(this).attr("name"), $(this).val());
  196. });
  197. dataTable.ajax.reload();
  198. },
  199. resetFilter: function() {
  200. $('textarea.form-filter, select.form-filter, input.form-filter', table).each(function() {
  201. $(this).val("");
  202. });
  203. $('input.form-filter[type="checkbox"]', table).each(function() {
  204. $(this).attr("checked", false);
  205. });
  206. the.clearAjaxParams();
  207. the.addAjaxParam("action", tableOptions.filterCancelAction);
  208. dataTable.ajax.reload();
  209. },
  210. getSelectedRowsCount: function() {
  211. return $('tbody > tr > td:nth-child(1) input[type="checkbox"]:checked', table).size();
  212. },
  213. getSelectedRows: function() {
  214. var rows = [];
  215. $('tbody > tr > td:nth-child(1) input[type="checkbox"]:checked', table).each(function() {
  216. rows.push($(this).val());
  217. });
  218. return rows;
  219. },
  220. setAjaxParam: function(name, value) {
  221. ajaxParams[name] = value;
  222. },
  223. addAjaxParam: function(name, value) {
  224. if (!ajaxParams[name]) {
  225. ajaxParams[name] = [];
  226. }
  227. skip = false;
  228. for (var i = 0; i < (ajaxParams[name]).length; i++) { // check for duplicates
  229. if (ajaxParams[name][i] === value) {
  230. skip = true;
  231. }
  232. }
  233. if (skip === false) {
  234. ajaxParams[name].push(value);
  235. }
  236. },
  237. clearAjaxParams: function(name, value) {
  238. ajaxParams = {};
  239. },
  240. getDataTable: function() {
  241. return dataTable;
  242. },
  243. getTableWrapper: function() {
  244. return tableWrapper;
  245. },
  246. gettableContainer: function() {
  247. return tableContainer;
  248. },
  249. getTable: function() {
  250. return table;
  251. }
  252. };
  253. };