@@ -13,6 +13,12 @@ var getModuleCalcData = require('../../plots/get_data').getModuleCalcData;
1313var plot = require ( './plot' ) ;
1414var fxAttrs = require ( '../../components/fx/layout_attributes' ) ;
1515
16+ var setCursor = require ( '../../lib/setcursor' ) ;
17+ var dragElement = require ( '../../components/dragelement' ) ;
18+ var prepSelect = require ( '../../plots/cartesian/select' ) . prepSelect ;
19+ var Lib = require ( '../../lib' ) ;
20+ var Registry = require ( '../../registry' ) ;
21+
1622var SANKEY = 'sankey' ;
1723
1824exports . name = SANKEY ;
@@ -34,3 +40,94 @@ exports.clean = function(newFullData, newFullLayout, oldFullData, oldFullLayout)
3440 oldFullLayout . _paperdiv . selectAll ( '.sankey' ) . remove ( ) ;
3541 }
3642} ;
43+
44+ exports . updateFx = function ( gd ) {
45+ for ( var i = 0 ; i < gd . _fullData . length ; i ++ ) {
46+ subplotUpdateFx ( gd , i ) ;
47+ }
48+ } ;
49+
50+ var dragOptions = [ ] ;
51+ function subplotUpdateFx ( gd , index ) {
52+ var i = index ;
53+ var fullData = gd . _fullData [ i ] ;
54+ var fullLayout = gd . _fullLayout ;
55+
56+ var dragMode = fullLayout . dragmode ;
57+ var cursor = fullLayout . dragmode === 'pan' ? 'move' : 'crosshair' ;
58+ var bgRect = fullData . _bgRect ;
59+
60+ setCursor ( bgRect , cursor ) ;
61+
62+ var xaxis = {
63+ _id : 'x' ,
64+ c2p : function ( v ) { return v ; } ,
65+ _offset : fullData . _sankey . translateX ,
66+ _length : fullData . _sankey . width
67+ } ;
68+ var yaxis = {
69+ _id : 'y' ,
70+ c2p : function ( v ) { return v ; } ,
71+ _offset : fullData . _sankey . translateY ,
72+ _length : fullData . _sankey . height
73+ } ;
74+
75+ // Note: dragOptions is needed to be declared for all dragmodes because
76+ // it's the object that holds persistent selection state.
77+ dragOptions [ i ] = {
78+ gd : gd ,
79+ element : bgRect . node ( ) ,
80+ plotinfo : {
81+ id : i ,
82+ xaxis : xaxis ,
83+ yaxis : yaxis ,
84+ fillRangeItems : Lib . noop
85+ } ,
86+ subplot : i ,
87+ // create mock x/y axes for hover routine
88+ xaxes : [ xaxis ] ,
89+ yaxes : [ yaxis ] ,
90+ doneFnCompleted : function ( selection ) {
91+ var newGroups ;
92+ var oldGroups = gd . _fullData [ i ] . node . groups . slice ( ) ;
93+ var newGroup = [ ] ;
94+
95+ function findNode ( pt ) {
96+ return gd . _fullData [ i ] . _sankey . graph . nodes . find ( function ( n ) {
97+ return n . pointNumber === pt ;
98+ } ) ;
99+ }
100+
101+ for ( var j = 0 ; j < selection . length ; j ++ ) {
102+ var node = findNode ( selection [ j ] . pointNumber ) ;
103+ if ( ! node ) continue ;
104+
105+ // If the node represents a group
106+ if ( node . group ) {
107+ // Add all its children to the current selection
108+ for ( var k = 0 ; k < node . childrenNodes . length ; k ++ ) {
109+ newGroup . push ( node . childrenNodes [ k ] . pointNumber ) ;
110+ }
111+ // Flag group for removal from existing list of groups
112+ oldGroups [ node . pointNumber - fullData . node . _count ] = false ;
113+ } else {
114+ newGroup . push ( node . pointNumber ) ;
115+ }
116+ }
117+
118+ newGroups = oldGroups
119+ . filter ( function ( g ) { return g ; } )
120+ . concat ( [ newGroup ] ) ;
121+
122+ Registry . call ( '_guiRestyle' , gd , {
123+ 'node.groups' : [ newGroups ]
124+ } , i ) . catch ( Lib . noop ) ; // TODO will this ever fail?
125+ }
126+ } ;
127+
128+ dragOptions [ i ] . prepFn = function ( e , startX , startY ) {
129+ prepSelect ( e , startX , startY , dragOptions [ i ] , dragMode ) ;
130+ } ;
131+
132+ dragElement . init ( dragOptions [ i ] ) ;
133+ }
0 commit comments