diff options
| author | Paul Buetow <paul@buetow.org> | 2026-06-25 17:54:48 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-06-25 17:54:48 +0300 |
| commit | cb36d8f78ce688db6f74cac57e7c10cd334e5f6e (patch) | |
| tree | e774d78b0203e4c138d521d62ca89b1126399169 /internal/ui/taskdetail.go | |
| parent | 2c59b030590d99970b15f1d84158da72ddc28310 (diff) | |
Fix rq0 detail identity by UUID
Diffstat (limited to 'internal/ui/taskdetail.go')
| -rw-r--r-- | internal/ui/taskdetail.go | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/internal/ui/taskdetail.go b/internal/ui/taskdetail.go index b39af51..bcaed8f 100644 --- a/internal/ui/taskdetail.go +++ b/internal/ui/taskdetail.go @@ -369,16 +369,58 @@ func (m *Model) taskByID(id int) *task.Task { return nil } +func (m *Model) taskByUUID(uuid string) *task.Task { + uuid = strings.TrimSpace(uuid) + if uuid == "" { + return nil + } + for i := range m.tasks { + if m.tasks[i].UUID == uuid { + return &m.tasks[i] + } + } + return nil +} + func (m *Model) currentDetailTask() *task.Task { - if !m.showTaskDetail || m.currentTaskDetailID == 0 { + if !m.showTaskDetail { return nil } - return m.taskByID(m.currentTaskDetailID) + if m.currentTaskDetailUUID != "" { + return m.taskByUUID(m.currentTaskDetailUUID) + } + if m.currentTaskDetailFallbackID != 0 { + return m.taskByID(m.currentTaskDetailFallbackID) + } + return nil +} + +func (m *Model) setCurrentTaskDetail(t *task.Task) { + // UUID is stable across Taskwarrior renumbering. Numeric ID is used only + // for legacy/defensive compatibility when a task has no UUID. + m.currentTaskDetailUUID = strings.TrimSpace(t.UUID) + if m.currentTaskDetailUUID != "" { + m.currentTaskDetailFallbackID = 0 + return + } + m.currentTaskDetailFallbackID = t.ID +} + +func (m *Model) clearCurrentTaskDetail() { + m.currentTaskDetailUUID = "" + m.currentTaskDetailFallbackID = 0 +} + +func (m *Model) hasCurrentTaskDetailIdentity() bool { + if m.currentTaskDetailUUID != "" { + return true + } + return m.currentTaskDetailFallbackID != 0 } // refreshCurrentTaskDetail validates detail state after a reload. func (m *Model) refreshCurrentTaskDetail() { - if m.currentTaskDetailID == 0 { + if !m.hasCurrentTaskDetailIdentity() { return } if m.currentDetailTask() != nil { @@ -387,7 +429,7 @@ func (m *Model) refreshCurrentTaskDetail() { // Task no longer exists, clear detail view m.showTaskDetail = false - m.currentTaskDetailID = 0 + m.clearCurrentTaskDetail() } // detailDescriptionFieldIndex returns the navigable field index for the |
