Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions lib/app/models/filters.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import 'package:taskwarrior/app/services/tag_filter.dart';

class Filters {
const Filters({
required this.pendingFilter,
required this.waitingFilter,
required this.completedFilter, // NEW
required this.deletedFilter, // NEW
required this.togglePendingFilter,
required this.toggleWaitingFilter,
required this.toggleCompletedFilter, // NEW
required this.toggleDeletedFilter, // NEW
required this.tagFilters,
required this.projects,
required this.projectFilter,
Expand All @@ -14,8 +16,12 @@ class Filters {

final bool pendingFilter;
final bool waitingFilter;
final bool completedFilter; // NEW
final bool deletedFilter; // NEW
final void Function() togglePendingFilter;
final void Function() toggleWaitingFilter;
final void Function() toggleCompletedFilter; // NEW
final void Function() toggleDeletedFilter; // NEW
final TagFilters tagFilters;
final dynamic projects;
final String projectFilter;
Expand Down
52 changes: 49 additions & 3 deletions lib/app/modules/home/controllers/home_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ class HomeController extends GetxController {
final RxBool pendingFilter = false.obs;
final RxBool waitingFilter = false.obs;
final RxString projectFilter = ''.obs;
final RxBool completedFilter = false.obs;
final RxBool deletedFilter = false.obs;
final RxBool tagUnion = false.obs;
final RxString selectedSort = ''.obs;
final RxSet<String> selectedTags = <String>{}.obs;
Expand Down Expand Up @@ -101,6 +103,8 @@ class HomeController extends GetxController {
everAll([
pendingFilter,
waitingFilter,
completedFilter,
deletedFilter,
projectFilter,
tagUnion,
selectedSort,
Expand Down Expand Up @@ -237,15 +241,35 @@ class HomeController extends GetxController {
}

void _refreshTasks() {
if (pendingFilter.value) {

if (deletedFilter.value) {
// Show ONLY deleted tasks
queriedTasks.value = storage.data
.completedData()
.where((task) => task.status == 'deleted')
.toList();
}
else if (completedFilter.value) {
// Show completed tasks (EXCLUDE deleted)
queriedTasks.value = storage.data
.completedData()
.where((task) => task.status == 'completed')
.toList();
}
else if (pendingFilter.value) {
// Show pending tasks (default behaviour)
queriedTasks.value = storage.data
.pendingData()
.where((task) => task.status == 'pending')
.toList();
} else {
queriedTasks.value = storage.data.completedData();
}
else {
// Fallback: pending tasks
queriedTasks.value = storage.data.pendingData();
}


// Rest of the method stays the same...
if (waitingFilter.value) {
var currentTime = DateTime.now();
queriedTasks.value = queriedTasks
Expand Down Expand Up @@ -347,6 +371,22 @@ class HomeController extends GetxController {
_refreshTasks();
}

void toggleCompletedFilter() {
completedFilter.toggle();
if (completedFilter.value) {
deletedFilter.value = false;
}
_refreshTasks();
}

void toggleDeletedFilter() {
deletedFilter.toggle();
if (deletedFilter.value) {
completedFilter.value = false;
}
_refreshTasks();
}

void toggleProjectFilter(String project) {
Query(storage.tabs.tab()).toggleProjectFilter(project);
projectFilter.value = Query(storage.tabs.tab()).projectFilter();
Expand Down Expand Up @@ -613,11 +653,17 @@ class HomeController extends GetxController {
tags: tags,
toggleTagFilter: toggleTagFilter,
);

// REPLACE this entire Filters() instantiation:
var filters = Filters(
pendingFilter: pendingFilter.value,
waitingFilter: waitingFilter.value,
completedFilter: completedFilter.value, // NEW - Add this line
deletedFilter: deletedFilter.value, // NEW - Add this line
togglePendingFilter: togglePendingFilter,
toggleWaitingFilter: toggleWaitingFilter,
toggleCompletedFilter: toggleCompletedFilter, // NEW - Add this line
toggleDeletedFilter: toggleDeletedFilter, // NEW - Add this line
projects: projects,
projectFilter: projectFilter.value,
toggleProjectFilter: toggleProjectFilter,
Expand Down
66 changes: 35 additions & 31 deletions lib/app/modules/home/views/filter_drawer_home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -97,17 +97,20 @@ class FilterDrawer extends StatelessWidget {
color: tColors.primaryTextColor,
)),
TextSpan(
text: filters.pendingFilter
? SentenceManager(
currentLanguage: homeController
.selectedLanguage.value)
.sentences
.filterDrawerPending
: SentenceManager(
currentLanguage: homeController
.selectedLanguage.value)
.sentences
.filterDrawerCompleted,
text: filters.deletedFilter
? 'Deleted'
: filters.completedFilter
? SentenceManager(
currentLanguage:
homeController.selectedLanguage.value)
.sentences
.filterDrawerCompleted
: SentenceManager(
currentLanguage:
homeController.selectedLanguage.value)
.sentences
.filterDrawerPending,

style: TextStyle(
fontFamily: FontFamily.poppins,
fontSize: TaskWarriorFonts.fontSizeMedium,
Expand All @@ -116,7 +119,16 @@ class FilterDrawer extends StatelessWidget {
],
),
),
onTap: filters.togglePendingFilter,
onTap: () {
if (filters.deletedFilter) {
filters.toggleDeletedFilter();
} else if (filters.completedFilter) {
filters.toggleCompletedFilter();
} else {
filters.togglePendingFilter();
}
},

textColor: tColors.primaryTextColor,
),
),
Expand All @@ -137,31 +149,23 @@ class FilterDrawer extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
!filters.waitingFilter
? SentenceManager(
currentLanguage: homeController
.selectedLanguage.value)
.sentences
.filterDrawerShowWaiting
: SentenceManager(
currentLanguage: homeController
.selectedLanguage.value)
.sentences
.filterDrawerHideWaiting,
style: TextStyle(
fontFamily: FontFamily.poppins,
fontSize: TaskWarriorFonts.fontSizeMedium,
color: tColors.primaryTextColor,
)),
'Show Deleted',
style: TextStyle(
fontFamily: FontFamily.poppins,
fontSize: TaskWarriorFonts.fontSizeMedium,
color: tColors.primaryTextColor,
),
),
Switch(
value: filters.waitingFilter,
onChanged: (_) => filters.toggleWaitingFilter(),
)
value: filters.deletedFilter,
onChanged: (_) => filters.toggleDeletedFilter(),
),
],
),
),
),
),

const Divider(
color: Color.fromARGB(0, 48, 46, 46),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ class ManageTaskServerController extends GetxController {
late RxString alias;
Server? server;
Credentials? credentials;
String? trust;
final TextEditingController taskrcContentController = TextEditingController();

RxBool isTaskDServerActive = true.obs;
RxBool hideKey = true.obs;

Expand All @@ -37,13 +39,12 @@ class ManageTaskServerController extends GetxController {
alias = RxString(splashController.profilesMap[profile.value] ?? '');
var contents = rc.Taskrc(storage.home.home).readTaskrc();
if (contents != null) {
server = Taskrc.fromString(contents).server;
credentials = Taskrc.fromString(contents).credentials;
}
if (contents != null) {
server = Taskrc.fromString(contents).server;
credentials = Taskrc.fromString(contents).credentials;
final taskrc = Taskrc.fromString(contents);
server = taskrc.server;
credentials = taskrc.credentials;
trust = taskrc.trust; // ⬅️ ADD THIS
}

configureCredentialString();
update();
}
Expand All @@ -53,8 +54,7 @@ class ManageTaskServerController extends GetxController {
var contents = await rootBundle.loadString('assets/.taskrc');
rc.Taskrc(storage.home.home).addTaskrc(contents);
var taskrc = Taskrc.fromString(contents);
server = taskrc.server;
credentials = taskrc.credentials;
trust = taskrc.trust;
for (var entry in {
'taskd.certificate': '.task/first_last.cert.pem',
'taskd.key': '.task/first_last.key.pem',
Expand Down Expand Up @@ -96,12 +96,12 @@ class ManageTaskServerController extends GetxController {

// Check if the server and credentials are present in the Taskrc object
if (taskrc.server != null && taskrc.credentials != null) {
// Update the server and credentials variables

server = taskrc.server;
credentials = taskrc.credentials;
trust = taskrc.trust; // ⬅️ ADD THIS
update();


// Handle the case when server or credentials are missing in the Taskrc object
Navigator.pop(context);

Expand Down Expand Up @@ -162,8 +162,16 @@ class ManageTaskServerController extends GetxController {

if (credentialsString!.value.isNotEmpty && server.toString().isNotEmpty) {
//print(credentialsString.value);
taskrcContentController.text =
"taskd.server=$server\ntaskd.credentials=${credentials!.org}/${credentials!.user}/$key";
var taskrcContent =
"taskd.server=$server\n"
"taskd.credentials=${credentials!.org}/${credentials!.user}/$key";

if (trust?.isNotEmpty == true) {
taskrcContent += "\ntaskd.trust=$trust"; // ⬅️ ADD THIS
}

taskrcContentController.text = taskrcContent;


isTaskDServerActive.value = false;
}
Expand Down
29 changes: 27 additions & 2 deletions lib/app/utils/add_task_dialogue/date_picker_input.dart
Original file line number Diff line number Diff line change
Expand Up @@ -106,11 +106,36 @@ class _AddTaskDatePickerInputState extends State<AddTaskDatePickerInput> {
firstDate: DateTime.now(),
lastDate: DateTime(2101),
);

// FIX: Check if date was selected before showing time picker
if (picked == null) {
return; // User canceled date picker, exit early
}

// Only show time picker if date was selected
final TimeOfDay? time = await showTimePicker(
context: context,
initialTime: TimeOfDay.now(),
);
if (picked == null || time == null) return;

// If user cancels time picker, still set the date with default time
if (time == null) {
setState(() {
// Set date with end-of-day time (23:59)
_selectedDates[forIndex] = picked.add(
const Duration(hours: 23, minutes: 59),
);
// Update the controller text
_controllers[forIndex].text =
dateToStringForAddTask(_selectedDates[forIndex]!);
});
if (widget.onDateChanges != null) {
widget.onDateChanges!(_selectedDates);
}
return;
}

// Both date and time selected
setState(() {
_selectedDates[forIndex] =
picked.add(Duration(hours: time.hour, minutes: time.minute));
Expand All @@ -135,4 +160,4 @@ class _AddTaskDatePickerInputState extends State<AddTaskDatePickerInput> {
}
return null;
}
}
}
6 changes: 6 additions & 0 deletions lib/app/utils/taskserver/taskrc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ class Taskrc {
Taskrc({
this.server,
this.credentials,
this.trust,
// ignore: always_put_required_named_parameters_first
required this.pemFilePaths,
});
Expand All @@ -20,15 +21,20 @@ class Taskrc {
factory Taskrc.fromMap(Map taskrc) {
var server = taskrc['taskd.server'];
var credentials = taskrc['taskd.credentials'];
var trust = taskrc['taskd.trust']; // ⬅️ ADD THIS LINE

return Taskrc(
server: (server == null) ? null : Server.fromString(server),
credentials:
(credentials == null) ? null : Credentials.fromString(credentials),
trust: trust, // ⬅️ ADD THIS LINE
pemFilePaths: PemFilePaths.fromTaskrc(taskrc),
);
}


final Server? server;
final Credentials? credentials;
final String? trust;
final PemFilePaths pemFilePaths;
}
Loading