PageRenderTime 44ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/ajax/libs/jquery.tablesorter/2.2/addons/pager/jquery.tablesorter.pager.js

https://gitlab.com/Mirros/cdnjs
JavaScript | 417 lines | 334 code | 38 blank | 45 comment | 62 complexity | 69dcb2a6b993a6670fd7d3d329d06ec8 MD5 | raw file
  1. /*!
  2. * tablesorter pager plugin
  3. * updated 5/3/2012
  4. */
  5. ;(function($) {
  6. $.extend({tablesorterPager: new function() {
  7. this.defaults = {
  8. // target the pager markup
  9. container: null,
  10. // use this format: "http:/mydatabase.com?page={page}&size={size}"
  11. // where {page} is replaced by the page number and {size} is replaced by the number of records to show
  12. ajaxUrl: null,
  13. // process ajax so that the following information is returned:
  14. // [ total_rows (number), rows (array of arrays), headers (array; optional) ]
  15. // example:
  16. // [
  17. // 100, // total rows
  18. // [
  19. // [ "row1cell1", "row1cell2", ... "row1cellN" ],
  20. // [ "row2cell1", "row2cell2", ... "row2cellN" ],
  21. // ...
  22. // [ "rowNcell1", "rowNcell2", ... "rowNcellN" ]
  23. // ],
  24. // [ "header1", "header2", ... "headerN" ] // optional
  25. // ]
  26. ajaxProcessing: function(ajax){ return [ 0, [], null ]; },
  27. // output default: '{page}/{totalPages}'
  28. output: '{startRow} to {endRow} of {totalRows} rows', // '{page}/{totalPages}'
  29. // apply disabled classname to the pager arrows when the rows at either extreme is visible
  30. updateArrows: true,
  31. // starting page of the pager (zero based index)
  32. page: 0,
  33. // Number of visible rows
  34. size: 10,
  35. // if true, the table will remain the same height no matter how many records are displayed. The space is made up by an empty
  36. // table row set to a height to compensate; default is false
  37. fixedHeight: false,
  38. // remove rows from the table to speed up the sort of large tables.
  39. // setting this to false, only hides the non-visible rows; needed if you plan to add/remove rows with the pager enabled.
  40. removeRows: true, // removing rows in larger tables speeds up the sort
  41. // css class names of pager arrows
  42. cssNext: '.next', // next page arrow
  43. cssPrev: '.prev', // previous page arrow
  44. cssFirst: '.first', // first page arrow
  45. cssLast: '.last', // last page arrow
  46. cssPageDisplay: '.pagedisplay', // location of where the "output" is displayed
  47. cssPageSize: '.pagesize', // page size selector - select dropdown that sets the "size" option
  48. // class added to arrows when at the extremes (i.e. prev/first arrows are "disabled" when on the first page)
  49. cssDisabled: 'disabled', // Note there is no period "." in front of this class name
  50. // stuff not set by the user
  51. totalRows: 0,
  52. totalPages: 0
  53. };
  54. var $this = this,
  55. // hide arrows at extremes
  56. pagerArrows = function(c, disable) {
  57. var a = 'addClass', r = 'removeClass',
  58. d = c.cssDisabled, dis = !!disable;
  59. if (c.updateArrows) {
  60. c.container[(c.totalRows < c.size) ? a : r](d);
  61. $(c.cssFirst + ',' + c.cssPrev, c.container)[(dis || c.page === 0) ? a : r](d);
  62. $(c.cssNext + ',' + c.cssLast, c.container)[(dis || c.page === c.totalPages - 1) ? a : r](d);
  63. }
  64. },
  65. updatePageDisplay = function(table, c) {
  66. if (c.totalPages > 0) {
  67. c.startRow = c.size * (c.page) + 1;
  68. c.endRow = Math.min(c.totalRows, c.size * (c.page+1));
  69. var out = $(c.cssPageDisplay, c.container),
  70. // form the output string
  71. s = c.output.replace(/\{(page|totalPages|startRow|endRow|totalRows)\}/gi, function(m){
  72. return {
  73. '{page}' : c.page + 1,
  74. '{totalPages}' : c.totalPages,
  75. '{startRow}' : c.startRow,
  76. '{endRow}' : c.endRow,
  77. '{totalRows}' : c.totalRows
  78. }[m];
  79. });
  80. if (out[0]) {
  81. out[ (out[0].tagName === 'INPUT') ? 'val' : 'html' ](s);
  82. }
  83. }
  84. pagerArrows(c);
  85. $(table).trigger('pagerComplete', c);
  86. },
  87. fixHeight = function(table, c) {
  88. var d, h, $b = $(table.tBodies[0]);
  89. if (c.fixedHeight) {
  90. $b.find('tr.pagerSavedHeightSpacer').remove();
  91. h = $.data(table, 'pagerSavedHeight');
  92. if (h) {
  93. d = h - $b.height();
  94. if (d > 5 && $.data(table, 'pagerLastSize') === c.size && $b.find('tr:visible').length < c.size) {
  95. $b.append('<tr class="pagerSavedHeightSpacer remove-me" style="height:' + d + 'px;"></tr>');
  96. }
  97. }
  98. }
  99. },
  100. changeHeight = function(table, c) {
  101. var $b = $(table.tBodies[0]);
  102. $b.find('tr.pagerSavedHeightSpacer').remove();
  103. $.data(table, 'pagerSavedHeight', $b.height());
  104. fixHeight(table, c);
  105. $.data(table, 'pagerLastSize', c.size);
  106. },
  107. hideRows = function(table, c){
  108. var i, rows = $('tr:not(.' + table.config.cssChildRow + ')', table.tBodies[0]),
  109. l = rows.length,
  110. s = (c.page * c.size),
  111. e = (s + c.size);
  112. if (e > l) { e = l; }
  113. for (i = 0; i < l; i++){
  114. rows[i].style.display = (i >= s && i < e) ? '' : 'none';
  115. }
  116. },
  117. hideRowsSetup = function(table, c){
  118. c.size = parseInt($(c.cssPageSize, c.container).val(), 10) || c.size;
  119. $.data(table, 'pagerLastSize', c.size);
  120. pagerArrows(c);
  121. if (!c.removeRows) {
  122. hideRows(table, c);
  123. $(table).bind('sortEnd.pager', function(){
  124. hideRows(table, c);
  125. });
  126. }
  127. },
  128. renderAjax = function(data, table, c, exception){
  129. // process data
  130. if (typeof(c.ajaxProcessing) === "function") {
  131. // ajaxProcessing result: [ total, rows, headers ]
  132. var i, j, k, hsh, $f, $sh, $t = $(table), $b = $(table.tBodies[0]),
  133. hl = $t.find('thead th').length, tds = '',
  134. err = '<tr class="remove-me"><td style="text-align: center;" colspan="' + hl + '">' +
  135. (exception ? exception.message + ' (' + exception.name + ')' : 'No rows found') + '</td></tr>',
  136. result = c.ajaxProcessing(data) || [ 0, [] ],
  137. d = result[1] || [], l = d.length, th = result[2];
  138. if (l > 0) {
  139. for ( i=0; i < l; i++ ) {
  140. tds += '<tr>';
  141. for (j=0; j < d[i].length; j++) {
  142. // build tbody cells
  143. tds += '<td>' + d[i][j] + '</td>';
  144. }
  145. tds += '</tr>';
  146. }
  147. }
  148. // only add new header text if the length matches
  149. if (th && th.length === hl) {
  150. hsh = $t.hasClass('hasStickyHeaders');
  151. $sh = $t.find('.' + ((c.widgetOptions && c.widgetOptions.stickyHeaders) || 'tablesorter-stickyheader'));
  152. $f = $t.find('tfoot tr:first').children();
  153. $t.find('thead tr.tablesorter-header th').each(function(j){
  154. var $t = $(this),
  155. // add new test within the first span it finds, or just in the header
  156. tar = ($t.find('span').length) ? $t.find('span:first') : $t;
  157. tar.html(th[j]);
  158. $f.eq(j).html(th[j]);
  159. // update sticky headers
  160. if (hsh && $sh.length){
  161. tar = $sh.find('th').eq(j);
  162. tar = (tar.find('span').length) ? tar.find('span:first') : tar;
  163. tar.html(th[j]);
  164. }
  165. });
  166. }
  167. if (exception) {
  168. // add error row to thead instead of tbody, or clicking on the header will result in a parser error
  169. $t.find('thead').append(err);
  170. } else {
  171. $b.html(tds); // add tbody
  172. }
  173. c.temp.remove(); // remove loading icon
  174. $t.trigger('update');
  175. c.totalRows = result[0] || 0;
  176. c.totalPages = Math.ceil(c.totalRows / c.size);
  177. updatePageDisplay(table, c);
  178. fixHeight(table, c);
  179. $t.trigger('pagerChange', c);
  180. }
  181. },
  182. getAjax = function(table, c){
  183. var $t = $(table),
  184. url = c.ajaxUrl.replace(/\{page\}/g, c.page).replace(/\{size\}/g, c.size);
  185. if (url !== '') {
  186. // loading icon
  187. c.temp = $('<div/>', {
  188. id : 'tablesorterPagerLoading',
  189. width : $t.outerWidth(true),
  190. height: $t.outerHeight(true)
  191. });
  192. $t.before(c.temp);
  193. $(document).ajaxError(function(e, xhr, settings, exception) {
  194. renderAjax(null, table, c, exception);
  195. });
  196. $.getJSON(url, function(data) {
  197. renderAjax(data, table, c);
  198. });
  199. }
  200. },
  201. renderTable = function(table, rows, c) {
  202. var i, j, o,
  203. f = document.createDocumentFragment(),
  204. l = rows.length,
  205. s = (c.page * c.size),
  206. e = (s + c.size);
  207. if (l < 1) { return; } // empty table, abort!
  208. $(table).trigger('pagerChange', c);
  209. if (!c.removeRows) {
  210. hideRows(table, c);
  211. } else {
  212. if (e > rows.length ) {
  213. e = rows.length;
  214. }
  215. $.tablesorter.clearTableBody(table);
  216. for (i = s; i < e; i++) {
  217. o = rows[i];
  218. l = o.length;
  219. for (j = 0; j < l; j++) {
  220. f.appendChild(o[j]);
  221. }
  222. }
  223. table.tBodies[0].appendChild(f);
  224. }
  225. if ( c.page >= c.totalPages ) {
  226. moveToLastPage(table, c);
  227. }
  228. updatePageDisplay(table, c);
  229. if (!c.isDisabled) { fixHeight(table, c); }
  230. },
  231. showAllRows = function(table, c){
  232. if (c.ajax) {
  233. pagerArrows(c, true);
  234. } else {
  235. c.isDisabled = true;
  236. $.data(table, 'pagerLastPage', c.page);
  237. $.data(table, 'pagerLastSize', c.size);
  238. c.page = 0;
  239. c.size = c.totalRows;
  240. c.totalPages = 1;
  241. $('tr.pagerSavedHeightSpacer', table.tBodies[0]).remove();
  242. renderTable(table, table.config.rowsCopy, c);
  243. }
  244. // disable size selector
  245. $(c.cssPageSize, c.container).addClass(c.cssDisabled)[0].disabled = true;
  246. },
  247. moveToPage = function(table, c) {
  248. if (c.isDisabled) { return; }
  249. if (c.page < 0 || c.page > (c.totalPages-1)) {
  250. c.page = 0;
  251. }
  252. $.data(table, 'pagerLastPage', c.page);
  253. if (c.ajax) {
  254. getAjax(table, c);
  255. } else {
  256. renderTable(table, table.config.rowsCopy, c);
  257. }
  258. },
  259. setPageSize = function(table, size, c) {
  260. c.size = size;
  261. $.data(table, 'pagerLastPage', c.page);
  262. $.data(table, 'pagerLastSize', c.size);
  263. c.totalPages = Math.ceil(c.totalRows / c.size);
  264. moveToPage(table, c);
  265. },
  266. moveToFirstPage = function(table, c) {
  267. c.page = 0;
  268. moveToPage(table, c);
  269. },
  270. moveToLastPage = function(table, c) {
  271. c.page = (c.totalPages-1);
  272. moveToPage(table, c);
  273. },
  274. moveToNextPage = function(table, c) {
  275. c.page++;
  276. if (c.page >= (c.totalPages-1)) {
  277. c.page = (c.totalPages-1);
  278. }
  279. moveToPage(table, c);
  280. },
  281. moveToPrevPage = function(table, c) {
  282. c.page--;
  283. if (c.page <= 0) {
  284. c.page = 0;
  285. }
  286. moveToPage(table, c);
  287. },
  288. destroyPager = function(table, c){
  289. showAllRows(table, c);
  290. c.container.hide(); // hide pager
  291. table.config.appender = null; // remove pager appender function
  292. $(table).unbind('destroy.pager sortEnd.pager enable.pager disable.pager');
  293. },
  294. enablePager = function(table, c, triggered){
  295. var p = $(c.cssPageSize, c.container).removeClass(c.cssDisabled).removeAttr('disabled');
  296. c.isDisabled = false;
  297. c.page = $.data(table, 'pagerLastPage') || c.page || 0;
  298. c.size = $.data(table, 'pagerLastSize') || parseInt(p.val(), 10) || c.size;
  299. c.totalPages = Math.ceil(c.totalRows / c.size);
  300. if (triggered) {
  301. $(table).trigger('update');
  302. setPageSize(table, c.size, c);
  303. hideRowsSetup(table, c);
  304. fixHeight(table, c);
  305. }
  306. };
  307. $this.appender = function(table, rows) {
  308. var c = table.config.pager;
  309. if (!c.ajax) {
  310. table.config.rowsCopy = rows;
  311. c.totalRows = rows.length;
  312. c.size = $.data(table, 'pagerLastSize') || c.size;
  313. c.totalPages = Math.ceil(c.totalRows / c.size);
  314. renderTable(table, rows, c);
  315. }
  316. };
  317. $this.construct = function(settings) {
  318. return this.each(function() {
  319. var config = this.config,
  320. c = config.pager = $.extend({}, $.tablesorterPager.defaults, settings),
  321. table = this,
  322. $t = $(table),
  323. pager = $(c.container).show(); // added in case the pager is reinitialized after being destroyed.
  324. config.appender = $this.appender;
  325. enablePager(table, c, false);
  326. if (typeof(c.ajaxUrl) === 'string') {
  327. // ajax pager; interact with database
  328. c.ajax = true;
  329. getAjax(table, c);
  330. } else {
  331. c.ajax = false;
  332. // Regular pager; all rows stored in memory
  333. $(this).trigger("appendCache");
  334. hideRowsSetup(table, c);
  335. }
  336. $(c.cssFirst,pager).unbind('click.pager').bind('click.pager', function() {
  337. if (!$(this).hasClass(c.cssDisabled)) { moveToFirstPage(table, c); }
  338. return false;
  339. });
  340. $(c.cssNext,pager).unbind('click.pager').bind('click.pager', function() {
  341. if (!$(this).hasClass(c.cssDisabled)) { moveToNextPage(table, c); }
  342. return false;
  343. });
  344. $(c.cssPrev,pager).unbind('click.pager').bind('click.pager', function() {
  345. if (!$(this).hasClass(c.cssDisabled)) { moveToPrevPage(table, c); }
  346. return false;
  347. });
  348. $(c.cssLast,pager).unbind('click.pager').bind('click.pager', function() {
  349. if (!$(this).hasClass(c.cssDisabled)) { moveToLastPage(table, c); }
  350. return false;
  351. });
  352. $(c.cssPageSize,pager).unbind('change.pager').bind('change.pager', function() {
  353. $(c.cssPageSize,pager).val( $(this).val() ); // in case there are more than one pagers
  354. if (!$(this).hasClass(c.cssDisabled)) {
  355. setPageSize(table, parseInt($(this).val(), 10), c);
  356. changeHeight(table, c);
  357. }
  358. return false;
  359. });
  360. $t
  361. .unbind('disable.pager enable.pager destroy.pager')
  362. .bind('disable.pager', function(){
  363. showAllRows(table, c);
  364. })
  365. .bind('enable.pager', function(){
  366. enablePager(table, c, true);
  367. })
  368. .bind('destroy.pager', function(){
  369. destroyPager(table, c);
  370. });
  371. });
  372. };
  373. }
  374. });
  375. // extend plugin scope
  376. $.fn.extend({
  377. tablesorterPager: $.tablesorterPager.construct
  378. });
  379. })(jQuery);