From d19f9101d6ff6fca04bda0f63ecbf0513bd5f37c Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Sat, 19 Nov 2022 15:42:20 -0500 Subject: [PATCH] Added dropdown support to generated form --- lib/app_sources/fdroid.dart | 1 - lib/app_sources/izzyondroid.dart | 1 - lib/components/generated_form.dart | 35 ++++++++++++++++++++---- lib/components/generated_form_modal.dart | 11 ++++++-- lib/pages/add_app.dart | 4 +-- lib/pages/settings.dart | 2 +- 6 files changed, 40 insertions(+), 14 deletions(-) diff --git a/lib/app_sources/fdroid.dart b/lib/app_sources/fdroid.dart index 9ace2e6..2bdf958 100644 --- a/lib/app_sources/fdroid.dart +++ b/lib/app_sources/fdroid.dart @@ -1,6 +1,5 @@ import 'dart:convert'; -import 'package:html/parser.dart'; import 'package:http/http.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/providers/source_provider.dart'; diff --git a/lib/app_sources/izzyondroid.dart b/lib/app_sources/izzyondroid.dart index 51407de..e63ae75 100644 --- a/lib/app_sources/izzyondroid.dart +++ b/lib/app_sources/izzyondroid.dart @@ -1,4 +1,3 @@ -import 'package:html/parser.dart'; import 'package:http/http.dart'; import 'package:obtainium/app_sources/fdroid.dart'; import 'package:obtainium/custom_errors.dart'; diff --git a/lib/components/generated_form.dart b/lib/components/generated_form.dart index a777d5f..51418c9 100644 --- a/lib/components/generated_form.dart +++ b/lib/components/generated_form.dart @@ -2,7 +2,8 @@ import 'package:flutter/material.dart'; enum FormItemType { string, bool } -typedef OnValueChanges = void Function(List values, bool valid); +typedef OnValueChanges = void Function( + List values, bool valid, bool isBuilding); class GeneratedFormItem { late String label; @@ -13,6 +14,7 @@ class GeneratedFormItem { late String id; late List belowWidgets; late String? hint; + late List? opts; GeneratedFormItem( {this.label = 'Input', @@ -22,7 +24,8 @@ class GeneratedFormItem { this.additionalValidators = const [], this.id = 'input', this.belowWidgets = const [], - this.hint}); + this.hint, + this.opts}); } class GeneratedForm extends StatefulWidget { @@ -47,7 +50,7 @@ class _GeneratedFormState extends State { List> rows = []; // If any value changes, call this to update the parent with value and validity - void someValueChanged() { + void someValueChanged({bool isBuilding = false}) { List returnValues = []; var valid = true; for (int r = 0; r < values.length; r++) { @@ -62,7 +65,7 @@ class _GeneratedFormState extends State { } } } - widget.onValueChanges(returnValues, valid); + widget.onValueChanges(returnValues, valid, isBuilding); } @override @@ -75,14 +78,16 @@ class _GeneratedFormState extends State { .map((row) => row.map((e) { return j < widget.defaultValues.length ? widget.defaultValues[j++] - : ''; + : e.opts != null + ? e.opts!.first + : ''; }).toList()) .toList(); // Dynamically create form inputs formInputs = widget.items.asMap().entries.map((row) { return row.value.asMap().entries.map((e) { - if (e.value.type == FormItemType.string) { + if (e.value.type == FormItemType.string && e.value.opts == null) { final formFieldKey = GlobalKey(); return TextFormField( key: formFieldKey, @@ -112,11 +117,29 @@ class _GeneratedFormState extends State { return null; }, ); + } else if (e.value.type == FormItemType.string && + e.value.opts != null) { + if (e.value.opts!.isEmpty) { + return const Text('ERROR: DROPDOWN MUST HAVE AT LEAST ONE OPT.'); + } + return DropdownButtonFormField( + decoration: const InputDecoration(labelText: 'Colour'), + value: values[row.key][e.key], + items: e.value.opts! + .map((e) => DropdownMenuItem(value: e, child: Text(e))) + .toList(), + onChanged: (value) { + setState(() { + values[row.key][e.key] = value ?? e.value.opts!.first; + someValueChanged(); + }); + }); } else { return Container(); // Some input types added in build } }).toList(); }).toList(); + someValueChanged(isBuilding: true); } @override diff --git a/lib/components/generated_form_modal.dart b/lib/components/generated_form_modal.dart index 410fb92..7406b51 100644 --- a/lib/components/generated_form_modal.dart +++ b/lib/components/generated_form_modal.dart @@ -46,11 +46,16 @@ class _GeneratedFormModalState extends State { ), GeneratedForm( items: widget.items, - onValueChanges: (values, valid) { - setState(() { + onValueChanges: (values, valid, isBuilding) { + if (isBuilding) { this.values = values; this.valid = valid; - }); + } else { + setState(() { + this.values = values; + this.valid = valid; + }); + } }, defaultValues: widget.defaultValues) ]), diff --git a/lib/pages/add_app.dart b/lib/pages/add_app.dart index b85b85d..5c06917 100644 --- a/lib/pages/add_app.dart +++ b/lib/pages/add_app.dart @@ -66,7 +66,7 @@ class _AddAppPageState extends State { ]) ] ], - onValueChanges: (values, valid) { + onValueChanges: (values, valid, isBuilding) { setState(() { userInput = values[0]; var source = valid @@ -179,7 +179,7 @@ class _AddAppPageState extends State { .additionalDataFormItems.isNotEmpty) GeneratedForm( items: pickedSource!.additionalDataFormItems, - onValueChanges: (values, valid) { + onValueChanges: (values, valid, isBuilding) { setState(() { additionalData = values; validAdditionalData = valid; diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 4498a91..48cfd35 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -142,7 +142,7 @@ class _SettingsPageState extends State { if (e.moreSourceSettingsFormItems.isNotEmpty) { return GeneratedForm( items: e.moreSourceSettingsFormItems.map((e) => [e]).toList(), - onValueChanges: (values, valid) { + onValueChanges: (values, valid, isBuilding) { if (valid) { for (var i = 0; i < values.length; i++) { settingsProvider.setSettingString(