@@ -430,3 +430,51 @@ exports.coerceTraceIndices = function(gd, traceIndices) {
430
430
431
431
return traceIndices ;
432
432
} ;
433
+
434
+ /**
435
+ * Manages logic around array container item creation / deletion / update
436
+ * that nested property along can't handle.
437
+ *
438
+ * @param {Object } np
439
+ * nested property of update attribute string about trace or layout object
440
+ * @param {* } newVal
441
+ * update value passed to restyle / relayout / update
442
+ * @param {Object } undoit
443
+ * undo hash (N.B. undoit may be mutated here).
444
+ *
445
+ */
446
+ exports . manageArrayContainers = function ( np , newVal , undoit ) {
447
+ var obj = np . obj ,
448
+ parts = np . parts ,
449
+ pLength = parts . length ,
450
+ pLast = parts [ pLength - 1 ] ;
451
+
452
+ var pLastIsNumber = isNumeric ( pLast ) ;
453
+
454
+ // delete item
455
+ if ( pLastIsNumber && newVal === null ) {
456
+
457
+ // Clear item in array container when new value is null
458
+ var contPath = parts . slice ( 0 , pLength - 1 ) . join ( '.' ) ,
459
+ cont = Lib . nestedProperty ( obj , contPath ) . get ( ) ;
460
+ cont . splice ( pLast , 1 ) ;
461
+
462
+ // Note that nested property clears null / undefined at end of
463
+ // array container, but not within them.
464
+ }
465
+ // create item
466
+ else if ( pLastIsNumber && np . get ( ) === undefined ) {
467
+
468
+ // When adding a new item, make sure undo command will remove it
469
+ if ( np . get ( ) === undefined ) undoit [ np . astr ] = null ;
470
+
471
+ np . set ( newVal ) ;
472
+ }
473
+ // update item
474
+ else {
475
+
476
+ // If the last part of attribute string isn't a number,
477
+ // np.set is all we need.
478
+ np . set ( newVal ) ;
479
+ }
480
+ } ;
0 commit comments