Skip to content

Commit 8558083

Browse files
committed
Implemented recursive dependency evaluation to handle multi-level chains
1 parent e15369e commit 8558083

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

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

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,37 @@
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;
17+
18+
while ( changesFound && iteration < maxIterations ) {
19+
changesFound = false;
20+
iteration++;
21+
22+
const checkContainer = container.hasClass ? container : $( container );
23+
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+
}
38+
}
39+
});
40+
});
41+
}
42+
};
43+
1344
redux.field_objects.repeater.getOptName = function ( el ) {
1445
let optName;
1546

@@ -78,6 +109,13 @@
78109
redux.field_objects.repeater.bindTitle( el );
79110
redux.field_objects.repeater.remove( el, gid );
80111
redux.field_objects.repeater.add( el );
112+
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
116+
setTimeout( function() {
117+
redux.field_objects.repeater.checkAllDependenciesRecursive( el );
118+
}, 100 );
81119
}
82120
);
83121
};
@@ -329,6 +367,13 @@
329367

330368
$.redux.initFields();
331369

370+
// Check dependencies for the newly activated panel with recursive checking
371+
if ( ui.newPanel && ui.newPanel.length ) {
372+
setTimeout( function() {
373+
redux.field_objects.repeater.checkAllDependenciesRecursive( ui.newPanel );
374+
}, 50 );
375+
}
376+
332377
if ( 'function' === typeof reduxRepeaterAccordionActivate ) {
333378
a = $( this ).next( '.redux-repeaters-add' );
334379
relName = a.attr( 'data-name' );
@@ -589,6 +634,11 @@
589634
}
590635

591636
$.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 );
592642
}
593643
);
594644
} else {

0 commit comments

Comments
 (0)