jquery-tablesorter 1.17.2 → 1.17.3
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 +76 -71
- data/vendor/assets/javascripts/jquery-tablesorter/extras/jquery.dragtable.mod.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.combined.js +2647 -2576
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +174 -119
- data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.widgets.js +2487 -2471
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-extract.js +15 -15
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-iso8601.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-month.js +4 -4
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-range.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-two-digit-year.js +12 -12
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-weekday.js +4 -4
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-duration.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-feet-inch-fraction.js +6 -6
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-file-type.js +22 -22
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-globalize.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-ignore-articles.js +15 -15
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-image.js +3 -3
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +10 -3
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-metric.js +2 -2
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-named-numbers.js +3 -3
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-network.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-roman.js +4 -4
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-alignChar.js +122 -121
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-build-table.js +13 -13
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-chart.js +2 -2
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columnSelector.js +324 -324
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columns.js +60 -60
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js +219 -219
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-html5.js +360 -361
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-jui.js +666 -666
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-formatter-select2.js +124 -124
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter-type-insideRange.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-filter.js +1448 -1433
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-formatter.js +1 -1
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-grouping.js +213 -213
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-headerTitles.js +3 -3
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-math.js +271 -216
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-output.js +339 -320
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +1057 -1045
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-print.js +109 -109
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-reflow.js +114 -115
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-resizable.js +360 -359
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-saveSort.js +59 -59
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js +818 -806
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-sort2Hash.js +128 -0
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-sortTbodies.js +195 -195
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-staticRow.js +90 -90
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-stickyHeaders.js +257 -257
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-storage.js +76 -76
- data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-uitheme.js +170 -170
- metadata +3 -3
- data/vendor/assets/javascripts/jquery-tablesorter/extras/jquery.quicksearch.js +0 -195
@@ -10,755 +10,755 @@
|
|
10
10
|
/*jshint browser:true, jquery:true, unused:false */
|
11
11
|
/*global jQuery: false */
|
12
12
|
;(function($){
|
13
|
-
|
13
|
+
'use strict';
|
14
14
|
|
15
|
-
var ts = $.tablesorter || {},
|
15
|
+
var ts = $.tablesorter || {},
|
16
16
|
|
17
|
-
// compare option selector class name (jQuery selector)
|
18
|
-
compareSelect = '.compare-select',
|
17
|
+
// compare option selector class name (jQuery selector)
|
18
|
+
compareSelect = '.compare-select',
|
19
19
|
|
20
|
-
tsff = ts.filterFormatter = $.extend( {}, ts.filterFormatter, {
|
20
|
+
tsff = ts.filterFormatter = $.extend( {}, ts.filterFormatter, {
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
}
|
36
|
-
},
|
37
|
-
|
38
|
-
updateCompare : function($cell, $input, o) {
|
39
|
-
var val = $input.val() || '',
|
40
|
-
num = val.replace(/\s*?[><=]\s*?/g, ''),
|
41
|
-
compare = val.match(/[><=]/g) || '';
|
42
|
-
if (o.compare) {
|
43
|
-
if ($.isArray(o.compare)){
|
44
|
-
compare = (compare || []).join('') || o.compare[o.selected || 0];
|
45
|
-
}
|
46
|
-
$cell.find(compareSelect).val( compare );
|
47
|
-
}
|
48
|
-
return [ val, num ];
|
49
|
-
},
|
50
|
-
|
51
|
-
/**********************\
|
52
|
-
jQuery UI Spinner
|
53
|
-
\**********************/
|
54
|
-
uiSpinner: function($cell, indx, spinnerDef) {
|
55
|
-
var o = $.extend({
|
56
|
-
// filter formatter options
|
57
|
-
delayed : true,
|
58
|
-
addToggle : true,
|
59
|
-
exactMatch : true,
|
60
|
-
value : 1,
|
61
|
-
cellText : '',
|
62
|
-
compare : '',
|
63
|
-
// include ANY jQuery UI spinner options below
|
64
|
-
min : 0,
|
65
|
-
max : 100,
|
66
|
-
step : 1,
|
67
|
-
disabled : false
|
68
|
-
|
69
|
-
}, spinnerDef ),
|
70
|
-
c = $cell.closest('table')[0].config,
|
71
|
-
// Add a hidden input to hold the range values
|
72
|
-
$input = $('<input class="filter" type="hidden">')
|
73
|
-
.appendTo($cell)
|
74
|
-
// hidden filter update namespace trigger by filter widget
|
75
|
-
.bind('change' + c.namespace + 'filter', function(){
|
76
|
-
updateSpinner({ value: this.value, delayed: false });
|
77
|
-
}),
|
78
|
-
$shcell = [],
|
79
|
-
|
80
|
-
// this function updates the hidden input and adds the current values to the header cell text
|
81
|
-
updateSpinner = function(ui, notrigger) {
|
82
|
-
var chkd = true, state,
|
83
|
-
// ui is not undefined on create
|
84
|
-
v = ui && ui.value && ts.formatFloat((ui.value + '').replace(/[><=]/g,'')) ||
|
85
|
-
$cell.find('.spinner').val() || o.value,
|
86
|
-
compare = ($.isArray(o.compare) ? $cell.find(compareSelect).val() || o.compare[ o.selected || 0] : o.compare) || '',
|
87
|
-
searchType = ui && typeof ui.delayed === 'boolean' ? ui.delayed : c.$table[0].hasInitialized ? o.delayed || '' : true;
|
88
|
-
if (o.addToggle) {
|
89
|
-
chkd = $cell.find('.toggle').is(':checked');
|
22
|
+
addCompare: function($cell, indx, options){
|
23
|
+
if (options.compare && $.isArray(options.compare) && options.compare.length > 1) {
|
24
|
+
var opt = '',
|
25
|
+
compareSelectClass = [ compareSelect.slice(1), ' ' + compareSelect.slice(1), '' ],
|
26
|
+
txt = options.cellText ? '<label class="' + compareSelectClass.join('-label') + indx + '">' + options.cellText + '</label>' : '';
|
27
|
+
$.each(options.compare, function(i, c){
|
28
|
+
opt += '<option ' + (options.selected === i ? 'selected' : '') + '>' + c + '</option>';
|
29
|
+
});
|
30
|
+
$cell
|
31
|
+
.wrapInner('<div class="' + compareSelectClass.join('-wrapper') + indx + '" />')
|
32
|
+
.prepend( txt + '<select class="' + compareSelectClass.join('') + indx + '" />' )
|
33
|
+
.find('select')
|
34
|
+
.append(opt);
|
90
35
|
}
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
.
|
96
|
-
.
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
.find('.spinner').spinner(state).val(v).end()
|
101
|
-
.find(compareSelect).val( compare );
|
102
|
-
if (o.addToggle) {
|
103
|
-
$shcell.find('.toggle')[0].checked = chkd;
|
36
|
+
},
|
37
|
+
|
38
|
+
updateCompare : function($cell, $input, o) {
|
39
|
+
var val = $input.val() || '',
|
40
|
+
num = val.replace(/\s*?[><=]\s*?/g, ''),
|
41
|
+
compare = val.match(/[><=]/g) || '';
|
42
|
+
if (o.compare) {
|
43
|
+
if ($.isArray(o.compare)){
|
44
|
+
compare = (compare || []).join('') || o.compare[o.selected || 0];
|
104
45
|
}
|
46
|
+
$cell.find(compareSelect).val( compare );
|
105
47
|
}
|
106
|
-
|
107
|
-
|
108
|
-
// add callbacks; preserve added callbacks
|
109
|
-
o.oldcreate = o.create;
|
110
|
-
o.oldspin = o.spin;
|
111
|
-
o.create = function(event, ui) {
|
112
|
-
updateSpinner(); // ui is an empty object on create
|
113
|
-
if (typeof o.oldcreate === 'function') { o.oldcreate(event, ui); }
|
114
|
-
};
|
115
|
-
o.spin = function(event, ui) {
|
116
|
-
updateSpinner(ui);
|
117
|
-
if (typeof o.oldspin === 'function') { o.oldspin(event, ui); }
|
118
|
-
};
|
119
|
-
if (o.addToggle) {
|
120
|
-
$('<div class="button"><input id="uispinnerbutton' + indx + '" type="checkbox" class="toggle" />' +
|
121
|
-
'<label for="uispinnerbutton' + indx + '"></label></div>')
|
122
|
-
.appendTo($cell)
|
123
|
-
.find('.toggle')
|
124
|
-
.bind('change', function(){
|
125
|
-
updateSpinner();
|
126
|
-
});
|
127
|
-
}
|
128
|
-
// make sure we use parsed data
|
129
|
-
$cell.closest('thead').find('th[data-column=' + indx + ']').addClass('filter-parsed');
|
130
|
-
// add a jQuery UI spinner!
|
131
|
-
$('<input class="spinner spinner' + indx + '" />')
|
132
|
-
.val(o.value)
|
133
|
-
.appendTo($cell)
|
134
|
-
.spinner(o)
|
135
|
-
.bind('change keyup', function(){
|
136
|
-
updateSpinner();
|
137
|
-
});
|
138
|
-
|
139
|
-
// update spinner from hidden input, in case of saved filters
|
140
|
-
c.$table.bind('filterFomatterUpdate', function(){
|
141
|
-
var val = tsff.updateCompare($cell, $input, o)[0];
|
142
|
-
$cell.find('.spinner').val( val );
|
143
|
-
updateSpinner({ value: val }, true);
|
144
|
-
ts.filter.formatterUpdated($cell, indx);
|
145
|
-
});
|
146
|
-
|
147
|
-
if (o.compare) {
|
148
|
-
// add compare select
|
149
|
-
tsff.addCompare($cell, indx, o);
|
150
|
-
$cell.find(compareSelect).bind('change', function(){
|
151
|
-
updateSpinner();
|
152
|
-
});
|
153
|
-
}
|
48
|
+
return [ val, num ];
|
49
|
+
},
|
154
50
|
|
155
|
-
|
156
|
-
|
157
|
-
|
51
|
+
/**********************\
|
52
|
+
jQuery UI Spinner
|
53
|
+
\**********************/
|
54
|
+
uiSpinner: function($cell, indx, spinnerDef) {
|
55
|
+
var o = $.extend({
|
56
|
+
// filter formatter options
|
57
|
+
delayed : true,
|
58
|
+
addToggle : true,
|
59
|
+
exactMatch : true,
|
60
|
+
value : 1,
|
61
|
+
cellText : '',
|
62
|
+
compare : '',
|
63
|
+
// include ANY jQuery UI spinner options below
|
64
|
+
min : 0,
|
65
|
+
max : 100,
|
66
|
+
step : 1,
|
67
|
+
disabled : false
|
68
|
+
|
69
|
+
}, spinnerDef ),
|
70
|
+
c = $cell.closest('table')[0].config,
|
71
|
+
// Add a hidden input to hold the range values
|
72
|
+
$input = $('<input class="filter" type="hidden">')
|
73
|
+
.appendTo($cell)
|
74
|
+
// hidden filter update namespace trigger by filter widget
|
75
|
+
.bind('change' + c.namespace + 'filter', function(){
|
76
|
+
updateSpinner({ value: this.value, delayed: false });
|
77
|
+
}),
|
78
|
+
$shcell = [],
|
79
|
+
|
80
|
+
// this function updates the hidden input and adds the current values to the header cell text
|
81
|
+
updateSpinner = function(ui, notrigger) {
|
82
|
+
var chkd = true, state,
|
83
|
+
// ui is not undefined on create
|
84
|
+
v = ui && ui.value && ts.formatFloat((ui.value + '').replace(/[><=]/g, '')) ||
|
85
|
+
$cell.find('.spinner').val() || o.value,
|
86
|
+
compare = ($.isArray(o.compare) ? $cell.find(compareSelect).val() || o.compare[ o.selected || 0] : o.compare) || '',
|
87
|
+
searchType = ui && typeof ui.delayed === 'boolean' ? ui.delayed : c.$table[0].hasInitialized ? o.delayed || '' : true;
|
88
|
+
if (o.addToggle) {
|
89
|
+
chkd = $cell.find('.toggle').is(':checked');
|
90
|
+
}
|
91
|
+
state = o.disabled || !chkd ? 'disable' : 'enable';
|
92
|
+
$cell.find('.filter')
|
93
|
+
// add equal to the beginning, so we filter exact numbers
|
94
|
+
.val( chkd ? (compare ? compare : o.exactMatch ? '=' : '') + v : '' )
|
95
|
+
.trigger( notrigger ? '' : 'search', searchType ).end()
|
96
|
+
.find('.spinner').spinner(state).val(v);
|
97
|
+
// update sticky header cell
|
98
|
+
if ($shcell.length) {
|
99
|
+
$shcell
|
100
|
+
.find('.spinner').spinner(state).val(v).end()
|
101
|
+
.find(compareSelect).val( compare );
|
102
|
+
if (o.addToggle) {
|
103
|
+
$shcell.find('.toggle')[0].checked = chkd;
|
104
|
+
}
|
105
|
+
}
|
106
|
+
};
|
107
|
+
|
108
|
+
// add callbacks; preserve added callbacks
|
109
|
+
o.oldcreate = o.create;
|
110
|
+
o.oldspin = o.spin;
|
111
|
+
o.create = function(event, ui) {
|
112
|
+
updateSpinner(); // ui is an empty object on create
|
113
|
+
if (typeof o.oldcreate === 'function') { o.oldcreate(event, ui); }
|
114
|
+
};
|
115
|
+
o.spin = function(event, ui) {
|
116
|
+
updateSpinner(ui);
|
117
|
+
if (typeof o.oldspin === 'function') { o.oldspin(event, ui); }
|
118
|
+
};
|
158
119
|
if (o.addToggle) {
|
159
|
-
$('<div class="button"><input id="
|
160
|
-
'<label for="
|
161
|
-
.appendTo($
|
120
|
+
$('<div class="button"><input id="uispinnerbutton' + indx + '" type="checkbox" class="toggle" />' +
|
121
|
+
'<label for="uispinnerbutton' + indx + '"></label></div>')
|
122
|
+
.appendTo($cell)
|
162
123
|
.find('.toggle')
|
163
124
|
.bind('change', function(){
|
164
|
-
$cell.find('.toggle')[0].checked = this.checked;
|
165
125
|
updateSpinner();
|
166
126
|
});
|
167
127
|
}
|
128
|
+
// make sure we use parsed data
|
129
|
+
$cell.closest('thead').find('th[data-column=' + indx + ']').addClass('filter-parsed');
|
168
130
|
// add a jQuery UI spinner!
|
169
131
|
$('<input class="spinner spinner' + indx + '" />')
|
170
132
|
.val(o.value)
|
171
|
-
.appendTo($
|
133
|
+
.appendTo($cell)
|
172
134
|
.spinner(o)
|
173
135
|
.bind('change keyup', function(){
|
174
|
-
$cell.find('.spinner').val( this.value );
|
175
136
|
updateSpinner();
|
176
137
|
});
|
177
138
|
|
139
|
+
// update spinner from hidden input, in case of saved filters
|
140
|
+
c.$table.bind('filterFomatterUpdate', function(){
|
141
|
+
var val = tsff.updateCompare($cell, $input, o)[0];
|
142
|
+
$cell.find('.spinner').val( val );
|
143
|
+
updateSpinner({ value: val }, true);
|
144
|
+
ts.filter.formatterUpdated($cell, indx);
|
145
|
+
});
|
146
|
+
|
178
147
|
if (o.compare) {
|
179
148
|
// add compare select
|
180
|
-
tsff.addCompare($
|
181
|
-
$
|
182
|
-
$cell.find(compareSelect).val( $(this).val() );
|
149
|
+
tsff.addCompare($cell, indx, o);
|
150
|
+
$cell.find(compareSelect).bind('change', function(){
|
183
151
|
updateSpinner();
|
184
152
|
});
|
185
153
|
}
|
186
154
|
|
187
|
-
|
155
|
+
// has sticky headers?
|
156
|
+
c.$table.bind('stickyHeadersInit', function(){
|
157
|
+
$shcell = c.widgetOptions.$sticky.find('.tablesorter-filter-row').children().eq(indx).empty();
|
158
|
+
if (o.addToggle) {
|
159
|
+
$('<div class="button"><input id="stickyuispinnerbutton' + indx + '" type="checkbox" class="toggle" />' +
|
160
|
+
'<label for="stickyuispinnerbutton' + indx + '"></label></div>')
|
161
|
+
.appendTo($shcell)
|
162
|
+
.find('.toggle')
|
163
|
+
.bind('change', function(){
|
164
|
+
$cell.find('.toggle')[0].checked = this.checked;
|
165
|
+
updateSpinner();
|
166
|
+
});
|
167
|
+
}
|
168
|
+
// add a jQuery UI spinner!
|
169
|
+
$('<input class="spinner spinner' + indx + '" />')
|
170
|
+
.val(o.value)
|
171
|
+
.appendTo($shcell)
|
172
|
+
.spinner(o)
|
173
|
+
.bind('change keyup', function(){
|
174
|
+
$cell.find('.spinner').val( this.value );
|
175
|
+
updateSpinner();
|
176
|
+
});
|
188
177
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
}
|
198
|
-
$cell.find('.spinner').spinner('value', o.value);
|
199
|
-
setTimeout(function(){
|
200
|
-
updateSpinner();
|
201
|
-
}, 0);
|
202
|
-
});
|
203
|
-
|
204
|
-
updateSpinner();
|
205
|
-
return $input;
|
206
|
-
},
|
207
|
-
|
208
|
-
/**********************\
|
209
|
-
jQuery UI Slider
|
210
|
-
\**********************/
|
211
|
-
uiSlider: function($cell, indx, sliderDef) {
|
212
|
-
var o = $.extend({
|
213
|
-
// filter formatter options
|
214
|
-
delayed : true,
|
215
|
-
valueToHeader : false,
|
216
|
-
exactMatch : true,
|
217
|
-
cellText : '',
|
218
|
-
compare : '',
|
219
|
-
allText : 'all',
|
220
|
-
// include ANY jQuery UI spinner options below
|
221
|
-
// except values, since this is a non-range setup
|
222
|
-
value : 0,
|
223
|
-
min : 0,
|
224
|
-
max : 100,
|
225
|
-
step : 1,
|
226
|
-
range : "min"
|
227
|
-
}, sliderDef ),
|
228
|
-
c = $cell.closest('table')[0].config,
|
229
|
-
// Add a hidden input to hold the range values
|
230
|
-
$input = $('<input class="filter" type="hidden">')
|
231
|
-
.appendTo($cell)
|
232
|
-
// hidden filter update namespace trigger by filter widget
|
233
|
-
.bind('change' + c.namespace + 'filter', function(){
|
234
|
-
updateSlider({ value: this.value });
|
235
|
-
}),
|
236
|
-
$shcell = [],
|
237
|
-
|
238
|
-
// this function updates the hidden input and adds the current values to the header cell text
|
239
|
-
updateSlider = function(ui, notrigger) {
|
240
|
-
// ui is not undefined on create
|
241
|
-
var v = typeof ui !== "undefined" ? ts.formatFloat((ui.value + '').replace(/[><=]/g,'')) || o.value : o.value,
|
242
|
-
val = o.compare ? v : v === o.min ? o.allText : v,
|
243
|
-
compare = ($.isArray(o.compare) ? $cell.find(compareSelect).val() || o.compare[ o.selected || 0] : o.compare) || '',
|
244
|
-
result = compare + val,
|
245
|
-
searchType = ui && typeof ui.delayed === 'boolean' ? ui.delayed : c.$table[0].hasInitialized ? o.delayed || '' : true;
|
246
|
-
if (o.valueToHeader) {
|
247
|
-
// add range indication to the header cell above!
|
248
|
-
$cell.closest('thead').find('th[data-column=' + indx + ']').find('.curvalue').html(' (' + result + ')');
|
249
|
-
} else {
|
250
|
-
// add values to the handle data-value attribute so the css tooltip will work properly
|
251
|
-
$cell.find('.ui-slider-handle').addClass('value-popup').attr('data-value', result);
|
252
|
-
}
|
253
|
-
// update the hidden input;
|
254
|
-
// ****** ADD AN EQUAL SIGN TO THE BEGINNING! <- this makes the slide exactly match the number ******
|
255
|
-
// when the value is at the minimum, clear the hidden input so all rows will be seen
|
178
|
+
if (o.compare) {
|
179
|
+
// add compare select
|
180
|
+
tsff.addCompare($shcell, indx, o);
|
181
|
+
$shcell.find(compareSelect).bind('change', function(){
|
182
|
+
$cell.find(compareSelect).val( $(this).val() );
|
183
|
+
updateSpinner();
|
184
|
+
});
|
185
|
+
}
|
256
186
|
|
257
|
-
|
258
|
-
.val( ( compare ? compare + v : v === o.min ? '' : (o.exactMatch ? '=' : '') + v ) )
|
259
|
-
.trigger( notrigger ? '' : 'search', searchType ).end()
|
260
|
-
.find('.slider').slider('value', v);
|
187
|
+
});
|
261
188
|
|
262
|
-
//
|
263
|
-
|
264
|
-
|
265
|
-
.find(compareSelect).val( compare
|
266
|
-
|
189
|
+
// on reset
|
190
|
+
c.$table.bind('filterReset', function(){
|
191
|
+
if ($.isArray(o.compare)) {
|
192
|
+
$cell.add($shcell).find(compareSelect).val( o.compare[ o.selected || 0 ] );
|
193
|
+
}
|
194
|
+
// turn off the toggle checkbox
|
195
|
+
if (o.addToggle) {
|
196
|
+
$cell.find('.toggle')[0].checked = false;
|
197
|
+
}
|
198
|
+
$cell.find('.spinner').spinner('value', o.value);
|
199
|
+
setTimeout(function(){
|
200
|
+
updateSpinner();
|
201
|
+
}, 0);
|
202
|
+
});
|
203
|
+
|
204
|
+
updateSpinner();
|
205
|
+
return $input;
|
206
|
+
},
|
207
|
+
|
208
|
+
/**********************\
|
209
|
+
jQuery UI Slider
|
210
|
+
\**********************/
|
211
|
+
uiSlider: function($cell, indx, sliderDef) {
|
212
|
+
var o = $.extend({
|
213
|
+
// filter formatter options
|
214
|
+
delayed : true,
|
215
|
+
valueToHeader : false,
|
216
|
+
exactMatch : true,
|
217
|
+
cellText : '',
|
218
|
+
compare : '',
|
219
|
+
allText : 'all',
|
220
|
+
// include ANY jQuery UI spinner options below
|
221
|
+
// except values, since this is a non-range setup
|
222
|
+
value : 0,
|
223
|
+
min : 0,
|
224
|
+
max : 100,
|
225
|
+
step : 1,
|
226
|
+
range : 'min'
|
227
|
+
}, sliderDef ),
|
228
|
+
c = $cell.closest('table')[0].config,
|
229
|
+
// Add a hidden input to hold the range values
|
230
|
+
$input = $('<input class="filter" type="hidden">')
|
231
|
+
.appendTo($cell)
|
232
|
+
// hidden filter update namespace trigger by filter widget
|
233
|
+
.bind('change' + c.namespace + 'filter', function(){
|
234
|
+
updateSlider({ value: this.value });
|
235
|
+
}),
|
236
|
+
$shcell = [],
|
237
|
+
|
238
|
+
// this function updates the hidden input and adds the current values to the header cell text
|
239
|
+
updateSlider = function(ui, notrigger) {
|
240
|
+
// ui is not undefined on create
|
241
|
+
var v = typeof ui !== 'undefined' ? ts.formatFloat((ui.value + '').replace(/[><=]/g, '')) || o.value : o.value,
|
242
|
+
val = o.compare ? v : v === o.min ? o.allText : v,
|
243
|
+
compare = ($.isArray(o.compare) ? $cell.find(compareSelect).val() || o.compare[ o.selected || 0] : o.compare) || '',
|
244
|
+
result = compare + val,
|
245
|
+
searchType = ui && typeof ui.delayed === 'boolean' ? ui.delayed : c.$table[0].hasInitialized ? o.delayed || '' : true;
|
267
246
|
if (o.valueToHeader) {
|
268
|
-
|
247
|
+
// add range indication to the header cell above!
|
248
|
+
$cell.closest('thead').find('th[data-column=' + indx + ']').find('.curvalue').html(' (' + result + ')');
|
269
249
|
} else {
|
270
|
-
|
250
|
+
// add values to the handle data-value attribute so the css tooltip will work properly
|
251
|
+
$cell.find('.ui-slider-handle').addClass('value-popup').attr('data-value', result);
|
271
252
|
}
|
272
|
-
|
253
|
+
// update the hidden input;
|
254
|
+
// ****** ADD AN EQUAL SIGN TO THE BEGINNING! <- this makes the slide exactly match the number ******
|
255
|
+
// when the value is at the minimum, clear the hidden input so all rows will be seen
|
273
256
|
|
274
|
-
|
275
|
-
|
257
|
+
$cell.find('.filter')
|
258
|
+
.val( ( compare ? compare + v : v === o.min ? '' : (o.exactMatch ? '=' : '') + v ) )
|
259
|
+
.trigger( notrigger ? '' : 'search', searchType ).end()
|
260
|
+
.find('.slider').slider('value', v);
|
276
261
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
262
|
+
// update sticky header cell
|
263
|
+
if ($shcell.length) {
|
264
|
+
$shcell
|
265
|
+
.find(compareSelect).val( compare ).end()
|
266
|
+
.find('.slider').slider('value', v);
|
267
|
+
if (o.valueToHeader) {
|
268
|
+
$shcell.closest('thead').find('th[data-column=' + indx + ']').find('.curvalue').html(' (' + result + ')');
|
269
|
+
} else {
|
270
|
+
$shcell.find('.ui-slider-handle').addClass('value-popup').attr('data-value', result);
|
271
|
+
}
|
272
|
+
}
|
281
273
|
|
282
|
-
|
283
|
-
|
284
|
-
o.oldslide = o.slide;
|
285
|
-
o.create = function(event, ui) {
|
286
|
-
updateSlider(); // ui is an empty object on create
|
287
|
-
if (typeof o.oldcreate === 'function') { o.oldcreate(event, ui); }
|
288
|
-
};
|
289
|
-
o.slide = function(event, ui) {
|
290
|
-
updateSlider(ui);
|
291
|
-
if (typeof o.oldslide === 'function') { o.oldslide(event, ui); }
|
292
|
-
};
|
293
|
-
// add a jQuery UI slider!
|
294
|
-
$('<div class="slider slider' + indx + '"/>')
|
295
|
-
.appendTo($cell)
|
296
|
-
.slider(o);
|
297
|
-
|
298
|
-
// update slider from hidden input, in case of saved filters
|
299
|
-
c.$table.bind('filterFomatterUpdate', function(){
|
300
|
-
var val = tsff.updateCompare($cell, $input, o)[0];
|
301
|
-
$cell.find('.slider').slider('value', val );
|
302
|
-
updateSlider({ value: val }, false);
|
303
|
-
ts.filter.formatterUpdated($cell, indx);
|
304
|
-
});
|
305
|
-
|
306
|
-
if (o.compare) {
|
307
|
-
// add compare select
|
308
|
-
tsff.addCompare($cell, indx, o);
|
309
|
-
$cell.find(compareSelect).bind('change', function(){
|
310
|
-
updateSlider({ value: $cell.find('.slider').slider('value') });
|
311
|
-
});
|
312
|
-
}
|
274
|
+
};
|
275
|
+
$cell.closest('thead').find('th[data-column=' + indx + ']').addClass('filter-parsed');
|
313
276
|
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
$cell.add($shcell).find(compareSelect).val( o.compare[ o.selected || 0 ] );
|
277
|
+
// add span to header for value - only works if the line in the updateSlider() function is also un-commented out
|
278
|
+
if (o.valueToHeader) {
|
279
|
+
$cell.closest('thead').find('th[data-column=' + indx + ']').find('.tablesorter-header-inner').append('<span class="curvalue" />');
|
318
280
|
}
|
319
|
-
setTimeout(function(){
|
320
|
-
updateSlider({ value: o.value });
|
321
|
-
}, 0);
|
322
|
-
});
|
323
|
-
|
324
|
-
// has sticky headers?
|
325
|
-
c.$table.bind('stickyHeadersInit', function(){
|
326
|
-
$shcell = c.widgetOptions.$sticky.find('.tablesorter-filter-row').children().eq(indx).empty();
|
327
281
|
|
282
|
+
// add callbacks; preserve added callbacks
|
283
|
+
o.oldcreate = o.create;
|
284
|
+
o.oldslide = o.slide;
|
285
|
+
o.create = function(event, ui) {
|
286
|
+
updateSlider(); // ui is an empty object on create
|
287
|
+
if (typeof o.oldcreate === 'function') { o.oldcreate(event, ui); }
|
288
|
+
};
|
289
|
+
o.slide = function(event, ui) {
|
290
|
+
updateSlider(ui);
|
291
|
+
if (typeof o.oldslide === 'function') { o.oldslide(event, ui); }
|
292
|
+
};
|
328
293
|
// add a jQuery UI slider!
|
329
294
|
$('<div class="slider slider' + indx + '"/>')
|
330
|
-
.
|
331
|
-
.
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
295
|
+
.appendTo($cell)
|
296
|
+
.slider(o);
|
297
|
+
|
298
|
+
// update slider from hidden input, in case of saved filters
|
299
|
+
c.$table.bind('filterFomatterUpdate', function(){
|
300
|
+
var val = tsff.updateCompare($cell, $input, o)[0];
|
301
|
+
$cell.find('.slider').slider('value', val );
|
302
|
+
updateSlider({ value: val }, false);
|
303
|
+
ts.filter.formatterUpdated($cell, indx);
|
304
|
+
});
|
337
305
|
|
338
306
|
if (o.compare) {
|
339
307
|
// add compare select
|
340
|
-
tsff.addCompare($
|
341
|
-
$
|
342
|
-
$cell.find(
|
343
|
-
updateSlider();
|
308
|
+
tsff.addCompare($cell, indx, o);
|
309
|
+
$cell.find(compareSelect).bind('change', function(){
|
310
|
+
updateSlider({ value: $cell.find('.slider').slider('value') });
|
344
311
|
});
|
345
312
|
}
|
346
313
|
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
//
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
}
|
314
|
+
// on reset
|
315
|
+
c.$table.bind('filterReset', function(){
|
316
|
+
if ($.isArray(o.compare)) {
|
317
|
+
$cell.add($shcell).find(compareSelect).val( o.compare[ o.selected || 0 ] );
|
318
|
+
}
|
319
|
+
setTimeout(function(){
|
320
|
+
updateSlider({ value: o.value });
|
321
|
+
}, 0);
|
322
|
+
});
|
323
|
+
|
324
|
+
// has sticky headers?
|
325
|
+
c.$table.bind('stickyHeadersInit', function(){
|
326
|
+
$shcell = c.widgetOptions.$sticky.find('.tablesorter-filter-row').children().eq(indx).empty();
|
327
|
+
|
328
|
+
// add a jQuery UI slider!
|
329
|
+
$('<div class="slider slider' + indx + '"/>')
|
330
|
+
.val(o.value)
|
331
|
+
.appendTo($shcell)
|
332
|
+
.slider(o)
|
333
|
+
.bind('change keyup', function(){
|
334
|
+
$cell.find('.slider').slider('value', this.value );
|
335
|
+
updateSlider();
|
336
|
+
});
|
337
|
+
|
338
|
+
if (o.compare) {
|
339
|
+
// add compare select
|
340
|
+
tsff.addCompare($shcell, indx, o);
|
341
|
+
$shcell.find(compareSelect).bind('change', function(){
|
342
|
+
$cell.find(compareSelect).val( $(this).val() );
|
343
|
+
updateSlider();
|
344
|
+
});
|
345
|
+
}
|
346
|
+
|
347
|
+
});
|
348
|
+
|
349
|
+
return $input;
|
384
350
|
},
|
385
351
|
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
//
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
//
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
.
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
352
|
+
/*************************\
|
353
|
+
jQuery UI Range Slider (2 handles)
|
354
|
+
\*************************/
|
355
|
+
uiRange: function($cell, indx, rangeDef) {
|
356
|
+
var o = $.extend({
|
357
|
+
// filter formatter options
|
358
|
+
delayed : true,
|
359
|
+
valueToHeader : false,
|
360
|
+
// include ANY jQuery UI spinner options below
|
361
|
+
// except value, since this one is range specific)
|
362
|
+
values : [ 0, 100 ],
|
363
|
+
min : 0,
|
364
|
+
max : 100,
|
365
|
+
range : true
|
366
|
+
}, rangeDef ),
|
367
|
+
c = $cell.closest('table')[0].config,
|
368
|
+
// Add a hidden input to hold the range values
|
369
|
+
$input = $('<input class="filter" type="hidden">')
|
370
|
+
.appendTo($cell)
|
371
|
+
// hidden filter update namespace trigger by filter widget
|
372
|
+
.bind('change' + c.namespace + 'filter', function(){
|
373
|
+
getRange();
|
374
|
+
}),
|
375
|
+
$shcell = [],
|
376
|
+
|
377
|
+
getRange = function(){
|
378
|
+
var val = $input.val(),
|
379
|
+
v = val.split(' - ');
|
380
|
+
if (val === '') { v = [ o.min, o.max ]; }
|
381
|
+
if (v && v[1]) {
|
382
|
+
updateUiRange({ values: v, delay: false }, true);
|
383
|
+
}
|
384
|
+
},
|
385
|
+
|
386
|
+
// this function updates the hidden input and adds the current values to the header cell text
|
387
|
+
updateUiRange = function(ui, notrigger) {
|
388
|
+
// ui.values are undefined for some reason on create
|
389
|
+
var val = ui && ui.values || o.values,
|
390
|
+
result = val[0] + ' - ' + val[1],
|
391
|
+
// make range an empty string if entire range is covered so the filter row will hide (if set)
|
392
|
+
range = val[0] === o.min && val[1] === o.max ? '' : result,
|
393
|
+
searchType = ui && typeof ui.delayed === 'boolean' ? ui.delayed : c.$table[0].hasInitialized ? o.delayed || '' : true;
|
411
394
|
if (o.valueToHeader) {
|
412
|
-
|
395
|
+
// add range indication to the header cell above (if not using the css method)!
|
396
|
+
$cell.closest('thead').find('th[data-column=' + indx + ']').find('.currange').html(' (' + result + ')');
|
413
397
|
} else {
|
414
|
-
|
415
|
-
.
|
416
|
-
|
417
|
-
|
398
|
+
// add values to the handle data-value attribute so the css tooltip will work properly
|
399
|
+
$cell.find('.ui-slider-handle')
|
400
|
+
.addClass('value-popup')
|
401
|
+
.eq(0).attr('data-value', val[0]).end() // adding value to data attribute
|
402
|
+
.eq(1).attr('data-value', val[1]); // value popup shown via css
|
403
|
+
}
|
404
|
+
// update the hidden input
|
405
|
+
$cell.find('.filter').val(range)
|
406
|
+
.trigger(notrigger ? '' : 'search', searchType).end()
|
407
|
+
.find('.range').slider('values', val);
|
408
|
+
// update sticky header cell
|
409
|
+
if ($shcell.length) {
|
410
|
+
$shcell.find('.range').slider('values', val);
|
411
|
+
if (o.valueToHeader) {
|
412
|
+
$shcell.closest('thead').find('th[data-column=' + indx + ']').find('.currange').html(' (' + result + ')');
|
413
|
+
} else {
|
414
|
+
$shcell.find('.ui-slider-handle')
|
415
|
+
.addClass('value-popup')
|
416
|
+
.eq(0).attr('data-value', val[0]).end() // adding value to data attribute
|
417
|
+
.eq(1).attr('data-value', val[1]); // value popup shown via css
|
418
|
+
}
|
418
419
|
}
|
420
|
+
|
421
|
+
};
|
422
|
+
$cell.closest('thead').find('th[data-column=' + indx + ']').addClass('filter-parsed');
|
423
|
+
|
424
|
+
// add span to header for value - only works if the line in the updateUiRange() function is also un-commented out
|
425
|
+
if (o.valueToHeader) {
|
426
|
+
$cell.closest('thead').find('th[data-column=' + indx + ']').find('.tablesorter-header-inner').append('<span class="currange"/>');
|
419
427
|
}
|
420
428
|
|
421
|
-
|
422
|
-
|
429
|
+
// add callbacks; preserve added callbacks
|
430
|
+
o.oldcreate = o.create;
|
431
|
+
o.oldslide = o.slide;
|
432
|
+
// add a jQuery UI range slider!
|
433
|
+
o.create = function(event, ui) {
|
434
|
+
updateUiRange(); // ui is an empty object on create
|
435
|
+
if (typeof o.oldcreate === 'function') { o.oldcreate(event, ui); }
|
436
|
+
};
|
437
|
+
o.slide = function(event, ui) {
|
438
|
+
updateUiRange(ui);
|
439
|
+
if (typeof o.oldslide === 'function') { o.oldslide(event, ui); }
|
440
|
+
};
|
441
|
+
$('<div class="range range' + indx + '"/>')
|
442
|
+
.appendTo($cell)
|
443
|
+
.slider(o);
|
423
444
|
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
445
|
+
// update slider from hidden input, in case of saved filters
|
446
|
+
c.$table.bind('filterFomatterUpdate', function(){
|
447
|
+
getRange();
|
448
|
+
ts.filter.formatterUpdated($cell, indx);
|
449
|
+
});
|
450
|
+
|
451
|
+
// on reset
|
452
|
+
c.$table.bind('filterReset', function(){
|
453
|
+
$cell.find('.range').slider('values', o.values);
|
454
|
+
setTimeout(function(){
|
455
|
+
updateUiRange();
|
456
|
+
}, 0);
|
457
|
+
});
|
458
|
+
|
459
|
+
// has sticky headers?
|
460
|
+
c.$table.bind('stickyHeadersInit', function(){
|
461
|
+
$shcell = c.widgetOptions.$sticky.find('.tablesorter-filter-row').children().eq(indx).empty();
|
462
|
+
|
463
|
+
// add a jQuery UI slider!
|
464
|
+
$('<div class="range range' + indx + '"/>')
|
465
|
+
.val(o.value)
|
466
|
+
.appendTo($shcell)
|
467
|
+
.slider(o)
|
468
|
+
.bind('change keyup', function(){
|
469
|
+
$cell.find('.range').val( this.value );
|
470
|
+
updateUiRange();
|
471
|
+
});
|
428
472
|
|
429
|
-
// add callbacks; preserve added callbacks
|
430
|
-
o.oldcreate = o.create;
|
431
|
-
o.oldslide = o.slide;
|
432
|
-
// add a jQuery UI range slider!
|
433
|
-
o.create = function(event, ui) {
|
434
|
-
updateUiRange(); // ui is an empty object on create
|
435
|
-
if (typeof o.oldcreate === 'function') { o.oldcreate(event, ui); }
|
436
|
-
};
|
437
|
-
o.slide = function(event, ui) {
|
438
|
-
updateUiRange(ui);
|
439
|
-
if (typeof o.oldslide === 'function') { o.oldslide(event, ui); }
|
440
|
-
};
|
441
|
-
$('<div class="range range' + indx +'"/>')
|
442
|
-
.appendTo($cell)
|
443
|
-
.slider(o);
|
444
|
-
|
445
|
-
// update slider from hidden input, in case of saved filters
|
446
|
-
c.$table.bind('filterFomatterUpdate', function(){
|
447
|
-
getRange();
|
448
|
-
ts.filter.formatterUpdated($cell, indx);
|
449
|
-
});
|
450
|
-
|
451
|
-
// on reset
|
452
|
-
c.$table.bind('filterReset', function(){
|
453
|
-
$cell.find('.range').slider('values', o.values);
|
454
|
-
setTimeout(function(){
|
455
|
-
updateUiRange();
|
456
|
-
}, 0);
|
457
|
-
});
|
458
|
-
|
459
|
-
// has sticky headers?
|
460
|
-
c.$table.bind('stickyHeadersInit', function(){
|
461
|
-
$shcell = c.widgetOptions.$sticky.find('.tablesorter-filter-row').children().eq(indx).empty();
|
462
|
-
|
463
|
-
// add a jQuery UI slider!
|
464
|
-
$('<div class="range range' + indx + '"/>')
|
465
|
-
.val(o.value)
|
466
|
-
.appendTo($shcell)
|
467
|
-
.slider(o)
|
468
|
-
.bind('change keyup', function(){
|
469
|
-
$cell.find('.range').val( this.value );
|
470
|
-
updateUiRange();
|
471
473
|
});
|
472
474
|
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
475
|
+
// return the hidden input so the filter widget has a reference to it
|
476
|
+
return $input;
|
477
|
+
},
|
478
|
+
|
479
|
+
/*************************\
|
480
|
+
jQuery UI Datepicker compare (1 input)
|
481
|
+
\*************************/
|
482
|
+
uiDateCompare: function($cell, indx, defDate) {
|
483
|
+
var o = $.extend({
|
484
|
+
// filter formatter options
|
485
|
+
cellText : '',
|
486
|
+
compare : '',
|
487
|
+
endOfDay : true,
|
488
|
+
// include ANY jQuery UI spinner options below
|
489
|
+
|
490
|
+
defaultDate : '',
|
491
|
+
|
492
|
+
changeMonth : true,
|
493
|
+
changeYear : true,
|
494
|
+
numberOfMonths : 1
|
495
|
+
}, defDate),
|
496
|
+
|
497
|
+
$date,
|
498
|
+
c = $cell.closest('table')[0].config,
|
499
|
+
// make sure we're using parsed dates in the search
|
500
|
+
$hdr = $cell.closest('thead').find('th[data-column=' + indx + ']').addClass('filter-parsed'),
|
501
|
+
// Add a hidden input to hold the range values
|
502
|
+
$input = $('<input class="dateCompare" type="hidden">')
|
503
|
+
.appendTo($cell)
|
504
|
+
// hidden filter update namespace trigger by filter widget
|
505
|
+
.bind('change' + c.namespace + 'filter', function(){
|
506
|
+
var v = this.value;
|
507
|
+
if (v) {
|
508
|
+
o.onClose(v);
|
509
|
+
}
|
510
|
+
}),
|
511
|
+
t, $shcell = [],
|
512
|
+
|
513
|
+
// this function updates the hidden input
|
514
|
+
date1Compare = function(notrigger) {
|
515
|
+
var date, query,
|
516
|
+
getdate = $date.datepicker('getDate') || '',
|
517
|
+
compare = ($.isArray(o.compare) ? $cell.find(compareSelect).val() || o.compare[ o.selected || 0] : o.compare) || '',
|
518
|
+
searchType = c.$table[0].hasInitialized ? o.delayed || '' : true;
|
519
|
+
$date.datepicker('setDate', (getdate === '' ? '' : getdate) || null);
|
520
|
+
if (getdate === '') { notrigger = false; }
|
521
|
+
date = $date.datepicker('getDate');
|
522
|
+
query = date ? ( o.endOfDay && /<=/.test(compare) ? date.setHours(23, 59, 59) : date.getTime() ) || '' : '';
|
523
|
+
if (date && o.endOfDay && compare === '=') {
|
524
|
+
compare = '';
|
525
|
+
query += ' - ' + date.setHours(23, 59, 59);
|
526
|
+
notrigger = false;
|
509
527
|
}
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
// add equal to the beginning, so we filter exact numbers
|
530
|
-
.val(compare + query)
|
531
|
-
.trigger( notrigger ? '' : 'search', searchType ).end();
|
532
|
-
// update sticky header cell
|
533
|
-
if ($shcell.length) {
|
534
|
-
$shcell
|
535
|
-
.find('.dateCompare').val(compare + query).end()
|
536
|
-
.find(compareSelect).val(compare);
|
537
|
-
}
|
538
|
-
};
|
539
|
-
|
540
|
-
// Add date range picker
|
541
|
-
t = '<input type="text" class="date date' + indx + '" placeholder="' +
|
542
|
-
($hdr.data('placeholder') || $hdr.attr('data-placeholder') || c.widgetOptions.filter_placeholder.search || '') + '" />';
|
543
|
-
$date = $(t).appendTo($cell);
|
544
|
-
|
545
|
-
// add callbacks; preserve added callbacks
|
546
|
-
o.oldonClose = o.onClose;
|
547
|
-
|
548
|
-
o.onClose = function( selectedDate, ui ) {
|
549
|
-
date1Compare();
|
550
|
-
if (typeof o.oldonClose === 'function') { o.oldonClose(selectedDate, ui); }
|
551
|
-
};
|
552
|
-
$date.datepicker(o);
|
553
|
-
|
554
|
-
// on reset
|
555
|
-
c.$table.bind('filterReset', function(){
|
556
|
-
if ($.isArray(o.compare)) {
|
557
|
-
$cell.add($shcell).find(compareSelect).val( o.compare[ o.selected || 0 ] );
|
558
|
-
}
|
559
|
-
$cell.add($shcell).find('.date').val(o.defaultDate).datepicker('setDate', o.defaultDate || null);
|
560
|
-
setTimeout(function(){
|
561
|
-
date1Compare();
|
562
|
-
}, 0);
|
563
|
-
});
|
564
|
-
|
565
|
-
// update date compare from hidden input, in case of saved filters
|
566
|
-
c.$table.bind('filterFomatterUpdate', function(){
|
567
|
-
var num, v = $input.val();
|
568
|
-
if (/\s+-\s+/.test(v)) {
|
569
|
-
// date range found; assume an exact match on one day
|
570
|
-
$cell.find(compareSelect).val('=');
|
571
|
-
num = v.split(/\s+-\s+/)[0];
|
572
|
-
$date.datepicker( 'setDate', num || null );
|
573
|
-
} else {
|
574
|
-
num = (tsff.updateCompare($cell, $input, o)[1]).toString() || '';
|
575
|
-
// differeniate 1388556000000 from 1/1/2014 using \d{5} regex
|
576
|
-
num = num !== '' ? /\d{5}/g.test(num) ? new Date(Number(num)) : num || '' : '';
|
577
|
-
}
|
578
|
-
$cell.add($shcell).find('.date').datepicker( 'setDate', num || null );
|
579
|
-
setTimeout(function(){
|
580
|
-
date1Compare(true);
|
581
|
-
ts.filter.formatterUpdated($cell, indx);
|
582
|
-
}, 0);
|
583
|
-
});
|
528
|
+
$cell.find('.dateCompare')
|
529
|
+
// add equal to the beginning, so we filter exact numbers
|
530
|
+
.val(compare + query)
|
531
|
+
.trigger( notrigger ? '' : 'search', searchType ).end();
|
532
|
+
// update sticky header cell
|
533
|
+
if ($shcell.length) {
|
534
|
+
$shcell
|
535
|
+
.find('.dateCompare').val(compare + query).end()
|
536
|
+
.find(compareSelect).val(compare);
|
537
|
+
}
|
538
|
+
};
|
539
|
+
|
540
|
+
// Add date range picker
|
541
|
+
t = '<input type="text" class="date date' + indx + '" placeholder="' +
|
542
|
+
($hdr.data('placeholder') || $hdr.attr('data-placeholder') || c.widgetOptions.filter_placeholder.search || '') + '" />';
|
543
|
+
$date = $(t).appendTo($cell);
|
544
|
+
|
545
|
+
// add callbacks; preserve added callbacks
|
546
|
+
o.oldonClose = o.onClose;
|
584
547
|
|
585
|
-
|
586
|
-
// add compare select
|
587
|
-
tsff.addCompare($cell, indx, o);
|
588
|
-
$cell.find(compareSelect).bind('change', function(){
|
548
|
+
o.onClose = function( selectedDate, ui ) {
|
589
549
|
date1Compare();
|
550
|
+
if (typeof o.oldonClose === 'function') { o.oldonClose(selectedDate, ui); }
|
551
|
+
};
|
552
|
+
$date.datepicker(o);
|
553
|
+
|
554
|
+
// on reset
|
555
|
+
c.$table.bind('filterReset', function(){
|
556
|
+
if ($.isArray(o.compare)) {
|
557
|
+
$cell.add($shcell).find(compareSelect).val( o.compare[ o.selected || 0 ] );
|
558
|
+
}
|
559
|
+
$cell.add($shcell).find('.date').val(o.defaultDate).datepicker('setDate', o.defaultDate || null);
|
560
|
+
setTimeout(function(){
|
561
|
+
date1Compare();
|
562
|
+
}, 0);
|
590
563
|
});
|
591
|
-
}
|
592
564
|
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
565
|
+
// update date compare from hidden input, in case of saved filters
|
566
|
+
c.$table.bind('filterFomatterUpdate', function(){
|
567
|
+
var num, v = $input.val();
|
568
|
+
if (/\s+-\s+/.test(v)) {
|
569
|
+
// date range found; assume an exact match on one day
|
570
|
+
$cell.find(compareSelect).val('=');
|
571
|
+
num = v.split(/\s+-\s+/)[0];
|
572
|
+
$date.datepicker( 'setDate', num || null );
|
573
|
+
} else {
|
574
|
+
num = (tsff.updateCompare($cell, $input, o)[1]).toString() || '';
|
575
|
+
// differeniate 1388556000000 from 1/1/2014 using \d{5} regex
|
576
|
+
num = num !== '' ? /\d{5}/g.test(num) ? new Date(Number(num)) : num || '' : '';
|
577
|
+
}
|
578
|
+
$cell.add($shcell).find('.date').datepicker( 'setDate', num || null );
|
579
|
+
setTimeout(function(){
|
580
|
+
date1Compare(true);
|
581
|
+
ts.filter.formatterUpdated($cell, indx);
|
582
|
+
}, 0);
|
583
|
+
});
|
602
584
|
|
603
585
|
if (o.compare) {
|
604
586
|
// add compare select
|
605
|
-
tsff.addCompare($
|
606
|
-
$
|
607
|
-
$cell.find(compareSelect).val( $(this).val() );
|
587
|
+
tsff.addCompare($cell, indx, o);
|
588
|
+
$cell.find(compareSelect).bind('change', function(){
|
608
589
|
date1Compare();
|
609
590
|
});
|
610
591
|
}
|
611
592
|
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
// include ANY jQuery UI spinner options below
|
630
|
-
changeMonth : true,
|
631
|
-
changeYear : true,
|
632
|
-
numberOfMonths : 1
|
633
|
-
}, defDate),
|
634
|
-
t, closeDate, $shcell = [],
|
635
|
-
c = $cell.closest('table')[0].config,
|
636
|
-
validDate = function(d){
|
637
|
-
return d instanceof Date && isFinite(d);
|
638
|
-
},
|
639
|
-
// Add a hidden input to hold the range values
|
640
|
-
$input = $('<input class="dateRange" type="hidden">')
|
641
|
-
.appendTo($cell)
|
642
|
-
// hidden filter update namespace trigger by filter widget
|
643
|
-
.bind('change' + c.namespace + 'filter', function(){
|
644
|
-
var v = this.value;
|
645
|
-
if (v.match(' - ')) {
|
646
|
-
v = v.split(' - ');
|
647
|
-
$cell.find('.dateTo').val(v[1]);
|
648
|
-
closeDate(v[0]);
|
649
|
-
} else if (v.match('>=')) {
|
650
|
-
closeDate( v.replace('>=', '') );
|
651
|
-
} else if (v.match('<=')) {
|
652
|
-
closeDate( v.replace('<=', '') );
|
593
|
+
// has sticky headers?
|
594
|
+
c.$table.bind('stickyHeadersInit', function(){
|
595
|
+
$shcell = c.widgetOptions.$sticky.find('.tablesorter-filter-row').children().eq(indx).empty();
|
596
|
+
|
597
|
+
// add a jQuery datepicker!
|
598
|
+
$shcell
|
599
|
+
.append(t)
|
600
|
+
.find('.date')
|
601
|
+
.datepicker(o);
|
602
|
+
|
603
|
+
if (o.compare) {
|
604
|
+
// add compare select
|
605
|
+
tsff.addCompare($shcell, indx, o);
|
606
|
+
$shcell.find(compareSelect).bind('change', function(){
|
607
|
+
$cell.find(compareSelect).val( $(this).val() );
|
608
|
+
date1Compare();
|
609
|
+
});
|
653
610
|
}
|
654
|
-
}),
|
655
|
-
|
656
|
-
// make sure we're using parsed dates in the search
|
657
|
-
$hdr = $cell.closest('thead').find('th[data-column=' + indx + ']').addClass('filter-parsed');
|
658
|
-
// Add date range picker
|
659
|
-
t = '<label>' + o.textFrom + '</label><input type="text" class="dateFrom" placeholder="' +
|
660
|
-
($hdr.data('placeholderFrom') || $hdr.attr('data-placeholder-from') || c.widgetOptions.filter_placeholder.from || '') + '" />' +
|
661
|
-
'<label>' + o.textTo + '</label><input type="text" class="dateTo" placeholder="' +
|
662
|
-
($hdr.data('placeholderTo') || $hdr.attr('data-placeholder-to') || c.widgetOptions.filter_placeholder.to || '') + '" />';
|
663
|
-
$(t).appendTo($cell);
|
664
|
-
|
665
|
-
// add callbacks; preserve added callbacks
|
666
|
-
o.oldonClose = o.onClose;
|
667
|
-
|
668
|
-
closeDate = o.onClose = function( selectedDate, ui ) {
|
669
|
-
var range,
|
670
|
-
from = $cell.find('.dateFrom').datepicker('getDate'),
|
671
|
-
to = $cell.find('.dateTo').datepicker('getDate');
|
672
|
-
from = validDate(from) ? from.getTime() : '';
|
673
|
-
to = validDate(to) ? ( o.endOfDay ? to.setHours(23, 59, 59) : to.getTime() ) || '' : '';
|
674
|
-
range = from ? ( to ? from + ' - ' + to : '>=' + from ) : (to ? '<=' + to : '');
|
675
|
-
$cell.add( $shcell )
|
676
|
-
.find('.dateRange').val(range)
|
677
|
-
.trigger('search');
|
678
|
-
// date picker needs date objects
|
679
|
-
from = from ? new Date(from) : '';
|
680
|
-
to = to ? new Date(to) : '';
|
681
|
-
|
682
|
-
if (/<=/.test(range)) {
|
683
|
-
$cell.add( $shcell )
|
684
|
-
.find('.dateFrom').datepicker('option', 'maxDate', to || null ).end()
|
685
|
-
.find('.dateTo').datepicker('option', 'minDate', null).datepicker('setDate', to || null);
|
686
|
-
} else if (/>=/.test(range)) {
|
687
|
-
$cell.add( $shcell )
|
688
|
-
.find('.dateFrom').datepicker('option', 'maxDate', null).datepicker('setDate', from || null).end()
|
689
|
-
.find('.dateTo').datepicker('option', 'minDate', from || null );
|
690
|
-
} else {
|
691
|
-
$cell.add( $shcell )
|
692
|
-
.find('.dateFrom').datepicker('option', 'maxDate', null).datepicker('setDate', from || null ).end()
|
693
|
-
.find('.dateTo').datepicker('option', 'minDate', null).datepicker('setDate', to || null);
|
694
|
-
}
|
695
611
|
|
696
|
-
|
697
|
-
};
|
612
|
+
});
|
698
613
|
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
$cell.find('.dateTo').datepicker(o);
|
614
|
+
// return the hidden input so the filter widget has a reference to it
|
615
|
+
return $input.val( o.defaultDate ? o.defaultDate : '' );
|
616
|
+
},
|
703
617
|
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
//
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
618
|
+
/*************************\
|
619
|
+
jQuery UI Datepicker (2 inputs)
|
620
|
+
\*************************/
|
621
|
+
uiDatepicker: function($cell, indx, defDate) {
|
622
|
+
var o = $.extend({
|
623
|
+
// filter formatter options
|
624
|
+
endOfDay : true,
|
625
|
+
textFrom : 'from',
|
626
|
+
textTo : 'to',
|
627
|
+
from : '', // defaultDate 'from' input
|
628
|
+
to : '', // defaultDate 'to' input
|
629
|
+
// include ANY jQuery UI spinner options below
|
630
|
+
changeMonth : true,
|
631
|
+
changeYear : true,
|
632
|
+
numberOfMonths : 1
|
633
|
+
}, defDate),
|
634
|
+
t, closeDate, $shcell = [],
|
635
|
+
c = $cell.closest('table')[0].config,
|
636
|
+
validDate = function(d){
|
637
|
+
return d instanceof Date && isFinite(d);
|
638
|
+
},
|
639
|
+
// Add a hidden input to hold the range values
|
640
|
+
$input = $('<input class="dateRange" type="hidden">')
|
641
|
+
.appendTo($cell)
|
642
|
+
// hidden filter update namespace trigger by filter widget
|
643
|
+
.bind('change' + c.namespace + 'filter', function(){
|
644
|
+
var v = this.value;
|
645
|
+
if (v.match(' - ')) {
|
646
|
+
v = v.split(' - ');
|
647
|
+
$cell.find('.dateTo').val(v[1]);
|
648
|
+
closeDate(v[0]);
|
649
|
+
} else if (v.match('>=')) {
|
650
|
+
closeDate( v.replace('>=', '') );
|
651
|
+
} else if (v.match('<=')) {
|
652
|
+
closeDate( v.replace('<=', '') );
|
653
|
+
}
|
654
|
+
}),
|
655
|
+
|
656
|
+
// make sure we're using parsed dates in the search
|
657
|
+
$hdr = $cell.closest('thead').find('th[data-column=' + indx + ']').addClass('filter-parsed');
|
658
|
+
// Add date range picker
|
659
|
+
t = '<label>' + o.textFrom + '</label><input type="text" class="dateFrom" placeholder="' +
|
660
|
+
($hdr.data('placeholderFrom') || $hdr.attr('data-placeholder-from') || c.widgetOptions.filter_placeholder.from || '') + '" />' +
|
661
|
+
'<label>' + o.textTo + '</label><input type="text" class="dateTo" placeholder="' +
|
662
|
+
($hdr.data('placeholderTo') || $hdr.attr('data-placeholder-to') || c.widgetOptions.filter_placeholder.to || '') + '" />';
|
663
|
+
$(t).appendTo($cell);
|
664
|
+
|
665
|
+
// add callbacks; preserve added callbacks
|
666
|
+
o.oldonClose = o.onClose;
|
667
|
+
|
668
|
+
closeDate = o.onClose = function( selectedDate, ui ) {
|
669
|
+
var range,
|
670
|
+
from = $cell.find('.dateFrom').datepicker('getDate'),
|
671
|
+
to = $cell.find('.dateTo').datepicker('getDate');
|
672
|
+
from = validDate(from) ? from.getTime() : '';
|
673
|
+
to = validDate(to) ? ( o.endOfDay ? to.setHours(23, 59, 59) : to.getTime() ) || '' : '';
|
674
|
+
range = from ? ( to ? from + ' - ' + to : '>=' + from ) : (to ? '<=' + to : '');
|
675
|
+
$cell.add( $shcell )
|
676
|
+
.find('.dateRange').val(range)
|
677
|
+
.trigger('search');
|
678
|
+
// date picker needs date objects
|
679
|
+
from = from ? new Date(from) : '';
|
680
|
+
to = to ? new Date(to) : '';
|
681
|
+
|
682
|
+
if (/<=/.test(range)) {
|
683
|
+
$cell.add( $shcell )
|
684
|
+
.find('.dateFrom').datepicker('option', 'maxDate', to || null ).end()
|
685
|
+
.find('.dateTo').datepicker('option', 'minDate', null).datepicker('setDate', to || null);
|
686
|
+
} else if (/>=/.test(range)) {
|
687
|
+
$cell.add( $shcell )
|
688
|
+
.find('.dateFrom').datepicker('option', 'maxDate', null).datepicker('setDate', from || null).end()
|
689
|
+
.find('.dateTo').datepicker('option', 'minDate', from || null );
|
690
|
+
} else {
|
691
|
+
$cell.add( $shcell )
|
692
|
+
.find('.dateFrom').datepicker('option', 'maxDate', null).datepicker('setDate', from || null ).end()
|
693
|
+
.find('.dateTo').datepicker('option', 'minDate', null).datepicker('setDate', to || null);
|
694
|
+
}
|
721
695
|
|
722
|
-
|
723
|
-
|
724
|
-
to = to !== '' ? /\d{5}/g.test(to) ? new Date(Number(to)) : to || '' : '';
|
696
|
+
if (typeof o.oldonClose === 'function') { o.oldonClose(selectedDate, ui); }
|
697
|
+
};
|
725
698
|
|
726
|
-
|
727
|
-
$cell.
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
699
|
+
o.defaultDate = o.from || '';
|
700
|
+
$cell.find('.dateFrom').datepicker(o);
|
701
|
+
o.defaultDate = o.to || '+7d'; // set to date +7 days from today (if not defined)
|
702
|
+
$cell.find('.dateTo').datepicker(o);
|
703
|
+
|
704
|
+
// update date compare from hidden input, in case of saved filters
|
705
|
+
c.$table.bind('filterFomatterUpdate', function(){
|
706
|
+
var val = $input.val() || '',
|
707
|
+
from = '',
|
708
|
+
to = '';
|
709
|
+
// date range
|
710
|
+
if (/\s+-\s+/.test(val)){
|
711
|
+
val = val.split(/\s+-\s+/) || [];
|
712
|
+
from = val[0] || '';
|
713
|
+
to = val[1] || '';
|
714
|
+
} else if (/>=/.test(val)) {
|
715
|
+
// greater than date (to date empty)
|
716
|
+
from = val.replace(/>=/, '') || '';
|
717
|
+
} else if (/<=/.test(val)) {
|
718
|
+
// less than date (from date empty)
|
719
|
+
to = val.replace(/<=/, '') || '';
|
720
|
+
}
|
734
721
|
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
722
|
+
// differeniate 1388556000000 from 1/1/2014 using \d{5} regex
|
723
|
+
from = from !== '' ? /\d{5}/g.test(from) ? new Date(Number(from)) : from || '' : '';
|
724
|
+
to = to !== '' ? /\d{5}/g.test(to) ? new Date(Number(to)) : to || '' : '';
|
725
|
+
|
726
|
+
$cell.add($shcell).find('.dateFrom').datepicker('setDate', from || null);
|
727
|
+
$cell.add($shcell).find('.dateTo').datepicker('setDate', to || null);
|
728
|
+
// give datepicker time to process
|
729
|
+
setTimeout(function(){
|
730
|
+
closeDate();
|
731
|
+
ts.filter.formatterUpdated($cell, indx);
|
732
|
+
}, 0);
|
733
|
+
});
|
739
734
|
|
740
|
-
//
|
741
|
-
|
742
|
-
|
735
|
+
// has sticky headers?
|
736
|
+
c.$table.bind('stickyHeadersInit', function(){
|
737
|
+
$shcell = c.widgetOptions.$sticky.find('.tablesorter-filter-row').children().eq(indx).empty();
|
738
|
+
$shcell.append(t);
|
743
739
|
|
744
|
-
|
745
|
-
|
740
|
+
// add a jQuery datepicker!
|
741
|
+
o.defaultDate = o.from || '';
|
742
|
+
$shcell.find('.dateFrom').datepicker(o);
|
746
743
|
|
747
|
-
|
744
|
+
o.defaultDate = o.to || '+7d';
|
745
|
+
$shcell.find('.dateTo').datepicker(o);
|
748
746
|
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
$cell.
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
747
|
+
});
|
748
|
+
|
749
|
+
// on reset
|
750
|
+
$cell.closest('table').bind('filterReset', function(){
|
751
|
+
$cell.add($shcell).find('.dateFrom').val('').datepicker('setDate', o.from || null );
|
752
|
+
$cell.add($shcell).find('.dateTo').val('').datepicker('setDate', o.to || null );
|
753
|
+
setTimeout(function(){
|
754
|
+
closeDate();
|
755
|
+
}, 0);
|
756
|
+
});
|
757
757
|
|
758
|
-
|
759
|
-
|
760
|
-
|
758
|
+
// return the hidden input so the filter widget has a reference to it
|
759
|
+
return $input.val( o.from ? ( o.to ? o.from + ' - ' + o.to : '>=' + o.from ) : (o.to ? '<=' + o.to : '') );
|
760
|
+
}
|
761
761
|
|
762
|
-
});
|
762
|
+
});
|
763
763
|
|
764
764
|
})(jQuery);
|