Skip to content

Commit

Permalink
refactor(TagDialog): Redesign tag dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
tmaegel committed Dec 22, 2023
1 parent 2b47853 commit 79ec141
Show file tree
Hide file tree
Showing 17 changed files with 502 additions and 351 deletions.
56 changes: 54 additions & 2 deletions lib/common_widgets/contexts_dialog.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:ntodotxt/common_widgets/chip.dart';
import 'package:ntodotxt/common_widgets/tag_dialog.dart';
import 'package:ntodotxt/presentation/filter/states/filter_cubit.dart'
show FilterCubit;
import 'package:ntodotxt/presentation/todo/states/todo_cubit.dart';

class ContextListDialog extends StatefulWidget {
final FilterCubit cubit;
Expand Down Expand Up @@ -34,8 +36,8 @@ class _ContextListDialogState extends State<ContextListDialog> {

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

@override
Expand All @@ -44,7 +46,7 @@ class _ContextListDialogState extends State<ContextListDialog> {
title: const Text('Contexts'),
content: GenericChipGroup(
children: [
for (String item in widget.items)
for (String item in widget.items.toList()..sort())
GenericChoiceChip(
label: Text(item),
selected: selectedItems.contains(item),
Expand Down Expand Up @@ -76,3 +78,53 @@ class _ContextListDialogState extends State<ContextListDialog> {
);
}
}

class ContextTagDialog extends TagDialog {
const ContextTagDialog({
required super.cubit,
super.title = 'Contexts',
super.tagName = 'context',
super.availableTags,
super.key = const Key('addContextTagDialog'),
});

@override
RegExp get regex => RegExp(r'^\S+$');

static Future<void> dialog({
required BuildContext context,
required TodoCubit cubit,
required Set<String> availableTags,
}) async {
showModalBottomSheet<void>(
context: context,
isScrollControlled: true,
builder: (BuildContext context) => ContextTagDialog(
cubit: cubit,
availableTags: availableTags,
),
);
}

@override
void onSubmit(BuildContext context, Set<String> values) =>
cubit.updateContexts(values);

@override
State<ContextTagDialog> createState() => _ContextTagDialogState();
}

class _ContextTagDialogState extends TagDialogState<ContextTagDialog> {
@override
void initState() {
super.initState();
super.tags = {
...widget.availableTags.map(
(String t) => Tag(name: t, selected: false),
),
...widget.cubit.state.todo.contexts.map(
(String t) => Tag(name: t, selected: true),
),
};
}
}
1 change: 1 addition & 0 deletions lib/common_widgets/input_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class InputDialog extends StatelessWidget {
border: InputBorder.none,
enabledBorder: InputBorder.none,
focusedBorder: InputBorder.none,
focusedErrorBorder: InputBorder.none,
errorBorder: InputBorder.none,
disabledBorder: InputBorder.none,
),
Expand Down
53 changes: 53 additions & 0 deletions lib/common_widgets/key_values_dialog.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import 'package:flutter/material.dart';
import 'package:ntodotxt/common_widgets/tag_dialog.dart';
import 'package:ntodotxt/presentation/todo/states/todo_cubit.dart';

class KeyValueTagDialog extends TagDialog {
const KeyValueTagDialog({
required super.cubit,
super.title = 'Key Values',
super.tagName = 'key:value',
super.availableTags,
super.key = const Key('addKeyValueTagDialog'),
});

@override
RegExp get regex => RegExp(r'^([^\+\@].*[^:\s]):(.*[^:\s])$');

static Future<void> dialog({
required BuildContext context,
required TodoCubit cubit,
required Set<String> availableTags,
}) async {
showModalBottomSheet<void>(
context: context,
isScrollControlled: true,
builder: (BuildContext context) => KeyValueTagDialog(
cubit: cubit,
availableTags: availableTags,
),
);
}

@override
void onSubmit(BuildContext context, Set<String> values) =>
cubit.updateKeyValues(values);

@override
State<KeyValueTagDialog> createState() => _KeyValueTagDialogState();
}

class _KeyValueTagDialogState extends TagDialogState<KeyValueTagDialog> {
@override
void initState() {
super.initState();
super.tags = {
...widget.availableTags.map(
(String t) => Tag(name: t, selected: false),
),
...widget.cubit.state.todo.fmtKeyValues.map(
(String t) => Tag(name: t, selected: true),
),
};
}
}
2 changes: 1 addition & 1 deletion lib/common_widgets/priorities_dialog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ class _PriorityListDialogState extends State<PriorityListDialog> {

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

@override
Expand Down
56 changes: 54 additions & 2 deletions lib/common_widgets/projects_dialog.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:ntodotxt/common_widgets/chip.dart';
import 'package:ntodotxt/common_widgets/tag_dialog.dart';
import 'package:ntodotxt/presentation/filter/states/filter_cubit.dart'
show FilterCubit;
import 'package:ntodotxt/presentation/todo/states/todo_cubit.dart';

class ProjectListDialog extends StatefulWidget {
final FilterCubit cubit;
Expand Down Expand Up @@ -34,8 +36,8 @@ class _ProjectListDialogState extends State<ProjectListDialog> {

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

@override
Expand All @@ -44,7 +46,7 @@ class _ProjectListDialogState extends State<ProjectListDialog> {
title: const Text('Projects'),
content: GenericChipGroup(
children: [
for (String item in widget.items)
for (String item in widget.items.toList()..sort())
GenericChoiceChip(
label: Text(item),
selected: selectedItems.contains(item),
Expand Down Expand Up @@ -76,3 +78,53 @@ class _ProjectListDialogState extends State<ProjectListDialog> {
);
}
}

class ProjectTagDialog extends TagDialog {
const ProjectTagDialog({
required super.cubit,
super.title = 'Projects',
super.tagName = 'project',
super.availableTags,
super.key = const Key('addProjectTagDialog'),
});

@override
RegExp get regex => RegExp(r'^\S+$');

static Future<void> dialog({
required BuildContext context,
required TodoCubit cubit,
required Set<String> availableTags,
}) async {
showModalBottomSheet<void>(
context: context,
isScrollControlled: true,
builder: (BuildContext context) => ProjectTagDialog(
cubit: cubit,
availableTags: availableTags,
),
);
}

@override
void onSubmit(BuildContext context, Set<String> values) =>
cubit.updateProjects(values);

@override
State<ProjectTagDialog> createState() => _ProjectTagDialogState();
}

class _ProjectTagDialogState extends TagDialogState<ProjectTagDialog> {
@override
void initState() {
super.initState();
super.tags = {
...widget.availableTags.map(
(String t) => Tag(name: t, selected: false),
),
...widget.cubit.state.todo.projects.map(
(String t) => Tag(name: t, selected: true),
),
};
}
}
Loading

0 comments on commit 79ec141

Please sign in to comment.