@@ -97,6 +97,7 @@ DataController.prototype.setData = function (data) {
97
97
98
98
this . _dataStack [ this . _dataStack . length - 1 ] . data = data ;
99
99
//this.data = data;
100
+ this . setLeftHeaderColumnsNumber ( data ) ; // required in resetDimensionProps()
100
101
this . resetDimensionProps ( ) ;
101
102
this . resetConditionalFormatting ( ) ;
102
103
this . resetRawData ( ) ;
@@ -130,13 +131,16 @@ DataController.prototype.setDrillThroughHandler = function (handler) {
130
131
*/
131
132
DataController . prototype . resetDimensionProps = function ( ) {
132
133
133
- var data , columnProps = [ ] ;
134
+ var data , columnProps ;
134
135
135
136
if ( ! ( data = this . _dataStack [ this . _dataStack . length - 1 ] . data ) ) {
136
137
console . error ( "Unable to get dimension props for given data set." ) ;
137
138
return ;
138
139
}
139
140
141
+ columnProps = new Array ( data . info . leftHeaderColumnsNumber || 0 ) ; // fill left headers as empty
142
+ for ( var i = 0 ; i < columnProps . length ; i ++ ) { columnProps [ i ] = { } ; }
143
+
140
144
var cloneObj = function ( obj ) {
141
145
var i , newObj = { } ;
142
146
for ( i in obj ) newObj [ i ] = obj [ i ] ;
@@ -153,12 +157,14 @@ DataController.prototype.resetDimensionProps = function () {
153
157
if ( tObj [ "style" ] ) clonedProps [ "style" ] =
154
158
( clonedProps [ "style" ] || "" ) + tObj [ "style" ] ;
155
159
if ( tObj [ "summary" ] ) clonedProps [ "summary" ] = tObj [ "summary" ] ;
160
+ // somehow "summary" were changed to "total" - reapplying
161
+ if ( tObj [ "total" ] ) clonedProps [ "summary" ]
162
+ = ( tObj [ "total" ] || "" ) . toLowerCase ( ) . replace ( / : .* / , "" ) ; // what is "max:Days"?
156
163
if ( tObj [ "type" ] ) clonedProps [ "type" ] = tObj [ "type" ] ;
157
164
parse ( tObj , clonedProps ) ;
158
165
}
159
166
} else {
160
- clonedProps = cloneObj ( props ) ;
161
- columnProps . push ( clonedProps ) ;
167
+ columnProps . push ( cloneObj ( props ) ) ;
162
168
}
163
169
} ;
164
170
@@ -270,11 +276,16 @@ DataController.prototype.resetConditionalFormatting = function () {
270
276
* @see getTotalFunction
271
277
*/
272
278
DataController . prototype . TOTAL_FUNCTIONS = {
279
+
280
+ isNumber : function ( a ) {
281
+ if ( a == "" ) return false ;
282
+ return isFinite ( a ) ;
283
+ } ,
273
284
274
285
totalSUM : function ( array , iStart , iEnd , column ) {
275
286
var sum = 0 ;
276
287
for ( var i = iStart ; i < iEnd ; i ++ ) {
277
- if ( isFinite ( array [ i ] [ column ] [ "value" ] ) ) {
288
+ if ( this . isNumber ( array [ i ] [ column ] [ "value" ] ) ) {
278
289
sum += parseFloat ( array [ i ] [ column ] [ "value" ] ) || 0 ;
279
290
}
280
291
}
@@ -284,7 +295,7 @@ DataController.prototype.TOTAL_FUNCTIONS = {
284
295
totalAVG : function ( array , iStart , iEnd , column ) {
285
296
var sum = 0 ;
286
297
for ( var i = iStart ; i < iEnd ; i ++ ) {
287
- if ( ! isFinite ( array [ i ] [ column ] [ "value" ] ) ) {
298
+ if ( ! this . isNumber ( array [ i ] [ column ] [ "value" ] ) ) {
288
299
sum = 0 ;
289
300
break ;
290
301
}
@@ -300,7 +311,7 @@ DataController.prototype.TOTAL_FUNCTIONS = {
300
311
totalMIN : function ( array , iStart , iEnd , column ) {
301
312
var min = Infinity ;
302
313
for ( var i = iStart ; i < iEnd ; i ++ ) {
303
- if ( isFinite ( array [ i ] [ column ] [ "value" ] ) && array [ i ] [ column ] [ "value" ] < min ) {
314
+ if ( this . isNumber ( array [ i ] [ column ] [ "value" ] ) && array [ i ] [ column ] [ "value" ] < min ) {
304
315
min = array [ i ] [ column ] [ "value" ] ;
305
316
}
306
317
}
@@ -310,7 +321,7 @@ DataController.prototype.TOTAL_FUNCTIONS = {
310
321
totalMAX : function ( array , iStart , iEnd , column ) {
311
322
var max = - Infinity ;
312
323
for ( var i = iStart ; i < iEnd ; i ++ ) {
313
- if ( isFinite ( array [ i ] [ column ] [ "value" ] ) && array [ i ] [ column ] [ "value" ] > max ) {
324
+ if ( this . isNumber ( array [ i ] [ column ] [ "value" ] ) && array [ i ] [ column ] [ "value" ] > max ) {
314
325
max = array [ i ] [ column ] [ "value" ] ;
315
326
}
316
327
}
@@ -332,6 +343,21 @@ DataController.prototype.TOTAL_FUNCTIONS = {
332
343
333
344
} ;
334
345
346
+ DataController . prototype . setLeftHeaderColumnsNumber = function ( data ) {
347
+
348
+ function getLev ( o , lev ) {
349
+ if ( ! ( o . children instanceof Array ) ) return lev ;
350
+ var nextLev = lev + 1 ;
351
+ for ( var i = 0 ; i < o . children . length ; i ++ ) {
352
+ lev = Math . max ( getLev ( o . children [ i ] , nextLev ) , lev ) ;
353
+ }
354
+ return lev ;
355
+ }
356
+
357
+ data . info . leftHeaderColumnsNumber = getLev ( { children : data . dimensions [ 1 ] || [ ] } , 0 ) ;
358
+
359
+ } ;
360
+
335
361
/**
336
362
* Renders table data (pseudo-table object) from data retrieved from MDX2JSON source.
337
363
*
@@ -540,7 +566,7 @@ DataController.prototype.resetRawData = function () {
540
566
var pivotDefault = _ . controller . getPivotProperty ( [ "rowTotalAgg" ] ) ;
541
567
if ( ! data [ "columnProps" ] [ columnIndex ] && ! pivotDefault )
542
568
return _ . TOTAL_FUNCTIONS . totalSUM ;
543
- switch ( data [ "columnProps" ] [ columnIndex ] . summary || pivotDefault ) {
569
+ switch ( ( data [ "columnProps" ] [ columnIndex ] || { } ) . summary || pivotDefault ) {
544
570
case "count" : return _ . TOTAL_FUNCTIONS . totalCOUNT ;
545
571
case "avg" : return _ . TOTAL_FUNCTIONS . totalAVG ;
546
572
case "min" : return _ . TOTAL_FUNCTIONS . totalMIN ;
@@ -570,7 +596,7 @@ DataController.prototype.resetRawData = function () {
570
596
applyHeaderStyle ( summary [ i ] , false ) ;
571
597
} else {
572
598
summary [ i ] = {
573
- value : getTotalFunction ( parseInt ( i ) - data . info . leftHeaderColumnsNumber ) . call (
599
+ value : getTotalFunction ( parseInt ( i ) ) . call (
574
600
this . TOTAL_FUNCTIONS ,
575
601
rawData , xh , rawData . length , i , data . info . leftHeaderColumnsNumber
576
602
) ,
0 commit comments