1- var DataController = function ( dataSource , dataChangeTrigger ) {
1+ /**
2+ * @param {LightPivotTable } controller
3+ * @param {function } dataChangeTrigger
4+ * @constructor
5+ */
6+ var DataController = function ( controller , dataChangeTrigger ) {
27
38 if ( dataChangeTrigger && typeof dataChangeTrigger !== "function" ) {
49 throw new Error ( "dataChangeTrigger parameter must be a function" ) ;
510 }
611
712 this . _dataStack = [ ] ;
813
14+ this . controller = controller ;
15+
916 this . pushData ( ) ;
1017 this . dataChangeTrigger = dataChangeTrigger ;
1118
19+ this . SUMMARY_SHOWN = false ;
20+
1221} ;
1322
1423/**
@@ -85,14 +94,14 @@ DataController.prototype.setData = function (data) {
8594
8695DataController . prototype . resetRawData = function ( ) {
8796
88- var data ;
97+ var data , summary , y , x ;
8998
9099 if ( ! ( data = this . _dataStack [ this . _dataStack . length - 1 ] . data ) ) {
91100 console . error ( "Unable to create raw data for given data set." ) ;
92101 return ;
93102 }
94103
95- var rd0 = [ ] , rd1 = [ ] , num = 2 , rawData = [ ] ;
104+ var rd0 = [ ] , rd1 = [ ] , groupNum = 2 , rawData = [ ] ;
96105
97106 var transpose = function ( a ) {
98107 return Object . keys ( a [ 0 ] ) . map ( function ( c ) {
@@ -118,9 +127,9 @@ DataController.prototype.resetRawData = function () {
118127 var cnum ;
119128
120129 for ( var i in c ) {
121- cnum = num ;
130+ cnum = groupNum ;
122131 if ( c [ i ] . children ) {
123- num ++ ;
132+ groupNum ++ ;
124133 dim1raw ( a , c [ i ] . children , arr . concat ( {
125134 group : cnum ,
126135 source : c [ i ] ,
@@ -129,12 +138,12 @@ DataController.prototype.resetRawData = function () {
129138 } ) ) ;
130139 } else {
131140 a . push ( arr . concat ( {
132- group : num ,
141+ group : groupNum ,
133142 source : c [ i ] ,
134143 isCaption : true ,
135144 value : c [ i ] . caption || ""
136145 } ) ) ;
137- num ++ ;
146+ groupNum ++ ;
138147 }
139148 }
140149
@@ -149,9 +158,9 @@ DataController.prototype.resetRawData = function () {
149158 yw = ( rd1 [ 0 ] || [ ] ) . length ;
150159
151160 // render columns, rows and data
152- for ( var y = 0 ; y < xh + yh ; y ++ ) {
161+ for ( y = 0 ; y < xh + yh ; y ++ ) {
153162 if ( ! rawData [ y ] ) rawData [ y ] = [ ] ;
154- for ( var x = 0 ; x < yw + xw ; x ++ ) {
163+ for ( x = 0 ; x < yw + xw ; x ++ ) {
155164 if ( x < yw ) {
156165 if ( y < xh ) {
157166 rawData [ y ] [ x ] = {
@@ -176,6 +185,40 @@ DataController.prototype.resetRawData = function () {
176185
177186 data . info . topHeaderRowsNumber = xh ;
178187 data . info . leftHeaderColumnsNumber = yw ;
188+ this . SUMMARY_SHOWN = false ;
189+
190+ if ( this . controller . CONFIG [ "showSummary" ] && rawData . length - xh > 1 // xh - see above
191+ && ( rawData [ rawData . length - 1 ] [ 0 ] || { } ) [ "isCaption" ] ) {
192+ this . SUMMARY_SHOWN = true ;
193+ rawData . push ( summary = [ ] ) ;
194+ x = rawData . length - 2 ;
195+ for ( var i in rawData [ x ] ) {
196+ if ( rawData [ x ] [ i ] . isCaption ) {
197+ summary [ i ] = {
198+ group : groupNum ,
199+ isCaption : true ,
200+ source : { } ,
201+ value : "Σ"
202+ }
203+ } else {
204+ summary [ i ] = {
205+ value : ( function countSummaryByColumn ( array , iStart , iEnd , column ) {
206+ var sum = 0 ;
207+ for ( var i = iStart ; i < iEnd ; i ++ ) {
208+ if ( ! isFinite ( array [ i ] [ column ] [ "value" ] ) ) {
209+ sum = 0 ;
210+ break ;
211+ }
212+ sum += parseFloat ( array [ i ] [ column ] [ "value" ] ) || 0 ;
213+ }
214+ return sum || "" ;
215+ } ) ( rawData , xh , rawData . length - xh , i )
216+ }
217+ }
218+ }
219+ groupNum ++ ;
220+ }
221+
179222 data . rawData = data . _rawDataOrigin = rawData ;
180223
181224 return data . rawData ;
@@ -206,10 +249,15 @@ DataController.prototype.sortByColumn = function (columnIndex) {
206249 order = this . SORT_STATE . order = 0 ;
207250 }
208251
209- var newRawData = data . _rawDataOrigin . slice ( data . info . topHeaderRowsNumber ) ,
252+ var newRawData = data . _rawDataOrigin . slice (
253+ data . info . topHeaderRowsNumber ,
254+ data . _rawDataOrigin . length - ( this . SUMMARY_SHOWN ? 1 : 0 )
255+ ) ,
210256 xIndex = data . info . leftHeaderColumnsNumber + columnIndex ,
211257 order = this . SORT_STATE . order === - 1 ? 1 : this . SORT_STATE . order === 1 ? 0 : - 1 ;
212258
259+
260+
213261 this . SORT_STATE . order = order ;
214262 this . SORT_STATE . column = columnIndex ;
215263
@@ -228,7 +276,10 @@ DataController.prototype.sortByColumn = function (columnIndex) {
228276 } ) ;
229277
230278 data . rawData = data . _rawDataOrigin . slice ( 0 , data . info . topHeaderRowsNumber )
231- . concat ( newRawData ) ;
279+ . concat ( newRawData )
280+ . concat ( this . SUMMARY_SHOWN ? [ data . _rawDataOrigin [ data . _rawDataOrigin . length - 1 ] ] : [ ] ) ;
281+
282+ console . log ( data . rawData ) ;
232283
233284 this . _trigger ( ) ;
234285
0 commit comments