| user | 5a7d60d | 2025-07-27 21:22:04 +0400 | [diff] [blame] | 1 | package commands |
| 2 | |
| 3 | import ( |
| 4 | "context" |
| 5 | "fmt" |
| 6 | "strings" |
| 7 | |
| 8 | "github.com/iomodo/staff/tm" |
| 9 | "github.com/spf13/cobra" |
| 10 | ) |
| 11 | |
| 12 | var 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 | |
| 17 | Examples: |
| 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 | |
| 25 | var ( |
| 26 | filterStatus string |
| 27 | filterPriority string |
| 28 | filterAssignee string |
| 29 | pageSize int = 20 |
| 30 | pageNum int = 0 |
| 31 | ) |
| 32 | |
| 33 | func 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 | |
| 41 | func runListTasks(cmd *cobra.Command, args []string) error { |
| 42 | // Build filter |
| 43 | filter := &tm.TaskFilter{} |
| iomodo | 50598c6 | 2025-07-27 22:06:32 +0400 | [diff] [blame] | 44 | |
| user | 5a7d60d | 2025-07-27 21:22:04 +0400 | [diff] [blame] | 45 | if filterStatus != "" { |
| 46 | status := tm.TaskStatus(filterStatus) |
| 47 | filter.Status = &status |
| 48 | } |
| iomodo | 50598c6 | 2025-07-27 22:06:32 +0400 | [diff] [blame] | 49 | |
| user | 5a7d60d | 2025-07-27 21:22:04 +0400 | [diff] [blame] | 50 | 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 | } |
| iomodo | 50598c6 | 2025-07-27 22:06:32 +0400 | [diff] [blame] | 90 | |
| user | 5a7d60d | 2025-07-27 21:22:04 +0400 | [diff] [blame] | 91 | title := task.Title |
| 92 | if len(title) > 47 { |
| 93 | title = title[:47] + "..." |
| 94 | } |
| 95 | |
| iomodo | 50598c6 | 2025-07-27 22:06:32 +0400 | [diff] [blame] | 96 | fmt.Printf("%-20s %-10s %-10s %-15s %-50s\n", |
| 97 | task.ID, |
| 98 | string(task.Status), |
| 99 | string(task.Priority), |
| 100 | assignee, |
| user | 5a7d60d | 2025-07-27 21:22:04 +0400 | [diff] [blame] | 101 | 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 |
| iomodo | 50598c6 | 2025-07-27 22:06:32 +0400 | [diff] [blame] | 109 | } |