diff --git a/lib/drawer/filter_drawer.dart b/lib/drawer/filter_drawer.dart index 1f8bb5ad..45d21374 100644 --- a/lib/drawer/filter_drawer.dart +++ b/lib/drawer/filter_drawer.dart @@ -141,20 +141,14 @@ class _FilterDrawerState extends State { style: GoogleFonts.poppins( fontWeight: TaskWarriorFonts.bold, fontSize: TaskWarriorFonts.fontSizeMedium, - color: AppSettings.isDarkMode - ? TaskWarriorColors.white - : TaskWarriorColors.black, + color: AppSettings.isDarkMode ? TaskWarriorColors.white : TaskWarriorColors.black, ), ), TextSpan( - text: widget.filters.pendingFilter - ? 'pending' - : 'completed', + text: widget.filters.pendingFilter ? 'pending' : 'completed', style: GoogleFonts.poppins( fontSize: TaskWarriorFonts.fontSizeMedium, - color: AppSettings.isDarkMode - ? TaskWarriorColors.white - : TaskWarriorColors.black, + color: AppSettings.isDarkMode ? TaskWarriorColors.white : TaskWarriorColors.black, ), ), ], @@ -169,6 +163,36 @@ class _FilterDrawerState extends State { const Divider( color: Color.fromARGB(0, 48, 46, 46), ), + const Divider( + color: Color.fromARGB(0, 48, 46, 46), + ), + Container( + decoration: BoxDecoration( + color: tileColor, + borderRadius: BorderRadius.circular(2), + border: Border.all(color: TaskWarriorColors.borderColor), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: GestureDetector( + onTap: + widget.filters.toggleWaitingFilter, + child: Text( + widget.filters.waitingFilter ? 'Show waiting': + 'Hide waiting', + style: GoogleFonts.poppins( + color: (AppSettings.isDarkMode + ? TaskWarriorColors.kprimaryTextColor + : TaskWarriorColors.kLightSecondaryTextColor), + // + fontSize: TaskWarriorFonts.fontSizeMedium,), + ), + ), + ), + ), + const Divider( + color: Color.fromARGB(0, 48, 46, 46), + ), Container( key: projectsKey, width: MediaQuery.of(context).size.width * 1, @@ -280,30 +304,25 @@ class _FilterDrawerState extends State { 'Urgency', ]) ChoiceChip( - label: - (storageWidget.selectedSort.startsWith(sort)) - ? Text( - storageWidget.selectedSort, - ) - : Text(sort), + label: (storageWidget.selectedSort.startsWith(sort)) + ? Text( + storageWidget.selectedSort, + ) + : Text(sort), selected: false, onSelected: (_) { if (storageWidget.selectedSort == '$sort+') { storageWidget.selectSort('$sort-'); - } else if (storageWidget.selectedSort == - '$sort-') { + } else if (storageWidget.selectedSort == '$sort-') { storageWidget.selectSort(sort); } else { storageWidget.selectSort('$sort+'); } }, labelStyle: GoogleFonts.poppins( - color: AppSettings.isDarkMode - ? TaskWarriorColors.black - : TaskWarriorColors.white), + color: AppSettings.isDarkMode ? TaskWarriorColors.black : TaskWarriorColors.white), backgroundColor: AppSettings.isDarkMode - ? TaskWarriorColors - .kLightSecondaryBackgroundColor + ? TaskWarriorColors.kLightSecondaryBackgroundColor : TaskWarriorColors.ksecondaryBackgroundColor, ), ], @@ -321,11 +340,9 @@ class _FilterDrawerState extends State { : TaskWarriorColors.ksecondaryBackgroundColor), child: TextButton( onPressed: () { - if (storageWidget.selectedSort.endsWith('+') || - storageWidget.selectedSort.endsWith('-')) { + if (storageWidget.selectedSort.endsWith('+') || storageWidget.selectedSort.endsWith('-')) { storageWidget.selectSort( - storageWidget.selectedSort.substring(0, - storageWidget.selectedSort.length - 1)); + storageWidget.selectedSort.substring(0, storageWidget.selectedSort.length - 1)); } }, child: Text( diff --git a/lib/model/data.dart b/lib/model/data.dart index 5abdadea..3703ffa6 100644 --- a/lib/model/data.dart +++ b/lib/model/data.dart @@ -79,6 +79,13 @@ class Data { .toList(); } + List waitingData() { + var data = _allData().where((task) => task.status == 'waiting'); + return [ + for (var task in data) task.rebuild((b) => b..id = 0), + ]; + } + List allData() { var data = pendingData()..addAll(_completedData()); return data; diff --git a/lib/model/storage/storage_widget.dart b/lib/model/storage/storage_widget.dart index 0e80d7cd..4d900a61 100644 --- a/lib/model/storage/storage_widget.dart +++ b/lib/model/storage/storage_widget.dart @@ -56,6 +56,7 @@ class StorageWidget extends StatefulWidget { class _StorageWidgetState extends State { late Storage storage; late bool pendingFilter; + late bool waitingFilter; late String projectFilter; late bool tagUnion; late String selectedSort; @@ -89,6 +90,7 @@ class _StorageWidgetState extends State { void _profileSet() { pendingFilter = Query(storage.tabs.tab()).getPendingFilter(); + waitingFilter = Query(storage.tabs.tab()).getWaitingFilter(); projectFilter = Query(storage.tabs.tab()).projectFilter(); tagUnion = Query(storage.tabs.tab()).tagUnion(); selectedSort = Query(storage.tabs.tab()).getSelectedSort(); @@ -111,6 +113,16 @@ class _StorageWidgetState extends State { queriedTasks = storage.data.completedData(); } + if (waitingFilter) { + var currentTime = DateTime.now(); + queriedTasks = queriedTasks + .where((task) => + task.wait == null || + task.wait!.isBefore(currentTime) || + task.wait!.isAtSameMomentAs(currentTime)) + .toList(); + } + if (projectFilter.isNotEmpty) { queriedTasks = queriedTasks.where((task) { if (task.project == null) { @@ -201,6 +213,13 @@ class _StorageWidgetState extends State { setState(() {}); } + void toggleWaitingFilter() { + Query(storage.tabs.tab()).toggleWaitingFilter(); + waitingFilter = Query(storage.tabs.tab()).getWaitingFilter(); + _refreshTasks(); + setState(() {}); + } + void toggleProjectFilter(String project) { Query(storage.tabs.tab()).toggleProjectFilter(project); projectFilter = Query(storage.tabs.tab()).projectFilter(); @@ -365,6 +384,7 @@ class _StorageWidgetState extends State { void setInitialTabIndex(int index) { storage.tabs.setInitialTabIndex(index); pendingFilter = Query(storage.tabs.tab()).getPendingFilter(); + waitingFilter = Query(storage.tabs.tab()).getWaitingFilter(); selectedSort = Query(storage.tabs.tab()).getSelectedSort(); selectedTags = Query(storage.tabs.tab()).getSelectedTags(); projectFilter = Query(storage.tabs.tab()).projectFilter(); @@ -388,6 +408,7 @@ class _StorageWidgetState extends State { void removeTab(int index) { storage.tabs.removeTab(index); pendingFilter = Query(storage.tabs.tab()).getPendingFilter(); + waitingFilter = Query(storage.tabs.tab()).getWaitingFilter(); selectedSort = Query(storage.tabs.tab()).getSelectedSort(); selectedTags = Query(storage.tabs.tab()).getSelectedTags(); _refreshTasks(); @@ -414,6 +435,7 @@ class _StorageWidgetState extends State { pendingTags: pendingTags, projects: projects, pendingFilter: pendingFilter, + waitingFilter: waitingFilter, projectFilter: projectFilter, tagUnion: tagUnion, selectedSort: selectedSort, @@ -421,6 +443,7 @@ class _StorageWidgetState extends State { mergeTask: mergeTask, synchronize: synchronize, togglePendingFilter: togglePendingFilter, + toggleWaitingFilter: toggleWaitingFilter, toggleProjectFilter: toggleProjectFilter, toggleTagUnion: toggleTagUnion, selectSort: selectSort, @@ -454,6 +477,7 @@ class InheritedStorage extends InheritedModel { required this.pendingTags, required this.projects, required this.pendingFilter, + required this.waitingFilter, required this.projectFilter, required this.tagUnion, required this.selectedSort, @@ -462,6 +486,7 @@ class InheritedStorage extends InheritedModel { required this.mergeTask, required this.synchronize, required this.togglePendingFilter, + required this.toggleWaitingFilter, required this.toggleProjectFilter, required this.toggleTagUnion, required this.toggleTagFilter, @@ -488,6 +513,7 @@ class InheritedStorage extends InheritedModel { final Map pendingTags; final Map projects; final bool pendingFilter; + final bool waitingFilter; final String projectFilter; final bool tagUnion; final String selectedSort; @@ -496,6 +522,7 @@ class InheritedStorage extends InheritedModel { final void Function(Task) mergeTask; final void Function(BuildContext, bool) synchronize; final void Function() togglePendingFilter; + final void Function() toggleWaitingFilter; final void Function(String) toggleProjectFilter; final void Function() toggleTagUnion; final void Function(String) selectSort; diff --git a/lib/services/task_details.dart b/lib/services/task_details.dart index 3f764fe6..99ba07f5 100644 --- a/lib/services/task_details.dart +++ b/lib/services/task_details.dart @@ -85,6 +85,7 @@ class _DetailRouteState extends State { } // ignore: use_build_context_synchronously return showDialog( + // ignore: use_build_context_synchronously context: context, builder: (context) { return Utils.showAlertDialog( diff --git a/lib/services/task_list_tem.dart b/lib/services/task_list_tem.dart index 199da67b..97ceade6 100644 --- a/lib/services/task_list_tem.dart +++ b/lib/services/task_list_tem.dart @@ -8,11 +8,11 @@ import 'package:taskwarrior/model/json.dart'; import 'package:taskwarrior/widgets/taskw.dart'; class TaskListItem extends StatefulWidget { - const TaskListItem(this.task, - {this.pendingFilter = false, super.key, required this.darkmode}); + const TaskListItem(this.task, {this.pendingFilter = false,this.waitingFilter = false, super.key, required this.darkmode}); final Task task; final bool pendingFilter; + final bool waitingFilter; final bool darkmode; @override @@ -52,9 +52,8 @@ class _TaskListItemState extends State { content: Text( 'Task Updated', style: TextStyle( - color: AppSettings.isDarkMode - ? TaskWarriorColors.kprimaryTextColor - : TaskWarriorColors.kLightPrimaryTextColor, + color: + AppSettings.isDarkMode ? TaskWarriorColors.kprimaryTextColor : TaskWarriorColors.kLightPrimaryTextColor, ), ), backgroundColor: AppSettings.isDarkMode @@ -67,9 +66,7 @@ class _TaskListItemState extends State { Widget build(BuildContext context) { MaterialColor colours = Colors.grey; var colour = widget.darkmode ? Colors.white : Colors.black; - var dimColor = widget.darkmode - ? const Color.fromARGB(137, 248, 248, 248) - : const Color.fromARGB(136, 17, 17, 17); + var dimColor = widget.darkmode ? const Color.fromARGB(137, 248, 248, 248) : const Color.fromARGB(136, 17, 17, 17); if (widget.task.priority == 'H') { colours = Colors.red; @@ -84,11 +81,8 @@ class _TaskListItemState extends State { return Container( decoration: BoxDecoration( border: Border.all( - color: (widget.task.due != null && - isDueWithinOneDay(widget.task.due!) && - useDelayTask) - ? Colors - .red // Set border color to red if due within 1 day and useDelayTask is true + color: (widget.task.due != null && isDueWithinOneDay(widget.task.due!) && useDelayTask) + ? Colors.red // Set border color to red if due within 1 day and useDelayTask is true : dimColor, // Set default border color ), borderRadius: BorderRadius.circular(8.0), @@ -118,9 +112,7 @@ class _TaskListItemState extends State { ], ), Text( - (widget.task.annotations != null) - ? ' [${widget.task.annotations!.length}]' - : '', + (widget.task.annotations != null) ? ' [${widget.task.annotations!.length}]' : '', style: GoogleFonts.poppins( color: colour, ), diff --git a/lib/views/home/home.dart b/lib/views/home/home.dart index 7c77f9fb..bf478b5d 100644 --- a/lib/views/home/home.dart +++ b/lib/views/home/home.dart @@ -30,7 +30,9 @@ import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; class Filters { const Filters({ required this.pendingFilter, + required this.waitingFilter, required this.togglePendingFilter, + required this.toggleWaitingFilter, required this.tagFilters, required this.projects, required this.projectFilter, @@ -38,7 +40,9 @@ class Filters { }); final bool pendingFilter; + final bool waitingFilter; final void Function() togglePendingFilter; + final void Function() toggleWaitingFilter; final TagFilters tagFilters; final dynamic projects; final String projectFilter; @@ -189,6 +193,7 @@ class _HomePageState extends State { var taskData = storageWidget.tasks; var pendingFilter = storageWidget.pendingFilter; + var waitingFilter = storageWidget.waitingFilter; var pendingTags = storageWidget.pendingTags; var selectedTagsMap = { @@ -215,7 +220,9 @@ class _HomePageState extends State { ); var filters = Filters( pendingFilter: pendingFilter, + waitingFilter: waitingFilter, togglePendingFilter: storageWidget.togglePendingFilter, + toggleWaitingFilter: storageWidget.toggleWaitingFilter, projects: storageWidget.projects, projectFilter: storageWidget.projectFilter, toggleProjectFilter: storageWidget.toggleProjectFilter, @@ -378,6 +385,7 @@ class _HomePageState extends State { // darkmode: AppSettings.isDarkMode, taskData: taskData, pendingFilter: pendingFilter, + waitingFilter: waitingFilter, searchVisible: storageWidget.searchVisible), ), ), diff --git a/lib/widgets/buildTasks.dart b/lib/widgets/buildTasks.dart index 18ec270d..efed081e 100644 --- a/lib/widgets/buildTasks.dart +++ b/lib/widgets/buildTasks.dart @@ -23,10 +23,12 @@ class TasksBuilder extends StatefulWidget { {super.key, required this.taskData, required this.pendingFilter, + required this.waitingFilter, required this.searchVisible}); final List taskData; final bool pendingFilter; + final bool waitingFilter; final bool searchVisible; @override diff --git a/lib/widgets/taskfunctions/query.dart b/lib/widgets/taskfunctions/query.dart index e3457473..3040830c 100644 --- a/lib/widgets/taskfunctions/query.dart +++ b/lib/widgets/taskfunctions/query.dart @@ -8,6 +8,7 @@ class Query { File get _selectedSort => File('${_queryStorage.path}/selectedSort'); File get _pendingFilter => File('${_queryStorage.path}/pendingFilter'); + File get _waitingFilter => File('${_queryStorage.path}/waitingFilter'); File get _projectFilter => File('${_queryStorage.path}/projectFilter'); File get _tagUnion => File('${_queryStorage.path}/tagUnion'); File get _selectedTags => File('${_queryStorage.path}/selectedTags'); @@ -43,6 +44,21 @@ class Query { return json.decode(_pendingFilter.readAsStringSync()); } + void toggleWaitingFilter() { + _waitingFilter.writeAsStringSync( + json.encode(!getWaitingFilter()), + ); + } + + bool getWaitingFilter() { + if (!_waitingFilter.existsSync()) { + _waitingFilter + ..createSync(recursive: true) + ..writeAsStringSync('true'); + } + return json.decode(_waitingFilter.readAsStringSync()); + } + void toggleProjectFilter(String project) { _projectFilter.writeAsStringSync( (project == projectFilter()) ? '' : project, @@ -91,8 +107,6 @@ class Query { ..createSync(recursive: true) ..writeAsStringSync(json.encode([])); } - return (json.decode(_selectedTags.readAsStringSync()) as List) - .cast() - .toSet(); + return (json.decode(_selectedTags.readAsStringSync()) as List).cast().toSet(); } }