jquery-tablesorter 1.10.3 → 1.10.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{README.markdown → README.md} +4 -2
- data/lib/jquery-tablesorter/version.rb +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/addons/pager/jquery.tablesorter.pager.js +36 -18
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +82 -66
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets-filter-formatter.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +10 -3
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-iso8601.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-month.js +3 -3
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-two-digit-year.js +7 -7
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +4 -3
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columnSelector.js +11 -8
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-grouping.js +103 -36
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-headerTitles.js +32 -0
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +24 -11
- data/vendor/assets/stylesheets/jquery-tablesorter/theme.bootstrap.css +4 -4
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e9c4b55e83f583df24a50e72e50dd3193625600
|
4
|
+
data.tar.gz: 2242d68bf7499163fd6f4839b673655f703e9df8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53eba97a412635392168b9375f97cd76ec45cc0e1c056ad3a07a17bde3fda060724577b03b0b1e923944aa441a674dabc4c37f01c295050819d74a0fd90fb3bf
|
7
|
+
data.tar.gz: 702b8fb3e5342484899fa7938e68c4fd1c5be5d9f88c2bd40b8dae7ade36dcb90895c8c2955bd6a0693d501a7e9a50895f2aa3933a5296c54dc604cbb95a4ed5
|
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
Simple integration of jquery-tablesorter into the asset pipeline.
|
6
6
|
|
7
|
-
Current tablesorter version: 2.15.
|
7
|
+
Current tablesorter version: 2.15.6 (3/7/2014), [documentation]
|
8
8
|
|
9
9
|
Any issue associate with the js/css files, please report to [Mottie's fork].
|
10
10
|
|
@@ -25,6 +25,7 @@ Or install it yourself as:
|
|
25
25
|
## Requirements
|
26
26
|
|
27
27
|
Rails 3.1 and higher (tested up to 4.1)
|
28
|
+
|
28
29
|
Tested with ruby 1.9.3 - 2.1.0
|
29
30
|
|
30
31
|
## Usage
|
@@ -37,7 +38,7 @@ In your `application.js`
|
|
37
38
|
//= require jquery-tablesorter
|
38
39
|
```
|
39
40
|
|
40
|
-
This will require all jquery-tablesorter files (
|
41
|
+
This will require all jquery-tablesorter files (excluding addons, widgets, ...).
|
41
42
|
|
42
43
|
Or you can include single file with:
|
43
44
|
|
@@ -48,6 +49,7 @@ Or you can include single file with:
|
|
48
49
|
//= require jquery-tablesorter/addons/pager/jquery.tablesorter.pager
|
49
50
|
//= require jquery-tablesorter/widgets/widget-repeatheaders
|
50
51
|
//= require jquery-tablesorter/parsers/parser-metric
|
52
|
+
//= require jquery-tablesorter/extras/jquery.quicksearch
|
51
53
|
```
|
52
54
|
|
53
55
|
### Stylesheet files
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*!
|
2
2
|
* tablesorter pager plugin
|
3
|
-
* updated
|
3
|
+
* updated 3/7/2014 (v2.15.6)
|
4
4
|
*/
|
5
5
|
/*jshint browser:true, jquery:true, unused:false */
|
6
6
|
;(function($) {
|
@@ -124,7 +124,7 @@
|
|
124
124
|
}
|
125
125
|
},
|
126
126
|
|
127
|
-
updatePageDisplay = function(table, p,
|
127
|
+
updatePageDisplay = function(table, p, completed) {
|
128
128
|
var i, pg, s, out,
|
129
129
|
c = table.config,
|
130
130
|
f = c.$table.hasClass('hasFilters') && !p.ajaxUrl,
|
@@ -168,7 +168,7 @@
|
|
168
168
|
}
|
169
169
|
}
|
170
170
|
pagerArrows(p);
|
171
|
-
if (p.initialized &&
|
171
|
+
if (p.initialized && completed !== false) {
|
172
172
|
c.$table.trigger('pagerComplete', p);
|
173
173
|
// save pager info to storage
|
174
174
|
if (p.savePages && ts.storage) {
|
@@ -263,6 +263,7 @@
|
|
263
263
|
exception === 'abort' ? 'Ajax Request aborted' :
|
264
264
|
'Uncaught error: ' + xhr.statusText + ' [' + xhr.status + ']' );
|
265
265
|
c.$tbodies.eq(0).empty();
|
266
|
+
p.totalRows = 0;
|
266
267
|
} else {
|
267
268
|
// process ajax object
|
268
269
|
if (!$.isArray(result)) {
|
@@ -273,7 +274,7 @@
|
|
273
274
|
} else {
|
274
275
|
// allow [ total, rows, headers ] or [ rows, total, headers ]
|
275
276
|
t = isNaN(result[0]) && !isNaN(result[1]);
|
276
|
-
//ensure a zero returned row count doesn't fail the logical ||
|
277
|
+
// ensure a zero returned row count doesn't fail the logical ||
|
277
278
|
rr_count = result[t ? 1 : 0];
|
278
279
|
p.totalRows = isNaN(rr_count) ? p.totalRows || 0 : rr_count;
|
279
280
|
d = p.totalRows === 0 ? [""] : result[t ? 0 : 1] || []; // row data
|
@@ -331,7 +332,8 @@
|
|
331
332
|
}
|
332
333
|
// make sure last pager settings are saved, prevents multiple server side calls with
|
333
334
|
// the same parameters
|
334
|
-
p.
|
335
|
+
p.totalPages = Math.ceil( p.totalRows / ( p.size || 10 ) );
|
336
|
+
p.last.totalRows = p.totalRows;
|
335
337
|
p.last.currentFilters = p.currentFilters;
|
336
338
|
p.last.sortList = (c.sortList || []).join(',');
|
337
339
|
updatePageDisplay(table, p);
|
@@ -339,10 +341,12 @@
|
|
339
341
|
$t.trigger('updateCache', [function(){
|
340
342
|
if (p.initialized) {
|
341
343
|
// apply widgets after table has rendered
|
342
|
-
$t
|
343
|
-
|
344
|
+
$t
|
345
|
+
.trigger('applyWidgets')
|
346
|
+
.trigger('pagerChange', p);
|
344
347
|
}
|
345
348
|
}]);
|
349
|
+
|
346
350
|
}
|
347
351
|
if (!p.initialized) {
|
348
352
|
p.initialized = true;
|
@@ -429,6 +433,8 @@
|
|
429
433
|
|
430
434
|
renderTable = function(table, rows, p) {
|
431
435
|
var i, $tb,
|
436
|
+
$t = $(table),
|
437
|
+
c = table.config,
|
432
438
|
l = rows && rows.length || 0, // rows may be undefined
|
433
439
|
s = ( p.page * p.size ),
|
434
440
|
e = ( s + p.size );
|
@@ -438,7 +444,7 @@
|
|
438
444
|
moveToLastPage(table, p);
|
439
445
|
}
|
440
446
|
p.isDisabled = false; // needed because sorting will change the page and re-enable the pager
|
441
|
-
if (p.initialized) { $
|
447
|
+
if (p.initialized) { $t.trigger('pagerChange', p); }
|
442
448
|
|
443
449
|
if ( !p.removeRows ) {
|
444
450
|
hideRows(table, p);
|
@@ -447,7 +453,7 @@
|
|
447
453
|
e = rows.length;
|
448
454
|
}
|
449
455
|
ts.clearTableBody(table);
|
450
|
-
$tb = ts.processTbody(table,
|
456
|
+
$tb = ts.processTbody(table, c.$tbodies.eq(0), true);
|
451
457
|
for ( i = s; i < e; i++ ) {
|
452
458
|
$tb.append(rows[i]);
|
453
459
|
}
|
@@ -456,7 +462,10 @@
|
|
456
462
|
|
457
463
|
updatePageDisplay(table, p);
|
458
464
|
if ( !p.isDisabled ) { fixHeight(table, p); }
|
459
|
-
$
|
465
|
+
$t.trigger('applyWidgets');
|
466
|
+
if (table.isUpdating) {
|
467
|
+
$t.trigger("updateComplete", table);
|
468
|
+
}
|
460
469
|
},
|
461
470
|
|
462
471
|
showAllRows = function(table, p){
|
@@ -484,15 +493,20 @@
|
|
484
493
|
});
|
485
494
|
},
|
486
495
|
|
487
|
-
moveToPage = function(table, p,
|
496
|
+
moveToPage = function(table, p, pageMoved) {
|
488
497
|
if ( p.isDisabled ) { return; }
|
489
498
|
var c = table.config,
|
499
|
+
$t = $(table),
|
490
500
|
l = p.last,
|
491
501
|
pg = Math.min( p.totalPages, p.filteredPages );
|
492
502
|
if ( p.page < 0 ) { p.page = 0; }
|
493
503
|
if ( p.page > ( pg - 1 ) && pg !== 0 ) { p.page = pg - 1; }
|
494
|
-
//
|
495
|
-
if
|
504
|
+
// fixes issue where one currentFilter is [] and the other is ['','',''],
|
505
|
+
// making the next if comparison think the filters are different (joined by commas). Fixes #202.
|
506
|
+
l.currentFilters = (l.currentFilters || []).join('') === '' ? [] : l.currentFilters;
|
507
|
+
p.currentFilters = (p.currentFilters || []).join('') === '' ? [] : p.currentFilters;
|
508
|
+
// don't allow rendering multiple times on the same page/size/totalRows/filters/sorts
|
509
|
+
if ( l.page === p.page && l.size === p.size && l.totalRows === p.totalRows &&
|
496
510
|
(l.currentFilters || []).join(',') === (p.currentFilters || []).join(',') &&
|
497
511
|
l.sortList === (c.sortList || []).join(',') ) { return; }
|
498
512
|
if (c.debug) {
|
@@ -503,18 +517,22 @@
|
|
503
517
|
size : p.size,
|
504
518
|
// fixes #408; modify sortList otherwise it auto-updates
|
505
519
|
sortList : (c.sortList || []).join(','),
|
506
|
-
|
520
|
+
totalRows : p.totalRows,
|
507
521
|
currentFilters : p.currentFilters || []
|
508
522
|
};
|
509
523
|
if (p.ajax) {
|
510
524
|
getAjax(table, p);
|
511
525
|
} else if (!p.ajax) {
|
512
|
-
renderTable(table,
|
526
|
+
renderTable(table, c.rowsCopy, p);
|
513
527
|
}
|
514
528
|
$.data(table, 'pagerLastPage', p.page);
|
515
|
-
if (p.initialized &&
|
516
|
-
|
517
|
-
|
529
|
+
if (p.initialized && pageMoved !== false) {
|
530
|
+
$t
|
531
|
+
.trigger('pageMoved', p)
|
532
|
+
.trigger('applyWidgets');
|
533
|
+
if (table.isUpdating) {
|
534
|
+
$t.trigger('updateComplete');
|
535
|
+
}
|
518
536
|
}
|
519
537
|
},
|
520
538
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**!
|
2
|
-
* TableSorter 2.15.
|
2
|
+
* TableSorter 2.15.6 - Client-side table sorting with ease!
|
3
3
|
* @requires jQuery v1.2.6+
|
4
4
|
*
|
5
5
|
* Copyright (c) 2007 Christian Bach
|
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
var ts = this;
|
26
26
|
|
27
|
-
ts.version = "2.15.
|
27
|
+
ts.version = "2.15.6";
|
28
28
|
|
29
29
|
ts.parsers = [];
|
30
30
|
ts.widgets = [];
|
@@ -331,7 +331,8 @@
|
|
331
331
|
// empty table - fixes #206/#346
|
332
332
|
if (isEmptyObject(c2)) {
|
333
333
|
// run pager appender in case the table was just emptied
|
334
|
-
return c.appender ? c.appender(table, rows) :
|
334
|
+
return c.appender ? c.appender(table, rows) :
|
335
|
+
table.isUpdating ? c.$table.trigger("updateComplete", table) : ''; // Fixes #532
|
335
336
|
}
|
336
337
|
if (c.debug) {
|
337
338
|
appendTime = new Date();
|
@@ -368,9 +369,9 @@
|
|
368
369
|
}
|
369
370
|
// apply table widgets; but not before ajax completes
|
370
371
|
if (!init && !c.appender) { ts.applyWidget(table); }
|
371
|
-
|
372
|
-
|
373
|
-
|
372
|
+
if (table.isUpdating) {
|
373
|
+
c.$table.trigger("updateComplete", table);
|
374
|
+
}
|
374
375
|
}
|
375
376
|
|
376
377
|
// computeTableHeaderCellIndexes from:
|
@@ -582,92 +583,95 @@
|
|
582
583
|
return (parsers && parsers[i]) ? parsers[i].type || '' : '';
|
583
584
|
}
|
584
585
|
|
585
|
-
function initSort(table, cell,
|
586
|
-
var
|
586
|
+
function initSort(table, cell, event){
|
587
|
+
var arry, indx, col, order, s,
|
587
588
|
c = table.config,
|
588
|
-
|
589
|
-
$table =
|
589
|
+
key = !event[c.sortMultiSortKey],
|
590
|
+
$table = c.$table;
|
590
591
|
// Only call sortStart if sorting is enabled
|
591
592
|
$table.trigger("sortStart", table);
|
592
593
|
// get current column sort order
|
593
|
-
cell.count =
|
594
|
+
cell.count = event[c.sortResetKey] ? 2 : (cell.count + 1) % (c.sortReset ? 3 : 2);
|
594
595
|
// reset all sorts on non-current column - issue #30
|
595
596
|
if (c.sortRestart) {
|
596
|
-
|
597
|
+
indx = cell;
|
597
598
|
c.$headers.each(function() {
|
598
599
|
// only reset counts on columns that weren't just clicked on and if not included in a multisort
|
599
|
-
if (this !==
|
600
|
+
if (this !== indx && (key || !$(this).is('.' + ts.css.sortDesc + ',.' + ts.css.sortAsc))) {
|
600
601
|
this.count = -1;
|
601
602
|
}
|
602
603
|
});
|
603
604
|
}
|
604
605
|
// get current column index
|
605
|
-
|
606
|
+
indx = cell.column;
|
606
607
|
// user only wants to sort on one column
|
607
|
-
if (
|
608
|
+
if (key) {
|
608
609
|
// flush the sort list
|
609
610
|
c.sortList = [];
|
610
611
|
if (c.sortForce !== null) {
|
611
|
-
|
612
|
-
for (
|
613
|
-
if (
|
614
|
-
c.sortList.push(
|
612
|
+
arry = c.sortForce;
|
613
|
+
for (col = 0; col < arry.length; col++) {
|
614
|
+
if (arry[col][0] !== indx) {
|
615
|
+
c.sortList.push(arry[col]);
|
615
616
|
}
|
616
617
|
}
|
617
618
|
}
|
618
619
|
// add column to sort list
|
619
|
-
|
620
|
-
if (
|
621
|
-
c.sortList.push([
|
620
|
+
order = cell.order[cell.count];
|
621
|
+
if (order < 2) {
|
622
|
+
c.sortList.push([indx, order]);
|
622
623
|
// add other columns if header spans across multiple
|
623
624
|
if (cell.colSpan > 1) {
|
624
|
-
for (
|
625
|
-
c.sortList.push([
|
625
|
+
for (col = 1; col < cell.colSpan; col++) {
|
626
|
+
c.sortList.push([indx + col, order]);
|
626
627
|
}
|
627
628
|
}
|
628
629
|
}
|
629
630
|
// multi column sorting
|
630
631
|
} else {
|
631
|
-
// get rid of the sortAppend before adding more - fixes issue #115
|
632
|
+
// get rid of the sortAppend before adding more - fixes issue #115 & #523
|
632
633
|
if (c.sortAppend && c.sortList.length > 1) {
|
633
|
-
|
634
|
-
c.sortList
|
634
|
+
for (col = 0; col < c.sortAppend.length; col++) {
|
635
|
+
s = ts.isValueInArray(c.sortAppend[col][0], c.sortList);
|
636
|
+
if (s >= 0) {
|
637
|
+
c.sortList.splice(s,1);
|
638
|
+
}
|
635
639
|
}
|
636
640
|
}
|
637
641
|
// the user has clicked on an already sorted column
|
638
|
-
if (ts.isValueInArray(
|
642
|
+
if (ts.isValueInArray(indx, c.sortList) >= 0) {
|
639
643
|
// reverse the sorting direction
|
640
|
-
for (
|
641
|
-
s = c.sortList[
|
642
|
-
|
643
|
-
if (s[0] ===
|
644
|
-
//
|
645
|
-
s[1] =
|
644
|
+
for (col = 0; col < c.sortList.length; col++) {
|
645
|
+
s = c.sortList[col];
|
646
|
+
order = c.$headers[s[0]];
|
647
|
+
if (s[0] === indx) {
|
648
|
+
// order.count seems to be incorrect when compared to cell.count
|
649
|
+
s[1] = order.order[cell.count];
|
646
650
|
if (s[1] === 2) {
|
647
|
-
c.sortList.splice(
|
648
|
-
|
651
|
+
c.sortList.splice(col,1);
|
652
|
+
order.count = -1;
|
649
653
|
}
|
650
654
|
}
|
651
655
|
}
|
652
656
|
} else {
|
653
657
|
// add column to sort list array
|
654
|
-
|
655
|
-
if (
|
656
|
-
c.sortList.push([
|
658
|
+
order = cell.order[cell.count];
|
659
|
+
if (order < 2) {
|
660
|
+
c.sortList.push([indx, order]);
|
657
661
|
// add other columns if header spans across multiple
|
658
662
|
if (cell.colSpan > 1) {
|
659
|
-
for (
|
660
|
-
c.sortList.push([
|
663
|
+
for (col = 1; col < cell.colSpan; col++) {
|
664
|
+
c.sortList.push([indx + col, order]);
|
661
665
|
}
|
662
666
|
}
|
663
667
|
}
|
664
668
|
}
|
665
669
|
}
|
666
670
|
if (c.sortAppend !== null) {
|
667
|
-
|
668
|
-
for (
|
669
|
-
if (
|
670
|
-
c.sortList.push(
|
671
|
+
arry = c.sortAppend;
|
672
|
+
for (col = 0; col < arry.length; col++) {
|
673
|
+
if (arry[col][0] !== indx) {
|
674
|
+
c.sortList.push(arry[col]);
|
671
675
|
}
|
672
676
|
}
|
673
677
|
}
|
@@ -679,6 +683,7 @@
|
|
679
683
|
setHeadersCss(table);
|
680
684
|
multisort(table);
|
681
685
|
appendToTable(table);
|
686
|
+
$table.trigger("sortEnd", table);
|
682
687
|
}, 1);
|
683
688
|
}
|
684
689
|
|
@@ -751,8 +756,8 @@
|
|
751
756
|
}
|
752
757
|
|
753
758
|
function resortComplete($table, callback){
|
754
|
-
var
|
755
|
-
if (
|
759
|
+
var table = $table[0];
|
760
|
+
if (table.isUpdating) {
|
756
761
|
$table.trigger('updateComplete');
|
757
762
|
}
|
758
763
|
if (typeof callback === "function") {
|
@@ -761,12 +766,13 @@
|
|
761
766
|
}
|
762
767
|
|
763
768
|
function checkResort($table, flag, callback) {
|
769
|
+
var sl = $table[0].config.sortList;
|
764
770
|
// don't try to resort if the table is still processing
|
765
771
|
// this will catch spamming of the updateCell method
|
766
|
-
if (flag !== false && !$table[0].isProcessing) {
|
767
|
-
$table.trigger("sorton", [
|
772
|
+
if (flag !== false && !$table[0].isProcessing && sl.length) {
|
773
|
+
$table.trigger("sorton", [sl, function(){
|
768
774
|
resortComplete($table, callback);
|
769
|
-
}]);
|
775
|
+
}, true]);
|
770
776
|
} else {
|
771
777
|
resortComplete($table, callback);
|
772
778
|
}
|
@@ -777,7 +783,7 @@
|
|
777
783
|
$table = c.$table;
|
778
784
|
// apply easy methods that trigger bound events
|
779
785
|
$table
|
780
|
-
.unbind('sortReset update updateRows updateCell updateAll addRows sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave '.split(' ').join('.tablesorter '))
|
786
|
+
.unbind('sortReset update updateRows updateCell updateAll addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave '.split(' ').join('.tablesorter '))
|
781
787
|
.bind("sortReset.tablesorter", function(e){
|
782
788
|
e.stopPropagation();
|
783
789
|
c.sortList = [];
|
@@ -787,6 +793,7 @@
|
|
787
793
|
})
|
788
794
|
.bind("updateAll.tablesorter", function(e, resort, callback){
|
789
795
|
e.stopPropagation();
|
796
|
+
table.isUpdating = true;
|
790
797
|
ts.refreshWidgets(table, true, true);
|
791
798
|
ts.restoreHeaders(table);
|
792
799
|
buildHeaders(table);
|
@@ -796,12 +803,14 @@
|
|
796
803
|
})
|
797
804
|
.bind("update.tablesorter updateRows.tablesorter", function(e, resort, callback) {
|
798
805
|
e.stopPropagation();
|
806
|
+
table.isUpdating = true;
|
799
807
|
// update sorting (if enabled/disabled)
|
800
808
|
updateHeader(table);
|
801
809
|
commonUpdate(table, resort, callback);
|
802
810
|
})
|
803
811
|
.bind("updateCell.tablesorter", function(e, cell, resort, callback) {
|
804
812
|
e.stopPropagation();
|
813
|
+
table.isUpdating = true;
|
805
814
|
$table.find(c.selectorRemove).remove();
|
806
815
|
// get position from the dom
|
807
816
|
var l, row, icell,
|
@@ -823,6 +832,7 @@
|
|
823
832
|
})
|
824
833
|
.bind("addRows.tablesorter", function(e, $row, resort, callback) {
|
825
834
|
e.stopPropagation();
|
835
|
+
table.isUpdating = true;
|
826
836
|
if (isEmptyObject(c.cache)) {
|
827
837
|
// empty table, do an update instead - fixes #450
|
828
838
|
updateHeader(table);
|
@@ -853,6 +863,9 @@
|
|
853
863
|
checkResort($table, resort, callback);
|
854
864
|
}
|
855
865
|
})
|
866
|
+
.bind("updateComplete.tablesorter", function(){
|
867
|
+
table.isUpdating = false;
|
868
|
+
})
|
856
869
|
.bind("sorton.tablesorter", function(e, list, callback, init) {
|
857
870
|
var c = table.config;
|
858
871
|
e.stopPropagation();
|
@@ -867,6 +880,7 @@
|
|
867
880
|
// sort the table and append it to the dom
|
868
881
|
multisort(table);
|
869
882
|
appendToTable(table, init);
|
883
|
+
$table.trigger("sortEnd", this);
|
870
884
|
if (typeof callback === "function") {
|
871
885
|
callback(table);
|
872
886
|
}
|
@@ -991,7 +1005,7 @@
|
|
991
1005
|
ts.applyWidget(table, true);
|
992
1006
|
// if user has supplied a sort list to constructor
|
993
1007
|
if (c.sortList.length > 0) {
|
994
|
-
$table.trigger("sorton", [c.sortList, {}, !c.initWidgets]);
|
1008
|
+
$table.trigger("sorton", [c.sortList, {}, !c.initWidgets, true]);
|
995
1009
|
} else {
|
996
1010
|
setHeadersCss(table);
|
997
1011
|
if (c.initWidgets) {
|
@@ -1032,7 +1046,7 @@
|
|
1032
1046
|
// get headers from the sortList
|
1033
1047
|
$h = $h.filter(function(){
|
1034
1048
|
// get data-column from attr to keep compatibility with jQuery 1.2.6
|
1035
|
-
return this.sortDisabled ? false : ts.isValueInArray( parseFloat($(this).attr('data-column')), c.sortList);
|
1049
|
+
return this.sortDisabled ? false : ts.isValueInArray( parseFloat($(this).attr('data-column')), c.sortList) >= 0;
|
1036
1050
|
});
|
1037
1051
|
}
|
1038
1052
|
$h.addClass(ts.css.processing + ' ' + c.cssProcessing);
|
@@ -1132,7 +1146,7 @@
|
|
1132
1146
|
// disable tablesorter
|
1133
1147
|
$t
|
1134
1148
|
.removeData('tablesorter')
|
1135
|
-
.unbind('sortReset update updateAll updateRows updateCell addRows sorton appendCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave keypress sortBegin sortEnd '.split(' ').join('.tablesorter '));
|
1149
|
+
.unbind('sortReset update updateAll updateRows updateCell addRows updateComplete sorton appendCache updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave keypress sortBegin sortEnd '.split(' ').join('.tablesorter '));
|
1136
1150
|
c.$headers.add($f)
|
1137
1151
|
.removeClass( [ts.css.header, c.cssHeader, c.cssAsc, c.cssDesc, ts.css.sortAsc, ts.css.sortDesc, ts.css.sortNone].join(' ') )
|
1138
1152
|
.removeAttr('data-column');
|
@@ -1152,6 +1166,8 @@
|
|
1152
1166
|
// regex used in natural sort
|
1153
1167
|
ts.regex = {
|
1154
1168
|
chunk : /(^([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi, // chunk/tokenize numbers & letters
|
1169
|
+
schunk: /^\\0/, // start chunk
|
1170
|
+
echunk: /\\0$/, // end chunk
|
1155
1171
|
hex: /^0x[0-9a-f]+$/i // hex
|
1156
1172
|
};
|
1157
1173
|
|
@@ -1168,8 +1184,8 @@
|
|
1168
1184
|
if ( xD > yD ) { return 1; }
|
1169
1185
|
}
|
1170
1186
|
// chunk/tokenize
|
1171
|
-
xN = a.replace(r.chunk, '\\0$1\\0').replace(
|
1172
|
-
yN = b.replace(r.chunk, '\\0$1\\0').replace(
|
1187
|
+
xN = a.replace(r.chunk, '\\0$1\\0').replace(r.echunk, '').replace(r.schunk, '').split('\\0');
|
1188
|
+
yN = b.replace(r.chunk, '\\0$1\\0').replace(r.echunk, '').replace(r.schunk, '').split('\\0');
|
1173
1189
|
mx = Math.max(xN.length, yN.length);
|
1174
1190
|
// natural sorting through split numeric strings and default strings
|
1175
1191
|
for (i = 0; i < mx; i++) {
|
@@ -1291,14 +1307,14 @@
|
|
1291
1307
|
};
|
1292
1308
|
|
1293
1309
|
// *** utilities ***
|
1294
|
-
ts.isValueInArray = function(
|
1295
|
-
var
|
1296
|
-
for (
|
1297
|
-
if (
|
1298
|
-
return
|
1310
|
+
ts.isValueInArray = function(column, arry) {
|
1311
|
+
var indx, len = arry.length;
|
1312
|
+
for (indx = 0; indx < len; indx++) {
|
1313
|
+
if (arry[indx][0] === column) {
|
1314
|
+
return indx;
|
1299
1315
|
}
|
1300
1316
|
}
|
1301
|
-
return
|
1317
|
+
return -1;
|
1302
1318
|
};
|
1303
1319
|
|
1304
1320
|
ts.addParser = function(parser) {
|
@@ -1544,7 +1560,7 @@
|
|
1544
1560
|
return (/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/).test(s);
|
1545
1561
|
},
|
1546
1562
|
format: function(s, table) {
|
1547
|
-
return s ? ts.formatFloat((s !== "") ? (new Date(s.replace(/-/g, "/")).getTime() ||
|
1563
|
+
return s ? ts.formatFloat((s !== "") ? (new Date(s.replace(/-/g, "/")).getTime() || s) : "", table) : s;
|
1548
1564
|
},
|
1549
1565
|
type: "numeric"
|
1550
1566
|
});
|
@@ -1568,7 +1584,7 @@
|
|
1568
1584
|
return (/^[A-Z]{3,10}\.?\s+\d{1,2},?\s+(\d{4})(\s+\d{1,2}:\d{2}(:\d{2})?(\s+[AP]M)?)?$/i).test(s) || (/^\d{1,2}\s+[A-Z]{3,10}\s+\d{4}/i).test(s);
|
1569
1585
|
},
|
1570
1586
|
format: function(s, table) {
|
1571
|
-
return s ? ts.formatFloat( (new Date(s.replace(/(\S)([AP]M)$/i, "$1 $2")).getTime() ||
|
1587
|
+
return s ? ts.formatFloat( (new Date(s.replace(/(\S)([AP]M)$/i, "$1 $2")).getTime() || s), table) : s;
|
1572
1588
|
},
|
1573
1589
|
type: "numeric"
|
1574
1590
|
});
|
@@ -1593,7 +1609,7 @@
|
|
1593
1609
|
s = s.replace(/(\d{4})[\/\s](\d{1,2})[\/\s](\d{1,2})/, "$1/$2/$3");
|
1594
1610
|
}
|
1595
1611
|
}
|
1596
|
-
return s ? ts.formatFloat( (new Date(s).getTime() ||
|
1612
|
+
return s ? ts.formatFloat( (new Date(s).getTime() || s), table) : s;
|
1597
1613
|
},
|
1598
1614
|
type: "numeric"
|
1599
1615
|
});
|
@@ -1604,7 +1620,7 @@
|
|
1604
1620
|
return (/^(([0-2]?\d:[0-5]\d)|([0-1]?\d:[0-5]\d\s?([AP]M)))$/i).test(s);
|
1605
1621
|
},
|
1606
1622
|
format: function(s, table) {
|
1607
|
-
return s ? ts.formatFloat( (new Date("2000/01/01 " + s.replace(/(\S)([AP]M)$/i, "$1 $2")).getTime() ||
|
1623
|
+
return s ? ts.formatFloat( (new Date("2000/01/01 " + s.replace(/(\S)([AP]M)$/i, "$1 $2")).getTime() || s), table) : s;
|
1608
1624
|
},
|
1609
1625
|
type: "numeric"
|
1610
1626
|
});
|
data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets-filter-formatter.js
CHANGED
@@ -487,7 +487,7 @@ tsff = ts.filterFormatter = {
|
|
487
487
|
endOfDay : true,
|
488
488
|
// include ANY jQuery UI spinner options below
|
489
489
|
|
490
|
-
defaultDate : '',
|
490
|
+
defaultDate : '',
|
491
491
|
|
492
492
|
changeMonth : true,
|
493
493
|
changeYear : true,
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/*! tableSorter 2.8+ widgets - updated
|
1
|
+
/*! tableSorter 2.8+ widgets - updated 3/7/2014 (v2.15.6)
|
2
2
|
*
|
3
3
|
* Column Styles
|
4
4
|
* Column Filters
|
@@ -654,15 +654,21 @@ ts.filter = {
|
|
654
654
|
c.$table.trigger('filterInit');
|
655
655
|
},
|
656
656
|
setDefaults: function(table, c, wo) {
|
657
|
-
var isArray, saved,
|
657
|
+
var isArray, saved, indx,
|
658
658
|
// get current (default) filters
|
659
|
-
filters = ts.getFilters(table);
|
659
|
+
filters = ts.getFilters(table) || [];
|
660
660
|
if (wo.filter_saveFilters && ts.storage) {
|
661
661
|
saved = ts.storage( table, 'tablesorter-filters' ) || [];
|
662
662
|
isArray = $.isArray(saved);
|
663
663
|
// make sure we're not just getting an empty array
|
664
664
|
if ( !(isArray && saved.join('') === '' || !isArray) ) { filters = saved; }
|
665
665
|
}
|
666
|
+
// if no filters saved, then check default settings
|
667
|
+
if (filters.join('') === '') {
|
668
|
+
for (indx = 0; indx < c.columns; indx++) {
|
669
|
+
filters[indx] = c.$headers.filter('[data-column="' + indx + '"]:last').attr(wo.filter_defaultAttrib) || filters[indx];
|
670
|
+
}
|
671
|
+
}
|
666
672
|
c.$table.data('lastSearch', filters);
|
667
673
|
return filters;
|
668
674
|
},
|
@@ -1010,6 +1016,7 @@ ts.filter = {
|
|
1010
1016
|
c.$table.trigger('filterEnd');
|
1011
1017
|
},
|
1012
1018
|
buildSelect: function(table, column, updating, onlyavail) {
|
1019
|
+
if (!table.config.cache || $.isEmptyObject(table.config.cache)) { return; }
|
1013
1020
|
column = parseInt(column, 10);
|
1014
1021
|
var indx, rowIndex, tbodyIndex, len, currentValue, txt, $filters,
|
1015
1022
|
c = table.config,
|
@@ -18,10 +18,10 @@
|
|
18
18
|
return false;
|
19
19
|
},
|
20
20
|
format: function(s, table) {
|
21
|
-
var j = -1, c = table.config
|
22
|
-
|
21
|
+
var j = -1, c = table.config,
|
22
|
+
n = c.ignoreCase ? s.toLocaleLowerCase() : s;
|
23
23
|
$.each(ts.dates[ 'month' + (c.ignoreCase ? 'Lower' : 'Cased') ], function(i,v){
|
24
|
-
if (j < 0 &&
|
24
|
+
if (j < 0 && n.match(v)) { j = i; }
|
25
25
|
});
|
26
26
|
// return s (original string) if there isn't a match
|
27
27
|
// (non-weekdays will sort separately and empty cells will sort as expected)
|
@@ -18,12 +18,12 @@
|
|
18
18
|
});
|
19
19
|
|
20
20
|
ts.formatDate = function(s, regex, format, table){
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
21
|
+
var n = s
|
22
|
+
// replace separators
|
23
|
+
.replace(/\s+/g," ").replace(/[-.,]/g, "/")
|
24
|
+
// reformat xx/xx/xx to mm/dd/19yy;
|
25
|
+
.replace(regex, format),
|
26
|
+
d = new Date(n),
|
27
27
|
y = d.getFullYear(),
|
28
28
|
rng = table && table.config.dateRange || range,
|
29
29
|
now = new Date().getFullYear();
|
@@ -32,7 +32,7 @@
|
|
32
32
|
while (now - y > rng) {
|
33
33
|
y += 100;
|
34
34
|
}
|
35
|
-
return d.setFullYear(y);
|
35
|
+
return d.setFullYear(y) || s;
|
36
36
|
};
|
37
37
|
|
38
38
|
$.tablesorter.addParser({
|
@@ -36,14 +36,15 @@
|
|
36
36
|
return false;
|
37
37
|
},
|
38
38
|
format: function(s, table, cell, cellIndex) {
|
39
|
-
var $c = $(cell)
|
40
|
-
|
39
|
+
var $c = $(cell),
|
40
|
+
$input = $c.find('input[type="checkbox"]'),
|
41
|
+
isChecked = $input.length ? $input[0].checked : '';
|
41
42
|
// adding class to row, indicating that a checkbox is checked; includes
|
42
43
|
// a column index in case more than one checkbox happens to be in a row
|
43
44
|
$c.closest('tr').toggleClass('checked-' + cellIndex, isChecked);
|
44
45
|
// returning plain language here because this is what is shown in the
|
45
46
|
// group headers - change it as desired
|
46
|
-
return $
|
47
|
+
return $input.length ? isChecked ? 'checked' : 'unchecked' : s;
|
47
48
|
},
|
48
49
|
parsed : true, // filter widget flag
|
49
50
|
type: "text"
|
@@ -62,18 +62,21 @@ tsColSel = ts.columnSelector = {
|
|
62
62
|
var $this = $(this),
|
63
63
|
// if no data-priority is assigned, default to 1, but don't remove it from the selector list
|
64
64
|
priority = $this.attr(wo.columnSelector_priority) || 1,
|
65
|
-
colId = $this.attr('data-column')
|
65
|
+
colId = $this.attr('data-column'),
|
66
|
+
state = ts.getData(this, c.headers[colId], 'columnSelector');
|
67
|
+
|
66
68
|
|
67
69
|
// if this column not hidable at all
|
68
70
|
// include getData check (includes "columnSelector-false" class, data attribute, etc)
|
69
|
-
if ( isNaN(priority) && priority.length > 0 ||
|
71
|
+
if ( isNaN(priority) && priority.length > 0 || state === 'disable' ||
|
70
72
|
( wo.columnSelector_columns[colId] && wo.columnSelector_columns[colId] === 'disable') ) {
|
71
73
|
return true; // goto next
|
72
74
|
}
|
73
75
|
|
74
|
-
// set default state
|
76
|
+
// set default state; storage takes priority
|
75
77
|
colSel.states[colId] = saved && typeof(saved[colId]) !== 'undefined' ?
|
76
|
-
saved[colId] : typeof(wo.columnSelector_columns[colId]) !== 'undefined' ?
|
78
|
+
saved[colId] : typeof(wo.columnSelector_columns[colId]) !== 'undefined' ?
|
79
|
+
wo.columnSelector_columns[colId] : state === 'true' || !(state === 'false');
|
77
80
|
colSel.$column[colId] = $(this);
|
78
81
|
|
79
82
|
// set default col title
|
@@ -135,8 +138,8 @@ tsColSel = ts.columnSelector = {
|
|
135
138
|
c.selector.$popup.find('.tablesorter-column-selector')
|
136
139
|
.html( colSel.$container.html() )
|
137
140
|
.find('input').each(function(){
|
138
|
-
var indx = $(this).attr('data-column')
|
139
|
-
$(this).prop( 'checked', indx === 'auto' ? wo.columnSelector_mediaqueryState : colSel.states[indx] )
|
141
|
+
var indx = $(this).attr('data-column');
|
142
|
+
$(this).prop( 'checked', indx === 'auto' ? wo.columnSelector_mediaqueryState : colSel.states[indx] );
|
140
143
|
});
|
141
144
|
}
|
142
145
|
}).change();
|
@@ -210,8 +213,8 @@ tsColSel = ts.columnSelector = {
|
|
210
213
|
},
|
211
214
|
|
212
215
|
attachTo : function(table, elm) {
|
216
|
+
table = $(table)[0];
|
213
217
|
var colSel, wo, indx,
|
214
|
-
table = $(table)[0],
|
215
218
|
c = table.config,
|
216
219
|
$popup = $(elm);
|
217
220
|
if ($popup.length && c) {
|
@@ -225,7 +228,7 @@ tsColSel = ts.columnSelector = {
|
|
225
228
|
.html( colSel.$container.html() )
|
226
229
|
.find('input').each(function(){
|
227
230
|
var indx = $(this).attr('data-column');
|
228
|
-
$(this).prop( 'checked', indx === 'auto' ? wo.columnSelector_mediaqueryState : colSel.states[indx] )
|
231
|
+
$(this).prop( 'checked', indx === 'auto' ? wo.columnSelector_mediaqueryState : colSel.states[indx] );
|
229
232
|
});
|
230
233
|
colSel.$popup = $popup.on('change', 'input', function(){
|
231
234
|
// data input
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/*! tablesorter Grouping widget - updated
|
1
|
+
/*! tablesorter Grouping widget - updated 3/7/2014 (core v2.15.6)
|
2
2
|
* Requires tablesorter v2.8+ and jQuery 1.7+
|
3
3
|
* by Rob Garrison
|
4
4
|
*/
|
@@ -53,9 +53,10 @@ ts.grouping = {
|
|
53
53
|
|
54
54
|
update : function(table, c, wo){
|
55
55
|
if ($.isEmptyObject(c.cache)) { return; }
|
56
|
-
var rowIndex, tbodyIndex, currentGroup, $rows, groupClass, grouping, time, cache,
|
56
|
+
var rowIndex, tbodyIndex, currentGroup, $rows, groupClass, grouping, time, cache, saveName, direction,
|
57
57
|
lang = wo.grouping_language,
|
58
58
|
group = '',
|
59
|
+
savedGroup = false,
|
59
60
|
column = c.sortList[0] ? c.sortList[0][0] : -1;
|
60
61
|
c.$table
|
61
62
|
.find('tr.group-hidden').removeClass('group-hidden').end()
|
@@ -66,19 +67,33 @@ ts.grouping = {
|
|
66
67
|
}
|
67
68
|
if (column >= 0 && !c.$headers.filter('[data-column="' + column + '"]:last').hasClass('group-false')) {
|
68
69
|
if (c.debug){ time = new Date(); }
|
70
|
+
wo.group_currentGroup = ''; // save current groups
|
71
|
+
wo.group_currentGroups = {};
|
72
|
+
|
73
|
+
// group class finds "group-{word/separator/letter/number/date/false}-{optional:#/year/month/day/week/time}"
|
74
|
+
groupClass = (c.$headers.filter('[data-column="' + column + '"]:last').attr('class') || '').match(/(group-\w+(-\w+)?)/g);
|
75
|
+
// grouping = [ 'group', '{word/separator/letter/number/date/false}', '{#/year/month/day/week/time}' ]
|
76
|
+
grouping = groupClass ? groupClass[0].split('-') : ['group','letter',1]; // default to letter 1
|
77
|
+
|
78
|
+
// save current grouping
|
79
|
+
if (wo.group_collapsible && wo.group_saveGroups && ts.storage) {
|
80
|
+
wo.group_currentGroups = ts.storage( table, 'tablesorter-groups' ) || {};
|
81
|
+
// include direction when grouping numbers > 1 (reversed direction shows different range values)
|
82
|
+
direction = (grouping[1] === 'number' && grouping[2] > 1) ? 'dir' + c.sortList[0][1] : '';
|
83
|
+
// combine column, sort direction & grouping as save key
|
84
|
+
saveName = wo.group_currentGroup = '' + column + direction + grouping.join('');
|
85
|
+
if (!wo.group_currentGroups[saveName]) {
|
86
|
+
wo.group_currentGroups[saveName] = [];
|
87
|
+
} else {
|
88
|
+
savedGroup = true;
|
89
|
+
}
|
90
|
+
}
|
69
91
|
for (tbodyIndex = 0; tbodyIndex < c.$tbodies.length; tbodyIndex++) {
|
70
92
|
cache = c.cache[tbodyIndex].normalized;
|
71
93
|
group = ''; // clear grouping across tbodies
|
72
94
|
$rows = c.$tbodies.eq(tbodyIndex).children('tr').not('.' + c.cssChildRow);
|
73
|
-
if (wo.group_collapsed && wo.group_collapsible) {
|
74
|
-
$rows.addClass('group-hidden');
|
75
|
-
}
|
76
95
|
for (rowIndex = 0; rowIndex < $rows.length; rowIndex++) {
|
77
96
|
if ( $rows.eq(rowIndex).is(':visible') ) {
|
78
|
-
// group class finds "group-{word/separator/letter/number/date/false}-{optional:#/year/month/day/week/time}"
|
79
|
-
groupClass = (c.$headers.filter('[data-column="' + column + '"]:last').attr('class') || '').match(/(group-\w+(-\w+)?)/g);
|
80
|
-
// grouping = [ 'group', '{word/separator/letter/number/date/false}', '{#/year/month/day/week/time}' ]
|
81
|
-
grouping = groupClass ? groupClass[0].split('-') : ['','letter',1]; // default to letter 1
|
82
97
|
// fixes #438
|
83
98
|
if (ts.grouping.types[grouping[1]]) {
|
84
99
|
currentGroup = cache[rowIndex] ?
|
@@ -95,22 +110,29 @@ ts.grouping = {
|
|
95
110
|
currentGroup = wo.group_formatter((currentGroup || '').toString(), column, table, c, wo) || currentGroup;
|
96
111
|
}
|
97
112
|
$rows.eq(rowIndex).before('<tr class="group-header ' + c.selectorRemove.slice(1) +
|
98
|
-
(wo.group_collapsed && wo.group_collapsible ? ' collapsed' : '') +
|
113
|
+
// (wo.group_collapsed && wo.group_collapsible ? ' collapsed' : '') +
|
114
|
+
'" unselectable="on"><td colspan="' +
|
99
115
|
c.columns + '">' + (wo.group_collapsible ? '<i/>' : '') + '<span class="group-name">' +
|
100
116
|
currentGroup + '</span><span class="group-count"></span></td></tr>');
|
117
|
+
if (wo.group_saveGroups && !savedGroup && wo.group_collapsed && wo.group_collapsible) {
|
118
|
+
// all groups start collapsed
|
119
|
+
wo.group_currentGroups[wo.group_currentGroup].push(currentGroup);
|
120
|
+
}
|
101
121
|
}
|
102
122
|
}
|
103
123
|
}
|
104
124
|
}
|
105
125
|
}
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
126
|
+
c.$table.find('tr.group-header')
|
127
|
+
.bind('selectstart', false)
|
128
|
+
.each(function(){
|
129
|
+
var isHidden, $label,
|
130
|
+
$row = $(this),
|
131
|
+
name = $row.find('.group-name').text().toLowerCase(),
|
132
|
+
$rows = $row.nextUntil('tr.group-header').filter(':visible');
|
133
|
+
if (wo.group_count || $.isFunction(wo.group_callback)) {
|
134
|
+
$label = $row.find('.group-count');
|
112
135
|
if ($label.length) {
|
113
|
-
$rows = $row.nextUntil('tr.group-header').filter(':visible');
|
114
136
|
if (wo.group_count) {
|
115
137
|
$label.html( wo.group_count.replace(/\{num\}/g, $rows.length) );
|
116
138
|
}
|
@@ -118,13 +140,71 @@ ts.grouping = {
|
|
118
140
|
wo.group_callback($row.find('td'), $rows, column, table);
|
119
141
|
}
|
120
142
|
}
|
121
|
-
}
|
122
|
-
|
143
|
+
}
|
144
|
+
if (wo.group_saveGroups && wo.group_currentGroups[wo.group_currentGroup].length) {
|
145
|
+
isHidden = $.inArray( name, wo.group_currentGroups[wo.group_currentGroup] ) > -1;
|
146
|
+
$row.toggleClass('collapsed', isHidden);
|
147
|
+
$rows.toggleClass('group-hidden', isHidden);
|
148
|
+
} else if (wo.group_collapsed && wo.group_collapsible) {
|
149
|
+
$row.addClass('collapsed');
|
150
|
+
$rows.addClass('group-hidden');
|
151
|
+
}
|
152
|
+
});
|
123
153
|
c.$table.trigger(wo.group_complete);
|
124
154
|
if (c.debug) {
|
125
155
|
$.tablesorter.benchmark("Applying groups widget: ", time);
|
126
156
|
}
|
127
157
|
}
|
158
|
+
},
|
159
|
+
|
160
|
+
bindEvents : function(table, c, wo){
|
161
|
+
if (wo.group_collapsible) {
|
162
|
+
wo.group_currentGroups = [];
|
163
|
+
// .on() requires jQuery 1.7+
|
164
|
+
c.$table.on('click toggleGroup', 'tr.group-header', function(event){
|
165
|
+
event.stopPropagation();
|
166
|
+
var isCollapsed, $groups, indx,
|
167
|
+
$this = $(this),
|
168
|
+
name = $this.find('.group-name').text();
|
169
|
+
// use shift-click to toggle ALL groups
|
170
|
+
if (event.type === 'click' && event.shiftKey) {
|
171
|
+
$this.siblings('.group-header').trigger('toggleGroup');
|
172
|
+
}
|
173
|
+
$this.toggleClass('collapsed');
|
174
|
+
// nextUntil requires jQuery 1.4+
|
175
|
+
$this.nextUntil('tr.group-header').toggleClass('group-hidden', $this.hasClass('collapsed') );
|
176
|
+
// save collapsed groups
|
177
|
+
if (wo.group_saveGroups && ts.storage) {
|
178
|
+
$groups = c.$table.find('.group-header');
|
179
|
+
isCollapsed = $this.hasClass('collapsed');
|
180
|
+
if (!wo.group_currentGroups[wo.group_currentGroup]) {
|
181
|
+
wo.group_currentGroups[wo.group_currentGroup] = [];
|
182
|
+
}
|
183
|
+
if (isCollapsed && wo.group_currentGroup) {
|
184
|
+
wo.group_currentGroups[wo.group_currentGroup].push( name );
|
185
|
+
} else if (wo.group_currentGroup) {
|
186
|
+
indx = $.inArray( name, wo.group_currentGroups[wo.group_currentGroup] );
|
187
|
+
if (indx > -1) {
|
188
|
+
wo.group_currentGroups[wo.group_currentGroup].splice( indx, 1 );
|
189
|
+
}
|
190
|
+
}
|
191
|
+
ts.storage( table, 'tablesorter-groups', wo.group_currentGroups );
|
192
|
+
}
|
193
|
+
});
|
194
|
+
}
|
195
|
+
$(wo.group_saveReset).on('click', function(){
|
196
|
+
ts.grouping.clearSavedGroups(table);
|
197
|
+
});
|
198
|
+
c.$table.on('pagerChange.tsgrouping', function(){
|
199
|
+
ts.grouping.update(table, c, wo);
|
200
|
+
});
|
201
|
+
},
|
202
|
+
|
203
|
+
clearSavedGroups: function(table){
|
204
|
+
if (table && ts.storage) {
|
205
|
+
ts.storage(table, 'tablesorter-groups', '');
|
206
|
+
ts.grouping.update(table, table.config, table.config.widgetOptions);
|
207
|
+
}
|
128
208
|
}
|
129
209
|
|
130
210
|
};
|
@@ -135,6 +215,8 @@ ts.addWidget({
|
|
135
215
|
options: {
|
136
216
|
group_collapsible : true, // make the group header clickable and collapse the rows below it.
|
137
217
|
group_collapsed : false, // start with all groups collapsed
|
218
|
+
group_saveGroups : true, // remember collapsed groups
|
219
|
+
group_saveReset : null, // element to clear saved collapsed groups
|
138
220
|
group_count : ' ({num})', // if not false, the "{num}" string is replaced with the number of rows in the group
|
139
221
|
group_separator : '-', // group name separator; used when group-separator-# class is used.
|
140
222
|
group_formatter : null, // function(txt, column, table, c, wo) { return txt; }
|
@@ -151,23 +233,7 @@ ts.addWidget({
|
|
151
233
|
group_dateString : function(date) { return date.toLocaleString(); }
|
152
234
|
},
|
153
235
|
init: function(table, thisWidget, c, wo){
|
154
|
-
|
155
|
-
// .on() requires jQuery 1.7+
|
156
|
-
c.$table.on('click toggleGroup', 'tr.group-header', function(event){
|
157
|
-
event.stopPropagation();
|
158
|
-
var $this = $(this);
|
159
|
-
// use shift-click to toggle ALL groups
|
160
|
-
if (event.type === 'click' && event.shiftKey) {
|
161
|
-
$this.siblings('.group-header').trigger('toggleGroup');
|
162
|
-
}
|
163
|
-
$this.toggleClass('collapsed');
|
164
|
-
// nextUntil requires jQuery 1.4+
|
165
|
-
$this.nextUntil('tr.group-header').toggleClass('group-hidden', $this.hasClass('collapsed') );
|
166
|
-
});
|
167
|
-
}
|
168
|
-
c.$table.on('pagerChange', function(){
|
169
|
-
ts.grouping.update(table, c, wo);
|
170
|
-
});
|
236
|
+
ts.grouping.bindEvents(table, c, wo);
|
171
237
|
},
|
172
238
|
format: function(table, c, wo) {
|
173
239
|
ts.grouping.update(table, c, wo);
|
@@ -175,6 +241,7 @@ ts.addWidget({
|
|
175
241
|
remove : function(table, c, wo){
|
176
242
|
c.$table
|
177
243
|
.off('click', 'tr.group-header')
|
244
|
+
.off('pagerChange.tsgrouping')
|
178
245
|
.find('.group-hidden').removeClass('group-hidden').end()
|
179
246
|
.find('tr.group-header').remove();
|
180
247
|
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
/*! tablesorter headerTitles widget - updated 3/5/2014 (core v2.15.6)
|
2
|
+
* Requires tablesorter v2.8+ and jQuery 1.7+
|
3
|
+
* by Rob Garrison
|
4
|
+
*/
|
5
|
+
/*jshint browser:true, jquery:true, unused:false */
|
6
|
+
/*global jQuery: false */
|
7
|
+
;(function($){
|
8
|
+
"use strict";
|
9
|
+
|
10
|
+
$.tablesorter.addWidget({
|
11
|
+
id: 'headerTitles',
|
12
|
+
options: {
|
13
|
+
headerTitle_prefix : 'Sort: ',
|
14
|
+
headerTitle_text : [ 'A - Z', 'Z - A' ],
|
15
|
+
headerTitle_numeric : [ '0 - 9', '9 - 0' ]
|
16
|
+
},
|
17
|
+
format: function (table, c, wo) {
|
18
|
+
var txt;
|
19
|
+
// clear out all titles
|
20
|
+
c.$headers.attr('title', '');
|
21
|
+
// only add titles to sorted columns
|
22
|
+
$.each(c.sortList, function(indx, group) {
|
23
|
+
txt = wo.headerTitle_prefix + wo['headerTitle_' + (c.parsers[ group[0] ].type || 'text')][ group[1] ];
|
24
|
+
c.$headers.filter('[data-column="' + group[0] + '"]').attr('title', txt);
|
25
|
+
});
|
26
|
+
},
|
27
|
+
remove: function (table, c) {
|
28
|
+
c.$headers.attr('title', '');
|
29
|
+
}
|
30
|
+
});
|
31
|
+
|
32
|
+
})(jQuery);
|
@@ -1,4 +1,4 @@
|
|
1
|
-
/* Pager widget (beta) for TableSorter
|
1
|
+
/* Pager widget (beta) for TableSorter 3/7/2014 (v2.15.6) */
|
2
2
|
/*jshint browser:true, jquery:true, unused:false */
|
3
3
|
;(function($){
|
4
4
|
"use strict";
|
@@ -150,7 +150,6 @@ tsp = ts.pager = {
|
|
150
150
|
// page size selector
|
151
151
|
p.$size = p.$container.find(s.pageSize);
|
152
152
|
p.totalRows = c.$tbodies.eq(0).children().length;
|
153
|
-
|
154
153
|
p.oldAjaxSuccess = p.oldAjaxSuccess || wo.pager_ajaxObject.success;
|
155
154
|
c.appender = tsp.appender;
|
156
155
|
if (ts.filter && $.inArray('filter', c.widgets) >= 0) {
|
@@ -315,7 +314,7 @@ tsp = ts.pager = {
|
|
315
314
|
}
|
316
315
|
},
|
317
316
|
|
318
|
-
updatePageDisplay: function(table, c,
|
317
|
+
updatePageDisplay: function(table, c, completed) {
|
319
318
|
var i, pg, s, out,
|
320
319
|
wo = c.widgetOptions,
|
321
320
|
p = c.pager,
|
@@ -361,7 +360,7 @@ tsp = ts.pager = {
|
|
361
360
|
}
|
362
361
|
}
|
363
362
|
tsp.pagerArrows(c);
|
364
|
-
if (p.initialized &&
|
363
|
+
if (p.initialized && completed !== false) {
|
365
364
|
c.$table.trigger('pagerComplete', c);
|
366
365
|
// save pager info to storage
|
367
366
|
if (wo.pager_savePages && ts.storage) {
|
@@ -453,6 +452,7 @@ tsp = ts.pager = {
|
|
453
452
|
}
|
454
453
|
ts.showError(table, exception.message + ' (' + xhr.status + ')');
|
455
454
|
c.$tbodies.eq(0).empty();
|
455
|
+
p.totalRows = 0;
|
456
456
|
} else {
|
457
457
|
// process ajax object
|
458
458
|
if (!$.isArray(result)) {
|
@@ -463,7 +463,7 @@ tsp = ts.pager = {
|
|
463
463
|
} else {
|
464
464
|
// allow [ total, rows, headers ] or [ rows, total, headers ]
|
465
465
|
t = isNaN(result[0]) && !isNaN(result[1]);
|
466
|
-
//ensure a zero returned row count doesn't fail the logical ||
|
466
|
+
// ensure a zero returned row count doesn't fail the logical ||
|
467
467
|
rr_count = result[t ? 1 : 0];
|
468
468
|
p.totalRows = isNaN(rr_count) ? p.totalRows || 0 : rr_count;
|
469
469
|
d = p.totalRows === 0 ? [""] : result[t ? 0 : 1] || []; // row data
|
@@ -521,7 +521,8 @@ tsp = ts.pager = {
|
|
521
521
|
}
|
522
522
|
// make sure last pager settings are saved, prevents multiple server side calls with
|
523
523
|
// the same parameters
|
524
|
-
p.
|
524
|
+
p.totalPages = Math.ceil( p.totalRows / ( p.size || 10 ) );
|
525
|
+
p.last.totalRows = p.totalRows;
|
525
526
|
p.last.currentFilters = p.currentFilters;
|
526
527
|
p.last.sortList = (c.sortList || []).join(',');
|
527
528
|
tsp.updatePageDisplay(table, c);
|
@@ -650,6 +651,9 @@ tsp = ts.pager = {
|
|
650
651
|
wo.pager_startPage = p.page;
|
651
652
|
wo.pager_size = p.size;
|
652
653
|
c.$table.trigger('applyWidgets');
|
654
|
+
if (table.isUpdating) {
|
655
|
+
c.$table.trigger('updateComplete');
|
656
|
+
}
|
653
657
|
|
654
658
|
},
|
655
659
|
|
@@ -680,15 +684,19 @@ tsp = ts.pager = {
|
|
680
684
|
});
|
681
685
|
},
|
682
686
|
|
683
|
-
moveToPage: function(table, p,
|
687
|
+
moveToPage: function(table, p, pageMoved) {
|
684
688
|
if ( p.isDisabled ) { return; }
|
685
689
|
var c = table.config,
|
686
690
|
l = p.last,
|
687
691
|
pg = Math.min( p.totalPages, p.filteredPages );
|
688
692
|
if ( p.page < 0 ) { p.page = 0; }
|
689
693
|
if ( p.page > ( pg - 1 ) && pg !== 0 ) { p.page = pg - 1; }
|
690
|
-
//
|
691
|
-
|
694
|
+
// fixes issue where one current filter is [] and the other is ['','',''],
|
695
|
+
// making the next if comparison think the filters as different. Fixes #202.
|
696
|
+
l.currentFilters = (l.currentFilters || []).join('') === '' ? [] : l.currentFilters;
|
697
|
+
p.currentFilters = (p.currentFilters || []).join('') === '' ? [] : p.currentFilters;
|
698
|
+
// don't allow rendering multiple times on the same page/size/totalRows/filters/sorts
|
699
|
+
if ( l.page === p.page && l.size === p.size && l.totalRows === p.totalRows &&
|
692
700
|
(l.currentFilters || []).join(',') === (p.currentFilters || []).join(',') &&
|
693
701
|
l.sortList === (c.sortList || []).join(',') ) {
|
694
702
|
return;
|
@@ -701,7 +709,7 @@ tsp = ts.pager = {
|
|
701
709
|
size : p.size,
|
702
710
|
// fixes #408; modify sortList otherwise it auto-updates
|
703
711
|
sortList : (c.sortList || []).join(','),
|
704
|
-
|
712
|
+
totalRows : p.totalRows,
|
705
713
|
currentFilters : p.currentFilters || []
|
706
714
|
};
|
707
715
|
if (p.ajax) {
|
@@ -710,8 +718,11 @@ tsp = ts.pager = {
|
|
710
718
|
tsp.renderTable(table, c.rowsCopy);
|
711
719
|
}
|
712
720
|
$.data(table, 'pagerLastPage', p.page);
|
713
|
-
if (p.initialized &&
|
721
|
+
if (p.initialized && pageMoved !== false) {
|
714
722
|
c.$table.trigger('pageMoved', c);
|
723
|
+
if (!p.ajax && table.isUpdating) {
|
724
|
+
c.$table.trigger('updateComplete');
|
725
|
+
}
|
715
726
|
}
|
716
727
|
},
|
717
728
|
|
@@ -800,6 +811,8 @@ tsp = ts.pager = {
|
|
800
811
|
tsp.moveToPage(table, p, true);
|
801
812
|
// update display here in case all rows are removed
|
802
813
|
tsp.updatePageDisplay(table, c, false);
|
814
|
+
} else {
|
815
|
+
tsp.moveToPage(table, p, true);
|
803
816
|
}
|
804
817
|
}
|
805
818
|
|
@@ -41,14 +41,14 @@
|
|
41
41
|
}
|
42
42
|
|
43
43
|
/* since bootstrap (table-striped) uses nth-child(), we just use this to add a zebra stripe color */
|
44
|
-
.tablesorter-bootstrap tr.odd td {
|
44
|
+
.tablesorter-bootstrap > tbody > tr.odd > td {
|
45
45
|
background-color: #f9f9f9;
|
46
46
|
}
|
47
|
-
.tablesorter-bootstrap tbody > .odd:hover > td,
|
48
|
-
.tablesorter-bootstrap tbody > .even:hover > td {
|
47
|
+
.tablesorter-bootstrap > tbody > tr.odd:hover > td,
|
48
|
+
.tablesorter-bootstrap > tbody > tr.even:hover > td {
|
49
49
|
background-color: #f5f5f5;
|
50
50
|
}
|
51
|
-
.tablesorter-bootstrap tr.even td {
|
51
|
+
.tablesorter-bootstrap > tbody > tr.even > td {
|
52
52
|
background-color: #fff;
|
53
53
|
}
|
54
54
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jquery-tablesorter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.10.
|
4
|
+
version: 1.10.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jun Lin
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-03-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: railties
|
@@ -39,7 +39,7 @@ extensions: []
|
|
39
39
|
extra_rdoc_files: []
|
40
40
|
files:
|
41
41
|
- MIT-LICENSE
|
42
|
-
- README.
|
42
|
+
- README.md
|
43
43
|
- Rakefile
|
44
44
|
- lib/jquery-tablesorter.rb
|
45
45
|
- lib/jquery-tablesorter/engine.rb
|
@@ -99,6 +99,7 @@ files:
|
|
99
99
|
- vendor/assets/javascripts/jquery-tablesorter/widgets/widget-cssStickyHeaders.js
|
100
100
|
- vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js
|
101
101
|
- vendor/assets/javascripts/jquery-tablesorter/widgets/widget-grouping.js
|
102
|
+
- vendor/assets/javascripts/jquery-tablesorter/widgets/widget-headerTitles.js
|
102
103
|
- vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js
|
103
104
|
- vendor/assets/javascripts/jquery-tablesorter/widgets/widget-repeatheaders.js
|
104
105
|
- vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js
|
@@ -135,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
136
|
version: '0'
|
136
137
|
requirements: []
|
137
138
|
rubyforge_project:
|
138
|
-
rubygems_version: 2.2.
|
139
|
+
rubygems_version: 2.2.2
|
139
140
|
signing_key:
|
140
141
|
specification_version: 4
|
141
142
|
summary: Simple integration of jquery-tablesorter into the asset pipeline.
|