From bf6f4162805609eb93d635175f18a2c154792a31 Mon Sep 17 00:00:00 2001 From: Shiva Gupta Date: Thu, 11 Dec 2025 18:29:54 +0530 Subject: [PATCH] feat(AddTask): Add entry date field to Add Task dialog - Add entry date field to backend request body and Taskwarrior CLI - Implement entry date picker in AddTaskDialog frontend component - Update type definitions and hooks to support entry field - Add comprehensive frontend and backend tests for the new field Issue: #188 --- backend/controllers/add_task.go | 3 +- backend/models/request_body.go | 1 + backend/utils/tw/add_task.go | 5 +- backend/utils/tw/taskwarrior_test.go | 27 ++++++- .../HomeComponents/Tasks/AddTaskDialog.tsx | 17 +++++ .../components/HomeComponents/Tasks/Tasks.tsx | 3 + .../Tasks/__tests__/AddTaskDialog.test.tsx | 73 ++++++++++++++++++- .../components/HomeComponents/Tasks/hooks.ts | 3 + frontend/src/components/utils/types.ts | 1 + 9 files changed, 125 insertions(+), 8 deletions(-) diff --git a/backend/controllers/add_task.go b/backend/controllers/add_task.go index 9918ad00..62f716b8 100644 --- a/backend/controllers/add_task.go +++ b/backend/controllers/add_task.go @@ -47,6 +47,7 @@ func AddTaskHandler(w http.ResponseWriter, r *http.Request) { priority := requestBody.Priority dueDate := requestBody.DueDate start := requestBody.Start + entryDate := requestBody.EntryDate waitDate := requestBody.WaitDate end := requestBody.End recur := requestBody.Recur @@ -67,7 +68,7 @@ func AddTaskHandler(w http.ResponseWriter, r *http.Request) { Name: "Add Task", Execute: func() error { logStore.AddLog("INFO", fmt.Sprintf("Adding task: %s", description), uuid, "Add Task") - err := tw.AddTaskToTaskwarrior(email, encryptionSecret, uuid, description, project, priority, dueDateStr, start, waitDate, end, recur, tags, annotations) + err := tw.AddTaskToTaskwarrior(email, encryptionSecret, uuid, description, project, priority, dueDateStr, start, entryDate, waitDate, end, recur, tags, annotations) if err != nil { logStore.AddLog("ERROR", fmt.Sprintf("Failed to add task: %v", err), uuid, "Add Task") return err diff --git a/backend/models/request_body.go b/backend/models/request_body.go index 514da0e5..91553f12 100644 --- a/backend/models/request_body.go +++ b/backend/models/request_body.go @@ -10,6 +10,7 @@ type AddTaskRequestBody struct { Priority string `json:"priority"` DueDate *string `json:"due"` Start string `json:"start"` + EntryDate string `json:"entry"` WaitDate string `json:"wait"` End string `json:"end"` Recur string `json:"recur"` diff --git a/backend/utils/tw/add_task.go b/backend/utils/tw/add_task.go index ef587349..7de36a97 100644 --- a/backend/utils/tw/add_task.go +++ b/backend/utils/tw/add_task.go @@ -10,7 +10,7 @@ import ( ) // add task to the user's tw client -func AddTaskToTaskwarrior(email, encryptionSecret, uuid, description, project, priority, dueDate, start, waitDate string, end, recur string, tags []string, annotations []models.Annotation) error { +func AddTaskToTaskwarrior(email, encryptionSecret, uuid, description, project, priority, dueDate, start, entryDate string, waitDate string, end, recur string, tags []string, annotations []models.Annotation) error { if err := utils.ExecCommand("rm", "-rf", "/root/.task"); err != nil { return fmt.Errorf("error deleting Taskwarrior data: %v", err) } @@ -43,6 +43,9 @@ func AddTaskToTaskwarrior(email, encryptionSecret, uuid, description, project, p if start != "" { cmdArgs = append(cmdArgs, "start:"+start) } + if entryDate != "" { + cmdArgs = append(cmdArgs, "entry:"+entryDate) + } if waitDate != "" { cmdArgs = append(cmdArgs, "wait:"+waitDate) } diff --git a/backend/utils/tw/taskwarrior_test.go b/backend/utils/tw/taskwarrior_test.go index 0891d0f0..32ca3f30 100644 --- a/backend/utils/tw/taskwarrior_test.go +++ b/backend/utils/tw/taskwarrior_test.go @@ -14,6 +14,7 @@ func TestSetTaskwarriorConfig(t *testing.T) { fmt.Println("SetTaskwarriorConfig test passed") } } + func TestSyncTaskwarrior(t *testing.T) { err := SyncTaskwarrior("./") if err != nil { @@ -42,7 +43,7 @@ func TestExportTasks(t *testing.T) { } func TestAddTaskToTaskwarrior(t *testing.T) { - err := AddTaskToTaskwarrior("email", "encryption_secret", "clientId", "description", "", "H", "2025-03-03", "2025-03-01", "2025-03-01", "2025-03-03", "daily", nil, []models.Annotation{{Description: "note"}}) + err := AddTaskToTaskwarrior("email", "encryption_secret", "clientId", "description", "", "H", "2025-03-03", "2025-03-01", "2025-03-01", "2025-03-01", "2025-03-03", "daily", nil, []models.Annotation{{Description: "note"}}) if err != nil { t.Errorf("AddTaskToTaskwarrior failed: %v", err) } else { @@ -51,7 +52,7 @@ func TestAddTaskToTaskwarrior(t *testing.T) { } func TestAddTaskToTaskwarriorWithWaitDate(t *testing.T) { - err := AddTaskToTaskwarrior("email", "encryption_secret", "clientId", "description", "project", "H", "2025-03-03", "2025-03-04", "2025-03-04", "2025-03-04", "", nil, []models.Annotation{}) + err := AddTaskToTaskwarrior("email", "encryption_secret", "clientId", "description", "project", "H", "2025-03-03", "2025-03-04", "2025-03-04", "2025-03-04", "2025-03-04", "", nil, []models.Annotation{}) if err != nil { t.Errorf("AddTaskToTaskwarrior with wait date failed: %v", err) } else { @@ -59,6 +60,15 @@ func TestAddTaskToTaskwarriorWithWaitDate(t *testing.T) { } } +func TestAddTaskToTaskwarriorWithEntryDate(t *testing.T) { + err := AddTaskToTaskwarrior("email", "encryption_secret", "clientId", "description", "project", "H", "2025-03-05", "2025-03-04", "2025-03-04", "2025-03-04", "2025-03-10", "", nil, nil) + if err != nil { + t.Errorf("AddTaskToTaskwarrior failed: %v", err) + } else { + fmt.Println("Add task with entry date passed ") + } +} + func TestCompleteTaskInTaskwarrior(t *testing.T) { err := CompleteTaskInTaskwarrior("email", "encryptionSecret", "client_id", "taskuuid") if err != nil { @@ -69,7 +79,7 @@ func TestCompleteTaskInTaskwarrior(t *testing.T) { } func TestAddTaskWithTags(t *testing.T) { - err := AddTaskToTaskwarrior("email", "encryption_secret", "clientId", "description", "", "H", "2025-03-03", "2025-03-01", "2025-03-01", "2025-03-03", "daily", []string{"work", "important"}, []models.Annotation{{Description: "note"}}) + err := AddTaskToTaskwarrior("email", "encryption_secret", "clientId", "description", "", "H", "2025-03-03", "2025-03-01", "2025-03-01", "2025-03-01", "2025-03-03", "daily", []string{"work", "important"}, []models.Annotation{{Description: "note"}}) if err != nil { t.Errorf("AddTaskToTaskwarrior with tags failed: %v", err) } else { @@ -77,8 +87,17 @@ func TestAddTaskWithTags(t *testing.T) { } } +func TestAddTaskToTaskwarriorWithEntryDateAndTags(t *testing.T) { + err := AddTaskToTaskwarrior("email", "encryption_secret", "clientId", "description", "project", "H", "2025-03-05", "2025-03-04", "2025-03-04", "2025-03-04", "2025-03-10", "", []string{"work", "important"}, nil) + if err != nil { + t.Errorf("AddTaskToTaskwarrior with entry date and tags failed: %v", err) + } else { + fmt.Println("Add task with entry date and tags passed") + } +} + func TestAddTaskToTaskwarriorWithWaitDateWithTags(t *testing.T) { - err := AddTaskToTaskwarrior("email", "encryption_secret", "clientId", "description", "project", "H", "2025-03-03", "2025-03-04", "2025-03-04", "2025-03-04", "", []string{"work", "important"}, []models.Annotation{}) + err := AddTaskToTaskwarrior("email", "encryption_secret", "clientId", "description", "project", "H", "2025-03-03", "2025-03-04", "2025-03-04", "2025-03-04", "2025-03-04", "", []string{"work", "important"}, []models.Annotation{}) if err != nil { t.Errorf("AddTaskToTaskwarrior with wait date failed: %v", err) } else { diff --git a/frontend/src/components/HomeComponents/Tasks/AddTaskDialog.tsx b/frontend/src/components/HomeComponents/Tasks/AddTaskDialog.tsx index 8aa9dc84..d9b085c7 100644 --- a/frontend/src/components/HomeComponents/Tasks/AddTaskDialog.tsx +++ b/frontend/src/components/HomeComponents/Tasks/AddTaskDialog.tsx @@ -270,6 +270,23 @@ export const AddTaskdialog = ({ /> +
+ +
+ { + setNewTask({ + ...newTask, + entry: date ? format(date, 'yyyy-MM-dd') : '', + }); + }} + placeholder="Select an entry date" + /> +
+