This commit is contained in:
2025-04-08 16:22:52 +02:00
parent 6bfcd81ac4
commit eb2df1550e

View File

@@ -138,9 +138,44 @@ class AstromicFormController extends FormController {
//S1 - State Variables //S1 - State Variables
final List<FormGroupStructure> _formGroups = <FormGroupStructure>[]; final List<FormGroupStructure> _formGroups = <FormGroupStructure>[];
//S1 - Methods //S1 - Methods
/// Get the structure of this groupId
FormGroupStructure? getGroupStructure(String groupID) {
// Get the full path of the group
final String? fullPath = getFullPathOfGroup(groupID, formGroups: _formGroups);
/// Recursively returns the full path of the group ID. // If no path is found, return null
String? getFullPathOfGroup(String targetGroupID, {List<FormGroupStructure>? formGroups, String currentPath = ''}) { if (fullPath == null) return null;
// Split the path into segments (using the standard separator)
final List<String> pathSegments = fullPath.split('->');
// We start with the root group (the first segment in the path)
FormGroupStructure? currentGroup = _formGroups.where((FormGroupStructure group) => group.id == pathSegments.first).firstOrNull;
// If the root group is not found, return null
if (currentGroup == null) return null;
// Traverse through the path segments to find the group or subgroup
for (int i = 1; i < pathSegments.length; i++) {
final String segment = pathSegments[i];
// Search for the subgroup within the current group
final (int, FormGroupStructure)? subGroup = currentGroup?.subGroups?.where(((int, FormGroupStructure) subGroup) => subGroup.$2.id == segment).firstOrNull;
// If a subgroup is found, update currentGroup to the subgroup
if (subGroup != null) {
currentGroup = subGroup.$2;
} else {
// If no subgroup is found at this level, return null
return null;
}
}
return currentGroup;
}
/// returns the full path of this group ID.
String? getFullPathOfGroup(String targetGroupID, {List<FormGroupStructure>? formGroups, String currentPath = '', String separator = '->'}) {
// Loop through each FormGroupStructure // Loop through each FormGroupStructure
for (final FormGroupStructure group in (formGroups ?? _formGroups)) { for (final FormGroupStructure group in (formGroups ?? _formGroups)) {
// If the group ID matches, return the current path // If the group ID matches, return the current path
@@ -148,7 +183,7 @@ class AstromicFormController extends FormController {
// Otherwise, check in its subgroups recursively // Otherwise, check in its subgroups recursively
for (final (int, FormGroupStructure) subGroup in group.subGroups ?? <(int, FormGroupStructure)>[]) { for (final (int, FormGroupStructure) subGroup in group.subGroups ?? <(int, FormGroupStructure)>[]) {
final String? subGroupPath = getFullPathOfGroup(targetGroupID, formGroups: <FormGroupStructure>[subGroup.$2], currentPath: '$currentPath${group.id}->'); final String? subGroupPath = getFullPathOfGroup(targetGroupID, formGroups: <FormGroupStructure>[subGroup.$2], currentPath: '$currentPath${group.id}$separator');
// Return the path if found // Return the path if found
if (subGroupPath != null) { if (subGroupPath != null) {
return subGroupPath; return subGroupPath;
@@ -160,6 +195,76 @@ class AstromicFormController extends FormController {
return null; return null;
} }
int getInstanceCount(String targetGroupID) {
FormGroupStructure? structure = getGroupStructure(targetGroupID);
if (structure != null) {
String firstField = structure.fields.first;
return controllers.keys.where((String c) => RegExp(standeredGroupFormat(targetGroupID, r'[\d+]', firstField)).hasMatch(c)).nonNulls.toList().length;
}
return 0;
}
void _validateSubGroupsRecursively(FormGroupStructure groupStructure) {
groupStructure.subGroups?.forEach(((int, FormGroupStructure) subGroupTuple) {
final FormGroupStructure subGroup = subGroupTuple.$2;
assert(subGroup.fields.isNotEmpty, '${subGroup.id}: Subgroup fields should NOT be empty.');
// Recursively validate subgroups of subgroups
if (subGroup.subGroups != null) {
_validateSubGroupsRecursively(subGroup);
}
});
}
void _addGroupControllers(FormGroupStructure structure, int index, {String? parentPrefix}) {
final String baseID = parentPrefix ?? structure.id;
for (final String fieldID in structure.fields) {
final String fullID = standeredGroupFormat(baseID, index.toString(), fieldID);
controller(fullID);
}
for (final String valueID in structure.values ?? <String>[]) {
final String fullID = standeredGroupFormat(baseID, index.toString(), valueID);
controller(fullID);
}
}
void _initializeGroupControllersRecursively(FormGroupStructure groupStructure, int initialCount, {String parentPrefix = ''}) {
// Add main group fields/values
for (int groupIndex = 0; groupIndex < initialCount; groupIndex++) {
_addGroupControllers(groupStructure, groupIndex, parentPrefix: parentPrefix.isEmpty ? null : parentPrefix);
// Recursively handle subgroups
if (groupStructure.subGroups != null && groupStructure.subGroups!.isNotEmpty) {
for (final (int subgroupInitialCount, FormGroupStructure subGroup) in groupStructure.subGroups!) {
final String subgroupPrefix = parentPrefix.isEmpty
? standeredGroupFormat(groupStructure.id, groupIndex.toString(), subGroup.id)
: standeredGroupFormat(parentPrefix, groupIndex.toString(), subGroup.id); // Add to parentPrefix only once
// Initialize subgroup controllers recursively
for (int subIndex = 0; subIndex < subgroupInitialCount; subIndex++) {
_initializeGroupControllersRecursively(subGroup, subgroupInitialCount, parentPrefix: subgroupPrefix);
}
}
}
}
}
/// Recursively initialize controllers for the group and its subgroups
void initializeFormGroup(FormGroupStructure groupStructure, {int initialCount = 1}) {
assert(groupStructure.fields.isNotEmpty, '${groupStructure.id}: Group fields should NOT be empty.');
// Validate subgroups (if any)
_validateSubGroupsRecursively(groupStructure);
// Add structure to registry
_formGroups.add(groupStructure);
// Initialize the group instances
_initializeGroupControllersRecursively(groupStructure, initialCount);
}
// _formController.initializeFormGroup( // _formController.initializeFormGroup(
// FormGroupStructure( // FormGroupStructure(
// id: 'mainGroup', // id: 'mainGroup',
@@ -197,42 +302,6 @@ class AstromicFormController extends FormController {
// ); // );
// } // }
/// Get the formGroupStructure of this groupId
FormGroupStructure? getGroupStructure(String groupID) {
// Get the full path of the group
final String? fullPath = getFullPathOfGroup(groupID, formGroups: _formGroups);
// If no path is found, return null
if (fullPath == null) return null;
// Split the path into segments
final List<String> pathSegments = fullPath.split('->');
// We start with the root group (the first segment in the path)
FormGroupStructure? currentGroup = _formGroups.where((FormGroupStructure group) => group.id == pathSegments.first).firstOrNull;
// If the root group is not found, return null
if (currentGroup == null) return null;
// Traverse through the path segments to find the group or subgroup
for (int i = 1; i < pathSegments.length; i++) {
final String segment = pathSegments[i];
// Search for the subgroup within the current group
final (int, FormGroupStructure)? subGroup = currentGroup?.subGroups?.where(((int, FormGroupStructure) subGroup) => subGroup.$2.id == segment).firstOrNull;
// If a subgroup is found, update currentGroup to the subgroup
if (subGroup != null) {
currentGroup = subGroup.$2;
} else {
// If no subgroup is found at this level, return null
return null;
}
}
return currentGroup;
}
// FormGroupStructure? _getGroupStructure(String formGroupID, {bool isSubGroup = false}) { // FormGroupStructure? _getGroupStructure(String formGroupID, {bool isSubGroup = false}) {
// FormGroupStructure? groupStructure; // FormGroupStructure? groupStructure;
// if (isSubGroup) { // if (isSubGroup) {
@@ -300,68 +369,6 @@ class AstromicFormController extends FormController {
// } // }
// } // }
/// Validate subgroups recursively
void _validateSubGroupsRecursively(FormGroupStructure groupStructure) {
groupStructure.subGroups?.forEach(((int, FormGroupStructure) subGroupTuple) {
final FormGroupStructure subGroup = subGroupTuple.$2;
assert(subGroup.fields.isNotEmpty, '${subGroup.id}: Subgroup fields should NOT be empty.');
// Recursively validate subgroups of subgroups
if (subGroup.subGroups != null) {
_validateSubGroupsRecursively(subGroup);
}
});
}
/// Add controllers
void _addGroupControllers(FormGroupStructure structure, int index, {String? parentPrefix}) {
final String baseID = parentPrefix ?? structure.id;
for (final String fieldID in structure.fields) {
final String fullID = standeredGroupFormat(baseID, index, fieldID);
controller(fullID);
}
for (final String valueID in structure.values ?? <String>[]) {
final String fullID = standeredGroupFormat(baseID, index, valueID);
controller(fullID);
}
}
/// Recursively initialize controllers for the group and its subgroups
void _initializeGroupControllersRecursively(FormGroupStructure groupStructure, int initialCount, {String parentPrefix = ''}) {
// Add main group fields/values
for (int groupIndex = 0; groupIndex < initialCount; groupIndex++) {
_addGroupControllers(groupStructure, groupIndex, parentPrefix: parentPrefix.isEmpty ? null : parentPrefix);
// Recursively handle subgroups
if (groupStructure.subGroups != null && groupStructure.subGroups!.isNotEmpty) {
for (final (int subgroupInitialCount, FormGroupStructure subGroup) in groupStructure.subGroups!) {
final String subgroupPrefix =
parentPrefix.isEmpty ? standeredGroupFormat(groupStructure.id, groupIndex, subGroup.id) : standeredGroupFormat(parentPrefix, groupIndex, subGroup.id); // Add to parentPrefix only once
// Initialize subgroup controllers recursively
for (int subIndex = 0; subIndex < subgroupInitialCount; subIndex++) {
_initializeGroupControllersRecursively(subGroup, subgroupInitialCount, parentPrefix: subgroupPrefix);
}
}
}
}
}
void initializeFormGroup(FormGroupStructure groupStructure, {int initialCount = 1}) {
assert(groupStructure.fields.isNotEmpty, '${groupStructure.id}: Group fields should NOT be empty.');
// Validate subgroups (if any)
_validateSubGroupsRecursively(groupStructure);
// Add structure to registry
_formGroups.add(groupStructure);
// Initialize the group instances
_initializeGroupControllersRecursively(groupStructure, initialCount);
}
// void initializeFormGroup(FormGroupStructure groupStructure, {int initialCount = 1}) { // void initializeFormGroup(FormGroupStructure groupStructure, {int initialCount = 1}) {
// assert(groupStructure.fields.isNotEmpty, '$groupStructure: Group Fields should NOT be empty.'); // assert(groupStructure.fields.isNotEmpty, '$groupStructure: Group Fields should NOT be empty.');
// if (groupStructure.subGroups != null && groupStructure.subGroups!.isNotEmpty) { // if (groupStructure.subGroups != null && groupStructure.subGroups!.isNotEmpty) {
@@ -494,39 +501,6 @@ class AstromicFormController extends FormController {
// ); // );
// } // }
int getInstanceCount(String targetGroupID) {
// Helper method to check if a controller key matches the target group
bool isControllerForGroup(String controllerKey, String groupID) {
final RegExp regExp = RegExp(r'^' + RegExp.escape(groupID) + r'-#\d+-');
return regExp.hasMatch(controllerKey);
}
// Recursive helper function to find instances of a group and its subgroups
int countInstancesRecursively(FormGroupStructure groupStructure, List<String> controllersKeys) {
// Start with the base count (for the current group itself)
int instanceCount = controllersKeys.where((String key) => isControllerForGroup(key, groupStructure.id)).length;
// Recursively count instances in subgroups
if (groupStructure.subGroups != null) {
for ((int, FormGroupStructure) subGroup in groupStructure.subGroups!) {
instanceCount += countInstancesRecursively(subGroup.$2, controllersKeys);
}
}
return instanceCount;
}
// Flatten all controller keys into a list
final List<String> controllerKeys = controllers.keys.toList();
// Find the group structure for the target group
final FormGroupStructure? groupStructure = getGroupStructure(targetGroupID);
if (groupStructure == null) return 0;
// Use the recursive function to count instances for the target group
return countInstancesRecursively(groupStructure, controllerKeys);
}
FormGroupValue? getFormGroupValue(String formGroupID, {bool isSubGroup = false}) { FormGroupValue? getFormGroupValue(String formGroupID, {bool isSubGroup = false}) {
// Get the group structure with the ID // Get the group structure with the ID
FormGroupStructure? groupStructure = getGroupStructure(formGroupID); FormGroupStructure? groupStructure = getGroupStructure(formGroupID);
@@ -639,7 +613,7 @@ class AstromicFormController extends FormController {
//!SECTION //!SECTION
//SECTION - Helper Methods //SECTION - Helper Methods
String standeredGroupFormat(String groupID, int groupIndex, String? secondaryID) => '$groupID-#$groupIndex-${secondaryID ?? ""}'; String standeredGroupFormat(String groupID, String groupIndex, String? secondaryID) => '$groupID-#$groupIndex-${secondaryID ?? ""}';
void _addInitialControllers(Map<String, (String, bool)>? initialValues) { void _addInitialControllers(Map<String, (String, bool)>? initialValues) {
if (initialValues != null) { if (initialValues != null) {