| 
10 | 10 | 	redux.field_objects          = redux.field_objects || {};  | 
11 | 11 | 	redux.field_objects.repeater = redux.field_objects.repeater || {};  | 
12 | 12 | 
 
  | 
 | 13 | +	// Helper function to trigger dependency evaluation efficiently  | 
 | 14 | +	redux.field_objects.repeater.triggerDependencyChain = function( container ) {  | 
 | 15 | +		const maxRounds = 3; // Maximum rounds to handle deep nesting  | 
 | 16 | +		let round = 0;  | 
 | 17 | +		  | 
 | 18 | +		function triggerRound() {  | 
 | 19 | +			if ( round >= maxRounds ) {  | 
 | 20 | +				return;  | 
 | 21 | +			}  | 
 | 22 | +			  | 
 | 23 | +			round++;  | 
 | 24 | +			let triggeredAny = false;  | 
 | 25 | +			  | 
 | 26 | +			container.find( '.redux-field select, .redux-field input[type=radio]:checked, .redux-field input[type=checkbox], .redux-field input[type=hidden]' ).each( function() {  | 
 | 27 | +				const field = $( this );  | 
 | 28 | +				if ( field.hasClass( 'in-repeater' ) ) {  | 
 | 29 | +					const value = field.val();  | 
 | 30 | +					if ( value && value !== '' && value !== '0' && value !== 'false' ) {  | 
 | 31 | +						field.trigger( 'change' );  | 
 | 32 | +						triggeredAny = true;  | 
 | 33 | +					}  | 
 | 34 | +				}  | 
 | 35 | +			});  | 
 | 36 | +			  | 
 | 37 | +			// Handle switch fields specifically  | 
 | 38 | +			container.find( '.redux-field input[type=hidden]' ).each( function() {  | 
 | 39 | +				const hiddenField = $( this );  | 
 | 40 | +				if ( hiddenField.hasClass( 'in-repeater' ) && hiddenField.attr( 'name' ) && hiddenField.attr( 'name' ).indexOf( '[' ) > -1 ) {  | 
 | 41 | +					const value = hiddenField.val();  | 
 | 42 | +					if ( value === '1' || value === 'true' ) {  | 
 | 43 | +						hiddenField.trigger( 'change' );  | 
 | 44 | +						triggeredAny = true;  | 
 | 45 | +					}  | 
 | 46 | +				}  | 
 | 47 | +			});  | 
 | 48 | +			  | 
 | 49 | +			// If we triggered any changes, schedule another round to catch dependencies of newly shown fields  | 
 | 50 | +			if ( triggeredAny && round < maxRounds ) {  | 
 | 51 | +				setTimeout( triggerRound, 100 );  | 
 | 52 | +			}  | 
 | 53 | +		}  | 
 | 54 | +		  | 
 | 55 | +		triggerRound();  | 
 | 56 | +	};  | 
 | 57 | + | 
13 | 58 | 	redux.field_objects.repeater.getOptName = function ( el ) {  | 
14 | 59 | 		let optName;  | 
15 | 60 | 
 
  | 
 | 
78 | 123 | 				redux.field_objects.repeater.bindTitle( el );  | 
79 | 124 | 				redux.field_objects.repeater.remove( el, gid );  | 
80 | 125 | 				redux.field_objects.repeater.add( el );  | 
 | 126 | + | 
 | 127 | +				// Use efficient dependency chain evaluation instead of performance-heavy recursive checking  | 
 | 128 | +				setTimeout( function() {  | 
 | 129 | +					redux.field_objects.repeater.triggerDependencyChain( el );  | 
 | 130 | +				}, 150 );  | 
81 | 131 | 			}  | 
82 | 132 | 		);  | 
83 | 133 | 	};  | 
 | 
329 | 379 | 
 
  | 
330 | 380 | 					$.redux.initFields();  | 
331 | 381 | 
 
  | 
 | 382 | +					// Use efficient dependency evaluation for newly activated panel  | 
 | 383 | +					if ( ui.newPanel && ui.newPanel.length ) {  | 
 | 384 | +						setTimeout( function() {  | 
 | 385 | +							redux.field_objects.repeater.triggerDependencyChain( ui.newPanel );  | 
 | 386 | +						}, 100 );  | 
 | 387 | +					}  | 
 | 388 | + | 
332 | 389 | 					if ( 'function' === typeof reduxRepeaterAccordionActivate ) {  | 
333 | 390 | 						a       = $( this ).next( '.redux-repeaters-add' );  | 
334 | 391 | 						relName = a.attr( 'data-name' );  | 
 | 
0 commit comments