diff --git a/lib/features/tasks/ui/checkbox_widget.dart b/lib/features/tasks/ui/checkbox_item_widget.dart similarity index 51% rename from lib/features/tasks/ui/checkbox_widget.dart rename to lib/features/tasks/ui/checkbox_item_widget.dart index 54dbcd866..c8b0985b4 100644 --- a/lib/features/tasks/ui/checkbox_widget.dart +++ b/lib/features/tasks/ui/checkbox_item_widget.dart @@ -1,6 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:lotti/features/tasks/state/checklist_item_controller.dart'; // ignore: avoid_positional_boolean_parameters typedef BoolCallback = void Function(bool); @@ -56,54 +54,3 @@ class _CheckboxItemWidgetState extends State { ); } } - -class CheckboxItemWrapper extends ConsumerWidget { - const CheckboxItemWrapper( - this.itemId, { - super.key, - }); - - final String itemId; - - @override - Widget build( - BuildContext context, - WidgetRef ref, - ) { - final provider = checklistItemControllerProvider(id: itemId); - final item = ref.watch(provider); - - return item.map( - data: (data) { - final item = data.value; - if (item == null) { - return const SizedBox(); - } - return CheckboxItemWidget( - title: item.data.title, - isChecked: item.data.isChecked, - onChanged: (checked) => ref.read(provider.notifier).toggleChecked(), - ); - }, - error: ErrorWidget.new, - loading: (_) => const CircularProgressIndicator(), - ); - } -} - -class CheckboxItemsList extends StatelessWidget { - const CheckboxItemsList({ - required this.itemIds, - super.key, - }); - - final List itemIds; - - @override - Widget build(BuildContext context) { - return Column( - mainAxisSize: MainAxisSize.min, - children: itemIds.map(CheckboxItemWrapper.new).toList(), - ); - } -} diff --git a/lib/features/tasks/ui/checkbox_item_wrapper.dart b/lib/features/tasks/ui/checkbox_item_wrapper.dart new file mode 100644 index 000000000..07996beaa --- /dev/null +++ b/lib/features/tasks/ui/checkbox_item_wrapper.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:lotti/features/tasks/state/checklist_item_controller.dart'; +import 'package:lotti/features/tasks/ui/checkbox_item_widget.dart'; + +class CheckboxItemWrapper extends ConsumerWidget { + const CheckboxItemWrapper( + this.itemId, { + super.key, + }); + + final String itemId; + + @override + Widget build( + BuildContext context, + WidgetRef ref, + ) { + final provider = checklistItemControllerProvider(id: itemId); + final item = ref.watch(provider); + + return item.map( + data: (data) { + final item = data.value; + if (item == null) { + return const SizedBox.shrink(); + } + return CheckboxItemWidget( + title: item.data.title, + isChecked: item.data.isChecked, + onChanged: (checked) => ref.read(provider.notifier).toggleChecked(), + ); + }, + error: ErrorWidget.new, + loading: (_) => const SizedBox.shrink(), + ); + } +} diff --git a/lib/features/tasks/ui/checkbox_items_list.dart b/lib/features/tasks/ui/checkbox_items_list.dart new file mode 100644 index 000000000..f0648e6ec --- /dev/null +++ b/lib/features/tasks/ui/checkbox_items_list.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:lotti/features/tasks/ui/checkbox_item_wrapper.dart'; +import 'package:lotti/l10n/app_localizations_context.dart'; + +import '../../../themes/theme.dart'; + +class CheckboxItemsList extends StatelessWidget { + const CheckboxItemsList({ + required this.itemIds, + super.key, + }); + + final List itemIds; + + @override + Widget build(BuildContext context) { + return ExpansionTile( + title: const Text('Checklist'), + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 20, + vertical: 10, + ), + child: TextField( + decoration: inputDecoration( + labelText: context.messages.checklistAddItem, + semanticsLabel: 'Add item to checklist', + themeData: Theme.of(context), + ), + ), + ), + ...itemIds.map(CheckboxItemWrapper.new), + ], + ); + } +} diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index f1325b890..657ce1a25 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -168,6 +168,7 @@ "settingsAdvancedTitle": "Advanced Settings", "settingsCategoriesDuplicateError": "Category exists already", "settingsCategoriesNameLabel": "Category name:", + "checklistAddItem": "Add a new item", "settingsCategoriesTitle": "Categories", "settingsConflictsResolutionTitle": "Sync Conflict Resolution", "settingsConflictsTitle": "Sync Conflicts", diff --git a/lib/widgetbook.dart b/lib/widgetbook.dart index 507219c88..d1731fb71 100644 --- a/lib/widgetbook.dart +++ b/lib/widgetbook.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:lotti/features/tasks/state/checklist_item_controller.dart'; -import 'package:lotti/features/tasks/ui/checkbox_widget.dart'; +import 'package:lotti/features/tasks/ui/checkbox_item_widget.dart'; +import 'package:lotti/features/tasks/ui/checkbox_items_list.dart'; import 'package:lotti/get_it.dart'; import 'package:lotti/services/db_notification.dart'; import 'package:lotti/widgetbook/mock_controllers.dart'; @@ -41,6 +43,9 @@ class WidgetbookApp extends StatelessWidget { ], appBuilder: (context, child) => MaterialApp( themeMode: ThemeMode.dark, + localizationsDelegates: const [ + AppLocalizations.delegate, + ], home: Scaffold( body: child, ),