dataTable.js 13 KB

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