@@ -295,59 +295,78 @@ DataController.prototype.TOTAL_FUNCTIONS = {
295295 return isFinite ( a ) ;
296296 } ,
297297
298- totalSUM : function ( array , iStart , iEnd , column ) {
298+ totalSUM : function ( array , iStart , iEnd , column , xStart , row ) {
299299 var sum = 0 ;
300300 for ( var i = iStart ; i < iEnd ; i ++ ) {
301- if ( this . isNumber ( array [ i ] [ column ] [ "value" ] ) ) {
302- sum += parseFloat ( array [ i ] [ column ] [ "value" ] ) || 0 ;
301+ var r = typeof row === "undefined" ? i : row ,
302+ c = typeof column === "undefined" ? i : column ;
303+ if ( this . isNumber ( array [ r ] [ c ] [ "value" ] ) ) {
304+ sum += parseFloat ( array [ r ] [ c ] [ "value" ] ) || 0 ;
303305 }
304306 }
305307 return sum ;
306308 } ,
307309
308- totalAVG : function ( array , iStart , iEnd , column ) {
310+ totalAVG : function ( array , iStart , iEnd , column , xStart , row ) {
309311 var sum = 0 ;
310312 for ( var i = iStart ; i < iEnd ; i ++ ) {
311- if ( ! this . isNumber ( array [ i ] [ column ] [ "value" ] ) ) {
313+ var r = typeof row === "undefined" ? i : row ,
314+ c = typeof column === "undefined" ? i : column ;
315+ if ( ! this . isNumber ( array [ r ] [ c ] [ "value" ] ) ) {
312316 sum = 0 ;
313317 break ;
314318 }
315- sum += parseFloat ( array [ i ] [ column ] [ "value" ] ) || 0 ;
319+ sum += parseFloat ( array [ r ] [ c ] [ "value" ] ) || 0 ;
316320 }
317321 return sum / ( iEnd - iStart ) || "" ;
318322 } ,
319323
320- totalCOUNT : function ( array , iStart , iEnd ) {
321- return iEnd - iStart ;
324+ totalCOUNT : function ( array , iStart , iEnd , column , xStart , row ) {
325+ var count = 0 ;
326+ for ( var i = iStart ; i < iEnd ; i ++ ) {
327+ var r = typeof row === "undefined" ? i : row ,
328+ c = typeof column === "undefined" ? i : column ;
329+ if ( array [ r ] [ c ] [ "value" ] ) {
330+ count ++ ;
331+ }
332+ }
333+ return count ;
322334 } ,
323335
324- totalMIN : function ( array , iStart , iEnd , column ) {
336+ totalMIN : function ( array , iStart , iEnd , column , xStart , row ) {
325337 var min = Infinity ;
326338 for ( var i = iStart ; i < iEnd ; i ++ ) {
327- if ( this . isNumber ( array [ i ] [ column ] [ "value" ] ) && array [ i ] [ column ] [ "value" ] < min ) {
328- min = array [ i ] [ column ] [ "value" ] ;
339+ var r = typeof row === "undefined" ? i : row ,
340+ c = typeof column === "undefined" ? i : column ;
341+ if ( this . isNumber ( array [ r ] [ c ] [ "value" ] ) && array [ r ] [ c ] [ "value" ] < min ) {
342+ min = array [ r ] [ c ] [ "value" ] ;
329343 }
330344 }
331345 return min ;
332346 } ,
333347
334- totalMAX : function ( array , iStart , iEnd , column ) {
348+ totalMAX : function ( array , iStart , iEnd , column , xStart , row ) {
335349 var max = - Infinity ;
336350 for ( var i = iStart ; i < iEnd ; i ++ ) {
337- if ( this . isNumber ( array [ i ] [ column ] [ "value" ] ) && array [ i ] [ column ] [ "value" ] > max ) {
338- max = array [ i ] [ column ] [ "value" ] ;
351+ var r = typeof row === "undefined" ? i : row ,
352+ c = typeof column === "undefined" ? i : column ;
353+ if ( this . isNumber ( array [ r ] [ c ] [ "value" ] ) && array [ r ] [ c ] [ "value" ] > max ) {
354+ max = array [ r ] [ c ] [ "value" ] ;
339355 }
340356 }
341357 return max ;
342358 } ,
343359
344- totalPERCENTAGE : function ( array , iStart , iEnd , column , xStart ) {
360+ totalPERCENTAGE : function ( array , iStart , iEnd , column , xStart , row ) {
345361 var averages = [ ] , x , summ ;
346- for ( x = xStart ; x < array [ 0 ] . length ; x ++ ) {
347- averages . push ( this . totalSUM ( array , iStart , iEnd , x ) ) ;
362+ for ( x = xStart ; x < typeof column === "undefined" ? array . length : array [ 0 ] . length ; x ++ ) {
363+ averages . push ( this . totalSUM ( array , iStart , iEnd ,
364+ typeof column === "undefined" ? column : x , xStart ,
365+ typeof row === "undefined" ? row : x ) ) ;
348366 }
349367 summ = averages . reduce ( function ( a , b ) { return a + b ; } ) ;
350- return ( averages [ column - xStart ] / summ * 100 || 0 ) . toFixed ( 2 ) + "%" ;
368+ return ( averages [ ( typeof row === "undefined" ? column : row ) - xStart ]
369+ / summ * 100 || 0 ) . toFixed ( 2 ) + "%" ;
351370 } ,
352371
353372 totalNONE : function ( ) {
@@ -378,6 +397,8 @@ DataController.prototype.setLeftHeaderColumnsNumber = function (data) {
378397 */
379398DataController . prototype . resetRawData = function ( ) {
380399
400+ var TOTALS_STYLE = "font-weight: bold;text-align: right;" ;
401+
381402 var data , summary , y , x ,
382403 dimCaption ,
383404 _ = this ;
@@ -579,13 +600,16 @@ DataController.prototype.resetRawData = function () {
579600
580601 /**
581602 * @param {number } columnIndex
603+ * @param {boolean=false } byColumns
582604 * @returns {Function }
583605 */
584- var getTotalFunction = function ( columnIndex ) {
585- var pivotDefault = _ . controller . getPivotProperty ( [ "rowTotalAgg" ] ) ;
586- if ( ! data [ "columnProps" ] [ columnIndex ] && ! pivotDefault )
606+ var getTotalFunction = function ( columnIndex , byColumns ) {
607+ var pivotDefault = _ . controller . getPivotProperty ( [ "rowTotalAgg" ] ) || "sum" ,
608+ pivotDefaultCol = _ . controller . getPivotProperty ( [ "columnTotalAgg" ] ) || "sum" ,
609+ props = byColumns ? "rowProps" : "columnProps" ;
610+ if ( ! data [ props ] [ columnIndex ] && ! ( byColumns ? pivotDefaultCol : pivotDefault ) )
587611 return _ . TOTAL_FUNCTIONS . totalSUM ;
588- switch ( ( data [ "columnProps" ] [ columnIndex ] || { } ) . summary || pivotDefault ) {
612+ switch ( ( data [ props ] [ columnIndex ] || { } ) . summary || pivotDefault ) {
589613 case "count" : return _ . TOTAL_FUNCTIONS . totalCOUNT ;
590614 case "avg" : return _ . TOTAL_FUNCTIONS . totalAVG ;
591615 case "min" : return _ . TOTAL_FUNCTIONS . totalMIN ;
@@ -596,7 +620,7 @@ DataController.prototype.resetRawData = function () {
596620 }
597621 } ;
598622
599- if ( this . controller . CONFIG [ "showSummary" ] && rawData . length - xh > 1 // xh - see above
623+ if ( this . controller . CONFIG [ "showSummary" ] && rawData . length - data . info . topHeaderRowsNumber > 1
600624 && ( rawData [ rawData . length - 1 ] [ 0 ] || { } ) [ "isCaption" ] ) {
601625 data . info . SUMMARY_SHOWN = true ;
602626 this . SUMMARY_SHOWN = true ;
@@ -619,7 +643,7 @@ DataController.prototype.resetRawData = function () {
619643 this . TOTAL_FUNCTIONS ,
620644 rawData , xh , rawData . length , i , data . info . leftHeaderColumnsNumber
621645 ) ,
622- style : "font-weight: bold;text-align: right;"
646+ style : TOTALS_STYLE
623647 }
624648 }
625649 }
@@ -632,6 +656,31 @@ DataController.prototype.resetRawData = function () {
632656 }
633657 }
634658
659+ if ( this . controller . getPivotProperty ( [ "columnTotals" ] )
660+ && rawData . length - data . info . topHeaderRowsNumber > 1
661+ && data . info . leftHeaderColumnsNumber > 0 ) {
662+ var group = ++ groupNum ,
663+ row ;
664+ for ( row = 0 ; row < data . info . topHeaderRowsNumber ; row ++ ) {
665+ rawData [ row ] . push ( {
666+ group : group ,
667+ isCaption : true ,
668+ value : pivotLocale . get ( 0 )
669+ } ) ;
670+ }
671+ for ( row = data . info . topHeaderRowsNumber ; row < rawData . length ; row ++ ) {
672+ rawData [ row ] . push ( {
673+ isCaption : true ,
674+ value : getTotalFunction ( row , true ) . call (
675+ this . TOTAL_FUNCTIONS ,
676+ rawData , data . info . leftHeaderColumnsNumber , rawData [ row ] . length , undefined ,
677+ data . info . leftHeaderColumnsNumber , row
678+ ) ,
679+ style : TOTALS_STYLE
680+ } ) ;
681+ }
682+ }
683+
635684 rawData = parseColumnFormatting ( rawData ) ;
636685
637686 data . rawData = data . _rawDataOrigin = rawData ;
0 commit comments