Skip to content

Commit e4c2edc

Browse files
committed
The issue was in the JavaScript initialization sequence and how Redux evaluates field dependencies on page load
1 parent 8558083 commit e4c2edc

File tree

1 file changed

+43
-36
lines changed

1 file changed

+43
-36
lines changed

redux-core/inc/extensions/repeater/repeater/redux-repeater.js

Lines changed: 43 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,35 +10,49 @@
1010
redux.field_objects = redux.field_objects || {};
1111
redux.field_objects.repeater = redux.field_objects.repeater || {};
1212

13-
redux.field_objects.repeater.checkAllDependenciesRecursive = function ( container ) {
14-
let maxIterations = 5; // Prevent infinite loops
15-
let iteration = 0;
16-
let changesFound = true;
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;
1717

18-
while ( changesFound && iteration < maxIterations ) {
19-
changesFound = false;
20-
iteration++;
18+
function triggerRound() {
19+
if ( round >= maxRounds ) {
20+
return;
21+
}
2122

22-
const checkContainer = container.hasClass ? container : $( container );
23+
round++;
24+
let triggeredAny = false;
2325

24-
checkContainer.find( '.redux-repeater-accordion-repeater' ).each( function() {
25-
$( this ).find( '.redux-field' ).each( function() {
26-
const fieldContainer = $( this ).find( 'select, radio, input[type=checkbox], input[type=hidden]' ).first();
27-
if ( fieldContainer.length && fieldContainer.hasClass( 'in-repeater' ) ) {
28-
const fieldElement = $( this );
29-
const wasHidden = fieldElement.hasClass( 'hide' ) || fieldElement.parents( 'tr:first' ).hasClass( 'hide' );
30-
31-
$.redux.check_dependencies( fieldContainer[0] );
32-
33-
// Check if visibility state changed
34-
const isHiddenNow = fieldElement.hasClass( 'hide' ) || fieldElement.parents( 'tr:first' ).hasClass( 'hide' );
35-
if ( wasHidden !== isHiddenNow ) {
36-
changesFound = true;
37-
}
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;
3845
}
39-
});
46+
}
4047
});
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+
}
4153
}
54+
55+
triggerRound();
4256
};
4357

4458
redux.field_objects.repeater.getOptName = function ( el ) {
@@ -110,12 +124,10 @@
110124
redux.field_objects.repeater.remove( el, gid );
111125
redux.field_objects.repeater.add( el );
112126

113-
// Check dependencies after repeater is fully initialized
114-
// This ensures field visibility is restored based on saved values
115-
// Use recursive checking to handle multi-level nested dependencies
127+
// Use efficient dependency chain evaluation instead of performance-heavy recursive checking
116128
setTimeout( function() {
117-
redux.field_objects.repeater.checkAllDependenciesRecursive( el );
118-
}, 100 );
129+
redux.field_objects.repeater.triggerDependencyChain( el );
130+
}, 150 );
119131
}
120132
);
121133
};
@@ -367,11 +379,11 @@
367379

368380
$.redux.initFields();
369381

370-
// Check dependencies for the newly activated panel with recursive checking
382+
// Use efficient dependency evaluation for newly activated panel
371383
if ( ui.newPanel && ui.newPanel.length ) {
372384
setTimeout( function() {
373-
redux.field_objects.repeater.checkAllDependenciesRecursive( ui.newPanel );
374-
}, 50 );
385+
redux.field_objects.repeater.triggerDependencyChain( ui.newPanel );
386+
}, 100 );
375387
}
376388

377389
if ( 'function' === typeof reduxRepeaterAccordionActivate ) {
@@ -634,11 +646,6 @@
634646
}
635647

636648
$.redux.initFields();
637-
638-
// Check for nested dependencies after this field becomes visible
639-
setTimeout( function() {
640-
redux.field_objects.repeater.checkAllDependenciesRecursive( childFieldset.closest( '.redux-container-repeater' ) );
641-
}, 50 );
642649
}
643650
);
644651
} else {

0 commit comments

Comments
 (0)