diff options
Diffstat (limited to 'internal/handlers')
| -rw-r--r-- | internal/handlers/handlers.go | 4 | ||||
| -rw-r--r-- | internal/handlers/tabs.go | 31 |
2 files changed, 28 insertions, 7 deletions
diff --git a/internal/handlers/handlers.go b/internal/handlers/handlers.go index 8d809ae..e4d6457 100644 --- a/internal/handlers/handlers.go +++ b/internal/handlers/handlers.go @@ -762,10 +762,10 @@ func (h *Handler) HandleUnifiedAdd(w http.ResponseWriter, r *http.Request) { return } - // Parse due date if provided + // Parse due date if provided (use local timezone) var dueDate *time.Time if dueDateStr != "" { - parsed, err := time.Parse("2006-01-02", dueDateStr) + parsed, err := time.ParseInLocation("2006-01-02", dueDateStr, time.Local) if err == nil { dueDate = &parsed } diff --git a/internal/handlers/tabs.go b/internal/handlers/tabs.go index 7e0b352..bd15710 100644 --- a/internal/handlers/tabs.go +++ b/internal/handlers/tabs.go @@ -88,7 +88,12 @@ func (h *TabsHandler) HandleTasks(w http.ResponseWriter, r *http.Request) { } } - // Sort atoms: by DueDate (earliest first), then by Priority (descending) + // Compute UI fields (IsOverdue, HasSetTime) + for i := range atoms { + atoms[i].ComputeUIFields() + } + + // Sort atoms: by DueDate (earliest first), then by HasSetTime, then by Priority sort.SliceStable(atoms, func(i, j int) bool { // Handle nil due dates (push to end) if atoms[i].DueDate == nil && atoms[j].DueDate != nil { @@ -98,14 +103,30 @@ func (h *TabsHandler) HandleTasks(w http.ResponseWriter, r *http.Request) { return true } - // Both have due dates, sort by date + // Both have due dates if atoms[i].DueDate != nil && atoms[j].DueDate != nil { - if !atoms[i].DueDate.Equal(*atoms[j].DueDate) { - return atoms[i].DueDate.Before(*atoms[j].DueDate) + // Compare by date only (ignore time) + dateI := atoms[i].DueDate.Truncate(24 * time.Hour) + dateJ := atoms[j].DueDate.Truncate(24 * time.Hour) + + if !dateI.Equal(dateJ) { + return dateI.Before(dateJ) + } + + // Same day: tasks with set times come before midnight tasks + if atoms[i].HasSetTime != atoms[j].HasSetTime { + return atoms[i].HasSetTime + } + + // Both have set times or both are midnight, sort by actual time + if atoms[i].HasSetTime && atoms[j].HasSetTime { + if !atoms[i].DueDate.Equal(*atoms[j].DueDate) { + return atoms[i].DueDate.Before(*atoms[j].DueDate) + } } } - // Same due date (or both nil), sort by priority (descending) + // Same due date/time (or both nil), sort by priority (descending) return atoms[i].Priority > atoms[j].Priority }) |
