Replace status_id with in_progress boolean field
- Remove task_statuses lookup table and StatusID foreign key - Add InProgress boolean field to Task model - Add database migration (005_replace_status_with_in_progress) - Update all handlers, services, and repositories - Update admin frontend to display in_progress as checkbox/boolean - Remove Task Statuses tab from admin lookups page - Update tests to use InProgress instead of StatusID - Task categorization now uses InProgress for kanban column assignment 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -18,7 +18,6 @@ func TestCategorizeTask_PriorityOrder(t *testing.T) {
|
||||
yesterday := now.AddDate(0, 0, -1)
|
||||
in5Days := now.AddDate(0, 0, 5)
|
||||
in60Days := now.AddDate(0, 0, 60)
|
||||
inProgressStatus := &models.TaskStatus{Name: "In Progress"}
|
||||
daysThreshold := 30
|
||||
|
||||
tests := []struct {
|
||||
@@ -32,7 +31,7 @@ func TestCategorizeTask_PriorityOrder(t *testing.T) {
|
||||
task: &models.Task{
|
||||
IsCancelled: true,
|
||||
NextDueDate: timePtr(yesterday), // Would be overdue
|
||||
Status: inProgressStatus, // Would be in progress
|
||||
InProgress: true, // Would be in progress
|
||||
Completions: []models.TaskCompletion{{BaseModel: models.BaseModel{ID: 1}}}, // Would be completed if NextDueDate was nil
|
||||
},
|
||||
expected: categorization.ColumnCancelled,
|
||||
@@ -68,7 +67,7 @@ func TestCategorizeTask_PriorityOrder(t *testing.T) {
|
||||
IsCancelled: false,
|
||||
IsArchived: false,
|
||||
NextDueDate: timePtr(yesterday), // Would be overdue
|
||||
Status: inProgressStatus,
|
||||
InProgress: true,
|
||||
Completions: []models.TaskCompletion{},
|
||||
},
|
||||
expected: categorization.ColumnInProgress,
|
||||
@@ -151,13 +150,13 @@ func TestCategorizeTasksIntoColumns(t *testing.T) {
|
||||
daysThreshold := 30
|
||||
|
||||
tasks := []models.Task{
|
||||
{BaseModel: models.BaseModel{ID: 1}, IsCancelled: true}, // Cancelled
|
||||
{BaseModel: models.BaseModel{ID: 2}, NextDueDate: nil, Completions: []models.TaskCompletion{{BaseModel: models.BaseModel{ID: 1}}}}, // Completed
|
||||
{BaseModel: models.BaseModel{ID: 3}, Status: &models.TaskStatus{Name: "In Progress"}}, // In Progress
|
||||
{BaseModel: models.BaseModel{ID: 4}, NextDueDate: timePtr(yesterday)}, // Overdue
|
||||
{BaseModel: models.BaseModel{ID: 5}, NextDueDate: timePtr(in5Days)}, // Due Soon
|
||||
{BaseModel: models.BaseModel{ID: 6}, NextDueDate: timePtr(in60Days)}, // Upcoming
|
||||
{BaseModel: models.BaseModel{ID: 7}}, // Upcoming (no due date)
|
||||
{BaseModel: models.BaseModel{ID: 1}, IsCancelled: true}, // Cancelled
|
||||
{BaseModel: models.BaseModel{ID: 2}, NextDueDate: nil, Completions: []models.TaskCompletion{{BaseModel: models.BaseModel{ID: 1}}}}, // Completed
|
||||
{BaseModel: models.BaseModel{ID: 3}, InProgress: true}, // In Progress
|
||||
{BaseModel: models.BaseModel{ID: 4}, NextDueDate: timePtr(yesterday)}, // Overdue
|
||||
{BaseModel: models.BaseModel{ID: 5}, NextDueDate: timePtr(in5Days)}, // Due Soon
|
||||
{BaseModel: models.BaseModel{ID: 6}, NextDueDate: timePtr(in60Days)}, // Upcoming
|
||||
{BaseModel: models.BaseModel{ID: 7}}, // Upcoming (no due date)
|
||||
}
|
||||
|
||||
result := categorization.CategorizeTasksIntoColumns(tasks, daysThreshold)
|
||||
|
||||
Reference in New Issue
Block a user