2015-10-31 16:06:09 +00:00
/*! Widget: grouping - updated 10/31/2015 (v2.24.0) */
2015-10-31 15:08:21 +00:00
/ *
* Requires tablesorter v2 . 8 + and jQuery 1.7 +
* by Rob Garrison
* /
/*jshint browser:true, jquery:true, unused:false */
/*global jQuery: false */
! function ( a ) { "use strict" ; var b = a . tablesorter ; b . grouping = { types : { number : function ( a , c , d , e , f ) { var g , h ; return e > 1 && "" !== d ? c . hasClass ( b . css . sortAsc ) ? ( g = Math . floor ( parseFloat ( d ) / e ) * e , g > parseFloat ( f || 0 ) ? g : parseFloat ( f || 0 ) ) : ( g = Math . ceil ( parseFloat ( d ) / e ) * e , g < parseFloat ( f || e ) - g ? parseFloat ( f || e ) - g : g ) : ( h = ( d + "" ) . match ( /\d+/g ) , h && h . length >= e ? h [ e - 1 ] : d || "" ) } , separator : function ( b , c , d , e ) { var f = ( d + "" ) . split ( b . widgetOptions . group _separator ) ; return a . trim ( f && e > 0 && f . length >= e ? f [ ( e || 1 ) - 1 ] : "" ) } , word : function ( a , b , c , d ) { var e = ( c + " " ) . match ( /\w+/g ) ; return e && e . length >= d ? e [ d - 1 ] : c || "" } , letter : function ( a , b , c , d ) { return c ? ( c + " " ) . substring ( 0 , d ) : "" } , date : function ( a , c , d , e , f ) { var g , h , i = a . widgetOptions , j = new Date ( d || "" ) ;
// check for valid date
// check for valid date
return j instanceof Date && isFinite ( j ) ? ( g = j . getFullYear ( ) , h = b . grouping . findMonth ( i , j . getMonth ( ) ) , "year" === e ? g : "month" === e ? h : "monthyear" === e ? h + " " + g : "day" === e ? h + " " + j . getDate ( ) : "week" === e ? b . grouping . findWeek ( i , j . getDay ( ) ) : "time" === e ? b . grouping . findTime ( i , j ) : i . group _dateString ( j , a , c ) ) : i . group _dateInvalid } } ,
// group date type functions to allow using this widget with Globalize
findMonth : function ( a , b ) {
// CLDR returns an object { 1: "Jan", 2: "Feb", 3: "Mar", ..., 12: "Dec" }
return a . group _months [ b + ( "" === ( a . group _months [ 0 ] || "" ) ? 1 : 0 ) ] } , findWeek : function ( b , c ) { if ( a . isArray ( b . group _week ) ) return b . group _week [ c ] ; if ( ! a . isEmptyObject ( b . group _week ) ) {
// CLDR returns { sun: "Sun", mon: "Mon", tue: "Tue", wed: "Wed", thu: "Thu", ... }
var d = [ "sun" , "mon" , "tue" , "wed" , "thu" , "fri" , "sat" ] ; return b . group _week [ d [ c ] ] } } , findTime : function ( a , b ) { var c , d = b . getHours ( ) , e = d >= 12 ? 1 : 0 ,
// CLDR returns { am: "AM", pm: "PM", ... }
f = a . group _time . am && a . group _time . pm , g = ( "00" + ( a . group _time24Hour && d > 12 ? d - 12 : a . group _time24Hour && 0 === d ? d + 12 : d ) ) . slice ( - 2 ) , h = ( "00" + b . getMinutes ( ) ) . slice ( - 2 ) ; return c = a . group _time [ f ? [ "am" , "pm" ] [ e ] : e ] , g + ":" + h + ( a . group _time24Hour ? "" : " " + ( c || "" ) ) } , update : function ( c , d , e ) { if ( ! a . isEmptyObject ( d . cache ) ) { var f , g , h , i , j , k , l , m , n , o , p = b . hasWidget ( c , "pager" ) , q = "undefined" != typeof d . sortList [ 0 ] , r = "" , s = 0 , t = ! 1 , u = a . isArray ( e . group _forceColumn ) && "undefined" != typeof e . group _forceColumn [ 0 ] ? e . group _enforceSort && ! q ? - 1 : e . group _forceColumn [ 0 ] : q ? d . sortList [ 0 ] [ 0 ] : - 1 ; if ( d . $table . find ( "tr.group-hidden" ) . removeClass ( "group-hidden" ) . end ( ) . find ( "tr.group-header" ) . remove ( ) , e . group _collapsible &&
// clear pager saved spacer height (in case the rows are collapsed)
d . $table . data ( "pagerSavedHeight" , 0 ) , u >= 0 && u < d . columns && ! d . $headerIndexed [ u ] . hasClass ( "group-false" ) ) { for ( e . group _currentGroup = "" , // save current groups
e . group _currentGroups = { } , j = ( d . $headerIndexed [ u ] . attr ( "class" ) || "" ) . match ( /(group-\w+(-\w+)?)/g ) , k = j ? j [ 0 ] . split ( "-" ) : [ "group" , "letter" , 1 ] , e . group _collapsible && e . group _saveGroups && b . storage && ( e . group _currentGroups = b . storage ( c , "tablesorter-groups" ) || { } , n = "dir" + d . sortList [ 0 ] [ 1 ] , m = e . group _currentGroup = "" + d . sortList [ 0 ] [ 0 ] + n + k . join ( "" ) , e . group _currentGroups [ m ] ? t = ! 0 : e . group _currentGroups [ m ] = [ ] ) , g = 0 ; g < d . $tbodies . length ; g ++ ) for ( l = d . cache [ g ] . normalized , r = "" , // clear grouping across tbodies
f = p ? d . pager . startRow - 1 : 0 , o = p ? d . pager . endRow : l . length ; o > f ; f ++ ) i = l [ f ] [ d . columns ] . $row , i . is ( ":visible" ) && b . grouping . types [ k [ 1 ] ] && ( h = l [ f ] ? b . grouping . types [ k [ 1 ] ] ( d , d . $headerIndexed [ u ] , l [ f ] [ u ] , /date/ . test ( j ) ? k [ 2 ] : parseInt ( k [ 2 ] || 1 , 10 ) || 1 , r ) : h , r !== h && ( r = h , "number" === k [ 1 ] && k [ 2 ] > 1 && "" !== h && ( h += " - " + ( parseInt ( h , 10 ) + ( parseInt ( k [ 2 ] , 10 ) - 1 ) * ( d . $headerIndexed [ u ] . hasClass ( b . css . sortAsc ) ? 1 : - 1 ) ) ) , a . isFunction ( e . group _formatter ) && ( h = e . group _formatter ( ( h || "" ) . toString ( ) , u , c , d , e ) || h ) , i . before ( '<tr class="group-header ' + d . selectorRemove . slice ( 1 ) + '" unselectable="on" ' + ( d . tabIndex ? 'tabindex="0" ' : "" ) + 'data-group-index="' + s ++ + '"><td colspan="' + d . columns + '">' + ( e . group _collapsible ? "<i/>" : "" ) + '<span class="group-name">' + h + '</span><span class="group-count"></span></td></tr>' ) , e . group _saveGroups && ! t && e . group _collapsed && e . group _collapsible && e . group _currentGroups [ e . group _currentGroup ] . push ( h ) ) ) ; d . $table . find ( "tr.group-header" ) . bind ( "selectstart" , ! 1 ) . each ( function ( ) { var b , d , f , g = a ( this ) , h = g . nextUntil ( "tr.group-header" ) . filter ( ":visible" ) ; ( e . group _count || a . isFunction ( e . group _callback ) ) && ( d = g . find ( ".group-count" ) , d . length && ( e . group _count && d . html ( e . group _count . replace ( /\{num\}/g , h . length ) ) , a . isFunction ( e . group _callback ) && e . group _callback ( g . find ( "td" ) , h , u , c ) ) ) , e . group _saveGroups && ! a . isEmptyObject ( e . group _currentGroups ) && e . group _currentGroups [ e . group _currentGroup ] . length ? ( f = g . find ( ".group-name" ) . text ( ) . toLowerCase ( ) + g . attr ( "data-group-index" ) , b = a . inArray ( f , e . group _currentGroups [ e . group _currentGroup ] ) > - 1 , g . toggleClass ( "collapsed" , b ) , h . toggleClass ( "group-hidden" , b ) ) : e . group _collapsed && e . group _collapsible && ( g . addClass ( "collapsed" ) , h . addClass ( "group-hidden" ) ) } ) , d . $table . trigger ( e . group _complete ) } } } , bindEvents : function ( c , d , e ) { e . group _collapsible && ( e . group _currentGroups = [ ] ,
// .on() requires jQuery 1.7+
d . $table . on ( "click toggleGroup keyup" , "tr.group-header" , function ( f ) {
// pressing enter will toggle the group
if ( f . stopPropagation ( ) , "keyup" !== f . type || 13 === f . which ) { var g , h , i , j = a ( this ) , k = j . find ( ".group-name" ) . text ( ) . toLowerCase ( ) + j . attr ( "data-group-index" ) ;
// use shift-click to toggle ALL groups
! f . shiftKey || "click" !== f . type && "keyup" !== f . type || j . siblings ( ".group-header" ) . trigger ( "toggleGroup" ) , j . toggleClass ( "collapsed" ) ,
// nextUntil requires jQuery 1.4+
j . nextUntil ( "tr.group-header" ) . toggleClass ( "group-hidden" , j . hasClass ( "collapsed" ) ) ,
// save collapsed groups
e . group _saveGroups && b . storage && ( h = d . $table . find ( ".group-header" ) , g = j . hasClass ( "collapsed" ) , e . group _currentGroups [ e . group _currentGroup ] || ( e . group _currentGroups [ e . group _currentGroup ] = [ ] ) , g && e . group _currentGroup ? e . group _currentGroups [ e . group _currentGroup ] . push ( k ) : e . group _currentGroup && ( i = a . inArray ( k , e . group _currentGroups [ e . group _currentGroup ] ) , i > - 1 && e . group _currentGroups [ e . group _currentGroup ] . splice ( i , 1 ) ) , b . storage ( c , "tablesorter-groups" , e . group _currentGroups ) ) } } ) ) , a ( e . group _saveReset ) . on ( "click" , function ( ) { b . grouping . clearSavedGroups ( c ) } ) , d . $table . on ( "pagerChange.tsgrouping" , function ( ) { b . grouping . update ( c , d , e ) } ) } , clearSavedGroups : function ( a ) { a && b . storage && ( b . storage ( a , "tablesorter-groups" , "" ) , b . grouping . update ( a , a . config , a . config . widgetOptions ) ) } } , b . addWidget ( { id : "group" , priority : 100 , options : { group _collapsible : ! 0 , // make the group header clickable and collapse the rows below it.
group _collapsed : ! 1 , // start with all groups collapsed
group _saveGroups : ! 0 , // remember collapsed groups
group _saveReset : null , // element to clear saved collapsed groups
group _count : " ({num})" , // if not false, the '{num}' string is replaced with the number of rows in the group
group _separator : "-" , // group name separator; used when group-separator-# class is used.
group _formatter : null , // function(txt, column, table, c, wo) { return txt; }
group _callback : null , // function($cell, $rows, column, table){}, callback allowing modification of the group header labels
group _complete : "groupingComplete" , // event triggered on the table when the grouping widget has finished work
// apply the grouping widget only to selected column
group _forceColumn : [ ] , // only the first value is used; set as an array for future expansion
group _enforceSort : ! 0 , // only apply group_forceColumn when a sort is applied to the table
// checkbox parser text used for checked/unchecked values
group _checkbox : [ "checked" , "unchecked" ] ,
// change these default date names based on your language preferences
group _months : [ "Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" , "Aug" , "Sep" , "Oct" , "Nov" , "Dec" ] , group _week : [ "Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" ] , group _time : [ "AM" , "PM" ] ,
// use 12 vs 24 hour time
group _time24Hour : ! 1 ,
// group header text added for invalid dates
group _dateInvalid : "Invalid Date" ,
// this function is used when 'group-date' is set to create the date string
// you can just return date, date.toLocaleString(), date.toLocaleDateString() or d.toLocaleTimeString()
// reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Conversion_getter
group _dateString : function ( a ) { return a . toLocaleString ( ) } } , init : function ( a , c , d , e ) { b . grouping . bindEvents ( a , d , e ) } , format : function ( a , c , d ) { b . grouping . update ( a , c , d ) } , remove : function ( a , b , c ) { b . $table . off ( "click" , "tr.group-header" ) . off ( "pagerChange.tsgrouping" ) . find ( ".group-hidden" ) . removeClass ( "group-hidden" ) . end ( ) . find ( "tr.group-header" ) . remove ( ) } } ) } ( jQuery ) ;