datatable.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. // jQuery UI style "widget" for selecting and sorting "fields"
  2. $(function()
  3. {
  4. // the widget definition, where "itop" is the namespace,
  5. // "datatable" the widget name
  6. $.widget( "itop.datatable",
  7. {
  8. // default options
  9. options:
  10. {
  11. sPersistentId: '',
  12. sFilter: '',
  13. oColumns: {},
  14. sSelectMode: '',
  15. sViewLink: 'true',
  16. iNbObjects: 0,
  17. iDefaultPageSize: -1,
  18. iPageSize: -1,
  19. iPageIndex: 0,
  20. oClassAliases: {},
  21. sTableId : null,
  22. oExtraParams: {},
  23. sRenderUrl: 'index.php',
  24. oRenderParameters: {},
  25. oDefaultSettings: {},
  26. oLabels: { moveup: 'Move Up', movedown: 'Move Down' }
  27. },
  28. // the constructor
  29. _create: function()
  30. {
  31. this.aDlgStateParams = ['iDefaultPageSize', 'oColumns'];
  32. this.element
  33. .addClass('itop-datatable');
  34. var me = this;
  35. var sId = new String(this.element.attr('id'));
  36. var sListId = sId.replace('datatable_', '');
  37. var bViewLink = (this.options.sViewLink == 'true');
  38. $('#sfl_'+sListId).fieldsorter({hasKeyColumn: bViewLink, labels: this.options.oLabels, fields: this.options.oColumns, onChange: function() { me._onSpecificSettings(); } });
  39. $('#datatable_dlg_'+sListId).find('input[name=page_size]').click(function() { me._onSpecificSettings(); });
  40. $('#datatable_dlg_'+sListId).find('input[name=save_settings]').click(function() { me._updateSaveScope(); });
  41. this.element.find('.itop_popup > ul li').popupmenu();
  42. this._updateSaveScope();
  43. this._saveDlgState();
  44. },
  45. // called when created, and later when changing options
  46. _refresh: function()
  47. {
  48. oParams = this.options.oRenderParameters;
  49. oParams.operation = 'datatable';
  50. oParams.filter = this.options.sFilter;
  51. oParams.extra_param = this.options.oExtraParams;
  52. oParams.start = 0;
  53. oParams.end = this.options.iPageSize;
  54. oParams.select_mode = this.options.sSelectMode;
  55. oParams.display_key = this.options.sViewLink;
  56. oParams.class_aliases = this.options.oClassAliases;
  57. oParams.columns = this.options.oColumns;
  58. var iSortCol = 0;
  59. for(var k1 in oParams.columns) //Aliases
  60. {
  61. for(var k2 in oParams.columns[k1]) //Attribute codes
  62. {
  63. if (oParams.columns[k1][k2].sort != 'none')
  64. {
  65. oParams.sort_col = iSortCol;
  66. oParams.sort_order = oParams.columns[k1][k2].sort;
  67. break; //TODO make this more generic, Sort on just one column for now
  68. }
  69. iSortCol++;
  70. }
  71. break; //TODO: DBObjectSet supports only sorting on the first alias of the set
  72. }
  73. var sId = new String(this.element.attr('id'));
  74. var sListId = sId.replace('datatable_', '');
  75. oParams.list_id = sListId;
  76. var me = this;
  77. $.post(this.options.sRenderUrl, oParams, function(data) {
  78. // Nasty workaround to clear the pager's state for paginated lists !!!
  79. // See jquery.tablesorter.pager.js / saveParams / restoreParams
  80. if (window.pager_params)
  81. {
  82. window.pager_params['pager'+sListId] = undefined;
  83. }
  84. // End of workaround
  85. me.element.find('.datacontents').html(data);
  86. }, 'html' );
  87. },
  88. _useDefaultSettings: function(bResetAll)
  89. {
  90. var oParams = this.options.oRenderParameters;
  91. oParams.operation = 'datatable_reset_settings';
  92. oParams.table_id = this.options.sTableId;
  93. oParams.defaults = bResetAll;
  94. oParams.class_aliases = this.options.oClassAliases;
  95. var me = this;
  96. $.post(this.options.sRenderUrl, oParams, function(data) {
  97. // Do nothing...
  98. }, 'html' );
  99. },
  100. _saveSettings: function(bSaveAsDefaults)
  101. {
  102. var oParams = this.options.oRenderParameters;
  103. oParams.operation = 'datatable_save_settings';
  104. oParams.page_size = this.options.iPageSize;
  105. oParams.table_id = this.options.sTableId;
  106. oParams.defaults = bSaveAsDefaults;
  107. oParams.class_aliases = this.options.oClassAliases;
  108. oParams.columns = this.options.oColumns;
  109. var iSortCol = 0;
  110. var sSortOrder = '';
  111. for(var i in this.options.oColumns)
  112. {
  113. if (this.options.oColumns[i].checked)
  114. {
  115. if (this.options.oColumns[i].sort != 'none')
  116. {
  117. sSortOrder = this.options.oColumns[i].sort;
  118. }
  119. else
  120. {
  121. iSortCol++;
  122. }
  123. }
  124. }
  125. if ((this.options.sSelectMode != '') && (this.options.sSelectMode != 'none'))
  126. {
  127. iSortCol++;
  128. }
  129. oParams.sort_col = iSortCol;
  130. oParams.sort_order = sSortOrder;
  131. var me = this;
  132. $.post(this.options.sRenderUrl, oParams, function(data) {
  133. // Do nothing...
  134. }, 'html' );
  135. },
  136. onDlgOk: function()
  137. {
  138. var oOptions = {};
  139. var sId = new String(this.element.attr('id'));
  140. var sListId = sId.replace('datatable_', '');
  141. oSettings = $('#datatable_dlg_'+sListId).find('input[name=settings]:checked');
  142. if (oSettings.val() == 'defaults')
  143. {
  144. oOptions = { iPageSize: this.options.oDefaultSettings.iDefaultPageSize,
  145. oColumns: this.options.oDefaultSettings.oColumns
  146. };
  147. }
  148. else
  149. {
  150. var oDisplayColumns = {};
  151. var iColIdx = 0;
  152. var iSortIdx = 0;
  153. var sSortDirection = 'asc';
  154. var oColumns = $('#datatable_dlg_'+sListId).find(':itop-fieldsorter').fieldsorter('get_params');
  155. var iPageSize = parseInt($('#datatable_dlg_'+sListId+' input[name=page_size]').val(), 10);
  156. oOptions = {oColumns: oColumns, iPageSize: iPageSize, iDefaultPageSize: iPageSize };
  157. }
  158. this._setOptions(oOptions);
  159. // Check if we need to save the settings or not...
  160. var oSaveCheck = $('#datatable_dlg_'+sListId).find('input[name=save_settings]');
  161. var oSaveScope = $('#datatable_dlg_'+sListId).find('input[name=scope]:checked');
  162. if (oSaveCheck.attr('checked'))
  163. {
  164. if (oSettings.val() == 'defaults')
  165. {
  166. this._useDefaultSettings((oSaveScope.val() == 'defaults'));
  167. }
  168. else
  169. {
  170. this._saveSettings((oSaveScope.val() == 'defaults'));
  171. }
  172. }
  173. this._saveDlgState();
  174. },
  175. onDlgCancel: function()
  176. {
  177. this._restoreDlgState();
  178. },
  179. _onSpecificSettings: function()
  180. {
  181. var sId = new String(this.element.attr('id'));
  182. var sListId = sId.replace('datatable_', '');
  183. $('#datatable_dlg_'+sListId).find('input.specific_settings').attr('checked', 'checked');
  184. },
  185. _updateSaveScope: function()
  186. {
  187. var sId = new String(this.element.attr('id'));
  188. var sListId = sId.replace('datatable_', '');
  189. var oSaveCheck = $('#datatable_dlg_'+sListId).find('input[name=save_settings]');
  190. if (oSaveCheck.attr('checked'))
  191. {
  192. $('#datatable_dlg_'+sListId).find('input[name=scope]').each(function() {
  193. if ($(this).attr('stay-disabled') != 'true')
  194. {
  195. $(this).removeAttr('disabled');
  196. }
  197. });
  198. }
  199. else
  200. {
  201. $('#datatable_dlg_'+sListId).find('input[name=scope]').attr('disabled', 'disabled');
  202. }
  203. },
  204. // events bound via _bind are removed automatically
  205. // revert other modifications here
  206. _destroy: function()
  207. {
  208. this.element
  209. .removeClass('itop-datatable');
  210. var sId = new String(this.element.attr('id'));
  211. var sListId = sId.replace('datatable_', '');
  212. $('#sfl_'+sListId).remove();
  213. $('#datatable_dlg_'+sListId).remove();
  214. },
  215. // _setOptions is called with a hash of all options that are changing
  216. _setOptions: function()
  217. {
  218. // in 1.9 would use _superApply
  219. this._superApply(arguments);
  220. this._refresh();
  221. },
  222. // _setOption is called for each individual option that is changing
  223. _setOption: function( key, value )
  224. {
  225. // in 1.9 would use _super
  226. this._superApply(arguments);
  227. },
  228. UpdateState: function( config )
  229. {
  230. var iPageSize = config.page_size;
  231. if (iPageSize == -1)
  232. {
  233. iPageSize = 0;
  234. }
  235. this.options.iPageSize = iPageSize;
  236. var iPos = 0;
  237. for (alias in this.options.oColumns)
  238. {
  239. for (attcode in this.options.oColumns[alias])
  240. {
  241. this.options.oColumns[alias][attcode]['sort'] = 'none';
  242. if (this.options.oColumns[alias][attcode]['checked'])
  243. {
  244. if (iPos == config.sort_index)
  245. {
  246. this.options.oColumns[alias][attcode]['sort'] = config.sort_order;
  247. }
  248. iPos++;
  249. }
  250. }
  251. }
  252. var sId = new String(this.element.attr('id'));
  253. var sListId = sId.replace('datatable_', '');
  254. var dlgElement = $('#datatable_dlg_'+sListId);
  255. dlgElement.find('input[name=page_size]').val(iPageSize);
  256. dlgElement.find(':itop-fieldsorter').fieldsorter('option', { fields: this.options.oColumns });
  257. },
  258. _saveDlgState: function()
  259. {
  260. this.originalState = {};
  261. for(k in this.aDlgStateParams)
  262. {
  263. this.originalState[this.aDlgStateParams[k]] = this.options[this.aDlgStateParams[k]];
  264. }
  265. var sId = new String(this.element.attr('id'));
  266. var sListId = sId.replace('datatable_', '');
  267. this.originalState.oFields = $('#datatable_dlg_'+sListId).find(':itop-fieldsorter').fieldsorter('get_params');
  268. },
  269. _restoreDlgState: function()
  270. {
  271. var sId = new String(this.element.attr('id'));
  272. var sListId = sId.replace('datatable_', '');
  273. var dlgElement = $('#datatable_dlg_'+sListId);
  274. for(k in this.aDlgStateParams)
  275. {
  276. this._setOption(this.aDlgStateParams[k], this.originalState[this.aDlgStateParams[k]]);
  277. }
  278. dlgElement.find('input[name=page_size]').val(this.originalState.iDefaultPageSize);
  279. dlgElement.find(':itop-fieldsorter').fieldsorter('option', { fields: this.originalState.oFields });
  280. },
  281. IsDialogOpen: function()
  282. {
  283. var sId = new String(this.element.attr('id'));
  284. var sListId = sId.replace('datatable_', '');
  285. var oDlgOpen = $('#datatable_dlg_'+sListId+' :visible');
  286. return (oDlgOpen.length > 0);
  287. },
  288. GetMultipleSelectionParams: function()
  289. {
  290. var oRes = {};
  291. oRes.selectionMode = '';
  292. if (this.element.find(':input[name=selectionMode]').length > 0)
  293. {
  294. oRes.selectionMode = this.element.find(':input[name=selectionMode]').val();
  295. }
  296. oRes.selectObject = [];
  297. this.element.find(':input[name^=selectObject]:checked').each(function() {
  298. oRes.selectObject.push($(this).val());
  299. });
  300. oRes.storedSelection = [];
  301. this.element.find(':input[name^=storedSelection]').each(function() {
  302. oRes.storedSelection.push($(this).val());
  303. });
  304. return oRes;
  305. }
  306. });
  307. });