@@ -38,7 +38,8 @@ define([
38
38
pivot : {
39
39
index : [ ] ,
40
40
columns : [ ] ,
41
- values : [ ]
41
+ values : [ ] ,
42
+ aggfunc : [ ]
42
43
} ,
43
44
melt : {
44
45
idVars : [ ] ,
@@ -98,7 +99,7 @@ define([
98
99
that . _resetColumnSelector ( that . wrapSelector ( '#vp_rsValueVars' ) ) ;
99
100
100
101
that . state . pivot = {
101
- index : [ ] , columns : [ ] , values : [ ]
102
+ index : [ ] , columns : [ ] , values : [ ] , aggfunc : [ ]
102
103
} ;
103
104
that . state . melt = {
104
105
idVars : [ ] , valueVars : [ ]
@@ -116,13 +117,8 @@ define([
116
117
var type = $ ( this ) . val ( ) ;
117
118
that . state . type = type ;
118
119
// change visibility
119
- if ( type == 'pivot' ) {
120
- $ ( that . wrapSelector ( '.vp-rs-type-box.melt' ) ) . hide ( ) ;
121
- $ ( that . wrapSelector ( '.vp-rs-type-box.pivot' ) ) . show ( ) ;
122
- } else {
123
- $ ( that . wrapSelector ( '.vp-rs-type-box.pivot' ) ) . hide ( ) ;
124
- $ ( that . wrapSelector ( '.vp-rs-type-box.melt' ) ) . show ( ) ;
125
- }
120
+ $ ( that . wrapSelector ( '.vp-rs-type-box' ) ) . hide ( ) ;
121
+ $ ( that . wrapSelector ( '.vp-rs-type-box.' + type ) ) . show ( ) ;
126
122
127
123
// clear user option
128
124
$ ( that . wrapSelector ( '#vp_rsUserOption' ) ) . val ( '' ) ;
@@ -168,6 +164,19 @@ define([
168
164
that . openColumnSelector ( targetVariable , $ ( that . wrapSelector ( '#vp_rsValues' ) ) , 'Select columns' , excludeList ) ;
169
165
} ) ;
170
166
167
+ // aggfunc change event
168
+ $ ( document ) . on ( 'change' , this . wrapSelector ( '#vp_rsAggfunc' ) , function ( event ) {
169
+ var colList = event . dataList ;
170
+ that . state . pivot . aggfunc = colList ;
171
+ } ) ;
172
+
173
+ // aggfunc select button event
174
+ $ ( document ) . on ( 'click' , this . wrapSelector ( '#vp_rsAggfunc' ) , function ( ) {
175
+ var targetVariable = [ that . state . variable ] ;
176
+ var excludeList = that . state . pivot . aggfunc . map ( obj => obj . code ) ;
177
+ that . openMethodSelector ( targetVariable , $ ( that . wrapSelector ( '#vp_rsAggfunc' ) ) , 'Select columns' , excludeList ) ;
178
+ } ) ;
179
+
171
180
// id vars change event
172
181
$ ( document ) . on ( 'change' , this . wrapSelector ( '#vp_rsIdVars' ) , function ( event ) {
173
182
var colList = event . dataList ;
@@ -344,13 +353,39 @@ define([
344
353
* @param {Array<string> } previousList previous selected columns
345
354
* @param {Array<string> } excludeList columns to exclude
346
355
*/
347
- renderColumnSelector ( targetVariable , previousList , excludeList ) {
356
+ renderColumnSelector ( targetVariable , previousList , excludeList ) {
348
357
this . popup . ColSelector = new MultiSelector (
349
358
this . wrapSelector ( '.vp-inner-popup-body' ) ,
350
359
{ mode : 'columns' , parent : targetVariable , selectedList : previousList , excludeList : excludeList }
351
360
) ;
352
361
}
353
362
363
+ /**
364
+ * Render method selector using MultiSelector module
365
+ * @param {Array<string> } previousList previous selected methods
366
+ * @param {Array<string> } excludeList methods to exclude
367
+ */
368
+ renderMethodSelector ( targetVariable , previousList , excludeList ) {
369
+ let methodList = [
370
+ { value : 'count' , code : "'count'" } ,
371
+ { value : 'first' , code : "'first'" } ,
372
+ { value : 'last' , code : "'last'" } ,
373
+ { value : 'size' , code : "'size'" } ,
374
+ { value : 'std' , code : "'std'" } ,
375
+ { value : 'sum' , code : "'sum'" } ,
376
+ { value : 'max' , code : "'max'" } ,
377
+ { value : 'mean' , code : "'mean'" } ,
378
+ { value : 'median' , code : "'median'" } ,
379
+ { value : 'min' , code : "'min'" } ,
380
+ { value : 'quantile' , code : "'quantile'" } ,
381
+ ] ;
382
+
383
+ this . popup . ColSelector = new MultiSelector (
384
+ this . wrapSelector ( '.vp-inner-popup-body' ) ,
385
+ { mode : 'data' , parent : targetVariable , dataList : methodList , selectedList : previousList , excludeList : excludeList }
386
+ ) ;
387
+ }
388
+
354
389
/**
355
390
* Load variable list (dataframe)
356
391
*/
@@ -422,6 +457,45 @@ define([
422
457
}
423
458
}
424
459
460
+ } else if ( type == 'pivot_table' ) {
461
+ //================================================================
462
+ // pivot_table
463
+ //================================================================
464
+ // index (optional)
465
+ if ( pivot . index && pivot . index . length > 0 ) {
466
+ if ( pivot . index . length == 1 ) {
467
+ options . push ( com_util . formatString ( "index={0}" , pivot . index [ 0 ] . code ) ) ;
468
+ } else {
469
+ options . push ( com_util . formatString ( "index=[{0}]" , pivot . index . map ( col => col . code ) . join ( ',' ) ) ) ;
470
+ }
471
+ }
472
+
473
+ // columns
474
+ if ( pivot . columns && pivot . columns . length > 0 ) {
475
+ if ( pivot . columns . length == 1 ) {
476
+ options . push ( com_util . formatString ( "columns={0}" , pivot . columns [ 0 ] . code ) ) ;
477
+ } else {
478
+ options . push ( com_util . formatString ( "columns=[{0}]" , pivot . columns . map ( col => col . code ) . join ( ',' ) ) ) ;
479
+ }
480
+ }
481
+
482
+ // values (optional)
483
+ if ( pivot . values && pivot . values . length > 0 ) {
484
+ if ( pivot . values . length == 1 ) {
485
+ options . push ( com_util . formatString ( "values={0}" , pivot . values [ 0 ] . code ) ) ;
486
+ } else {
487
+ options . push ( com_util . formatString ( "values=[{0}]" , pivot . values . map ( col => col . code ) . join ( ',' ) ) ) ;
488
+ }
489
+ }
490
+
491
+ // aggfunc
492
+ if ( pivot . aggfunc && pivot . aggfunc . length > 0 ) {
493
+ if ( pivot . aggfunc . length == 1 ) {
494
+ options . push ( com_util . formatString ( "aggfunc={0}" , pivot . aggfunc [ 0 ] . code ) ) ;
495
+ } else {
496
+ options . push ( com_util . formatString ( "aggfunc=[{0}]" , pivot . aggfunc . map ( col => col . code ) . join ( ',' ) ) ) ;
497
+ }
498
+ }
425
499
} else {
426
500
//================================================================
427
501
// melt
@@ -511,6 +585,19 @@ define([
511
585
this . openInnerPopup ( title ) ;
512
586
}
513
587
588
+ openMethodSelector ( targetVariable , targetSelector , title = 'Select methods' , excludeList = [ ] ) {
589
+ this . popup . targetVariable = targetVariable ;
590
+ this . popup . targetSelector = targetSelector ;
591
+ var previousList = this . popup . targetSelector . data ( 'list' ) ;
592
+ if ( previousList ) {
593
+ previousList = previousList . map ( col => col . code )
594
+ }
595
+ this . renderMethodSelector ( targetVariable , previousList , excludeList ) ;
596
+
597
+ // set title
598
+ this . openInnerPopup ( title ) ;
599
+ }
600
+
514
601
handleInnerOk ( ) {
515
602
// ok input popup
516
603
var dataList = this . popup . ColSelector . getDataList ( ) ;
0 commit comments