Skip to content

Commit

Permalink
feat: checklist in expansion tile
Browse files Browse the repository at this point in the history
  • Loading branch information
matthiasn committed Jun 8, 2024
1 parent 45e7b87 commit e6b695d
Show file tree
Hide file tree
Showing 5 changed files with 82 additions and 54 deletions.
Original file line number Diff line number Diff line change
@@ -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);
Expand Down Expand Up @@ -56,54 +54,3 @@ class _CheckboxItemWidgetState extends State<CheckboxItemWidget> {
);
}
}

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<String> itemIds;

@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: itemIds.map(CheckboxItemWrapper.new).toList(),
);
}
}
38 changes: 38 additions & 0 deletions lib/features/tasks/ui/checkbox_item_wrapper.dart
Original file line number Diff line number Diff line change
@@ -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(),
);
}
}
37 changes: 37 additions & 0 deletions lib/features/tasks/ui/checkbox_items_list.dart
Original file line number Diff line number Diff line change
@@ -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<String> 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),
],
);
}
}
1 change: 1 addition & 0 deletions lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
7 changes: 6 additions & 1 deletion lib/widgetbook.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand Down Expand Up @@ -41,6 +43,9 @@ class WidgetbookApp extends StatelessWidget {
],
appBuilder: (context, child) => MaterialApp(
themeMode: ThemeMode.dark,
localizationsDelegates: const [
AppLocalizations.delegate,
],
home: Scaffold(
body: child,
),
Expand Down

0 comments on commit e6b695d

Please sign in to comment.