tablesorter/dist/js/widgets/widget-filter-formatter-jui.min.js

146 lines
17 KiB
JavaScript
Raw Normal View History

/*! Widget: filter jQuery UI formatter functions - updated 7/17/2014 (v2.17.5) */
2015-10-31 15:08:21 +00:00
/*
* requires: tableSorter (FORK) 2.15+ and jQuery 1.4.3+
*
* uiSpinner (jQuery UI spinner)
* uiSlider (jQuery UI slider)
* uiRange (jQuery UI range slider)
* uiDateCompare (jQuery UI datepicker; 1 input)
* uiDatepicker (jQuery UI datepicker; 2 inputs, filter range)
*/
/*jshint browser:true, jquery:true, unused:false */
/*global jQuery: false */
!function(a){"use strict";var b=a.tablesorter||{},
// compare option selector class name (jQuery selector)
c=".compare-select",d=b.filterFormatter=a.extend({},b.filterFormatter,{addCompare:function(b,d,e){if(e.compare&&a.isArray(e.compare)&&e.compare.length>1){var f="",g=[c.slice(1)," "+c.slice(1),""],h=e.cellText?'<label class="'+g.join("-label")+d+'">'+e.cellText+"</label>":"";a.each(e.compare,function(a,b){f+="<option "+(e.selected===a?"selected":"")+">"+b+"</option>"}),b.wrapInner('<div class="'+g.join("-wrapper")+d+'" />').prepend(h+'<select class="'+g.join("")+d+'" />').find("select").append(f)}},updateCompare:function(b,d,e){var f=d.val()||"",g=f.replace(/\s*?[><=]\s*?/g,""),h=f.match(/[><=]/g)||"";return e.compare&&(a.isArray(e.compare)&&(h=(h||[]).join("")||e.compare[e.selected||0]),b.find(c).val(h)),[f,g]},/**********************\
jQuery UI Spinner
\**********************/
uiSpinner:function(e,f,g){var h=a.extend({
// filter formatter options
delayed:!0,addToggle:!0,exactMatch:!0,value:1,cellText:"",compare:"",
// include ANY jQuery UI spinner options below
min:0,max:100,step:1,disabled:!1},g),i=e.closest("table")[0].config,
// Add a hidden input to hold the range values
j=a('<input class="filter" type="hidden">').appendTo(e).bind("change"+i.namespace+"filter",function(){l({value:this.value,delayed:!1})}),k=[],
// this function updates the hidden input and adds the current values to the header cell text
l=function(d,f){var g,j=!0,
// ui is not undefined on create
l=d&&d.value&&b.formatFloat((d.value+"").replace(/[><=]/g,""))||e.find(".spinner").val()||h.value,m=(a.isArray(h.compare)?e.find(c).val()||h.compare[h.selected||0]:h.compare)||"",n=d&&"boolean"==typeof d.delayed?d.delayed:i.$table[0].hasInitialized?h.delayed||"":!0;h.addToggle&&(j=e.find(".toggle").is(":checked")),g=h.disabled||!j?"disable":"enable",e.find(".filter").val(j?(m?m:h.exactMatch?"=":"")+l:"").trigger(f?"":"search",n).end().find(".spinner").spinner(g).val(l),k.length&&(k.find(".spinner").spinner(g).val(l).end().find(c).val(m),h.addToggle&&(k.find(".toggle")[0].checked=j))};
// add callbacks; preserve added callbacks
// make sure we use parsed data
// add a jQuery UI spinner!
// update spinner from hidden input, in case of saved filters
// add compare select
// has sticky headers?
// on reset
return h.oldcreate=h.create,h.oldspin=h.spin,h.create=function(a,b){l(),// ui is an empty object on create
"function"==typeof h.oldcreate&&h.oldcreate(a,b)},h.spin=function(a,b){l(b),"function"==typeof h.oldspin&&h.oldspin(a,b)},h.addToggle&&a('<div class="button"><input id="uispinnerbutton'+f+'" type="checkbox" class="toggle" /><label for="uispinnerbutton'+f+'"></label></div>').appendTo(e).find(".toggle").bind("change",function(){l()}),e.closest("thead").find("th[data-column="+f+"]").addClass("filter-parsed"),a('<input class="spinner spinner'+f+'" />').val(h.value).appendTo(e).spinner(h).bind("change keyup",function(){l()}),i.$table.bind("filterFomatterUpdate",function(){var a=d.updateCompare(e,j,h)[0];e.find(".spinner").val(a),l({value:a},!0),b.filter.formatterUpdated(e,f)}),h.compare&&(d.addCompare(e,f,h),e.find(c).bind("change",function(){l()})),i.$table.bind("stickyHeadersInit",function(){k=i.widgetOptions.$sticky.find(".tablesorter-filter-row").children().eq(f).empty(),h.addToggle&&a('<div class="button"><input id="stickyuispinnerbutton'+f+'" type="checkbox" class="toggle" /><label for="stickyuispinnerbutton'+f+'"></label></div>').appendTo(k).find(".toggle").bind("change",function(){e.find(".toggle")[0].checked=this.checked,l()}),a('<input class="spinner spinner'+f+'" />').val(h.value).appendTo(k).spinner(h).bind("change keyup",function(){e.find(".spinner").val(this.value),l()}),h.compare&&(d.addCompare(k,f,h),k.find(c).bind("change",function(){e.find(c).val(a(this).val()),l()}))}),i.$table.bind("filterReset",function(){a.isArray(h.compare)&&e.add(k).find(c).val(h.compare[h.selected||0]),
// turn off the toggle checkbox
h.addToggle&&(e.find(".toggle")[0].checked=!1),e.find(".spinner").spinner("value",h.value),setTimeout(function(){l()},0)}),l(),j},/**********************\
jQuery UI Slider
\**********************/
uiSlider:function(e,f,g){var h=a.extend({
// filter formatter options
delayed:!0,valueToHeader:!1,exactMatch:!0,cellText:"",compare:"",allText:"all",
// include ANY jQuery UI spinner options below
// except values, since this is a non-range setup
value:0,min:0,max:100,step:1,range:"min"},g),i=e.closest("table")[0].config,
// Add a hidden input to hold the range values
j=a('<input class="filter" type="hidden">').appendTo(e).bind("change"+i.namespace+"filter",function(){l({value:this.value})}),k=[],
// this function updates the hidden input and adds the current values to the header cell text
l=function(d,g){
// ui is not undefined on create
var j="undefined"!=typeof d?b.formatFloat((d.value+"").replace(/[><=]/g,""))||h.value:h.value,l=h.compare?j:j===h.min?h.allText:j,m=(a.isArray(h.compare)?e.find(c).val()||h.compare[h.selected||0]:h.compare)||"",n=m+l,o=d&&"boolean"==typeof d.delayed?d.delayed:i.$table[0].hasInitialized?h.delayed||"":!0;h.valueToHeader?
// add range indication to the header cell above!
e.closest("thead").find("th[data-column="+f+"]").find(".curvalue").html(" ("+n+")"):
// add values to the handle data-value attribute so the css tooltip will work properly
e.find(".ui-slider-handle").addClass("value-popup").attr("data-value",n),
// update the hidden input;
// ****** ADD AN EQUAL SIGN TO THE BEGINNING! <- this makes the slide exactly match the number ******
// when the value is at the minimum, clear the hidden input so all rows will be seen
e.find(".filter").val(m?m+j:j===h.min?"":(h.exactMatch?"=":"")+j).trigger(g?"":"search",o).end().find(".slider").slider("value",j),
// update sticky header cell
k.length&&(k.find(c).val(m).end().find(".slider").slider("value",j),h.valueToHeader?k.closest("thead").find("th[data-column="+f+"]").find(".curvalue").html(" ("+n+")"):k.find(".ui-slider-handle").addClass("value-popup").attr("data-value",n))};
// add span to header for value - only works if the line in the updateSlider() function is also un-commented out
// add callbacks; preserve added callbacks
// add a jQuery UI slider!
// update slider from hidden input, in case of saved filters
// add compare select
// on reset
// has sticky headers?
return e.closest("thead").find("th[data-column="+f+"]").addClass("filter-parsed"),h.valueToHeader&&e.closest("thead").find("th[data-column="+f+"]").find(".tablesorter-header-inner").append('<span class="curvalue" />'),h.oldcreate=h.create,h.oldslide=h.slide,h.create=function(a,b){l(),// ui is an empty object on create
"function"==typeof h.oldcreate&&h.oldcreate(a,b)},h.slide=function(a,b){l(b),"function"==typeof h.oldslide&&h.oldslide(a,b)},a('<div class="slider slider'+f+'"/>').appendTo(e).slider(h),i.$table.bind("filterFomatterUpdate",function(){var a=d.updateCompare(e,j,h)[0];e.find(".slider").slider("value",a),l({value:a},!1),b.filter.formatterUpdated(e,f)}),h.compare&&(d.addCompare(e,f,h),e.find(c).bind("change",function(){l({value:e.find(".slider").slider("value")})})),i.$table.bind("filterReset",function(){a.isArray(h.compare)&&e.add(k).find(c).val(h.compare[h.selected||0]),setTimeout(function(){l({value:h.value})},0)}),i.$table.bind("stickyHeadersInit",function(){k=i.widgetOptions.$sticky.find(".tablesorter-filter-row").children().eq(f).empty(),a('<div class="slider slider'+f+'"/>').val(h.value).appendTo(k).slider(h).bind("change keyup",function(){e.find(".slider").slider("value",this.value),l()}),h.compare&&(d.addCompare(k,f,h),k.find(c).bind("change",function(){e.find(c).val(a(this).val()),l()}))}),j},/*************************\
jQuery UI Range Slider (2 handles)
\*************************/
uiRange:function(c,d,e){var f=a.extend({
// filter formatter options
delayed:!0,valueToHeader:!1,
// include ANY jQuery UI spinner options below
// except value, since this one is range specific)
values:[0,100],min:0,max:100,range:!0},e),g=c.closest("table")[0].config,
// Add a hidden input to hold the range values
h=a('<input class="filter" type="hidden">').appendTo(c).bind("change"+g.namespace+"filter",function(){j()}),i=[],j=function(){var a=h.val(),b=a.split(" - ");""===a&&(b=[f.min,f.max]),b&&b[1]&&k({values:b,delay:!1},!0)},
// this function updates the hidden input and adds the current values to the header cell text
k=function(a,b){
// ui.values are undefined for some reason on create
var e=a&&a.values||f.values,h=e[0]+" - "+e[1],
// make range an empty string if entire range is covered so the filter row will hide (if set)
j=e[0]===f.min&&e[1]===f.max?"":h,k=a&&"boolean"==typeof a.delayed?a.delayed:g.$table[0].hasInitialized?f.delayed||"":!0;f.valueToHeader?
// add range indication to the header cell above (if not using the css method)!
c.closest("thead").find("th[data-column="+d+"]").find(".currange").html(" ("+h+")"):
// add values to the handle data-value attribute so the css tooltip will work properly
c.find(".ui-slider-handle").addClass("value-popup").eq(0).attr("data-value",e[0]).end().eq(1).attr("data-value",e[1]),
// update the hidden input
c.find(".filter").val(j).trigger(b?"":"search",k).end().find(".range").slider("values",e),
// update sticky header cell
i.length&&(i.find(".range").slider("values",e),f.valueToHeader?i.closest("thead").find("th[data-column="+d+"]").find(".currange").html(" ("+h+")"):i.find(".ui-slider-handle").addClass("value-popup").eq(0).attr("data-value",e[0]).end().eq(1).attr("data-value",e[1]))};
// return the hidden input so the filter widget has a reference to it
// add span to header for value - only works if the line in the updateUiRange() function is also un-commented out
// add callbacks; preserve added callbacks
// add a jQuery UI range slider!
// update slider from hidden input, in case of saved filters
// on reset
// has sticky headers?
return c.closest("thead").find("th[data-column="+d+"]").addClass("filter-parsed"),f.valueToHeader&&c.closest("thead").find("th[data-column="+d+"]").find(".tablesorter-header-inner").append('<span class="currange"/>'),f.oldcreate=f.create,f.oldslide=f.slide,f.create=function(a,b){k(),// ui is an empty object on create
"function"==typeof f.oldcreate&&f.oldcreate(a,b)},f.slide=function(a,b){k(b),"function"==typeof f.oldslide&&f.oldslide(a,b)},a('<div class="range range'+d+'"/>').appendTo(c).slider(f),g.$table.bind("filterFomatterUpdate",function(){j(),b.filter.formatterUpdated(c,d)}),g.$table.bind("filterReset",function(){c.find(".range").slider("values",f.values),setTimeout(function(){k()},0)}),g.$table.bind("stickyHeadersInit",function(){i=g.widgetOptions.$sticky.find(".tablesorter-filter-row").children().eq(d).empty(),a('<div class="range range'+d+'"/>').val(f.value).appendTo(i).slider(f).bind("change keyup",function(){c.find(".range").val(this.value),k()})}),h},/*************************\
jQuery UI Datepicker compare (1 input)
\*************************/
uiDateCompare:function(e,f,g){var h,i,j=a.extend({
// filter formatter options
cellText:"",compare:"",endOfDay:!0,
// include ANY jQuery UI spinner options below
defaultDate:"",changeMonth:!0,changeYear:!0,numberOfMonths:1},g),k=e.closest("table")[0].config,
// make sure we're using parsed dates in the search
l=e.closest("thead").find("th[data-column="+f+"]").addClass("filter-parsed"),
// Add a hidden input to hold the range values
m=a('<input class="dateCompare" type="hidden">').appendTo(e).bind("change"+k.namespace+"filter",function(){var a=this.value;a&&j.onClose(a)}),n=[],
// this function updates the hidden input
o=function(b){var d,f,g=h.datepicker("getDate")||"",i=(a.isArray(j.compare)?e.find(c).val()||j.compare[j.selected||0]:j.compare)||"",l=k.$table[0].hasInitialized?j.delayed||"":!0;h.datepicker("setDate",(""===g?"":g)||null),""===g&&(b=!1),d=h.datepicker("getDate"),f=d?(j.endOfDay&&/<=/.test(i)?d.setHours(23,59,59):d.getTime())||"":"",d&&j.endOfDay&&"="===i&&(i="",f+=" - "+d.setHours(23,59,59),b=!1),e.find(".dateCompare").val(i+f).trigger(b?"":"search",l).end(),n.length&&n.find(".dateCompare").val(i+f).end().find(c).val(i)};
// return the hidden input so the filter widget has a reference to it
// Add date range picker
// add callbacks; preserve added callbacks
// on reset
// update date compare from hidden input, in case of saved filters
// add compare select
// has sticky headers?
return i='<input type="text" class="date date'+f+'" placeholder="'+(l.data("placeholder")||l.attr("data-placeholder")||k.widgetOptions.filter_placeholder.search||"")+'" />',h=a(i).appendTo(e),j.oldonClose=j.onClose,j.onClose=function(a,b){o(),"function"==typeof j.oldonClose&&j.oldonClose(a,b)},h.datepicker(j),k.$table.bind("filterReset",function(){a.isArray(j.compare)&&e.add(n).find(c).val(j.compare[j.selected||0]),e.add(n).find(".date").val(j.defaultDate).datepicker("setDate",j.defaultDate||null),setTimeout(function(){o()},0)}),k.$table.bind("filterFomatterUpdate",function(){var a,g=m.val();/\s+-\s+/.test(g)?(e.find(c).val("="),a=g.split(/\s+-\s+/)[0],h.datepicker("setDate",a||null)):(a=d.updateCompare(e,m,j)[1].toString()||"",a=""!==a?/\d{5}/g.test(a)?new Date(Number(a)):a||"":""),e.add(n).find(".date").datepicker("setDate",a||null),setTimeout(function(){o(!0),b.filter.formatterUpdated(e,f)},0)}),j.compare&&(d.addCompare(e,f,j),e.find(c).bind("change",function(){o()})),k.$table.bind("stickyHeadersInit",function(){n=k.widgetOptions.$sticky.find(".tablesorter-filter-row").children().eq(f).empty(),n.append(i).find(".date").datepicker(j),j.compare&&(d.addCompare(n,f,j),n.find(c).bind("change",function(){e.find(c).val(a(this).val()),o()}))}),m.val(j.defaultDate?j.defaultDate:"")},/*************************\
jQuery UI Datepicker (2 inputs)
\*************************/
uiDatepicker:function(c,d,e){var f,g,h=a.extend({
// filter formatter options
endOfDay:!0,textFrom:"from",textTo:"to",from:"",// defaultDate 'from' input
to:"",// defaultDate 'to' input
// include ANY jQuery UI spinner options below
changeMonth:!0,changeYear:!0,numberOfMonths:1},e),i=[],j=c.closest("table")[0].config,k=function(a){return a instanceof Date&&isFinite(a)},
// Add a hidden input to hold the range values
l=a('<input class="dateRange" type="hidden">').appendTo(c).bind("change"+j.namespace+"filter",function(){var a=this.value;a.match(" - ")?(a=a.split(" - "),c.find(".dateTo").val(a[1]),g(a[0])):a.match(">=")?g(a.replace(">=","")):a.match("<=")&&g(a.replace("<=",""))}),
// make sure we're using parsed dates in the search
m=c.closest("thead").find("th[data-column="+d+"]").addClass("filter-parsed");
// return the hidden input so the filter widget has a reference to it
// Add date range picker
// add callbacks; preserve added callbacks
// set to date +7 days from today (if not defined)
// update date compare from hidden input, in case of saved filters
// has sticky headers?
// on reset
return f="<label>"+h.textFrom+'</label><input type="text" class="dateFrom" placeholder="'+(m.data("placeholderFrom")||m.attr("data-placeholder-from")||j.widgetOptions.filter_placeholder.from||"")+'" /><label>'+h.textTo+'</label><input type="text" class="dateTo" placeholder="'+(m.data("placeholderTo")||m.attr("data-placeholder-to")||j.widgetOptions.filter_placeholder.to||"")+'" />',a(f).appendTo(c),h.oldonClose=h.onClose,g=h.onClose=function(a,b){var d,e=c.find(".dateFrom").datepicker("getDate"),f=c.find(".dateTo").datepicker("getDate");e=k(e)?e.getTime():"",f=k(f)?(h.endOfDay?f.setHours(23,59,59):f.getTime())||"":"",d=e?f?e+" - "+f:">="+e:f?"<="+f:"",c.add(i).find(".dateRange").val(d).trigger("search"),e=e?new Date(e):"",f=f?new Date(f):"",/<=/.test(d)?c.add(i).find(".dateFrom").datepicker("option","maxDate",f||null).end().find(".dateTo").datepicker("option","minDate",null).datepicker("setDate",f||null):/>=/.test(d)?c.add(i).find(".dateFrom").datepicker("option","maxDate",null).datepicker("setDate",e||null).end().find(".dateTo").datepicker("option","minDate",e||null):c.add(i).find(".dateFrom").datepicker("option","maxDate",null).datepicker("setDate",e||null).end().find(".dateTo").datepicker("option","minDate",null).datepicker("setDate",f||null),"function"==typeof h.oldonClose&&h.oldonClose(a,b)},h.defaultDate=h.from||"",c.find(".dateFrom").datepicker(h),h.defaultDate=h.to||"+7d",c.find(".dateTo").datepicker(h),j.$table.bind("filterFomatterUpdate",function(){var a=l.val()||"",e="",f="";/\s+-\s+/.test(a)?(a=a.split(/\s+-\s+/)||[],e=a[0]||"",f=a[1]||""):/>=/.test(a)?e=a.replace(/>=/,"")||"":/<=/.test(a)&&(f=a.replace(/<=/,"")||""),e=""!==e?/\d{5}/g.test(e)?new Date(Number(e)):e||"":"",f=""!==f?/\d{5}/g.test(f)?new Date(Number(f)):f||"":"",c.add(i).find(".dateFrom").datepicker("setDate",e||null),c.add(i).find(".dateTo").datepicker("setDate",f||null),setTimeout(function(){g(),b.filter.formatterUpdated(c,d)},0)}),j.$table.bind("stickyHeadersInit",function(){i=j.widgetOptions.$sticky.find(".tablesorter-filter-row").children().eq(d).empty(),i.append(f),h.defaultDate=h.from||"",i.find(".dateFrom").datepicker(h),h.defaultDate=h.to||"+7d",i.find(".dateTo").datepicker(h)}),c.closest("table").bind("filterReset",function(){c.add(i).find(".dateFrom").val("").datepicker("setDate",h.from||null),c.add(i).find(".dateTo").val("").datepicker("setDate",h.to||null),setTimeout(function(){g()},0)}),l.val(h.from?h.to?h.from+" - "+h.to:">="+h.from:h.to?"<="+h.to:"")}})}(jQuery);