Skip to content

Commit a01e0bb

Browse files
feat: highlight overdue tasks (#476)
1 parent 00d00c7 commit a01e0bb

14 files changed

+175
-33
lines changed

lib/app/modules/home/views/tas_list_item.dart

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,13 @@ class TaskListItem extends StatelessWidget {
5050
bool isDueWithinOneDay(DateTime dueDate) {
5151
DateTime now = DateTime.now();
5252
Duration difference = dueDate.difference(now);
53-
return difference.inDays <= 1 && difference.inDays >= 0;
53+
return difference.inDays < 1 && difference.inMicroseconds > 0;
54+
}
55+
56+
bool isOverDue(DateTime dueDate) {
57+
DateTime now = DateTime.now();
58+
Duration difference = dueDate.difference(now);
59+
return difference.inMicroseconds < 0;
5460
}
5561

5662
MaterialColor colours = Colors.grey;
@@ -77,6 +83,11 @@ class TaskListItem extends StatelessWidget {
7783
: dimColor, // Set default border color
7884
),
7985
borderRadius: BorderRadius.circular(8.0),
86+
color: (task.due != null && isOverDue(task.due!) && useDelayTask)
87+
? Colors.red.withAlpha(50)
88+
: AppSettings.isDarkMode
89+
? TaskWarriorColors.ksecondaryBackgroundColor
90+
: TaskWarriorColors.kLightSecondaryBackgroundColor,
8091
),
8192
child: ListTile(
8293
title: Row(

lib/app/utils/language/bengali_sentences.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,10 @@ class BengaliSentences extends Sentences {
5252
String get settingsPageEnableSyncOnTaskCreateDescription =>
5353
'নতুন টাস্ক তৈরি করার সময় স্বয়ংক্রিয় সিঙ্কিং সক্ষম করুন';
5454
@override
55-
String get settingsPageHighlightTaskTitle =>
56-
'শুধু 1 দিন বাকি থাকলে টাস্ক হাইলাইট করুন';
55+
String get settingsPageHighlightTaskTitle => 'জরুরি টাস্ক হাইলাইট করুন';
5756
@override
5857
String get settingsPageHighlightTaskDescription =>
59-
'শুধু 1 দিন বাকি থাকলে টাস্ক হাইলাইট করুন';
58+
'1 দিনের মধ্যে বা অতিক্রান্ত সময়ের টাস্ক হাইলাইট করুন';
6059
@override
6160
String get settingsPageEnable24hrFormatTitle =>
6261
'24 ঘণ্টার ফর্ম্যাট সক্রিয় করুন';

lib/app/utils/language/english_sentences.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ class EnglishSentences extends Sentences {
5353
String get settingsPageEnableSyncOnTaskCreateDescription =>
5454
'Enable automatic syncing when creating a new task';
5555
@override
56-
String get settingsPageHighlightTaskTitle => 'Highlight the task';
56+
String get settingsPageHighlightTaskTitle => 'Highlight urgent tasks';
5757
@override
5858
String get settingsPageHighlightTaskDescription =>
59-
'Make the border of task if only 1 day left';
59+
'Highlight tasks due within 1 day or already overdue';
6060
@override
6161
String get settingsPageEnable24hrFormatTitle => 'Enable 24 hr format';
6262
@override

lib/app/utils/language/french_sentences.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,10 @@ class FrenchSentences extends Sentences {
5252
String get settingsPageEnableSyncOnTaskCreateDescription =>
5353
'Activer la synchronisation automatique lors de la création de nouvelles tâches';
5454
@override
55-
String get settingsPageHighlightTaskTitle =>
56-
'Surbrillance des tâches avec 1 jour restant';
55+
String get settingsPageHighlightTaskTitle => 'Surligner les tâches urgentes';
5756
@override
5857
String get settingsPageHighlightTaskDescription =>
59-
'Surbrillance des tâches avec 1 jour restant';
58+
'Surligner les tâches dues dans 1 jour ou en retard';
6059
@override
6160
String get settingsPageEnable24hrFormatTitle => 'Activer le format 24 heures';
6261
@override

lib/app/utils/language/hindi_sentences.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,10 @@ class HindiSentences extends Sentences {
5252
String get settingsPageEnableSyncOnTaskCreateDescription =>
5353
'नई टास्क बनाते समय स्वचालित सिंकिंग सक्षम करें';
5454
@override
55-
String get settingsPageHighlightTaskTitle =>
56-
'केवल 1 दिन शेष होने पर कार्य की सीमा बनाएं';
55+
String get settingsPageHighlightTaskTitle => 'तत्काल कार्यों को हाइलाइट करें';
5756
@override
5857
String get settingsPageHighlightTaskDescription =>
59-
'केवल 1 दिन शेष होने पर कार्य की सीमा बनाएं';
58+
'1 दिन के भीतर देय या अतिदेय कार्यों को हाइलाइट करें';
6059
@override
6160
String get settingsPageEnable24hrFormatTitle =>
6261
'24 घंटे का प्रारूप सक्षम करें';

lib/app/utils/language/marathi_sentences.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ class MarathiSentences extends Sentences {
5353
'नवीन कार्य तयार करताना स्वयंसिंकिंग सक्षम करा';
5454
@override
5555
String get settingsPageHighlightTaskTitle =>
56-
'फक्त 1 दिवस शेष असताना कार्याची सीमा बनवा';
56+
'तातडीच्या कार्यांना हायलाईट करा';
5757
@override
5858
String get settingsPageHighlightTaskDescription =>
59-
'फक्त 1 दिवस शेष असताना कार्याची सीमा बनवा';
59+
'1 दिवसाच्या आत देय किंवा मुदत संपलेल्या कार्यांना हायलाईट करा';
6060
@override
6161
String get settingsPageEnable24hrFormatTitle => '24 तासाचा स्वरूप सक्षम करा';
6262
@override

lib/app/utils/language/spanish_sentences.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,10 @@ class SpanishSentences extends Sentences {
5353
String get settingsPageEnableSyncOnTaskCreateDescription =>
5454
'Habilitar sincronización automática al crear nuevas tareas';
5555
@override
56-
String get settingsPageHighlightTaskTitle =>
57-
'Resaltar tareas con 1 día restante';
56+
String get settingsPageHighlightTaskTitle => 'Resaltar tareas urgentes';
5857
@override
5958
String get settingsPageHighlightTaskDescription =>
60-
'Resaltar tareas con 1 día restante';
59+
'Resaltar tareas que vencen en 1 día o están vencidas';
6160
@override
6261
String get settingsPageEnable24hrFormatTitle =>
6362
'Habilitar formato de 24 horas';
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:mockito/mockito.dart';
4+
import 'package:taskwarrior/app/models/json/task.dart';
5+
import 'package:taskwarrior/app/modules/home/views/tas_list_item.dart';
6+
import 'package:taskwarrior/app/utils/language/supported_language.dart';
7+
import 'package:taskwarrior/app/utils/taskfunctions/modify.dart';
8+
9+
class MockModify extends Mock implements Modify {}
10+
11+
void main() {
12+
group('TaskListItem', () {
13+
late Task normalTask;
14+
late Task dueSoonTask;
15+
late Task overdueTask;
16+
late MockModify mockModify;
17+
18+
setUp(() {
19+
mockModify = MockModify();
20+
21+
normalTask = Task((b) => b
22+
..id = 1
23+
..uuid = 'uuid1'
24+
..description = 'Task without urgency'
25+
..status = 'pending'
26+
..entry = DateTime.now()
27+
..due = DateTime.now().add(const Duration(days: 5)));
28+
29+
dueSoonTask = Task((b) => b
30+
..id = 2
31+
..uuid = 'uuid2'
32+
..description = 'Task due soon'
33+
..status = 'pending'
34+
..entry = DateTime.now()
35+
..due = DateTime.now().add(const Duration(hours: 23)));
36+
37+
overdueTask = Task((b) => b
38+
..id = 3
39+
..uuid = 'uuid3'
40+
..description = 'Overdue task'
41+
..status = 'pending'
42+
..entry = DateTime.now()
43+
..due = DateTime.now().subtract(const Duration(days: 1)));
44+
});
45+
46+
testWidgets('renders normal task without highlight',
47+
(WidgetTester tester) async {
48+
await tester.pumpWidget(MaterialApp(
49+
home: Scaffold(
50+
body: TaskListItem(
51+
normalTask,
52+
darkmode: false,
53+
useDelayTask: true,
54+
modify: mockModify,
55+
selectedLanguage: SupportedLanguage.english,
56+
),
57+
),
58+
));
59+
60+
expect(find.text('1. Task without urgency'), findsOneWidget);
61+
62+
final containerFinder = find.byType(Container).first;
63+
final Container container = tester.widget(containerFinder);
64+
final BoxDecoration decoration = container.decoration as BoxDecoration;
65+
expect(decoration.border!.top.color, isNot(Colors.red));
66+
expect((decoration.color as Color).alpha, isNot(50));
67+
});
68+
69+
testWidgets('renders due soon task with red border',
70+
(WidgetTester tester) async {
71+
await tester.pumpWidget(MaterialApp(
72+
home: Scaffold(
73+
body: TaskListItem(
74+
dueSoonTask,
75+
darkmode: false,
76+
useDelayTask: true,
77+
modify: mockModify,
78+
selectedLanguage: SupportedLanguage.english,
79+
),
80+
),
81+
));
82+
83+
expect(find.text('2. Task due soon'), findsOneWidget);
84+
85+
final containerFinder = find.byType(Container).first;
86+
final Container container = tester.widget(containerFinder);
87+
final BoxDecoration decoration = container.decoration as BoxDecoration;
88+
expect(decoration.border!.top.color, Colors.red);
89+
});
90+
91+
testWidgets('renders overdue task with red background',
92+
(WidgetTester tester) async {
93+
await tester.pumpWidget(MaterialApp(
94+
home: Scaffold(
95+
body: TaskListItem(
96+
overdueTask,
97+
darkmode: false,
98+
useDelayTask: true,
99+
modify: mockModify,
100+
selectedLanguage: SupportedLanguage.english,
101+
),
102+
),
103+
));
104+
105+
expect(find.text('3. Overdue task'), findsOneWidget);
106+
107+
final containerFinder = find.byType(Container).first;
108+
final Container container = tester.widget(containerFinder);
109+
final BoxDecoration decoration = container.decoration as BoxDecoration;
110+
expect((decoration.color as Color).red, Colors.red.red);
111+
expect((decoration.color as Color).alpha, 50);
112+
});
113+
114+
testWidgets('does not highlight tasks when useDelayTask is false',
115+
(WidgetTester tester) async {
116+
await tester.pumpWidget(MaterialApp(
117+
home: Scaffold(
118+
body: TaskListItem(
119+
overdueTask,
120+
darkmode: false,
121+
useDelayTask: false,
122+
modify: mockModify,
123+
selectedLanguage: SupportedLanguage.english,
124+
),
125+
),
126+
));
127+
128+
expect(find.text('3. Overdue task'), findsOneWidget);
129+
130+
final containerFinder = find.byType(Container).first;
131+
final Container container = tester.widget(containerFinder);
132+
final BoxDecoration decoration = container.decoration as BoxDecoration;
133+
expect(decoration.border!.top.color, isNot(Colors.red));
134+
expect((decoration.color as Color).alpha, isNot(50));
135+
});
136+
});
137+
}

test/utils/language/bengali_sentences_test.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,9 @@ void main() {
3333
'নতুন টাস্ক তৈরি করার সময় স্বয়ংক্রিয় সিঙ্কিং সক্ষম করুন');
3434
expect(bengali.settingsPageEnableSyncOnTaskCreateDescription,
3535
'নতুন টাস্ক তৈরি করার সময় স্বয়ংক্রিয় সিঙ্কিং সক্ষম করুন');
36-
expect(bengali.settingsPageHighlightTaskTitle,
37-
'শুধু 1 দিন বাকি থাকলে টাস্ক হাইলাইট করুন');
36+
expect(bengali.settingsPageHighlightTaskTitle, 'জরুরি টাস্ক হাইলাইট করুন');
3837
expect(bengali.settingsPageHighlightTaskDescription,
39-
'শুধু 1 দিন বাকি থাকলে টাস্ক হাইলাইট করুন');
38+
'1 দিনের মধ্যে বা অতিক্রান্ত সময়ের টাস্ক হাইলাইট করুন');
4039
expect(bengali.settingsPageEnable24hrFormatTitle,
4140
'24 ঘণ্টার ফর্ম্যাট সক্রিয় করুন');
4241
expect(bengali.settingsPageEnable24hrFormatDescription,

test/utils/language/english_sentences_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ void main() {
3333
english.settingsPageEnableSyncOnTaskCreateTitle, 'Sync on task create');
3434
expect(english.settingsPageEnableSyncOnTaskCreateDescription,
3535
'Enable automatic syncing when creating a new task');
36-
expect(english.settingsPageHighlightTaskTitle, 'Highlight the task');
36+
expect(english.settingsPageHighlightTaskTitle, 'Highlight urgent tasks');
3737
expect(english.settingsPageHighlightTaskDescription,
38-
'Make the border of task if only 1 day left');
38+
'Highlight tasks due within 1 day or already overdue');
3939
expect(english.settingsPageEnable24hrFormatTitle, 'Enable 24 hr format');
4040
expect(english.settingsPageEnable24hrFormatDescription,
4141
'Switch right to enable 24 hr format');

test/utils/language/french_sentences_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ void main() {
3333
'Activer la synchronisation automatique lors de la création de nouvelles tâches');
3434
expect(french.settingsPageEnableSyncOnTaskCreateDescription,
3535
'Activer la synchronisation automatique lors de la création de nouvelles tâches');
36-
expect(french.settingsPageHighlightTaskTitle,
37-
'Surbrillance des tâches avec 1 jour restant');
36+
expect(
37+
french.settingsPageHighlightTaskTitle, 'Surligner les tâches urgentes');
3838
expect(french.settingsPageHighlightTaskDescription,
39-
'Surbrillance des tâches avec 1 jour restant');
39+
'Surligner les tâches dues dans 1 jour ou en retard');
4040
expect(french.settingsPageEnable24hrFormatTitle,
4141
'Activer le format 24 heures');
4242
expect(french.settingsPageEnable24hrFormatDescription,

test/utils/language/hindi_sentences_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ void main() {
3333
'नई टास्क बनाते समय स्वचालित सिंकिंग सक्षम करें');
3434
expect(hindi.settingsPageEnableSyncOnTaskCreateDescription,
3535
'नई टास्क बनाते समय स्वचालित सिंकिंग सक्षम करें');
36-
expect(hindi.settingsPageHighlightTaskTitle,
37-
'केवल 1 दिन शेष होने पर कार्य की सीमा बनाएं');
36+
expect(
37+
hindi.settingsPageHighlightTaskTitle, 'तत्काल कार्यों को हाइलाइट करें');
3838
expect(hindi.settingsPageHighlightTaskDescription,
39-
'केवल 1 दिन शेष होने पर कार्य की सीमा बनाएं');
39+
'1 दिन के भीतर देय या अतिदेय कार्यों को हाइलाइट करें');
4040
expect(hindi.settingsPageEnable24hrFormatTitle,
4141
'24 घंटे का प्रारूप सक्षम करें');
4242
expect(hindi.settingsPageEnable24hrFormatDescription,

test/utils/language/marathi_sentences_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ void main() {
3333
expect(marathi.settingsPageEnableSyncOnTaskCreateDescription,
3434
'नवीन कार्य तयार करताना स्वयंसिंकिंग सक्षम करा');
3535
expect(marathi.settingsPageHighlightTaskTitle,
36-
'फक्त 1 दिवस शेष असताना कार्याची सीमा बनवा');
36+
'तातडीच्या कार्यांना हायलाईट करा');
3737
expect(marathi.settingsPageHighlightTaskDescription,
38-
'फक्त 1 दिवस शेष असताना कार्याची सीमा बनवा');
38+
'1 दिवसाच्या आत देय किंवा मुदत संपलेल्या कार्यांना हायलाईट करा');
3939
expect(marathi.settingsPageEnable24hrFormatTitle,
4040
'24 तासाचा स्वरूप सक्षम करा');
4141
expect(marathi.settingsPageEnable24hrFormatDescription,

test/utils/language/spanish_sentences_test.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,9 @@ void main() {
3535
'Habilitar sincronización automática al crear nuevas tareas');
3636
expect(spanish.settingsPageEnableSyncOnTaskCreateDescription,
3737
'Habilitar sincronización automática al crear nuevas tareas');
38-
expect(spanish.settingsPageHighlightTaskTitle,
39-
'Resaltar tareas con 1 día restante');
38+
expect(spanish.settingsPageHighlightTaskTitle, 'Resaltar tareas urgentes');
4039
expect(spanish.settingsPageHighlightTaskDescription,
41-
'Resaltar tareas con 1 día restante');
40+
'Resaltar tareas que vencen en 1 día o están vencidas');
4241
expect(spanish.settingsPageEnable24hrFormatTitle,
4342
'Habilitar formato de 24 horas');
4443
expect(spanish.settingsPageEnable24hrFormatDescription,

0 commit comments

Comments
 (0)