@@ -188,10 +188,108 @@ window.UserView = countlyView.extend({
188
188
189
189
window . LoyaltyView = countlyView . extend ( {
190
190
beforeRender : function ( ) {
191
- return $ . when ( countlySession . initialize ( ) ) . then ( function ( ) { } ) ;
191
+ return $ . when ( countlySession . initialize ( ) , this . getLoyaltyData ( ) ) . then ( function ( ) { } ) ;
192
+ } ,
193
+ getLoyaltyData : function ( ) {
194
+ var self = this ;
195
+ return $ . ajax ( {
196
+ type : "GET" ,
197
+ url : countlyCommon . API_PARTS . data . r + '/app_users/loyalty' ,
198
+ data : {
199
+ app_id : countlyCommon . ACTIVE_APP_ID ,
200
+ api_key : countlyGlobal . member . api_key
201
+ } ,
202
+ dataType : "json" ,
203
+ success : function ( result ) {
204
+ self . loyaltyData = result ;
205
+ }
206
+ } ) ;
207
+ } ,
208
+ fetchResult : function ( ) {
209
+ var dp = [
210
+ { "data" : [ [ - 1 , null ] ] , label : jQuery . i18n . map [ 'user-loyalty.all' ] } ,
211
+ { "data" : [ [ - 1 , null ] ] , label : jQuery . i18n . map [ 'user-loyalty.thirty-days' ] } ,
212
+ { "data" : [ [ - 1 , null ] ] , label : jQuery . i18n . map [ 'user-loyalty.seven-days' ] }
213
+ ] ;
214
+ var ticks = [ [ - 1 , "" ] ] ;
215
+ var ranges = countlySession . getLoyalityRange ( ) ;
216
+
217
+ var allData = this . loyaltyData . all || [ ] ;
218
+ var thirtyDaysData = this . loyaltyData [ '30days' ] || [ ] ;
219
+ var sevenDaysData = this . loyaltyData [ '7days' ] || [ ] ;
220
+
221
+ // Chart data
222
+ var totals = [ 0 , 0 , 0 ] ; //[allTotal, thirtDaysTotal, sevendaysTotal]
223
+
224
+ for ( var iRange = 0 ; iRange < ranges . length ; iRange ++ ) {
225
+ var index = ticks . length - 1 ;
226
+ var dp0 = allData . find ( function ( data ) { // eslint-disable-line no-loop-func
227
+ return data . _id . replace ( '>' , '>' ) === ranges [ iRange ] ;
228
+ } ) ;
229
+ var dp1 = thirtyDaysData . find ( function ( data ) { // eslint-disable-line no-loop-func
230
+ return data . _id . replace ( '>' , '>' ) === ranges [ iRange ] ;
231
+ } ) ;
232
+ var dp2 = sevenDaysData . find ( function ( data ) { // eslint-disable-line no-loop-func
233
+ return data . _id . replace ( '>' , '>' ) === ranges [ iRange ] ;
234
+ } ) ;
235
+
236
+ if ( dp0 ) {
237
+ dp [ 0 ] . data . push ( [ index , dp0 . count ] ) ;
238
+ totals [ 0 ] += dp0 . count ;
239
+ }
240
+
241
+ if ( dp1 ) {
242
+ dp [ 1 ] . data . push ( [ index , dp1 . count ] ) ;
243
+ totals [ 1 ] += dp1 . count ;
244
+ }
245
+
246
+ if ( dp2 ) {
247
+ dp [ 2 ] . data . push ( [ index , dp2 . count ] ) ;
248
+ totals [ 2 ] += dp2 . count ;
249
+ }
250
+
251
+ if ( dp0 || dp1 || dp2 ) {
252
+ ticks . push ( [ index , ranges [ iRange ] ] ) ;
253
+ }
254
+ }
255
+ ticks . push ( [ ticks . length - 1 , "" ] ) ;
256
+
257
+ dp [ 0 ] . data . push ( [ dp [ 0 ] . data . length - 1 , null ] ) ;
258
+ dp [ 1 ] . data . push ( [ dp [ 1 ] . data . length - 1 , null ] ) ;
259
+ dp [ 2 ] . data . push ( [ dp [ 2 ] . data . length - 1 , null ] ) ;
260
+
261
+ var chartDP = {
262
+ dp : dp ,
263
+ ticks : ticks
264
+ } ;
265
+
266
+ // Datatable data
267
+ var chartData = [ ] ;
268
+ for ( var iTick = 1 ; iTick < ticks . length - 1 ; iTick ++ ) {
269
+ var all = dp [ 0 ] . data [ iTick ] [ 1 ] ? countlyCommon . formatNumber ( dp [ 0 ] . data [ iTick ] [ 1 ] ) : 0 ;
270
+ var allPercentage = countlyCommon . formatNumber ( ( 100 * all ) / totals [ 0 ] , 2 ) ;
271
+
272
+ var tDays = dp [ 1 ] . data [ iTick ] [ 1 ] ? countlyCommon . formatNumber ( dp [ 1 ] . data [ iTick ] [ 1 ] ) : 0 ;
273
+ var tDaysPercentage = countlyCommon . formatNumber ( ( 100 * tDays ) / totals [ 1 ] , 2 ) ;
274
+
275
+ var sDays = dp [ 2 ] . data [ iTick ] [ 1 ] ? countlyCommon . formatNumber ( dp [ 2 ] . data [ iTick ] [ 1 ] ) : 0 ;
276
+ var sDaysPercentage = countlyCommon . formatNumber ( ( 100 * sDays ) / totals [ 2 ] , 2 ) ;
277
+
278
+ chartData . push ( {
279
+ l : ticks [ iTick ] [ 1 ] ,
280
+ a : "<div style='float:left;min-width: 40px'>" + all + "</div><div class='percent-bar' style='width:" + ( allPercentage * 0.8 ) + "%'></div>" + allPercentage + "%" ,
281
+ td : "<div style='float:left;min-width: 40px'>" + tDays + "</div><div class='percent-bar' style='width:" + ( tDaysPercentage * 0.8 ) + "%'></div>" + tDaysPercentage + "%" ,
282
+ sd : "<div style='float:left;min-width: 40px'>" + sDays + "</div><div class='percent-bar' style='width:" + ( sDaysPercentage * 0.8 ) + "%'></div>" + sDaysPercentage + "%"
283
+ } ) ;
284
+ }
285
+
286
+ return {
287
+ chartData : chartData ,
288
+ chartDP : chartDP
289
+ } ;
192
290
} ,
193
291
renderCommon : function ( isRefresh ) {
194
- var loyaltyData = countlySession . getRangeData ( "l" , "l-ranges" , countlySession . explainLoyaltyRange , countlySession . getLoyalityRange ( ) ) ;
292
+ var chartData = this . fetchResult ( ) ;
195
293
196
294
this . templateData = {
197
295
"page-title" : jQuery . i18n . map [ "user-loyalty.title" ] ,
@@ -201,23 +299,35 @@ window.LoyaltyView = countlyView.extend({
201
299
} ;
202
300
203
301
if ( ! isRefresh ) {
302
+ var self = this ;
303
+
204
304
$ ( this . el ) . html ( this . template ( this . templateData ) ) ;
305
+ $ ( '#date-selector' ) . hide ( ) ;
306
+
307
+ var labelsHtml = $ ( '<div id="label-container"><div class="labels"></div></div>' ) ;
308
+ var onLabelClick = function ( ) {
309
+ $ ( this ) . toggleClass ( "hidden" ) ;
310
+ countlyCommon . drawGraph ( self . getActiveLabelData ( chartData . chartDP ) , "#dashboard-graph" , "bar" , { legend : { show : false } } ) ;
311
+ } ;
312
+ for ( var i = 0 ; i < chartData . chartDP . dp . length ; i ++ ) {
313
+ var data = chartData . chartDP . dp [ i ] ;
314
+ var labelDOM = $ ( "<div class='label' style='max-width:250px'><div class='color' style='background-color:" + countlyCommon . GRAPH_COLORS [ i ] + "'></div><div style='max-width:200px' class='text' title='" + data . label + "'>" + data . label + "</div></div>" ) ;
315
+ labelDOM . on ( 'click' , onLabelClick . bind ( labelDOM , data ) ) ;
316
+ labelsHtml . find ( '.labels' ) . append ( labelDOM ) ;
317
+ }
205
318
206
- countlyCommon . drawGraph ( loyaltyData . chartDP , "#dashboard-graph" , "bar" ) ;
319
+ $ ( '.widget-content' ) . css ( 'height' , '350px' ) ;
320
+ $ ( '#dashboard-graph' ) . css ( "height" , "85%" ) ;
321
+ $ ( '#dashboard-graph' ) . after ( labelsHtml ) ;
207
322
323
+ countlyCommon . drawGraph ( this . getActiveLabelData ( chartData . chartDP ) , "#dashboard-graph" , "bar" , { legend : { show : false } } ) ;
208
324
this . dtable = $ ( '.d-table' ) . dataTable ( $ . extend ( { } , $ . fn . dataTable . defaults , {
209
- "aaData" : loyaltyData . chartData ,
325
+ "aaData" : chartData . chartData ,
210
326
"aoColumns" : [
211
- { "mData" : "l" , sType : "loyalty" , "sTitle" : jQuery . i18n . map [ "user-loyalty.table.session-count" ] } ,
212
- {
213
- "mData" : "t" ,
214
- sType : "formatted-num" ,
215
- "mRender" : function ( d ) {
216
- return countlyCommon . formatNumber ( d ) ;
217
- } ,
218
- "sTitle" : jQuery . i18n . map [ "common.number-of-users" ]
219
- } ,
220
- { "mData" : "percent" , "sType" : "percent" , "sTitle" : jQuery . i18n . map [ "common.percent" ] }
327
+ { "mData" : "l" , sType : "loyalty" , "sTitle" : jQuery . i18n . map [ "user-loyalty.session-count" ] } ,
328
+ { "mData" : "a" , "sType" : "percent" , "sTitle" : jQuery . i18n . map [ "user-loyalty.all" ] } ,
329
+ { "mData" : "td" , "sType" : "percent" , "sTitle" : jQuery . i18n . map [ "user-loyalty.thirty-days" ] } ,
330
+ { "mData" : "sd" , "sType" : "percent" , "sTitle" : jQuery . i18n . map [ "user-loyalty.seven-days" ] }
221
331
]
222
332
} ) ) ;
223
333
@@ -226,15 +336,42 @@ window.LoyaltyView = countlyView.extend({
226
336
} ,
227
337
refresh : function ( ) {
228
338
var self = this ;
229
- $ . when ( countlySession . initialize ( ) ) . then ( function ( ) {
339
+ $ . when ( this . getLoyaltyData ( ) ) . then ( function ( ) {
230
340
if ( app . activeView !== self ) {
231
341
return false ;
232
342
}
233
343
234
- var loyaltyData = countlySession . getRangeData ( "l" , "l-ranges" , countlySession . explainLoyaltyRange , countlySession . getLoyalityRange ( ) ) ;
235
- countlyCommon . drawGraph ( loyaltyData . chartDP , "#dashboard-graph" , "bar" ) ;
236
- CountlyHelpers . refreshTable ( self . dtable , loyaltyData . chartData ) ;
344
+ var chartData = self . fetchResult ( ) ;
345
+ countlyCommon . drawGraph ( self . getActiveLabelData ( chartData . chartDP ) , "#dashboard-graph" , "bar" , { legend : { show : false } } ) ;
346
+ CountlyHelpers . refreshTable ( self . dtable , chartData . chartData ) ;
237
347
} ) ;
348
+ } ,
349
+ getActiveLabelData : function ( data ) {
350
+ var labels = _ . pluck ( data . dp , "label" ) ,
351
+ newData = $ . extend ( true , [ ] , data ) ,
352
+ newLabels = $ . extend ( true , [ ] , labels ) ;
353
+
354
+ newData . dp [ 0 ] . color = '#48A3EB' ;
355
+ newData . dp [ 1 ] . color = '#FF852B' ;
356
+ newData . dp [ 2 ] . color = "#00C0B7" ;
357
+
358
+ $ ( "#label-container" ) . find ( ".label" ) . each ( function ( ) {
359
+ var escapedLabel = _ . escape ( $ ( this ) . text ( ) . replace ( / (?: \r \n | \r | \n ) / g, '' ) ) ;
360
+ if ( $ ( this ) . hasClass ( "hidden" ) && newLabels . indexOf ( escapedLabel ) !== - 1 ) {
361
+ delete newLabels [ newLabels . indexOf ( escapedLabel ) ] ;
362
+ }
363
+ } ) ;
364
+
365
+ newLabels = _ . compact ( newLabels ) ;
366
+ var dpData = newData . dp ;
367
+ newData . dp = [ ] ;
368
+ for ( var j = 0 ; j < dpData . length ; j ++ ) {
369
+ if ( newLabels . indexOf ( dpData [ j ] . label ) >= 0 ) {
370
+ newData . dp . push ( dpData [ j ] ) ;
371
+ }
372
+ }
373
+
374
+ return newData ;
238
375
}
239
376
} ) ;
240
377
0 commit comments