datatable.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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 sId = new String(this.element.attr('id'));
  59. var sListId = sId.replace('datatable_', '');
  60. oParams.list_id = sListId;
  61. var me = this;
  62. $.post(this.options.sRenderUrl, oParams, function(data) {
  63. // Nasty workaround to clear the pager's state for paginated lists !!!
  64. // See jquery.tablesorter.pager.js / saveParams / restoreParams
  65. if (window.pager_params)
  66. {
  67. window.pager_params['pager'+sListId] = undefined;
  68. }
  69. // End of workaround
  70. me.element.find('.datacontents').html(data);
  71. }, 'html' );
  72. },
  73. _useDefaultSettings: function(bResetAll)
  74. {
  75. var oParams = this.options.oRenderParameters;
  76. oParams.operation = 'datatable_reset_settings';
  77. oParams.table_id = this.options.sTableId;
  78. oParams.defaults = bResetAll;
  79. oParams.class_aliases = this.options.oClassAliases;
  80. var me = this;
  81. $.post(this.options.sRenderUrl, oParams, function(data) {
  82. // Do nothing...
  83. }, 'html' );
  84. },
  85. _saveSettings: function(bSaveAsDefaults)
  86. {
  87. var oParams = this.options.oRenderParameters;
  88. oParams.operation = 'datatable_save_settings';
  89. oParams.page_size = this.options.iPageSize;
  90. oParams.table_id = this.options.sTableId;
  91. oParams.defaults = bSaveAsDefaults;
  92. oParams.class_aliases = this.options.oClassAliases;
  93. oParams.columns = this.options.oColumns;
  94. var me = this;
  95. $.post(this.options.sRenderUrl, oParams, function(data) {
  96. // Do nothing...
  97. }, 'html' );
  98. },
  99. onDlgOk: function()
  100. {
  101. var oOptions = {};
  102. var sId = new String(this.element.attr('id'));
  103. var sListId = sId.replace('datatable_', '');
  104. oSettings = $('#datatable_dlg_'+sListId).find('input[name=settings]:checked');
  105. if (oSettings.val() == 'defaults')
  106. {
  107. oOptions = { iPageSize: this.options.oDefaultSettings.iDefaultPageSize,
  108. oColumns: this.options.oDefaultSettings.oColumns,
  109. };
  110. }
  111. else
  112. {
  113. var oDisplayColumns = {};
  114. var iColIdx = 0;
  115. var iSortIdx = 0;
  116. var sSortDirection = 'asc';
  117. var oColumns = $('#datatable_dlg_'+sListId).find(':itop-fieldsorter').fieldsorter('get_params');
  118. var iPageSize = parseInt($('#datatable_dlg_'+sListId+' input[name=page_size]').val(), 10);
  119. oOptions = {oColumns: oColumns, iPageSize: iPageSize };
  120. }
  121. this._setOptions(oOptions);
  122. // Check if we need to save the settings or not...
  123. var oSaveCheck = $('#datatable_dlg_'+sListId).find('input[name=save_settings]');
  124. var oSaveScope = $('#datatable_dlg_'+sListId).find('input[name=scope]:checked');
  125. if (oSaveCheck.attr('checked'))
  126. {
  127. if (oSettings.val() == 'defaults')
  128. {
  129. this._useDefaultSettings((oSaveScope.val() == 'defaults'));
  130. }
  131. else
  132. {
  133. this._saveSettings((oSaveScope.val() == 'defaults'));
  134. }
  135. }
  136. this._saveDlgState();
  137. },
  138. onDlgCancel: function()
  139. {
  140. this._restoreDlgState();
  141. },
  142. _onSpecificSettings: function()
  143. {
  144. var sId = new String(this.element.attr('id'));
  145. var sListId = sId.replace('datatable_', '');
  146. $('#datatable_dlg_'+sListId).find('input.specific_settings').attr('checked', 'checked');
  147. },
  148. _updateSaveScope: function()
  149. {
  150. var sId = new String(this.element.attr('id'));
  151. var sListId = sId.replace('datatable_', '');
  152. var oSaveCheck = $('#datatable_dlg_'+sListId).find('input[name=save_settings]');
  153. if (oSaveCheck.attr('checked'))
  154. {
  155. $('#datatable_dlg_'+sListId).find('input[name=scope]').removeAttr('disabled');
  156. }
  157. else
  158. {
  159. $('#datatable_dlg_'+sListId).find('input[name=scope]').attr('disabled', 'disabled');
  160. }
  161. },
  162. // events bound via _bind are removed automatically
  163. // revert other modifications here
  164. destroy: function()
  165. {
  166. this.element
  167. .removeClass('itop-datatable');
  168. var sId = new String(this.element.attr('id'));
  169. var sListId = sId.replace('datatable_', '');
  170. $('#sfl_'+sListId).remove();
  171. // call the original destroy method since we overwrote it
  172. $.Widget.prototype.destroy.call( this );
  173. },
  174. // _setOptions is called with a hash of all options that are changing
  175. _setOptions: function()
  176. {
  177. // in 1.9 would use _superApply
  178. $.Widget.prototype._setOptions.apply( this, arguments );
  179. this._refresh();
  180. },
  181. // _setOption is called for each individual option that is changing
  182. _setOption: function( key, value )
  183. {
  184. // in 1.9 would use _super
  185. $.Widget.prototype._setOption.call( this, key, value );
  186. },
  187. _saveDlgState: function()
  188. {
  189. this.originalState = {};
  190. for(k in this.aDlgStateParams)
  191. {
  192. this.originalState[this.aDlgStateParams[k]] = this.options[this.aDlgStateParams[k]];
  193. }
  194. var sId = new String(this.element.attr('id'));
  195. var sListId = sId.replace('datatable_', '');
  196. this.originalState.oFields = $('#datatable_dlg_'+sListId).find(':itop-fieldsorter').fieldsorter('get_params');
  197. },
  198. _restoreDlgState: function()
  199. {
  200. var sId = new String(this.element.attr('id'));
  201. var sListId = sId.replace('datatable_', '');
  202. var dlgElement = $('#datatable_dlg_'+sListId);
  203. for(k in this.aDlgStateParams)
  204. {
  205. this._setOption(this.aDlgStateParams[k], this.originalState[this.aDlgStateParams[k]]);
  206. }
  207. dlgElement.find('input[name=page_size]').val(this.originalState.iDefaultPageSize);
  208. dlgElement.find(':itop-fieldsorter').fieldsorter('option', { fields: this.originalState.oFields });
  209. }
  210. });
  211. });