diff --git a/lib/src/form/src/controller.dart b/lib/src/form/src/controller.dart index 84a8fb2..5a1262a 100644 --- a/lib/src/form/src/controller.dart +++ b/lib/src/form/src/controller.dart @@ -287,33 +287,79 @@ class AstromicFormController extends FormController { } /// Initialize the formGroup Structure. + // void initializeFormGroup(FormGroupStructure groupStructure, {int initialCount = 1}) { + // assert(groupStructure.fields.isNotEmpty, '${groupStructure.id}: Group fields should NOT be empty.'); + + // // Validate subgroups (if any) + // groupStructure.subGroups?.map(((FormGroupStructure, int) a) => a.$1).forEach(((FormGroupStructure subGroup) { + // assert(subGroup.fields.isNotEmpty, '${subGroup.id}: Subgroup fields should NOT be empty.'); + // })); + + // // Add structure to registry + // _formGroups.add(groupStructure); + + // for (int groupIndex = 0; groupIndex < initialCount; groupIndex++) { + // // Add main group fields/values + // _addGroupControllers(groupStructure, groupIndex); + + // // Add subgroup fields/values + // if (groupStructure.subGroups != null && groupStructure.subGroups!.isNotEmpty) { + // for (final (FormGroupStructure subGroup, int subgroupInitialCount) in groupStructure.subGroups!) { + // for (int subIndex = 0; subIndex < subgroupInitialCount; subIndex++) { + // final String nestedID = standeredGroupFormat(groupStructure.id, groupIndex, subGroup.id); + // _addGroupControllers(subGroup, subIndex, parentPrefix: nestedID); + // } + // } + // } + // } + // } + void initializeFormGroup(FormGroupStructure groupStructure, {int initialCount = 1}) { assert(groupStructure.fields.isNotEmpty, '${groupStructure.id}: Group fields should NOT be empty.'); // Validate subgroups (if any) - groupStructure.subGroups?.map(((FormGroupStructure, int) a) => a.$1).forEach(((FormGroupStructure subGroup) { - assert(subGroup.fields.isNotEmpty, '${subGroup.id}: Subgroup fields should NOT be empty.'); - })); + _validateSubGroups(groupStructure); // Add structure to registry _formGroups.add(groupStructure); - for (int groupIndex = 0; groupIndex < initialCount; groupIndex++) { - // Add main group fields/values - _addGroupControllers(groupStructure, groupIndex); + // Initialize the group instances + _initializeGroupControllers(groupStructure, initialCount); + } - // Add subgroup fields/values + /// Recursively initialize controllers for the group and its subgroups + void _initializeGroupControllers(FormGroupStructure groupStructure, int initialCount, {String parentPrefix = ''}) { + // Add main group fields/values + for (int groupIndex = 0; groupIndex < initialCount; groupIndex++) { + _addGroupControllers(groupStructure, groupIndex, parentPrefix: parentPrefix); + + // Recursively handle subgroups if (groupStructure.subGroups != null && groupStructure.subGroups!.isNotEmpty) { for (final (FormGroupStructure subGroup, int subgroupInitialCount) in groupStructure.subGroups!) { + final String nestedPrefix = '$parentPrefix${standeredGroupFormat(groupStructure.id, groupIndex, subGroup.id)}'; + + // Initialize subgroup controllers recursively for (int subIndex = 0; subIndex < subgroupInitialCount; subIndex++) { - final String nestedID = standeredGroupFormat(groupStructure.id, groupIndex, subGroup.id); - _addGroupControllers(subGroup, subIndex, parentPrefix: nestedID); + _initializeGroupControllers(subGroup, subgroupInitialCount, parentPrefix: nestedPrefix); } } } } } + /// Validate subgroups recursively + void _validateSubGroups(FormGroupStructure groupStructure) { + groupStructure.subGroups?.forEach((subGroupTuple) { + final subGroup = subGroupTuple.$1; + assert(subGroup.fields.isNotEmpty, '${subGroup.id}: Subgroup fields should NOT be empty.'); + + // Recursively validate subgroups of subgroups + if (subGroup.subGroups != null) { + _validateSubGroups(subGroup); + } + }); + } + // void initializeFormGroup(FormGroupStructure groupStructure, {int initialCount = 1}) { // assert(groupStructure.fields.isNotEmpty, '$groupStructure: Group Fields should NOT be empty.'); // if (groupStructure.subGroups != null && groupStructure.subGroups!.isNotEmpty) {