datatable.js 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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 me = this;
  110. $.post(this.options.sRenderUrl, oParams, function(data) {
  111. // Do nothing...
  112. }, 'html' );
  113. },
  114. onDlgOk: function()
  115. {
  116. var oOptions = {};
  117. var sId = new String(this.element.attr('id'));
  118. var sListId = sId.replace('datatable_', '');
  119. oSettings = $('#datatable_dlg_'+sListId).find('input[name=settings]:checked');
  120. if (oSettings.val() == 'defaults')
  121. {
  122. oOptions = { iPageSize: this.options.oDefaultSettings.iDefaultPageSize,
  123. oColumns: this.options.oDefaultSettings.oColumns
  124. };
  125. }
  126. else
  127. {
  128. var oDisplayColumns = {};
  129. var iColIdx = 0;
  130. var iSortIdx = 0;
  131. var sSortDirection = 'asc';
  132. var oColumns = $('#datatable_dlg_'+sListId).find(':itop-fieldsorter').fieldsorter('get_params');
  133. var iPageSize = parseInt($('#datatable_dlg_'+sListId+' input[name=page_size]').val(), 10);
  134. oOptions = {oColumns: oColumns, iPageSize: iPageSize, iDefaultPageSize: iPageSize };
  135. }
  136. this._setOptions(oOptions);
  137. // Check if we need to save the settings or not...
  138. var oSaveCheck = $('#datatable_dlg_'+sListId).find('input[name=save_settings]');
  139. var oSaveScope = $('#datatable_dlg_'+sListId).find('input[name=scope]:checked');
  140. if (oSaveCheck.attr('checked'))
  141. {
  142. if (oSettings.val() == 'defaults')
  143. {
  144. this._useDefaultSettings((oSaveScope.val() == 'defaults'));
  145. }
  146. else
  147. {
  148. this._saveSettings((oSaveScope.val() == 'defaults'));
  149. }
  150. }
  151. this._saveDlgState();
  152. },
  153. onDlgCancel: function()
  154. {
  155. this._restoreDlgState();
  156. },
  157. _onSpecificSettings: function()
  158. {
  159. var sId = new String(this.element.attr('id'));
  160. var sListId = sId.replace('datatable_', '');
  161. $('#datatable_dlg_'+sListId).find('input.specific_settings').attr('checked', 'checked');
  162. },
  163. _updateSaveScope: function()
  164. {
  165. var sId = new String(this.element.attr('id'));
  166. var sListId = sId.replace('datatable_', '');
  167. var oSaveCheck = $('#datatable_dlg_'+sListId).find('input[name=save_settings]');
  168. if (oSaveCheck.attr('checked'))
  169. {
  170. $('#datatable_dlg_'+sListId).find('input[name=scope]').each(function() {
  171. if ($(this).attr('stay-disabled') != 'true')
  172. {
  173. $(this).removeAttr('disabled');
  174. }
  175. });
  176. }
  177. else
  178. {
  179. $('#datatable_dlg_'+sListId).find('input[name=scope]').attr('disabled', 'disabled');
  180. }
  181. },
  182. // events bound via _bind are removed automatically
  183. // revert other modifications here
  184. destroy: function()
  185. {
  186. this.element
  187. .removeClass('itop-datatable');
  188. var sId = new String(this.element.attr('id'));
  189. var sListId = sId.replace('datatable_', '');
  190. $('#sfl_'+sListId).remove();
  191. $('#datatable_dlg_'+sListId).remove();
  192. // call the original destroy method since we overwrote it
  193. $.Widget.prototype.destroy.call( this );
  194. },
  195. // _setOptions is called with a hash of all options that are changing
  196. _setOptions: function()
  197. {
  198. // in 1.9 would use _superApply
  199. $.Widget.prototype._setOptions.apply( this, arguments );
  200. this._refresh();
  201. },
  202. // _setOption is called for each individual option that is changing
  203. _setOption: function( key, value )
  204. {
  205. // in 1.9 would use _super
  206. $.Widget.prototype._setOption.call( this, key, value );
  207. },
  208. _saveDlgState: function()
  209. {
  210. this.originalState = {};
  211. for(k in this.aDlgStateParams)
  212. {
  213. this.originalState[this.aDlgStateParams[k]] = this.options[this.aDlgStateParams[k]];
  214. }
  215. var sId = new String(this.element.attr('id'));
  216. var sListId = sId.replace('datatable_', '');
  217. this.originalState.oFields = $('#datatable_dlg_'+sListId).find(':itop-fieldsorter').fieldsorter('get_params');
  218. },
  219. _restoreDlgState: function()
  220. {
  221. var sId = new String(this.element.attr('id'));
  222. var sListId = sId.replace('datatable_', '');
  223. var dlgElement = $('#datatable_dlg_'+sListId);
  224. for(k in this.aDlgStateParams)
  225. {
  226. this._setOption(this.aDlgStateParams[k], this.originalState[this.aDlgStateParams[k]]);
  227. }
  228. dlgElement.find('input[name=page_size]').val(this.originalState.iDefaultPageSize);
  229. dlgElement.find(':itop-fieldsorter').fieldsorter('option', { fields: this.originalState.oFields });
  230. },
  231. IsDialogOpen: function()
  232. {
  233. var sId = new String(this.element.attr('id'));
  234. var sListId = sId.replace('datatable_', '');
  235. var oDlgOpen = $('#datatable_dlg_'+sListId+' :visible');
  236. return (oDlgOpen.length > 0);
  237. },
  238. GetMultipleSelectionParams: function()
  239. {
  240. var oRes = {};
  241. oRes.selectionMode = '';
  242. if (this.element.find(':input[name=selectionMode]').length > 0)
  243. {
  244. oRes.selectionMode = this.element.find(':input[name=selectionMode]').val();
  245. }
  246. oRes.selectObject = [];
  247. this.element.find(':input[name^=selectObject]:checked').each(function() {
  248. oRes.selectObject.push($(this).val());
  249. });
  250. oRes.storedSelection = [];
  251. this.element.find(':input[name^=storedSelection]').each(function() {
  252. oRes.storedSelection.push($(this).val());
  253. });
  254. return oRes;
  255. }
  256. });
  257. });