dataTable.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. mgJsComponentHandler.addDefaultComponent('mg-datatable', {
  2. template: '#t-mg-datatable',
  3. props: [
  4. 'component_id',
  5. 'component_namespace',
  6. 'component_index'
  7. ],
  8. data: function () {
  9. return {
  10. dataRows: [],
  11. length: 10,
  12. iSortCol_0: '',
  13. sSortDir_0: '',
  14. addTimeout: false,
  15. sSearch: false,
  16. sSearchPrevious: false,
  17. dataShowing: 0,
  18. dataTo: 0,
  19. dataFrom: 0,
  20. curPage: 1,
  21. allPages: 1,
  22. pagesMap: [],
  23. loading: false,
  24. show: true,
  25. showModal: false,
  26. noData: false,
  27. onOffSwitchEnabled: false,
  28. children: []
  29. };
  30. },
  31. created: function () {
  32. var self = this;
  33. self.addTimeout = true;
  34. self.updateProjects();
  35. self.$parent.$root.$on('reloadMgData', this.updateMgData);
  36. },
  37. updated: function () {
  38. var self = this;
  39. initMassActionsOnDatatables(self.component_id);
  40. initTooltipsForDatatables(self.component_id);
  41. },
  42. methods: {
  43. updateMgData: function (toReloadId) {
  44. var self = this;
  45. if (self.component_id === toReloadId) {
  46. self.updateProjects();
  47. self.$nextTick(function () {
  48. self.$emit('restartRefreshingState');
  49. });
  50. }
  51. },
  52. updateProjects: function () {
  53. var self = this;
  54. self.loading = true;
  55. var resp = self.$parent.$root.$options.methods.vloadData({loadData: self.component_id, namespace: self.component_namespace, index: self.component_index, iDisplayLength: self.length, iDisplayStart: self.dataShowing, sSearch: (self.sSearch !== false ? self.sSearch : ''), iSortCol_0: self.iSortCol_0, sSortDir_0: self.sSortDir_0});
  56. resp.done(function (data) {
  57. if (data.data.status === 'error') {
  58. self.noData = true;
  59. mgPageControler.vueLoader.handleErrorMessage(data.data);
  60. } else {
  61. var actionData = data.data.rawData;
  62. data = data.data.rawData.recordsSet;
  63. if (data.records.length === 0 && self.dataShowing > 0) {
  64. self.dataShowing = 0;
  65. return self.updateProjects();
  66. }
  67. self.dataRows = data.records;
  68. self.runCalbacks(actionData);
  69. mgEventHandler.runCallback('DatatableDataLoaded', self.component_id, {data: data.records, datatable: self});
  70. self.dataShowing = data.offset;
  71. self.dataTo = data.records.length + data.offset;
  72. self.dataFrom = data.fullDataLenght;
  73. self.addTimeout = false;
  74. if (self.addTimeout === true) {
  75. setTimeout(self.updateProjects, 60000);
  76. self.addTimeout = false;
  77. }
  78. self.noData = data.records.length > 0 ? false : true;
  79. }
  80. self.updatePagination();
  81. self.loading = false;
  82. }).fail(function (jqXHR, textStatus, errorThrown) {
  83. self.loading = false;
  84. self.dataRows = [];
  85. self.noData = true;
  86. mgEventHandler.runCallback('DatatableDataLoadingFailed', self.component_id, {jqXHR: jqXHR, textStatus: textStatus, errorThrown: errorThrown});
  87. mgPageControler.vueLoader.handleServerError(jqXHR, textStatus, errorThrown);
  88. });
  89. uncheckSelectAllCheck(self.tableWrapperId);
  90. },
  91. runCalbacks: function (data) {
  92. var self = this;
  93. if (typeof data.recordsSet !== 'undefined' && typeof data.recordsSet.records !== 'undefined' && data.recordsSet.records.length > 0)
  94. {
  95. $('#loadedTemplates').append(data.template);
  96. self.$nextTick(function () {
  97. for (var key in data.registrations) {
  98. mgJsComponentHandler.extendRegisterByDefaultTemplate(key.toLowerCase(), data.registrations[key]);
  99. }
  100. });
  101. }
  102. },
  103. updateLength: function (event) {
  104. var self = this;
  105. var btnTarget = (typeof $(event.target).attr('data-length') === 'undefined') ? $(event.target).parent() : $(event.target);
  106. self.length = $(btnTarget).attr('data-length');
  107. self.dataShowing = 0;
  108. $(btnTarget).parent().children('.active').removeClass('active');
  109. $(btnTarget).addClass('active');
  110. self.updateProjects();
  111. },
  112. updateSorting: function (event) {
  113. var self = this;
  114. var sortTarget = $(event.target)[0].tagName === 'TH' ? $(event.target) : $(event.target).parents('th').first();
  115. self.iSortCol_0 = $(sortTarget).attr('name');
  116. self.dataShowing = 0;
  117. var currentDir = self.getSortDir($(sortTarget), true);
  118. $(event.target).parents('tr').first().children('.sorting_asc, .sorting_desc').addClass('sorting').removeClass('sorting_asc').removeClass('sorting_desc');
  119. $(sortTarget).removeClass('sorting').removeClass('sorting_asc').removeClass('sorting_desc').addClass(self.reverseSort(currentDir));
  120. self.sSortDir_0 = self.getSortDir($(sortTarget), false);
  121. self.updateProjects();
  122. },
  123. reverseSort: function (sort) {
  124. var sortingType = 'sorting_asc';
  125. if (sort === 'sorting_asc') {
  126. sortingType = 'sorting_desc';
  127. }
  128. return sortingType;
  129. },
  130. getSortDir: function (elem, rawClass) {
  131. var sorts = ['sorting_asc', 'sorting_desc', 'sorting'];
  132. var sorting = '';
  133. $.each(sorts, function (key, sort) {
  134. if ($(elem).hasClass(sort) === true) {
  135. sorting = rawClass ? sort : sort.replace('sorting_', '').replace('sorting', '');
  136. return sorting;
  137. }
  138. });
  139. return sorting;
  140. },
  141. searchData: function (event) {
  142. var self = this;
  143. self.sSearch = $(event.target).val() === '' ? false : $(event.target).val();
  144. if (self.sSearch !== false) {
  145. if (self.sSearchPrevious !== false && self.sSearchPrevious !== self.sSearch) {
  146. self.dataShowing = 0;
  147. }
  148. self.sSearchPrevious = self.sSearch;
  149. } else {
  150. self.sSearchPrevious = false;
  151. }
  152. self.updateProjects();
  153. },
  154. updatePagination: function () {
  155. var self = this;
  156. self.curPage = (parseInt(self.dataShowing) / parseInt(self.length)) + 1;
  157. var tempPages = parseInt(parseInt(self.dataFrom) / parseInt(self.length));
  158. self.allPages = parseInt(tempPages + ((parseInt(self.length) * tempPages) < parseInt(self.dataFrom) ? 1 : 0));
  159. self.updatePagesMap();
  160. },
  161. updatePagesMap: function () {
  162. var self = this;
  163. if (self.allPages === 1) {
  164. self.pagesMap = [1];
  165. return;
  166. }
  167. self.pagesMap = [
  168. self.curPage - 5,
  169. self.curPage - 4,
  170. self.curPage - 3,
  171. self.curPage - 2,
  172. self.curPage - 1,
  173. self.curPage,
  174. self.curPage + 1,
  175. self.curPage + 2,
  176. self.curPage + 3,
  177. self.curPage + 4,
  178. self.curPage + 5
  179. ];
  180. for (i = 0; i < self.pagesMap.length; i++) {
  181. if (self.pagesMap[i] < 0 || self.pagesMap[i] > self.allPages) {
  182. self.pagesMap[i] = null;
  183. }
  184. }
  185. if (self.pagesMap.indexOf(self.allPages) === -1) {
  186. self.pagesMap[self.pagesMap.length - 1] = self.allPages;
  187. }
  188. if (self.pagesMap.indexOf(1) === -1) {
  189. self.pagesMap[0] = 1;
  190. }
  191. if (self.allPages > 7 && self.curPage > 4) {
  192. self.pagesMap[self.pagesMap.indexOf(Math.min(
  193. self.curPage - 1 > 1 ? self.curPage - 1 : self.curPage,
  194. self.curPage - 2 > 1 ? self.curPage - 2 : self.curPage,
  195. self.curPage - 3 > 1 ? self.curPage - 3 : self.curPage,
  196. self.curPage - 4 > 1 ? self.curPage - 4 : self.curPage
  197. ))] = '...';
  198. }
  199. for (i = self.pagesMap.length - 1; i > self.pagesMap.indexOf(self.curPage); i--) {
  200. if (i === 8 && self.pagesMap[i] === self.curPage + 3 && self.pagesMap[i] !== self.allPages) {
  201. self.pagesMap[i] = null;
  202. }
  203. }
  204. if (self.allPages > 7 && (4 <= self.allPages - self.curPage)) {
  205. self.pagesMap[self.pagesMap.indexOf(self.allPages) - 1] = '...';
  206. }
  207. },
  208. changePage: function (event) {
  209. var self = this;
  210. if ($(event.target).parent().hasClass('disabled') === false && $(event.target).hasClass('disabled') === false) {
  211. var newPageNumber = $(event.target).attr('data-dt-idx');
  212. self.dataShowing = ((newPageNumber < 1) ? 0 : newPageNumber - 1) * parseInt(self.length);
  213. self.updateProjects();
  214. }
  215. },
  216. rowDrow: function (name, DataRow, customFunctionName) {
  217. if (window[customFunctionName] === undefined) {
  218. return DataRow[name];
  219. } else {
  220. return window[customFunctionName](name, DataRow);
  221. }
  222. },
  223. loadModal: function (event, targetId, namespace, index) {
  224. mgPageControler.vueLoader.loadModal(event, targetId,
  225. typeof namespace !== 'undefined' ? namespace : getItemNamespace(targetId),
  226. typeof index !== 'undefined' ? index : getItemIndex(targetId));
  227. },
  228. onOffSwitch: function (event, targetId) {
  229. var switchPostData = $(event.target).is(':checked') ? {'value': 'on'} : {'value': 'off'};
  230. mgPageControler.vueLoader.ajaxAction(event, targetId, getItemNamespace(targetId), getItemIndex(targetId), switchPostData);
  231. },
  232. redirect: function (event, params, targetBlank) {
  233. mgPageControler.vueLoader.redirect(event, params, targetBlank);
  234. }
  235. }
  236. });