From fa4d46b622c44067d5b74e6906f9c35cce99a10d Mon Sep 17 00:00:00 2001 From: Imran Remtulla Date: Thu, 22 Dec 2022 02:13:21 -0500 Subject: [PATCH] Bugfix es+ new category picker on App page --- assets/translations/de.json | 5 +-- assets/translations/en.json | 5 +-- assets/translations/hu.json | 5 +-- assets/translations/it.json | 5 +-- assets/translations/ja.json | 5 +-- assets/translations/zh.json | 5 +-- lib/components/generated_form.dart | 36 ++++++++++++++++--- lib/pages/app.dart | 58 +++++++++--------------------- lib/pages/settings.dart | 20 ++++++++--- 9 files changed, 81 insertions(+), 63 deletions(-) diff --git a/assets/translations/de.json b/assets/translations/de.json index aea452e..01756a5 100644 --- a/assets/translations/de.json +++ b/assets/translations/de.json @@ -203,8 +203,9 @@ "categories": "Categories", "category": "Category", "noCategory": "No Category", - "deleteCategoryQuestion": "Delete Category?", - "categoryDeleteWarning": "All Apps in {} will be set to uncategorized.", + "noCategories": "No Categories", + "deleteCategoriesQuestion": "Delete Categories?", + "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "Add Category", "label": "Label", "tooManyRequestsTryAgainInMinutes": { diff --git a/assets/translations/en.json b/assets/translations/en.json index 99b57e7..49914df 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -203,8 +203,9 @@ "categories": "Categories", "category": "Category", "noCategory": "No Category", - "deleteCategoryQuestion": "Delete Category?", - "categoryDeleteWarning": "All Apps in {} will be set to uncategorized.", + "noCategories": "No Categories", + "deleteCategoriesQuestion": "Delete Categories?", + "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "Add Category", "label": "Label", "tooManyRequestsTryAgainInMinutes": { diff --git a/assets/translations/hu.json b/assets/translations/hu.json index fec9af3..84ff5e9 100644 --- a/assets/translations/hu.json +++ b/assets/translations/hu.json @@ -203,8 +203,9 @@ "categories": "Categories", "category": "Category", "noCategory": "No Category", - "deleteCategoryQuestion": "Delete Category?", - "categoryDeleteWarning": "All Apps in {} will be set to uncategorized.", + "noCategories": "No Categories", + "deleteCategoriesQuestion": "Delete Categories?", + "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "Add Category", "label": "Label", "tooManyRequestsTryAgainInMinutes": { diff --git a/assets/translations/it.json b/assets/translations/it.json index d4a660b..6c897a2 100644 --- a/assets/translations/it.json +++ b/assets/translations/it.json @@ -203,8 +203,9 @@ "categories": "Categories", "category": "Category", "noCategory": "No Category", - "deleteCategoryQuestion": "Delete Category?", - "categoryDeleteWarning": "All Apps in {} will be set to uncategorized.", + "noCategories": "No Categories", + "deleteCategoriesQuestion": "Delete Categories?", + "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "Add Category", "label": "Label", "tooManyRequestsTryAgainInMinutes": { diff --git a/assets/translations/ja.json b/assets/translations/ja.json index b500a4e..5cebd61 100644 --- a/assets/translations/ja.json +++ b/assets/translations/ja.json @@ -203,8 +203,9 @@ "categories": "カテゴリ", "category": "カテゴリ", "noCategory": "カテゴリなし", - "deleteCategoryQuestion": "カテゴリを削除しますか?", - "categoryDeleteWarning": "「{}」内のすべてのアプリは未分類に設定されます。", + "noCategories": "No Categories", + "deleteCategoriesQuestion": "Delete Categories?", + "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "カテゴリを追加", "label": "ラベル", "tooManyRequestsTryAgainInMinutes": { diff --git a/assets/translations/zh.json b/assets/translations/zh.json index 2d968ca..0f1286f 100644 --- a/assets/translations/zh.json +++ b/assets/translations/zh.json @@ -203,8 +203,9 @@ "categories": "Categories", "category": "Category", "noCategory": "No Category", - "deleteCategoryQuestion": "Delete Category?", - "categoryDeleteWarning": "All Apps in {} will be set to uncategorized.", + "noCategories": "No Categories", + "deleteCategoriesQuestion": "Delete Categories?", + "categoryDeleteWarning": "All Apps in deleted categories will be set to uncategorized.", "addCategory": "Add Category", "label": "Label", "tooManyRequestsTryAgainInMinutes": { diff --git a/lib/components/generated_form.dart b/lib/components/generated_form.dart index 1411217..bc0e237 100644 --- a/lib/components/generated_form.dart +++ b/lib/components/generated_form.dart @@ -89,6 +89,8 @@ class GeneratedFormSwitch extends GeneratedFormItem { class GeneratedFormTagInput extends GeneratedFormItem { late MapEntry? deleteConfirmationMessage; late bool singleSelect; + late WrapAlignment alignment; + late String emptyMessage; GeneratedFormTagInput(String key, {String label = 'Input', List belowWidgets = const [], @@ -96,7 +98,9 @@ class GeneratedFormTagInput extends GeneratedFormItem { List> value)> additionalValidators = const [], this.deleteConfirmationMessage, - this.singleSelect = false}) + this.singleSelect = false, + this.alignment = WrapAlignment.start, + this.emptyMessage = 'Input'}) : super(key, label: label, belowWidgets: belowWidgets, @@ -256,7 +260,19 @@ class _GeneratedFormState extends State { ); } else if (widget.items[r][e] is GeneratedFormTagInput) { formInputs[r][e] = Wrap( + alignment: (widget.items[r][e] as GeneratedFormTagInput).alignment, + crossAxisAlignment: WrapCrossAlignment.center, children: [ + (values[widget.items[r][e].key] + as Map>?) + ?.isEmpty == + true + ? Text( + (widget.items[r][e] as GeneratedFormTagInput) + .emptyMessage, + style: const TextStyle(fontWeight: FontWeight.bold), + ) + : const SizedBox.shrink(), ...(values[widget.items[r][e].key] as Map>?) ?.entries @@ -265,7 +281,7 @@ class _GeneratedFormState extends State { padding: const EdgeInsets.symmetric(horizontal: 4), child: ChoiceChip( label: Text(e2.key), - backgroundColor: Color(e2.value.key).withAlpha(200), + backgroundColor: Color(e2.value.key).withAlpha(50), selectedColor: Color(e2.value.key), visualDensity: VisualDensity.compact, selected: e2.value.value, @@ -327,12 +343,15 @@ class _GeneratedFormState extends State { if ((widget.items[r][e] as GeneratedFormTagInput) .deleteConfirmationMessage != null) { + var message = + (widget.items[r][e] as GeneratedFormTagInput) + .deleteConfirmationMessage!; showDialog?>( context: context, builder: (BuildContext ctx) { return GeneratedFormModal( - title: tr('deleteCategoryQuestion'), - message: tr('categoryDeleteWarning'), + title: message.key, + message: message.value, items: const []); }).then((value) { if (value != null) { @@ -370,8 +389,15 @@ class _GeneratedFormState extends State { var temp = values[widget.items[r][e].key] as Map>?; temp ??= {}; + var singleSelect = + (widget.items[r][e] as GeneratedFormTagInput) + .singleSelect; + var someSelected = temp.entries + .where((element) => element.value.value) + .isNotEmpty; temp[label] = MapEntry( - generateRandomLightColor().value, false); + generateRandomLightColor().value, + !(someSelected && singleSelect)); values[widget.items[r][e].key] = temp; someValueChanged(); }); diff --git a/lib/pages/app.dart b/lib/pages/app.dart index ae6c070..3315569 100644 --- a/lib/pages/app.dart +++ b/lib/pages/app.dart @@ -5,6 +5,7 @@ import 'package:obtainium/components/generated_form.dart'; import 'package:obtainium/components/generated_form_modal.dart'; import 'package:obtainium/custom_errors.dart'; import 'package:obtainium/main.dart'; +import 'package:obtainium/pages/settings.dart'; import 'package:obtainium/providers/apps_provider.dart'; import 'package:obtainium/providers/settings_provider.dart'; import 'package:obtainium/providers/source_provider.dart'; @@ -152,49 +153,22 @@ class _AppPageState extends State { fontStyle: FontStyle.italic, fontSize: 12), ), const SizedBox( - height: 32, + height: 48, ), - app?.app.category != null - ? Chip( - label: Text(app!.app.category!), - backgroundColor: - Color(categories[app.app.category!] ?? 0x0), - onDeleted: () { - app.app.category = null; - appsProvider.saveApps([app.app]); - }, - visualDensity: VisualDensity.compact, - ) - : Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - TextButton( - onPressed: () { - showDialog?>( - context: context, - builder: (BuildContext ctx) { - return GeneratedFormModal( - title: 'Pick a Category', - items: [ - [ - settingsProvider - .getCategoryFormItem() - ] - ]); - }).then((value) { - if (value != null && app != null) { - String? cat = (value['category'] - ?.isNotEmpty ?? - false) - ? value['category'] - : null; - app.app.category = cat; - appsProvider.saveApps([app.app]); - } - }); - }, - child: Text(tr('categorize'))) - ]) + CategoryEditorSelector( + alignment: WrapAlignment.center, + singleSelect: true, + preselected: app?.app.category != null + ? {app!.app.category!} + : {}, + onSelected: (categories) { + if (app != null) { + app.app.category = categories.isNotEmpty + ? categories[0] + : null; + appsProvider.saveApps([app.app]); + } + }) ], )), ], diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 5e86d0d..d4a4a3c 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -380,8 +380,14 @@ class _LogsDialogState extends State { class CategoryEditorSelector extends StatefulWidget { final void Function(List categories)? onSelected; final bool singleSelect; + final Set preselected; + final WrapAlignment alignment; const CategoryEditorSelector( - {super.key, this.onSelected, this.singleSelect = false}); + {super.key, + this.onSelected, + this.singleSelect = false, + this.preselected = const {}, + this.alignment = WrapAlignment.start}); @override State createState() => _CategoryEditorSelectorState(); @@ -393,15 +399,21 @@ class _CategoryEditorSelectorState extends State { @override Widget build(BuildContext context) { var settingsProvider = context.watch(); - storedValues = settingsProvider.categories.map((key, value) => - MapEntry(key, MapEntry(value, storedValues[key]?.value ?? false))); + storedValues = settingsProvider.categories.map((key, value) => MapEntry( + key, + MapEntry(value, + storedValues[key]?.value ?? widget.preselected.contains(key)))); return GeneratedForm( items: [ [ GeneratedFormTagInput('categories', + label: tr('category'), + emptyMessage: tr('noCategories'), defaultValue: storedValues, + alignment: widget.alignment, deleteConfirmationMessage: MapEntry( - tr('deleteCategoryQuestion'), tr('categoryDeleteWarning')), + tr('deleteCategoriesQuestion'), + tr('categoryDeleteWarning')), singleSelect: widget.singleSelect) ] ],