@@ -389,6 +389,9 @@ plots.supplyDefaults = function(gd, opts) {
389
389
// eg set `_requestRangeslider.x2 = true` for xaxis2
390
390
newFullLayout . _requestRangeslider = { } ;
391
391
392
+ // pull uids from old data to use as new defaults
393
+ newFullLayout . _traceUids = getTraceUids ( oldFullData , newData ) ;
394
+
392
395
// then do the data
393
396
newFullLayout . _globalTransforms = ( gd . _context || { } ) . globalTransforms ;
394
397
plots . supplyDataDefaults ( newData , newFullData , newLayout , newFullLayout ) ;
@@ -499,6 +502,46 @@ plots.supplyDefaultsUpdateCalc = function(oldCalcdata, newFullData) {
499
502
}
500
503
} ;
501
504
505
+ /**
506
+ * Create a list of uid strings satisfying (in this order of importance):
507
+ * 1. all unique, all strings
508
+ * 2. matches input uids if provided
509
+ * 3. matches previous data uids
510
+ */
511
+ function getTraceUids ( oldFullData , newData ) {
512
+ var len = newData . length ;
513
+ var oldFullInput = [ ] ;
514
+ var i , prevFullInput ;
515
+ for ( i = 0 ; i < oldFullData . length ; i ++ ) {
516
+ var thisFullInput = oldFullData [ i ] . _fullInput ;
517
+ if ( thisFullInput !== prevFullInput ) oldFullInput . push ( thisFullInput ) ;
518
+ prevFullInput = thisFullInput ;
519
+ }
520
+ var oldLen = oldFullInput . length ;
521
+ var out = new Array ( len ) ;
522
+ var seenUids = { } ;
523
+
524
+ function setUid ( uid , i ) {
525
+ out [ i ] = uid ;
526
+ seenUids [ uid ] = 1 ;
527
+ }
528
+
529
+ function tryUid ( uid , i ) {
530
+ if ( uid && typeof uid === 'string' && ! seenUids [ uid ] ) {
531
+ setUid ( uid , i ) ;
532
+ return true ;
533
+ }
534
+ }
535
+
536
+ for ( i = 0 ; i < len ; i ++ ) {
537
+ if ( tryUid ( newData [ i ] . uid , i ) ) continue ;
538
+ if ( i < oldLen && tryUid ( oldFullInput [ i ] . uid , i ) ) continue ;
539
+ setUid ( Lib . randstr ( seenUids ) , i ) ;
540
+ }
541
+
542
+ return out ;
543
+ }
544
+
502
545
/**
503
546
* Make a container for collecting subplots we need to display.
504
547
*
@@ -888,6 +931,8 @@ plots.supplyDataDefaults = function(dataIn, dataOut, layout, fullLayout) {
888
931
trace = dataIn [ i ] ;
889
932
fullTrace = plots . supplyTraceDefaults ( trace , colorCnt , fullLayout , i ) ;
890
933
934
+ fullTrace . uid = fullLayout . _traceUids [ i ] ;
935
+
891
936
fullTrace . index = i ;
892
937
fullTrace . _input = trace ;
893
938
fullTrace . _expandedIndex = cnt ;
@@ -903,9 +948,9 @@ plots.supplyDataDefaults = function(dataIn, dataOut, layout, fullLayout) {
903
948
// that transform supply-default methods can set _ keys for future use.
904
949
relinkPrivateKeys ( fullExpandedTrace , expandedTrace ) ;
905
950
906
- // mutate uid here using parent uid and expanded index
951
+ // set uid using parent uid and expanded index
907
952
// to promote consistency between update calls
908
- expandedTrace . uid = fullExpandedTrace . uid = fullTrace . uid + j ;
953
+ fullExpandedTrace . uid = fullTrace . uid + j ;
909
954
910
955
// add info about parent data trace
911
956
fullExpandedTrace . index = i ;
@@ -1045,7 +1090,6 @@ plots.supplyTraceDefaults = function(traceIn, colorIndex, layout, traceInIndex)
1045
1090
var visible = coerce ( 'visible' ) ;
1046
1091
1047
1092
coerce ( 'type' ) ;
1048
- coerce ( 'uid' ) ;
1049
1093
coerce ( 'name' , layout . _traceWord + ' ' + traceInIndex ) ;
1050
1094
1051
1095
// we want even invisible traces to make their would-be subplots visible
0 commit comments