jquery.tablesorter.pager.js 13 KB

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