Attempt to fix form input issues for recursive forms (NOT FULLY TESTED)

This commit is contained in:
Imran Remtulla
2024-01-12 21:51:48 -05:00
parent 34fee36132
commit 5c7f5a99e1

View File

@@ -13,6 +13,7 @@ abstract class GeneratedFormItem {
late dynamic defaultValue; late dynamic defaultValue;
List<dynamic> additionalValidators; List<dynamic> additionalValidators;
dynamic ensureType(dynamic val); dynamic ensureType(dynamic val);
GeneratedFormItem clone();
GeneratedFormItem(this.key, GeneratedFormItem(this.key,
{this.label = 'Input', {this.label = 'Input',
@@ -44,6 +45,20 @@ class GeneratedFormTextField extends GeneratedFormItem {
String ensureType(val) { String ensureType(val) {
return val.toString(); return val.toString();
} }
@override
GeneratedFormTextField clone() {
return GeneratedFormTextField(key,
label: label,
belowWidgets: belowWidgets,
defaultValue: defaultValue,
additionalValidators: List.from(additionalValidators),
required: required,
max: max,
hint: hint,
password: password,
textInputType: textInputType);
}
} }
class GeneratedFormDropdown extends GeneratedFormItem { class GeneratedFormDropdown extends GeneratedFormItem {
@@ -64,6 +79,20 @@ class GeneratedFormDropdown extends GeneratedFormItem {
String ensureType(val) { String ensureType(val) {
return val.toString(); return val.toString();
} }
@override
GeneratedFormDropdown clone() {
return GeneratedFormDropdown(
key,
opts?.map((e) => MapEntry(e.key, e.value)).toList(),
label: label,
belowWidgets: belowWidgets,
defaultValue: defaultValue,
disabledOptKeys:
disabledOptKeys != null ? List.from(disabledOptKeys!) : null,
additionalValidators: List.from(additionalValidators),
);
}
} }
class GeneratedFormSwitch extends GeneratedFormItem { class GeneratedFormSwitch extends GeneratedFormItem {
@@ -79,6 +108,15 @@ class GeneratedFormSwitch extends GeneratedFormItem {
bool ensureType(val) { bool ensureType(val) {
return val == true || val == 'true'; return val == true || val == 'true';
} }
@override
GeneratedFormSwitch clone() {
return GeneratedFormSwitch(key,
label: label,
belowWidgets: belowWidgets,
defaultValue: defaultValue,
additionalValidators: List.from(additionalValidators));
}
} }
class GeneratedFormTagInput extends GeneratedFormItem { class GeneratedFormTagInput extends GeneratedFormItem {
@@ -103,6 +141,20 @@ class GeneratedFormTagInput extends GeneratedFormItem {
Map<String, MapEntry<int, bool>> ensureType(val) { Map<String, MapEntry<int, bool>> ensureType(val) {
return val is Map<String, MapEntry<int, bool>> ? val : {}; return val is Map<String, MapEntry<int, bool>> ? val : {};
} }
@override
GeneratedFormTagInput clone() {
return GeneratedFormTagInput(key,
label: label,
belowWidgets: belowWidgets,
defaultValue: defaultValue,
additionalValidators: List.from(additionalValidators),
deleteConfirmationMessage: deleteConfirmationMessage,
singleSelect: singleSelect,
alignment: alignment,
emptyMessage: emptyMessage,
showLabelWhenNotEmpty: showLabelWhenNotEmpty);
}
} }
typedef OnValueChanges = void Function( typedef OnValueChanges = void Function(
@@ -119,6 +171,19 @@ class GeneratedForm extends StatefulWidget {
State<GeneratedForm> createState() => _GeneratedFormState(); State<GeneratedForm> createState() => _GeneratedFormState();
} }
List<List<GeneratedFormItem>> cloneFormItems(
List<List<GeneratedFormItem>> items) {
List<List<GeneratedFormItem>> clonedItems = [];
items.forEach((row) {
List<GeneratedFormItem> clonedRow = [];
row.forEach((it) {
clonedRow.add(it.clone());
});
clonedItems.add(clonedRow);
});
return clonedItems;
}
class GeneratedFormSubForm extends GeneratedFormItem { class GeneratedFormSubForm extends GeneratedFormItem {
final List<List<GeneratedFormItem>> items; final List<List<GeneratedFormItem>> items;
@@ -129,6 +194,12 @@ class GeneratedFormSubForm extends GeneratedFormItem {
ensureType(val) { ensureType(val) {
return val; // Not easy to validate List<Map<String, dynamic>> return val; // Not easy to validate List<Map<String, dynamic>>
} }
@override
GeneratedFormSubForm clone() {
return GeneratedFormSubForm(key, cloneFormItems(items),
label: label, belowWidgets: belowWidgets, defaultValue: defaultValue);
}
} }
// Generates a color in the HSLuv (Pastel) color space // Generates a color in the HSLuv (Pastel) color space
@@ -510,15 +581,12 @@ class _GeneratedFormState extends State<GeneratedForm> {
]); ]);
} else if (widget.items[r][e] is GeneratedFormSubForm) { } else if (widget.items[r][e] is GeneratedFormSubForm) {
List<Widget> subformColumn = []; List<Widget> subformColumn = [];
var formItems = (widget.items[r][e] as GeneratedFormSubForm).items; var compact = (widget.items[r][e] as GeneratedFormSubForm)
var compact = formItems.length == 1 && formItems[0].length == 1; .items
.length ==
1 &&
(widget.items[r][e] as GeneratedFormSubForm).items[0].length == 1;
for (int i = 0; i < values[fieldKey].length; i++) { for (int i = 0; i < values[fieldKey].length; i++) {
var items = formItems
.map((x) => x.map((y) {
y.defaultValue = values[fieldKey]?[i]?[y.key];
return y;
}).toList())
.toList();
var internalFormKey = ValueKey(generateRandomNumber( var internalFormKey = ValueKey(generateRandomNumber(
values[fieldKey].length, values[fieldKey].length,
seed2: i, seed2: i,
@@ -537,8 +605,17 @@ class _GeneratedFormState extends State<GeneratedForm> {
), ),
GeneratedForm( GeneratedForm(
key: internalFormKey, key: internalFormKey,
items: items, items: cloneFormItems(
(widget.items[r][e] as GeneratedFormSubForm).items)
.map((x) => x.map((y) {
y.defaultValue = values[fieldKey]?[i]?[y.key];
y.key = '${y.key.toString()},$internalFormKey';
return y;
}).toList())
.toList(),
onValueChanges: (values, valid, isBuilding) { onValueChanges: (values, valid, isBuilding) {
values = values.map(
(key, value) => MapEntry(key.split(',')[0], value));
if (valid) { if (valid) {
this.values[fieldKey]?[i] = values; this.values[fieldKey]?[i] = values;
} }