This commit is contained in:
2025-04-14 12:22:19 +02:00
parent 40ca7dd72f
commit a7b98c93f4
2 changed files with 91 additions and 110 deletions

View File

@@ -327,7 +327,7 @@ class AstromicFormController extends FormController {
.map(
((int, FormGroupStructure) s) => getFormGroupValue(
s.$2.id,
parents: {
parents: <String, int>{
if (parents != null) ...parents,
formGroupID: i,
},
@@ -393,102 +393,78 @@ class AstromicFormController extends FormController {
return p.trim();
}
/// Remove an instance from the group
void removeInstanceFromGroupT(String formGroupID, int indexToRemove, {Map<String, int>? parents, bool removeAll = false}) {
// Get the group structure with the same ID
FormGroupStructure? structure = getGroupStructure(formGroupID);
assert(structure != null, 'The Group $formGroupID doesn\'t seem to be found, are you sure you initialized it?');
// Get the prefix for subgroups if exists
String? prefix;
if (isASubGroup(formGroupID) && parents != null) {
prefix = parents.entries.map((MapEntry<String, int> parentEntry) => standeredGroupFormat(parentEntry.key, parentEntry.value.toString(), null)).join('-');
void _removeGroupControllers(String composedID, List<int> indecies, List<String> fields, List<String> values, {bool switchValuesFirst = false}) {
for (int i in indecies) {
for (String fieldID in fields) {
String p = standeredGroupFormat(composedID, (switchValuesFirst ? (i + 1) : i).toString(), fieldID);
String k = standeredGroupFormat(composedID, i.toString(), fieldID);
if (switchValuesFirst) {
set(k, tryValue(p) ?? '');
}
removeController(p);
}
for (String valueID in values) {
String p = standeredGroupFormat(composedID, (switchValuesFirst ? (i + 1) : i).toString(), valueID);
String k = standeredGroupFormat(composedID, i.toString(), valueID);
if (switchValuesFirst) {
set(k, tryValue(p) ?? '');
setValue(k, getValue(p) ?? '');
}
removeValue(p);
set(p, '');
removeController(p);
}
}
}
// handle subgroups
void _checkSubgroups(String groupID, {Map<String, int>? parents}) {
// Get the group structure and check it's subGroups
FormGroupStructure? structure = getGroupStructure(groupID);
if (structure!.subGroups != null && structure.subGroups!.isNotEmpty) {
for (final (int, FormGroupStructure) subGroup in structure.subGroups!) {
// Recursively remove any nested subgroups inside this subgroup
final nestedParents = {
if (parents != null) ...parents,
structure.id: indexToRemove,
};
for ((int, FormGroupStructure) sg in structure.subGroups!) {
// Get the SubGroup instances Count and prefix it.
int subgroupCount = getInstanceCount(sg.$2.id, parents: <String, int>{if (parents != null) parents.entries.first.key: parents.entries.first.value + 1});
String prefix = parents?.entries.map((MapEntry<String, int> parentEntry) => standeredGroupFormat(parentEntry.key, parentEntry.value.toString(), null)).join('-') ?? '';
int subGroupInstancesCount = getInstanceCount(
subGroup.$2.id,
parents: nestedParents,
);
for (int ii = 0; ii < subGroupInstancesCount; ii++) {
removeInstanceFromGroupT(
subGroup.$2.id,
ii,
parents: nestedParents,
removeAll: true,
// Recurse through subGroups to find the latest.
for (int sgInstance = 0; sgInstance < subgroupCount; sgInstance++) {
_checkSubgroups(
sg.$2.id,
parents: <String, int>{
...?parents,
...<String, int>{sg.$2.id: sgInstance}
},
);
}
//--
// }
// Remove controllers for these subgroups.
_removeGroupControllers(prefix.isNotEmpty ? '$prefix-${sg.$2.id}' : sg.$2.id, List<int>.generate(subgroupCount, (int ii) => ii), sg.$2.fields, sg.$2.values ?? <String>[]);
}
}
// Get current instances of this group.
int currentGroupInstances = getInstanceCount(formGroupID, parents: parents);
if (removeAll) {
for (var ina = 0; ina < currentGroupInstances; ina++) {
// Remove the last item
for (String fieldID in structure.fields) {
String p = (prefix != null ? '$prefix-' : '') + standeredGroupFormat(structure.id, ina.toString(), fieldID);
removeController(p);
}
if (structure.values != null && structure.values!.isNotEmpty) {
for (String valueID in structure.values!) {
String p = (prefix != null ? '$prefix-' : '') + standeredGroupFormat(structure.id, ina.toString(), valueID);
removeValue(p);
removeController(p);
}
}
}
}
/// Remove an instance from the group
void removeInstanceFromGroup(String targetGroupID, int indexToRemove, {Map<String, int>? parents}) {
// Get tha main targeted group's structure
FormGroupStructure? targetedGroupStructure = getGroupStructure(targetGroupID);
assert(targetedGroupStructure != null, 'The Group $targetGroupID doesn\'t seem to be found, are you sure you initialized it?');
// Get tha main targeted group's count
int targetedGroupCount = getInstanceCount(targetGroupID, parents: parents);
assert(indexToRemove < targetedGroupCount, 'The index to remove is larger than the whole instances count. ($indexToRemove , $targetedGroupCount)');
// Loop through the subGroups and remove their controllers.
// Prefix the main targeted ID and remove it's controllers.
String prefix = parents?.entries.map((MapEntry<String, int> parentEntry) => standeredGroupFormat(parentEntry.key, parentEntry.value.toString(), null)).join('-') ?? '';
if (indexToRemove == (targetedGroupCount - 1)) {
// Last Item in the group, Remove directly.
_checkSubgroups(targetGroupID, parents: <String, int>{...?parents, targetGroupID: indexToRemove});
_removeGroupControllers(prefix.isNotEmpty ? '$prefix-$targetGroupID' : targetGroupID, <int>[indexToRemove], targetedGroupStructure!.fields, targetedGroupStructure.values ?? <String>[]);
} else {
// The actual controllers removal
if (indexToRemove >= currentGroupInstances) {
// return;
throw Exception('The index to remove is larger than the whole instances count. ($indexToRemove , $currentGroupInstances)');
} else {
if (indexToRemove == (currentGroupInstances - 1)) {
// Remove the last item
for (String fieldID in structure.fields) {
String p = (prefix != null ? '$prefix-' : '') + standeredGroupFormat(structure.id, indexToRemove.toString(), fieldID);
removeController(p);
}
if (structure.values != null && structure.values!.isNotEmpty) {
for (String valueID in structure.values!) {
String p = (prefix != null ? '$prefix-' : '') + standeredGroupFormat(structure.id, indexToRemove.toString(), valueID);
removeValue(p);
removeController(p);
}
}
} else {
// Switch and remove
int nextIndex = indexToRemove + 1;
for (String fieldID in structure!.fields) {
String p = (prefix != null ? '$prefix-' : '') + standeredGroupFormat(structure.id, indexToRemove.toString(), fieldID);
String p2 = (prefix != null ? '$prefix-' : '') + standeredGroupFormat(structure.id, nextIndex.toString(), fieldID);
set(p, value(p2));
removeController(p2);
}
if (structure.values != null && structure.values!.isNotEmpty) {
for (String valueID in structure.values!) {
String p = (prefix != null ? '$prefix-' : '') + standeredGroupFormat(structure.id, indexToRemove.toString(), valueID);
String p2 = (prefix != null ? '$prefix-' : '') + standeredGroupFormat(structure.id, nextIndex.toString(), valueID);
removeValue(p);
set(p, value(p2));
setValue(p, getValue(p2));
removeController(p2);
removeValue(p2);
}
}
}
}
//TODO - Has an issue with transferring subGroups...
_checkSubgroups(targetGroupID, parents: <String, int>{...?parents, targetGroupID: indexToRemove});
_removeGroupControllers(prefix.isNotEmpty ? '$prefix-$targetGroupID' : targetGroupID, <int>[indexToRemove], targetedGroupStructure!.fields, targetedGroupStructure.values ?? <String>[],
switchValuesFirst: true);
}
}
//!SECTION

View File

@@ -2,48 +2,43 @@
//s2 Packages
//s3 Core Packages
import 'package:flutter/material.dart';
import '../../../astromic_helpers.dart';
//s3 Internal Packages
// import 'package:astromic_elements/astromic_elements.dart';
//s3 3rd-party Packages
//s2 Utility
//s3 Configs
// import '../../../../../core/configs/routing/routing.config.dart';
//s3 Misc
//s2 Domain
//s3 Entities
import 'controller.dart';
import 'models/models.exports.dart';
//s3 Usecases
//s2 Presentation
//s3 Design
// import '../../../../design-system/design_system.dart';
//s3 Presenters
//s3 Widgets
//s1 Exports
class FormGroupWrapper extends StatefulWidget {
class FormGroupWrapperTest extends StatefulWidget {
//SECTION - Widget Arguments
final AstromicFormController formController;
final String groupID;
final Widget Function(List<Widget> children, String Function() addItem, void Function(int) removeItem) groupBuilder;
final Widget Function(int index, String composedID, VoidCallback removeItem) itemBuilder;
final int startLength;
final Map<String, int>? parents;
//!SECTION
//
const FormGroupWrapper({
const FormGroupWrapperTest({
super.key,
required this.formController,
required this.groupID,
required this.groupBuilder,
required this.itemBuilder,
this.startLength = 0,
this.parents,
});
@override
State<FormGroupWrapper> createState() => _FormGroupWrapperState();
State<FormGroupWrapperTest> createState() => _FormGroupWrapperTestState();
}
class _FormGroupWrapperState extends State<FormGroupWrapper> {
class _FormGroupWrapperTestState extends State<FormGroupWrapperTest> {
//
//SECTION - State Variables
//s1 --State
@@ -66,7 +61,8 @@ class _FormGroupWrapperState extends State<FormGroupWrapper> {
//s1 --State
//
//s1 --Controllers & Listeners
instances = widget.formController.getFormGroupValue(widget.groupID)!.instances;
instances = widget.formController.getFormGroupValue(widget.groupID, parents: widget.parents)!.instances;
// LoggingService.log("instances: $instances");
//s1 --Controllers & Listeners
//
//s1 --Late & Async Initializers
@@ -98,27 +94,36 @@ class _FormGroupWrapperState extends State<FormGroupWrapper> {
//SECTION - Build Return
return widget.groupBuilder(
// Children
List<Widget>.generate(instances.length, (int i) => widget.itemBuilder(i, instances[i].composedID, () => _removeItem(i))),
List<Widget>.generate(
instances.length,
(int i) => widget.itemBuilder(i, instances[i].composedID, () {
setState(() {
_removeItem(i);
instances = widget.formController.getFormGroupValue(widget.groupID, parents: widget.parents)!.instances;
});
})),
// Add Callback
() {
String id = '';
setState(() {
// id = widget.formController.addInstanceToFormGroup(widget.groupID);
// instances = widget.formController.getFormGroupValue(widget.groupID)!.instances;
id = widget.formController.addInstanceToFormGroup(widget.groupID, parents: widget.parents);
instances = widget.formController.getFormGroupValue(widget.groupID, parents: widget.parents)!.instances;
});
return id;
},
// Remove Callback
(int i) => _removeItem(i),
(int i) {
setState(() {
_removeItem(i);
instances = widget.formController.getFormGroupValue(widget.groupID, parents: widget.parents)!.instances;
});
},
);
//!SECTION
}
void _removeItem(int i) {
setState(() {
// widget.formController.removeInstanceFromFormGroup(widget.groupID, i,isSubGroup: widget.isSubGroup);
// instances = widget.formController.getFormGroupValue(widget.groupID,isSubGroup: widget.isSubGroup)!.instances;
});
widget.formController.removeInstanceFromGroup(widget.groupID, i, parents: widget.parents);
}
@override