blob: 3605c0907abd86ac8caaa64ded9e282f74de1fd3 [file] [log] [blame]
user5a7d60d2025-07-27 21:22:04 +04001package commands
2
3import (
4 "context"
5 "fmt"
6 "strings"
7
8 "github.com/iomodo/staff/tm"
9 "github.com/spf13/cobra"
10)
11
12var listTasksCmd = &cobra.Command{
13 Use: "list-tasks",
14 Short: "List all tasks",
15 Long: `List all tasks with optional filtering by status, priority, or assignee.
16
17Examples:
18 staff list-tasks
19 staff list-tasks --status todo
20 staff list-tasks --priority high
21 staff list-tasks --assignee backend-engineer`,
22 RunE: runListTasks,
23}
24
25var (
26 filterStatus string
27 filterPriority string
28 filterAssignee string
29 pageSize int = 20
30 pageNum int = 0
31)
32
33func init() {
34 listTasksCmd.Flags().StringVar(&filterStatus, "status", "", "Filter by status (todo, in_progress, completed, archived)")
35 listTasksCmd.Flags().StringVar(&filterPriority, "priority", "", "Filter by priority (low, medium, high)")
36 listTasksCmd.Flags().StringVar(&filterAssignee, "assignee", "", "Filter by assignee")
37 listTasksCmd.Flags().IntVar(&pageSize, "page-size", 20, "Number of tasks per page")
38 listTasksCmd.Flags().IntVar(&pageNum, "page", 0, "Page number (0-based)")
39}
40
41func runListTasks(cmd *cobra.Command, args []string) error {
42 // Build filter
43 filter := &tm.TaskFilter{}
iomodo50598c62025-07-27 22:06:32 +040044
user5a7d60d2025-07-27 21:22:04 +040045 if filterStatus != "" {
46 status := tm.TaskStatus(filterStatus)
47 filter.Status = &status
48 }
iomodo50598c62025-07-27 22:06:32 +040049
user5a7d60d2025-07-27 21:22:04 +040050 if filterPriority != "" {
51 priority := tm.TaskPriority(filterPriority)
52 filter.Priority = &priority
53 }
54
55 // Get tasks
56 taskList, err := taskManager.ListTasks(context.Background(), filter, pageNum, pageSize)
57 if err != nil {
58 return fmt.Errorf("failed to list tasks: %w", err)
59 }
60
61 // Filter by assignee if specified (not in TaskFilter interface yet)
62 var filteredTasks []*tm.Task
63 if filterAssignee != "" {
64 for _, task := range taskList.Tasks {
65 if task.Assignee == filterAssignee {
66 filteredTasks = append(filteredTasks, task)
67 }
68 }
69 } else {
70 filteredTasks = taskList.Tasks
71 }
72
73 // Display results
74 if len(filteredTasks) == 0 {
75 fmt.Println("No tasks found")
76 return nil
77 }
78
79 fmt.Printf("Found %d tasks (page %d/%d)\n\n", len(filteredTasks), pageNum+1, (taskList.TotalCount+pageSize-1)/pageSize)
80
81 // Display tasks in table format
82 fmt.Printf("%-20s %-10s %-10s %-15s %-50s\n", "ID", "Status", "Priority", "Assignee", "Title")
83 fmt.Printf("%s\n", strings.Repeat("-", 110))
84
85 for _, task := range filteredTasks {
86 assignee := task.Assignee
87 if assignee == "" {
88 assignee = "unassigned"
89 }
iomodo50598c62025-07-27 22:06:32 +040090
user5a7d60d2025-07-27 21:22:04 +040091 title := task.Title
92 if len(title) > 47 {
93 title = title[:47] + "..."
94 }
95
iomodo50598c62025-07-27 22:06:32 +040096 fmt.Printf("%-20s %-10s %-10s %-15s %-50s\n",
97 task.ID,
98 string(task.Status),
99 string(task.Priority),
100 assignee,
user5a7d60d2025-07-27 21:22:04 +0400101 title)
102 }
103
104 if taskList.HasMore {
105 fmt.Printf("\nUse --page %d to see more tasks\n", pageNum+1)
106 }
107
108 return nil
iomodo50598c62025-07-27 22:06:32 +0400109}