mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-07-31 21:00:15 +02:00
Attempt to fix form input issues for recursive forms (NOT FULLY TESTED)
This commit is contained in:
@@ -13,6 +13,7 @@ abstract class GeneratedFormItem {
|
||||
late dynamic defaultValue;
|
||||
List<dynamic> additionalValidators;
|
||||
dynamic ensureType(dynamic val);
|
||||
GeneratedFormItem clone();
|
||||
|
||||
GeneratedFormItem(this.key,
|
||||
{this.label = 'Input',
|
||||
@@ -44,6 +45,20 @@ class GeneratedFormTextField extends GeneratedFormItem {
|
||||
String ensureType(val) {
|
||||
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 {
|
||||
@@ -64,6 +79,20 @@ class GeneratedFormDropdown extends GeneratedFormItem {
|
||||
String ensureType(val) {
|
||||
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 {
|
||||
@@ -79,6 +108,15 @@ class GeneratedFormSwitch extends GeneratedFormItem {
|
||||
bool ensureType(val) {
|
||||
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 {
|
||||
@@ -103,6 +141,20 @@ class GeneratedFormTagInput extends GeneratedFormItem {
|
||||
Map<String, MapEntry<int, bool>> ensureType(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(
|
||||
@@ -119,6 +171,19 @@ class GeneratedForm extends StatefulWidget {
|
||||
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 {
|
||||
final List<List<GeneratedFormItem>> items;
|
||||
|
||||
@@ -129,6 +194,12 @@ class GeneratedFormSubForm extends GeneratedFormItem {
|
||||
ensureType(val) {
|
||||
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
|
||||
@@ -510,15 +581,12 @@ class _GeneratedFormState extends State<GeneratedForm> {
|
||||
]);
|
||||
} else if (widget.items[r][e] is GeneratedFormSubForm) {
|
||||
List<Widget> subformColumn = [];
|
||||
var formItems = (widget.items[r][e] as GeneratedFormSubForm).items;
|
||||
var compact = formItems.length == 1 && formItems[0].length == 1;
|
||||
var compact = (widget.items[r][e] as GeneratedFormSubForm)
|
||||
.items
|
||||
.length ==
|
||||
1 &&
|
||||
(widget.items[r][e] as GeneratedFormSubForm).items[0].length == 1;
|
||||
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(
|
||||
values[fieldKey].length,
|
||||
seed2: i,
|
||||
@@ -537,8 +605,17 @@ class _GeneratedFormState extends State<GeneratedForm> {
|
||||
),
|
||||
GeneratedForm(
|
||||
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) {
|
||||
values = values.map(
|
||||
(key, value) => MapEntry(key.split(',')[0], value));
|
||||
if (valid) {
|
||||
this.values[fieldKey]?[i] = values;
|
||||
}
|
||||
|
Reference in New Issue
Block a user