@@ -4,34 +4,90 @@ var DataController = function (dataSource, dataChangeTrigger) {
44 throw new Error ( "dataChangeTrigger parameter must be a function" ) ;
55 }
66
7- this . data = null ;
8- this . SORT_STATE = {
9- column : null ,
10- order : - 1
11- } ;
7+ this . _dataStack = [ ] ;
8+
9+ this . pushData ( ) ;
1210 this . dataChangeTrigger = dataChangeTrigger ;
1311
1412} ;
1513
14+ /**
15+ * Performs check if data is valid.
16+ *
17+ * @param {{ dimensions: Object[], dataArray: Array, info: Object } } data
18+ * @returns boolean
19+ */
20+ DataController . prototype . isValidData = function ( data ) {
21+
22+ return data . dimensions instanceof Array
23+ && data . dimensions [ 0 ] instanceof Array
24+ && data . dimensions [ 0 ] . length > 0
25+ && data . dimensions [ 1 ] . length > 0
26+ && data . dimensions [ 0 ] [ 0 ] . hasOwnProperty ( "caption" )
27+ && data . dimensions [ 1 ] [ 0 ] . hasOwnProperty ( "caption" )
28+ && data . dataArray instanceof Array
29+ && typeof data [ "info" ] === "object"
30+ && data [ "info" ] [ "cubeName" ] ;
31+
32+ } ;
33+
34+ DataController . prototype . pushData = function ( ) {
35+
36+ var d ;
37+
38+ this . _dataStack . push ( d = {
39+ data : null ,
40+ SORT_STATE : {
41+ column : null ,
42+ order : - 1
43+ }
44+ } ) ;
45+
46+ //this.data = d.data;
47+ this . SORT_STATE = d . SORT_STATE ;
48+
49+ } ;
50+
51+ DataController . prototype . popData = function ( ) {
52+
53+ if ( this . _dataStack . length < 2 ) return ;
54+
55+ var d = this . _dataStack [ this . _dataStack . length - 2 ] ;
56+
57+ this . _dataStack . pop ( ) ;
58+
59+ //this.data = d.data;
60+ this . SORT_STATE = d . SORT_STATE ;
61+
62+ } ;
63+
1664DataController . prototype . getData = function ( ) {
1765
18- return this . data ;
66+ return this . _dataStack [ this . _dataStack . length - 1 ] . data ;
1967
2068} ;
2169
2270DataController . prototype . setData = function ( data ) {
2371
24- this . data = data ;
72+ if ( ! this . isValidData ( data ) ) {
73+ console . error ( "Invalid data to set." , data ) ;
74+ return ;
75+ }
76+
77+ this . _dataStack [ this . _dataStack . length - 1 ] . data = data ;
78+ //this.data = data;
2579 this . resetRawData ( ) ;
2680
2781 this . _trigger ( ) ;
28- return this . data ;
82+ return data ;
2983
3084} ;
3185
3286DataController . prototype . resetRawData = function ( ) {
3387
34- if ( ! this . data ) {
88+ var data ;
89+
90+ if ( ! ( data = this . _dataStack [ this . _dataStack . length - 1 ] . data ) ) {
3591 console . error ( "Unable to create raw data for given data set." ) ;
3692 return ;
3793 }
@@ -84,14 +140,15 @@ DataController.prototype.resetRawData = function () {
84140
85141 } ;
86142
87- dim0raw ( rd0 , this . data . dimensions [ 0 ] ) ;
88- dim1raw ( rd1 , this . data . dimensions [ 1 ] ) ;
143+ dim0raw ( rd0 , data . dimensions [ 0 ] ) ;
144+ dim1raw ( rd1 , data . dimensions [ 1 ] ) ;
89145
90146 var xw = rd0 [ 0 ] . length ,
91147 yh = rd1 . length ,
92148 xh = rd0 . length ,
93149 yw = rd1 [ 0 ] . length ;
94150
151+ // render columns, rows and data
95152 for ( var y = 0 ; y < xh + yh ; y ++ ) {
96153 if ( ! rawData [ y ] ) rawData [ y ] = [ ] ;
97154 for ( var x = 0 ; x < yw + xw ; x ++ ) {
@@ -100,7 +157,7 @@ DataController.prototype.resetRawData = function () {
100157 rawData [ y ] [ x ] = {
101158 group : 1 ,
102159 isCaption : true ,
103- value : ( this . data [ "info" ] || { } ) [ "cubeName" ] || ""
160+ value : ( data [ "info" ] || { } ) [ "cubeName" ] || ""
104161 } ;
105162 } else {
106163 rawData [ y ] [ x ] = rd1 [ y - xh ] [ x ] ;
@@ -110,18 +167,18 @@ DataController.prototype.resetRawData = function () {
110167 rawData [ y ] [ x ] = rd0 [ y ] [ x - yw ] ;
111168 } else {
112169 rawData [ y ] [ x ] = {
113- value : this . data . dataArray [ ( xw ) * ( y - xh ) + x - yw ] || ""
170+ value : data . dataArray [ ( xw ) * ( y - xh ) + x - yw ] || ""
114171 } ;
115172 }
116173 }
117174 }
118175 }
119176
120- this . data . info . topHeaderRowsNumber = xh ;
121- this . data . info . leftHeaderColumnsNumber = yw ;
122- this . data . rawData = this . data . _rawDataOrigin = rawData ;
177+ data . info . topHeaderRowsNumber = xh ;
178+ data . info . leftHeaderColumnsNumber = yw ;
179+ data . rawData = data . _rawDataOrigin = rawData ;
123180
124- return this . data . rawData ;
181+ return data . rawData ;
125182
126183} ;
127184
@@ -143,19 +200,21 @@ DataController.prototype._trigger = function () {
143200 */
144201DataController . prototype . sortByColumn = function ( columnIndex ) {
145202
203+ var data = this . _dataStack [ this . _dataStack . length - 1 ] . data ;
204+
146205 if ( this . SORT_STATE . column !== columnIndex ) {
147206 order = this . SORT_STATE . order = 0 ;
148207 }
149208
150- var newRawData = this . data . _rawDataOrigin . slice ( this . data . info . topHeaderRowsNumber ) ,
151- xIndex = this . data . info . leftHeaderColumnsNumber + columnIndex ,
209+ var newRawData = data . _rawDataOrigin . slice ( data . info . topHeaderRowsNumber ) ,
210+ xIndex = data . info . leftHeaderColumnsNumber + columnIndex ,
152211 order = this . SORT_STATE . order === - 1 ? 1 : this . SORT_STATE . order === 1 ? 0 : - 1 ;
153212
154213 this . SORT_STATE . order = order ;
155214 this . SORT_STATE . column = columnIndex ;
156215
157216 if ( order === 0 ) {
158- this . data . rawData = this . data . _rawDataOrigin ;
217+ data . rawData = data . _rawDataOrigin ;
159218 this . _trigger ( ) ;
160219 return ;
161220 }
@@ -166,7 +225,7 @@ DataController.prototype.sortByColumn = function (columnIndex) {
166225 return order * b [ xIndex ] . value - order * a [ xIndex ] . value ;
167226 } ) ;
168227
169- this . data . rawData = this . data . _rawDataOrigin . slice ( 0 , this . data . info . topHeaderRowsNumber )
228+ data . rawData = data . _rawDataOrigin . slice ( 0 , data . info . topHeaderRowsNumber )
170229 . concat ( newRawData ) ;
171230
172231 this . _trigger ( ) ;
0 commit comments