datatable.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  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. // call the original destroy method since we overwrote it
  215. $.Widget.prototype.destroy.call( this );
  216. },
  217. // _setOptions is called with a hash of all options that are changing
  218. _setOptions: function()
  219. {
  220. // in 1.9 would use _superApply
  221. $.Widget.prototype._setOptions.apply( this, arguments );
  222. this._refresh();
  223. },
  224. // _setOption is called for each individual option that is changing
  225. _setOption: function( key, value )
  226. {
  227. // in 1.9 would use _super
  228. $.Widget.prototype._setOption.call( this, key, value );
  229. },
  230. _saveDlgState: function()
  231. {
  232. this.originalState = {};
  233. for(k in this.aDlgStateParams)
  234. {
  235. this.originalState[this.aDlgStateParams[k]] = this.options[this.aDlgStateParams[k]];
  236. }
  237. var sId = new String(this.element.attr('id'));
  238. var sListId = sId.replace('datatable_', '');
  239. this.originalState.oFields = $('#datatable_dlg_'+sListId).find(':itop-fieldsorter').fieldsorter('get_params');
  240. },
  241. _restoreDlgState: function()
  242. {
  243. var sId = new String(this.element.attr('id'));
  244. var sListId = sId.replace('datatable_', '');
  245. var dlgElement = $('#datatable_dlg_'+sListId);
  246. for(k in this.aDlgStateParams)
  247. {
  248. this._setOption(this.aDlgStateParams[k], this.originalState[this.aDlgStateParams[k]]);
  249. }
  250. dlgElement.find('input[name=page_size]').val(this.originalState.iDefaultPageSize);
  251. dlgElement.find(':itop-fieldsorter').fieldsorter('option', { fields: this.originalState.oFields });
  252. },
  253. IsDialogOpen: function()
  254. {
  255. var sId = new String(this.element.attr('id'));
  256. var sListId = sId.replace('datatable_', '');
  257. var oDlgOpen = $('#datatable_dlg_'+sListId+' :visible');
  258. return (oDlgOpen.length > 0);
  259. },
  260. GetMultipleSelectionParams: function()
  261. {
  262. var oRes = {};
  263. oRes.selectionMode = '';
  264. if (this.element.find(':input[name=selectionMode]').length > 0)
  265. {
  266. oRes.selectionMode = this.element.find(':input[name=selectionMode]').val();
  267. }
  268. oRes.selectObject = [];
  269. this.element.find(':input[name^=selectObject]:checked').each(function() {
  270. oRes.selectObject.push($(this).val());
  271. });
  272. oRes.storedSelection = [];
  273. this.element.find(':input[name^=storedSelection]').each(function() {
  274. oRes.storedSelection.push($(this).val());
  275. });
  276. return oRes;
  277. }
  278. });
  279. });