jquery-tablesorter 1.14.0 → 1.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/jquery-tablesorter/version.rb +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/addons/pager/jquery.tablesorter.pager.js +6 -6
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +143 -133
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +20 -15
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-chart.js +3 -3
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-cssStickyHeaders.js +6 -6
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js +5 -5
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-formatter.js +8 -6
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-math.js +12 -9
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-output.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +6 -6
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-staticRow.js +7 -10
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d8960dc57d66b1ac1b240f8ec2a50bcd85a130d
|
4
|
+
data.tar.gz: 2ff7b825a32d597efe45f28ae8f52bc32a73f222
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38e32b180cae97a545ddc52cf7f2f93fd5a5cf1a20d7a280b5a2e0cf2d7fcee64d0b9532ec17b9b63ff0a07ccfcdab5dc847171fe345bb883d818cd30c43938b
|
7
|
+
data.tar.gz: 0054a4c0676789cccb11959b59aa81c2dceb4e33b46a58cf496915f9ea954e768f27b7956446bde7c25596d86938a2316a2a3b90a34492da4dfb7d3e359ac142
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
Simple integration of jquery-tablesorter into the asset pipeline.
|
6
6
|
|
7
|
-
Current tablesorter version: 2.19.
|
7
|
+
Current tablesorter version: 2.19.1 (2/9/2015), [documentation]
|
8
8
|
|
9
9
|
Any issue associated with the js/css files, please report to [Mottie's fork].
|
10
10
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*!
|
2
2
|
* tablesorter (FORK) pager plugin
|
3
|
-
* updated 2/
|
3
|
+
* updated 2/9/2015 (v2.19.1)
|
4
4
|
*/
|
5
5
|
/*jshint browser:true, jquery:true, unused:false */
|
6
6
|
;(function($) {
|
@@ -204,7 +204,7 @@
|
|
204
204
|
if ($out.length) {
|
205
205
|
$out[ ($out[0].tagName === 'INPUT') ? 'val' : 'html' ](s);
|
206
206
|
// rebind startRow/page inputs
|
207
|
-
$out.find('.ts-startRow, .ts-page').unbind('change').bind('change', function(){
|
207
|
+
$out.find('.ts-startRow, .ts-page').unbind('change.pager').bind('change.pager', function(){
|
208
208
|
var v = $(this).val(),
|
209
209
|
pg = $(this).hasClass('ts-startRow') ? Math.floor( v/p.size ) + 1 : v;
|
210
210
|
c.$table.trigger('pageSet.pager', [ pg ]);
|
@@ -768,7 +768,7 @@
|
|
768
768
|
table.config.appender = null; // remove pager appender function
|
769
769
|
p.initialized = false;
|
770
770
|
delete table.config.rowsCopy;
|
771
|
-
$(table).unbind(pagerEvents.split(' ').join('.pager '));
|
771
|
+
$(table).unbind( $.trim(pagerEvents.split(' ').join('.pager ')) );
|
772
772
|
if (ts.storage) {
|
773
773
|
ts.storage(table, p.storageKey, '');
|
774
774
|
}
|
@@ -848,7 +848,7 @@
|
|
848
848
|
p.regexRows = new RegExp('(' + (wo.filter_filteredRow || 'filtered') + '|' + c.selectorRemove.slice(1) + '|' + c.cssChildRow + ')');
|
849
849
|
|
850
850
|
$t
|
851
|
-
.unbind(pagerEvents.split(' ').join('.pager '))
|
851
|
+
.unbind( $.trim(pagerEvents.split(' ').join('.pager ')) )
|
852
852
|
.bind('filterInit.pager filterStart.pager', function(e, filters) {
|
853
853
|
p.currentFilters = $.isArray(filters) ? filters : c.$table.data('lastSearch');
|
854
854
|
// don't change page if filters are the same (pager updating, etc)
|
@@ -945,8 +945,8 @@
|
|
945
945
|
p.$goto = pager.find(p.cssGoto);
|
946
946
|
if ( p.$goto.length ) {
|
947
947
|
p.$goto
|
948
|
-
.unbind('change')
|
949
|
-
.bind('change', function(){
|
948
|
+
.unbind('change.pager')
|
949
|
+
.bind('change.pager', function(){
|
950
950
|
p.page = $(this).val() - 1;
|
951
951
|
moveToPage(table, p, true);
|
952
952
|
updatePageDisplay(table, p, false);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**!
|
2
|
-
* TableSorter (FORK) 2.19.
|
2
|
+
* TableSorter (FORK) 2.19.1 - Client-side table sorting with ease!
|
3
3
|
* @requires jQuery v1.2.6+
|
4
4
|
*
|
5
5
|
* Copyright (c) 2007 Christian Bach
|
@@ -25,14 +25,14 @@
|
|
25
25
|
factory(jQuery);
|
26
26
|
}
|
27
27
|
}(function($) {
|
28
|
-
|
28
|
+
'use strict';
|
29
29
|
$.extend({
|
30
30
|
/*jshint supernew:true */
|
31
31
|
tablesorter: new function() {
|
32
32
|
|
33
33
|
var ts = this;
|
34
34
|
|
35
|
-
ts.version =
|
35
|
+
ts.version = '2.19.1';
|
36
36
|
|
37
37
|
ts.parsers = [];
|
38
38
|
ts.widgets = [];
|
@@ -50,13 +50,13 @@
|
|
50
50
|
// *** functionality
|
51
51
|
cancelSelection : true, // prevent text selection in the header
|
52
52
|
tabIndex : true, // add tabindex to header for keyboard accessibility
|
53
|
-
dateFormat : 'mmddyyyy', // other options:
|
53
|
+
dateFormat : 'mmddyyyy', // other options: 'ddmmyyy' or 'yyyymmdd'
|
54
54
|
sortMultiSortKey : 'shiftKey', // key used to select additional columns
|
55
55
|
sortResetKey : 'ctrlKey', // key used to remove sorting on a column
|
56
|
-
usNumberFormat : true, // false for German
|
56
|
+
usNumberFormat : true, // false for German '1.234.567,89' or French '1 234 567,89'
|
57
57
|
delayInit : false, // if false, the parsed table contents will not update until the first sort
|
58
58
|
serverSideSorting: false, // if true, server-side sorting should be performed because client-side sorting will be disabled, but the ui and events will still be used.
|
59
|
-
resort : true, // default setting to trigger a resort after an
|
59
|
+
resort : true, // default setting to trigger a resort after an 'update', 'addRows', 'updateCell', etc has completed
|
60
60
|
|
61
61
|
// *** sort options
|
62
62
|
headers : {}, // set sorter, string, empty, locked order, sortInitialOrder, filter, etc.
|
@@ -69,7 +69,7 @@
|
|
69
69
|
sortInitialOrder : 'asc', // sort direction on first click
|
70
70
|
sortLocaleCompare: false, // replace equivalent character (accented characters)
|
71
71
|
sortReset : false, // third click on the header will reset column to default - unsorted
|
72
|
-
sortRestart : false, // restart sort to
|
72
|
+
sortRestart : false, // restart sort to 'sortInitialOrder' when clicking on previously unsorted columns
|
73
73
|
|
74
74
|
emptyTo : 'bottom', // sort empty cell to bottom, top, none, zero, emptyMax, emptyMin
|
75
75
|
stringTo : 'max', // sort strings in numerical column as max, min, top, bottom, zero
|
@@ -121,7 +121,7 @@
|
|
121
121
|
strings: {},
|
122
122
|
parsers: []
|
123
123
|
|
124
|
-
// removed: widgetZebra: { css: [
|
124
|
+
// removed: widgetZebra: { css: ['even', 'odd'] }
|
125
125
|
|
126
126
|
};
|
127
127
|
|
@@ -157,7 +157,7 @@
|
|
157
157
|
function log() {
|
158
158
|
var a = arguments[0],
|
159
159
|
s = arguments.length > 1 ? Array.prototype.slice.call(arguments) : a;
|
160
|
-
if (typeof console !==
|
160
|
+
if (typeof console !== 'undefined' && typeof console.log !== 'undefined') {
|
161
161
|
console[ /error/i.test(a) ? 'error' : /warn/i.test(a) ? 'warn' : 'log' ](s);
|
162
162
|
} else {
|
163
163
|
alert(s);
|
@@ -165,7 +165,7 @@
|
|
165
165
|
}
|
166
166
|
|
167
167
|
function benchmark(s, d) {
|
168
|
-
log(s +
|
168
|
+
log(s + ' (' + (new Date().getTime() - d.getTime()) + 'ms)');
|
169
169
|
}
|
170
170
|
|
171
171
|
ts.log = log;
|
@@ -187,7 +187,7 @@
|
|
187
187
|
c = table.config,
|
188
188
|
t = c.textExtraction || '';
|
189
189
|
if (typeof(t) === 'string') {
|
190
|
-
// check data-attribute first when set to
|
190
|
+
// check data-attribute first when set to 'basic'; don't use node.innerText - it's really slow!
|
191
191
|
return $.trim( (t === 'basic' ? $node.attr(c.textAttribute) || node.textContent : node.textContent ) || $node.text() || '' );
|
192
192
|
} else {
|
193
193
|
if (typeof(t) === 'function') {
|
@@ -236,7 +236,7 @@
|
|
236
236
|
tb = c.$tbodies = c.$table.children('tbody:not(.' + c.cssInfoBlock + ')'),
|
237
237
|
rows, list, l, i, h, ch, np, p, e, time,
|
238
238
|
j = 0,
|
239
|
-
parsersDebug =
|
239
|
+
parsersDebug = '',
|
240
240
|
len = tb.length;
|
241
241
|
if ( len === 0) {
|
242
242
|
return c.debug ? log('Warning: *Empty table!* Not building a parser cache') : '';
|
@@ -275,7 +275,7 @@
|
|
275
275
|
p = detectParserForColumn(table, rows, -1, i);
|
276
276
|
}
|
277
277
|
if (c.debug) {
|
278
|
-
parsersDebug +=
|
278
|
+
parsersDebug += 'column:' + i + '; extractor:' + e.id + '; parser:' + p.id + '; string:' + c.strings[i] + '; empty: ' + c.empties[i] + '\n';
|
279
279
|
}
|
280
280
|
list.parsers[i] = p;
|
281
281
|
list.extractors[i] = e;
|
@@ -284,8 +284,8 @@
|
|
284
284
|
j += (list.parsers.length) ? len : 1;
|
285
285
|
}
|
286
286
|
if (c.debug) {
|
287
|
-
log(parsersDebug ? parsersDebug :
|
288
|
-
benchmark(
|
287
|
+
log(parsersDebug ? parsersDebug : 'No parsers detected');
|
288
|
+
benchmark('Completed detecting parsers', time);
|
289
289
|
}
|
290
290
|
c.parsers = list.parsers;
|
291
291
|
c.extractors = list.extractors;
|
@@ -315,7 +315,7 @@
|
|
315
315
|
for (k = 0; k < $tb.length; k++) {
|
316
316
|
colMax = []; // column max value per tbody
|
317
317
|
cc = c.cache[k] = {
|
318
|
-
normalized: [] // array of normalized row data; last entry contains
|
318
|
+
normalized: [] // array of normalized row data; last entry contains 'rowData' above
|
319
319
|
// colMax: # // added at the end
|
320
320
|
};
|
321
321
|
|
@@ -326,7 +326,8 @@
|
|
326
326
|
rowData = {
|
327
327
|
// order: original row order #
|
328
328
|
// $row : jQuery Object[]
|
329
|
-
child: [] // child row text (filter widget)
|
329
|
+
child: [], // child row text (filter widget)
|
330
|
+
raw: [] // original row text
|
330
331
|
};
|
331
332
|
/** Add the table data to main data array */
|
332
333
|
$row = $($tb[k].rows[i]);
|
@@ -337,12 +338,12 @@
|
|
337
338
|
if ($row.hasClass(c.cssChildRow) && i !== 0) {
|
338
339
|
t = cc.normalized.length - 1;
|
339
340
|
cc.normalized[t][c.columns].$row = cc.normalized[t][c.columns].$row.add($row);
|
340
|
-
// add
|
341
|
+
// add 'hasChild' class name to parent row
|
341
342
|
if (!$row.prev().hasClass(c.cssChildRow)) {
|
342
343
|
$row.prev().addClass(ts.css.cssHasChild);
|
343
344
|
}
|
344
345
|
// save child row content (un-parsed!)
|
345
|
-
rowData.child[t] = $.trim( $row[0].textContent || $row
|
346
|
+
rowData.child[t] = $.trim( $row[0].textContent || $row.text() || '' );
|
346
347
|
// go to the next for loop
|
347
348
|
continue;
|
348
349
|
}
|
@@ -356,6 +357,7 @@
|
|
356
357
|
continue;
|
357
358
|
}
|
358
359
|
t = getElementText(table, $row[0].cells[j], j);
|
360
|
+
rowData.raw.push(t); // save original row text
|
359
361
|
// do extract before parsing if there is one
|
360
362
|
if (typeof extractors[j].id === 'undefined') {
|
361
363
|
tx = t;
|
@@ -366,7 +368,7 @@
|
|
366
368
|
// in case the parser needs to extract data from the table cell attributes
|
367
369
|
v = parsers[j].id === 'no-parser' ? '' : parsers[j].format(tx, table, $row[0].cells[j], j);
|
368
370
|
cols.push( c.ignoreCase && typeof v === 'string' ? v.toLowerCase() : v );
|
369
|
-
if ((parsers[j].type || '').toLowerCase() ===
|
371
|
+
if ((parsers[j].type || '').toLowerCase() === 'numeric') {
|
370
372
|
// determine column max value (ignore sign)
|
371
373
|
colMax[j] = Math.max(Math.abs(v) || 0, colMax[j] || 0);
|
372
374
|
}
|
@@ -384,7 +386,7 @@
|
|
384
386
|
ts.isProcessing(table); // remove processing icon
|
385
387
|
}
|
386
388
|
if (c.debug) {
|
387
|
-
benchmark(
|
389
|
+
benchmark('Building cache for ' + totalRows + ' rows', cacheTime);
|
388
390
|
}
|
389
391
|
}
|
390
392
|
|
@@ -401,7 +403,7 @@
|
|
401
403
|
if (isEmptyObject(cc)) {
|
402
404
|
// run pager appender in case the table was just emptied
|
403
405
|
return c.appender ? c.appender(table, rows) :
|
404
|
-
table.isUpdating ? c.$table.trigger(
|
406
|
+
table.isUpdating ? c.$table.trigger('updateComplete', table) : ''; // Fixes #532
|
405
407
|
}
|
406
408
|
if (c.debug) {
|
407
409
|
appendTime = new Date();
|
@@ -428,17 +430,17 @@
|
|
428
430
|
c.appender(table, rows);
|
429
431
|
}
|
430
432
|
if (c.debug) {
|
431
|
-
benchmark(
|
433
|
+
benchmark('Rebuilt table', appendTime);
|
432
434
|
}
|
433
435
|
// apply table widgets; but not before ajax completes
|
434
436
|
if (!init && !c.appender) { ts.applyWidget(table); }
|
435
437
|
if (table.isUpdating) {
|
436
|
-
c.$table.trigger(
|
438
|
+
c.$table.trigger('updateComplete', table);
|
437
439
|
}
|
438
440
|
}
|
439
441
|
|
440
442
|
function formatSortingOrder(v) {
|
441
|
-
// look for
|
443
|
+
// look for 'd' in 'desc' order; return true
|
442
444
|
return (/^d/i.test(v) || v === 1);
|
443
445
|
}
|
444
446
|
|
@@ -490,7 +492,7 @@
|
|
490
492
|
// add to parent in case there are multiple rows
|
491
493
|
$t.parent().addClass(ts.css.headerRow + ' ' + c.cssHeaderRow).attr('role', 'row');
|
492
494
|
// allow keyboard cursor to focus on element
|
493
|
-
if (c.tabIndex) { $t.attr(
|
495
|
+
if (c.tabIndex) { $t.attr('tabindex', 0); }
|
494
496
|
return elem;
|
495
497
|
}));
|
496
498
|
$(table).find(c.selectorHeaders).attr({
|
@@ -500,7 +502,7 @@
|
|
500
502
|
// enable/disable sorting
|
501
503
|
updateHeader(table);
|
502
504
|
if (c.debug) {
|
503
|
-
benchmark(
|
505
|
+
benchmark('Built headers:', time);
|
504
506
|
log(c.$headers);
|
505
507
|
}
|
506
508
|
}
|
@@ -522,7 +524,7 @@
|
|
522
524
|
c.$headers.each(function(index, th){
|
523
525
|
$th = $(th);
|
524
526
|
col = ts.getColumnData( table, c.headers, index, true );
|
525
|
-
// add
|
527
|
+
// add 'sorter-false' class if 'parser-false' is set
|
526
528
|
s = ts.getData( th, col, 'sorter' ) === 'false' || ts.getData( th, col, 'parser' ) === 'false';
|
527
529
|
th.sortDisabled = s;
|
528
530
|
$th[ s ? 'addClass' : 'removeClass' ]('sorter-false').attr('aria-disabled', '' + s);
|
@@ -610,7 +612,7 @@
|
|
610
612
|
t = 1;
|
611
613
|
break;
|
612
614
|
case 's': // same direction (as primary column)
|
613
|
-
// if primary sort is set to
|
615
|
+
// if primary sort is set to 's', make it ascending
|
614
616
|
t = primary || 0;
|
615
617
|
break;
|
616
618
|
case 'o':
|
@@ -649,7 +651,7 @@
|
|
649
651
|
key = !event[c.sortMultiSortKey],
|
650
652
|
$table = c.$table;
|
651
653
|
// Only call sortStart if sorting is enabled
|
652
|
-
$table.trigger(
|
654
|
+
$table.trigger('sortStart', table);
|
653
655
|
// get current column sort order
|
654
656
|
cell.count = event[c.sortResetKey] ? 2 : (cell.count + 1) % (c.sortReset ? 3 : 2);
|
655
657
|
// reset all sorts on non-current column - issue #30
|
@@ -736,14 +738,14 @@
|
|
736
738
|
}
|
737
739
|
}
|
738
740
|
// sortBegin event triggered immediately before the sort
|
739
|
-
$table.trigger(
|
741
|
+
$table.trigger('sortBegin', table);
|
740
742
|
// setTimeout needed so the processing icon shows up
|
741
743
|
setTimeout(function(){
|
742
744
|
// set css for headers
|
743
745
|
setHeadersCss(table);
|
744
746
|
multisort(table);
|
745
747
|
appendToTable(table);
|
746
|
-
$table.trigger(
|
748
|
+
$table.trigger('sortEnd', table);
|
747
749
|
}, 1);
|
748
750
|
}
|
749
751
|
|
@@ -787,7 +789,7 @@
|
|
787
789
|
num = (c.strings[col]) ? c.string[c.strings[col]] || 0 : 0;
|
788
790
|
}
|
789
791
|
// fall back to built-in numeric sort
|
790
|
-
// var sort = $.tablesorter[
|
792
|
+
// var sort = $.tablesorter['sort' + s](table, a[c], b[c], c, colMax[c], dir);
|
791
793
|
sort = c.numberSorter ? c.numberSorter(a[col], b[col], dir, colMax[col], table) :
|
792
794
|
ts[ 'sortNumeric' + (dir ? 'Asc' : 'Desc') ](a[col], b[col], num, colMax[col], col, table);
|
793
795
|
} else {
|
@@ -811,7 +813,7 @@
|
|
811
813
|
return a[c.columns].order - b[c.columns].order;
|
812
814
|
});
|
813
815
|
}
|
814
|
-
if (c.debug) { benchmark(
|
816
|
+
if (c.debug) { benchmark('Sorting on ' + sortList.toString() + ' and dir ' + order + ' time', sortTime); }
|
815
817
|
}
|
816
818
|
|
817
819
|
function resortComplete(c, callback){
|
@@ -848,11 +850,14 @@
|
|
848
850
|
|
849
851
|
function bindMethods(table){
|
850
852
|
var c = table.config,
|
851
|
-
$table = c.$table
|
853
|
+
$table = c.$table,
|
854
|
+
events = 'sortReset update updateRows updateCell updateAll addRows updateComplete sorton appendCache ' +
|
855
|
+
'updateCache applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave '.split(' ')
|
856
|
+
.join(c.namespace + ' ');
|
852
857
|
// apply easy methods that trigger bound events
|
853
858
|
$table
|
854
|
-
.unbind(
|
855
|
-
.bind(
|
859
|
+
.unbind( $.trim(events) )
|
860
|
+
.bind('sortReset' + c.namespace, function(e, callback){
|
856
861
|
e.stopPropagation();
|
857
862
|
c.sortList = [];
|
858
863
|
setHeadersCss(table);
|
@@ -862,7 +867,7 @@
|
|
862
867
|
callback(table);
|
863
868
|
}
|
864
869
|
})
|
865
|
-
.bind(
|
870
|
+
.bind('updateAll' + c.namespace, function(e, resort, callback){
|
866
871
|
e.stopPropagation();
|
867
872
|
table.isUpdating = true;
|
868
873
|
ts.refreshWidgets(table, true, true);
|
@@ -871,14 +876,14 @@
|
|
871
876
|
bindMethods(table);
|
872
877
|
commonUpdate(table, resort, callback);
|
873
878
|
})
|
874
|
-
.bind(
|
879
|
+
.bind('update' + c.namespace + ' updateRows' + c.namespace, function(e, resort, callback) {
|
875
880
|
e.stopPropagation();
|
876
881
|
table.isUpdating = true;
|
877
882
|
// update sorting (if enabled/disabled)
|
878
883
|
updateHeader(table);
|
879
884
|
commonUpdate(table, resort, callback);
|
880
885
|
})
|
881
|
-
.bind(
|
886
|
+
.bind('updateCell' + c.namespace, function(e, cell, resort, callback) {
|
882
887
|
e.stopPropagation();
|
883
888
|
table.isUpdating = true;
|
884
889
|
$table.find(c.selectorRemove).remove();
|
@@ -904,7 +909,7 @@
|
|
904
909
|
v = c.parsers[icell].id === 'no-parser' ? '' :
|
905
910
|
c.parsers[icell].format( t, table, cell, icell );
|
906
911
|
c.cache[tbdy].normalized[row][icell] = c.ignoreCase && typeof v === 'string' ? v.toLowerCase() : v;
|
907
|
-
if ((c.parsers[icell].type || '').toLowerCase() ===
|
912
|
+
if ((c.parsers[icell].type || '').toLowerCase() === 'numeric') {
|
908
913
|
// update column max value (ignore sign)
|
909
914
|
c.cache[tbdy].colMax[icell] = Math.max(Math.abs(v) || 0, c.cache[tbdy].colMax[icell] || 0);
|
910
915
|
}
|
@@ -922,7 +927,7 @@
|
|
922
927
|
}
|
923
928
|
}
|
924
929
|
})
|
925
|
-
.bind(
|
930
|
+
.bind('addRows' + c.namespace, function(e, $row, resort, callback) {
|
926
931
|
e.stopPropagation();
|
927
932
|
table.isUpdating = true;
|
928
933
|
if (isEmptyObject(c.cache)) {
|
@@ -957,7 +962,7 @@
|
|
957
962
|
v = c.parsers[j].id === 'no-parser' ? '' :
|
958
963
|
c.parsers[j].format( t, table, $row[i].cells[j], j );
|
959
964
|
cells[j] = c.ignoreCase && typeof v === 'string' ? v.toLowerCase() : v;
|
960
|
-
if ((c.parsers[j].type || '').toLowerCase() ===
|
965
|
+
if ((c.parsers[j].type || '').toLowerCase() === 'numeric') {
|
961
966
|
// update column max value (ignore sign)
|
962
967
|
c.cache[tbdy].colMax[j] = Math.max(Math.abs(cells[j]) || 0, c.cache[tbdy].colMax[j] || 0);
|
963
968
|
}
|
@@ -971,37 +976,37 @@
|
|
971
976
|
checkResort(c, resort, callback);
|
972
977
|
}
|
973
978
|
})
|
974
|
-
.bind(
|
979
|
+
.bind('updateComplete' + c.namespace, function(){
|
975
980
|
table.isUpdating = false;
|
976
981
|
})
|
977
|
-
.bind(
|
982
|
+
.bind('sorton' + c.namespace, function(e, list, callback, init) {
|
978
983
|
var c = table.config;
|
979
984
|
e.stopPropagation();
|
980
|
-
$table.trigger(
|
985
|
+
$table.trigger('sortStart', this);
|
981
986
|
// update header count index
|
982
987
|
updateHeaderSortCount(table, list);
|
983
988
|
// set css for headers
|
984
989
|
setHeadersCss(table);
|
985
990
|
// fixes #346
|
986
991
|
if (c.delayInit && isEmptyObject(c.cache)) { buildCache(table); }
|
987
|
-
$table.trigger(
|
992
|
+
$table.trigger('sortBegin', this);
|
988
993
|
// sort the table and append it to the dom
|
989
994
|
multisort(table);
|
990
995
|
appendToTable(table, init);
|
991
|
-
$table.trigger(
|
996
|
+
$table.trigger('sortEnd', this);
|
992
997
|
ts.applyWidget(table);
|
993
998
|
if ($.isFunction(callback)) {
|
994
999
|
callback(table);
|
995
1000
|
}
|
996
1001
|
})
|
997
|
-
.bind(
|
1002
|
+
.bind('appendCache' + c.namespace, function(e, callback, init) {
|
998
1003
|
e.stopPropagation();
|
999
1004
|
appendToTable(table, init);
|
1000
1005
|
if ($.isFunction(callback)) {
|
1001
1006
|
callback(table);
|
1002
1007
|
}
|
1003
1008
|
})
|
1004
|
-
.bind(
|
1009
|
+
.bind('updateCache' + c.namespace, function(e, callback){
|
1005
1010
|
// rebuild parsers
|
1006
1011
|
if (!(c.parsers && c.parsers.length)) {
|
1007
1012
|
buildParserCache(table);
|
@@ -1012,24 +1017,24 @@
|
|
1012
1017
|
callback(table);
|
1013
1018
|
}
|
1014
1019
|
})
|
1015
|
-
.bind(
|
1020
|
+
.bind('applyWidgetId' + c.namespace, function(e, id) {
|
1016
1021
|
e.stopPropagation();
|
1017
1022
|
ts.getWidgetById(id).format(table, c, c.widgetOptions);
|
1018
1023
|
})
|
1019
|
-
.bind(
|
1024
|
+
.bind('applyWidgets' + c.namespace, function(e, init) {
|
1020
1025
|
e.stopPropagation();
|
1021
1026
|
// apply widgets
|
1022
1027
|
ts.applyWidget(table, init);
|
1023
1028
|
})
|
1024
|
-
.bind(
|
1029
|
+
.bind('refreshWidgets' + c.namespace, function(e, all, dontapply){
|
1025
1030
|
e.stopPropagation();
|
1026
1031
|
ts.refreshWidgets(table, all, dontapply);
|
1027
1032
|
})
|
1028
|
-
.bind(
|
1033
|
+
.bind('destroy' + c.namespace, function(e, c, cb){
|
1029
1034
|
e.stopPropagation();
|
1030
1035
|
ts.destroy(table, c, cb);
|
1031
1036
|
})
|
1032
|
-
.bind(
|
1037
|
+
.bind('resetToLoadState' + c.namespace, function(){
|
1033
1038
|
// remove all widgets
|
1034
1039
|
ts.removeWidget(table, true, false);
|
1035
1040
|
// restore original settings; this clears out current settings, but does not clear
|
@@ -1075,14 +1080,14 @@
|
|
1075
1080
|
// make sure to store the config object
|
1076
1081
|
table.config = c;
|
1077
1082
|
// save the settings where they read
|
1078
|
-
$.data(table,
|
1083
|
+
$.data(table, 'tablesorter', c);
|
1079
1084
|
if (c.debug) { $.data( table, 'startoveralltimer', new Date()); }
|
1080
1085
|
|
1081
1086
|
// removing this in version 3 (only supports jQuery 1.7+)
|
1082
1087
|
c.supportsDataObject = (function(version) {
|
1083
1088
|
version[0] = parseInt(version[0], 10);
|
1084
1089
|
return (version[0] > 1) || (version[0] === 1 && parseInt(version[1], 10) >= 4);
|
1085
|
-
})($.fn.jquery.split(
|
1090
|
+
})($.fn.jquery.split('.'));
|
1086
1091
|
// digit sort text location; keeping max+/- for backwards compatibility
|
1087
1092
|
c.string = { 'max': 1, 'min': -1, 'emptymin': 1, 'emptymax': -1, 'zero': 0, 'none': 0, 'null': 0, 'top': true, 'bottom': false };
|
1088
1093
|
// ensure case insensitivity
|
@@ -1145,7 +1150,7 @@
|
|
1145
1150
|
ts.applyWidget(table, true);
|
1146
1151
|
// if user has supplied a sort list to constructor
|
1147
1152
|
if (c.sortList.length > 0) {
|
1148
|
-
$table.trigger(
|
1153
|
+
$table.trigger('sorton', [c.sortList, {}, !c.initWidgets, true]);
|
1149
1154
|
} else {
|
1150
1155
|
setHeadersCss(table);
|
1151
1156
|
if (c.initWidgets) {
|
@@ -1173,7 +1178,7 @@
|
|
1173
1178
|
table.hasInitialized = true;
|
1174
1179
|
table.isProcessing = false;
|
1175
1180
|
if (c.debug) {
|
1176
|
-
ts.benchmark(
|
1181
|
+
ts.benchmark('Overall initialization time', $.data( table, 'startoveralltimer'));
|
1177
1182
|
}
|
1178
1183
|
$table.trigger('tablesorter-initialized', table);
|
1179
1184
|
if (typeof c.initialized === 'function') { c.initialized(table); }
|
@@ -1239,15 +1244,15 @@
|
|
1239
1244
|
cell = cells[j];
|
1240
1245
|
$cell = $(cell);
|
1241
1246
|
rowIndex = cell.parentNode.rowIndex;
|
1242
|
-
cellId = rowIndex +
|
1247
|
+
cellId = rowIndex + '-' + $cell.index();
|
1243
1248
|
rowSpan = cell.rowSpan || 1;
|
1244
1249
|
colSpan = cell.colSpan || 1;
|
1245
|
-
if (typeof(matrix[rowIndex]) ===
|
1250
|
+
if (typeof(matrix[rowIndex]) === 'undefined') {
|
1246
1251
|
matrix[rowIndex] = [];
|
1247
1252
|
}
|
1248
1253
|
// Find first available column in the first row
|
1249
1254
|
for (k = 0; k < matrix[rowIndex].length + 1; k++) {
|
1250
|
-
if (typeof(matrix[rowIndex][k]) ===
|
1255
|
+
if (typeof(matrix[rowIndex][k]) === 'undefined') {
|
1251
1256
|
firstAvailCol = k;
|
1252
1257
|
break;
|
1253
1258
|
}
|
@@ -1257,12 +1262,12 @@
|
|
1257
1262
|
// add data-column
|
1258
1263
|
$cell.attr({ 'data-column' : firstAvailCol }); // 'data-row' : rowIndex
|
1259
1264
|
for (k = rowIndex; k < rowIndex + rowSpan; k++) {
|
1260
|
-
if (typeof(matrix[k]) ===
|
1265
|
+
if (typeof(matrix[k]) === 'undefined') {
|
1261
1266
|
matrix[k] = [];
|
1262
1267
|
}
|
1263
1268
|
matrixrow = matrix[k];
|
1264
1269
|
for (l = firstAvailCol; l < firstAvailCol + colSpan; l++) {
|
1265
|
-
matrixrow[l] =
|
1270
|
+
matrixrow[l] = 'x';
|
1266
1271
|
}
|
1267
1272
|
}
|
1268
1273
|
}
|
@@ -1325,8 +1330,8 @@
|
|
1325
1330
|
$headers
|
1326
1331
|
// http://stackoverflow.com/questions/5312849/jquery-find-self;
|
1327
1332
|
.find(c.selectorSort).add( $headers.filter(c.selectorSort) )
|
1328
|
-
.unbind('mousedown mouseup sort keyup '.split(' ').join(c.namespace + ' '))
|
1329
|
-
.bind('mousedown mouseup sort keyup '.split(' ').join(c.namespace + ' '), function(e, external) {
|
1333
|
+
.unbind( $.trim('mousedown mouseup sort keyup '.split(' ').join(c.namespace + ' ')) )
|
1334
|
+
.bind( $.trim('mousedown mouseup sort keyup '.split(' ').join(c.namespace + ' ')), function(e, external) {
|
1330
1335
|
var cell, type = e.type;
|
1331
1336
|
// only recognize left clicks or enter
|
1332
1337
|
if ( ((e.which || e.button) !== 1 && !/sort|keyup/.test(type)) || (type === 'keyup' && e.which !== 13) ) {
|
@@ -1382,10 +1387,12 @@
|
|
1382
1387
|
if (!table.hasInitialized) { return; }
|
1383
1388
|
// remove all widgets
|
1384
1389
|
ts.removeWidget(table, true, false);
|
1385
|
-
var
|
1386
|
-
|
1387
|
-
|
1388
|
-
|
1390
|
+
var events,
|
1391
|
+
$t = $(table),
|
1392
|
+
c = table.config,
|
1393
|
+
$h = $t.find('thead:first'),
|
1394
|
+
$r = $h.find('tr.' + ts.css.headerRow).removeClass(ts.css.headerRow + ' ' + c.cssHeaderRow),
|
1395
|
+
$f = $t.find('tfoot:first > tr').children('th, td');
|
1389
1396
|
if (removeClasses === false && $.inArray('uitheme', c.widgets) >= 0) {
|
1390
1397
|
// reapply uitheme classes, in case we want to maintain appearance
|
1391
1398
|
$t.trigger('applyWidgetId', ['uitheme']);
|
@@ -1394,15 +1401,18 @@
|
|
1394
1401
|
// remove widget added rows, just in case
|
1395
1402
|
$h.find('tr').not($r).remove();
|
1396
1403
|
// disable tablesorter
|
1404
|
+
events = 'sortReset update updateAll updateRows updateCell addRows updateComplete sorton appendCache updateCache ' +
|
1405
|
+
'applyWidgetId applyWidgets refreshWidgets destroy mouseup mouseleave keypress sortBegin sortEnd resetToLoadState '.split(' ')
|
1406
|
+
.join(c.namespace + ' ');
|
1397
1407
|
$t
|
1398
1408
|
.removeData('tablesorter')
|
1399
|
-
.unbind(
|
1409
|
+
.unbind( $.trim(events) );
|
1400
1410
|
c.$headers.add($f)
|
1401
1411
|
.removeClass( [ts.css.header, c.cssHeader, c.cssAsc, c.cssDesc, ts.css.sortAsc, ts.css.sortDesc, ts.css.sortNone].join(' ') )
|
1402
1412
|
.removeAttr('data-column')
|
1403
1413
|
.removeAttr('aria-label')
|
1404
1414
|
.attr('aria-disabled', 'true');
|
1405
|
-
$r.find(c.selectorSort).unbind('mousedown mouseup keypress '.split(' ').join(c.namespace + ' '));
|
1415
|
+
$r.find(c.selectorSort).unbind( $.trim('mousedown mouseup keypress '.split(' ').join(c.namespace + ' ')) );
|
1406
1416
|
ts.restoreHeaders(table);
|
1407
1417
|
$t.toggleClass(ts.css.table + ' ' + c.tableClass + ' tablesorter-' + c.theme, removeClasses === false);
|
1408
1418
|
// clear flag in case the plugin is initialized again
|
@@ -1422,7 +1432,7 @@
|
|
1422
1432
|
};
|
1423
1433
|
|
1424
1434
|
// Natural sort - https://github.com/overset/javascript-natural-sort (date sorting removed)
|
1425
|
-
// this function will only accept strings, or you'll see
|
1435
|
+
// this function will only accept strings, or you'll see 'TypeError: undefined is not a function'
|
1426
1436
|
// I could add a = a.toString(); b = b.toString(); but it'll slow down the sort overall
|
1427
1437
|
ts.sortNatural = function(a, b) {
|
1428
1438
|
if (a === b) { return 0; }
|
@@ -1521,20 +1531,20 @@
|
|
1521
1531
|
|
1522
1532
|
// used when replacing accented characters during sorting
|
1523
1533
|
ts.characterEquivalents = {
|
1524
|
-
|
1525
|
-
|
1526
|
-
|
1527
|
-
|
1528
|
-
|
1529
|
-
|
1530
|
-
|
1531
|
-
|
1532
|
-
|
1533
|
-
|
1534
|
-
|
1535
|
-
|
1536
|
-
|
1537
|
-
|
1534
|
+
'a' : '\u00e1\u00e0\u00e2\u00e3\u00e4\u0105\u00e5', // áàâãäąå
|
1535
|
+
'A' : '\u00c1\u00c0\u00c2\u00c3\u00c4\u0104\u00c5', // ÁÀÂÃÄĄÅ
|
1536
|
+
'c' : '\u00e7\u0107\u010d', // çćč
|
1537
|
+
'C' : '\u00c7\u0106\u010c', // ÇĆČ
|
1538
|
+
'e' : '\u00e9\u00e8\u00ea\u00eb\u011b\u0119', // éèêëěę
|
1539
|
+
'E' : '\u00c9\u00c8\u00ca\u00cb\u011a\u0118', // ÉÈÊËĚĘ
|
1540
|
+
'i' : '\u00ed\u00ec\u0130\u00ee\u00ef\u0131', // íìİîïı
|
1541
|
+
'I' : '\u00cd\u00cc\u0130\u00ce\u00cf', // ÍÌİÎÏ
|
1542
|
+
'o' : '\u00f3\u00f2\u00f4\u00f5\u00f6', // óòôõö
|
1543
|
+
'O' : '\u00d3\u00d2\u00d4\u00d5\u00d6', // ÓÒÔÕÖ
|
1544
|
+
'ss': '\u00df', // ß (s sharp)
|
1545
|
+
'SS': '\u1e9e', // ẞ (Capital sharp s)
|
1546
|
+
'u' : '\u00fa\u00f9\u00fb\u00fc\u016f', // úùûüů
|
1547
|
+
'U' : '\u00da\u00d9\u00db\u00dc\u016e' // ÚÙÛÜŮ
|
1538
1548
|
};
|
1539
1549
|
ts.replaceAccents = function(s) {
|
1540
1550
|
var a, acc = '[', eq = ts.characterEquivalents;
|
@@ -1623,7 +1633,7 @@
|
|
1623
1633
|
if (init !== false && table.hasInitialized && (table.isApplyingWidgets || table.isUpdating)) { return; }
|
1624
1634
|
if (c.debug) { time = new Date(); }
|
1625
1635
|
// look for widgets to apply from in table class
|
1626
|
-
// stop using \b otherwise this matches
|
1636
|
+
// stop using \b otherwise this matches 'ui-widget-content' & adds 'content' widget
|
1627
1637
|
wd = new RegExp( '\\s' + c.widgetClass.replace( /\{name\}/i, '([\\w-]+)' )+ '\\s', 'g' );
|
1628
1638
|
if ( tableClass.match( wd ) ) {
|
1629
1639
|
// extract out the widget id from the table class (widget id's can include dashes)
|
@@ -1686,7 +1696,7 @@
|
|
1686
1696
|
}, 0);
|
1687
1697
|
if (c.debug) {
|
1688
1698
|
w = c.widgets.length;
|
1689
|
-
benchmark(
|
1699
|
+
benchmark('Completed ' + (init === true ? 'initializing ' : 'applying ') + w + ' widget' + (w !== 1 ? 's' : ''), time);
|
1690
1700
|
}
|
1691
1701
|
};
|
1692
1702
|
|
@@ -1751,7 +1761,7 @@
|
|
1751
1761
|
};
|
1752
1762
|
|
1753
1763
|
// get sorter, string, empty, etc options for each column from
|
1754
|
-
// jQuery data, metadata, header option or header class name (
|
1764
|
+
// jQuery data, metadata, header option or header class name ('sorter-false')
|
1755
1765
|
// priority = jQuery data > meta > headers option > header class name
|
1756
1766
|
ts.getData = function(h, ch, key) {
|
1757
1767
|
var val = '', $h = $(h), m, cl;
|
@@ -1759,15 +1769,15 @@
|
|
1759
1769
|
m = $.metadata ? $h.metadata() : false;
|
1760
1770
|
cl = ' ' + ($h.attr('class') || '');
|
1761
1771
|
if (typeof $h.data(key) !== 'undefined' || typeof $h.data(key.toLowerCase()) !== 'undefined'){
|
1762
|
-
//
|
1763
|
-
//
|
1772
|
+
// 'data-lockedOrder' is assigned to 'lockedorder'; but 'data-locked-order' is assigned to 'lockedOrder'
|
1773
|
+
// 'data-sort-initial-order' is assigned to 'sortInitialOrder'
|
1764
1774
|
val += $h.data(key) || $h.data(key.toLowerCase());
|
1765
1775
|
} else if (m && typeof m[key] !== 'undefined') {
|
1766
1776
|
val += m[key];
|
1767
1777
|
} else if (ch && typeof ch[key] !== 'undefined') {
|
1768
1778
|
val += ch[key];
|
1769
1779
|
} else if (cl !== ' ' && cl.match(' ' + key + '-')) {
|
1770
|
-
// include sorter class name
|
1780
|
+
// include sorter class name 'sorter-text', etc; now works with 'sorter-my-custom-parser'
|
1771
1781
|
val = cl.match( new RegExp('\\s' + key + '-([\\w-]+)') )[1] || '';
|
1772
1782
|
}
|
1773
1783
|
return $.trim(val);
|
@@ -1778,7 +1788,7 @@
|
|
1778
1788
|
// allow using formatFloat without a table; defaults to US number format
|
1779
1789
|
var i,
|
1780
1790
|
t = table && table.config ? table.config.usNumberFormat !== false :
|
1781
|
-
typeof table !==
|
1791
|
+
typeof table !== 'undefined' ? table : true;
|
1782
1792
|
if (t) {
|
1783
1793
|
// US Format - 1,234,567.89 -> 1234567.89
|
1784
1794
|
s = s.replace(/,/g,'');
|
@@ -1825,7 +1835,7 @@
|
|
1825
1835
|
});
|
1826
1836
|
|
1827
1837
|
ts.addParser({
|
1828
|
-
id:
|
1838
|
+
id: 'text',
|
1829
1839
|
is: function() {
|
1830
1840
|
return true;
|
1831
1841
|
},
|
@@ -1837,35 +1847,35 @@
|
|
1837
1847
|
}
|
1838
1848
|
return s;
|
1839
1849
|
},
|
1840
|
-
type:
|
1850
|
+
type: 'text'
|
1841
1851
|
});
|
1842
1852
|
|
1843
1853
|
ts.addParser({
|
1844
|
-
id:
|
1854
|
+
id: 'digit',
|
1845
1855
|
is: function(s) {
|
1846
1856
|
return ts.isDigit(s);
|
1847
1857
|
},
|
1848
1858
|
format: function(s, table) {
|
1849
|
-
var n = ts.formatFloat((s || '').replace(/[^\w,. \-()]/g,
|
1859
|
+
var n = ts.formatFloat((s || '').replace(/[^\w,. \-()]/g, ''), table);
|
1850
1860
|
return s && typeof n === 'number' ? n : s ? $.trim( s && table.config.ignoreCase ? s.toLocaleLowerCase() : s ) : s;
|
1851
1861
|
},
|
1852
|
-
type:
|
1862
|
+
type: 'numeric'
|
1853
1863
|
});
|
1854
1864
|
|
1855
1865
|
ts.addParser({
|
1856
|
-
id:
|
1866
|
+
id: 'currency',
|
1857
1867
|
is: function(s) {
|
1858
1868
|
return (/^\(?\d+[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]|[\u00a3$\u20ac\u00a4\u00a5\u00a2?.]\d+\)?$/).test((s || '').replace(/[+\-,. ]/g,'')); // £$€¤¥¢
|
1859
1869
|
},
|
1860
1870
|
format: function(s, table) {
|
1861
|
-
var n = ts.formatFloat((s || '').replace(/[^\w,. \-()]/g,
|
1871
|
+
var n = ts.formatFloat((s || '').replace(/[^\w,. \-()]/g, ''), table);
|
1862
1872
|
return s && typeof n === 'number' ? n : s ? $.trim( s && table.config.ignoreCase ? s.toLocaleLowerCase() : s ) : s;
|
1863
1873
|
},
|
1864
|
-
type:
|
1874
|
+
type: 'numeric'
|
1865
1875
|
});
|
1866
1876
|
|
1867
1877
|
ts.addParser({
|
1868
|
-
id:
|
1878
|
+
id: 'url',
|
1869
1879
|
is: function(s) {
|
1870
1880
|
return (/^(https?|ftp|file):\/\//).test(s);
|
1871
1881
|
},
|
@@ -1873,35 +1883,35 @@
|
|
1873
1883
|
return s ? $.trim(s.replace(/(https?|ftp|file):\/\//, '')) : s;
|
1874
1884
|
},
|
1875
1885
|
parsed : true, // filter widget flag
|
1876
|
-
type:
|
1886
|
+
type: 'text'
|
1877
1887
|
});
|
1878
1888
|
|
1879
1889
|
ts.addParser({
|
1880
|
-
id:
|
1890
|
+
id: 'isoDate',
|
1881
1891
|
is: function(s) {
|
1882
1892
|
return (/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}/).test(s);
|
1883
1893
|
},
|
1884
1894
|
format: function(s, table) {
|
1885
|
-
var date = s ? new Date( s.replace(/-/g,
|
1895
|
+
var date = s ? new Date( s.replace(/-/g, '/') ) : s;
|
1886
1896
|
return date instanceof Date && isFinite(date) ? date.getTime() : s;
|
1887
1897
|
},
|
1888
|
-
type:
|
1898
|
+
type: 'numeric'
|
1889
1899
|
});
|
1890
1900
|
|
1891
1901
|
ts.addParser({
|
1892
|
-
id:
|
1902
|
+
id: 'percent',
|
1893
1903
|
is: function(s) {
|
1894
1904
|
return (/(\d\s*?%|%\s*?\d)/).test(s) && s.length < 15;
|
1895
1905
|
},
|
1896
1906
|
format: function(s, table) {
|
1897
|
-
return s ? ts.formatFloat(s.replace(/%/g,
|
1907
|
+
return s ? ts.formatFloat(s.replace(/%/g, ''), table) : s;
|
1898
1908
|
},
|
1899
|
-
type:
|
1909
|
+
type: 'numeric'
|
1900
1910
|
});
|
1901
1911
|
|
1902
1912
|
// added image parser to core v2.17.9
|
1903
1913
|
ts.addParser({
|
1904
|
-
id:
|
1914
|
+
id: 'image',
|
1905
1915
|
is: function(s, table, node, $node){
|
1906
1916
|
return $node.find('img').length > 0;
|
1907
1917
|
},
|
@@ -1909,65 +1919,65 @@
|
|
1909
1919
|
return $(cell).find('img').attr(table.config.imgAttr || 'alt') || s;
|
1910
1920
|
},
|
1911
1921
|
parsed : true, // filter widget flag
|
1912
|
-
type:
|
1922
|
+
type: 'text'
|
1913
1923
|
});
|
1914
1924
|
|
1915
1925
|
ts.addParser({
|
1916
|
-
id:
|
1926
|
+
id: 'usLongDate',
|
1917
1927
|
is: function(s) {
|
1918
1928
|
// two digit years are not allowed cross-browser
|
1919
1929
|
// Jan 01, 2013 12:34:56 PM or 01 Jan 2013
|
1920
1930
|
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);
|
1921
1931
|
},
|
1922
1932
|
format: function(s, table) {
|
1923
|
-
var date = s ? new Date( s.replace(/(\S)([AP]M)$/i,
|
1933
|
+
var date = s ? new Date( s.replace(/(\S)([AP]M)$/i, '$1 $2') ) : s;
|
1924
1934
|
return date instanceof Date && isFinite(date) ? date.getTime() : s;
|
1925
1935
|
},
|
1926
|
-
type:
|
1936
|
+
type: 'numeric'
|
1927
1937
|
});
|
1928
1938
|
|
1929
1939
|
ts.addParser({
|
1930
|
-
id:
|
1940
|
+
id: 'shortDate', // 'mmddyyyy', 'ddmmyyyy' or 'yyyymmdd'
|
1931
1941
|
is: function(s) {
|
1932
1942
|
// testing for ##-##-#### or ####-##-##, so it's not perfect; time can be included
|
1933
|
-
return (/(^\d{1,2}[\/\s]\d{1,2}[\/\s]\d{4})|(^\d{4}[\/\s]\d{1,2}[\/\s]\d{1,2})/).test((s || '').replace(/\s+/g,
|
1943
|
+
return (/(^\d{1,2}[\/\s]\d{1,2}[\/\s]\d{4})|(^\d{4}[\/\s]\d{1,2}[\/\s]\d{1,2})/).test((s || '').replace(/\s+/g,' ').replace(/[\-.,]/g, '/'));
|
1934
1944
|
},
|
1935
1945
|
format: function(s, table, cell, cellIndex) {
|
1936
1946
|
if (s) {
|
1937
1947
|
var date, d,
|
1938
1948
|
c = table.config,
|
1939
|
-
ci = c.$headers.filter('[data-column=' + cellIndex + ']:last'),
|
1949
|
+
ci = c.$headers.filter('[data-column="' + cellIndex + '"]:last'),
|
1940
1950
|
format = ci.length && ci[0].dateFormat || ts.getData( ci, ts.getColumnData( table, c.headers, cellIndex ), 'dateFormat') || c.dateFormat;
|
1941
|
-
d = s.replace(/\s+/g,
|
1942
|
-
if (format ===
|
1943
|
-
d = d.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/,
|
1944
|
-
} else if (format ===
|
1945
|
-
d = d.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/,
|
1946
|
-
} else if (format ===
|
1947
|
-
d = d.replace(/(\d{4})[\/\s](\d{1,2})[\/\s](\d{1,2})/,
|
1951
|
+
d = s.replace(/\s+/g, ' ').replace(/[\-.,]/g, '/'); // escaped - because JSHint in Firefox was showing it as an error
|
1952
|
+
if (format === 'mmddyyyy') {
|
1953
|
+
d = d.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/, '$3/$1/$2');
|
1954
|
+
} else if (format === 'ddmmyyyy') {
|
1955
|
+
d = d.replace(/(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{4})/, '$3/$2/$1');
|
1956
|
+
} else if (format === 'yyyymmdd') {
|
1957
|
+
d = d.replace(/(\d{4})[\/\s](\d{1,2})[\/\s](\d{1,2})/, '$1/$2/$3');
|
1948
1958
|
}
|
1949
1959
|
date = new Date(d);
|
1950
1960
|
return date instanceof Date && isFinite(date) ? date.getTime() : s;
|
1951
1961
|
}
|
1952
1962
|
return s;
|
1953
1963
|
},
|
1954
|
-
type:
|
1964
|
+
type: 'numeric'
|
1955
1965
|
});
|
1956
1966
|
|
1957
1967
|
ts.addParser({
|
1958
|
-
id:
|
1968
|
+
id: 'time',
|
1959
1969
|
is: function(s) {
|
1960
1970
|
return (/^(([0-2]?\d:[0-5]\d)|([0-1]?\d:[0-5]\d\s?([AP]M)))$/i).test(s);
|
1961
1971
|
},
|
1962
1972
|
format: function(s, table) {
|
1963
|
-
var date = s ? new Date(
|
1973
|
+
var date = s ? new Date( '2000/01/01 ' + s.replace(/(\S)([AP]M)$/i, '$1 $2') ) : s;
|
1964
1974
|
return date instanceof Date && isFinite(date) ? date.getTime() : s;
|
1965
1975
|
},
|
1966
|
-
type:
|
1976
|
+
type: 'numeric'
|
1967
1977
|
});
|
1968
1978
|
|
1969
1979
|
ts.addParser({
|
1970
|
-
id:
|
1980
|
+
id: 'metadata',
|
1971
1981
|
is: function() {
|
1972
1982
|
return false;
|
1973
1983
|
},
|
@@ -1976,12 +1986,12 @@
|
|
1976
1986
|
p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName;
|
1977
1987
|
return $(cell).metadata()[p];
|
1978
1988
|
},
|
1979
|
-
type:
|
1989
|
+
type: 'numeric'
|
1980
1990
|
});
|
1981
1991
|
|
1982
1992
|
// add default widgets
|
1983
1993
|
ts.addWidget({
|
1984
|
-
id:
|
1994
|
+
id: 'zebra',
|
1985
1995
|
priority: 90,
|
1986
1996
|
format: function(table, c, wo) {
|
1987
1997
|
var $tb, $tv, $tr, row, even, time, k,
|
@@ -2010,7 +2020,7 @@
|
|
2010
2020
|
if (refreshing) { return; }
|
2011
2021
|
var k, $tb,
|
2012
2022
|
b = c.$tbodies,
|
2013
|
-
rmv = (wo.zebra || [
|
2023
|
+
rmv = (wo.zebra || [ 'even', 'odd' ]).join(' ');
|
2014
2024
|
for (k = 0; k < b.length; k++ ){
|
2015
2025
|
$tb = ts.processTbody(table, b.eq(k), true); // remove tbody
|
2016
2026
|
$tb.children().removeClass(rmv);
|