diff --git a/src/components/SettingsSidebar.js b/src/components/SettingsSidebar.js index 551c827..fc08858 100644 --- a/src/components/SettingsSidebar.js +++ b/src/components/SettingsSidebar.js @@ -7,7 +7,6 @@ const settingsItems = [ { label: 'Permissions', path: '/admin/settings/permissions', icon: Shield }, { label: 'Theme', path: '/admin/settings/theme', icon: Palette }, { label: 'Directory', path: '/admin/settings/directory', icon: BookUser }, - // { label: 'Registration', path: '/admin/settings/registration', icon: FileEdit }, // Commented out for future fallback ]; const SettingsTabs = () => { diff --git a/src/pages/admin/AdminRegistrationBuilder.js b/src/pages/admin/AdminRegistrationBuilder.js index 104c60d..aa125e3 100644 --- a/src/pages/admin/AdminRegistrationBuilder.js +++ b/src/pages/admin/AdminRegistrationBuilder.js @@ -1026,45 +1026,213 @@ const AdminRegistrationBuilder = () => { {/* Conditional Rules Dialog */} - + Conditional Rules -
- {(schema?.conditional_rules || []).map((rule, index) => ( -
-
- Rule {index + 1} - +
+

+ Rules allow you to show or hide fields based on other field values. For example, show a "Scholarship Reason" field only when "Request Scholarship" is checked. +

+ + {(schema?.conditional_rules || []).map((rule, index) => { + // Get all available fields for dropdowns + const allFields = schema?.steps?.flatMap(step => + step.sections?.flatMap(section => + section.fields?.map(field => ({ + id: field.id, + label: field.label, + type: field.type, + stepTitle: step.title, + sectionTitle: section.title, + })) || [] + ) || [] + ) || []; + + // Filter trigger fields (checkbox, dropdown, radio work best) + const triggerFields = allFields.filter(f => + ['checkbox', 'dropdown', 'radio', 'text'].includes(f.type) + ); + + // Update a specific rule + const updateRule = (ruleId, updates) => { + updateSchema((prev) => ({ + ...prev, + conditional_rules: prev.conditional_rules.map((r) => + r.id === ruleId ? { ...r, ...updates } : r + ), + })); + }; + + // Get the trigger field's type to determine value input + const triggerFieldData = allFields.find(f => f.id === rule.trigger_field); + + return ( +
+
+ Rule {index + 1} + +
+ + {/* Trigger Field Selection */} +
+
+ + +
+ +
+ + +
+ +
+ + {triggerFieldData?.type === 'checkbox' ? ( + + ) : ['empty', 'not_empty'].includes(rule.trigger_operator) ? ( + + ) : ( + updateRule(rule.id, { trigger_value: e.target.value })} + placeholder="Enter value" + /> + )} +
+
+ + {/* Action Selection */} +
+
+ + +
+ +
+ +
+ {allFields.length === 0 ? ( +

No fields available

+ ) : ( +
+ {allFields + .filter(f => f.id !== rule.trigger_field) // Don't show trigger field as target + .map((field) => ( +
+ { + const currentTargets = rule.target_fields || []; + const newTargets = checked + ? [...currentTargets, field.id] + : currentTargets.filter((id) => id !== field.id); + updateRule(rule.id, { target_fields: newTargets }); + }} + /> + +
+ ))} +
+ )} +
+
+
+ + {/* Rule Summary */} + {rule.trigger_field && (rule.target_fields?.length || 0) > 0 && ( +
+ Summary: When "{triggerFieldData?.label || rule.trigger_field}" {rule.trigger_operator} "{String(rule.trigger_value)}", {rule.action} the following fields: {rule.target_fields?.map(id => allFields.find(f => f.id === id)?.label || id).join(', ')} +
+ )}
-
- When {rule.trigger_field}{' '} - {rule.trigger_operator}{' '} - {String(rule.trigger_value)},{' '} - {rule.action} fields:{' '} - - {rule.target_fields?.join(', ')} - -
-
- ))} + ); + })} {(schema?.conditional_rules || []).length === 0 && ( -
- No conditional rules configured. Rules allow you to show or hide fields based on - other field values. +
+ No conditional rules configured yet.
+ Click "Add Rule" to create your first rule.
)}