jquery.tablesorter.pager.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. function sprintf(format, etc) {
  2. var arg = arguments;
  3. var i = 1;
  4. return format.replace(/%((%)|s)/g, function (m) { return m[2] || arg[i++] })
  5. }
  6. (function($) {
  7. $.extend({
  8. tablesorterPager: new function() {
  9. function updatePageDisplay(c) {
  10. var s = $(c.cssPageDisplay,c.container).val((c.page+1) + c.seperator + c.totalPages);
  11. }
  12. function setPageSize(table,size, bReload) {
  13. var c = table.config;
  14. c.selectedSize = size;
  15. if (size == -1)
  16. {
  17. size = c.totalRows;
  18. }
  19. c.size = size;
  20. c.totalPages = Math.ceil(c.totalRows / c.size);
  21. c.pagerPositionSet = false;
  22. if (bReload)
  23. {
  24. moveToPage(table);
  25. }
  26. fixPosition(table);
  27. }
  28. function fixPosition(table) {
  29. var c = table.config;
  30. if(!c.pagerPositionSet && c.positionFixed) {
  31. var c = table.config, o = $(table);
  32. if(o.offset) {
  33. c.container.css({
  34. top: o.offset().top + o.height() + 'px',
  35. position: 'absolute'
  36. });
  37. }
  38. c.pagerPositionSet = true;
  39. }
  40. }
  41. function moveToFirstPage(table) {
  42. var c = table.config;
  43. c.page = 0;
  44. moveToPage(table);
  45. }
  46. function moveToLastPage(table) {
  47. var c = table.config;
  48. c.page = (c.totalPages-1);
  49. moveToPage(table);
  50. }
  51. function moveToNextPage(table) {
  52. var c = table.config;
  53. c.page++;
  54. if(c.page >= (c.totalPages-1)) {
  55. c.page = (c.totalPages-1);
  56. }
  57. moveToPage(table);
  58. }
  59. function moveToPrevPage(table) {
  60. var c = table.config;
  61. c.page--;
  62. if(c.page <= 0) {
  63. c.page = 0;
  64. }
  65. moveToPage(table);
  66. }
  67. function moveToPage(table) {
  68. var c = table.config;
  69. if(c.page < 0 || c.page > (c.totalPages-1)) {
  70. c.page = 0;
  71. }
  72. renderTable(table,c.rowsCopy);
  73. }
  74. function checkAll(table, pager, value)
  75. {
  76. // Mark all the displayed items as check or unchecked depending on the value
  77. $(table).find(':checkbox[name^=selectObj]').attr('checked', value);
  78. // Set the 'selectionMode' for the future objects to load
  79. if (value)
  80. {
  81. table.config.selectionMode = 'negative';
  82. }
  83. else
  84. {
  85. table.config.selectionMode = 'positive';
  86. }
  87. $(pager).find(':input[name=selectionMode]').val(table.config.selectionMode);
  88. // Reset the list of saved selection...
  89. resetStoredSelection(pager);
  90. updateCounter(table, pager);
  91. return true;
  92. }
  93. function resetStoredSelection(pager)
  94. {
  95. $(':input[name^=storedSelection]', pager).remove();
  96. }
  97. function storeSelection(table, pager, id, value)
  98. {
  99. var valueToStore = value;
  100. if (table.config.selectionMode == 'negative')
  101. {
  102. valueToStore = !(valueToStore);
  103. }
  104. if (valueToStore)
  105. {
  106. if (table.config.select_mode == 'single')
  107. {
  108. $(':input[name^=storedSelection]', pager).remove(); // Remove any previous selection
  109. }
  110. if ($('#'+id, pager).length ==0)
  111. {
  112. $(pager).append($('<input type="hidden" id="'+id+'" name="storedSelection[]" value="'+id+'"></input>'));
  113. }
  114. }
  115. else
  116. {
  117. if ($('#'+id, pager).length !=0)
  118. {
  119. $('#'+id, pager).remove();
  120. }
  121. }
  122. updateCounter(table, pager);
  123. }
  124. function loadSelection(table, pager)
  125. {
  126. table.config.selectionMode = $(pager).find(':input[name=selectionMode]').val();
  127. updateCounter(table, pager);
  128. }
  129. function updateCounter(table, pager)
  130. {
  131. var ex = $(':input[name^=storedSelection]', pager).length;
  132. var s = ex;
  133. if (table.config.selectionMode == 'negative')
  134. {
  135. s = table.config.totalRows - ex;
  136. }
  137. pager.parent().closest('table').find('.selectedCount').text(s);
  138. if (table.config.cssCount != '')
  139. {
  140. $(table.config.cssCount).val(s);
  141. $(table.config.cssCount).trigger('change');
  142. }
  143. }
  144. function getData(table, start, end)
  145. {
  146. if (table.ajax_request)
  147. {
  148. table.ajax_request.abort();
  149. table.ajax_request = null;
  150. }
  151. var c = table.config;
  152. var s = c.sortList[0];
  153. var s_col = null;
  154. var s_order = null;
  155. if (s != undefined)
  156. {
  157. s_col = s[0];
  158. s_order = (s[1] == 0) ? 'asc' : 'desc';
  159. }
  160. $('#loading', table.config.container).html('<img src="../images/indicator.gif" />');
  161. table.ajax_request = $.post(AddAppContext(GetAbsoluteUrlAppRoot()+"pages/ajax.render.php"),
  162. { operation: 'pagination',
  163. filter: c.filter,
  164. extra_param: c.extra_params,
  165. start: start,
  166. end: end,
  167. sort_col: s_col,
  168. sort_order: s_order,
  169. select_mode: c.select_mode,
  170. display_key: c.displayKey,
  171. columns: c.columns,
  172. class_aliases: c.class_aliases
  173. },
  174. function(data)
  175. {
  176. table.ajax_request = null; // Ajax request completed
  177. oData = $(data);
  178. var tableBody = $(table.tBodies[0]);
  179. // clear the table body
  180. $.tablesorter.clearTableBody(table);
  181. for(var i = 0; i < end-start; i++) {
  182. //tableBody.append(rows[i]);
  183. //var o = rows[i];
  184. var r = $(oData[i]);
  185. var l = r.length;
  186. for(var j=0; j < l; j++) {
  187. //tableBody[0].appendChild(r);
  188. tableBody[0].appendChild(r[j]);
  189. }
  190. }
  191. fixPosition(table,tableBody);
  192. applySelection(table);
  193. $(table).trigger("applyWidgets");
  194. if( c.page >= c.totalPages ) {
  195. moveToLastPage(table);
  196. }
  197. updatePageDisplay(c);
  198. updateCounter(table, table.config.container);
  199. renderPager(table, table.config.container);
  200. $(table).tableHover();
  201. $('#loading', table.config.container).empty();
  202. saveParams(table.config);
  203. });
  204. }
  205. function applySelection(table)
  206. {
  207. var c = table.config;
  208. if (c.selectionMode == 'negative')
  209. {
  210. $(table).find(':checkbox[name^=selectObj]').attr('checked', true);
  211. }
  212. if (table.config.select_mode == 'multiple')
  213. {
  214. $(table).find(':checkbox[name^=selectObj]').each(function() {
  215. var id = parseInt(this.value, 10);
  216. if ($('#'+id, table.config.container).length > 0)
  217. {
  218. if (c.selectionMode == 'positive')
  219. {
  220. $(this).attr('checked', true);
  221. }
  222. else
  223. {
  224. $(this).attr('checked', false);
  225. }
  226. }
  227. });
  228. $(table).find(':checkbox[name^=selectObj]').change(function() {
  229. storeSelection(table, table.config.container, this.value, this.checked);
  230. });
  231. }
  232. else if (table.config.select_mode == 'single')
  233. {
  234. $(table).find('input[name^=selectObject]:radio').each(function() {
  235. var id = parseInt(this.value, 10);
  236. if ($('#'+id, table.config.container).length > 0)
  237. {
  238. if (c.selectionMode == 'positive')
  239. {
  240. $(this).attr('checked', true);
  241. }
  242. else
  243. {
  244. $(this).attr('checked', false);
  245. }
  246. }
  247. });
  248. $(table).find('input[name^=selectObject]:radio').change(function() {
  249. storeSelection(table, table.config.container, this.value, this.checked);
  250. });
  251. }
  252. }
  253. function renderPager(table, pager)
  254. {
  255. var c = table.config;
  256. var aPages = [0]; // first page
  257. var s = c.page - 1;
  258. var nb = Math.ceil(c.totalRows / c.size);
  259. if (s < 1)
  260. {
  261. s = 1;
  262. }
  263. var e = s +3;
  264. if (e >= nb)
  265. {
  266. e = nb;
  267. if ((e - 4) > 1)
  268. {
  269. s = e - 4;
  270. }
  271. }
  272. for(var i=s; i<e; i++)
  273. {
  274. aPages.push(i);
  275. }
  276. if ((nb > 1) && (nb > i))
  277. {
  278. aPages.push(nb - 1); // very last page
  279. }
  280. txt = '';
  281. for(i=0; i<aPages.length; i++)
  282. {
  283. var page = 1+aPages[i];
  284. var link = '';
  285. var sDotsAfter = '';
  286. var sDotsBefore = '';
  287. if ((i == 0) && (aPages.length > 1) && (aPages[i+1] != aPages[i]+1))
  288. {
  289. sDotsAfter = '...'; // Gap between the last 2 page numbers
  290. }
  291. if ((i == aPages.length-1) && (aPages.length > 1) && (aPages[i-1] != aPages[i]-1))
  292. {
  293. sDotsBefore = '...'; // Gap between the first 2 page numbers
  294. }
  295. if (aPages[i] != c.page)
  296. {
  297. link = ' <span page="'+aPages[i]+'" id="gotopage_'+aPages[i]+'">'+sDotsBefore+page+sDotsAfter+'</span> ';
  298. }
  299. else
  300. {
  301. link = ' <span class="curr_page" page="'+aPages[i]+'">'+sDotsBefore+page+sDotsAfter+'</span> ';
  302. }
  303. txt += link;
  304. }
  305. txt += '';
  306. $('#total', pager).text(c.totalRows);
  307. $('#index', pager).html(txt);
  308. for(i=0; i<aPages.length; i++)
  309. {
  310. $('#gotopage_'+aPages[i], pager).click(function(){
  311. var idx = $(this).attr('page');
  312. table.config.page = idx;
  313. moveToPage(table);
  314. });
  315. }
  316. }
  317. function renderTable(table) {
  318. var c = table.config;
  319. //var l = rows.length;
  320. var s = (c.page * c.size);
  321. var e = (s + c.size);
  322. if(e > c.totalRows ) {
  323. e = c.totalRows;
  324. }
  325. getData(table, s, e);
  326. }
  327. this.appender = function(table,rows) {
  328. var c = table.config;
  329. if (c.totalRows == 0)
  330. {
  331. c.totalRows = rows.length;
  332. }
  333. c.totalPages = Math.ceil(c.totalRows / c.size);
  334. renderTable(table,rows);
  335. };
  336. function saveParams(config) {
  337. var sPagerId = config.container.attr('id');
  338. var params = { size: config.selectedSize, page: config.page, sortList: config.sortList };
  339. if (window.pager_params == undefined)
  340. {
  341. window.pager_params = {};
  342. }
  343. window.pager_params[sPagerId] = params;
  344. };
  345. function restoreParams(table) {
  346. var sPagerId = config.container.attr('id');
  347. if (window.pager_params != undefined)
  348. {
  349. params = window.pager_params[sPagerId];
  350. if (params != undefined)
  351. {
  352. $(table.config.cssPageSize, table.config.container).val(params.size);
  353. setPageSize(table, params.size, false); // false => don't trigger a reload
  354. if (table.config.sortList != params.sortList)
  355. {
  356. $(table).trigger("sorton", [params.sortList]); // triggers a reload anyway
  357. }
  358. }
  359. }
  360. };
  361. this.defaults = {
  362. size: 10,
  363. offset: 0,
  364. page: 0,
  365. totalRows: 0,
  366. totalPages: 0,
  367. container: null,
  368. cssNext: '.next',
  369. cssPrev: '.prev',
  370. cssFirst: '.first',
  371. cssLast: '.last',
  372. cssPageDisplay: '.pagedisplay',
  373. cssPageSize: '.pagesize',
  374. cssCount: '',
  375. seperator: "/",
  376. positionFixed: false,
  377. appender: this.appender,
  378. filter: '',
  379. extra_params: '',
  380. select_mode: '',
  381. totalSelected: 0,
  382. selectionMode: 'positive',
  383. displayKey: true,
  384. columns: {},
  385. class_aliases: {}
  386. };
  387. this.construct = function(settings) {
  388. return this.each(function() {
  389. config = $.extend(this.config, $.tablesorterPager.defaults, settings);
  390. var table = this, pager = config.container;
  391. this.ajax_request = null;
  392. config.selectedSize = parseInt($(".pagesize",pager).val());
  393. setPageSize(table,config.selectedSize, false);
  394. restoreParams(table, config);
  395. //$(this).trigger("appendCache"); // Load the data
  396. //console.log($.tablesorterPager);
  397. applySelection(table);
  398. $('.gotopage',pager).click(function() {
  399. var idx = $(this).attr('page');
  400. table.config.page = idx;
  401. moveToPage(table);
  402. });
  403. $(config.cssFirst,pager).click(function() {
  404. moveToFirstPage(table);
  405. return false;
  406. });
  407. $(config.cssNext,pager).click(function() {
  408. moveToNextPage(table);
  409. return false;
  410. });
  411. $(config.cssPrev,pager).click(function() {
  412. moveToPrevPage(table);
  413. return false;
  414. });
  415. $(config.cssLast,pager).click(function() {
  416. moveToLastPage(table);
  417. return false;
  418. });
  419. $(config.cssPageSize,pager).change(function() {
  420. setPageSize(table,parseInt($(this).val()), true);
  421. return false;
  422. });
  423. $(table).find(':checkbox.checkAll').removeAttr('onclick').click(function() {
  424. return checkAll(table, pager, this.checked);
  425. });
  426. $(table).bind('load_selection', function() {
  427. loadSelection(table, pager);
  428. applySelection(table);
  429. });
  430. $(table).bind('check_all', function() {
  431. checkAll(table, pager, true);
  432. });
  433. });
  434. };
  435. }
  436. });
  437. // extend plugin scope
  438. $.fn.extend({
  439. tablesorterPager: $.tablesorterPager.construct
  440. });
  441. })(jQuery);