Skip to content

Commit

Permalink
test(Dialog): Add Dialog widget tests
Browse files Browse the repository at this point in the history
  • Loading branch information
tmaegel committed Dec 22, 2023
1 parent 08c8639 commit 2b47853
Show file tree
Hide file tree
Showing 9 changed files with 521 additions and 49 deletions.
24 changes: 19 additions & 5 deletions lib/common_widgets/app_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import 'package:ntodotxt/common_widgets/contexts_dialog.dart';
import 'package:ntodotxt/common_widgets/filter_dialog.dart';
import 'package:ntodotxt/common_widgets/group_by_dialog.dart';
import 'package:ntodotxt/common_widgets/order_dialog.dart';
import 'package:ntodotxt/common_widgets/priorities_dialog.dart';
import 'package:ntodotxt/common_widgets/projects_dialog.dart';
import 'package:ntodotxt/constants/app.dart' show maxScreenWidthCompact;
import 'package:ntodotxt/domain/todo/todo_model.dart' show Priority;
import 'package:ntodotxt/misc.dart' show CustomScrollBehavior, PlatformInfo;
import 'package:ntodotxt/presentation/filter/states/filter_cubit.dart';
import 'package:ntodotxt/presentation/filter/states/filter_state.dart';
Expand All @@ -25,9 +26,7 @@ class MainAppBar extends StatelessWidget implements PreferredSizeWidget {

@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
return AppBar(
titleSpacing: screenWidth < maxScreenWidthCompact ? 0.0 : null,
title: Text(title),
actions: toolbar == null
? null
Expand Down Expand Up @@ -114,11 +113,26 @@ class AppBarFilterList extends StatelessWidget {
},
),
const SizedBox(width: 4),
ActionChip(
padding: EdgeInsets.zero,
avatar: const Icon(Icons.flag_outlined),
labelPadding: const EdgeInsets.only(right: 8.0),
label:
Text('priorities (${state.filter.priorities.length})'),
onPressed: () async {
await PriorityListDialog.dialog(
context: context,
cubit: BlocProvider.of<FilterCubit>(context),
items: Priority.values.toSet(),
);
},
),
const SizedBox(width: 4),
ActionChip(
padding: EdgeInsets.zero,
avatar: const Icon(Icons.rocket_launch_outlined),
labelPadding: const EdgeInsets.only(right: 8.0),
label: const Text('projects'),
label: Text('projects (${state.filter.projects.length})'),
onPressed: () async {
await ProjectListDialog.dialog(
context: context,
Expand All @@ -132,7 +146,7 @@ class AppBarFilterList extends StatelessWidget {
padding: EdgeInsets.zero,
avatar: const Icon(Icons.join_inner),
labelPadding: const EdgeInsets.only(right: 8.0),
label: const Text('contexts'),
label: Text('contexts (${state.filter.contexts.length})'),
onPressed: () async {
await ContextListDialog.dialog(
context: context,
Expand Down
35 changes: 14 additions & 21 deletions lib/common_widgets/contexts_dialog.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:ntodotxt/common_widgets/chip.dart';
import 'package:ntodotxt/presentation/filter/states/filter_cubit.dart'
show FilterCubit;

Expand Down Expand Up @@ -40,32 +41,24 @@ class _ContextListDialogState extends State<ContextListDialog> {
@override
Widget build(BuildContext context) {
return AlertDialog(
title: const Center(
child: Text('Contexts'),
),
content: SizedBox(
width: double.maxFinite,
child: ListView.builder(
shrinkWrap: true,
itemCount: widget.items.length,
itemBuilder: (BuildContext context, int index) {
String context = widget.items.elementAt(index);
return CheckboxListTile(
controlAffinity: ListTileControlAffinity.leading,
title: Text(context),
value: selectedItems.contains(context),
onChanged: (bool? value) {
title: const Text('Contexts'),
content: GenericChipGroup(
children: [
for (String item in widget.items)
GenericChoiceChip(
label: Text(item),
selected: selectedItems.contains(item),
onSelected: (bool selected) {
setState(() {
if (value == true) {
selectedItems.add(context);
if (selected == true) {
selectedItems.add(item);
} else {
selectedItems.remove(context);
selectedItems.remove(item);
}
});
},
);
},
),
),
],
),
actions: <Widget>[
TextButton(
Expand Down
79 changes: 79 additions & 0 deletions lib/common_widgets/priorities_dialog.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import 'package:flutter/material.dart';
import 'package:ntodotxt/common_widgets/chip.dart';
import 'package:ntodotxt/domain/todo/todo_model.dart' show Priority;
import 'package:ntodotxt/presentation/filter/states/filter_cubit.dart'
show FilterCubit;

class PriorityListDialog extends StatefulWidget {
final FilterCubit cubit;
final Set<Priority> items;

const PriorityListDialog({
required this.cubit,
required this.items,
super.key,
});

static Future<String?> dialog({
required BuildContext context,
required FilterCubit cubit,
required Set<Priority> items,
}) async {
return await showDialog<String?>(
context: context,
builder: (BuildContext context) =>
PriorityListDialog(cubit: cubit, items: items),
);
}

@override
State<PriorityListDialog> createState() => _PriorityListDialogState();
}

class _PriorityListDialogState extends State<PriorityListDialog> {
Set<Priority> selectedItems = {};

@override
void initState() {
selectedItems = {...widget.cubit.state.filter.priorities};
super.initState();
}

@override
Widget build(BuildContext context) {
return AlertDialog(
title: const Text('Priorities'),
content: GenericChipGroup(
children: [
for (Priority item in widget.items)
GenericChoiceChip(
label: Text(item.name),
selected: selectedItems.contains(item),
onSelected: (bool selected) {
setState(() {
if (selected == true) {
selectedItems.add(item);
} else {
selectedItems.remove(item);
}
});
},
),
],
),
actions: <Widget>[
TextButton(
child: const Text('Cancel'),
onPressed: () => Navigator.pop(context),
),
TextButton(
child: const Text('Apply'),
onPressed: () {
widget.cubit.updatePriorities(selectedItems);
Navigator.pop(context);
},
),
],
);
}
}
35 changes: 14 additions & 21 deletions lib/common_widgets/projects_dialog.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:ntodotxt/common_widgets/chip.dart';
import 'package:ntodotxt/presentation/filter/states/filter_cubit.dart'
show FilterCubit;

Expand Down Expand Up @@ -40,32 +41,24 @@ class _ProjectListDialogState extends State<ProjectListDialog> {
@override
Widget build(BuildContext context) {
return AlertDialog(
title: const Center(
child: Text('Projects'),
),
content: SizedBox(
width: double.maxFinite,
child: ListView.builder(
shrinkWrap: true,
itemCount: widget.items.length,
itemBuilder: (BuildContext context, int index) {
String project = widget.items.elementAt(index);
return CheckboxListTile(
controlAffinity: ListTileControlAffinity.leading,
title: Text(project),
value: selectedItems.contains(project),
onChanged: (bool? value) {
title: const Text('Projects'),
content: GenericChipGroup(
children: [
for (String item in widget.items)
GenericChoiceChip(
label: Text(item),
selected: selectedItems.contains(item),
onSelected: (bool selected) {
setState(() {
if (value == true) {
selectedItems.add(project);
if (selected == true) {
selectedItems.add(item);
} else {
selectedItems.remove(project);
selectedItems.remove(item);
}
});
},
);
},
),
),
],
),
actions: <Widget>[
TextButton(
Expand Down
2 changes: 0 additions & 2 deletions lib/config/theme/theme.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ final ThemeData dark = CustomTheme.dark;
/// Customize versions of the theme data.
final ThemeData lightTheme = light.copyWith(
appBarTheme: light.appBarTheme.copyWith(
centerTitle: true,
backgroundColor: Colors.transparent,
),
snackBarTheme: light.snackBarTheme.copyWith(
Expand Down Expand Up @@ -71,7 +70,6 @@ final ThemeData lightTheme = light.copyWith(
);
final ThemeData darkTheme = dark.copyWith(
appBarTheme: dark.appBarTheme.copyWith(
centerTitle: true,
backgroundColor: Colors.transparent,
),
snackBarTheme: light.snackBarTheme.copyWith(
Expand Down
14 changes: 14 additions & 0 deletions lib/presentation/filter/states/filter_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,20 @@ class FilterCubit extends Cubit<FilterState> {
}
}

void updatePriorities(Set<Priority> priorities) {
try {
emit(
state.success(
filter: state.filter.copyWith(
priorities: {...priorities},
),
),
);
} on Exception catch (e) {
emit(state.error(message: e.toString()));
}
}

void addProject(String project) {
try {
emit(
Expand Down
Loading

0 comments on commit 2b47853

Please sign in to comment.