Fix working set IDs to match display order

BREAKING CHANGE: BuildWorkingSet() now accepts []*Task instead of *Filter

Problem:
- Working set IDs were assigned based on database query order (unsorted)
- Reports displayed tasks in sorted order (by urgency)
- Result: IDs didn't match displayed task positions (ID 1 wasn't first task)

Solution:
- Changed BuildWorkingSet() to accept pre-sorted task slice
- Reports now pass sorted tasks to BuildWorkingSet()
- IDs are assigned sequentially to match display order (1, 2, 3...)

Behavior:
- Reports rebuild working set on every execution with fresh IDs
- Task operations (done, modify, info) use saved working set IDs
- After completing a task, re-running report renumbers remaining tasks

Example:
  Before:  opal list shows ID 1 = low urgency task (wrong)
  After:   opal list shows ID 1 = highest urgency task (correct)

Tested scenarios:
✓ List report: IDs 1-N match urgency order
✓ Next report: IDs 1-5 match top urgent tasks
✓ Task completion: IDs renumber correctly after removal
✓ Multiple operations: Use saved working set (correct behavior)
✓ Different reports: Each builds own sequential IDs
This commit is contained in:
2026-01-06 14:54:01 +01:00
parent 8f6db4672a
commit 5b660c3c1c
4 changed files with 36 additions and 18 deletions
+4 -7
View File
@@ -14,13 +14,10 @@ type WorkingSet struct {
byID map[int]uuid.UUID // display_id -> UUID
}
// BuildWorkingSet creates a working set from filter results and persists to DB
func BuildWorkingSet(filter *Filter) (*WorkingSet, error) {
tasks, err := GetTasks(filter)
if err != nil {
return nil, err
}
// BuildWorkingSet creates a working set from a list of tasks and persists to DB
// Tasks should be pre-sorted in the desired display order
// IDs are assigned sequentially (1, 2, 3, ...) based on task order in the slice
func BuildWorkingSet(tasks []*Task) (*WorkingSet, error) {
ws := &WorkingSet{
byUUID: make(map[uuid.UUID]*Task),
byID: make(map[int]uuid.UUID),