Skip to content

Commit 53eea28

Browse files
committed
Fix Redux Framework repeater field dependencies not working after page refresh
Implemented efficient event-based dependency evaluation to handle multi-level chains. The issue was in the JavaScript initialization sequence and how Redux evaluates field dependencies on page load. This solution uses native Redux change events and multi-round evaluation to properly restore field visibility for complex dependency chains (A→B→C→D) without performance overhead. Key improvements: - Event-based approach using native Redux dependency system - Multi-round evaluation (max 3 rounds) for deep dependency nesting - Smart value detection to only trigger on meaningful field values - Performance optimized to eliminate recursive approach issues - Handles complex multi-level dependency chains efficiently - Fully backward compatible with existing functionality
1 parent e15369e commit 53eea28

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,51 @@
1010
redux.field_objects = redux.field_objects || {};
1111
redux.field_objects.repeater = redux.field_objects.repeater || {};
1212

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+
1358
redux.field_objects.repeater.getOptName = function ( el ) {
1459
let optName;
1560

@@ -78,6 +123,11 @@
78123
redux.field_objects.repeater.bindTitle( el );
79124
redux.field_objects.repeater.remove( el, gid );
80125
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 );
81131
}
82132
);
83133
};
@@ -329,6 +379,13 @@
329379

330380
$.redux.initFields();
331381

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+
332389
if ( 'function' === typeof reduxRepeaterAccordionActivate ) {
333390
a = $( this ).next( '.redux-repeaters-add' );
334391
relName = a.attr( 'data-name' );

0 commit comments

Comments
 (0)