@@ -53,11 +53,13 @@ module.exports = function plot(gd, cdparcoords) {
53
53
// Have updated order data on `gd.data` and raise `Plotly.restyle` event
54
54
// without having to incur heavy UI blocking due to an actual `Plotly.restyle` call
55
55
56
+ function visible ( dimension ) { return ! ( 'visible' in dimension ) || dimension . visible ; }
57
+
56
58
function newIdx ( visibleIndices , orig , dim ) {
57
59
var origIndex = orig . indexOf ( dim ) ;
58
60
var currentIndex = visibleIndices . indexOf ( origIndex ) ;
59
61
if ( currentIndex === - 1 ) {
60
- // invisible dimensions go to the end, retaining their original order
62
+ // invisible dimensions initially go to the end
61
63
currentIndex += orig . length ;
62
64
}
63
65
return currentIndex ;
@@ -71,9 +73,22 @@ module.exports = function plot(gd, cdparcoords) {
71
73
} ;
72
74
}
73
75
74
- var orig = sorter ( gdDimensionsOriginalOrder [ i ] . filter ( function ( d ) { return d . visible === void ( 0 ) || d . visible ; } ) ) ;
76
+ // drag&drop sorting of the visible dimensions
77
+ var orig = sorter ( gdDimensionsOriginalOrder [ i ] . filter ( visible ) ) ;
75
78
gdDimensions [ i ] . sort ( orig ) ;
76
79
80
+ // invisible dimensions are not interpreted in the context of drag&drop sorting as an invisible dimension
81
+ // cannot be dragged; they're interspersed into their original positions by this subsequent merging step
82
+ gdDimensionsOriginalOrder [ i ] . filter ( function ( d ) { return ! visible ( d ) ; } )
83
+ . sort ( function ( d ) {
84
+ // subsequent splicing to be done left to right, otherwise indices may be incorrect
85
+ return gdDimensionsOriginalOrder [ i ] . indexOf ( d ) ;
86
+ } )
87
+ . forEach ( function ( d ) {
88
+ gdDimensions [ i ] . splice ( gdDimensions [ i ] . indexOf ( d ) , 1 ) ; // remove from the end
89
+ gdDimensions [ i ] . splice ( gdDimensionsOriginalOrder [ i ] . indexOf ( d ) , 0 , d ) ; // insert at original index
90
+ } ) ;
91
+
77
92
gd . emit ( 'plotly_restyle' ) ;
78
93
} ;
79
94
0 commit comments