mirror of
https://github.com/ImranR98/Obtainium.git
synced 2025-08-01 13:20:16 +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;
|
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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user